From ee9f61847cacf9c9cab55105c2d41b4b5a71adf7 Mon Sep 17 00:00:00 2001 From: CalenXwX Date: Tue, 17 Dec 2024 13:47:56 +0800 Subject: [PATCH 1/9] 1.20.1Forge --- .travis.yml | 16 - api/buildcraft/api/BCBlocks.java | 69 +++- api/buildcraft/api/BCItems.java | 88 ++++-- api/buildcraft/api/BCModules.java | 32 +- .../api/blocks/CustomPaintHelper.java | 88 ++++-- .../api/blocks/CustomRotationHelper.java | 41 ++- .../api/blocks/ICustomPaintHandler.java | 20 +- .../api/blocks/ICustomRotationHandler.java | 12 +- api/buildcraft/api/blocks/ISpring.java | 7 + api/buildcraft/api/blocks/package-info.java | 4 +- .../api/boards/RedstoneBoardNBT.java | 25 +- .../api/boards/RedstoneBoardRegistry.java | 8 +- .../api/boards/RedstoneBoardRobotNBT.java | 7 +- api/buildcraft/api/boards/package-info.java | 4 +- api/buildcraft/api/core/AreaProviders.java | 10 +- api/buildcraft/api/core/BCDebugging.java | 16 +- api/buildcraft/api/core/BCLog.java | 3 +- api/buildcraft/api/core/BuildCraftAPI.java | 35 ++- .../api/core/CapabilitiesHelper.java | 223 +++++++------ api/buildcraft/api/core/EnumColor.java | 147 --------- api/buildcraft/api/core/EnumPipePart.java | 64 ++-- api/buildcraft/api/core/EnumWireColour.java | 45 +-- api/buildcraft/api/core/IAreaProvider.java | 2 +- api/buildcraft/api/core/IBox.java | 4 +- api/buildcraft/api/core/IEngineType.java | 1 + .../api/core/IFakePlayerProvider.java | 22 +- api/buildcraft/api/core/IFakeWorld.java | 17 + api/buildcraft/api/core/IFluidFilter.java | 1 - api/buildcraft/api/core/IFluidHandlerAdv.java | 6 +- api/buildcraft/api/core/IInvSlot.java | 2 +- api/buildcraft/api/core/IPathProvider.java | 7 +- api/buildcraft/api/core/IStackFilter.java | 12 +- api/buildcraft/api/core/IWorldProperty.java | 6 +- api/buildcraft/api/core/IZone.java | 12 +- .../api/core/InvalidInputDataException.java | 4 +- api/buildcraft/api/core/SafeTimeTracker.java | 12 +- api/buildcraft/api/core/StackKey.java | 48 +-- api/buildcraft/api/core/package-info.java | 4 +- api/buildcraft/api/crops/CropManager.java | 29 +- api/buildcraft/api/crops/ICropHandler.java | 22 +- api/buildcraft/api/crops/package-info.java | 4 +- .../api/data/NbtSquishConstants.java | 15 +- .../api/enums/EnumDecoratedBlock.java | 8 +- api/buildcraft/api/enums/EnumEngineType.java | 27 +- .../api/enums/EnumLaserTableType.java | 6 +- .../api/enums/EnumMachineState.java | 11 +- .../api/enums/EnumOptionalSnapshotType.java | 8 +- api/buildcraft/api/enums/EnumPowerStage.java | 8 +- .../api/enums/EnumRedstoneChipset.java | 36 ++- api/buildcraft/api/enums/EnumSpring.java | 38 ++- api/buildcraft/api/enums/package-info.java | 4 +- .../api/events/BlockInteractionEvent.java | 15 +- .../api/events/BlockPlacedDownEvent.java | 17 +- .../api/events/PipePlacedEvent.java | 13 +- api/buildcraft/api/events/RobotEvent.java | 22 +- .../api/events/RobotPlacementEvent.java | 12 +- api/buildcraft/api/events/package-info.java | 4 +- api/buildcraft/api/facades/FacadeAPI.java | 36 ++- api/buildcraft/api/facades/IFacade.java | 4 + api/buildcraft/api/facades/IFacadeItem.java | 10 +- .../api/facades/IFacadePhasedState.java | 6 +- .../api/facades/IFacadeRegistry.java | 7 +- api/buildcraft/api/facades/IFacadeState.java | 6 +- api/buildcraft/api/facades/package-info.java | 4 +- .../api/filler/IFilledTemplate.java | 6 +- api/buildcraft/api/filler/IFillerPattern.java | 7 +- .../api/filler/IFillerPatternShape.java | 13 +- .../api/filler/IFillerRegistry.java | 8 +- api/buildcraft/api/filler/package-info.java | 6 +- .../api/fuels/BuildcraftFuelRegistry.java | 3 +- api/buildcraft/api/fuels/EnumCoolantType.java | 17 + api/buildcraft/api/fuels/ICoolant.java | 55 +++- api/buildcraft/api/fuels/ICoolantManager.java | 48 +-- api/buildcraft/api/fuels/IFluidCoolant.java | 24 ++ api/buildcraft/api/fuels/IFuel.java | 51 ++- api/buildcraft/api/fuels/IFuelManager.java | 39 ++- api/buildcraft/api/fuels/ISolidCoolant.java | 13 +- api/buildcraft/api/fuels/package-info.java | 4 +- api/buildcraft/api/gates/IGate.java | 4 +- api/buildcraft/api/gates/package-info.java | 4 +- api/buildcraft/api/imc/BcImcMessage.java | 32 ++ .../api/inventory/IItemHandlerFiltered.java | 3 +- .../api/inventory/IItemTransactor.java | 13 +- api/buildcraft/api/items/FluidItemDrops.java | 13 +- api/buildcraft/api/items/IChipset.java | 7 + .../api/items/IItemCustomPipeRender.java | 9 +- api/buildcraft/api/items/IItemFluidShard.java | 9 +- api/buildcraft/api/items/IList.java | 4 +- api/buildcraft/api/items/IMapLocation.java | 30 +- api/buildcraft/api/items/INamedItem.java | 7 +- api/buildcraft/api/items/package-info.java | 4 +- .../api/library/ILibraryTypeHandler.java | 18 -- api/buildcraft/api/library/LibraryAPI.java | 30 -- .../api/library/LibraryTypeHandler.java | 31 -- .../library/LibraryTypeHandlerByteArray.java | 13 - .../api/library/LibraryTypeHandlerNBT.java | 14 - api/buildcraft/api/library/package-info.java | 8 - .../api/lists/ListMatchHandler.java | 8 +- api/buildcraft/api/lists/ListRegistry.java | 4 +- api/buildcraft/api/lists/package-info.java | 4 +- api/buildcraft/api/mj/ILaserTarget.java | 1 + api/buildcraft/api/mj/IMjConnector.java | 4 +- api/buildcraft/api/mj/IMjEffectManager.java | 12 +- api/buildcraft/api/mj/IMjPassiveProvider.java | 2 +- api/buildcraft/api/mj/IMjReceiver.java | 6 +- .../api/mj/IMjRedstoneReceiver.java | 3 +- api/buildcraft/api/mj/MjAPI.java | 60 ++-- api/buildcraft/api/mj/MjBattery.java | 52 ++-- api/buildcraft/api/mj/MjCapabilityHelper.java | 37 ++- api/buildcraft/api/net/IMessage.java | 21 ++ api/buildcraft/api/net/IMessageHandler.java | 7 + api/buildcraft/api/power/IEngine.java | 8 +- api/buildcraft/api/power/IRedstoneEngine.java | 3 +- api/buildcraft/api/power/package-info.java | 4 +- .../api/properties/BuildCraftProperties.java | 93 +++--- .../api/recipes/AssemblyRecipe.java | 85 ----- .../api/recipes/AssemblyRecipeBasic.java | 67 ---- .../api/recipes/BuildcraftRecipeRegistry.java | 3 +- .../api/recipes/EnumAssemblyRecipeType.java | 6 + .../api/recipes/IAssemblyRecipe.java | 77 +++++ .../recipes/IIntegrationRecipeProvider.java | 10 +- .../api/recipes/IRefineryRecipeManager.java | 97 ++++-- .../api/recipes/IngredientStack.java | 36 ++- .../api/recipes/IntegrationRecipe.java | 9 +- api/buildcraft/api/recipes/package-info.java | 4 +- .../api/registry/EventBuildCraftReload.java | 21 +- .../api/registry/IReloadableRegistry.java | 4 +- .../registry/IReloadableRegistryManager.java | 8 +- .../api/registry/IScriptableRegistry.java | 20 +- api/buildcraft/api/robots/AIRobot.java | 39 ++- api/buildcraft/api/robots/DockingStation.java | 55 ++-- .../api/robots/EntityRobotBase.java | 27 +- .../api/robots/IRequestProvider.java | 2 +- .../api/robots/IRobotOverlayItem.java | 9 +- api/buildcraft/api/robots/IRobotRegistry.java | 14 +- .../api/robots/IRobotRegistryProvider.java | 4 +- api/buildcraft/api/robots/ResourceId.java | 16 +- .../api/robots/ResourceIdBlock.java | 24 +- .../api/robots/ResourceIdRequest.java | 14 +- api/buildcraft/api/robots/RobotManager.java | 4 +- api/buildcraft/api/robots/package-info.java | 4 +- .../api/schematics/ISchematicBlock.java | 37 ++- .../api/schematics/ISchematicEntity.java | 35 +-- .../api/schematics/SchematicBlockContext.java | 18 +- .../api/schematics/SchematicBlockFactory.java | 7 +- .../SchematicBlockFactoryRegistry.java | 75 +++-- .../schematics/SchematicEntityContext.java | 12 +- .../schematics/SchematicEntityFactory.java | 7 +- .../SchematicEntityFactoryRegistry.java | 57 ++-- api/buildcraft/api/statements/IAction.java | 3 +- .../api/statements/IActionExternal.java | 6 +- .../api/statements/IActionInternalSided.java | 4 +- .../api/statements/IActionProvider.java | 11 +- api/buildcraft/api/statements/IGuiSlot.java | 46 ++- api/buildcraft/api/statements/IStatement.java | 2 +- .../api/statements/IStatementContainer.java | 10 +- .../api/statements/IStatementParameter.java | 29 +- api/buildcraft/api/statements/ITrigger.java | 3 +- .../api/statements/ITriggerExternal.java | 6 +- .../statements/ITriggerExternalOverride.java | 4 +- .../api/statements/ITriggerInternalSided.java | 4 +- .../api/statements/ITriggerProvider.java | 11 +- .../api/statements/StatementManager.java | 37 +-- .../StatementParameterItemStack.java | 86 +++-- .../api/statements/StatementSlot.java | 4 +- .../containers/IFillerStatementContainer.java | 13 +- .../IRedstoneStatementContainer.java | 10 +- .../containers/ISidedStatementContainer.java | 5 +- .../api/statements/package-info.java | 4 +- .../api/template/ITemplateHandler.java | 10 +- .../api/template/ITemplateRegistry.java | 11 +- .../api/tiles/IBCTileMenuProvider.java | 9 + api/buildcraft/api/tiles/IDebuggable.java | 25 +- api/buildcraft/api/tiles/IHasWork.java | 2 +- api/buildcraft/api/tiles/IHeatable.java | 2 +- api/buildcraft/api/tiles/ITickable.java | 42 +++ .../api/tiles/ITileAreaProvider.java | 3 +- api/buildcraft/api/tiles/TilesAPI.java | 33 +- api/buildcraft/api/tiles/package-info.java | 4 +- api/buildcraft/api/tools/IToolWrench.java | 12 +- api/buildcraft/api/tools/package-info.java | 4 +- .../api/transport/EnumWirePart.java | 43 +-- api/buildcraft/api/transport/IInjectable.java | 13 +- .../api/transport/IItemPluggable.java | 20 +- .../api/transport/IStripesActivator.java | 10 +- .../api/transport/IStripesHandlerBlock.java | 10 +- .../api/transport/IStripesHandlerItem.java | 20 +- .../api/transport/IStripesRegistry.java | 23 +- .../api/transport/IWireEmitter.java | 6 +- .../api/transport/IWireManager.java | 13 +- api/buildcraft/api/transport/WireNode.java | 26 +- .../api/transport/package-info.java | 4 +- .../transport/pipe/ICustomPipeConnection.java | 12 +- .../api/transport/pipe/IFlowFluid.java | 57 ++-- .../api/transport/pipe/IFlowItems.java | 25 +- .../api/transport/pipe/IFlowPower.java | 7 +- .../api/transport/pipe/IItemPipe.java | 7 + api/buildcraft/api/transport/pipe/IPipe.java | 19 +- .../transport/pipe/IPipeBehaviourBaker.java | 4 +- .../pipe/IPipeBehaviourRenderer.java | 14 +- .../api/transport/pipe/IPipeConnection.java | 4 +- .../transport/pipe/IPipeExtensionManager.java | 11 +- .../api/transport/pipe/IPipeFlowBaker.java | 4 +- .../api/transport/pipe/IPipeFlowRenderer.java | 11 +- .../api/transport/pipe/IPipeHolder.java | 72 +++-- .../api/transport/pipe/IPipeRegistry.java | 48 +-- .../api/transport/pipe/PipeApi.java | 44 +-- .../api/transport/pipe/PipeApiClient.java | 13 +- .../api/transport/pipe/PipeBehaviour.java | 84 ++--- .../api/transport/pipe/PipeConnectionAPI.java | 7 +- .../api/transport/pipe/PipeDefinition.java | 36 ++- .../pipe/PipeEventConnectionChange.java | 8 +- .../api/transport/pipe/PipeEventFluid.java | 71 +++-- .../api/transport/pipe/PipeEventHandler.java | 10 +- .../api/transport/pipe/PipeEventItem.java | 152 +++++---- .../api/transport/pipe/PipeEventPower.java | 11 +- .../transport/pipe/PipeEventStatement.java | 18 +- .../transport/pipe/PipeEventTileState.java | 8 +- .../api/transport/pipe/PipeFaceTex.java | 2 +- .../api/transport/pipe/PipeFlow.java | 78 ++--- .../api/transport/pipe/PipeFlowType.java | 4 +- .../pluggable/IPlugDynamicRenderer.java | 7 +- .../pluggable/IPluggableRegistry.java | 2 +- .../pluggable/IPluggableStaticBaker.java | 9 +- .../transport/pluggable/PipePluggable.java | 120 +++---- .../pluggable/PluggableDefinition.java | 33 +- .../pluggable/PluggableModelKey.java | 14 +- build.properties | 9 +- gradle/wrapper/gradle-wrapper.jar | Bin 52271 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 294 +++++++++++------- gradlew.bat | 53 ++-- resources/accesstransformer.cfg | 2 + settings.gradle | 13 + 234 files changed, 2784 insertions(+), 2538 deletions(-) delete mode 100644 .travis.yml create mode 100644 api/buildcraft/api/blocks/ISpring.java delete mode 100644 api/buildcraft/api/core/EnumColor.java create mode 100644 api/buildcraft/api/core/IFakeWorld.java create mode 100644 api/buildcraft/api/fuels/EnumCoolantType.java create mode 100644 api/buildcraft/api/fuels/IFluidCoolant.java create mode 100644 api/buildcraft/api/imc/BcImcMessage.java create mode 100644 api/buildcraft/api/items/IChipset.java delete mode 100644 api/buildcraft/api/library/ILibraryTypeHandler.java delete mode 100644 api/buildcraft/api/library/LibraryAPI.java delete mode 100644 api/buildcraft/api/library/LibraryTypeHandler.java delete mode 100644 api/buildcraft/api/library/LibraryTypeHandlerByteArray.java delete mode 100644 api/buildcraft/api/library/LibraryTypeHandlerNBT.java delete mode 100644 api/buildcraft/api/library/package-info.java create mode 100644 api/buildcraft/api/net/IMessage.java create mode 100644 api/buildcraft/api/net/IMessageHandler.java delete mode 100644 api/buildcraft/api/recipes/AssemblyRecipe.java delete mode 100644 api/buildcraft/api/recipes/AssemblyRecipeBasic.java create mode 100644 api/buildcraft/api/recipes/EnumAssemblyRecipeType.java create mode 100644 api/buildcraft/api/recipes/IAssemblyRecipe.java create mode 100644 api/buildcraft/api/tiles/IBCTileMenuProvider.java create mode 100644 api/buildcraft/api/tiles/ITickable.java create mode 100644 resources/accesstransformer.cfg create mode 100644 settings.gradle diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0b89a53..0000000 --- a/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -language: java -jdk: - - openjdk8 - -jobs: - include: - - stage: build - install: ./gradlew setupCiWorkspace -S - script: ./gradlew build - - stage: checkstyle - install: echo "skipping default ./gradlew assemble" - script: ./gradlew checkstyle - -env: - global: - TERM=dumb diff --git a/api/buildcraft/api/BCBlocks.java b/api/buildcraft/api/BCBlocks.java index 693aa4e..8b96b33 100644 --- a/api/buildcraft/api/BCBlocks.java +++ b/api/buildcraft/api/BCBlocks.java @@ -1,68 +1,109 @@ package buildcraft.api; -import net.minecraft.block.Block; - -import net.minecraftforge.fml.common.registry.GameRegistry.ObjectHolder; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.registries.ObjectHolder; public class BCBlocks { - @ObjectHolder("buildcraftcore") public static class Core { - public static final Block SPRING = null; - public static final Block DECORATED = null; - public static final Block ENGINE = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:spring_water") + public static final Block SPRING_WATER = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:spring_oil") + public static final Block SPRING_OIL = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:decorated_destroy") + public static final Block DECORATED_DESTROY = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:decorated_blueprint") + public static final Block DECORATED_BLUEPRINT = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:decorated_template") + public static final Block DECORATED_TEMPLATE = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:decorated_paper") + public static final Block DECORATED_PAPER = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:decorated_leather") + public static final Block DECORATED_LEATHER = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:decorated_laser_back") + public static final Block DECORATED_LASER_BACK = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:engine_wood") + public static final Block ENGINE_WOOD = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:engine_stone") + public static final Block ENGINE_STONE = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:engine_iron") + public static final Block ENGINE_IRON = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:engine_creative") + public static final Block ENGINE_CREATIVE = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:marker_volume") public static final Block MARKER_VOLUME = null; + @ObjectHolder(registryName = "block", value = "buildcraftcore:marker_path") public static final Block MARKER_PATH = null; } - @ObjectHolder("buildcraftbuilders") public static class Builders { + @ObjectHolder(registryName = "block", value = "buildcraftbuilders:architect") public static final Block ARCHITECT = null; + @ObjectHolder(registryName = "block", value = "buildcraftbuilders:builder") public static final Block BUILDER = null; + @ObjectHolder(registryName = "block", value = "buildcraftbuilders:filler") public static final Block FILLER = null; + @ObjectHolder(registryName = "block", value = "buildcraftbuilders:library") public static final Block LIBRARY = null; + @ObjectHolder(registryName = "block", value = "buildcraftbuilders:replacer") public static final Block REPLACER = null; + @ObjectHolder(registryName = "block", value = "buildcraftbuilders:quarry") public static final Block QUARRY = null; + @ObjectHolder(registryName = "block", value = "buildcraftbuilders:frame") public static final Block FRAME = null; } - @ObjectHolder("buildcraftenergy") public static class Energy { // Fluid blocks can be accessed ~somewhere else~ +// @ObjectHolder(registryName = "block", value = "buildcraftenergy:") } - @ObjectHolder("buildcraftfactory") public static class Factory { + @ObjectHolder(registryName = "block", value = "buildcraftfactory:autoworkbench_item") public static final Block AUTOWORKBENCH_ITEM = null; + @ObjectHolder(registryName = "block", value = "buildcraftfactory:mining_well") public static final Block MINING_WELL = null; + @ObjectHolder(registryName = "block", value = "buildcraftfactory:pump") public static final Block PUMP = null; + @ObjectHolder(registryName = "block", value = "buildcraftfactory:tube") public static final Block TUBE = null; + @ObjectHolder(registryName = "block", value = "buildcraftfactory:flood_gate") public static final Block FLOOD_GATE = null; + @ObjectHolder(registryName = "block", value = "buildcraftfactory:tank") public static final Block TANK = null; + @ObjectHolder(registryName = "block", value = "buildcraftfactory:chute") public static final Block CHUTE = null; + @ObjectHolder(registryName = "block", value = "buildcraftfactory:water_gel") public static final Block WATER_GEL = null; + @ObjectHolder(registryName = "block", value = "buildcraftfactory:distiller") public static final Block DISTILLER = null; + @ObjectHolder(registryName = "block", value = "buildcraftfactory:heat_exchange") public static final Block HEAT_EXCHANGE = null; } - @ObjectHolder("buildcrafttransport") public static class Transport { + @ObjectHolder(registryName = "block", value = "buildcrafttransport:filtered_buffer") public static final Block FILTERED_BUFFER = null; + @ObjectHolder(registryName = "block", value = "buildcrafttransport:pipe_holder") public static final Block PIPE_HOLDER = null; } - @ObjectHolder("buildcraftsilicon") public static class Silicon { + @ObjectHolder(registryName = "block", value = "buildcraftsilicon:laser") public static final Block LASER = null; + @ObjectHolder(registryName = "block", value = "buildcraftsilicon:assembly_table") public static final Block ASSEMBLY_TABLE = null; + @ObjectHolder(registryName = "block", value = "buildcraftsilicon:advanced_crafting_table") public static final Block ADVANCED_CRAFTING_TABLE = null; + @ObjectHolder(registryName = "block", value = "buildcraftsilicon:integration_table") public static final Block INTEGRATION_TABLE = null; + @ObjectHolder(registryName = "block", value = "buildcraftsilicon:charging_table") public static final Block CHARGING_TABLE = null; + @ObjectHolder(registryName = "block", value = "buildcraftsilicon:programming_table") public static final Block PROGRAMMING_TABLE = null; } - @ObjectHolder("buildcraftrobotics") public static class Robotics { - +// @ObjectHolder(registryName = "block", value = "buildcraftrobotics:") } } diff --git a/api/buildcraft/api/BCItems.java b/api/buildcraft/api/BCItems.java index 01f5446..970c2cd 100644 --- a/api/buildcraft/api/BCItems.java +++ b/api/buildcraft/api/BCItems.java @@ -1,79 +1,111 @@ package buildcraft.api; -import net.minecraft.item.Item; - -import net.minecraftforge.fml.common.registry.GameRegistry.ObjectHolder; - import buildcraft.api.items.FluidItemDrops; +import net.minecraft.world.item.Item; +import net.minecraftforge.registries.ObjectHolder; public class BCItems { - @ObjectHolder("buildcraftlib") public static class Lib { + @ObjectHolder(registryName = "item", value = "buildcraftlib:guide") public static final Item GUIDE = null; + @ObjectHolder(registryName = "item", value = "buildcraftlib:guide_note") public static final Item GUIDE_NOTE = null; + @ObjectHolder(registryName = "item", value = "buildcraftlib:debugger") public static final Item DEBUGGER = null; } - @ObjectHolder("buildcraftcore") public static class Core { + @ObjectHolder(registryName = "item", value = "buildcraftcore:gear_wood") public static final Item GEAR_WOOD = null; + @ObjectHolder(registryName = "item", value = "buildcraftcore:gear_stone") public static final Item GEAR_STONE = null; + @ObjectHolder(registryName = "item", value = "buildcraftcore:gear_iron") public static final Item GEAR_IRON = null; + @ObjectHolder(registryName = "item", value = "buildcraftcore:gear_gold") public static final Item GEAR_GOLD = null; + @ObjectHolder(registryName = "item", value = "buildcraftcore:gear_diamond") public static final Item GEAR_DIAMOND = null; + @ObjectHolder(registryName = "item", value = "buildcraftcore:wrench") public static final Item WRENCH = null; - public static final Item PAINTBRUSH = null; + @ObjectHolder(registryName = "item", value = "buildcraftcore:paintbrush_clean") + public static final Item PAINTBRUSH_CLEAN = null; + @ObjectHolder(registryName = "item", value = "buildcraftcore:list") public static final Item LIST = null; + @ObjectHolder(registryName = "item", value = "buildcraftcore:map_location") public static final Item MAP_LOCATION = null; + @ObjectHolder(registryName = "item", value = "buildcraftcore:marker_connector") public static final Item MARKER_CONNECTOR = null; + @ObjectHolder(registryName = "item", value = "buildcraftcore:volume_box") public static final Item VOLUME_BOX = null; + @ObjectHolder(registryName = "item", value = "buildcraftcore:goggles") public static final Item GOGGLES = null; - /** It is recommended that you refer to {@link FluidItemDrops#item} when creating fluid drops rather than - * this. */ + /** + * It is recommended that you refer to {@link FluidItemDrops#item} when creating fluid drops rather than + * this. + */ + @ObjectHolder(registryName = "item", value = "buildcraftcore:fragile_fluid_shard") public static final Item FRAGILE_FLUID_SHARD = null; } - @ObjectHolder("buildcraftbuilders") public static class Builders { - +// @ObjectHolder(registryName = "item", value = "buildcraftbuilders:") } - @ObjectHolder("buildcraftenergy") public static class Energy { - public static final Item GLOB_OF_OIL = null; + @ObjectHolder(registryName = "item", value = "buildcraftenergy:glob_oil") + public static final Item GLOB_OIL = null; } - @ObjectHolder("buildcraftfactory") public static class Factory { + @ObjectHolder(registryName = "item", value = "buildcraftfactory:plastic_sheet") public static final Item PLASTIC_SHEET = null; - public static final Item WATER_GEL = null; - public static final Item GELLED_WATER = null; + @ObjectHolder(registryName = "item", value = "buildcraftfactory:water_gel_spawn") + public static final Item WATER_GEL_SPAWN = null; + @ObjectHolder(registryName = "item", value = "buildcraftfactory:gel") + public static final Item GEL = null; } - @ObjectHolder("buildcrafttransport") public static class Transport { + @ObjectHolder(registryName = "item", value = "buildcrafttransport:plug_blocker") public static final Item PLUG_BLOCKER = null; + @ObjectHolder(registryName = "item", value = "buildcrafttransport:plug_power_adaptor") public static final Item PLUG_POWER_ADAPTOR = null; - public static final Item PIPE_STRUCTURE = null; - public static final Item PIPE_WOOD_ITEM = null; - public static final Item PIPE_EMZULI_ITEM = null; - public static final Item PIPE_DIAMOND_WOOD_ITEM = null; - public static final Item PIPE_WOOD_FLUID = null; - public static final Item PIPE_DIAMOND_WOOD_FLUID = null; + @ObjectHolder(registryName = "item", value = "buildcrafttransport:pipe_structure_cobblestone_colorless") + public static final Item PIPE_STRUCTURE_COBBLESTONE_COLORLESS = null; + @ObjectHolder(registryName = "item", value = "buildcrafttransport:pipe_items_wood_colorless") + public static final Item PIPE_ITEMS_WOOD_COLORLESS = null; + @ObjectHolder(registryName = "item", value = "buildcrafttransport:pipe_items_emzuli_colorless") + public static final Item PIPE_ITEMS_EMZULI_COLORLESS = null; + @ObjectHolder(registryName = "item", value = "buildcrafttransport:pipe_items_diamond_wood_colorless") + public static final Item PIPE_ITEMS_DIAMOND_WOOD_COLORLESS = null; + @ObjectHolder(registryName = "item", value = "buildcrafttransport:pipe_fluids_wood_colorless") + public static final Item PIPE_FLUIDS_WOOD_COLORLESS = null; + @ObjectHolder(registryName = "item", value = "buildcrafttransport:pipe_fluids_diamond_wood_colorless") + public static final Item PIPE_FLUIDS_DIAMOND_WOOD_COLORLESS = null; } - @ObjectHolder("buildcraftsilicon") public static class Silicon { - public static final Item REDSTONE_CHIPSET = null; - + @ObjectHolder(registryName = "item", value = "buildcraftsilicon:chipset_redstone") + public static final Item CHIPSET_REDSTONE = null; + @ObjectHolder(registryName = "item", value = "buildcraftsilicon:chipset_iron") + public static final Item CHIPSET_IRON = null; + @ObjectHolder(registryName = "item", value = "buildcraftsilicon:chipset_gold") + public static final Item CHIPSET_GOLD = null; + @ObjectHolder(registryName = "item", value = "buildcraftsilicon:chipset_quartz") + public static final Item CHIPSET_QUARTZ = null; + @ObjectHolder(registryName = "item", value = "buildcraftsilicon:chipset_diamond") + public static final Item CHIPSET_DIAMOND = null; + + @ObjectHolder(registryName = "item", value = "buildcraftsilicon:plug_pulsar") public static final Item PLUG_PULSAR = null; + @ObjectHolder(registryName = "item", value = "buildcraftsilicon:plug_facade") + public static final Item PLUG_FACADE = null; } - @ObjectHolder("buildcraftrobotics") public static class Robotics { - +// @ObjectHolder(registryName = "item", value = "buildcraftrobotics:") } } diff --git a/api/buildcraft/api/BCModules.java b/api/buildcraft/api/BCModules.java index bb9cf30..2a67c7b 100644 --- a/api/buildcraft/api/BCModules.java +++ b/api/buildcraft/api/BCModules.java @@ -1,17 +1,16 @@ package buildcraft.api; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.ModLoadingStage; + +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.Locale; -import javax.annotation.Nullable; - -import net.minecraft.client.renderer.block.model.ModelResourceLocation; -import net.minecraft.util.ResourceLocation; - -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.LoaderState; - public enum BCModules implements IBuildCraftMod { LIB, // Base module for all BC. @@ -30,10 +29,14 @@ public enum BCModules implements IBuildCraftMod { private static boolean hasChecked = false; private static BCModules[] loadedModules, missingModules; + // Calen + public static final String BUILDCRAFT = "buildcraft"; + public final String lowerCaseName = name().toLowerCase(Locale.ROOT); // Bit hacky, but it works as this is all english public final String camelCaseName = name().charAt(0) + lowerCaseName.substring(1); - private final String modId = "buildcraft" + lowerCaseName; + // private final String modId = "buildcraft" + lowerCaseName; + private final String modId = BUILDCRAFT + lowerCaseName; private boolean loaded; private static void checkLoadStatus() { @@ -48,12 +51,14 @@ private static synchronized void load0() { if (hasChecked) { return; } - if (!Loader.instance().hasReachedState(LoaderState.PREINITIALIZATION)) { +// if (!Loader.instance().hasReachedState(LoaderState.PREINITIALIZATION)) + if (ModLoadingContext.get().getActiveContainer().getCurrentState().ordinal() < ModLoadingStage.CONSTRUCT.ordinal()) { throw new RuntimeException("You can only use BCModules.isLoaded from pre-init onwards!"); } List found = new ArrayList<>(), missing = new ArrayList<>(); for (BCModules module : VALUES) { - module.loaded = Loader.isModLoaded(module.modId); + module.loaded = ModList.get().isLoaded(module.modId); + if (module.loaded) { found.add(module); } else { @@ -104,10 +109,11 @@ public ResourceLocation createLocation(String path) { } public ModelResourceLocation createModelLocation(String path, String variant) { - return new ModelResourceLocation(getModId() + ":" + path + "#" + variant); + return new ModelResourceLocation(getModId(), path, variant); } public ModelResourceLocation createModelLocation(String pathAndVariant) { - return new ModelResourceLocation(getModId() + ":" + pathAndVariant); + String[] pathAndVariantArray = pathAndVariant.split("#"); + return new ModelResourceLocation(getModId(), pathAndVariantArray[0], pathAndVariantArray[1]); } } diff --git a/api/buildcraft/api/blocks/CustomPaintHelper.java b/api/buildcraft/api/blocks/CustomPaintHelper.java index 2517af2..a3dd769 100644 --- a/api/buildcraft/api/blocks/CustomPaintHelper.java +++ b/api/buildcraft/api/blocks/CustomPaintHelper.java @@ -1,24 +1,23 @@ package buildcraft.api.blocks; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nullable; - +import buildcraft.api.core.BCDebugging; +import buildcraft.api.core.BCLog; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.DyeColor; +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.level.block.state.properties.Property; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.registries.ForgeRegistries; -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.item.EnumDyeColor; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - -import buildcraft.api.core.BCDebugging; -import buildcraft.api.core.BCLog; +import javax.annotation.Nullable; +import java.util.List; +import java.util.Map; /** Provides a simple way to paint a single block, iterating through all {@link ICustomPaintHandler}'s that are * registered for the block. */ @@ -43,11 +42,12 @@ public void registerHandlerForAll(ICustomPaintHandler handler) { /** Register's a paint handler for every class of a given block. */ public void registerHandlerForAll(Class blockClass, ICustomPaintHandler handler) { - for (Block block : Block.REGISTRY) { +// for (Block block : Block.REGISTRY) + for (Block block : ForgeRegistries.BLOCKS.getValues()) { Class foundClass = block.getClass(); if (blockClass.isAssignableFrom(foundClass)) { if (DEBUG) { - BCLog.logger.info("[api.painting] Found an assignable block " + block.getRegistryName() + " (" + foundClass + ") for " + blockClass); + BCLog.logger.info("[api.painting] Found an assignable block " + block.builtInRegistryHolder().key().location() + " (" + foundClass + ") for " + blockClass); } registerHandlerInternal(block, handler); } @@ -57,10 +57,10 @@ public void registerHandlerForAll(Class blockClass, ICustomPain public void registerHandler(Block block, ICustomPaintHandler handler) { if (registerHandlerInternal(block, handler)) { if (DEBUG) { - BCLog.logger.info("[api.painting] Setting a paint handler for block " + block.getRegistryName() + "(" + handler.getClass() + ")"); + BCLog.logger.info("[api.painting] Setting a paint handler for block " + block.builtInRegistryHolder().key().location() + "(" + handler.getClass() + ")"); } } else if (DEBUG) { - BCLog.logger.info("[api.painting] Adding another paint handler for block " + block.getRegistryName() + "(" + handler.getClass() + ")"); + BCLog.logger.info("[api.painting] Adding another paint handler for block " + block.builtInRegistryHolder().key().location() + "(" + handler.getClass() + ")"); } } @@ -77,7 +77,7 @@ private boolean registerHandlerInternal(Block block, ICustomPaintHandler handler } /** Attempts to paint a block at the given position. Basically iterates through all registered paint handlers. */ - public EnumActionResult attemptPaintBlock(World world, BlockPos pos, IBlockState state, Vec3d hitPos, @Nullable EnumFacing hitSide, @Nullable EnumDyeColor paint) { + public InteractionResult attemptPaintBlock(Level world, BlockPos pos, BlockState state, Vec3 hitPos, @Nullable Direction hitSide, @Nullable DyeColor paint) { Block block = state.getBlock(); if (block instanceof ICustomPaintHandler) { return ((ICustomPaintHandler) block).attemptPaint(world, pos, state, hitPos, hitSide, paint); @@ -87,29 +87,55 @@ public EnumActionResult attemptPaintBlock(World world, BlockPos pos, IBlockState return defaultAttemptPaint(world, pos, state, hitPos, hitSide, paint); } for (ICustomPaintHandler handler : custom) { - EnumActionResult result = handler.attemptPaint(world, pos, state, hitPos, hitSide, paint); - if (result != EnumActionResult.PASS) { + InteractionResult result = handler.attemptPaint(world, pos, state, hitPos, hitSide, paint); + if (result != InteractionResult.PASS) { return result; } } return defaultAttemptPaint(world, pos, state, hitPos, hitSide, paint); } - private EnumActionResult defaultAttemptPaint(World world, BlockPos pos, IBlockState state, Vec3d hitPos, EnumFacing hitSide, @Nullable EnumDyeColor paint) { + private InteractionResult defaultAttemptPaint(Level world, BlockPos pos, BlockState state, Vec3 hitPos, Direction hitSide, @Nullable DyeColor paint) { for (ICustomPaintHandler handler : allHandlers) { - EnumActionResult result = handler.attemptPaint(world, pos, state, hitPos, hitSide, paint); - if (result != EnumActionResult.PASS) { + InteractionResult result = handler.attemptPaint(world, pos, state, hitPos, hitSide, paint); + if (result != InteractionResult.PASS) { return result; } } if (paint == null) { - return EnumActionResult.FAIL; + return InteractionResult.FAIL; } - Block b = state.getBlock(); - if (b.recolorBlock(world, pos, hitSide, paint)) { - return EnumActionResult.SUCCESS; +// Block b = state.getBlock(); +// if (b.recolorBlock(world, pos, hitSide, paint)) + if (recolorBlock(world, pos, hitSide, paint)) { + return InteractionResult.SUCCESS; } else { - return EnumActionResult.FAIL; + return InteractionResult.FAIL; + } + } + + /** + * From 1.12.2 Block + * Common way to recolor a block with an external tool + * + * @param world The world + * @param pos Block position in world + * @param side The side hit with the coloring tool + * @param color The color to change to + * @return If the recoloring was successful + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static boolean recolorBlock(Level world, BlockPos pos, Direction side, DyeColor color) { + BlockState state = world.getBlockState(pos); + for (Property prop : state.getProperties()) { + if (prop.getName().equals("color") && prop.getValueClass() == DyeColor.class) { + DyeColor current = (DyeColor) state.getValue(prop); + if (current != color && prop.getPossibleValues().contains(color)) { + world.setBlock(pos, state.setValue(prop, color), Block.UPDATE_ALL); + return true; + } + } } + return false; } } diff --git a/api/buildcraft/api/blocks/CustomRotationHelper.java b/api/buildcraft/api/blocks/CustomRotationHelper.java index 235c0de..c11e063 100644 --- a/api/buildcraft/api/blocks/CustomRotationHelper.java +++ b/api/buildcraft/api/blocks/CustomRotationHelper.java @@ -1,20 +1,19 @@ package buildcraft.api.blocks; -import java.util.List; -import java.util.Map; - +import buildcraft.api.core.BCDebugging; +import buildcraft.api.core.BCLog; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.registries.ForgeRegistries; -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import buildcraft.api.core.BCDebugging; -import buildcraft.api.core.BCLog; +import java.util.List; +import java.util.Map; public enum CustomRotationHelper { INSTANCE; @@ -26,11 +25,11 @@ public enum CustomRotationHelper { private final Map> handlers = Maps.newIdentityHashMap(); public void registerHandlerForAll(Class blockClass, ICustomRotationHandler handler) { - for (Block block : Block.REGISTRY) { + for (Block block : ForgeRegistries.BLOCKS) { Class foundClass = block.getClass(); if (blockClass.isAssignableFrom(foundClass)) { if (DEBUG) { - BCLog.logger.info("[api.rotation] Found an assignable block " + block.getRegistryName() + " (" + foundClass + ") for " + blockClass); + BCLog.logger.info("[api.rotation] Found an assignable block " + block.builtInRegistryHolder().key().location() + " (" + foundClass + ") for " + blockClass); } registerHandlerInternal(block, handler); } @@ -40,10 +39,10 @@ public void registerHandlerForAll(Class blockClass, ICustomRota public void registerHandler(Block block, ICustomRotationHandler handler) { if (registerHandlerInternal(block, handler)) { if (DEBUG) { - BCLog.logger.info("[api.rotation] Setting a rotation handler for block " + block.getRegistryName()); + BCLog.logger.info("[api.rotation] Setting a rotation handler for block " + block.builtInRegistryHolder().key().location()); } } else if (DEBUG) { - BCLog.logger.info("[api.rotation] Adding another rotation handler for block " + block.getRegistryName()); + BCLog.logger.info("[api.rotation] Adding another rotation handler for block " + block.builtInRegistryHolder().key().location()); } } @@ -59,18 +58,18 @@ private boolean registerHandlerInternal(Block block, ICustomRotationHandler hand } } - public EnumActionResult attemptRotateBlock(World world, BlockPos pos, IBlockState state, EnumFacing sideWrenched) { + public InteractionResult attemptRotateBlock(Level world, BlockPos pos, BlockState state, Direction sideWrenched) { Block block = state.getBlock(); if (block instanceof ICustomRotationHandler) { return ((ICustomRotationHandler) block).attemptRotation(world, pos, state, sideWrenched); } - if (!handlers.containsKey(block)) return EnumActionResult.PASS; + if (!handlers.containsKey(block)) return InteractionResult.PASS; for (ICustomRotationHandler handler : handlers.get(block)) { - EnumActionResult result = handler.attemptRotation(world, pos, state, sideWrenched); - if (result != EnumActionResult.PASS) { + InteractionResult result = handler.attemptRotation(world, pos, state, sideWrenched); + if (result != InteractionResult.PASS) { return result; } } - return EnumActionResult.PASS; + return InteractionResult.PASS; } } diff --git a/api/buildcraft/api/blocks/ICustomPaintHandler.java b/api/buildcraft/api/blocks/ICustomPaintHandler.java index fd79c91..e717ccc 100644 --- a/api/buildcraft/api/blocks/ICustomPaintHandler.java +++ b/api/buildcraft/api/blocks/ICustomPaintHandler.java @@ -1,21 +1,21 @@ package buildcraft.api.blocks; -import javax.annotation.Nullable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; -import net.minecraft.block.state.IBlockState; -import net.minecraft.item.EnumDyeColor; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import javax.annotation.Nullable; /** Provides a way to paint blocks from any position. You can either implement this on a block, or register an instance * for a block with {@link CustomPaintHelper} */ public interface ICustomPaintHandler { /** Attempts to paint the given block. This can also only paint a specific part of the block (as the hit position is * given). - * + * * @param world The world that the block is contained within. * @param pos The position of the block. * @param state The current state of the block. @@ -27,5 +27,5 @@ public interface ICustomPaintHandler { * @return The result of attempting to paint. SUCCESS means that you changed the block from before to a new value, * FAIL means you COULD have handled the block, but it was already painted to that colour, or PASS if you * have no idea how to handle the block in question. */ - EnumActionResult attemptPaint(World world, BlockPos pos, IBlockState state, Vec3d hitPos, @Nullable EnumFacing hitSide, @Nullable EnumDyeColor paintColour); + InteractionResult attemptPaint(Level world, BlockPos pos, BlockState state, Vec3 hitPos, @Nullable Direction hitSide, @Nullable DyeColor paintColour); } diff --git a/api/buildcraft/api/blocks/ICustomRotationHandler.java b/api/buildcraft/api/blocks/ICustomRotationHandler.java index 9076f8f..8e04d3a 100644 --- a/api/buildcraft/api/blocks/ICustomRotationHandler.java +++ b/api/buildcraft/api/blocks/ICustomRotationHandler.java @@ -1,11 +1,11 @@ package buildcraft.api.blocks; -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; public interface ICustomRotationHandler { - EnumActionResult attemptRotation(World world, BlockPos pos, IBlockState state, EnumFacing sideWrenched); + InteractionResult attemptRotation(Level world, BlockPos pos, BlockState state, Direction sideWrenched); } diff --git a/api/buildcraft/api/blocks/ISpring.java b/api/buildcraft/api/blocks/ISpring.java new file mode 100644 index 0000000..27903b6 --- /dev/null +++ b/api/buildcraft/api/blocks/ISpring.java @@ -0,0 +1,7 @@ +package buildcraft.api.blocks; + +import buildcraft.api.enums.EnumSpring; + +public interface ISpring { + EnumSpring getType(); +} diff --git a/api/buildcraft/api/blocks/package-info.java b/api/buildcraft/api/blocks/package-info.java index 47ae1d2..a820019 100644 --- a/api/buildcraft/api/blocks/package-info.java +++ b/api/buildcraft/api/blocks/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "1.0", owner = "buildcraftapi_core", provides = "buildcraftapi_blocks") +//@API(apiVersion = "1.0", owner = "buildcraftapi_core", provides = "buildcraftapi_blocks") package buildcraft.api.blocks; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/boards/RedstoneBoardNBT.java b/api/buildcraft/api/boards/RedstoneBoardNBT.java index 0ced64a..1508afa 100755 --- a/api/buildcraft/api/boards/RedstoneBoardNBT.java +++ b/api/buildcraft/api/boards/RedstoneBoardNBT.java @@ -4,38 +4,37 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.boards; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + import java.util.List; import java.util.Random; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - -import net.minecraftforge.common.util.Constants; - public abstract class RedstoneBoardNBT { private static Random rand = new Random(); public abstract String getID(); - public abstract void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced); + public abstract void addInformation(ItemStack stack, Player player, List list, boolean advanced); public abstract String getDisplayName(); - public abstract IRedstoneBoard create(NBTTagCompound nbt, T object); + public abstract IRedstoneBoard create(CompoundTag nbt, T object); public abstract String getItemModelLocation(); - public void createBoard(NBTTagCompound nbt) { - nbt.setString("id", getID()); + public void createBoard(CompoundTag nbt) { + nbt.putString("id", getID()); } - public int getParameterNumber(NBTTagCompound nbt) { - if (!nbt.hasKey("parameters")) { + public int getParameterNumber(CompoundTag nbt) { + if (!nbt.contains("parameters")) { return 0; } else { - return nbt.getTagList("parameters", Constants.NBT.TAG_COMPOUND).tagCount(); + return nbt.getList("parameters", Tag.TAG_COMPOUND).size(); } } diff --git a/api/buildcraft/api/boards/RedstoneBoardRegistry.java b/api/buildcraft/api/boards/RedstoneBoardRegistry.java index edfe79c..c3b6157 100755 --- a/api/buildcraft/api/boards/RedstoneBoardRegistry.java +++ b/api/buildcraft/api/boards/RedstoneBoardRegistry.java @@ -4,16 +4,16 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.boards; -import java.util.Collection; +import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NBTTagCompound; +import java.util.Collection; public abstract class RedstoneBoardRegistry { public static RedstoneBoardRegistry instance; /** Register a redstone board type. - * + * * @param redstoneBoardNBT The RedstoneBoardNBT instance containing the board information. * @param microJoules MJ price of the board, in micro MJ. */ public abstract void registerBoardType(RedstoneBoardNBT redstoneBoardNBT, long microJoules); @@ -22,7 +22,7 @@ public abstract class RedstoneBoardRegistry { public abstract RedstoneBoardRobotNBT getEmptyRobotBoard(); - public abstract RedstoneBoardNBT getRedstoneBoard(NBTTagCompound nbt); + public abstract RedstoneBoardNBT getRedstoneBoard(CompoundTag nbt); public abstract RedstoneBoardNBT getRedstoneBoard(String id); diff --git a/api/buildcraft/api/boards/RedstoneBoardRobotNBT.java b/api/buildcraft/api/boards/RedstoneBoardRobotNBT.java index 4a4161b..cb7debb 100755 --- a/api/buildcraft/api/boards/RedstoneBoardRobotNBT.java +++ b/api/buildcraft/api/boards/RedstoneBoardRobotNBT.java @@ -4,15 +4,14 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.boards; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ResourceLocation; - import buildcraft.api.robots.EntityRobotBase; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; public abstract class RedstoneBoardRobotNBT extends RedstoneBoardNBT { @Override - public RedstoneBoardRobot create(NBTTagCompound nbt, EntityRobotBase robot) { + public RedstoneBoardRobot create(CompoundTag nbt, EntityRobotBase robot) { return create(robot); } diff --git a/api/buildcraft/api/boards/package-info.java b/api/buildcraft/api/boards/package-info.java index 69405e4..8ee0580 100644 --- a/api/buildcraft/api/boards/package-info.java +++ b/api/buildcraft/api/boards/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "2.0", owner = "buildcraftapi_core", provides = "buildcraftapi_boards") +//@API(apiVersion = "2.0", owner = "buildcraftapi_core", provides = "buildcraftapi_boards") package buildcraft.api.boards; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/core/AreaProviders.java b/api/buildcraft/api/core/AreaProviders.java index 0ebe02f..e802c4e 100644 --- a/api/buildcraft/api/core/AreaProviders.java +++ b/api/buildcraft/api/core/AreaProviders.java @@ -1,20 +1,20 @@ package buildcraft.api.core; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; + import java.util.ArrayList; import java.util.List; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - public class AreaProviders { public static final List providers = new ArrayList<>(); public interface IAreaProviderGetter { /** @return All of the {@link IAreaProvider}'s that contain the specified block psoition. */ - List getAreaProviders(World world, BlockPos at); + List getAreaProviders(Level world, BlockPos at); } - public static List getAreaProviders(World world, BlockPos at) { + public static List getAreaProviders(Level world, BlockPos at) { List list = new ArrayList<>(); for (IAreaProviderGetter getter : providers) { list.addAll(getter.getAreaProviders(world, at)); diff --git a/api/buildcraft/api/core/BCDebugging.java b/api/buildcraft/api/core/BCDebugging.java index 14e5917..e89af50 100644 --- a/api/buildcraft/api/core/BCDebugging.java +++ b/api/buildcraft/api/core/BCDebugging.java @@ -4,18 +4,12 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.core; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; + import java.lang.reflect.Method; import java.util.Locale; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.LoaderState; -import net.minecraftforge.fml.common.ModContainer; - -import buildcraft.api.BCModules; - /** Provides a way to quickly enable or disable certain debug conditions via VM arguments or whether the client/server * is in a dev environment */ public class BCDebugging { @@ -48,8 +42,8 @@ enum DebugLevel { boolean isDev; try { - Method getTileEntity = World.class.getDeclaredMethod("getTileEntity", BlockPos.class); - BCLog.logger.info("[debugger] Method found: World.getTileEntity = " + getTileEntity); + Method getBlockEntity = Level.class.getDeclaredMethod("getBlockEntity", BlockPos.class); + BCLog.logger.info("[debugger] Method found: Level.getBlockEntity = " + getBlockEntity); isDev = true; } catch (Throwable ignored) { // If it didn't find it then we aren't in a dev environment diff --git a/api/buildcraft/api/core/BCLog.java b/api/buildcraft/api/core/BCLog.java index f745091..7b892f7 100644 --- a/api/buildcraft/api/core/BCLog.java +++ b/api/buildcraft/api/core/BCLog.java @@ -12,7 +12,8 @@ public final class BCLog { public static final Logger logger = LogManager.getLogger("BuildCraft"); /** Deactivate constructor */ - private BCLog() {} + private BCLog() { + } @Deprecated public static void logErrorAPI(String mod, Throwable error, Class classFile) { diff --git a/api/buildcraft/api/core/BuildCraftAPI.java b/api/buildcraft/api/core/BuildCraftAPI.java index f7f24c0..3081f26 100644 --- a/api/buildcraft/api/core/BuildCraftAPI.java +++ b/api/buildcraft/api/core/BuildCraftAPI.java @@ -1,22 +1,21 @@ /** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com * - * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which - * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ + * BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents + * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.core; -import java.util.HashMap; -import java.util.Set; - import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.fml.ModContainer; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.ModLoadingContext; -import net.minecraft.block.Block; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.ModContainer; +import java.util.HashMap; +import java.util.Set; public final class BuildCraftAPI { public static IFakePlayerProvider fakePlayerProvider; @@ -25,12 +24,13 @@ public final class BuildCraftAPI { public static final HashMap worldProperties = Maps.newHashMap(); /** Deactivate constructor */ - private BuildCraftAPI() {} + private BuildCraftAPI() { + } public static String getVersion() { - ModContainer container = Loader.instance().getIndexedModList().get("buildcraftlib"); + ModContainer container = ModList.get().getModContainerById("buildcraftlib").get(); if (container != null) { - return container.getDisplayVersion(); + return container.getModInfo().getVersion().getQualifier(); } return "UNKNOWN VERSION"; } @@ -46,13 +46,14 @@ public static void registerWorldProperty(String name, IWorldProperty property) { worldProperties.put(name, property); } - public static boolean isSoftBlock(World world, BlockPos pos) { + public static boolean isSoftBlock(Level world, BlockPos pos) { return worldProperties.get("soft").get(world, pos); } public static ResourceLocation nameToResourceLocation(String name) { if (name.indexOf(':') > 0) return new ResourceLocation(name); - ModContainer modContainer = Loader.instance().activeModContainer(); +// ModContainer modContainer = Loader.instance().activeModContainer(); + ModContainer modContainer = ModLoadingContext.get().getActiveContainer(); if (modContainer == null) { throw new IllegalStateException("Illegal recipe name " + name + ". Provide domain id to register it correctly."); } diff --git a/api/buildcraft/api/core/CapabilitiesHelper.java b/api/buildcraft/api/core/CapabilitiesHelper.java index e39a8c4..e947e6f 100644 --- a/api/buildcraft/api/core/CapabilitiesHelper.java +++ b/api/buildcraft/api/core/CapabilitiesHelper.java @@ -1,19 +1,10 @@ package buildcraft.api.core; -import java.lang.reflect.Field; -import java.util.IdentityHashMap; -import java.util.concurrent.Callable; - -import javax.annotation.Nonnull; - -import net.minecraft.nbt.NBTBase; -import net.minecraft.util.EnumFacing; - import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.Capability.IStorage; -import net.minecraftforge.common.capabilities.CapabilityInject; import net.minecraftforge.common.capabilities.CapabilityManager; +import java.util.concurrent.Callable; + /** Forge has a wonderful system for capabilities, which provides a better way of managing mod compat even if the target * mod isn't loaded. Said system uses ASM data to inject capabilities into every mod, which makes it a matter of * checking a (generic) field at runtime. @@ -38,59 +29,59 @@ public class CapabilitiesHelper { /** Registers a given type with {@link #registerCapability(CheckedStorage, Callable)}, but with a * {@link ThrowingStorage} and a factory that throws an {@link UnsupportedOperationException} instead of creating a * new capability instance. - * + * * @param clazz The type that all instances must derive from. * @return The registered {@link Capability} */ - @Nonnull - public static Capability registerCapability(Class clazz) { - return registerCapability(new ThrowingStorage<>(clazz), () -> { - throw new UnsupportedOperationException("You must create your own instances!"); - }); - } +// @Nonnull +// public static Capability registerCapability(Class clazz) { +// return registerCapability(new ThrowingStorage<>(clazz), () -> { +// throw new UnsupportedOperationException("You must create your own instances!"); +// }); +// } /** Registers a given type with the {@link CapabilityManager}, but also returns the capability instance. - * + * * @param storage The storage for the capability. This must extend {@link CheckedStorage} in order to allow the - * internal mechanisms to ensure that nothing went wrong during our meddling into forge. + * internal mechanisms to ensure that nothing went wrong during our meddling into forge. * @param factory The factory for the capability. * @return The registered {@link Capability} */ - @Nonnull - public static Capability registerCapability(CheckedStorage storage, Callable factory) { - return registerCapInternal(storage, factory); - } +// @Nonnull +// public static Capability registerCapability(CheckedStorage storage, Callable factory) { +// return registerCapInternal(storage, factory); +// } /** A type of {@link IStorage} that contains the class that it would store. Used by the internal mechanisms of * {@link CapabilitiesHelper} to ensure that everything registers properly. A default always-throwing implementation * is {@link ThrowingStorage}. - * + * * @param The type of this storage */ - public static abstract class CheckedStorage implements IStorage { - - public final Class clazz; - - public CheckedStorage(Class clazz) { - this.clazz = clazz; - } - } +// public static abstract class CheckedStorage implements IStorage { +// +// public final Class clazz; +// +// public CheckedStorage(Class clazz) { +// this.clazz = clazz; +// } +// } /** A type of {@link CheckedStorage} that throws an {@link UnsupportedOperationException} from both the read and * write methods. It is designed for {@link Capability Capability's} that must be written and read separately. */ - public static final class ThrowingStorage extends CheckedStorage { - - public ThrowingStorage(Class clazz) { - super(clazz); - } - - @Override - public NBTBase writeNBT(Capability capability, T instance, EnumFacing side) { - throw new UnsupportedOperationException("You must create your own instances!"); - } - - @Override - public void readNBT(Capability capability, T instance, EnumFacing side, NBTBase nbt) { - throw new UnsupportedOperationException("You must create your own instances!"); - } - } +// public static final class ThrowingStorage extends CheckedStorage { +// +// public ThrowingStorage(Class clazz) { +// super(clazz); +// } +// +// @Override +// public NBTBase writeNBT(Capability capability, T instance, EnumFacing side) { +// throw new UnsupportedOperationException("You must create your own instances!"); +// } +// +// @Override +// public void readNBT(Capability capability, T instance, EnumFacing side, NBTBase nbt) { +// throw new UnsupportedOperationException("You must create your own instances!"); +// } +// } // ################ // @@ -98,74 +89,74 @@ public void readNBT(Capability capability, T instance, EnumFacing side, NBTBa // // ################ - private static final IdentityHashMap __FIELD_CAP_MANAGER_PROVIDERS; - - static { - try { - Field fld = CapabilityManager.class.getDeclaredField("providers"); - fld.setAccessible(true); - Object obj = fld.get(CapabilityManager.INSTANCE); - __FIELD_CAP_MANAGER_PROVIDERS = (IdentityHashMap) obj; - if (__FIELD_CAP_MANAGER_PROVIDERS == null) { - throw new Error("Couldn't find providers!"); - } - } catch (ReflectiveOperationException | ClassCastException e) { - throw new Error(e); - } - } - - @Nonnull - private static Capability registerCapInternal(CheckedStorage storage, Callable factory) { - Class clazz = storage.clazz; - - CapabilityManager.INSTANCE.register(clazz, storage, factory); - - String fullName = clazz.getName().intern(); - Object obj = __FIELD_CAP_MANAGER_PROVIDERS.get(fullName); - if (obj == null) { - throw new IllegalStateException("Apparently we didn't register the capability? How?"); - } - if (!(obj instanceof Capability)) { - throw new Error("We must have the wrong map! providers.get(key) returned " + obj.getClass() - + " rather than " + Capability.class); - } - Capability cap = (Capability) obj; - // Ensure that the given cap is actually *our* capability - // compare the given class with the VoidStorage class, as - // Capability doesn't have a way of doing that directly. - IStorage cStorage = cap.getStorage(); - if (!(cStorage instanceof CheckedStorage)) { - throw new IllegalStateException( - "Returned capability storage has a different storage class than expected! " + cStorage.getClass()); - } - CheckedStorage vStorage = (CheckedStorage) cStorage; - if (vStorage.clazz != clazz) { - throw new IllegalStateException( - "Returned capability storage has a different class than expected! " + vStorage.clazz + " vs " + clazz); - } - return (Capability) cap; - } +// private static final IdentityHashMap __FIELD_CAP_MANAGER_PROVIDERS; + +// static { +// try { +// Field fld = CapabilityManager.class.getDeclaredField("providers"); +// fld.setAccessible(true); +// Object obj = fld.get(CapabilityManager.INSTANCE); +// __FIELD_CAP_MANAGER_PROVIDERS = (IdentityHashMap) obj; +// if (__FIELD_CAP_MANAGER_PROVIDERS == null) { +// throw new Error("Couldn't find providers!"); +// } +// } catch (ReflectiveOperationException | ClassCastException e) { +// throw new Error(e); +// } +// } + +// @Nonnull +// private static Capability registerCapInternal(CheckedStorage storage, Callable factory) { +// Class clazz = storage.clazz; +// +// CapabilityManager.INSTANCE.register(clazz, storage, factory); +// +// String fullName = clazz.getName().intern(); +// Object obj = __FIELD_CAP_MANAGER_PROVIDERS.get(fullName); +// if (obj == null) { +// throw new IllegalStateException("Apparently we didn't register the capability? How?"); +// } +// if (!(obj instanceof Capability)) { +// throw new Error("We must have the wrong map! providers.get(key) returned " + obj.getClass() +// + " rather than " + Capability.class); +// } +// Capability cap = (Capability) obj; +// // Ensure that the given cap is actually *our* capability +// // compare the given class with the VoidStorage class, as +// // Capability doesn't have a way of doing that directly. +// IStorage cStorage = cap.getStorage(); +// if (!(cStorage instanceof CheckedStorage)) { +// throw new IllegalStateException( +// "Returned capability storage has a different storage class than expected! " + cStorage.getClass()); +// } +// CheckedStorage vStorage = (CheckedStorage) cStorage; +// if (vStorage.clazz != clazz) { +// throw new IllegalStateException( +// "Returned capability storage has a different class than expected! " + vStorage.clazz + " vs " + clazz); +// } +// return (Capability) cap; +// } /** Prefer {@link #registerCapability(Class)} or other methods over this one: this will be removed at some point in * the future. Most likely before beta. */ - @Nonnull - @Deprecated - public static Capability ensureRegistration(Capability cap, Class clazz) { - if (cap == null) { - throw new Error("Capability registration failed for " + clazz); - } - return cap; - } - - public static class VoidStorage implements Capability.IStorage { - @Override - public NBTBase writeNBT(Capability capability, T instance, EnumFacing side) { - throw new IllegalStateException("You must create your own instances!"); - } - - @Override - public void readNBT(Capability capability, T instance, EnumFacing side, NBTBase nbt) { - throw new IllegalStateException("You must create your own instances!"); - } - } +// @Nonnull +// @Deprecated +// public static Capability ensureRegistration(Capability cap, Class clazz) { +// if (cap == null) { +// throw new Error("Capability registration failed for " + clazz); +// } +// return cap; +// } + +// public static class VoidStorage implements Capability.IStorage { +// @Override +// public NBTBase writeNBT(Capability capability, T instance, EnumFacing side) { +// throw new IllegalStateException("You must create your own instances!"); +// } +// +// @Override +// public void readNBT(Capability capability, T instance, EnumFacing side, NBTBase nbt) { +// throw new IllegalStateException("You must create your own instances!"); +// } +// } } diff --git a/api/buildcraft/api/core/EnumColor.java b/api/buildcraft/api/core/EnumColor.java deleted file mode 100644 index 0288438..0000000 --- a/api/buildcraft/api/core/EnumColor.java +++ /dev/null @@ -1,147 +0,0 @@ -/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com - * - * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which - * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -package buildcraft.api.core; - -import java.util.Locale; -import java.util.Random; - -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.util.IStringSerializable; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.translation.I18n; - -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -/** Use minecraft's EnumDyeColor in as many places as possible. */ -@Deprecated -public enum EnumColor implements IStringSerializable { - - BLACK, - RED, - GREEN, - BROWN, - BLUE, - PURPLE, - CYAN, - LIGHT_GRAY, - GRAY, - PINK, - LIME, - YELLOW, - LIGHT_BLUE, - MAGENTA, - ORANGE, - WHITE; - - public static final EnumColor[] VALUES = values(); - public static final String[] DYES = { "dyeBlack", "dyeRed", "dyeGreen", "dyeBrown", "dyeBlue", "dyePurple", "dyeCyan", "dyeLightGray", "dyeGray", - "dyePink", "dyeLime", "dyeYellow", "dyeLightBlue", "dyeMagenta", "dyeOrange", "dyeWhite" }; - public static final String[] NAMES = { "Black", "Red", "Green", "Brown", "Blue", "Purple", "Cyan", "LightGray", "Gray", "Pink", "Lime", "Yellow", - "LightBlue", "Magenta", "Orange", "White" }; - public static final int[] DARK_HEX = { 0x2D2D2D, 0xA33835, 0x394C1E, 0x5C3A24, 0x3441A2, 0x843FBF, 0x36809E, 0x888888, 0x444444, 0xE585A0, - 0x3FAA36, 0xCFC231, 0x7F9AD1, 0xFF64FF, 0xFF6A00, 0xFFFFFF }; - public static final int[] LIGHT_HEX = { 0x181414, 0xBE2B27, 0x007F0E, 0x89502D, 0x253193, 0x7e34bf, 0x299799, 0xa0a7a7, 0x7A7A7A, 0xD97199, - 0x39D52E, 0xFFD91C, 0x66AAFF, 0xD943C6, 0xEA7835, 0xe4e4e4 }; - - @SideOnly(Side.CLIENT) - private static ResourceLocation iconSheet; - - @SideOnly(Side.CLIENT) - private static TextureAtlasSprite[] brushSprites; - - public int getDarkHex() { - return DARK_HEX[ordinal()]; - } - - public int getLightHex() { - return LIGHT_HEX[ordinal()]; - } - - public static EnumColor fromId(int id) { - if (id < 0 || id >= VALUES.length) { - return WHITE; - } - return VALUES[id]; - } - - public static EnumColor fromDye(String dyeTag) { - for (int id = 0; id < DYES.length; id++) { - if (DYES[id].equals(dyeTag)) { - return VALUES[id]; - } - } - return null; - } - - public static EnumColor fromName(String name) { - for (int id = 0; id < NAMES.length; id++) { - if (NAMES[id].equals(name)) { - return VALUES[id]; - } - } - return null; - } - - public static EnumColor getRand() { - return VALUES[new Random().nextInt(VALUES.length)]; - } - - public EnumColor getNext() { - EnumColor next = VALUES[(ordinal() + 1) % VALUES.length]; - return next; - } - - public EnumColor getPrevious() { - EnumColor previous = VALUES[(ordinal() + VALUES.length - 1) % VALUES.length]; - return previous; - } - - public EnumColor inverse() { - return EnumColor.VALUES[15 - ordinal()]; - } - - public String getTag() { - return "color." + name().replace("_", ".").toLowerCase(Locale.ENGLISH); - } - - public String getBasicTag() { - return name().replace("_", ".").toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return NAMES[ordinal()]; - } - - public String getLocalizedName() { - return I18n.translateToLocal(getTag()); - } - - public String getDye() { - return DYES[ordinal()]; - } - - @Override - public String toString() { - String s = name().replace("_", " "); - String[] words = s.split(" "); - StringBuilder b = new StringBuilder(); - for (String word : words) { - b.append(word.charAt(0)).append(word.substring(1).toLowerCase(Locale.ENGLISH)).append(" "); - } - return b.toString().trim(); - } - - @SideOnly(Side.CLIENT) - public static void registerSprites(TextureAtlasSprite[] sprites) { - brushSprites = sprites; - } - - @SideOnly(Side.CLIENT) - public TextureAtlasSprite getSprite() { - return brushSprites[ordinal()]; - } -} diff --git a/api/buildcraft/api/core/EnumPipePart.java b/api/buildcraft/api/core/EnumPipePart.java index 3eb3731..b6e6f6f 100644 --- a/api/buildcraft/api/core/EnumPipePart.java +++ b/api/buildcraft/api/core/EnumPipePart.java @@ -1,23 +1,22 @@ package buildcraft.api.core; +import com.google.common.collect.Maps; +import net.minecraft.core.Direction; +import net.minecraft.nbt.NumericTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.util.StringRepresentable; + import java.util.Locale; import java.util.Map; -import com.google.common.collect.Maps; - -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTPrimitive; -import net.minecraft.nbt.NBTTagString; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.IStringSerializable; - -public enum EnumPipePart implements IStringSerializable { - DOWN(EnumFacing.DOWN), - UP(EnumFacing.UP), - NORTH(EnumFacing.NORTH), - SOUTH(EnumFacing.SOUTH), - WEST(EnumFacing.WEST), - EAST(EnumFacing.EAST), +public enum EnumPipePart implements StringRepresentable { + DOWN(Direction.DOWN), + UP(Direction.UP), + NORTH(Direction.NORTH), + SOUTH(Direction.SOUTH), + WEST(Direction.WEST), + EAST(Direction.EAST), /** CENTER, UNKNOWN and ALL are all valid uses of this. */ CENTER(null); @@ -25,22 +24,23 @@ public enum EnumPipePart implements IStringSerializable { public static final EnumPipePart[] FACES; public static final EnumPipePart[] HORIZONTALS; - private static final Map facingMap = Maps.newEnumMap(EnumFacing.class); + private static final Map facingMap = Maps.newEnumMap(Direction.class); private static final Map nameMap = Maps.newHashMap(); private static final int MAX_VALUES = values().length; - public final EnumFacing face; + public final Direction face; static { for (EnumPipePart part : values()) { nameMap.put(part.name(), part); if (part.face != null) facingMap.put(part.face, part); } - FACES = fromFacingArray(EnumFacing.VALUES); - HORIZONTALS = fromFacingArray(EnumFacing.HORIZONTALS); + FACES = fromFacingArray(Direction.VALUES); +// HORIZONTALS = fromFacingArray(Direction.HORIZONTALS); + HORIZONTALS = fromFacingArray(Direction.BY_2D_DATA); } - private static EnumPipePart[] fromFacingArray(EnumFacing... faces) { + private static EnumPipePart[] fromFacingArray(Direction... faces) { EnumPipePart[] arr = new EnumPipePart[faces.length]; for (int i = 0; i < faces.length; i++) { arr[i] = fromFacing(faces[i]); @@ -48,11 +48,11 @@ private static EnumPipePart[] fromFacingArray(EnumFacing... faces) { return arr; } - public static int ordinal(EnumFacing face) { + public static int ordinal(Direction face) { return face == null ? 6 : face.ordinal(); } - public static EnumPipePart fromFacing(EnumFacing face) { + public static EnumPipePart fromFacing(Direction face) { if (face == null) { return EnumPipePart.CENTER; } @@ -70,17 +70,17 @@ public static EnumPipePart fromMeta(int meta) { return VALUES[meta]; } - EnumPipePart(EnumFacing face) { + EnumPipePart(Direction face) { this.face = face; } public int getIndex() { if (face == null) return 6; - return face.getIndex(); + return face.get3DDataValue(); } @Override - public String getName() { + public String getSerializedName() { return name().toLowerCase(Locale.ROOT); } @@ -110,16 +110,16 @@ public EnumPipePart opposite() { return fromFacing(face.getOpposite()); } - public static EnumPipePart readFromNBT(NBTBase base) { + public static EnumPipePart readFromNBT(Tag base) { if (base == null) { return CENTER; } - if (base instanceof NBTTagString) { - NBTTagString nbtString = (NBTTagString) base; - String string = nbtString.getString(); + if (base instanceof StringTag) { + StringTag nbtString = (StringTag) base; + String string = nbtString.getAsString(); return nameMap.getOrDefault(string, CENTER); } else { - byte ord = ((NBTPrimitive) base).getByte(); + byte ord = ((NumericTag) base).getAsByte(); if (ord < 0 || ord > 6) { return CENTER; } @@ -127,7 +127,7 @@ public static EnumPipePart readFromNBT(NBTBase base) { } } - public NBTBase writeToNBT() { - return new NBTTagString(name()); + public Tag writeToNBT() { + return StringTag.valueOf(name()); } } diff --git a/api/buildcraft/api/core/EnumWireColour.java b/api/buildcraft/api/core/EnumWireColour.java index b6e1e3d..95249b9 100644 --- a/api/buildcraft/api/core/EnumWireColour.java +++ b/api/buildcraft/api/core/EnumWireColour.java @@ -1,41 +1,42 @@ package buildcraft.api.core; +import net.minecraft.world.item.DyeColor; + import java.util.EnumMap; import java.util.EnumSet; import java.util.Set; -import net.minecraft.item.EnumDyeColor; - -/** A subset of colours from {@link EnumDyeColor} that are suitable for use in LED's or wires (or equivalent). In other +/** A subset of colours from {@link DyeColor} that are suitable for use in LED's or wires (or equivalent). In other * words they must all be uniquely identifiable from both their lit and dark colours, and not look similar to other * colours. */ +@Deprecated(forRemoval = true) public enum EnumWireColour { // We disallow all variants of grey and black, as they don't make much sense relative to LED's. // In theory we could keep black OR dark gey LED's (as they are very distant) but it's simpler not to. - WHITE(EnumDyeColor.WHITE, EnumDyeColor.SILVER, EnumDyeColor.GRAY, EnumDyeColor.BLACK), - ORANGE(EnumDyeColor.ORANGE), + WHITE(DyeColor.WHITE, DyeColor.LIGHT_GRAY, DyeColor.GRAY, DyeColor.BLACK), + ORANGE(DyeColor.ORANGE), // MAGENTA -> PINK - LIGHT_BLUE(EnumDyeColor.LIGHT_BLUE, EnumDyeColor.CYAN), - YELLOW(EnumDyeColor.YELLOW), - LIME(EnumDyeColor.LIME), - PINK(EnumDyeColor.PINK, EnumDyeColor.MAGENTA), + LIGHT_BLUE(DyeColor.LIGHT_BLUE, DyeColor.CYAN), + YELLOW(DyeColor.YELLOW), + LIME(DyeColor.LIME), + PINK(DyeColor.PINK, DyeColor.MAGENTA), // GRAY -> WHITE // SILVER (LIGHT_GRAY) -> WHITE // CYAN -> LIGHT_BLUE - PURPLE(EnumDyeColor.PURPLE), - BLUE(EnumDyeColor.BLUE), - BROWN(EnumDyeColor.BROWN), - GREEN(EnumDyeColor.GREEN), - RED(EnumDyeColor.RED), + PURPLE(DyeColor.PURPLE), + BLUE(DyeColor.BLUE), + BROWN(DyeColor.BROWN), + GREEN(DyeColor.GREEN), + RED(DyeColor.RED), // BLACK -> WHITE ; - private static final EnumMap DYE_TO_WIRE; + private static final EnumMap DYE_TO_WIRE; static { - DYE_TO_WIRE = new EnumMap<>(EnumDyeColor.class); + DYE_TO_WIRE = new EnumMap<>(DyeColor.class); for (EnumWireColour wire : values()) { - for (EnumDyeColor dye : wire.similarBasedColours) { + for (DyeColor dye : wire.similarBasedColours) { EnumWireColour prev = DYE_TO_WIRE.put(dye, wire); if (prev != null) { throw new Error(wire + " attempted to override " + prev + " for the dye " + dye + "!"); @@ -43,7 +44,7 @@ public enum EnumWireColour { } } - for (EnumDyeColor dye : EnumDyeColor.values()) { + for (DyeColor dye : DyeColor.values()) { EnumWireColour wire = DYE_TO_WIRE.get(dye); if (wire == null) { throw new Error(dye + " isn't mapped to a wire colour!"); @@ -52,18 +53,18 @@ public enum EnumWireColour { } /** The primary minecraft colour that this is based on. */ - public final EnumDyeColor primaryIdenticalColour; + public final DyeColor primaryIdenticalColour; /** A set of similar minecraft colours that this single colour is based on. Always includes * {@link #primaryIdenticalColour}. */ - public final Set similarBasedColours; + public final Set similarBasedColours; - private EnumWireColour(EnumDyeColor primary, EnumDyeColor... secondary) { + private EnumWireColour(DyeColor primary, DyeColor... secondary) { this.primaryIdenticalColour = primary; this.similarBasedColours = EnumSet.of(primary, secondary); } - public static EnumWireColour convertToWire(EnumDyeColor dye) { + public static EnumWireColour convertToWire(DyeColor dye) { return DYE_TO_WIRE.get(dye); } } diff --git a/api/buildcraft/api/core/IAreaProvider.java b/api/buildcraft/api/core/IAreaProvider.java index 02bcf0c..d048e79 100644 --- a/api/buildcraft/api/core/IAreaProvider.java +++ b/api/buildcraft/api/core/IAreaProvider.java @@ -4,7 +4,7 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.core; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; /** To be implemented by TileEntities able to provide a square area on the world, typically BuildCraft markers. */ public interface IAreaProvider { diff --git a/api/buildcraft/api/core/IBox.java b/api/buildcraft/api/core/IBox.java index 6449077..39f1c36 100644 --- a/api/buildcraft/api/core/IBox.java +++ b/api/buildcraft/api/core/IBox.java @@ -4,7 +4,7 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.core; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; /** A cuboid volume. BuildCraft's default implementation is mutable, so you should not cache instances that you do not * own as-is, without making an immutable copy first. */ @@ -18,6 +18,6 @@ public interface IBox extends IZone { BlockPos max(); default BlockPos size() { - return max().subtract(min()).add(1, 1, 1); + return max().subtract(min()).offset(1, 1, 1); } } diff --git a/api/buildcraft/api/core/IEngineType.java b/api/buildcraft/api/core/IEngineType.java index b871096..3b3750b 100644 --- a/api/buildcraft/api/core/IEngineType.java +++ b/api/buildcraft/api/core/IEngineType.java @@ -1,5 +1,6 @@ package buildcraft.api.core; public interface IEngineType { + @Deprecated(forRemoval = true) String getItemModelLocation(); } diff --git a/api/buildcraft/api/core/IFakePlayerProvider.java b/api/buildcraft/api/core/IFakePlayerProvider.java index c8bed73..8defda3 100755 --- a/api/buildcraft/api/core/IFakePlayerProvider.java +++ b/api/buildcraft/api/core/IFakePlayerProvider.java @@ -1,16 +1,12 @@ -/** - * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com - *

- * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which - * should be located as "LICENSE.API" in the BuildCraft source code distribution. - */ +/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com + * + * BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents + * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.core; import com.mojang.authlib.GameProfile; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldServer; - +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraftforge.common.util.FakePlayer; public interface IFakePlayerProvider { @@ -19,7 +15,7 @@ public interface IFakePlayerProvider { * UUID of the real player who created the block or entity that calls this. */ @Deprecated - FakePlayer getBuildCraftPlayer(WorldServer world); + FakePlayer getBuildCraftPlayer(ServerLevel world); /** * @param world @@ -27,7 +23,7 @@ public interface IFakePlayerProvider { * @return A fake player that can be used IN THE CURRENT METHOD CONTEXT ONLY! This will cause problems if this * player is left around as it holds a reference to the world object. */ - FakePlayer getFakePlayer(WorldServer world, GameProfile profile); + FakePlayer getFakePlayer(ServerLevel world, GameProfile profile); /** * @param world @@ -36,5 +32,5 @@ public interface IFakePlayerProvider { * @return A fake player that can be used IN THE CURRENT METHOD CONTEXT ONLY! This will cause problems if this * player is left around as it holds a reference to the world object. */ - FakePlayer getFakePlayer(WorldServer world, GameProfile profile, BlockPos pos); + FakePlayer getFakePlayer(ServerLevel world, GameProfile profile, BlockPos pos); } diff --git a/api/buildcraft/api/core/IFakeWorld.java b/api/buildcraft/api/core/IFakeWorld.java new file mode 100644 index 0000000..4d9c42d --- /dev/null +++ b/api/buildcraft/api/core/IFakeWorld.java @@ -0,0 +1,17 @@ +package buildcraft.api.core; + +import net.minecraft.core.Holder; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.storage.WritableLevelData; + +import java.util.function.Supplier; + +public abstract class IFakeWorld extends Level { + protected IFakeWorld(WritableLevelData data, ResourceKey dim, RegistryAccess registryAccess, Holder dimensionType, Supplier profiler, boolean pIsClientSide, boolean isDebug, long biomeZoomSeed, int maxChainedNeighborUpdates) { + super(data, dim, registryAccess, dimensionType, profiler, pIsClientSide, isDebug, biomeZoomSeed, maxChainedNeighborUpdates); + } +} diff --git a/api/buildcraft/api/core/IFluidFilter.java b/api/buildcraft/api/core/IFluidFilter.java index 0cd10d6..7774892 100755 --- a/api/buildcraft/api/core/IFluidFilter.java +++ b/api/buildcraft/api/core/IFluidFilter.java @@ -7,6 +7,5 @@ import net.minecraftforge.fluids.FluidStack; public interface IFluidFilter { - boolean matches(FluidStack fluid); } diff --git a/api/buildcraft/api/core/IFluidHandlerAdv.java b/api/buildcraft/api/core/IFluidHandlerAdv.java index aba2d8a..aa8fdd9 100644 --- a/api/buildcraft/api/core/IFluidHandlerAdv.java +++ b/api/buildcraft/api/core/IFluidHandlerAdv.java @@ -1,10 +1,10 @@ package buildcraft.api.core; -import javax.annotation.Nullable; - import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; +import javax.annotation.Nullable; + /** A version of {@link IFluidHandler} that can drain a fluid that a fluid filter accepts. */ public interface IFluidHandlerAdv extends IFluidHandler { /** Drains fluid out of internal tanks, distribution is left entirely to the IFluidHandler. @@ -14,5 +14,5 @@ public interface IFluidHandlerAdv extends IFluidHandler { * @param doDrain If false, drain will only be simulated. * @return FluidStack representing the Fluid and amount that was (or would have been, if simulated) drained. */ @Nullable - FluidStack drain(IFluidFilter filter, int maxDrain, boolean doDrain); + FluidStack drain(IFluidFilter filter, int maxDrain, FluidAction doDrain); } diff --git a/api/buildcraft/api/core/IInvSlot.java b/api/buildcraft/api/core/IInvSlot.java index a047a2f..d39119a 100644 --- a/api/buildcraft/api/core/IInvSlot.java +++ b/api/buildcraft/api/core/IInvSlot.java @@ -4,7 +4,7 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.core; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; public interface IInvSlot { /** Returns the slot number of the underlying Inventory. diff --git a/api/buildcraft/api/core/IPathProvider.java b/api/buildcraft/api/core/IPathProvider.java index f21ef36..bf855a9 100644 --- a/api/buildcraft/api/core/IPathProvider.java +++ b/api/buildcraft/api/core/IPathProvider.java @@ -1,10 +1,9 @@ package buildcraft.api.core; -import java.util.List; - -import net.minecraft.util.math.BlockPos; - import buildcraft.api.items.IMapLocation.MapLocationType; +import net.minecraft.core.BlockPos; + +import java.util.List; /** To be implemented by TileEntities able to provide a path on the world, typically BuildCraft path markers. */ public interface IPathProvider { diff --git a/api/buildcraft/api/core/IStackFilter.java b/api/buildcraft/api/core/IStackFilter.java index 4f450c6..963606b 100644 --- a/api/buildcraft/api/core/IStackFilter.java +++ b/api/buildcraft/api/core/IStackFilter.java @@ -4,17 +4,17 @@ * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.core; -import javax.annotation.Nonnull; +import net.minecraft.core.NonNullList; +import net.minecraft.world.item.ItemStack; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; +import javax.annotation.Nonnull; /** This interface provides a convenient means of dealing with entire classes of items without having to specify each * item individually. */ public interface IStackFilter { /** Check to see if a given stack matches this filter. - * + * * @param stack The stack to test. stack.isEmpty will always return false. * @return True if it does match, false otherwise. */ boolean matches(@Nonnull ItemStack stack); @@ -24,9 +24,7 @@ default IStackFilter and(IStackFilter filter) { return (stack) -> before.matches(stack) && filter.matches(stack); } - /** - * Returns example stack to match this filter - */ + /** Returns example stack to match this filter */ default NonNullList getExamples() { return NonNullList.withSize(0, ItemStack.EMPTY); } diff --git a/api/buildcraft/api/core/IWorldProperty.java b/api/buildcraft/api/core/IWorldProperty.java index 415dc12..52ee68c 100755 --- a/api/buildcraft/api/core/IWorldProperty.java +++ b/api/buildcraft/api/core/IWorldProperty.java @@ -4,11 +4,11 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.core; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; public interface IWorldProperty { - boolean get(World world, BlockPos pos); + boolean get(Level world, BlockPos pos); void clear(); } diff --git a/api/buildcraft/api/core/IZone.java b/api/buildcraft/api/core/IZone.java index efc9b16..a09ca8c 100755 --- a/api/buildcraft/api/core/IZone.java +++ b/api/buildcraft/api/core/IZone.java @@ -4,15 +4,15 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.core; -import java.util.Random; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; +import java.util.Random; /** Defines some volume in the world. This is not guaranteed to be fully connected to itself. */ public interface IZone { /** Returns the smallest possible distance that the pos would have to be changed by in order for - * {@link #contains(Vec3d)} to return true. If the position is already inside then this will return 0 */ + * {@link #contains(Vec3)} to return true. If the position is already inside then this will return 0 */ double distanceTo(BlockPos pos); /** Returns {@link #distanceTo(BlockPos)} but squared. Usually this will be quicker to calculate. */ @@ -20,8 +20,8 @@ public interface IZone { /** Returns true if the point is enclosed by this zone, such that none of the coordinates lie outside the range * specified by this zone. */ - boolean contains(Vec3d point); + boolean contains(Vec3 point); - /** Gets a random position that {@link #contains(Vec3d)} will return true. */ + /** Gets a random position that {@link #contains(Vec3)} will return true. */ BlockPos getRandomBlockPos(Random rand); } diff --git a/api/buildcraft/api/core/InvalidInputDataException.java b/api/buildcraft/api/core/InvalidInputDataException.java index 866c36c..6e90933 100644 --- a/api/buildcraft/api/core/InvalidInputDataException.java +++ b/api/buildcraft/api/core/InvalidInputDataException.java @@ -8,9 +8,7 @@ import java.io.IOException; -/** - * Indicates that we failed to load from NBT or some other file. - */ +/** Indicates that we failed to load from NBT or some other file. */ public class InvalidInputDataException extends IOException { public InvalidInputDataException() { } diff --git a/api/buildcraft/api/core/SafeTimeTracker.java b/api/buildcraft/api/core/SafeTimeTracker.java index 30593be..d9596a7 100644 --- a/api/buildcraft/api/core/SafeTimeTracker.java +++ b/api/buildcraft/api/core/SafeTimeTracker.java @@ -4,7 +4,7 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.core; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; /** Provides a way of tracking time in the world, without requiring manual ticking. */ public class SafeTimeTracker { @@ -34,17 +34,17 @@ public SafeTimeTracker(long delay, long random) { } /** Return true if the internal delay has passed since last time marked was called successfully. */ - public boolean markTimeIfDelay(World world) { + public boolean markTimeIfDelay(Level world) { return markTimeIfDelay(world, internalDelay); } /** Return true if a given delay has passed since last time marked was called successfully. */ - public boolean markTimeIfDelay(World world, long delay) { + public boolean markTimeIfDelay(Level world, long delay) { if (world == null) { return false; } - long currentTime = world.getTotalWorldTime(); + long currentTime = world.getGameTime(); if (currentTime < lastMark) { lastMark = currentTime; @@ -64,7 +64,7 @@ public long durationOfLastDelay() { return duration > 0 ? duration : 0; } - public void markTime(World world) { - lastMark = world.getTotalWorldTime(); + public void markTime(Level world) { + lastMark = world.getGameTime(); } } diff --git a/api/buildcraft/api/core/StackKey.java b/api/buildcraft/api/core/StackKey.java index d8c2c44..03ffd49 100644 --- a/api/buildcraft/api/core/StackKey.java +++ b/api/buildcraft/api/core/StackKey.java @@ -4,11 +4,10 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.core; -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -import net.minecraftforge.fluids.Fluid; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.material.Fluid; import net.minecraftforge.fluids.FluidStack; /** This class is used whenever stacks needs to be stored as keys. */ @@ -29,20 +28,26 @@ public StackKey(ItemStack stack, FluidStack fluidStack) { this.fluidStack = fluidStack; } - public static StackKey stack(Item item, int amount, int damage) { - return new StackKey(new ItemStack(item, amount, damage)); + // public static StackKey stack(Item item, int amount, int damage) + public static StackKey stack(Item item, int amount) { +// return new StackKey(new ItemStack(item, amount, damage)); + return new StackKey(new ItemStack(item, amount)); } - public static StackKey stack(Block block, int amount, int damage) { - return new StackKey(new ItemStack(block, amount, damage)); + // public static StackKey stack(Block block, int amount, int damage) + public static StackKey stack(Block block, int amount) { +// return new StackKey(new ItemStack(block, amount, damage)); + return new StackKey(new ItemStack(block, amount)); } public static StackKey stack(Item item) { - return new StackKey(new ItemStack(item, 1, 0)); +// return new StackKey(new ItemStack(item, 1, 0)); + return new StackKey(new ItemStack(item, 1)); } public static StackKey stack(Block block) { - return new StackKey(new ItemStack(block, 1, 0)); +// return new StackKey(new ItemStack(block, 1, 0)); + return new StackKey(new ItemStack(block, 1)); } public static StackKey stack(ItemStack itemStack) { @@ -74,13 +79,17 @@ public boolean equals(Object o) { return false; } if (stack != null) { - if (stack.getItem() != k.stack.getItem() || stack.getHasSubtypes() && stack.getItemDamage() != k.stack.getItemDamage() || !objectsEqual( - stack.getTagCompound(), k.stack.getTagCompound())) { + if ( + stack.getItem() != k.stack.getItem() +// || stack.getHasSubtypes() + && stack.getDamageValue() != k.stack.getDamageValue() + || !objectsEqual(stack.getTag(), k.stack.getTag()) + ) { return false; } } if (fluidStack != null) { - if (!fluidStack.isFluidEqual(k.fluidStack) || fluidStack.amount != k.fluidStack.amount) { + if (!fluidStack.isFluidEqual(k.fluidStack) || fluidStack.getAmount() != k.fluidStack.getAmount()) { return false; } } @@ -92,14 +101,15 @@ public int hashCode() { int result = 7; if (stack != null) { result = 31 * result + stack.getItem().hashCode(); - result = 31 * result + stack.getItemDamage(); - result = 31 * result + objectHashCode(stack.getTagCompound()); + result = 31 * result + stack.getDamageValue(); + result = 31 * result + objectHashCode(stack.getTag()); } result = 31 * result + 7; if (fluidStack != null) { - result = 31 * result + fluidStack.getFluid().getName().hashCode(); - result = 31 * result + fluidStack.amount; - result = 31 * result + objectHashCode(fluidStack.tag); +// result = 31 * result + fluidStack.getFluid().getName().hashCode(); + result = 31 * result + fluidStack.getFluid().builtInRegistryHolder().key().location().hashCode(); + result = 31 * result + fluidStack.getAmount(); + result = 31 * result + objectHashCode(fluidStack.getTag()); } return result; } diff --git a/api/buildcraft/api/core/package-info.java b/api/buildcraft/api/core/package-info.java index 223c751..1f2a297 100644 --- a/api/buildcraft/api/core/package-info.java +++ b/api/buildcraft/api/core/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "2.2", owner = "buildcraftlib", provides = "buildcraftapi_core") +//@API(apiVersion = "2.2", owner = "buildcraftlib", provides = "buildcraftapi_core") package buildcraft.api.core; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/crops/CropManager.java b/api/buildcraft/api/crops/CropManager.java index 68a4302..cf439e2 100644 --- a/api/buildcraft/api/crops/CropManager.java +++ b/api/buildcraft/api/crops/CropManager.java @@ -1,16 +1,16 @@ package buildcraft.api.crops; +import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.state.BlockState; + import java.util.ArrayList; import java.util.List; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - public final class CropManager { private static List handlers = new ArrayList<>(); private static ICropHandler defaultHandler; @@ -40,7 +40,7 @@ public static boolean isSeed(ItemStack stack) { return defaultHandler.isSeed(stack); } - public static boolean canSustainPlant(World world, ItemStack seed, BlockPos pos) { + public static boolean canSustainPlant(Level world, ItemStack seed, BlockPos pos) { for (ICropHandler cropHandler : handlers) { if (cropHandler.isSeed(seed) && cropHandler.canSustainPlant(world, seed, pos)) { return true; @@ -51,8 +51,8 @@ public static boolean canSustainPlant(World world, ItemStack seed, BlockPos pos) /** Attempts to plant the crop given by the seed into the world. Also checks to make sure that * {@link ICropHandler#isSeed(ItemStack)} is true, and - * {@link ICropHandler#canSustainPlant(World, ItemStack, BlockPos)} is true for the position. */ - public static boolean plantCrop(World world, EntityPlayer player, ItemStack seed, BlockPos pos) { + * {@link ICropHandler#canSustainPlant(Level, ItemStack, BlockPos)} is true for the position. */ + public static boolean plantCrop(Level world, Player player, ItemStack seed, BlockPos pos) { for (ICropHandler cropHandler : handlers) { if (cropHandler.isSeed(seed) && cropHandler.canSustainPlant(world, seed, pos) && cropHandler.plantCrop(world, player, seed, pos)) { return true; @@ -64,7 +64,7 @@ public static boolean plantCrop(World world, EntityPlayer player, ItemStack seed return false; } - public static boolean isMature(IBlockAccess blockAccess, IBlockState state, BlockPos pos) { + public static boolean isMature(LevelAccessor blockAccess, BlockState state, BlockPos pos) { for (ICropHandler cropHandler : handlers) { if (cropHandler.isMature(blockAccess, state, pos)) { return true; @@ -73,8 +73,8 @@ public static boolean isMature(IBlockAccess blockAccess, IBlockState state, Bloc return defaultHandler.isMature(blockAccess, state, pos); } - public static boolean harvestCrop(World world, BlockPos pos, NonNullList drops) { - IBlockState state = world.getBlockState(pos); + public static boolean harvestCrop(Level world, BlockPos pos, NonNullList drops) { + BlockState state = world.getBlockState(pos); for (ICropHandler cropHandler : handlers) { if (cropHandler.isMature(world, state, pos)) { return cropHandler.harvestCrop(world, pos, drops); @@ -82,5 +82,4 @@ public static boolean harvestCrop(World world, BlockPos pos, NonNullList drops); + boolean harvestCrop(Level world, BlockPos pos, NonNullList drops); } diff --git a/api/buildcraft/api/crops/package-info.java b/api/buildcraft/api/crops/package-info.java index fcf92d8..b91544f 100644 --- a/api/buildcraft/api/crops/package-info.java +++ b/api/buildcraft/api/crops/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "1.1", owner = "buildcraftapi_core", provides = "buildcraftapi_crops") +//@API(apiVersion = "1.1", owner = "buildcraftapi_core", provides = "buildcraftapi_crops") package buildcraft.api.crops; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/data/NbtSquishConstants.java b/api/buildcraft/api/data/NbtSquishConstants.java index 6622ace..2715501 100644 --- a/api/buildcraft/api/data/NbtSquishConstants.java +++ b/api/buildcraft/api/data/NbtSquishConstants.java @@ -1,15 +1,18 @@ package buildcraft.api.data; -import java.util.zip.GZIPInputStream; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtAccounter; +import net.minecraft.nbt.NbtIo; -import net.minecraft.nbt.CompressedStreamTools; -import net.minecraft.nbt.NBTTagCompound; +import java.io.DataInput; +import java.io.DataOutput; +import java.util.zip.GZIPInputStream; public class NbtSquishConstants { /** Default written NBT Tag type- this is provided by - * {@link CompressedStreamTools#write(NBTTagCompound, java.io.DataOutput)} and - * {@link CompressedStreamTools#read(java.io.DataInput, net.minecraft.nbt.NBTSizeTracker)}. - * + * {@link NbtIo#write(CompoundTag, DataOutput)} and + * {@link NbtIo#read(DataInput, NbtAccounter)}. + * * Generally more suited to smaller NBT tags, and it writes fairly quickly. Can quickly use up a lot of space for * larger/more complex tags so it is recommended that you also pass it through a GZIP compressor to take up a much * smaller space. */ diff --git a/api/buildcraft/api/enums/EnumDecoratedBlock.java b/api/buildcraft/api/enums/EnumDecoratedBlock.java index 0a6b53f..5762d7c 100644 --- a/api/buildcraft/api/enums/EnumDecoratedBlock.java +++ b/api/buildcraft/api/enums/EnumDecoratedBlock.java @@ -1,10 +1,10 @@ package buildcraft.api.enums; -import java.util.Locale; +import net.minecraft.util.StringRepresentable; -import net.minecraft.util.IStringSerializable; +import java.util.Locale; -public enum EnumDecoratedBlock implements IStringSerializable { +public enum EnumDecoratedBlock implements StringRepresentable { DESTROY(0), BLUEPRINT(10), TEMPLATE(10), @@ -21,7 +21,7 @@ public enum EnumDecoratedBlock implements IStringSerializable { } @Override - public String getName() { + public String getSerializedName() { return name().toLowerCase(Locale.ROOT); } diff --git a/api/buildcraft/api/enums/EnumEngineType.java b/api/buildcraft/api/enums/EnumEngineType.java index 38cdc62..0fa9f9b 100644 --- a/api/buildcraft/api/enums/EnumEngineType.java +++ b/api/buildcraft/api/enums/EnumEngineType.java @@ -1,39 +1,42 @@ package buildcraft.api.enums; -import net.minecraft.util.IStringSerializable; - import buildcraft.api.core.IEngineType; +import net.minecraft.util.StringRepresentable; -public enum EnumEngineType implements IStringSerializable, IEngineType { +public enum EnumEngineType implements StringRepresentable, IEngineType { WOOD("core", "wood"), STONE("energy", "stone"), IRON("energy", "iron"), - CREATIVE("energy", "creative"); + // CREATIVE("energy", "creative"), + CREATIVE("core", "creative"), + ; public final String unlocalizedTag; + @Deprecated(forRemoval = true) public final String resourceLocation; public static final EnumEngineType[] VALUES = values(); EnumEngineType(String mod, String loc) { unlocalizedTag = loc; - resourceLocation = "buildcraft" + mod + ":blocks/engine/inv/" + loc; + resourceLocation = "buildcraft" + mod + ":block/engine/inv/" + loc; } + @Deprecated(forRemoval = true) @Override public String getItemModelLocation() { return resourceLocation; } @Override - public String getName() { + public String getSerializedName() { return unlocalizedTag; } - public static EnumEngineType fromMeta(int meta) { - if (meta < 0 || meta >= VALUES.length) { - meta = 0; - } - return VALUES[meta]; - } +// public static EnumEngineType fromMeta(int meta) { +// if (meta < 0 || meta >= VALUES.length) { +// meta = 0; +// } +// return VALUES[meta]; +// } } diff --git a/api/buildcraft/api/enums/EnumLaserTableType.java b/api/buildcraft/api/enums/EnumLaserTableType.java index dbf99a5..7645a34 100644 --- a/api/buildcraft/api/enums/EnumLaserTableType.java +++ b/api/buildcraft/api/enums/EnumLaserTableType.java @@ -1,8 +1,8 @@ package buildcraft.api.enums; -import net.minecraft.util.IStringSerializable; +import net.minecraft.util.StringRepresentable; -public enum EnumLaserTableType implements IStringSerializable { +public enum EnumLaserTableType implements StringRepresentable { ASSEMBLY_TABLE, ADVANCED_CRAFTING_TABLE, INTEGRATION_TABLE, @@ -10,7 +10,7 @@ public enum EnumLaserTableType implements IStringSerializable { PROGRAMMING_TABLE; @Override - public String getName() { + public String getSerializedName() { return name(); } } diff --git a/api/buildcraft/api/enums/EnumMachineState.java b/api/buildcraft/api/enums/EnumMachineState.java index 7b7caf7..a10dd85 100644 --- a/api/buildcraft/api/enums/EnumMachineState.java +++ b/api/buildcraft/api/enums/EnumMachineState.java @@ -1,21 +1,20 @@ package buildcraft.api.enums; -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.IStringSerializable; - import buildcraft.api.properties.BuildCraftProperties; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.level.block.state.BlockState; -public enum EnumMachineState implements IStringSerializable { +public enum EnumMachineState implements StringRepresentable { OFF, ON, DONE; - public static EnumMachineState getType(IBlockState state) { + public static EnumMachineState getType(BlockState state) { return state.getValue(BuildCraftProperties.MACHINE_STATE); } @Override - public String getName() { + public String getSerializedName() { return name(); } } diff --git a/api/buildcraft/api/enums/EnumOptionalSnapshotType.java b/api/buildcraft/api/enums/EnumOptionalSnapshotType.java index cfd413d..1cd0dc4 100644 --- a/api/buildcraft/api/enums/EnumOptionalSnapshotType.java +++ b/api/buildcraft/api/enums/EnumOptionalSnapshotType.java @@ -1,14 +1,14 @@ package buildcraft.api.enums; -import java.util.Locale; +import net.minecraft.util.StringRepresentable; -import net.minecraft.util.IStringSerializable; +import java.util.Locale; /** * Version of {@link EnumSnapshotType} with {@link EnumOptionalSnapshotType#NONE} value. * Shouldn't be used where it's possible to use {@link EnumSnapshotType}. */ -public enum EnumOptionalSnapshotType implements IStringSerializable { +public enum EnumOptionalSnapshotType implements StringRepresentable { NONE(null), TEMPLATE(EnumSnapshotType.TEMPLATE), BLUEPRINT(EnumSnapshotType.BLUEPRINT); @@ -34,7 +34,7 @@ public static EnumOptionalSnapshotType fromNullable(EnumSnapshotType type) { } @Override - public String getName() { + public String getSerializedName() { return name().toLowerCase(Locale.ROOT); } } diff --git a/api/buildcraft/api/enums/EnumPowerStage.java b/api/buildcraft/api/enums/EnumPowerStage.java index 0a88bae..75f914c 100644 --- a/api/buildcraft/api/enums/EnumPowerStage.java +++ b/api/buildcraft/api/enums/EnumPowerStage.java @@ -1,10 +1,10 @@ package buildcraft.api.enums; -import java.util.Locale; +import net.minecraft.util.StringRepresentable; -import net.minecraft.util.IStringSerializable; +import java.util.Locale; -public enum EnumPowerStage implements IStringSerializable { +public enum EnumPowerStage implements StringRepresentable { BLUE, GREEN, YELLOW, @@ -21,7 +21,7 @@ public String getModelName() { } @Override - public String getName() { + public String getSerializedName() { return getModelName(); } } diff --git a/api/buildcraft/api/enums/EnumRedstoneChipset.java b/api/buildcraft/api/enums/EnumRedstoneChipset.java index 90d7cc4..1cebdfa 100644 --- a/api/buildcraft/api/enums/EnumRedstoneChipset.java +++ b/api/buildcraft/api/enums/EnumRedstoneChipset.java @@ -1,14 +1,15 @@ package buildcraft.api.enums; -import java.util.Locale; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IStringSerializable; - import buildcraft.api.BCItems; +import buildcraft.api.items.IChipset; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; -public enum EnumRedstoneChipset implements IStringSerializable { +import java.util.Locale; + +// public enum EnumRedstoneChipset implements IStringSerializable +public enum EnumRedstoneChipset implements StringRepresentable { RED, IRON, GOLD, @@ -18,12 +19,18 @@ public enum EnumRedstoneChipset implements IStringSerializable { private final String name = name().toLowerCase(Locale.ROOT); public ItemStack getStack(int stackSize) { - Item chipset = BCItems.Silicon.REDSTONE_CHIPSET; + Item chipset = switch (this) { + case RED -> BCItems.Silicon.CHIPSET_REDSTONE; + case IRON -> BCItems.Silicon.CHIPSET_IRON; + case GOLD -> BCItems.Silicon.CHIPSET_GOLD; + case QUARTZ -> BCItems.Silicon.CHIPSET_QUARTZ; + case DIAMOND -> BCItems.Silicon.CHIPSET_DIAMOND; + }; if (chipset == null) { return ItemStack.EMPTY; + } else { + return new ItemStack(chipset, stackSize); } - - return new ItemStack(chipset, stackSize, ordinal()); } public ItemStack getStack() { @@ -31,10 +38,12 @@ public ItemStack getStack() { } public static EnumRedstoneChipset fromStack(ItemStack stack) { - if (stack == null) { +// if (stack == null) + if (stack == null || !(stack.getItem() instanceof IChipset)) { return RED; } - return fromOrdinal(stack.getMetadata()); +// return fromOrdinal(stack.getMetadata()); + return ((IChipset) stack.getItem()).getType(); } public static EnumRedstoneChipset fromOrdinal(int ordinal) { @@ -45,7 +54,8 @@ public static EnumRedstoneChipset fromOrdinal(int ordinal) { } @Override - public String getName() { +// public String getName() + public String getSerializedName() { return name; } } diff --git a/api/buildcraft/api/enums/EnumSpring.java b/api/buildcraft/api/enums/EnumSpring.java index 21e4cf2..7c6bcaa 100644 --- a/api/buildcraft/api/enums/EnumSpring.java +++ b/api/buildcraft/api/enums/EnumSpring.java @@ -1,40 +1,46 @@ package buildcraft.api.enums; -import java.util.Locale; -import java.util.function.Supplier; - -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IStringSerializable; +import buildcraft.api.blocks.ISpring; +import net.minecraft.core.BlockPos; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; -import buildcraft.api.properties.BuildCraftProperties; +import java.util.Locale; +import java.util.function.BiFunction; -public enum EnumSpring implements IStringSerializable { - WATER(5, -1, Blocks.WATER.getDefaultState()), +public enum EnumSpring implements StringRepresentable { + WATER(5, -1, Blocks.WATER.defaultBlockState()), OIL(6000, 8, null); // Set in BuildCraftEnergy public static final EnumSpring[] VALUES = values(); public final int tickRate, chance; - public IBlockState liquidBlock; + public BlockState liquidBlock; public boolean canGen = true; - public Supplier tileConstructor; + // public Supplier tileConstructor; + public BiFunction tileConstructor; private final String lowerCaseName = name().toLowerCase(Locale.ROOT); - EnumSpring(int tickRate, int chance, IBlockState liquidBlock) { + EnumSpring(int tickRate, int chance, BlockState liquidBlock) { this.tickRate = tickRate; this.chance = chance; this.liquidBlock = liquidBlock; } - public static EnumSpring fromState(IBlockState state) { - return state.getValue(BuildCraftProperties.SPRING_TYPE); + public static EnumSpring fromState(BlockState state) { +// return state.getValue(BuildCraftProperties.SPRING_TYPE); + if (state.getBlock() instanceof ISpring spring) { + return spring.getType(); + } else { + return null; + } } @Override - public String getName() { + public String getSerializedName() { return lowerCaseName; } } diff --git a/api/buildcraft/api/enums/package-info.java b/api/buildcraft/api/enums/package-info.java index ab21992..49f7dd0 100644 --- a/api/buildcraft/api/enums/package-info.java +++ b/api/buildcraft/api/enums/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "1.0", owner = "buildcraftapi_core", provides = "buildcraftapi_enums") +//@API(apiVersion = "1.0", owner = "buildcraftapi_core", provides = "buildcraftapi_enums") package buildcraft.api.enums; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/events/BlockInteractionEvent.java b/api/buildcraft/api/events/BlockInteractionEvent.java index 4a4d8b7..8a1bb8a 100644 --- a/api/buildcraft/api/events/BlockInteractionEvent.java +++ b/api/buildcraft/api/events/BlockInteractionEvent.java @@ -4,18 +4,17 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.events; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; - -import net.minecraftforge.fml.common.eventhandler.Cancelable; -import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; @Cancelable public class BlockInteractionEvent extends Event { - public final EntityPlayer player; - public final IBlockState state; + public final Player player; + public final BlockState state; - public BlockInteractionEvent(EntityPlayer player, IBlockState state) { + public BlockInteractionEvent(Player player, BlockState state) { this.player = player; this.state = state; } diff --git a/api/buildcraft/api/events/BlockPlacedDownEvent.java b/api/buildcraft/api/events/BlockPlacedDownEvent.java index 22a8a74..71302e5 100644 --- a/api/buildcraft/api/events/BlockPlacedDownEvent.java +++ b/api/buildcraft/api/events/BlockPlacedDownEvent.java @@ -4,20 +4,19 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.events; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.math.BlockPos; - -import net.minecraftforge.fml.common.eventhandler.Cancelable; -import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; @Cancelable public class BlockPlacedDownEvent extends Event { - public final EntityPlayer player; - public final IBlockState state; + public final Player player; + public final BlockState state; public final BlockPos pos; - public BlockPlacedDownEvent(EntityPlayer player, BlockPos pos, IBlockState state) { + public BlockPlacedDownEvent(Player player, BlockPos pos, BlockState state) { this.player = player; this.state = state; this.pos = pos; diff --git a/api/buildcraft/api/events/PipePlacedEvent.java b/api/buildcraft/api/events/PipePlacedEvent.java index 3664a57..40163ec 100644 --- a/api/buildcraft/api/events/PipePlacedEvent.java +++ b/api/buildcraft/api/events/PipePlacedEvent.java @@ -4,18 +4,17 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.events; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.util.math.BlockPos; - -import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraftforge.eventbus.api.Event; public class PipePlacedEvent extends Event { - public EntityPlayer player; + public Player player; public Item pipeType; public BlockPos pos; - public PipePlacedEvent(EntityPlayer player, Item pipeType, BlockPos pos) { + public PipePlacedEvent(Player player, Item pipeType, BlockPos pos) { this.player = player; this.pipeType = pipeType; this.pos = pos; diff --git a/api/buildcraft/api/events/RobotEvent.java b/api/buildcraft/api/events/RobotEvent.java index 9b12b64..7c01008 100644 --- a/api/buildcraft/api/events/RobotEvent.java +++ b/api/buildcraft/api/events/RobotEvent.java @@ -4,13 +4,11 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.events; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -import net.minecraftforge.fml.common.eventhandler.Cancelable; -import net.minecraftforge.fml.common.eventhandler.Event; - import buildcraft.api.robots.EntityRobotBase; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; public abstract class RobotEvent extends Event { public final EntityRobotBase robot; @@ -21,9 +19,9 @@ public RobotEvent(EntityRobotBase robot) { @Cancelable public static class Place extends RobotEvent { - public final EntityPlayer player; + public final Player player; - public Place(EntityRobotBase robot, EntityPlayer player) { + public Place(EntityRobotBase robot, Player player) { super(robot); this.player = player; } @@ -31,10 +29,10 @@ public Place(EntityRobotBase robot, EntityPlayer player) { @Cancelable public static class Interact extends RobotEvent { - public final EntityPlayer player; + public final Player player; public final ItemStack item; - public Interact(EntityRobotBase robot, EntityPlayer player, ItemStack item) { + public Interact(EntityRobotBase robot, Player player, ItemStack item) { super(robot); this.player = player; this.item = item; @@ -43,9 +41,9 @@ public Interact(EntityRobotBase robot, EntityPlayer player, ItemStack item) { @Cancelable public static class Dismantle extends RobotEvent { - public final EntityPlayer player; + public final Player player; - public Dismantle(EntityRobotBase robot, EntityPlayer player) { + public Dismantle(EntityRobotBase robot, Player player) { super(robot); this.player = player; } diff --git a/api/buildcraft/api/events/RobotPlacementEvent.java b/api/buildcraft/api/events/RobotPlacementEvent.java index b0abc44..6c057f4 100644 --- a/api/buildcraft/api/events/RobotPlacementEvent.java +++ b/api/buildcraft/api/events/RobotPlacementEvent.java @@ -4,19 +4,17 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.events; -import net.minecraft.entity.player.EntityPlayer; - -import net.minecraftforge.fml.common.eventhandler.Cancelable; -import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; @Cancelable public class RobotPlacementEvent extends Event { - public EntityPlayer player; + public Player player; public String robotProgram; - public RobotPlacementEvent(EntityPlayer player, String robotProgram) { + public RobotPlacementEvent(Player player, String robotProgram) { this.player = player; this.robotProgram = robotProgram; } - } diff --git a/api/buildcraft/api/events/package-info.java b/api/buildcraft/api/events/package-info.java index 46ac77c..dbbc4cc 100644 --- a/api/buildcraft/api/events/package-info.java +++ b/api/buildcraft/api/events/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "2.0", owner = "buildcraftapi_core", provides = "buildcraftapi_events") +//@API(apiVersion = "2.0", owner = "buildcraftapi_core", provides = "buildcraftapi_events") package buildcraft.api.events; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/facades/FacadeAPI.java b/api/buildcraft/api/facades/FacadeAPI.java index 1f3e2b9..68b9c63 100644 --- a/api/buildcraft/api/facades/FacadeAPI.java +++ b/api/buildcraft/api/facades/FacadeAPI.java @@ -1,11 +1,13 @@ package buildcraft.api.facades; -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - -import net.minecraftforge.fml.common.event.FMLInterModComms; +import buildcraft.api.imc.BcImcMessage; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.fml.InterModComms; +import net.minecraftforge.registries.RegistryObject; public final class FacadeAPI { public static final String IMC_MOD_TARGET = "buildcraftsilicon"; @@ -15,7 +17,8 @@ public final class FacadeAPI { public static final String NBT_CUSTOM_BLOCK_META = "block_meta"; public static final String NBT_CUSTOM_ITEM_STACK = "item_stack"; - public static IFacadeItem facadeItem; + // public static IFacadeItem facadeItem; + public static RegistryObject facadeItem; public static IFacadeRegistry registry; private FacadeAPI() { @@ -23,19 +26,22 @@ private FacadeAPI() { } public static void disableBlock(Block block) { - FMLInterModComms.sendMessage(IMC_MOD_TARGET, IMC_FACADE_DISABLE, block.getRegistryName()); +// FMLInterModComms.sendMessage(IMC_MOD_TARGET, IMC_FACADE_DISABLE, block.getRegistryName()); + InterModComms.sendTo(IMC_MOD_TARGET, IMC_FACADE_DISABLE, () -> new BcImcMessage(block.builtInRegistryHolder().key().location())); } - public static void mapStateToStack(IBlockState state, ItemStack stack) { - NBTTagCompound nbt = new NBTTagCompound(); - nbt.setString(NBT_CUSTOM_BLOCK_REG_KEY, state.getBlock().getRegistryName().toString()); - nbt.setInteger(NBT_CUSTOM_BLOCK_META, state.getBlock().getMetaFromState(state)); - nbt.setTag(NBT_CUSTOM_ITEM_STACK, stack.serializeNBT()); - FMLInterModComms.sendMessage(IMC_MOD_TARGET, IMC_FACADE_CUSTOM, nbt); + public static void mapStateToStack(BlockState state, ItemStack stack) { + CompoundTag nbt = new CompoundTag(); + nbt.putString(NBT_CUSTOM_BLOCK_REG_KEY, state.getBlock().builtInRegistryHolder().key().location().toString()); +// nbt.putInt(NBT_CUSTOM_BLOCK_META, state.getBlock().getMetaFromState(state)); + nbt.put(NBT_CUSTOM_BLOCK_META, NbtUtils.writeBlockState(state)); + nbt.put(NBT_CUSTOM_ITEM_STACK, stack.serializeNBT()); +// FMLInterModComms.sendMessage(IMC_MOD_TARGET, IMC_FACADE_CUSTOM, nbt); + InterModComms.sendTo(IMC_MOD_TARGET, IMC_FACADE_CUSTOM, () -> new BcImcMessage(nbt)); } public static boolean isFacadeMessageId(String id) { return IMC_FACADE_CUSTOM.equals(id) // - || IMC_FACADE_DISABLE.equals(id); + || IMC_FACADE_DISABLE.equals(id); } } diff --git a/api/buildcraft/api/facades/IFacade.java b/api/buildcraft/api/facades/IFacade.java index 1142a73..f511f3d 100644 --- a/api/buildcraft/api/facades/IFacade.java +++ b/api/buildcraft/api/facades/IFacade.java @@ -1,9 +1,13 @@ package buildcraft.api.facades; +import net.minecraft.nbt.CompoundTag; + public interface IFacade { FacadeType getType(); boolean isHollow(); IFacadePhasedState[] getPhasedStates(); + + CompoundTag writeToNbt(); } diff --git a/api/buildcraft/api/facades/IFacadeItem.java b/api/buildcraft/api/facades/IFacadeItem.java index 65c312a..bc0583c 100644 --- a/api/buildcraft/api/facades/IFacadeItem.java +++ b/api/buildcraft/api/facades/IFacadeItem.java @@ -4,12 +4,12 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.facades; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; + import javax.annotation.Nonnull; import javax.annotation.Nullable; -import net.minecraft.block.state.IBlockState; -import net.minecraft.item.ItemStack; - public interface IFacadeItem { @Nullable @@ -22,7 +22,7 @@ default FacadeType getFacadeType(@Nonnull ItemStack stack) { } @Nonnull - ItemStack getFacadeForBlock(IBlockState state); + ItemStack getFacadeForBlock(BlockState state); /** @param facade The {@link IFacade} instance. NOTE: This MUST be an object returned from * {@link IFacadeRegistry#createBasicFacade(IFacadeState, boolean)} or @@ -32,4 +32,6 @@ default FacadeType getFacadeType(@Nonnull ItemStack stack) { @Nullable IFacade getFacade(@Nonnull ItemStack facade); + + ItemStack createItemStack(IFacade state); } diff --git a/api/buildcraft/api/facades/IFacadePhasedState.java b/api/buildcraft/api/facades/IFacadePhasedState.java index e576e09..5cbf728 100644 --- a/api/buildcraft/api/facades/IFacadePhasedState.java +++ b/api/buildcraft/api/facades/IFacadePhasedState.java @@ -1,12 +1,12 @@ package buildcraft.api.facades; -import javax.annotation.Nullable; +import net.minecraft.world.item.DyeColor; -import net.minecraft.item.EnumDyeColor; +import javax.annotation.Nullable; public interface IFacadePhasedState { IFacadeState getState(); @Nullable - EnumDyeColor getActiveColor(); + DyeColor getActiveColor(); } diff --git a/api/buildcraft/api/facades/IFacadeRegistry.java b/api/buildcraft/api/facades/IFacadeRegistry.java index c0e53f3..c9cb903 100644 --- a/api/buildcraft/api/facades/IFacadeRegistry.java +++ b/api/buildcraft/api/facades/IFacadeRegistry.java @@ -1,16 +1,15 @@ package buildcraft.api.facades; -import java.util.Collection; +import net.minecraft.world.item.DyeColor; import javax.annotation.Nullable; - -import net.minecraft.item.EnumDyeColor; +import java.util.Collection; public interface IFacadeRegistry { Collection getValidFacades(); - IFacadePhasedState createPhasedState(IFacadeState state, @Nullable EnumDyeColor activeColor); + IFacadePhasedState createPhasedState(IFacadeState state, @Nullable DyeColor activeColor); IFacade createPhasedFacade(IFacadePhasedState[] states, boolean isHollow); diff --git a/api/buildcraft/api/facades/IFacadeState.java b/api/buildcraft/api/facades/IFacadeState.java index cf7ad7f..7c8eaae 100644 --- a/api/buildcraft/api/facades/IFacadeState.java +++ b/api/buildcraft/api/facades/IFacadeState.java @@ -1,12 +1,12 @@ package buildcraft.api.facades; -import net.minecraft.block.state.IBlockState; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; public interface IFacadeState { boolean isTransparent(); - IBlockState getBlockState(); + BlockState getBlockState(); ItemStack getRequiredStack(); } diff --git a/api/buildcraft/api/facades/package-info.java b/api/buildcraft/api/facades/package-info.java index ee3094d..7679c3a 100644 --- a/api/buildcraft/api/facades/package-info.java +++ b/api/buildcraft/api/facades/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "1.1", owner = "buildcraftapi_core", provides = "buildcraftapi_facades") +//@API(apiVersion = "1.1", owner = "buildcraftapi_core", provides = "buildcraftapi_facades") package buildcraft.api.facades; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/filler/IFilledTemplate.java b/api/buildcraft/api/filler/IFilledTemplate.java index d0b59d4..05af925 100644 --- a/api/buildcraft/api/filler/IFilledTemplate.java +++ b/api/buildcraft/api/filler/IFilledTemplate.java @@ -1,10 +1,8 @@ package buildcraft.api.filler; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; -/** - * Use methods of the interface as much as possible, implementation can do optimizations - */ +/** Use methods of the interface as much as possible, implementation can do optimizations */ public interface IFilledTemplate { BlockPos getSize(); diff --git a/api/buildcraft/api/filler/IFillerPattern.java b/api/buildcraft/api/filler/IFillerPattern.java index cd23730..db7eb1c 100644 --- a/api/buildcraft/api/filler/IFillerPattern.java +++ b/api/buildcraft/api/filler/IFillerPattern.java @@ -4,14 +4,13 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.filler; -import javax.annotation.Nullable; - -import net.minecraft.util.math.BlockPos; - import buildcraft.api.core.render.ISprite; import buildcraft.api.statements.IStatement; import buildcraft.api.statements.IStatementParameter; import buildcraft.api.statements.containers.IFillerStatementContainer; +import net.minecraft.core.BlockPos; + +import javax.annotation.Nullable; /** A type of statement that is used for filler patterns. */ public interface IFillerPattern extends IStatement { diff --git a/api/buildcraft/api/filler/IFillerPatternShape.java b/api/buildcraft/api/filler/IFillerPatternShape.java index b51e253..95d26ae 100644 --- a/api/buildcraft/api/filler/IFillerPatternShape.java +++ b/api/buildcraft/api/filler/IFillerPatternShape.java @@ -4,14 +4,13 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.filler; -import javax.annotation.Nullable; - -import net.minecraft.world.World; - import buildcraft.api.statements.IStatementParameter; import buildcraft.api.statements.containers.IFillerStatementContainer; +import net.minecraft.world.level.Level; + +import javax.annotation.Nullable; -/** {@code IFillerPattern} independent from {@link World} */ +/** {@code IFillerPattern} independent from {@link Level} */ public interface IFillerPatternShape extends IFillerPattern { /** * @param filledTemplate empty template @@ -23,8 +22,8 @@ public interface IFillerPatternShape extends IFillerPattern { @Override default IFilledTemplate createTemplate(IFillerStatementContainer filler, IStatementParameter[] params) { IFilledTemplate template = FillerManager.registry.createFilledTemplate( - filler.getBox().min(), - filler.getBox().size() + filler.getBox().min(), + filler.getBox().size() ); if (!fillTemplate(template, params)) { return null; diff --git a/api/buildcraft/api/filler/IFillerRegistry.java b/api/buildcraft/api/filler/IFillerRegistry.java index fa49cb1..1268db8 100644 --- a/api/buildcraft/api/filler/IFillerRegistry.java +++ b/api/buildcraft/api/filler/IFillerRegistry.java @@ -1,12 +1,10 @@ package buildcraft.api.filler; -import java.util.Collection; +import buildcraft.api.statements.IStatement; +import net.minecraft.core.BlockPos; import javax.annotation.Nullable; - -import net.minecraft.util.math.BlockPos; - -import buildcraft.api.statements.IStatement; +import java.util.Collection; public interface IFillerRegistry { void addPattern(IFillerPattern pattern); diff --git a/api/buildcraft/api/filler/package-info.java b/api/buildcraft/api/filler/package-info.java index d5b3f2a..e76db5e 100644 --- a/api/buildcraft/api/filler/package-info.java +++ b/api/buildcraft/api/filler/package-info.java @@ -1,8 +1,6 @@ -/* Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com +/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "5.0", owner = "buildcraftapi_core", provides = "buildcraftapi_filler") +//@API(apiVersion = "5.0", owner = "buildcraftapi_core", provides = "buildcraftapi_filler") package buildcraft.api.filler; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/fuels/BuildcraftFuelRegistry.java b/api/buildcraft/api/fuels/BuildcraftFuelRegistry.java index 545ac3d..107b26a 100644 --- a/api/buildcraft/api/fuels/BuildcraftFuelRegistry.java +++ b/api/buildcraft/api/fuels/BuildcraftFuelRegistry.java @@ -8,5 +8,6 @@ public final class BuildcraftFuelRegistry { public static IFuelManager fuel; public static ICoolantManager coolant; - private BuildcraftFuelRegistry() {} + private BuildcraftFuelRegistry() { + } } diff --git a/api/buildcraft/api/fuels/EnumCoolantType.java b/api/buildcraft/api/fuels/EnumCoolantType.java new file mode 100644 index 0000000..a5008d6 --- /dev/null +++ b/api/buildcraft/api/fuels/EnumCoolantType.java @@ -0,0 +1,17 @@ +package buildcraft.api.fuels; + +import java.util.Locale; + +public enum EnumCoolantType { + FLUID, + SOLID, + ; + + public String getLowerName() { + return this.name().toLowerCase(Locale.ROOT); + } + + public static EnumCoolantType byName(String name) { + return valueOf(name.toUpperCase(Locale.ROOT)); + } +} diff --git a/api/buildcraft/api/fuels/ICoolant.java b/api/buildcraft/api/fuels/ICoolant.java index f81a863..8ef0b61 100644 --- a/api/buildcraft/api/fuels/ICoolant.java +++ b/api/buildcraft/api/fuels/ICoolant.java @@ -1,16 +1,51 @@ -/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com - * - * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which - * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.fuels; +import buildcraft.api.BCModules; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; import net.minecraftforge.fluids.FluidStack; -public interface ICoolant { - boolean matchesFluid(FluidStack fluid); +public interface ICoolant extends Recipe { + public static final ResourceLocation TYPE_ID = new ResourceLocation(BCModules.ENERGY.getModId(), "coolant"); - /** @param fluid - * @param heat - * @return 0 if the input fluid provides no cooling, or a value greater than 0 if it does. */ - float getDegreesCoolingPerMB(FluidStack fluid, float heat); + public static final RecipeType TYPE = RecipeType.simple(TYPE_ID); + + EnumCoolantType getCoolantType(); + + FluidStack getFluid(); + + @Override + default boolean matches(Container inv, Level world) { + return false; + } + + @Override + default ItemStack assemble(Container inv, RegistryAccess registryAccess) { + return ItemStack.EMPTY; + } + + @Override + default boolean canCraftInDimensions(int width, int height) { + return true; + } + + @Override + default ItemStack getResultItem(RegistryAccess registryAccess) { + return ItemStack.EMPTY; + } + + @Override + default boolean isSpecial() { + return true; + } + + @Override + default RecipeType getType() { + return TYPE; + } } diff --git a/api/buildcraft/api/fuels/ICoolantManager.java b/api/buildcraft/api/fuels/ICoolantManager.java index dfcf78b..629c002 100644 --- a/api/buildcraft/api/fuels/ICoolantManager.java +++ b/api/buildcraft/api/fuels/ICoolantManager.java @@ -1,36 +1,48 @@ /** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com * - * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which - * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ + * BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents + * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.fuels; -import java.util.Collection; - -import net.minecraft.item.ItemStack; - -import net.minecraftforge.fluids.Fluid; +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.fluids.FluidStack; +import java.util.Collection; + public interface ICoolantManager { - ICoolant addCoolant(ICoolant coolant); + // IFluidCoolant addCoolant(IFluidCoolant coolant); + IFluidCoolant addUnregisteredFluidCoolant(IFluidCoolant coolant); - ICoolant addCoolant(FluidStack fluid, float degreesCoolingPerMb); + // IFluidCoolant addCoolant(FluidStack fluid, float degreesCoolingPerMb); + IFluidCoolant addCoolant(ResourceLocation id, FluidStack fluid, float degreesCoolingPerMb); - default ICoolant addCoolant(Fluid fluid, float degreesCoolingPerMb) { - return addCoolant(new FluidStack(fluid, 1), degreesCoolingPerMb); + // default IFluidCoolant addCoolant(Fluid fluid, float degreesCoolingPerMb) + default IFluidCoolant addCoolant(ResourceLocation id, Fluid fluid, float degreesCoolingPerMb) { +// return addCoolant(new FluidStack(fluid, 1), degreesCoolingPerMb); + return addCoolant(id, new FluidStack(fluid, 1), degreesCoolingPerMb); } - ISolidCoolant addSolidCoolant(ISolidCoolant solidCoolant); + // ISolidCoolant addSolidCoolant(ISolidCoolant solidCoolant); + ISolidCoolant addUnregisteredSolidCoolant(ISolidCoolant solidCoolant); - ISolidCoolant addSolidCoolant(ItemStack solid, FluidStack fluid, float multiplier); + // ISolidCoolant addSolidCoolant(ItemStack solid, FluidStack fluid, float multiplier); + ISolidCoolant addSolidCoolant(ResourceLocation id, ItemStack solid, FluidStack fluid, float multiplier); - Collection getCoolants(); + // Collection getCoolants(); + Collection getCoolants(Level world); - Collection getSolidCoolants(); + // Collection getSolidCoolants(); + Collection getSolidCoolants(Level world); - ICoolant getCoolant(FluidStack fluid); + // IFluidCoolant getCoolant(FluidStack fluid); + IFluidCoolant getCoolant(Level world, FluidStack fluid); - float getDegreesPerMb(FluidStack fluid, float heat); + // float getDegreesPerMb(FluidStack fluid, float heat); + float getDegreesPerMb(Level world, FluidStack fluid, float heat); - ISolidCoolant getSolidCoolant(ItemStack solid); + // ISolidCoolant getSolidCoolant(ItemStack solid); + ISolidCoolant getSolidCoolant(Level world, ItemStack solid); } diff --git a/api/buildcraft/api/fuels/IFluidCoolant.java b/api/buildcraft/api/fuels/IFluidCoolant.java new file mode 100644 index 0000000..b0fee8d --- /dev/null +++ b/api/buildcraft/api/fuels/IFluidCoolant.java @@ -0,0 +1,24 @@ +/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com + * + * BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents + * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ +package buildcraft.api.fuels; + +import net.minecraftforge.fluids.FluidStack; + +/** + * This was named ICoolant in 1.12.2. + * In 1.18.2, we differ coolants as {@link EnumCoolantType#FLUID} AND {@link EnumCoolantType#SOLID}., + * {@link IFluidCoolant} and {@link ISolidCoolant} both extends {@link ICoolant}. + */ +public interface IFluidCoolant extends ICoolant { + boolean matchesFluid(FluidStack fluid); + + /** @param fluid + * @param heat + * @return 0 if the input fluid provides no cooling, or a value greater than 0 if it does. */ + float getDegreesCoolingPerMB(FluidStack fluid, float heat); + + /** @return The degrees-of-cooling-per-mb value of the recipe, ignoring whether a correct input is present. */ + float getDegreesCoolingPerMB(); +} diff --git a/api/buildcraft/api/fuels/IFuel.java b/api/buildcraft/api/fuels/IFuel.java index 382eb2a..87edd34 100644 --- a/api/buildcraft/api/fuels/IFuel.java +++ b/api/buildcraft/api/fuels/IFuel.java @@ -1,13 +1,26 @@ /** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com * - * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which - * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ + * BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents + * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.fuels; +import buildcraft.api.BCModules; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; import net.minecraftforge.fluids.FluidStack; -public interface IFuel { - /** @return The input fluid. The {@link FluidStack#amount} is ignored. */ +//public interface IFuel +public interface IFuel extends Recipe { + public static final ResourceLocation TYPE_ID = new ResourceLocation(BCModules.ENERGY.getModId(), "fuel"); + + public static final RecipeType TYPE = RecipeType.simple(TYPE_ID); + + /** @return The input fluid. The {@link FluidStack#getAmount()} is ignored. */ FluidStack getFluid(); /** @return The number of ticks that a single bucket (1000mb) of this fuel will burn for. */ @@ -15,4 +28,34 @@ public interface IFuel { /** @return The amount (in micro mj) of power that this fuel will give off in 1 tick. */ long getPowerPerCycle(); + + @Override + default boolean matches(Container inv, Level world) { + return false; + } + + @Override + default ItemStack assemble(Container inv, RegistryAccess registryAccess) { + return ItemStack.EMPTY; + } + + @Override + default boolean canCraftInDimensions(int width, int height) { + return true; + } + + @Override + default ItemStack getResultItem(RegistryAccess registryAccess) { + return ItemStack.EMPTY; + } + + @Override + default boolean isSpecial() { + return true; + } + + @Override + default RecipeType getType() { + return TYPE; + } } diff --git a/api/buildcraft/api/fuels/IFuelManager.java b/api/buildcraft/api/fuels/IFuelManager.java index cb02063..2666843 100644 --- a/api/buildcraft/api/fuels/IFuelManager.java +++ b/api/buildcraft/api/fuels/IFuelManager.java @@ -1,34 +1,45 @@ /** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com * - * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which - * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ + * BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents + * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.fuels; -import java.util.Collection; - -import net.minecraftforge.fluids.Fluid; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.material.Fluid; import net.minecraftforge.fluids.FluidStack; +import java.util.Collection; + public interface IFuelManager { - F addFuel(F fuel); + // F addFuel(F fuel); + F addUnregisteredFuel(F fuel); - IFuel addFuel(FluidStack fluid, long powerPerCycle, int totalBurningTime); + // IFuel addFuel(FluidStack fluid, long powerPerCycle, int totalBurningTime); + IFuel addUnregisteredFuel(ResourceLocation id, FluidStack fluid, long powerPerCycle, int totalBurningTime); - default IFuel addFuel(Fluid fluid, long powerPerCycle, int totalBurningTime) { - return addFuel(new FluidStack(fluid, 1), powerPerCycle, totalBurningTime); + // default IFuel addFuel(Fluid fluid, long powerPerCycle, int totalBurningTime) + default IFuel addUnregisteredFuel(ResourceLocation id, Fluid fluid, long powerPerCycle, int totalBurningTime) { +// return addFuel(new FluidStack(fluid, 1), powerPerCycle, totalBurningTime); + return addUnregisteredFuel(id, new FluidStack(fluid, 1), powerPerCycle, totalBurningTime); } /** @param residue The residue fluidstack, per bucket of the original fuel. */ - IDirtyFuel addDirtyFuel(FluidStack fuel, long powerPerCycle, int totalBurningTime, FluidStack residue); +// IDirtyFuel addDirtyFuel(FluidStack fuel, long powerPerCycle, int totalBurningTime, FluidStack residue); + IDirtyFuel addUnregisteredDirtyFuel(ResourceLocation id, FluidStack fuel, long powerPerCycle, int totalBurningTime, FluidStack residue); /** @param residue The residue fluidstack, per bucket of the original fuel. */ - default IDirtyFuel addDirtyFuel(Fluid fuel, long powerPerCycle, int totalBurningTime, FluidStack residue) { - return addDirtyFuel(new FluidStack(fuel, 1), powerPerCycle, totalBurningTime, residue); +// default IDirtyFuel addDirtyFuel(Fluid fuel, long powerPerCycle, int totalBurningTime, FluidStack residue) + default IDirtyFuel addUnregisteredDirtyFuel(ResourceLocation id, Fluid fuel, long powerPerCycle, int totalBurningTime, FluidStack residue) { +// return addDirtyFuel(new FluidStack(fuel, 1), powerPerCycle, totalBurningTime, residue); + return addUnregisteredDirtyFuel(id, new FluidStack(fuel, 1), powerPerCycle, totalBurningTime, residue); } - Collection getFuels(); + // Collection getFuels(); + Collection getFuels(Level world); - IFuel getFuel(FluidStack fluid); + // IFuel getFuel(FluidStack fluid); + IFuel getFuel(Level world, FluidStack fluid); interface IDirtyFuel extends IFuel { /** @return The residue fluidstack, per bucket of original fuel. */ diff --git a/api/buildcraft/api/fuels/ISolidCoolant.java b/api/buildcraft/api/fuels/ISolidCoolant.java index 2b466ef..6de111b 100644 --- a/api/buildcraft/api/fuels/ISolidCoolant.java +++ b/api/buildcraft/api/fuels/ISolidCoolant.java @@ -1,13 +1,16 @@ /** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com * - * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which - * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ + * BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents + * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.fuels; -import net.minecraft.item.ItemStack; - +import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; -public interface ISolidCoolant { +public interface ISolidCoolant extends ICoolant { FluidStack getFluidFromSolidCoolant(ItemStack stack); + + float getMultiplier(); + + ItemStack getSolid(); } diff --git a/api/buildcraft/api/fuels/package-info.java b/api/buildcraft/api/fuels/package-info.java index b108eae..1515996 100644 --- a/api/buildcraft/api/fuels/package-info.java +++ b/api/buildcraft/api/fuels/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "2.0", owner = "buildcraftapi_core", provides = "buildcraftapi_fuels") +//@API(apiVersion = "2.0", owner = "buildcraftapi_core", provides = "buildcraftapi_fuels") package buildcraft.api.fuels; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/gates/IGate.java b/api/buildcraft/api/gates/IGate.java index 2d9302c..0350649 100644 --- a/api/buildcraft/api/gates/IGate.java +++ b/api/buildcraft/api/gates/IGate.java @@ -4,14 +4,14 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.gates; -import java.util.List; - import buildcraft.api.statements.IStatement; import buildcraft.api.statements.IStatementParameter; import buildcraft.api.statements.StatementSlot; import buildcraft.api.statements.containers.ISidedStatementContainer; import buildcraft.api.transport.pipe.IPipeHolder; +import java.util.List; + public interface IGate extends ISidedStatementContainer { IPipeHolder getPipeHolder(); diff --git a/api/buildcraft/api/gates/package-info.java b/api/buildcraft/api/gates/package-info.java index 63d9988..5b5928c 100644 --- a/api/buildcraft/api/gates/package-info.java +++ b/api/buildcraft/api/gates/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "4.1", owner = "buildcraftapi_core", provides = "buildcraftapi_gates") +//@API(apiVersion = "4.1", owner = "buildcraftapi_core", provides = "buildcraftapi_gates") package buildcraft.api.gates; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/imc/BcImcMessage.java b/api/buildcraft/api/imc/BcImcMessage.java new file mode 100644 index 0000000..ef80d70 --- /dev/null +++ b/api/buildcraft/api/imc/BcImcMessage.java @@ -0,0 +1,32 @@ +package buildcraft.api.imc; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; + +import javax.annotation.Nonnull; + +/** Used in {@link buildcraft.api.facades.FacadeAPI} */ +public class BcImcMessage { + @Nonnull + private final Object value; + + public BcImcMessage(@Nonnull Object value) { + this.value = value; + } + + public ResourceLocation getResourceLocationValue() { + return (ResourceLocation) value; + } + + public CompoundTag getNBTValue() { + return (CompoundTag) value; + } + + public boolean isNBTMessage() { + return CompoundTag.class.isAssignableFrom(getMessageType()); + } + + public Class getMessageType() { + return value.getClass(); + } +} diff --git a/api/buildcraft/api/inventory/IItemHandlerFiltered.java b/api/buildcraft/api/inventory/IItemHandlerFiltered.java index 8672d1d..919d212 100644 --- a/api/buildcraft/api/inventory/IItemHandlerFiltered.java +++ b/api/buildcraft/api/inventory/IItemHandlerFiltered.java @@ -1,7 +1,6 @@ package buildcraft.api.inventory; -import net.minecraft.item.ItemStack; - +import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandler; /** A type of {@link IItemHandler} that has a single valid stack per slot, as specified by {@link #getFilter(int)}. Note diff --git a/api/buildcraft/api/inventory/IItemTransactor.java b/api/buildcraft/api/inventory/IItemTransactor.java index 212d2e3..7265568 100644 --- a/api/buildcraft/api/inventory/IItemTransactor.java +++ b/api/buildcraft/api/inventory/IItemTransactor.java @@ -1,13 +1,12 @@ package buildcraft.api.inventory; +import buildcraft.api.core.IStackFilter; +import net.minecraft.core.NonNullList; +import net.minecraft.world.item.ItemStack; + import javax.annotation.Nonnull; import javax.annotation.Nullable; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; - -import buildcraft.api.core.IStackFilter; - /** A simple way to define something that deals with item insertion and extraction, without caring about slots. */ public interface IItemTransactor { /** @param stack The stack to insert. Must not be null! @@ -19,7 +18,7 @@ public interface IItemTransactor { /** Similar to {@link #insert(ItemStack, boolean, boolean)} but probably be more efficient at inserting lots of * items. - * + * * @param stacks The stacks to insert. Must not be null! * @param simulate If true then the in-world state of this will not be changed. * @return The overflow stacks. Will be an empty list if all of it was accepted. */ @@ -35,7 +34,7 @@ default NonNullList insert(NonNullList stacks, boolean sim } /** Extracts a number of items that match the given filter - * + * * @param filter The filter that MUST be met by the extracted stack. Null means no filter - it can be any item. * @param min The minimum number of items to extract, or 0 if not enough items can be extracted * @param max The maximum number of items to extract. diff --git a/api/buildcraft/api/items/FluidItemDrops.java b/api/buildcraft/api/items/FluidItemDrops.java index de82f18..45c219e 100644 --- a/api/buildcraft/api/items/FluidItemDrops.java +++ b/api/buildcraft/api/items/FluidItemDrops.java @@ -1,19 +1,18 @@ package buildcraft.api.items; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; - +import net.minecraft.core.NonNullList; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; +import net.minecraftforge.registries.RegistryObject; public class FluidItemDrops { - - public static IItemFluidShard item; + public static RegistryObject item; public static void addFluidDrops(NonNullList toDrop, FluidStack... fluids) { if (item != null) { for (FluidStack fluid : fluids) { - item.addFluidDrops(toDrop, fluid); + item.get().addFluidDrops(toDrop, fluid); } } } @@ -21,7 +20,7 @@ public static void addFluidDrops(NonNullList toDrop, FluidStack... fl public static void addFluidDrops(NonNullList toDrop, IFluidTank... tanks) { if (item != null) { for (IFluidTank tank : tanks) { - item.addFluidDrops(toDrop, tank.getFluid()); + item.get().addFluidDrops(toDrop, tank.getFluid()); } } } diff --git a/api/buildcraft/api/items/IChipset.java b/api/buildcraft/api/items/IChipset.java new file mode 100644 index 0000000..8914f84 --- /dev/null +++ b/api/buildcraft/api/items/IChipset.java @@ -0,0 +1,7 @@ +package buildcraft.api.items; + +import buildcraft.api.enums.EnumRedstoneChipset; + +public interface IChipset { + EnumRedstoneChipset getType(); +} diff --git a/api/buildcraft/api/items/IItemCustomPipeRender.java b/api/buildcraft/api/items/IItemCustomPipeRender.java index 697b875..581aa3f 100644 --- a/api/buildcraft/api/items/IItemCustomPipeRender.java +++ b/api/buildcraft/api/items/IItemCustomPipeRender.java @@ -1,14 +1,13 @@ package buildcraft.api.items; -import net.minecraft.item.ItemStack; - -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public interface IItemCustomPipeRender { float getPipeRenderScale(ItemStack stack); /** @return False to use the default renderer, true otherwise. */ - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) boolean renderItemInPipe(ItemStack stack, double x, double y, double z); } diff --git a/api/buildcraft/api/items/IItemFluidShard.java b/api/buildcraft/api/items/IItemFluidShard.java index 0557f6b..a21a68e 100644 --- a/api/buildcraft/api/items/IItemFluidShard.java +++ b/api/buildcraft/api/items/IItemFluidShard.java @@ -1,12 +1,11 @@ package buildcraft.api.items; -import javax.annotation.Nullable; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; - +import net.minecraft.core.NonNullList; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import javax.annotation.Nullable; + public interface IItemFluidShard { void addFluidDrops(NonNullList toDrop, @Nullable FluidStack fluid); } diff --git a/api/buildcraft/api/items/IList.java b/api/buildcraft/api/items/IList.java index 1456d24..edcf1b0 100644 --- a/api/buildcraft/api/items/IList.java +++ b/api/buildcraft/api/items/IList.java @@ -1,8 +1,8 @@ package buildcraft.api.items; -import javax.annotation.Nonnull; +import net.minecraft.world.item.ItemStack; -import net.minecraft.item.ItemStack; +import javax.annotation.Nonnull; public interface IList extends INamedItem { boolean matches(@Nonnull ItemStack stackList, @Nonnull ItemStack item); diff --git a/api/buildcraft/api/items/IMapLocation.java b/api/buildcraft/api/items/IMapLocation.java index cb5dba5..1185706 100644 --- a/api/buildcraft/api/items/IMapLocation.java +++ b/api/buildcraft/api/items/IMapLocation.java @@ -1,15 +1,13 @@ package buildcraft.api.items; -import java.util.List; - -import javax.annotation.Nonnull; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; - import buildcraft.api.core.IBox; import buildcraft.api.core.IZone; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; + +import javax.annotation.Nonnull; +import java.util.List; /** Created by asie on 2/28/15. */ public interface IMapLocation extends INamedItem { @@ -25,7 +23,7 @@ enum MapLocationType { public final int meta = ordinal(); public static MapLocationType getFromStack(@Nonnull ItemStack stack) { - int dam = stack.getItemDamage(); + int dam = stack.getDamageValue(); if (dam < 0 || dam >= values().length) { return MapLocationType.CLEAN; } @@ -33,37 +31,37 @@ public static MapLocationType getFromStack(@Nonnull ItemStack stack) { } public void setToStack(@Nonnull ItemStack stack) { - stack.setItemDamage(meta); + stack.setDamageValue(meta); } } /** This function can be used for SPOT types. - * + * * @param stack * @return The point representing the map location. */ BlockPos getPoint(@Nonnull ItemStack stack); /** This function can be used for SPOT and AREA types. - * + * * @param stack * @return The box representing the map location. */ IBox getBox(@Nonnull ItemStack stack); /** This function can be used for SPOT, AREA and ZONE types. The PATH type needs to be handled separately. - * + * * @param stack * @return An IZone representing the map location - also an instance of IBox for SPOT and AREA types. */ IZone getZone(@Nonnull ItemStack stack); /** This function can be used for SPOT and PATH types. - * + * * @param stack * @return A list of BlockPoses representing the path the Map Location stores. */ List getPath(@Nonnull ItemStack stack); /** This function can be used for SPOT types only. - * + * * @param stack * @return The side of the spot. */ - EnumFacing getPointSide(@Nonnull ItemStack stack); + Direction getPointSide(@Nonnull ItemStack stack); } diff --git a/api/buildcraft/api/items/INamedItem.java b/api/buildcraft/api/items/INamedItem.java index 87c3420..225fc8d 100644 --- a/api/buildcraft/api/items/INamedItem.java +++ b/api/buildcraft/api/items/INamedItem.java @@ -1,11 +1,12 @@ package buildcraft.api.items; -import javax.annotation.Nonnull; +import net.minecraft.world.item.ItemStack; -import net.minecraft.item.ItemStack; +import javax.annotation.Nonnull; public interface INamedItem { - String getName(@Nonnull ItemStack stack); + // Component getName(@Nonnull ItemStack stack); + String getName_INamedItem(@Nonnull ItemStack stack); boolean setName(@Nonnull ItemStack stack, String name); } diff --git a/api/buildcraft/api/items/package-info.java b/api/buildcraft/api/items/package-info.java index 883db47..8747597 100644 --- a/api/buildcraft/api/items/package-info.java +++ b/api/buildcraft/api/items/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "1.1", owner = "buildcraftapi_core", provides = "buildcraftapi_items") +//@API(apiVersion = "1.1", owner = "buildcraftapi_core", provides = "buildcraftapi_items") package buildcraft.api.items; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/library/ILibraryTypeHandler.java b/api/buildcraft/api/library/ILibraryTypeHandler.java deleted file mode 100644 index 8616d10..0000000 --- a/api/buildcraft/api/library/ILibraryTypeHandler.java +++ /dev/null @@ -1,18 +0,0 @@ -package buildcraft.api.library; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - -public interface ILibraryTypeHandler { - boolean isHandler(ItemStack stack, boolean store); - - String getFileExtension(); - - int getTextColor(); - - String getName(ItemStack stack); - - ItemStack load(ItemStack stack, NBTTagCompound compound); - - boolean store(ItemStack stack, NBTTagCompound compound); -} diff --git a/api/buildcraft/api/library/LibraryAPI.java b/api/buildcraft/api/library/LibraryAPI.java deleted file mode 100644 index b899793..0000000 --- a/api/buildcraft/api/library/LibraryAPI.java +++ /dev/null @@ -1,30 +0,0 @@ -package buildcraft.api.library; - -import java.util.HashSet; -import java.util.Set; - -@Deprecated -public final class LibraryAPI { - private static final Set handlers = new HashSet<>(); - - private LibraryAPI() { - - } - - public static Set getHandlerSet() { - return handlers; - } - - public static void registerHandler(LibraryTypeHandler handler) { - handlers.add(handler); - } - - public static LibraryTypeHandler getHandlerFor(String extension) { - for (LibraryTypeHandler h : handlers) { - if (h.isInputExtension(extension)) { - return h; - } - } - return null; - } -} diff --git a/api/buildcraft/api/library/LibraryTypeHandler.java b/api/buildcraft/api/library/LibraryTypeHandler.java deleted file mode 100644 index 08db4f6..0000000 --- a/api/buildcraft/api/library/LibraryTypeHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package buildcraft.api.library; - -import net.minecraft.item.ItemStack; - -@Deprecated -public abstract class LibraryTypeHandler { - public enum HandlerType { - LOAD, - STORE - } - - private final String extension; - - public LibraryTypeHandler(String extension) { - this.extension = extension; - } - - public abstract boolean isHandler(ItemStack stack, HandlerType type); - - public boolean isInputExtension(String ext) { - return extension.equals(ext); - } - - public String getOutputExtension() { - return extension; - } - - public abstract int getTextColor(); - - public abstract String getName(ItemStack stack); -} diff --git a/api/buildcraft/api/library/LibraryTypeHandlerByteArray.java b/api/buildcraft/api/library/LibraryTypeHandlerByteArray.java deleted file mode 100644 index c7c5e23..0000000 --- a/api/buildcraft/api/library/LibraryTypeHandlerByteArray.java +++ /dev/null @@ -1,13 +0,0 @@ -package buildcraft.api.library; - -import net.minecraft.item.ItemStack; - -public abstract class LibraryTypeHandlerByteArray extends LibraryTypeHandler { - public LibraryTypeHandlerByteArray(String extension) { - super(extension); - } - - public abstract ItemStack load(ItemStack stack, byte[] data); - - public abstract byte[] store(ItemStack stack); -} diff --git a/api/buildcraft/api/library/LibraryTypeHandlerNBT.java b/api/buildcraft/api/library/LibraryTypeHandlerNBT.java deleted file mode 100644 index a656ff7..0000000 --- a/api/buildcraft/api/library/LibraryTypeHandlerNBT.java +++ /dev/null @@ -1,14 +0,0 @@ -package buildcraft.api.library; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - -public abstract class LibraryTypeHandlerNBT extends LibraryTypeHandler { - public LibraryTypeHandlerNBT(String extension) { - super(extension); - } - - public abstract ItemStack load(ItemStack stack, NBTTagCompound nbt); - - public abstract boolean store(ItemStack stack, NBTTagCompound nbt); -} diff --git a/api/buildcraft/api/library/package-info.java b/api/buildcraft/api/library/package-info.java deleted file mode 100644 index ecf627f..0000000 --- a/api/buildcraft/api/library/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com - * - * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which - * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "2.0", owner = "buildcraftapi_core", provides = "buildcraftapi_library") -package buildcraft.api.library; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/lists/ListMatchHandler.java b/api/buildcraft/api/lists/ListMatchHandler.java index e35a680..86e5a03 100644 --- a/api/buildcraft/api/lists/ListMatchHandler.java +++ b/api/buildcraft/api/lists/ListMatchHandler.java @@ -1,11 +1,11 @@ package buildcraft.api.lists; +import net.minecraft.core.NonNullList; +import net.minecraft.world.item.ItemStack; + import javax.annotation.Nonnull; import javax.annotation.Nullable; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; - public abstract class ListMatchHandler { public enum Type { TYPE, @@ -18,7 +18,7 @@ public enum Type { public abstract boolean isValidSource(Type type, @Nonnull ItemStack stack); /** Get custom client examples. - * + * * @param type * @param stack * @return A List (even empty!) if the examples satisfy this handler, null if iteration and .matches should be used diff --git a/api/buildcraft/api/lists/ListRegistry.java b/api/buildcraft/api/lists/ListRegistry.java index 38a9166..08e62ae 100644 --- a/api/buildcraft/api/lists/ListRegistry.java +++ b/api/buildcraft/api/lists/ListRegistry.java @@ -1,11 +1,11 @@ package buildcraft.api.lists; +import net.minecraft.world.item.Item; + import java.util.ArrayList; import java.util.Collections; import java.util.List; -import net.minecraft.item.Item; - public final class ListRegistry { public static final List> itemClassAsType = new ArrayList<>(); private static final List handlers = new ArrayList<>(); diff --git a/api/buildcraft/api/lists/package-info.java b/api/buildcraft/api/lists/package-info.java index b953535..a4456d8 100644 --- a/api/buildcraft/api/lists/package-info.java +++ b/api/buildcraft/api/lists/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "1.0", owner = "buildcraftapi_core", provides = "buildcraftapi_lists") +//@API(apiVersion = "1.0", owner = "buildcraftapi_core", provides = "buildcraftapi_lists") package buildcraft.api.lists; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/mj/ILaserTarget.java b/api/buildcraft/api/mj/ILaserTarget.java index e1fbfb4..981c1db 100644 --- a/api/buildcraft/api/mj/ILaserTarget.java +++ b/api/buildcraft/api/mj/ILaserTarget.java @@ -7,6 +7,7 @@ /** This interface should be defined by any Tile which wants to receive power from BuildCraft lasers. * * The respective Block MUST implement ILaserTargetBlock! */ +//@ILaserTargetAnnotation // Calen public interface ILaserTarget { /** Returns The amount of power this target currently needs. diff --git a/api/buildcraft/api/mj/IMjConnector.java b/api/buildcraft/api/mj/IMjConnector.java index 3c5f997..713599d 100644 --- a/api/buildcraft/api/mj/IMjConnector.java +++ b/api/buildcraft/api/mj/IMjConnector.java @@ -3,12 +3,12 @@ import javax.annotation.Nonnull; /** Signifies that this should visibly connect to other Mj handling entities/tiles. This should NEVER be the tile - * entity, but an encapsulated class that refers back to it. Use {@link buildcraft.api.mj.MjAPI#CAP_CONNECTOR} to access + * entity, but an encapsulated class that refers back to it. Use {@link MjAPI#CAP_CONNECTOR} to access * this. */ public interface IMjConnector { /** Checks to see if this connector can connect to the other connector. By default this should check that the other * connector is the same power system. - * + * * @param other * @return */ boolean canConnect(@Nonnull IMjConnector other); diff --git a/api/buildcraft/api/mj/IMjEffectManager.java b/api/buildcraft/api/mj/IMjEffectManager.java index c7fb899..a2b009e 100644 --- a/api/buildcraft/api/mj/IMjEffectManager.java +++ b/api/buildcraft/api/mj/IMjEffectManager.java @@ -1,15 +1,15 @@ package buildcraft.api.mj; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; /** Various effects for showing power loss visibly, and for large amounts of power, causes some damage to nearby * entities. */ public interface IMjEffectManager { - void createPowerLossEffect(World world, Vec3d center, long microJoulesLost); + void createPowerLossEffect(Level world, Vec3 center, long microJoulesLost); - void createPowerLossEffect(World world, Vec3d center, EnumFacing direction, long microJoulesLost); + void createPowerLossEffect(Level world, Vec3 center, Direction direction, long microJoulesLost); - void createPowerLossEffect(World world, Vec3d center, Vec3d direction, long microJoulesLost); + void createPowerLossEffect(Level world, Vec3 center, Vec3 direction, long microJoulesLost); } diff --git a/api/buildcraft/api/mj/IMjPassiveProvider.java b/api/buildcraft/api/mj/IMjPassiveProvider.java index 55b33c6..e6df834 100644 --- a/api/buildcraft/api/mj/IMjPassiveProvider.java +++ b/api/buildcraft/api/mj/IMjPassiveProvider.java @@ -4,7 +4,7 @@ * engine). Power can be extracted from this by powered wooden kinesis pipes, for example. */ public interface IMjPassiveProvider extends IMjConnector { /** Attempts to extract power from this provider - * + * * @param simulate * @return Either 0, min, max, or a value between min and max. */ long extractPower(long min, long max, boolean simulate); diff --git a/api/buildcraft/api/mj/IMjReceiver.java b/api/buildcraft/api/mj/IMjReceiver.java index a8cecd7..750640e 100644 --- a/api/buildcraft/api/mj/IMjReceiver.java +++ b/api/buildcraft/api/mj/IMjReceiver.java @@ -11,10 +11,10 @@ public interface IMjReceiver extends IMjConnector { *

  • Store all power in something like an {@link MjBattery} for later usage. *
  • Refuse all power (if you have no more work to do or your {@link MjBattery} is full). * - * + * * Note that callers are NOT expected to call {@link #canReceive()} before calling this - implementors should check * all of the conditions in {@link #canReceive()} before accepting power. - * + * * @param microJoules The number of micro joules to add. * @param simulate If true then just pretend you received power- don't actually change any of your internal state. * @return The excess power. */ @@ -22,7 +22,7 @@ public interface IMjReceiver extends IMjConnector { /** Checks to see if {@link #receivePower(long, boolean)} *might* accept any power right now, ignoring the amount of * power contained right now (if any). - * + * * @return True if this {@link IMjReceiver} can receive power right now. */ default boolean canReceive() { return true; diff --git a/api/buildcraft/api/mj/IMjRedstoneReceiver.java b/api/buildcraft/api/mj/IMjRedstoneReceiver.java index 11eb5de..f0e892e 100644 --- a/api/buildcraft/api/mj/IMjRedstoneReceiver.java +++ b/api/buildcraft/api/mj/IMjRedstoneReceiver.java @@ -1,4 +1,5 @@ package buildcraft.api.mj; /** Designates that a receiver can receive redstone power (cheap, free, small amounts) */ -public interface IMjRedstoneReceiver extends IMjReceiver {} +public interface IMjRedstoneReceiver extends IMjReceiver { +} diff --git a/api/buildcraft/api/mj/MjAPI.java b/api/buildcraft/api/mj/MjAPI.java index 1ed476e..282f0cb 100644 --- a/api/buildcraft/api/mj/MjAPI.java +++ b/api/buildcraft/api/mj/MjAPI.java @@ -1,16 +1,16 @@ package buildcraft.api.mj; -import java.text.DecimalFormat; - -import javax.annotation.Nonnull; - -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.CapabilityToken; +import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; -import buildcraft.api.core.CapabilitiesHelper; +import javax.annotation.Nonnull; +import java.text.DecimalFormat; public class MjAPI { @@ -53,14 +53,18 @@ private static String formatMjInternal(double val) { public enum NullaryEffectManager implements IMjEffectManager { INSTANCE; + @Override - public void createPowerLossEffect(World world, Vec3d center, long microJoulesLost) {} + public void createPowerLossEffect(Level world, Vec3 center, long microJoulesLost) { + } @Override - public void createPowerLossEffect(World world, Vec3d center, EnumFacing direction, long microJoulesLost) {} + public void createPowerLossEffect(Level world, Vec3 center, Direction direction, long microJoulesLost) { + } @Override - public void createPowerLossEffect(World world, Vec3d center, Vec3d direction, long microJoulesLost) {} + public void createPowerLossEffect(Level world, Vec3 center, Vec3 direction, long microJoulesLost) { + } } // @formatter:on @@ -71,26 +75,30 @@ public void createPowerLossEffect(World world, Vec3d center, Vec3d direction, lo // ############### @Nonnull - public static final Capability CAP_CONNECTOR; - + public static final Capability CAP_CONNECTOR = CapabilityManager.get(new CapabilityToken<>() { + }); @Nonnull - public static final Capability CAP_RECEIVER; - + public static final Capability CAP_RECEIVER = CapabilityManager.get(new CapabilityToken<>() { + }); @Nonnull - public static final Capability CAP_REDSTONE_RECEIVER; + public static final Capability CAP_REDSTONE_RECEIVER = CapabilityManager.get(new CapabilityToken<>() { + }); @Nonnull - public static final Capability CAP_READABLE; + public static final Capability CAP_READABLE = CapabilityManager.get(new CapabilityToken<>() { + }); @Nonnull - public static final Capability CAP_PASSIVE_PROVIDER; - - static { - CAP_CONNECTOR = CapabilitiesHelper.registerCapability(IMjConnector.class); - CAP_RECEIVER = CapabilitiesHelper.registerCapability(IMjReceiver.class); - CAP_REDSTONE_RECEIVER = CapabilitiesHelper.registerCapability(IMjRedstoneReceiver.class); - CAP_READABLE = CapabilitiesHelper.registerCapability(IMjReadable.class); - CAP_PASSIVE_PROVIDER = CapabilitiesHelper.registerCapability(IMjPassiveProvider.class); + public static final Capability CAP_PASSIVE_PROVIDER = CapabilityManager.get(new CapabilityToken<>() { + }); + + @SubscribeEvent + public static void registerCapability(RegisterCapabilitiesEvent event) { + event.register(IMjConnector.class); + event.register(IMjReceiver.class); + event.register(IMjRedstoneReceiver.class); + event.register(IMjReadable.class); + event.register(IMjPassiveProvider.class); } private static long getMjValue() { diff --git a/api/buildcraft/api/mj/MjBattery.java b/api/buildcraft/api/mj/MjBattery.java index 68c2ea1..cfe7ee1 100644 --- a/api/buildcraft/api/mj/MjBattery.java +++ b/api/buildcraft/api/mj/MjBattery.java @@ -1,17 +1,15 @@ package buildcraft.api.mj; import io.netty.buffer.ByteBuf; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.util.INBTSerializable; -/** Provides a basic implementation of a simple battery. Note that you should call {@link #tick(World, BlockPos)} or - * {@link #tick(World, Vec3d)} every tick to allow for losing excess power. */ -public class MjBattery implements INBTSerializable { +/** Provides a basic implementation of a simple battery. Note that you should call {@link #tick(Level, BlockPos)} or + * {@link #tick(Level, Vec3)} every tick to allow for losing excess power. */ +public class MjBattery implements INBTSerializable { private final long capacity; private long microJoules = 0; @@ -20,14 +18,14 @@ public MjBattery(long capacity) { } @Override - public NBTTagCompound serializeNBT() { - NBTTagCompound nbt = new NBTTagCompound(); - nbt.setLong("stored", microJoules); + public CompoundTag serializeNBT() { + CompoundTag nbt = new CompoundTag(); + nbt.putLong("stored", microJoules); return nbt; } @Override - public void deserializeNBT(NBTTagCompound nbt) { + public void deserializeNBT(CompoundTag nbt) { microJoules = nbt.getLong("stored"); } @@ -40,14 +38,26 @@ public void readFromBuffer(ByteBuf buffer) { } public long addPower(long microJoulesToAdd, boolean simulate) { +// if (!simulate) { +// this.microJoules += microJoulesToAdd; +// } +// return 0; + + // Calen FIX: now the battery will not receive energy more than this.capability + long excess = 0; + long toAdd = microJoulesToAdd; + if (this.microJoules + microJoulesToAdd > this.capacity) { + excess = this.microJoules + microJoulesToAdd - this.capacity; + toAdd = this.capacity - this.microJoules; + } if (!simulate) { - this.microJoules += microJoulesToAdd; + this.microJoules += toAdd; } - return 0; + return excess; } /** Attempts to add power, but only if this is not already full. - * + * * @param microJoulesToAdd The power to add. * @return The excess power. */ public long addPowerChecking(long microJoulesToAdd, boolean simulate) { @@ -63,7 +73,7 @@ public long extractAll() { } /** Attempts to extract exactly the given amount of power. - * + * * @param power The amount of power to extract. * @return True if the power was removed, false if not. */ public boolean extractPower(long power) { @@ -89,17 +99,17 @@ public long getCapacity() { return capacity; } - public void tick(World world, BlockPos position) { - tick(world, new Vec3d(position.getX() + 0.5, position.getY() + 0.5, position.getZ() + 0.5)); + public void tick(Level world, BlockPos position) { + tick(world, new Vec3(position.getX() + 0.5, position.getY() + 0.5, position.getZ() + 0.5)); } - public void tick(World world, Vec3d position) { + public void tick(Level world, Vec3 position) { if (microJoules > capacity * 2) { losePower(world, position); } } - protected void losePower(World world, Vec3d position) { + protected void losePower(Level world, Vec3 position) { long diff = microJoules - capacity * 2; long lost = ceilDivide(diff, 32); microJoules -= lost; diff --git a/api/buildcraft/api/mj/MjCapabilityHelper.java b/api/buildcraft/api/mj/MjCapabilityHelper.java index c70c74c..ae9a9a1 100644 --- a/api/buildcraft/api/mj/MjCapabilityHelper.java +++ b/api/buildcraft/api/mj/MjCapabilityHelper.java @@ -1,12 +1,12 @@ package buildcraft.api.mj; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.util.EnumFacing; - +import net.minecraft.core.Direction; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.common.util.LazyOptional; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** Provides a quick way to return all types of a single {@link IMjConnector} for all the different capabilities. */ public class MjCapabilityHelper implements ICapabilityProvider { @@ -34,28 +34,33 @@ public MjCapabilityHelper(@Nonnull IMjConnector mj) { this.provider = mj instanceof IMjPassiveProvider ? (IMjPassiveProvider) mj : null; } - @Override - public boolean hasCapability(@Nonnull Capability capability, EnumFacing facing) { - return getCapability(capability, facing) != null; - } +// @Override +// public boolean hasCapability(@Nonnull Capability capability, EnumFacing facing) { +// return getCapability(capability, facing) != null; +// } @Override - public T getCapability(@Nonnull Capability capability, EnumFacing facing) { + public LazyOptional getCapability(@Nonnull Capability capability, Direction facing) { if (capability == MjAPI.CAP_CONNECTOR) { - return MjAPI.CAP_CONNECTOR.cast(connector); +// return MjAPI.CAP_CONNECTOR.cast(connector); + return connector == null ? LazyOptional.empty() : LazyOptional.of(() -> connector).cast(); } if (capability == MjAPI.CAP_RECEIVER) { - return MjAPI.CAP_RECEIVER.cast(receiver); +// return MjAPI.CAP_RECEIVER.cast(receiver); + return receiver == null ? LazyOptional.empty() : LazyOptional.of(() -> receiver).cast(); } if (capability == MjAPI.CAP_REDSTONE_RECEIVER) { - return MjAPI.CAP_REDSTONE_RECEIVER.cast(rsReceiver); +// return MjAPI.CAP_REDSTONE_RECEIVER.cast(rsReceiver); + return rsReceiver == null ? LazyOptional.empty() : LazyOptional.of(() -> rsReceiver).cast(); } if (capability == MjAPI.CAP_READABLE) { - return MjAPI.CAP_READABLE.cast(readable); +// return MjAPI.CAP_READABLE.cast(readable); + return readable == null ? LazyOptional.empty() : LazyOptional.of(() -> readable).cast(); } if (capability == MjAPI.CAP_PASSIVE_PROVIDER) { - return MjAPI.CAP_PASSIVE_PROVIDER.cast(provider); +// return MjAPI.CAP_PASSIVE_PROVIDER.cast(provider); + return provider == null ? LazyOptional.empty() : LazyOptional.of(() -> provider).cast(); } - return null; + return LazyOptional.empty(); } } diff --git a/api/buildcraft/api/net/IMessage.java b/api/buildcraft/api/net/IMessage.java new file mode 100644 index 0000000..612c15c --- /dev/null +++ b/api/buildcraft/api/net/IMessage.java @@ -0,0 +1,21 @@ +package buildcraft.api.net; + +import buildcraft.api.core.BCLog; +import net.minecraft.network.FriendlyByteBuf; + +public interface IMessage { + void fromBytes(FriendlyByteBuf buf); + + void toBytes(FriendlyByteBuf buf); + + public static IMessage staticFromBytes(Class clazz, FriendlyByteBuf buf) { + try { + IMessage message = clazz.newInstance(); + message.fromBytes(buf); + return message; + } catch (Exception e) { + BCLog.logger.error(e); + return null; + } + } +} diff --git a/api/buildcraft/api/net/IMessageHandler.java b/api/buildcraft/api/net/IMessageHandler.java new file mode 100644 index 0000000..6a82a0e --- /dev/null +++ b/api/buildcraft/api/net/IMessageHandler.java @@ -0,0 +1,7 @@ +package buildcraft.api.net; + +import net.minecraftforge.network.NetworkEvent; + +public interface IMessageHandler { + REPLY onMessage(REQ message, NetworkEvent.Context ctx); +} diff --git a/api/buildcraft/api/power/IEngine.java b/api/buildcraft/api/power/IEngine.java index c25037c..bc71333 100644 --- a/api/buildcraft/api/power/IEngine.java +++ b/api/buildcraft/api/power/IEngine.java @@ -4,23 +4,23 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.power; -import net.minecraft.util.EnumFacing; +import net.minecraft.core.Direction; /** Engines should implement this interface if they want to support BuildCraft's behaviour of passing power between * engines without using receivePower() (which has other issues). */ public interface IEngine { /** Returns true if the engine wants to receive power from another engine on this side. - * + * * @param side * @return */ - boolean canReceiveFromEngine(EnumFacing side); + boolean canReceiveFromEngine(Direction side); /** Receives power from an engine. * * @param microJoules The number of micro joules to add. * @param simulate If true then just pretend you received power- don't actually change any of your internal state. * @return True if all the power was accepted, false if not. - * + * * @see buildcraft.api.mj.IMjReceiver#receivePower(long, boolean) */ boolean receivePower(long microJoules, boolean simulate); } diff --git a/api/buildcraft/api/power/IRedstoneEngine.java b/api/buildcraft/api/power/IRedstoneEngine.java index 3fc534d..e942d61 100644 --- a/api/buildcraft/api/power/IRedstoneEngine.java +++ b/api/buildcraft/api/power/IRedstoneEngine.java @@ -4,4 +4,5 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.power; -public interface IRedstoneEngine {} +public interface IRedstoneEngine { +} diff --git a/api/buildcraft/api/power/package-info.java b/api/buildcraft/api/power/package-info.java index 66e7868..6f368b4 100644 --- a/api/buildcraft/api/power/package-info.java +++ b/api/buildcraft/api/power/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "1.3", owner = "buildcraftapi_core", provides = "buildcraftapi_power") +//@API(apiVersion = "1.3", owner = "buildcraftapi_core", provides = "buildcraftapi_power") package buildcraft.api.power; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/properties/BuildCraftProperties.java b/api/buildcraft/api/properties/BuildCraftProperties.java index a04b44e..d7c186a 100644 --- a/api/buildcraft/api/properties/BuildCraftProperties.java +++ b/api/buildcraft/api/properties/BuildCraftProperties.java @@ -1,56 +1,48 @@ package buildcraft.api.properties; -import java.util.Map; - +import buildcraft.api.enums.*; import com.google.common.collect.Maps; +import net.minecraft.core.Direction; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.block.state.properties.Property; -import net.minecraft.block.properties.IProperty; -import net.minecraft.block.properties.PropertyBool; -import net.minecraft.block.properties.PropertyEnum; -import net.minecraft.block.properties.PropertyInteger; -import net.minecraft.item.EnumDyeColor; -import net.minecraft.util.EnumFacing; - -import buildcraft.api.enums.EnumDecoratedBlock; -import buildcraft.api.enums.EnumEngineType; -import buildcraft.api.enums.EnumLaserTableType; -import buildcraft.api.enums.EnumMachineState; -import buildcraft.api.enums.EnumOptionalSnapshotType; -import buildcraft.api.enums.EnumPowerStage; -import buildcraft.api.enums.EnumSpring; +import java.util.Map; public final class BuildCraftProperties { - public static final IProperty BLOCK_FACING = PropertyEnum.create("facing", EnumFacing.class, EnumFacing.Plane.HORIZONTAL.facings()); - public static final IProperty BLOCK_FACING_6 = PropertyEnum.create("facing", EnumFacing.class); + public static final Property BLOCK_FACING = EnumProperty.create("facing", Direction.class, new Direction[] { Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST }); + public static final Property BLOCK_FACING_6 = EnumProperty.create("facing", Direction.class); - public static final IProperty BLOCK_COLOR = PropertyEnum.create("color", EnumDyeColor.class); - public static final IProperty SPRING_TYPE = PropertyEnum.create("type", EnumSpring.class); - public static final IProperty ENGINE_TYPE = PropertyEnum.create("type", EnumEngineType.class); - public static final IProperty LASER_TABLE_TYPE = PropertyEnum.create("type", EnumLaserTableType.class); - public static final IProperty MACHINE_STATE = PropertyEnum.create("state", EnumMachineState.class); - public static final IProperty ENERGY_STAGE = PropertyEnum.create("stage", EnumPowerStage.class); - public static final IProperty SNAPSHOT_TYPE = PropertyEnum.create("snapshot_type", EnumOptionalSnapshotType.class); - public static final IProperty DECORATED_BLOCK = PropertyEnum.create("decoration_type", EnumDecoratedBlock.class); + public static final Property BLOCK_COLOR = EnumProperty.create("color", DyeColor.class); + // public static final EnumProperty SPRING_TYPE = EnumProperty.create("type", EnumSpring.class); +// public static final Property ENGINE_TYPE = EnumProperty.create("type", EnumEngineType.class); + public static final Property LASER_TABLE_TYPE = EnumProperty.create("type", EnumLaserTableType.class); + public static final Property MACHINE_STATE = EnumProperty.create("state", EnumMachineState.class); + public static final Property ENERGY_STAGE = EnumProperty.create("stage", EnumPowerStage.class); + public static final Property SNAPSHOT_TYPE = EnumProperty.create("snapshot_type", EnumOptionalSnapshotType.class); + public static final Property DECORATED_BLOCK = EnumProperty.create("decoration_type", EnumDecoratedBlock.class); - public static final IProperty GENERIC_PIPE_DATA = PropertyInteger.create("pipe_data", 0, 15); - public static final IProperty LED_POWER = PropertyInteger.create("led_power", 0, 3); + public static final Property GENERIC_PIPE_DATA = IntegerProperty.create("pipe_data", 0, 15); + public static final Property LED_POWER = IntegerProperty.create("led_power", 0, 3); - public static final IProperty JOINED_BELOW = PropertyBool.create("joined_below"); - public static final IProperty MOVING = PropertyBool.create("moving"); - public static final IProperty LED_DONE = PropertyBool.create("led_done"); - public static final IProperty ACTIVE = PropertyBool.create("active"); - public static final IProperty VALID = PropertyBool.create("valid"); + public static final Property JOINED_BELOW = BooleanProperty.create("joined_below"); // 这里的注册名就是model文件里的条件 + public static final Property MOVING = BooleanProperty.create("moving"); + public static final Property LED_DONE = BooleanProperty.create("led_done"); + // public static final Property ACTIVE = BooleanProperty.create("active"); // set but never used + public static final Property VALID = BooleanProperty.create("valid"); - public static final IProperty CONNECTED_UP = PropertyBool.create("connected_up"); - public static final IProperty CONNECTED_DOWN = PropertyBool.create("connected_down"); - public static final IProperty CONNECTED_EAST = PropertyBool.create("connected_east"); - public static final IProperty CONNECTED_WEST = PropertyBool.create("connected_west"); - public static final IProperty CONNECTED_NORTH = PropertyBool.create("connected_north"); - public static final IProperty CONNECTED_SOUTH = PropertyBool.create("connected_south"); + public static final Property CONNECTED_UP = BooleanProperty.create("connected_up"); + public static final Property CONNECTED_DOWN = BooleanProperty.create("connected_down"); + public static final Property CONNECTED_EAST = BooleanProperty.create("connected_east"); + public static final Property CONNECTED_WEST = BooleanProperty.create("connected_west"); + public static final Property CONNECTED_NORTH = BooleanProperty.create("connected_north"); + public static final Property CONNECTED_SOUTH = BooleanProperty.create("connected_south"); - public static final Map> CONNECTED_MAP; + public static final Map> CONNECTED_MAP; - // Block state setting flags -these are used by World.markAndNotifyBlock and World.setBlockState. These flags can be + // Block state setting flags -these are used by Level.markAndNotifyBlock and Level.setBlockState. These flags can be // added together to pass the additions public static final int UPDATE_NONE = 0; /** This updates the neighbouring blocks that the new block is set. It also updates the comparator output of this @@ -63,23 +55,24 @@ public final class BuildCraftProperties { * world.isRemote returns false. */ public static final int UPDATE_EVEN_CLIENT = 4 + MARK_BLOCK_FOR_UPDATE; // 6 - // Pre-added flags- pass these as-is to the World.markAndNotifyBlock and World.setBlockState methods. + // Pre-added flags- pass these as-is to the Level.markAndNotifyBlock and Level.setBlockState methods. /** This will do what both {@link #UPDATE_NEIGHBOURS} and {@link #MARK_BLOCK_FOR_UPDATE} do. */ public static final int MARK_THIS_AND_NEIGHBOURS = UPDATE_NEIGHBOURS + MARK_BLOCK_FOR_UPDATE; /** This will update everything about this block. */ public static final int UPDATE_ALL = UPDATE_NEIGHBOURS + MARK_BLOCK_FOR_UPDATE + UPDATE_EVEN_CLIENT; static { - Map> map = Maps.newEnumMap(EnumFacing.class); - map.put(EnumFacing.DOWN, CONNECTED_DOWN); - map.put(EnumFacing.UP, CONNECTED_UP); - map.put(EnumFacing.EAST, CONNECTED_EAST); - map.put(EnumFacing.WEST, CONNECTED_WEST); - map.put(EnumFacing.NORTH, CONNECTED_NORTH); - map.put(EnumFacing.SOUTH, CONNECTED_SOUTH); + Map> map = Maps.newEnumMap(Direction.class); + map.put(Direction.DOWN, CONNECTED_DOWN); + map.put(Direction.UP, CONNECTED_UP); + map.put(Direction.EAST, CONNECTED_EAST); + map.put(Direction.WEST, CONNECTED_WEST); + map.put(Direction.NORTH, CONNECTED_NORTH); + map.put(Direction.SOUTH, CONNECTED_SOUTH); CONNECTED_MAP = Maps.immutableEnumMap(map); } /** Deactivate constructor */ - private BuildCraftProperties() {} + private BuildCraftProperties() { + } } diff --git a/api/buildcraft/api/recipes/AssemblyRecipe.java b/api/buildcraft/api/recipes/AssemblyRecipe.java deleted file mode 100644 index cbd8eb5..0000000 --- a/api/buildcraft/api/recipes/AssemblyRecipe.java +++ /dev/null @@ -1,85 +0,0 @@ -package buildcraft.api.recipes; - -import java.util.Set; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; -import net.minecraft.util.ResourceLocation; - -import net.minecraftforge.registries.IForgeRegistryEntry; - -/** - * @deprecated TEMPORARY CLASS DO NOT USE! - */ -@Deprecated -public abstract class AssemblyRecipe implements Comparable, IForgeRegistryEntry { - private ResourceLocation name; - - /** - * The outputs this recipe can generate with any of the given inputs - * @param inputs Current ingredients in the assembly table - * @return A Set containing all possible outputs given the given inputs or an empty one if nothing can be assembled from the given inputs - */ - public abstract Set getOutputs(NonNullList inputs); - - /** - * Used to determine all outputs from this recipe for recipe previews (guide book and/or JEI) - */ - public abstract Set getOutputPreviews(); - - /** - * Used to determine what items to use up for the given output - * @param output The output we want to know the inputs for, only ever called using stacks obtained from getOutputs or getOutputPreviews - */ - public abstract Set getInputsFor(@Nonnull ItemStack output); - - /** - * Used to determine how much MJ is required to asemble the given output item - * @param output The output we want to know the MJ cost for, only ever called using stacks obtained from getOutputs or getOutputPreviews - */ - public abstract long getRequiredMicroJoulesFor(@Nonnull ItemStack output); - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - AssemblyRecipe that = (AssemblyRecipe) o; - - return name.equals(that.name); - } - - @Override - public int hashCode() { - return name.hashCode(); - } - - @Override - public int compareTo(AssemblyRecipe o) { - return name.toString().compareTo(o.name.toString()); - } - - @Override - public AssemblyRecipe setRegistryName(ResourceLocation name) { - this.name = name; - return this; - } - - @Nullable - @Override - public ResourceLocation getRegistryName() { - return name; - } - - @Override - public Class getRegistryType() { - return AssemblyRecipe.class; - } -} diff --git a/api/buildcraft/api/recipes/AssemblyRecipeBasic.java b/api/buildcraft/api/recipes/AssemblyRecipeBasic.java deleted file mode 100644 index 094d3c9..0000000 --- a/api/buildcraft/api/recipes/AssemblyRecipeBasic.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2017 SpaceToad and the BuildCraft team - * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not - * distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/ - */ - -package buildcraft.api.recipes; - -import java.util.Collections; -import java.util.Set; - -import javax.annotation.Nonnull; - -import com.google.common.collect.ImmutableSet; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; -import net.minecraft.util.ResourceLocation; - -import buildcraft.api.core.BuildCraftAPI; - -/** - * @deprecated TEMPORARY CLASS DO NOT USE! - */ -@Deprecated -public class AssemblyRecipeBasic extends AssemblyRecipe { - private final long requiredMicroJoules; - private final ImmutableSet requiredStacks; - private final ImmutableSet output; - - public AssemblyRecipeBasic(ResourceLocation name, long requiredMicroJoules, ImmutableSet requiredStacks, @Nonnull ItemStack output) { - this.requiredMicroJoules = requiredMicroJoules; - this.requiredStacks = ImmutableSet.copyOf(requiredStacks); - this.output = ImmutableSet.of(output); - setRegistryName(name); - } - - public AssemblyRecipeBasic(String name, long requiredMicroJoules, ImmutableSet requiredStacks, @Nonnull ItemStack output) { - this(BuildCraftAPI.nameToResourceLocation(name), requiredMicroJoules, requiredStacks, output); - } - - public AssemblyRecipeBasic(String name, long requiredMicroJoules, Set requiredStacks, @Nonnull ItemStack output) { - this(name, requiredMicroJoules, ImmutableSet.copyOf(requiredStacks), output); - } - - @Override - public Set getOutputs(NonNullList inputs) { - if (requiredStacks.stream().allMatch((definition) -> inputs.stream().anyMatch((stack) -> !stack.isEmpty() && definition.ingredient.apply(stack) && stack.getCount() >= definition.count))) - return output; - return Collections.emptySet(); - } - - @Override - public Set getOutputPreviews() { - return output; - } - - @Override - public Set getInputsFor(@Nonnull ItemStack output) { - return requiredStacks; - } - - @Override - public long getRequiredMicroJoulesFor(@Nonnull ItemStack output) { - return requiredMicroJoules; - } -} diff --git a/api/buildcraft/api/recipes/BuildcraftRecipeRegistry.java b/api/buildcraft/api/recipes/BuildcraftRecipeRegistry.java index 22ee171..6174520 100644 --- a/api/buildcraft/api/recipes/BuildcraftRecipeRegistry.java +++ b/api/buildcraft/api/recipes/BuildcraftRecipeRegistry.java @@ -9,5 +9,6 @@ public final class BuildcraftRecipeRegistry { public static IIntegrationRecipeRegistry integrationRecipes; public static IRefineryRecipeManager refineryRecipes; - private BuildcraftRecipeRegistry() {} + private BuildcraftRecipeRegistry() { + } } diff --git a/api/buildcraft/api/recipes/EnumAssemblyRecipeType.java b/api/buildcraft/api/recipes/EnumAssemblyRecipeType.java new file mode 100644 index 0000000..3b8f726 --- /dev/null +++ b/api/buildcraft/api/recipes/EnumAssemblyRecipeType.java @@ -0,0 +1,6 @@ +package buildcraft.api.recipes; + +public enum EnumAssemblyRecipeType { + BASIC, + FACADE, +} diff --git a/api/buildcraft/api/recipes/IAssemblyRecipe.java b/api/buildcraft/api/recipes/IAssemblyRecipe.java new file mode 100644 index 0000000..fc02e2d --- /dev/null +++ b/api/buildcraft/api/recipes/IAssemblyRecipe.java @@ -0,0 +1,77 @@ +package buildcraft.api.recipes; + +import buildcraft.api.BCModules; +import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; + +import javax.annotation.Nonnull; +import java.util.Set; + +public interface IAssemblyRecipe extends Comparable, Recipe { + public static final ResourceLocation TYPE_ID = new ResourceLocation(BCModules.SILICON.getModId(), "assembly"); + + public static final RecipeType TYPE = RecipeType.simple(TYPE_ID); + + /** + * The outputs this recipe can generate with any of the given inputs + * + * @param inputs Current ingredients in the assembly table + * @return A Set containing all possible outputs given the given inputs or an empty one if nothing can be assembled from the given inputs + */ + public abstract Set getOutputs(NonNullList inputs); + + /** Used to determine all outputs from this recipe for recipe previews (guide book and/or JEI) */ + public abstract Set getOutputPreviews(); + + /** + * Used to determine what items to use up for the given output + * + * @param output The output we want to know the inputs for, only ever called using stacks obtained from getOutputs or getOutputPreviews + */ + public abstract Set getInputsFor(@Nonnull ItemStack output); + + /** + * Used to determine how much MJ is required to asemble the given output item + * + * @param output The output we want to know the MJ cost for, only ever called using stacks obtained from getOutputs or getOutputPreviews + */ + public abstract long getRequiredMicroJoulesFor(@Nonnull ItemStack output); + + @Override + public default int compareTo(IAssemblyRecipe o) { + return getId().toString().compareTo(o.getId().toString()); + } + + public abstract long getRequiredMicroJoules(); + + public abstract Set getRequiredIngredientStacks(); + + public abstract Set getOutput(); + + // Recipe + + @Override + public default boolean matches(Container inv, Level world) { + return false; + } + + @Override + public default boolean canCraftInDimensions(int width, int height) { + return true; + } + + @Override + public default boolean isSpecial() { + return true; + } + + @Override + public default RecipeType getType() { + return TYPE; + } +} diff --git a/api/buildcraft/api/recipes/IIntegrationRecipeProvider.java b/api/buildcraft/api/recipes/IIntegrationRecipeProvider.java index a6ebeaa..0185609 100644 --- a/api/buildcraft/api/recipes/IIntegrationRecipeProvider.java +++ b/api/buildcraft/api/recipes/IIntegrationRecipeProvider.java @@ -1,18 +1,18 @@ package buildcraft.api.recipes; +import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + import javax.annotation.Nonnull; import javax.annotation.Nullable; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; -import net.minecraft.util.ResourceLocation; - /** Provides a way of registering complex recipes without needing to register every possible variant. If you want the * recipes to be viewable in JEI and the guide book then you will *also* need to implement the bc lib class * IIntegrationRecipeViewable. */ public interface IIntegrationRecipeProvider { /** Gets an integration recipe for the given ingredients. - * + * * @param target The center itemstack. * @param toIntegrate A list of stacks to try to integrate to the * @return */ diff --git a/api/buildcraft/api/recipes/IRefineryRecipeManager.java b/api/buildcraft/api/recipes/IRefineryRecipeManager.java index 65b523b..4e8c78d 100644 --- a/api/buildcraft/api/recipes/IRefineryRecipeManager.java +++ b/api/buildcraft/api/recipes/IRefineryRecipeManager.java @@ -1,30 +1,44 @@ package buildcraft.api.recipes; +import buildcraft.api.BCModules; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Container; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraftforge.fluids.FluidStack; + +import javax.annotation.Nullable; import java.util.Collection; import java.util.function.Predicate; import java.util.stream.Stream; -import javax.annotation.Nullable; - -import net.minecraftforge.fluids.FluidStack; - public interface IRefineryRecipeManager { - IHeatableRecipe createHeatingRecipe(FluidStack in, FluidStack out, int heatFrom, int heatTo); + // IHeatableRecipe createHeatingRecipe(FluidStack in, FluidStack out, int heatFrom, int heatTo); + IHeatableRecipe createHeatingRecipe(ResourceLocation id, FluidStack in, FluidStack out, int heatFrom, int heatTo); - default IHeatableRecipe addHeatableRecipe(FluidStack in, FluidStack out, int heatFrom, int heatTo) { - return getHeatableRegistry().addRecipe(createHeatingRecipe(in, out, heatFrom, heatTo)); + // default IHeatableRecipe addHeatableRecipe(FluidStack in, FluidStack out, int heatFrom, int heatTo) + default IHeatableRecipe addUnregisteredHeatableRecipe(ResourceLocation id, FluidStack in, FluidStack out, int heatFrom, int heatTo) { +// return getHeatableRegistry().addRecipe(createHeatingRecipe(in, out, heatFrom, heatTo)); + return getHeatableRegistry().addUnregisteredRecipe(createHeatingRecipe(id, in, out, heatFrom, heatTo)); } - ICoolableRecipe createCoolableRecipe(FluidStack in, FluidStack out, int heatFrom, int heatTo); + // ICoolableRecipe createCoolableRecipe(FluidStack in, FluidStack out, int heatFrom, int heatTo); + ICoolableRecipe createCoolableRecipe(ResourceLocation id, FluidStack in, FluidStack out, int heatFrom, int heatTo); - default ICoolableRecipe addCoolableRecipe(FluidStack in, FluidStack out, int heatFrom, int heatTo) { - return getCoolableRegistry().addRecipe(createCoolableRecipe(in, out, heatFrom, heatTo)); + // default ICoolableRecipe addCoolableRecipe(FluidStack in, FluidStack out, int heatFrom, int heatTo) + default ICoolableRecipe addUnregisteredCoolableRecipe(ResourceLocation id, FluidStack in, FluidStack out, int heatFrom, int heatTo) { +// return getCoolableRegistry().addRecipe(createCoolableRecipe(in, out, heatFrom, heatTo)); + return getCoolableRegistry().addUnregisteredRecipe(createCoolableRecipe(id, in, out, heatFrom, heatTo)); } - IDistillationRecipe createDistillationRecipe(FluidStack in, FluidStack outGas, FluidStack outLiquid, long powerRequired); + // IDistillationRecipe createDistillationRecipe(FluidStack in, FluidStack outGas, FluidStack outLiquid, long powerRequired); + IDistillationRecipe createDistillationRecipe(ResourceLocation id, FluidStack in, FluidStack outGas, FluidStack outLiquid, long powerRequired); - default IDistillationRecipe addDistillationRecipe(FluidStack in, FluidStack outGas, FluidStack outLiquid, long powerRequired) { - return getDistillationRegistry().addRecipe(createDistillationRecipe(in, outGas, outLiquid, powerRequired)); + // default IDistillationRecipe addDistillationRecipe(FluidStack in, FluidStack outGas, FluidStack outLiquid, long powerRequired) + default IDistillationRecipe addUnregisteredDistillationRecipe(ResourceLocation id, FluidStack in, FluidStack outGas, FluidStack outLiquid, long powerRequired) { +// return getDistillationRegistry().addRecipe(createDistillationRecipe(in, outGas, outLiquid, powerRequired)); + return getDistillationRegistry().addUnregisteredRecipe(createDistillationRecipe(id, in, outGas, outLiquid, powerRequired)); } IRefineryRegistry getHeatableRegistry(); @@ -36,30 +50,39 @@ default IDistillationRecipe addDistillationRecipe(FluidStack in, FluidStack outG interface IRefineryRegistry { /** @return an unmodifiable collection containing all of the distillation recipes that satisfy the given * predicate. All of the recipe objects are guaranteed to never be null. */ - Stream getRecipes(Predicate toReturn); +// Stream getRecipes(Predicate toReturn); + Stream getRecipes(Level world, Predicate toReturn); /** @return an unmodifiable set containing all of the distillation recipes. */ - Collection getAllRecipes(); +// Collection getAllRecipes(); + Collection getAllRecipes(Level world); @Nullable - R getRecipeForInput(@Nullable FluidStack fluid); +// R getRecipeForInput(@Nullable FluidStack fluid); + R getRecipeForInput(Level world, @Nullable FluidStack fluid); - Collection removeRecipes(Predicate toRemove); + // Collection removeRecipes(Predicate toRemove); + Collection removeUnregisteredRecipes(Predicate toRemove); /** Adds the given recipe to the registry. Note that this will remove any existing recipes for the passed * recipe's {@link IRefineryRecipe#in()} - * + * * @param recipe The recipe to add. * @return The input recipe. */ - R addRecipe(R recipe); +// R addRecipe(R recipe); + R addUnregisteredRecipe(R recipe); + +// // Calen +// RecipeType getRecipeType; } - interface IRefineryRecipe { + // interface IRefineryRecipe + interface IRefineryRecipe extends Recipe { FluidStack in(); } interface IHeatExchangerRecipe extends IRefineryRecipe { - @Nullable + // @Nullable FluidStack out(); int heatFrom(); @@ -67,15 +90,43 @@ interface IHeatExchangerRecipe extends IRefineryRecipe { int heatTo(); } - interface IHeatableRecipe extends IHeatExchangerRecipe {} + interface IHeatableRecipe extends IHeatExchangerRecipe { + public static final ResourceLocation TYPE_ID = new ResourceLocation(BCModules.FACTORY.getModId(), "heat_exchange/heatable"); + + public static final RecipeType TYPE = RecipeType.simple(TYPE_ID); - interface ICoolableRecipe extends IHeatExchangerRecipe {} + + @Override + default RecipeType getType() { + return TYPE; + } + } + + interface ICoolableRecipe extends IHeatExchangerRecipe { + public static final ResourceLocation TYPE_ID = new ResourceLocation(BCModules.FACTORY.getModId(), "heat_exchange/coolable"); + + public static final RecipeType TYPE = RecipeType.simple(TYPE_ID); + + @Override + default RecipeType getType() { + return TYPE; + } + } interface IDistillationRecipe extends IRefineryRecipe { + public static final ResourceLocation TYPE_ID = new ResourceLocation(BCModules.FACTORY.getModId(), "distillation"); + + public static final RecipeType TYPE = RecipeType.simple(TYPE_ID); + long powerRequired(); FluidStack outGas(); FluidStack outLiquid(); + + @Override + default RecipeType getType() { + return TYPE; + } } } diff --git a/api/buildcraft/api/recipes/IngredientStack.java b/api/buildcraft/api/recipes/IngredientStack.java index adbcdea..2dc1c9c 100644 --- a/api/buildcraft/api/recipes/IngredientStack.java +++ b/api/buildcraft/api/recipes/IngredientStack.java @@ -6,8 +6,12 @@ package buildcraft.api.recipes; -import net.minecraft.item.crafting.Ingredient; - +import com.google.gson.JsonElement; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; import net.minecraftforge.common.crafting.CraftingHelper; public final class IngredientStack { @@ -23,7 +27,31 @@ public IngredientStack(Ingredient ingredient) { this(ingredient, 1); } - public static IngredientStack of(Object o) { - return new IngredientStack(CraftingHelper.getIngredient(o)); + // public static IngredientStack of(Object o) + public static IngredientStack of(JsonElement o) { + return new IngredientStack(CraftingHelper.getIngredient(o, true)); + } + + public static IngredientStack of(ItemStack o) { + return new IngredientStack(Ingredient.of(o)); + } + + public static IngredientStack of(ItemLike o) { + return new IngredientStack(Ingredient.of(o)); + } + + public static IngredientStack of(TagKey tag) { + return new IngredientStack(Ingredient.of(tag)); + } + + public void toNetwork(FriendlyByteBuf buffer) { + buffer.writeInt(this.count); + this.ingredient.toNetwork(buffer); + } + + public static IngredientStack fromNetwork(FriendlyByteBuf buffer) { + int countIn = buffer.readInt(); + Ingredient ingredientIn = Ingredient.fromNetwork(buffer); + return new IngredientStack(ingredientIn, countIn); } } diff --git a/api/buildcraft/api/recipes/IntegrationRecipe.java b/api/buildcraft/api/recipes/IntegrationRecipe.java index 984404b..7dcc001 100644 --- a/api/buildcraft/api/recipes/IntegrationRecipe.java +++ b/api/buildcraft/api/recipes/IntegrationRecipe.java @@ -1,12 +1,11 @@ package buildcraft.api.recipes; -import javax.annotation.Nonnull; - import com.google.common.collect.ImmutableList; +import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; -import net.minecraft.util.ResourceLocation; +import javax.annotation.Nonnull; public abstract class IntegrationRecipe { public final ResourceLocation name; diff --git a/api/buildcraft/api/recipes/package-info.java b/api/buildcraft/api/recipes/package-info.java index 596d90d..0d35939 100644 --- a/api/buildcraft/api/recipes/package-info.java +++ b/api/buildcraft/api/recipes/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "3.0", owner = "buildcraftapi_core", provides = "buildcraftapi_recipes") +//@API(apiVersion = "3.0", owner = "buildcraftapi_core", provides = "buildcraftapi_recipes") package buildcraft.api.recipes; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/registry/EventBuildCraftReload.java b/api/buildcraft/api/registry/EventBuildCraftReload.java index 903a9c3..9cda724 100644 --- a/api/buildcraft/api/registry/EventBuildCraftReload.java +++ b/api/buildcraft/api/registry/EventBuildCraftReload.java @@ -1,16 +1,13 @@ package buildcraft.api.registry; -import java.util.Set; - -import javax.annotation.Nullable; - import com.google.gson.GsonBuilder; - -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; - +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fml.common.eventhandler.Event; + +import javax.annotation.Nullable; +import java.util.Set; public abstract class EventBuildCraftReload extends Event { @@ -29,7 +26,7 @@ public EventBuildCraftReload(IReloadableRegistryManager manager, Set> reloadingRegistries) { + @Nullable Set> reloadingRegistries) { super(manager, reloadingRegistries); } } @@ -50,7 +47,7 @@ public static class PopulateGson extends EventBuildCraftReload { public final GsonBuilder gsonBuilder; public PopulateGson(IReloadableRegistryManager manager, - @Nullable Set> reloadingRegistries, GsonBuilder gsonBuilder) { + @Nullable Set> reloadingRegistries, GsonBuilder gsonBuilder) { super(manager, reloadingRegistries); this.gsonBuilder = gsonBuilder; } @@ -68,7 +65,7 @@ public PostLoad(IReloadableRegistryManager manager, @Nullable Set> reloadingRegistries) { + @Nullable Set> reloadingRegistries) { super(manager, reloadingRegistries); } } diff --git a/api/buildcraft/api/registry/IReloadableRegistry.java b/api/buildcraft/api/registry/IReloadableRegistry.java index e973dad..61e0b1a 100644 --- a/api/buildcraft/api/registry/IReloadableRegistry.java +++ b/api/buildcraft/api/registry/IReloadableRegistry.java @@ -1,10 +1,10 @@ package buildcraft.api.registry; +import net.minecraft.resources.ResourceLocation; + import java.util.Collection; import java.util.Map; -import net.minecraft.util.ResourceLocation; - /** A registry of any Java object. This does not perform serialisation of any kind to the entries. */ public interface IReloadableRegistry { diff --git a/api/buildcraft/api/registry/IReloadableRegistryManager.java b/api/buildcraft/api/registry/IReloadableRegistryManager.java index 9c71ba1..f1a88bb 100644 --- a/api/buildcraft/api/registry/IReloadableRegistryManager.java +++ b/api/buildcraft/api/registry/IReloadableRegistryManager.java @@ -1,10 +1,10 @@ package buildcraft.api.registry; +import buildcraft.api.registry.IReloadableRegistry.PackType; + import java.util.Map; import java.util.Set; -import buildcraft.api.registry.IReloadableRegistry.PackType; - public interface IReloadableRegistryManager { PackType getType(); @@ -33,7 +33,7 @@ public interface IReloadableRegistryManager { Map> getAllRegistries(); /** Creates and registers a basic {@link IReloadableRegistry}. - * + * * @param name The name for the given registry. This should be unique, and the best way of doing that is to prefix * it with the modid, followed by a slash, and then the mod-unique name. * @throws IllegalArgumentException if name contains a colon. */ @@ -41,7 +41,7 @@ public interface IReloadableRegistryManager { /** Scripts will be loaded from "[pack_type.prefix]/[pack_name]/compat/[entry_path]/". The entryPath parameter * should start with the modid. - * + * * @param entryPath */ IScriptableRegistry createScriptableRegistry(String entryPath); diff --git a/api/buildcraft/api/registry/IScriptableRegistry.java b/api/buildcraft/api/registry/IScriptableRegistry.java index b6bae4d..048296e 100644 --- a/api/buildcraft/api/registry/IScriptableRegistry.java +++ b/api/buildcraft/api/registry/IScriptableRegistry.java @@ -1,16 +1,14 @@ package buildcraft.api.registry; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; import com.google.gson.JsonSyntaxException; +import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.ResourceLocation; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Map; +import java.util.Set; /** A type of {@link IReloadableRegistry} that can be configured with buildcraft style simple scripts. A full * description can be found [...] */ @@ -37,7 +35,7 @@ default void addCustomType(String name, IEntryDeserializer deserial } /** @return A {@link Set} (likely unmodifiable) that contains all of the - * {@link ResourceLocation#getResourceDomain()}'s that had added entries to this registry through + * {@link ResourceLocation#getNamespace()}'s that had added entries to this registry through * scripts. */ Set getSourceDomains(); @@ -56,7 +54,7 @@ public interface IEntryDeserializer { * @throws JsonSyntaxException if the input {@link JsonObject} was either missing required fields or had the * wrong type or data for those fields. */ OptionallyDisabled deserialize(ResourceLocation name, JsonObject obj, JsonDeserializationContext ctx) - throws JsonSyntaxException; + throws JsonSyntaxException; } /** Similar to {@link IEntryDeserializer} except that this guarantees that @@ -71,7 +69,7 @@ public interface ISimpleEntryDeserializer extends IEntryDeserializer { * {@link #deserializeConst(ResourceLocation, JsonObject, JsonDeserializationContext)} directly. */ @Override default OptionallyDisabled deserialize(ResourceLocation name, JsonObject obj, JsonDeserializationContext ctx) - throws JsonSyntaxException { + throws JsonSyntaxException { return new OptionallyDisabled<>(deserializeConst(name, obj, ctx)); } @@ -82,7 +80,7 @@ default OptionallyDisabled deserialize(ResourceLocation name, JsonObject obj, * @throws JsonSyntaxException if the input {@link JsonObject} was either missing required fields or had the * wrong type or data for those fields. */ E deserializeConst(ResourceLocation name, JsonObject obj, JsonDeserializationContext ctx) - throws JsonSyntaxException; + throws JsonSyntaxException; } /** A simple wrapper which either contains the object, or a string with a reason why it is allowed to be null. */ diff --git a/api/buildcraft/api/robots/AIRobot.java b/api/buildcraft/api/robots/AIRobot.java index 0fad582..1d23f7e 100755 --- a/api/buildcraft/api/robots/AIRobot.java +++ b/api/buildcraft/api/robots/AIRobot.java @@ -4,10 +4,9 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.robots; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - import buildcraft.api.mj.MjAPI; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; public class AIRobot { public EntityRobotBase robot; @@ -42,24 +41,24 @@ public void end() { } /** This gets called when a delegate AI ends work naturally. - * + * * @param ai The delegate AI which ended work. */ public void delegateAIEnded(AIRobot ai) { } /** This gets called when a delegate AI is forcibly aborted. - * + * * @param ai The delegate AI which was aborted. */ public void delegateAIAborted(AIRobot ai) { } - public void writeSelfToNBT(NBTTagCompound nbt) { + public void writeSelfToNBT(CompoundTag nbt) { } - public void loadSelfFromNBT(NBTTagCompound nbt) { + public void loadSelfFromNBT(CompoundTag nbt) { } @@ -155,30 +154,30 @@ public final AIRobot getDelegateAI() { return delegateAI; } - public final void writeToNBT(NBTTagCompound nbt) { - nbt.setString("aiName", RobotManager.getAIRobotName(getClass())); + public final void writeToNBT(CompoundTag nbt) { + nbt.putString("aiName", RobotManager.getAIRobotName(getClass())); - NBTTagCompound data = new NBTTagCompound(); + CompoundTag data = new CompoundTag(); writeSelfToNBT(data); - nbt.setTag("data", data); + nbt.put("data", data); if (delegateAI != null && delegateAI.canLoadFromNBT()) { - NBTTagCompound sub = new NBTTagCompound(); + CompoundTag sub = new CompoundTag(); delegateAI.writeToNBT(sub); - nbt.setTag("delegateAI", sub); + nbt.put("delegateAI", sub); } } - public final void loadFromNBT(NBTTagCompound nbt) { - loadSelfFromNBT(nbt.getCompoundTag("data")); + public final void loadFromNBT(CompoundTag nbt) { + loadSelfFromNBT(nbt.getCompound("data")); - if (nbt.hasKey("delegateAI")) { - NBTTagCompound sub = nbt.getCompoundTag("delegateAI"); + if (nbt.contains("delegateAI")) { + CompoundTag sub = nbt.getCompound("delegateAI"); try { Class aiRobotClass; - if (sub.hasKey("class")) { + if (sub.contains("class")) { // Migration support for 6.4.x aiRobotClass = RobotManager.getAIRobotByLegacyClassName(sub.getString("class")); } else { @@ -198,12 +197,12 @@ public final void loadFromNBT(NBTTagCompound nbt) { } } - public static AIRobot loadAI(NBTTagCompound nbt, EntityRobotBase robot) { + public static AIRobot loadAI(CompoundTag nbt, EntityRobotBase robot) { AIRobot ai = null; try { Class aiRobotClass; - if (nbt.hasKey("class")) { + if (nbt.contains("class")) { // Migration support for 6.4.x aiRobotClass = RobotManager.getAIRobotByLegacyClassName(nbt.getString("class")); } else { diff --git a/api/buildcraft/api/robots/DockingStation.java b/api/buildcraft/api/robots/DockingStation.java index d3237a0..6d4a8a8 100755 --- a/api/buildcraft/api/robots/DockingStation.java +++ b/api/buildcraft/api/robots/DockingStation.java @@ -4,24 +4,22 @@ * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.robots; -import java.util.Arrays; - -import net.minecraft.inventory.IInventory; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import net.minecraftforge.fluids.capability.IFluidHandler; - import buildcraft.api.core.BCLog; import buildcraft.api.core.EnumPipePart; import buildcraft.api.statements.StatementSlot; import buildcraft.api.transport.IInjectable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.Container; +import net.minecraft.world.level.Level; +import net.minecraftforge.fluids.capability.IFluidHandler; + +import java.util.Arrays; public abstract class DockingStation { - public EnumFacing side; - public World world; + public Direction side; + public Level world; private long robotTakingId = EntityRobotBase.NULL_ROBOT_ID; private EntityRobotBase robotTaking; @@ -30,12 +28,13 @@ public abstract class DockingStation { private BlockPos pos; - public DockingStation(BlockPos iIndex, EnumFacing iSide) { + public DockingStation(BlockPos iIndex, Direction iSide) { pos = iIndex; side = iSide; } - public DockingStation() {} + public DockingStation() { + } public boolean isMainStation() { return linkIsMain; @@ -45,7 +44,7 @@ public BlockPos getPos() { return pos; } - public EnumFacing side() { + public Direction side() { return side; } @@ -116,20 +115,20 @@ public void unsafeRelease(EntityRobotBase robot) { } } - public void writeToNBT(NBTTagCompound nbt) { - nbt.setIntArray("pos", new int[] { getPos().getX(), getPos().getY(), getPos().getZ() }); - nbt.setByte("side", (byte) side.ordinal()); - nbt.setBoolean("isMain", linkIsMain); - nbt.setLong("robotId", robotTakingId); + public void writeToNBT(CompoundTag nbt) { + nbt.putIntArray("pos", new int[] { getPos().getX(), getPos().getY(), getPos().getZ() }); + nbt.putByte("side", (byte) side.ordinal()); + nbt.putBoolean("isMain", linkIsMain); + nbt.putLong("robotId", robotTakingId); } - public void readFromNBT(NBTTagCompound nbt) { - if (nbt.hasKey("index")) { + public void readFromNBT(CompoundTag nbt) { + if (nbt.contains("index")) { // For compatibility with older versions of minecraft and buildcraft - NBTTagCompound indexNBT = nbt.getCompoundTag("index"); - int x = indexNBT.getInteger("i"); - int y = indexNBT.getInteger("j"); - int z = indexNBT.getInteger("k"); + CompoundTag indexNBT = nbt.getCompound("index"); + int x = indexNBT.getInt("i"); + int y = indexNBT.getInt("j"); + int z = indexNBT.getInt("k"); pos = new BlockPos(x, y, z); } else { int[] array = nbt.getIntArray("pos"); @@ -141,7 +140,7 @@ public void readFromNBT(NBTTagCompound nbt) { BCLog.logger.warn("Did not find any integer positions! This is a bug!"); } } - side = EnumFacing.values()[nbt.getByte("side")]; + side = Direction.VALUES[nbt.getByte("side")]; linkIsMain = nbt.getBoolean("isMain"); robotTakingId = nbt.getLong("robotId"); } @@ -189,7 +188,7 @@ public EnumPipePart getItemOutputSide() { return EnumPipePart.CENTER; } - public IInventory getItemInput() { + public Container getItemInput() { return null; } diff --git a/api/buildcraft/api/robots/EntityRobotBase.java b/api/buildcraft/api/robots/EntityRobotBase.java index 0e6439d..bc74a98 100755 --- a/api/buildcraft/api/robots/EntityRobotBase.java +++ b/api/buildcraft/api/robots/EntityRobotBase.java @@ -4,30 +4,29 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.robots; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import net.minecraftforge.items.IItemHandler; - import buildcraft.api.boards.RedstoneBoardRobot; import buildcraft.api.core.IFluidHandlerAdv; import buildcraft.api.core.IZone; import buildcraft.api.mj.MjAPI; import buildcraft.api.mj.MjBattery; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.items.IItemHandler; -public abstract class EntityRobotBase extends EntityLiving implements IItemHandler, IFluidHandlerAdv { +public abstract class EntityRobotBase extends LivingEntity implements IItemHandler, IFluidHandlerAdv { - public static final long MAX_POWER = 5000 * MjAPI.MJ; + public static final long MAX_POWER = 5000 * MjAPI.MJ; public static final long SAFETY_POWER = MAX_POWER / 5; public static final long SHUTDOWN_POWER = 0; public static final long NULL_ROBOT_ID = Long.MAX_VALUE; - public EntityRobotBase(World par1World) { - super(par1World); + public EntityRobotBase(EntityType entityType, Level par1World) { + super(entityType, par1World); } public abstract void setItemInUse(ItemStack stack); @@ -80,7 +79,7 @@ public long getPower() { public abstract void onChunkUnload(); - public abstract ItemStack receiveItem(TileEntity tile, ItemStack stack); + public abstract ItemStack receiveItem(BlockEntity tile, ItemStack stack); public abstract void setMainStation(DockingStation station); } diff --git a/api/buildcraft/api/robots/IRequestProvider.java b/api/buildcraft/api/robots/IRequestProvider.java index 2e56148..22dbcb8 100755 --- a/api/buildcraft/api/robots/IRequestProvider.java +++ b/api/buildcraft/api/robots/IRequestProvider.java @@ -4,7 +4,7 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.robots; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; /** Provide requests of items that need to be fulfilled. * diff --git a/api/buildcraft/api/robots/IRobotOverlayItem.java b/api/buildcraft/api/robots/IRobotOverlayItem.java index fa39ee1..6562302 100644 --- a/api/buildcraft/api/robots/IRobotOverlayItem.java +++ b/api/buildcraft/api/robots/IRobotOverlayItem.java @@ -1,14 +1,13 @@ package buildcraft.api.robots; import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.item.ItemStack; - -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public interface IRobotOverlayItem { boolean isValidRobotOverlay(ItemStack stack); - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) void renderRobotOverlay(ItemStack stack, TextureManager textureManager); } diff --git a/api/buildcraft/api/robots/IRobotRegistry.java b/api/buildcraft/api/robots/IRobotRegistry.java index 96360f5..e313b5b 100755 --- a/api/buildcraft/api/robots/IRobotRegistry.java +++ b/api/buildcraft/api/robots/IRobotRegistry.java @@ -4,11 +4,11 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.robots; -import java.util.Collection; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; +import java.util.Collection; public interface IRobotRegistry { @@ -36,7 +36,7 @@ public interface IRobotRegistry { void releaseResources(EntityRobotBase robot); - DockingStation getStation(BlockPos pos, EnumFacing side); + DockingStation getStation(BlockPos pos, Direction side); Collection getStations(); @@ -48,9 +48,9 @@ public interface IRobotRegistry { void release(DockingStation station, long robotId); - void writeToNBT(NBTTagCompound nbt); + void writeToNBT(CompoundTag nbt); - void readFromNBT(NBTTagCompound nbt); + void readFromNBT(CompoundTag nbt); void registryMarkDirty(); } diff --git a/api/buildcraft/api/robots/IRobotRegistryProvider.java b/api/buildcraft/api/robots/IRobotRegistryProvider.java index 0012494..e3eef09 100644 --- a/api/buildcraft/api/robots/IRobotRegistryProvider.java +++ b/api/buildcraft/api/robots/IRobotRegistryProvider.java @@ -1,7 +1,7 @@ package buildcraft.api.robots; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; public interface IRobotRegistryProvider { - IRobotRegistry getRegistry(World world); + IRobotRegistry getRegistry(Level world); } diff --git a/api/buildcraft/api/robots/ResourceId.java b/api/buildcraft/api/robots/ResourceId.java index 539503a..b7f17ac 100755 --- a/api/buildcraft/api/robots/ResourceId.java +++ b/api/buildcraft/api/robots/ResourceId.java @@ -4,22 +4,24 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.robots; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundTag; public abstract class ResourceId { - protected ResourceId() {} + protected ResourceId() { + } - public void writeToNBT(NBTTagCompound nbt) { - nbt.setString("resourceName", RobotManager.getResourceIdName(getClass())); + public void writeToNBT(CompoundTag nbt) { + nbt.putString("resourceName", RobotManager.getResourceIdName(getClass())); } - protected void readFromNBT(NBTTagCompound nbt) {} + protected void readFromNBT(CompoundTag nbt) { + } - public static ResourceId load(NBTTagCompound nbt) { + public static ResourceId load(CompoundTag nbt) { try { Class cls; - if (nbt.hasKey("class")) { + if (nbt.contains("class")) { // Migration support for 6.4.x cls = RobotManager.getResourceIdByLegacyClassName(nbt.getString("class")); } else { diff --git a/api/buildcraft/api/robots/ResourceIdBlock.java b/api/buildcraft/api/robots/ResourceIdBlock.java index 4e89a58..ad235db 100755 --- a/api/buildcraft/api/robots/ResourceIdBlock.java +++ b/api/buildcraft/api/robots/ResourceIdBlock.java @@ -4,13 +4,11 @@ * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.robots; -import org.apache.commons.lang3.builder.HashCodeBuilder; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; - import buildcraft.api.core.EnumPipePart; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.entity.BlockEntity; +import org.apache.commons.lang3.builder.HashCodeBuilder; public class ResourceIdBlock extends ResourceId { @@ -29,8 +27,8 @@ public ResourceIdBlock(BlockPos iIndex) { pos = iIndex; } - public ResourceIdBlock(TileEntity tile) { - pos = tile.getPos(); + public ResourceIdBlock(BlockEntity tile) { + pos = tile.getBlockPos(); } @Override @@ -51,21 +49,21 @@ public int hashCode() { } @Override - public void writeToNBT(NBTTagCompound nbt) { + public void writeToNBT(CompoundTag nbt) { super.writeToNBT(nbt); int[] arr = new int[] { pos.getX(), pos.getY(), pos.getZ() }; - nbt.setIntArray("pos", arr); + nbt.putIntArray("pos", arr); - nbt.setTag("side", side.writeToNBT()); + nbt.put("side", side.writeToNBT()); } @Override - protected void readFromNBT(NBTTagCompound nbt) { + protected void readFromNBT(CompoundTag nbt) { super.readFromNBT(nbt); int[] arr = nbt.getIntArray("pos"); pos = new BlockPos(arr[0], arr[1], arr[2]); - side = EnumPipePart.readFromNBT(nbt.getTag("side")); + side = EnumPipePart.readFromNBT(nbt.get("side")); } } diff --git a/api/buildcraft/api/robots/ResourceIdRequest.java b/api/buildcraft/api/robots/ResourceIdRequest.java index d224b8e..405728b 100755 --- a/api/buildcraft/api/robots/ResourceIdRequest.java +++ b/api/buildcraft/api/robots/ResourceIdRequest.java @@ -4,11 +4,9 @@ * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.robots; -import org.apache.commons.lang3.builder.HashCodeBuilder; - -import net.minecraft.nbt.NBTTagCompound; - import buildcraft.api.core.EnumPipePart; +import net.minecraft.nbt.CompoundTag; +import org.apache.commons.lang3.builder.HashCodeBuilder; public class ResourceIdRequest extends ResourceIdBlock { @@ -39,16 +37,16 @@ public int hashCode() { } @Override - public void writeToNBT(NBTTagCompound nbt) { + public void writeToNBT(CompoundTag nbt) { super.writeToNBT(nbt); - nbt.setInteger("localId", slot); + nbt.putInt("localId", slot); } @Override - protected void readFromNBT(NBTTagCompound nbt) { + protected void readFromNBT(CompoundTag nbt) { super.readFromNBT(nbt); - slot = nbt.getInteger("localId"); + slot = nbt.getInt("localId"); } } diff --git a/api/buildcraft/api/robots/RobotManager.java b/api/buildcraft/api/robots/RobotManager.java index 7c712c9..98dd22b 100644 --- a/api/buildcraft/api/robots/RobotManager.java +++ b/api/buildcraft/api/robots/RobotManager.java @@ -4,12 +4,12 @@ * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.robots; +import buildcraft.api.core.BCLog; + import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -import buildcraft.api.core.BCLog; - public abstract class RobotManager { public static IRobotRegistryProvider registryProvider; public static ArrayList> aiRobots = new ArrayList<>(); diff --git a/api/buildcraft/api/robots/package-info.java b/api/buildcraft/api/robots/package-info.java index 6196069..591fd15 100644 --- a/api/buildcraft/api/robots/package-info.java +++ b/api/buildcraft/api/robots/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "3.0", owner = "buildcraftapi_core", provides = "buildcraftapi_robotics") +//@API(apiVersion = "3.0", owner = "buildcraftapi_core", provides = "buildcraftapi_robotics") package buildcraft.api.robots; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/schematics/ISchematicBlock.java b/api/buildcraft/api/schematics/ISchematicBlock.java index 3ae62ed..d250f32 100644 --- a/api/buildcraft/api/schematics/ISchematicBlock.java +++ b/api/buildcraft/api/schematics/ISchematicBlock.java @@ -1,21 +1,19 @@ package buildcraft.api.schematics; +import buildcraft.api.core.IFakeWorld; +import buildcraft.api.core.InvalidInputDataException; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Rotation; +import net.minecraftforge.fluids.FluidStack; + +import javax.annotation.Nonnull; import java.util.Collections; import java.util.List; import java.util.Set; -import javax.annotation.Nonnull; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import net.minecraftforge.fluids.FluidStack; - -import buildcraft.api.core.InvalidInputDataException; - public interface ISchematicBlock { void init(SchematicBlockContext context); @@ -40,20 +38,21 @@ default List computeRequiredFluids() { ISchematicBlock getRotated(Rotation rotation); - boolean canBuild(World world, BlockPos blockPos); + boolean canBuild(Level world, BlockPos blockPos); - default boolean isReadyToBuild(World world, BlockPos blockPos) { + default boolean isReadyToBuild(Level world, BlockPos blockPos) { return true; } - boolean build(World world, BlockPos blockPos); + boolean build(Level world, BlockPos blockPos); - boolean buildWithoutChecks(World world, BlockPos blockPos); + // boolean buildWithoutChecks(Level world, BlockPos blockPos); + boolean buildWithoutChecks(IFakeWorld world, BlockPos blockPos); - boolean isBuilt(World world, BlockPos blockPos); + boolean isBuilt(Level world, BlockPos blockPos); - NBTTagCompound serializeNBT(); + CompoundTag serializeNBT(); /** @throws InvalidInputDataException If the input data wasn't correct or didn't make sense. */ - void deserializeNBT(NBTTagCompound nbt) throws InvalidInputDataException; + void deserializeNBT(CompoundTag nbt) throws InvalidInputDataException; } diff --git a/api/buildcraft/api/schematics/ISchematicEntity.java b/api/buildcraft/api/schematics/ISchematicEntity.java index b026f3b..4b9805e 100644 --- a/api/buildcraft/api/schematics/ISchematicEntity.java +++ b/api/buildcraft/api/schematics/ISchematicEntity.java @@ -1,26 +1,23 @@ package buildcraft.api.schematics; -import java.util.Collections; -import java.util.List; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.Entity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - +import buildcraft.api.core.InvalidInputDataException; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.fluids.FluidStack; -import buildcraft.api.core.InvalidInputDataException; +import javax.annotation.Nonnull; +import java.util.Collections; +import java.util.List; public interface ISchematicEntity { void init(SchematicEntityContext context); - Vec3d getPos(); + Vec3 getPos(); @Nonnull default List computeRequiredItems() { @@ -34,12 +31,12 @@ default List computeRequiredFluids() { ISchematicEntity getRotated(Rotation rotation); - Entity build(World world, BlockPos basePos); + Entity build(Level world, BlockPos basePos); - Entity buildWithoutChecks(World world, BlockPos basePos); + Entity buildWithoutChecks(Level world, BlockPos basePos); - NBTTagCompound serializeNBT(); + CompoundTag serializeNBT(); /** @throws InvalidInputDataException If the input data wasn't correct or didn't make sense. */ - void deserializeNBT(NBTTagCompound nbt) throws InvalidInputDataException; + void deserializeNBT(CompoundTag nbt) throws InvalidInputDataException; } diff --git a/api/buildcraft/api/schematics/SchematicBlockContext.java b/api/buildcraft/api/schematics/SchematicBlockContext.java index 0ca9853..09126c0 100644 --- a/api/buildcraft/api/schematics/SchematicBlockContext.java +++ b/api/buildcraft/api/schematics/SchematicBlockContext.java @@ -1,28 +1,28 @@ package buildcraft.api.schematics; -import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import javax.annotation.Nonnull; public class SchematicBlockContext { @Nonnull - public final World world; + public final Level world; @Nonnull public final BlockPos basePos; @Nonnull public final BlockPos pos; @Nonnull - public final IBlockState blockState; + public final BlockState blockState; @Nonnull public final Block block; - public SchematicBlockContext(@Nonnull World world, + public SchematicBlockContext(@Nonnull Level world, @Nonnull BlockPos basePos, @Nonnull BlockPos pos, - @Nonnull IBlockState blockState, + @Nonnull BlockState blockState, @Nonnull Block block) { this.world = world; this.basePos = basePos; diff --git a/api/buildcraft/api/schematics/SchematicBlockFactory.java b/api/buildcraft/api/schematics/SchematicBlockFactory.java index bf57fb1..b107284 100644 --- a/api/buildcraft/api/schematics/SchematicBlockFactory.java +++ b/api/buildcraft/api/schematics/SchematicBlockFactory.java @@ -1,11 +1,10 @@ package buildcraft.api.schematics; -import java.util.function.Predicate; -import java.util.function.Supplier; +import net.minecraft.resources.ResourceLocation; import javax.annotation.Nonnull; - -import net.minecraft.util.ResourceLocation; +import java.util.function.Predicate; +import java.util.function.Supplier; public class SchematicBlockFactory implements Comparable> { @Nonnull diff --git a/api/buildcraft/api/schematics/SchematicBlockFactoryRegistry.java b/api/buildcraft/api/schematics/SchematicBlockFactoryRegistry.java index d88de20..fee0270 100644 --- a/api/buildcraft/api/schematics/SchematicBlockFactoryRegistry.java +++ b/api/buildcraft/api/schematics/SchematicBlockFactoryRegistry.java @@ -1,33 +1,37 @@ package buildcraft.api.schematics; +import buildcraft.api.core.BuildCraftAPI; +import com.google.common.collect.ImmutableList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.List; import java.util.Set; -import java.util.TreeSet; +import java.util.concurrent.ConcurrentSkipListSet; import java.util.function.Predicate; import java.util.function.Supplier; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import com.google.common.collect.ImmutableList; - -import net.minecraft.block.Block; -import net.minecraft.util.ResourceLocation; - -import buildcraft.api.core.BuildCraftAPI; - public class SchematicBlockFactoryRegistry { - private static final Set> FACTORIES = new TreeSet<>(); + // private static final Set> FACTORIES = new TreeSet<>(); + private static final Set> FACTORIES = new ConcurrentSkipListSet<>(); - public static void registerFactory(String name, - int priority, - Predicate predicate, - Supplier supplier) { - FACTORIES.add(new SchematicBlockFactory<>( - BuildCraftAPI.nameToResourceLocation(name), - priority, - predicate, - supplier + // Calen thread safety: sometimes "air" not registered just after BCBuildersSchematics#preInit:registerSchematicFactory("air", 0, SchematicBlockAir::predicate, SchematicBlockAir::new) + public synchronized static Set> getFactoriesSynchronized() { + return FACTORIES; + } + + public static synchronized void registerFactory(String name, + int priority, + Predicate predicate, + Supplier supplier) { +// FACTORIES.add(new SchematicBlockFactory<>( + getFactoriesSynchronized().add(new SchematicBlockFactory<>( + BuildCraftAPI.nameToResourceLocation(name), + priority, + predicate, + supplier )); } @@ -36,31 +40,34 @@ public static void registerFactory(String name, List blocks, Supplier supplier) { registerFactory( - name, - priority, - context -> blocks.contains(context.block), - supplier + name, + priority, + context -> blocks.contains(context.block), + supplier ); } public static List> getFactories() { - return ImmutableList.copyOf(FACTORIES); +// return ImmutableList.copyOf(FACTORIES); + return ImmutableList.copyOf(getFactoriesSynchronized()); } @Nonnull public static SchematicBlockFactory getFactoryByInstance(S instance) { // noinspection unchecked - return (SchematicBlockFactory) FACTORIES.stream() - .filter(schematicBlockFactory -> schematicBlockFactory.clazz == instance.getClass()) - .findFirst() - .orElseThrow(() -> new IllegalStateException("Didn't find a factory for " + instance.getClass())); +// return (SchematicBlockFactory) FACTORIES.stream() + return (SchematicBlockFactory) getFactoriesSynchronized().stream() + .filter(schematicBlockFactory -> schematicBlockFactory.clazz == instance.getClass()) + .findFirst() + .orElseThrow(() -> new IllegalStateException("Didn't find a factory for " + instance.getClass())); } @Nullable public static SchematicBlockFactory getFactoryByName(ResourceLocation name) { - return FACTORIES.stream() - .filter(schematicBlockFactory -> schematicBlockFactory.name.equals(name)) - .findFirst() - .orElse(null); +// return FACTORIES.stream() + return getFactoriesSynchronized().stream() + .filter(schematicBlockFactory -> schematicBlockFactory.name.equals(name)) + .findFirst() + .orElse(null); } } diff --git a/api/buildcraft/api/schematics/SchematicEntityContext.java b/api/buildcraft/api/schematics/SchematicEntityContext.java index b812556..11c63ac 100644 --- a/api/buildcraft/api/schematics/SchematicEntityContext.java +++ b/api/buildcraft/api/schematics/SchematicEntityContext.java @@ -1,20 +1,20 @@ package buildcraft.api.schematics; -import javax.annotation.Nonnull; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import javax.annotation.Nonnull; public class SchematicEntityContext { @Nonnull - public final World world; + public final Level world; @Nonnull public final BlockPos basePos; @Nonnull public final Entity entity; - public SchematicEntityContext(@Nonnull World world, + public SchematicEntityContext(@Nonnull Level world, @Nonnull BlockPos basePos, @Nonnull Entity entity) { this.world = world; diff --git a/api/buildcraft/api/schematics/SchematicEntityFactory.java b/api/buildcraft/api/schematics/SchematicEntityFactory.java index a81a52a..9c64672 100644 --- a/api/buildcraft/api/schematics/SchematicEntityFactory.java +++ b/api/buildcraft/api/schematics/SchematicEntityFactory.java @@ -1,11 +1,10 @@ package buildcraft.api.schematics; -import java.util.function.Predicate; -import java.util.function.Supplier; +import net.minecraft.resources.ResourceLocation; import javax.annotation.Nonnull; - -import net.minecraft.util.ResourceLocation; +import java.util.function.Predicate; +import java.util.function.Supplier; public class SchematicEntityFactory implements Comparable> { @Nonnull diff --git a/api/buildcraft/api/schematics/SchematicEntityFactoryRegistry.java b/api/buildcraft/api/schematics/SchematicEntityFactoryRegistry.java index a5525b1..37b11ec 100644 --- a/api/buildcraft/api/schematics/SchematicEntityFactoryRegistry.java +++ b/api/buildcraft/api/schematics/SchematicEntityFactoryRegistry.java @@ -1,21 +1,17 @@ package buildcraft.api.schematics; +import buildcraft.api.core.BuildCraftAPI; +import com.google.common.collect.ImmutableList; +import net.minecraft.resources.ResourceLocation; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.List; import java.util.Set; import java.util.TreeSet; import java.util.function.Predicate; import java.util.function.Supplier; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import com.google.common.collect.ImmutableList; - -import net.minecraft.entity.EntityList; -import net.minecraft.util.ResourceLocation; - -import buildcraft.api.core.BuildCraftAPI; - public class SchematicEntityFactoryRegistry { private static final Set> FACTORIES = new TreeSet<>(); @@ -24,22 +20,27 @@ public static void registerFactory(String name, Predicate predicate, Supplier supplier) { FACTORIES.add(new SchematicEntityFactory<>( - BuildCraftAPI.nameToResourceLocation(name), - priority, - predicate, - supplier + BuildCraftAPI.nameToResourceLocation(name), + priority, + predicate, + supplier )); } - public static void registerFactory(String name, - int priority, - List entities, - Supplier supplier) { + // Calen no usage in 1.12.2 + // EntityList.class not present in 1.18.2 + public static void registerFactory( + String name, + int priority, + List entities, + Supplier supplier + ) { registerFactory( - name, - priority, - context -> entities.contains(EntityList.getKey(context.entity)), - supplier + name, + priority, +// context -> entities.contains(EntityList.getKey(context.entity)), + context -> entities.contains(context.entity.getType().builtInRegistryHolder().key().location()), + supplier ); } @@ -51,16 +52,16 @@ public static List> getFactories() { public static SchematicEntityFactory getFactoryByInstance(S instance) { // noinspection unchecked return (SchematicEntityFactory) FACTORIES.stream() - .filter(schematicEntityFactory -> schematicEntityFactory.clazz == instance.getClass()) - .findFirst() - .orElseThrow(() -> new IllegalStateException("Didn't find a factory for " + instance.getClass())); + .filter(schematicEntityFactory -> schematicEntityFactory.clazz == instance.getClass()) + .findFirst() + .orElseThrow(() -> new IllegalStateException("Didn't find a factory for " + instance.getClass())); } @Nullable public static SchematicEntityFactory getFactoryByName(ResourceLocation name) { return FACTORIES.stream() - .filter(schematicEntityFactory -> schematicEntityFactory.name.equals(name)) - .findFirst() - .orElse(null); + .filter(schematicEntityFactory -> schematicEntityFactory.name.equals(name)) + .findFirst() + .orElse(null); } } diff --git a/api/buildcraft/api/statements/IAction.java b/api/buildcraft/api/statements/IAction.java index 2cd0c35..1af6d00 100644 --- a/api/buildcraft/api/statements/IAction.java +++ b/api/buildcraft/api/statements/IAction.java @@ -3,4 +3,5 @@ /** Marker interface that designates a class as being an action. Note that you *must* implement ONE of the following * interfaces to be recognised as an action: {@link IActionInternal}, {@link IActionInternalSided}, or * {@link IActionExternal} */ -public interface IAction extends IStatement {} +public interface IAction extends IStatement { +} diff --git a/api/buildcraft/api/statements/IActionExternal.java b/api/buildcraft/api/statements/IActionExternal.java index 9086612..0795ddb 100644 --- a/api/buildcraft/api/statements/IActionExternal.java +++ b/api/buildcraft/api/statements/IActionExternal.java @@ -4,9 +4,9 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.statements; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.entity.BlockEntity; public interface IActionExternal extends IAction { - void actionActivate(TileEntity target, EnumFacing side, IStatementContainer source, IStatementParameter[] parameters); + void actionActivate(BlockEntity target, Direction side, IStatementContainer source, IStatementParameter[] parameters); } diff --git a/api/buildcraft/api/statements/IActionInternalSided.java b/api/buildcraft/api/statements/IActionInternalSided.java index 0ae3d70..571cabb 100644 --- a/api/buildcraft/api/statements/IActionInternalSided.java +++ b/api/buildcraft/api/statements/IActionInternalSided.java @@ -1,7 +1,7 @@ package buildcraft.api.statements; -import net.minecraft.util.EnumFacing; +import net.minecraft.core.Direction; public interface IActionInternalSided extends IAction { - void actionActivate(EnumFacing side, IStatementContainer source, IStatementParameter[] parameters); + void actionActivate(Direction side, IStatementContainer source, IStatementParameter[] parameters); } diff --git a/api/buildcraft/api/statements/IActionProvider.java b/api/buildcraft/api/statements/IActionProvider.java index fa550ff..80c4141 100644 --- a/api/buildcraft/api/statements/IActionProvider.java +++ b/api/buildcraft/api/statements/IActionProvider.java @@ -4,17 +4,16 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.statements; -import java.util.Collection; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.entity.BlockEntity; import javax.annotation.Nonnull; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import java.util.Collection; public interface IActionProvider { void addInternalActions(Collection actions, IStatementContainer container); - void addInternalSidedActions(Collection actions, IStatementContainer container, @Nonnull EnumFacing side); + void addInternalSidedActions(Collection actions, IStatementContainer container, @Nonnull Direction side); - void addExternalActions(Collection actions, @Nonnull EnumFacing side, TileEntity tile); + void addExternalActions(Collection actions, @Nonnull Direction side, BlockEntity tile); } diff --git a/api/buildcraft/api/statements/IGuiSlot.java b/api/buildcraft/api/statements/IGuiSlot.java index f5cb3b2..528d052 100644 --- a/api/buildcraft/api/statements/IGuiSlot.java +++ b/api/buildcraft/api/statements/IGuiSlot.java @@ -1,16 +1,14 @@ package buildcraft.api.statements; -import java.util.List; - -import javax.annotation.Nullable; - -import com.google.common.collect.ImmutableList; - -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - import buildcraft.api.core.IConvertable; import buildcraft.api.core.render.ISprite; +import com.google.common.collect.ImmutableList; +import net.minecraft.network.chat.Component; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import javax.annotation.Nullable; +import java.util.List; public interface IGuiSlot extends IConvertable { /** Every statement needs a unique tag, it should be in the format of "<modid>:<name>". @@ -20,21 +18,39 @@ public interface IGuiSlot extends IConvertable { /** Return the description in the UI. Note that this should NEVER be called directly, instead this acts as a bridge * for {@link #getTooltip()}. (As such this might return null or throw an exception) */ - @SideOnly(Side.CLIENT) - String getDescription(); + @OnlyIn(Dist.CLIENT) +// String getDescription(); + Component getDescription(); + + // Calen + @OnlyIn(Dist.CLIENT) + String getDescriptionKey(); /** @return The full tooltip for the UI. */ - @SideOnly(Side.CLIENT) - default List getTooltip() { - String desc = getDescription(); + @OnlyIn(Dist.CLIENT) + default List getTooltip() { +// String desc = getDescription(); + Component desc = getDescription(); + if (desc == null) { + return ImmutableList.of(); + } +// return ImmutableList.of(Component.literal(desc)); + return ImmutableList.of(desc); + } + + // Calen + @OnlyIn(Dist.CLIENT) + default List getTooltipKey() { + String desc = getDescriptionKey(); if (desc == null) { return ImmutableList.of(); } +// return ImmutableList.of(Component.literal(desc)); return ImmutableList.of(desc); } /** @return A sprite to show in a GUI, or null if this should not render a sprite. */ - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) @Nullable ISprite getSprite(); } diff --git a/api/buildcraft/api/statements/IStatement.java b/api/buildcraft/api/statements/IStatement.java index b8d61a9..361157a 100644 --- a/api/buildcraft/api/statements/IStatement.java +++ b/api/buildcraft/api/statements/IStatement.java @@ -21,7 +21,7 @@ public interface IStatement extends IGuiSlot { * this checks the classes of the old and new parameters, however it is sensible to override this check in case the * parameters given no longer match. For example if you return {@link StatementParameterItemStack} from * {@link #createParameter(int)} and require the stack to match a filter, but the incoming stack might not. - * + * * @param old * @param index * @return */ diff --git a/api/buildcraft/api/statements/IStatementContainer.java b/api/buildcraft/api/statements/IStatementContainer.java index e08a7e8..0ce1941 100644 --- a/api/buildcraft/api/statements/IStatementContainer.java +++ b/api/buildcraft/api/statements/IStatementContainer.java @@ -4,15 +4,15 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.statements; -import javax.annotation.Nullable; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import javax.annotation.Nullable; /** This is implemented by objects containing Statements, such as Gates and TileEntities. */ public interface IStatementContainer { - TileEntity getTile(); + BlockEntity getTile(); @Nullable - TileEntity getNeighbourTile(EnumFacing side); + BlockEntity getNeighbourTile(Direction side); } diff --git a/api/buildcraft/api/statements/IStatementParameter.java b/api/buildcraft/api/statements/IStatementParameter.java index d90b380..e03889e 100755 --- a/api/buildcraft/api/statements/IStatementParameter.java +++ b/api/buildcraft/api/statements/IStatementParameter.java @@ -4,14 +4,13 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.statements; -import javax.annotation.Nonnull; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; - import buildcraft.api.statements.StatementManager.IParamReaderBuf; import buildcraft.api.statements.StatementManager.IParameterReader; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; + +import javax.annotation.Nonnull; public interface IStatementParameter extends IGuiSlot { @@ -26,25 +25,25 @@ default DrawType getDrawType() { /** Return a non-null value to be set as the statement parameter if you handled the mouse click and do not want all * possible values to be shown, or null if you did nothing and wish to show all possible values. - * + * * @see #getPossible(IStatementContainer) */ IStatementParameter onClick(IStatementContainer source, IStatement stmt, ItemStack stack, - StatementMouseClick mouse); + StatementMouseClick mouse); - void writeToNbt(NBTTagCompound nbt); + void writeToNbt(CompoundTag nbt); - /** Writes this parameter to the given {@link PacketBuffer}. The default implementation writes out the value of - * {@link #writeToNbt(NBTTagCompound)}, and that will be passed back into - * {@link IParameterReader#readFromNbt(NBTTagCompound)}. + /** Writes this parameter to the given {@link FriendlyByteBuf}. The default implementation writes out the value of + * {@link #writeToNbt(CompoundTag)}, and that will be passed back into + * {@link IParameterReader#readFromNbt(CompoundTag)}. *

    * It is likely that implementors can write a more compact form of themselves, so they are encouraged to override * this and also register an {@link IParamReaderBuf} in * {@link StatementManager#registerParameter(String, IParamReaderBuf)} or * {@link StatementManager#registerParameter(IParameterReader, IParamReaderBuf)} */ - default void writeToBuf(PacketBuffer buffer) { - NBTTagCompound nbt = new NBTTagCompound(); + default void writeToBuf(FriendlyByteBuf buffer) { + CompoundTag nbt = new CompoundTag(); writeToNbt(nbt); - buffer.writeCompoundTag(nbt); + buffer.writeNbt(nbt); } /** This returns the parameter after a left rotation. Used in particular in blueprints orientation. */ diff --git a/api/buildcraft/api/statements/ITrigger.java b/api/buildcraft/api/statements/ITrigger.java index cdb65c9..46e31e7 100644 --- a/api/buildcraft/api/statements/ITrigger.java +++ b/api/buildcraft/api/statements/ITrigger.java @@ -3,4 +3,5 @@ /** Marker interface that designates a class as being a trigger. Note that you *must* implement ONE of the following * interfaces to be recognised as a trigger: {@link ITriggerInternal}, {@link ITriggerInternalSided}, or * {@link ITriggerExternal} */ -public interface ITrigger extends IStatement {} +public interface ITrigger extends IStatement { +} diff --git a/api/buildcraft/api/statements/ITriggerExternal.java b/api/buildcraft/api/statements/ITriggerExternal.java index 87a848f..453371a 100644 --- a/api/buildcraft/api/statements/ITriggerExternal.java +++ b/api/buildcraft/api/statements/ITriggerExternal.java @@ -4,11 +4,11 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.statements; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.entity.BlockEntity; public interface ITriggerExternal extends ITrigger { - boolean isTriggerActive(TileEntity target, EnumFacing side, IStatementContainer source, IStatementParameter[] parameters); + boolean isTriggerActive(BlockEntity target, Direction side, IStatementContainer source, IStatementParameter[] parameters); } diff --git a/api/buildcraft/api/statements/ITriggerExternalOverride.java b/api/buildcraft/api/statements/ITriggerExternalOverride.java index 9b1fd1e..5e7db16 100644 --- a/api/buildcraft/api/statements/ITriggerExternalOverride.java +++ b/api/buildcraft/api/statements/ITriggerExternalOverride.java @@ -1,6 +1,6 @@ package buildcraft.api.statements; -import net.minecraft.util.EnumFacing; +import net.minecraft.core.Direction; /** This interface can be used by tiles to override external trigger behaviour. * @@ -12,5 +12,5 @@ enum Result { IGNORE } - Result override(EnumFacing side, IStatementContainer source, ITriggerExternal trigger, IStatementParameter[] parameters); + Result override(Direction side, IStatementContainer source, ITriggerExternal trigger, IStatementParameter[] parameters); } diff --git a/api/buildcraft/api/statements/ITriggerInternalSided.java b/api/buildcraft/api/statements/ITriggerInternalSided.java index 73459f0..7298c30 100644 --- a/api/buildcraft/api/statements/ITriggerInternalSided.java +++ b/api/buildcraft/api/statements/ITriggerInternalSided.java @@ -1,7 +1,7 @@ package buildcraft.api.statements; -import net.minecraft.util.EnumFacing; +import net.minecraft.core.Direction; public interface ITriggerInternalSided extends ITrigger { - boolean isTriggerActive(EnumFacing side, IStatementContainer source, IStatementParameter[] parameters); + boolean isTriggerActive(Direction side, IStatementContainer source, IStatementParameter[] parameters); } diff --git a/api/buildcraft/api/statements/ITriggerProvider.java b/api/buildcraft/api/statements/ITriggerProvider.java index 8f3bf03..a78de97 100644 --- a/api/buildcraft/api/statements/ITriggerProvider.java +++ b/api/buildcraft/api/statements/ITriggerProvider.java @@ -4,18 +4,17 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.statements; -import java.util.Collection; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.entity.BlockEntity; import javax.annotation.Nonnull; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import java.util.Collection; public interface ITriggerProvider { void addInternalTriggers(Collection triggers, IStatementContainer container); - void addInternalSidedTriggers(Collection triggers, IStatementContainer container, @Nonnull EnumFacing side); + void addInternalSidedTriggers(Collection triggers, IStatementContainer container, @Nonnull Direction side); /** Returns the list of triggers available to a gate next to the given block. */ - void addExternalTriggers(Collection triggers, @Nonnull EnumFacing side, TileEntity tile); + void addExternalTriggers(Collection triggers, @Nonnull Direction side, BlockEntity tile); } diff --git a/api/buildcraft/api/statements/StatementManager.java b/api/buildcraft/api/statements/StatementManager.java index 49f0915..f854f5e 100644 --- a/api/buildcraft/api/statements/StatementManager.java +++ b/api/buildcraft/api/statements/StatementManager.java @@ -4,21 +4,15 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.statements; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.level.block.entity.BlockEntity; + import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import java.util.*; public final class StatementManager { - public static Map statements = new HashMap<>(); public static Map parameters = new HashMap<>(); public static Map paramsBuf = new HashMap<>(); @@ -31,16 +25,17 @@ public final class StatementManager { @FunctionalInterface public interface IParameterReader { - IStatementParameter readFromNbt(NBTTagCompound nbt); + IStatementParameter readFromNbt(CompoundTag nbt); } @FunctionalInterface public interface IParamReaderBuf { - IStatementParameter readFromBuf(PacketBuffer buffer) throws IOException; + IStatementParameter readFromBuf(FriendlyByteBuf buffer) throws IOException; } /** Deactivate constructor */ - private StatementManager() {} + private StatementManager() { + } public static void registerTriggerProvider(ITriggerProvider provider) { if (provider != null && !triggerProviders.contains(provider)) { @@ -59,11 +54,11 @@ public static void registerStatement(IStatement statement) { } public static void registerParameter(IParameterReader reader) { - registerParameter(reader, buf -> reader.readFromNbt(buf.readCompoundTag())); + registerParameter(reader, buf -> reader.readFromNbt(buf.readNbt())); } public static void registerParameter(IParameterReader reader, IParamReaderBuf bufReader) { - String name = reader.readFromNbt(new NBTTagCompound()).getUniqueTag(); + String name = reader.readFromNbt(new CompoundTag()).getUniqueTag(); registerParameter(name, reader); registerParameter(name, bufReader); } @@ -76,7 +71,7 @@ public static void registerParameter(String name, IParamReaderBuf reader) { paramsBuf.put(name, reader); } - public static List getExternalTriggers(EnumFacing side, TileEntity entity) { + public static List getExternalTriggers(Direction side, BlockEntity entity) { if (entity instanceof IOverrideDefaultStatements) { List result = ((IOverrideDefaultStatements) entity).overrideTriggers(); if (result != null) { @@ -93,7 +88,7 @@ public static List getExternalTriggers(EnumFacing side, TileEn return new ArrayList<>(triggers); } - public static List getExternalActions(EnumFacing side, TileEntity entity) { + public static List getExternalActions(Direction side, BlockEntity entity) { if (entity instanceof IOverrideDefaultStatements) { List result = ((IOverrideDefaultStatements) entity).overrideActions(); if (result != null) { @@ -130,7 +125,7 @@ public static List getInternalActions(IStatementContainer conta return new ArrayList<>(actions); } - public static List getInternalSidedTriggers(IStatementContainer container, EnumFacing side) { + public static List getInternalSidedTriggers(IStatementContainer container, Direction side) { LinkedHashSet triggers = new LinkedHashSet<>(); for (ITriggerProvider provider : triggerProviders) { @@ -140,7 +135,7 @@ public static List getInternalSidedTriggers(IStatementCon return new ArrayList<>(triggers); } - public static List getInternalSidedActions(IStatementContainer container, EnumFacing side) { + public static List getInternalSidedActions(IStatementContainer container, Direction side) { LinkedHashSet actions = new LinkedHashSet<>(); for (IActionProvider provider : actionProviders) { diff --git a/api/buildcraft/api/statements/StatementParameterItemStack.java b/api/buildcraft/api/statements/StatementParameterItemStack.java index 253bd46..9577946 100755 --- a/api/buildcraft/api/statements/StatementParameterItemStack.java +++ b/api/buildcraft/api/statements/StatementParameterItemStack.java @@ -1,25 +1,23 @@ /** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com * - * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which - * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ + * BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents + * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.statements; -import java.util.List; -import java.util.Objects; - -import javax.annotation.Nonnull; - +import buildcraft.api.core.render.ISprite; import com.google.common.collect.ImmutableList; +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.text.TextFormatting; - -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import buildcraft.api.core.render.ISprite; +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; public class StatementParameterItemStack implements IStatementParameter { // needed because ItemStack.EMPTY doesn't have @Nonnull applied to it :/ @@ -47,8 +45,8 @@ public StatementParameterItemStack(@Nonnull ItemStack stack) { this.stack = stack; } - public StatementParameterItemStack(NBTTagCompound nbt) { - ItemStack read = new ItemStack(nbt.getCompoundTag("stack")); + public StatementParameterItemStack(CompoundTag nbt) { + ItemStack read = ItemStack.of(nbt.getCompound("stack")); if (read.isEmpty()) { stack = EMPTY_STACK; } else { @@ -57,11 +55,11 @@ public StatementParameterItemStack(NBTTagCompound nbt) { } @Override - public void writeToNbt(NBTTagCompound compound) { + public void writeToNbt(CompoundTag compound) { if (!stack.isEmpty()) { - NBTTagCompound tagCompound = new NBTTagCompound(); - stack.writeToNBT(tagCompound); - compound.setTag("stack", tagCompound); + CompoundTag tagCompound = new CompoundTag(); + stack.save(tagCompound); + compound.put("stack", tagCompound); } } @@ -78,7 +76,7 @@ public ItemStack getItemStack() { @Override public StatementParameterItemStack onClick( - IStatementContainer source, IStatement stmt, ItemStack stack, StatementMouseClick mouse + IStatementContainer source, IStatement stmt, ItemStack stack, StatementMouseClick mouse ) { if (stack.isEmpty()) { return EMPTY; @@ -94,8 +92,9 @@ public boolean equals(Object object) { if (object instanceof StatementParameterItemStack) { StatementParameterItemStack param = (StatementParameterItemStack) object; - return ItemStack.areItemStacksEqual(stack, param.stack) - && ItemStack.areItemStackTagsEqual(stack, param.stack); +// return ItemStack.areItemStacksEqual(stack, param.stack) +// && ItemStack.areItemStackTagsEqual(stack, param.stack); + return ItemStack.matches(stack, param.stack); } else { return false; } @@ -107,27 +106,50 @@ public int hashCode() { } @Override - @SideOnly(Side.CLIENT) - public String getDescription() { + @OnlyIn(Dist.CLIENT) + public Component getDescription() { + throw new UnsupportedOperationException("Don't call getDescription directly!"); + } + + @Override + @OnlyIn(Dist.CLIENT) + public String getDescriptionKey() { throw new UnsupportedOperationException("Don't call getDescription directly!"); } @Override - @SideOnly(Side.CLIENT) - public List getTooltip() { + @OnlyIn(Dist.CLIENT) + public List getTooltip() { if (stack.isEmpty()) { return ImmutableList.of(); } - List tooltip = stack.getTooltip(null, ITooltipFlag.TooltipFlags.NORMAL); + List tooltip = stack.getTooltipLines(null, TooltipFlag.Default.NORMAL); if (!tooltip.isEmpty()) { - tooltip.set(0, stack.getRarity().rarityColor + tooltip.get(0)); + tooltip.set(0, Component.literal(stack.getRarity().color.toString()).append(tooltip.get(0))); for (int i = 1; i < tooltip.size(); i++) { - tooltip.set(i, TextFormatting.GRAY + tooltip.get(i)); + tooltip.set(i, Component.literal(ChatFormatting.GRAY.toString()).append(tooltip.get(i))); } } return tooltip; } + @Override + @OnlyIn(Dist.CLIENT) + public List getTooltipKey() { + if (stack.isEmpty()) { + return ImmutableList.of(); + } + List tooltip = stack.getTooltipLines(null, TooltipFlag.Default.NORMAL); + List toolTipRet = new ArrayList<>(tooltip.size()); + if (!tooltip.isEmpty()) { + toolTipRet.set(0, Component.literal(stack.getRarity().color.toString()).append(tooltip.get(0)).getString()); + for (int i = 1; i < tooltip.size(); i++) { + toolTipRet.set(i, Component.literal(ChatFormatting.GRAY.toString()).append(tooltip.get(i)).getString()); + } + } + return toolTipRet; + } + @Override public String getUniqueTag() { return "buildcraft:stack"; diff --git a/api/buildcraft/api/statements/StatementSlot.java b/api/buildcraft/api/statements/StatementSlot.java index b3306b4..55d117f 100755 --- a/api/buildcraft/api/statements/StatementSlot.java +++ b/api/buildcraft/api/statements/StatementSlot.java @@ -4,11 +4,11 @@ * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.statements; +import buildcraft.api.core.EnumPipePart; + import java.util.Arrays; import java.util.Objects; -import buildcraft.api.core.EnumPipePart; - public class StatementSlot { public IStatement statement; public IStatementParameter[] parameters; diff --git a/api/buildcraft/api/statements/containers/IFillerStatementContainer.java b/api/buildcraft/api/statements/containers/IFillerStatementContainer.java index 475a01d..05255ed 100644 --- a/api/buildcraft/api/statements/containers/IFillerStatementContainer.java +++ b/api/buildcraft/api/statements/containers/IFillerStatementContainer.java @@ -1,23 +1,22 @@ package buildcraft.api.statements.containers; -import javax.annotation.Nullable; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - import buildcraft.api.core.IBox; import buildcraft.api.filler.IFillerPattern; import buildcraft.api.statements.IStatementContainer; import buildcraft.api.statements.IStatementParameter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; + +import javax.annotation.Nullable; public interface IFillerStatementContainer extends IStatementContainer { /** Unlike in {@link IStatementContainer} some containers might not be tile based (for example the volume box). */ @Override @Nullable - TileEntity getTile(); + BlockEntity getTile(); - World getFillerWorld(); + Level getFillerWorld(); /** @return True if this filler has a non-zero sized box. */ boolean hasBox(); diff --git a/api/buildcraft/api/statements/containers/IRedstoneStatementContainer.java b/api/buildcraft/api/statements/containers/IRedstoneStatementContainer.java index 1d7989a..bab96bb 100644 --- a/api/buildcraft/api/statements/containers/IRedstoneStatementContainer.java +++ b/api/buildcraft/api/statements/containers/IRedstoneStatementContainer.java @@ -1,17 +1,17 @@ package buildcraft.api.statements.containers; -import net.minecraft.util.EnumFacing; +import net.minecraft.core.Direction; public interface IRedstoneStatementContainer { /** Get the redstone input from a given side. - * + * * @param side The side - use "null" for maximum input. * @return The redstone input, from 0 to 15. */ - int getRedstoneInput(EnumFacing side); + int getRedstoneInput(Direction side); /** Set the redstone input for a given side. - * + * * @param side The side - use "null" for all sides. * @return Whether the set was successful. */ - boolean setRedstoneOutput(EnumFacing side, int value); + boolean setRedstoneOutput(Direction side, int value); } diff --git a/api/buildcraft/api/statements/containers/ISidedStatementContainer.java b/api/buildcraft/api/statements/containers/ISidedStatementContainer.java index b65ace4..ffa23af 100644 --- a/api/buildcraft/api/statements/containers/ISidedStatementContainer.java +++ b/api/buildcraft/api/statements/containers/ISidedStatementContainer.java @@ -1,10 +1,9 @@ package buildcraft.api.statements.containers; -import net.minecraft.util.EnumFacing; - import buildcraft.api.statements.IStatementContainer; +import net.minecraft.core.Direction; /** Created by asie on 3/14/15. */ public interface ISidedStatementContainer extends IStatementContainer { - EnumFacing getSide(); + Direction getSide(); } diff --git a/api/buildcraft/api/statements/package-info.java b/api/buildcraft/api/statements/package-info.java index 64642d7..1cf5f34 100644 --- a/api/buildcraft/api/statements/package-info.java +++ b/api/buildcraft/api/statements/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "1.1", owner = "buildcraftapi_core", provides = "buildcraftapi_statements") +//@API(apiVersion = "1.1", owner = "buildcraftapi_core", provides = "buildcraftapi_statements") package buildcraft.api.statements; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/template/ITemplateHandler.java b/api/buildcraft/api/template/ITemplateHandler.java index e0dac1b..3674b45 100644 --- a/api/buildcraft/api/template/ITemplateHandler.java +++ b/api/buildcraft/api/template/ITemplateHandler.java @@ -6,11 +6,11 @@ package buildcraft.api.template; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; public interface ITemplateHandler { - boolean handle(World world, BlockPos pos, EntityPlayer player, ItemStack stack); + boolean handle(Level world, BlockPos pos, Player player, ItemStack stack); } diff --git a/api/buildcraft/api/template/ITemplateRegistry.java b/api/buildcraft/api/template/ITemplateRegistry.java index ec6d250..0e62d99 100644 --- a/api/buildcraft/api/template/ITemplateRegistry.java +++ b/api/buildcraft/api/template/ITemplateRegistry.java @@ -6,12 +6,11 @@ package buildcraft.api.template; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - import buildcraft.api.core.EnumHandlerPriority; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; public interface ITemplateRegistry { /** Adds a handler with a {@link EnumHandlerPriority} of {@linkplain EnumHandlerPriority#NORMAL} */ @@ -21,5 +20,5 @@ default void addHandler(ITemplateHandler handler) { void addHandler(ITemplateHandler handler, EnumHandlerPriority priority); - boolean handle(World world, BlockPos pos, EntityPlayer player, ItemStack stack); + boolean handle(Level world, BlockPos pos, Player player, ItemStack stack); } diff --git a/api/buildcraft/api/tiles/IBCTileMenuProvider.java b/api/buildcraft/api/tiles/IBCTileMenuProvider.java new file mode 100644 index 0000000..cda74c1 --- /dev/null +++ b/api/buildcraft/api/tiles/IBCTileMenuProvider.java @@ -0,0 +1,9 @@ +package buildcraft.api.tiles; + +import buildcraft.api.net.IMessage; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Player; + +public interface IBCTileMenuProvider extends MenuProvider { + public abstract IMessage onServerPlayerOpenNoSend(Player player); +} diff --git a/api/buildcraft/api/tiles/IDebuggable.java b/api/buildcraft/api/tiles/IDebuggable.java index 8a9f2dc..3802795 100644 --- a/api/buildcraft/api/tiles/IDebuggable.java +++ b/api/buildcraft/api/tiles/IDebuggable.java @@ -1,23 +1,26 @@ package buildcraft.api.tiles; -import java.util.List; - -import net.minecraft.util.EnumFacing; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import java.util.List; public interface IDebuggable { /** Get the debug information from a tile entity as a list of strings, used for the F3 debug menu. The left and * right parameters correspond to the sides of the F3 screen. - * + * + * @param left {@link I18n} doesn't exist in Server Side, so we should use {@link Component}. * @param side The side the block was clicked on, may be null if we don't know, or is the "centre" side */ - void getDebugInfo(List left, List right, EnumFacing side); +// void getDebugInfo(List left, List right, Direction side); + void getDebugInfo(List left, List right, Direction side); - /** Same as {@link #getDebugInfo(List, List, EnumFacing)}, but only for client + /** Same as {@link #getDebugInfo(List, List, Direction)}, but only for client * - * @param side same as for {@link #getDebugInfo(List, List, EnumFacing)} */ - @SideOnly(Side.CLIENT) - default void getClientDebugInfo(List left, List right, EnumFacing side) { + * @param side same as for {@link #getDebugInfo(List, List, Direction)} */ + @OnlyIn(Dist.CLIENT) + default void getClientDebugInfo(List left, List right, Direction side) { } } diff --git a/api/buildcraft/api/tiles/IHasWork.java b/api/buildcraft/api/tiles/IHasWork.java index fa87196..5e3b57f 100644 --- a/api/buildcraft/api/tiles/IHasWork.java +++ b/api/buildcraft/api/tiles/IHasWork.java @@ -8,7 +8,7 @@ * cetera). */ public interface IHasWork { /** Check if the Tile Entity is currently doing any work. - * + * * @return True if the Tile Entity is doing work. */ boolean hasWork(); } diff --git a/api/buildcraft/api/tiles/IHeatable.java b/api/buildcraft/api/tiles/IHeatable.java index d789ab5..a9eb43c 100644 --- a/api/buildcraft/api/tiles/IHeatable.java +++ b/api/buildcraft/api/tiles/IHeatable.java @@ -19,7 +19,7 @@ public interface IHeatable { double getCurrentHeatValue(); /** Set the heat of the tile. - * + * * @param value Heat value, in degrees. * @return The heat the tile has after the set. */ double setHeatValue(double value); diff --git a/api/buildcraft/api/tiles/ITickable.java b/api/buildcraft/api/tiles/ITickable.java new file mode 100644 index 0000000..9f21277 --- /dev/null +++ b/api/buildcraft/api/tiles/ITickable.java @@ -0,0 +1,42 @@ +package buildcraft.api.tiles; + +import net.minecraft.world.level.block.entity.BlockEntity; +import org.jetbrains.annotations.MustBeInvokedByOverriders; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +// From 1.12.2 MC +public interface ITickable { + /** Like the old updateEntity(), except more generic. */ + @MustBeInvokedByOverriders + default void update() { + LinkedList taskOfCurrentTile = tasks.get(this); + if (taskOfCurrentTile != null && !taskOfCurrentTile.isEmpty()) { + taskOfCurrentTile.forEach(Runnable::run); + taskOfCurrentTile.clear(); + } + } + + static final Map> tasks = new ConcurrentHashMap<>(); + + // Calen + + /** + * When world loading, BlockEntity#level may be null, or Level#getBlockState may cause dead lock + * + * @param task + * @param forceDelay If true, the task will be delayed to next update() even if the world is not null. + */ + default void runWhenWorldNotNull(Runnable task, boolean forceDelay) { + // Calen: don't create abstract method getLevel() in ITickable, because it will not be renamed when reobf, ant will become a different method from BlockEntity#getLevel. + if (forceDelay || ((BlockEntity) this).getLevel() == null) { + List tasksOfCurrentTile = tasks.computeIfAbsent(this, k -> new LinkedList<>()); + tasksOfCurrentTile.add(task); + } else { + task.run(); + } + } +} diff --git a/api/buildcraft/api/tiles/ITileAreaProvider.java b/api/buildcraft/api/tiles/ITileAreaProvider.java index 89a7c14..1ace48f 100644 --- a/api/buildcraft/api/tiles/ITileAreaProvider.java +++ b/api/buildcraft/api/tiles/ITileAreaProvider.java @@ -1,8 +1,7 @@ package buildcraft.api.tiles; -import net.minecraft.util.math.BlockPos; - import buildcraft.api.core.IAreaProvider; +import net.minecraft.core.BlockPos; /** Used for more fine-grained control of whether or not a machine connects to the provider here. */ public interface ITileAreaProvider extends IAreaProvider { diff --git a/api/buildcraft/api/tiles/TilesAPI.java b/api/buildcraft/api/tiles/TilesAPI.java index abacf92..9c09125 100644 --- a/api/buildcraft/api/tiles/TilesAPI.java +++ b/api/buildcraft/api/tiles/TilesAPI.java @@ -1,28 +1,35 @@ package buildcraft.api.tiles; -import javax.annotation.Nonnull; - import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.CapabilityToken; +import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; -import buildcraft.api.core.CapabilitiesHelper; +import javax.annotation.Nonnull; public class TilesAPI { @Nonnull - public static final Capability CAP_CONTROLLABLE; + public static final Capability CAP_CONTROLLABLE = CapabilityManager.get(new CapabilityToken<>() { + }); @Nonnull - public static final Capability CAP_HAS_WORK; + public static final Capability CAP_HAS_WORK = CapabilityManager.get(new CapabilityToken<>() { + }); @Nonnull - public static final Capability CAP_HEATABLE; + public static final Capability CAP_HEATABLE = CapabilityManager.get(new CapabilityToken<>() { + }); @Nonnull - public static final Capability CAP_TILE_AREA_PROVIDER; - - static { - CAP_CONTROLLABLE = CapabilitiesHelper.registerCapability(IControllable.class); - CAP_HAS_WORK = CapabilitiesHelper.registerCapability(IHasWork.class); - CAP_HEATABLE = CapabilitiesHelper.registerCapability(IHeatable.class); - CAP_TILE_AREA_PROVIDER = CapabilitiesHelper.registerCapability(ITileAreaProvider.class); + public static final Capability CAP_TILE_AREA_PROVIDER = CapabilityManager.get(new CapabilityToken<>() { + }); + + @SubscribeEvent + public static void registerCapability(RegisterCapabilitiesEvent event) { + event.register(IControllable.class); + event.register(IHasWork.class); + event.register(IHeatable.class); + event.register(ITileAreaProvider.class); } } diff --git a/api/buildcraft/api/tiles/package-info.java b/api/buildcraft/api/tiles/package-info.java index ad60078..53b1774 100644 --- a/api/buildcraft/api/tiles/package-info.java +++ b/api/buildcraft/api/tiles/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "1.2", owner = "buildcraftapi_core", provides = "buildcraftapi_tiles") +//@API(apiVersion = "1.2", owner = "buildcraftapi_core", provides = "buildcraftapi_tiles") package buildcraft.api.tiles; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/tools/IToolWrench.java b/api/buildcraft/api/tools/IToolWrench.java index 9201b55..34b7e21 100644 --- a/api/buildcraft/api/tools/IToolWrench.java +++ b/api/buildcraft/api/tools/IToolWrench.java @@ -4,10 +4,10 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.tools; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.RayTraceResult; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.HitResult; /*** Implement this interface on subclasses of Item to have that item work as a wrench for buildcraft */ public interface IToolWrench { @@ -20,7 +20,7 @@ public interface IToolWrench { * @param rayTrace - The object that is being wrenched * * @return true if wrenching is allowed, false if not */ - boolean canWrench(EntityPlayer player, EnumHand hand, ItemStack wrench, RayTraceResult rayTrace); + boolean canWrench(Player player, InteractionHand hand, ItemStack wrench, HitResult rayTrace); /*** Callback after the wrench has been used. This can be used to decrease durability or for other purposes. * @@ -28,5 +28,5 @@ public interface IToolWrench { * @param hand - Which hand was holding the wrench * @param wrench - The item stack that holds the wrench * @param rayTrace - The object that is being wrenched */ - void wrenchUsed(EntityPlayer player, EnumHand hand, ItemStack wrench, RayTraceResult rayTrace); + void wrenchUsed(Player player, InteractionHand hand, ItemStack wrench, HitResult rayTrace); } diff --git a/api/buildcraft/api/tools/package-info.java b/api/buildcraft/api/tools/package-info.java index f089abf..8b081c3 100644 --- a/api/buildcraft/api/tools/package-info.java +++ b/api/buildcraft/api/tools/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "1.0", owner = "buildcraftapi_core", provides = "buildcraftapi_tools") +//@API(apiVersion = "1.0", owner = "buildcraftapi_core", provides = "buildcraftapi_tools") package buildcraft.api.tools; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/transport/EnumWirePart.java b/api/buildcraft/api/transport/EnumWirePart.java index 687ba67..311fa48 100644 --- a/api/buildcraft/api/transport/EnumWirePart.java +++ b/api/buildcraft/api/transport/EnumWirePart.java @@ -1,9 +1,10 @@ package buildcraft.api.transport; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumFacing.AxisDirection; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.Vec3d; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; public enum EnumWirePart { EAST_UP_SOUTH(true, true, true), @@ -20,30 +21,36 @@ public enum EnumWirePart { public final AxisDirection x, y, z; /** The bounding box for rendering a wire or selecting an already-placed wire. */ - public final AxisAlignedBB boundingBox; + public final VoxelShape boundingBox; /** The bounding box that is used when adding pipe wire to a pipe */ - public final AxisAlignedBB boundingBoxPossible; + public final VoxelShape boundingBoxPossible; EnumWirePart(boolean x, boolean y, boolean z) { this.x = x ? AxisDirection.POSITIVE : AxisDirection.NEGATIVE; this.y = y ? AxisDirection.POSITIVE : AxisDirection.NEGATIVE; this.z = z ? AxisDirection.POSITIVE : AxisDirection.NEGATIVE; - double x1 = this.x.getOffset() * (5 / 16.0) + 0.5; - double y1 = this.y.getOffset() * (5 / 16.0) + 0.5; - double z1 = this.z.getOffset() * (5 / 16.0) + 0.5; - double x2 = this.x.getOffset() * (4 / 16.0) + 0.5; - double y2 = this.y.getOffset() * (4 / 16.0) + 0.5; - double z2 = this.z.getOffset() * (4 / 16.0) + 0.5; - this.boundingBox = new AxisAlignedBB(x1, y1, z1, x2, y2, z2); + double x1 = this.x.getStep() * (5 / 16.0) + 0.5; + double y1 = this.y.getStep() * (5 / 16.0) + 0.5; + double z1 = this.z.getStep() * (5 / 16.0) + 0.5; + double x2 = this.x.getStep() * (4 / 16.0) + 0.5; + double y2 = this.y.getStep() * (4 / 16.0) + 0.5; + double z2 = this.z.getStep() * (4 / 16.0) + 0.5; + this.boundingBox = Shapes.box(Math.min(x1, x2), Math.min(y1, y2), Math.min(z1, z2), Math.max(x1, x2), Math.max(y1, y2), Math.max(z1, z2)); - Vec3d center = new Vec3d(0.5, 0.5, 0.5); - Vec3d edge = new Vec3d(x ? 0.75 : 0.25, y ? 0.75 : 0.25, z ? 0.75 : 0.25); - this.boundingBoxPossible = new AxisAlignedBB(center.x, center.y, center.z, edge.x, - edge.y, edge.z); + Vec3 center = new Vec3(0.5, 0.5, 0.5); + Vec3 edge = new Vec3(x ? 0.75 : 0.25, y ? 0.75 : 0.25, z ? 0.75 : 0.25); + this.boundingBoxPossible = Shapes.box( + Math.min(center.x, edge.x), + Math.min(center.y, edge.y), + Math.min(center.z, edge.z), + Math.max(center.x, edge.x), + Math.max(center.y, edge.y), + Math.max(center.z, edge.z) + ); } - public AxisDirection getDirection(EnumFacing.Axis axis) { + public AxisDirection getDirection(Direction.Axis axis) { switch (axis) { case X: return x; diff --git a/api/buildcraft/api/transport/IInjectable.java b/api/buildcraft/api/transport/IInjectable.java index 2aeebd6..58da923 100644 --- a/api/buildcraft/api/transport/IInjectable.java +++ b/api/buildcraft/api/transport/IInjectable.java @@ -1,16 +1,17 @@ package buildcraft.api.transport; +import net.minecraft.core.Direction; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; + import javax.annotation.Nonnull; -import net.minecraft.item.EnumDyeColor; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; /** Interface for pipes to implement if they can accept items in a similar fashion to BC pipes. */ public interface IInjectable { /** Tests to see if this pipe can accept items from the given direction. Useless to call this if you are going to - * call {@link #injectItem(ItemStack, boolean, EnumFacing, EnumDyeColor, double)} straight after. */ - boolean canInjectItems(EnumFacing from); + * call {@link #injectItem(ItemStack, boolean, Direction, DyeColor, double)} straight after. */ + boolean canInjectItems(Direction from); /** Offers an ItemStack for addition to the pipe. Will be rejected if the pipe doesn't accept items from that side. * This should never be called on the client side! Implementors are free to throw an exception if be called on the @@ -23,5 +24,5 @@ public interface IInjectable { * @param speed The speed of the item to be added (in blocks per tick) or {@code <=0} if a default should be used. * @return The left over stack that was not accepted. */ @Nonnull - ItemStack injectItem(@Nonnull ItemStack stack, boolean doAdd, EnumFacing from, EnumDyeColor color, double speed); + ItemStack injectItem(@Nonnull ItemStack stack, boolean doAdd, Direction from, DyeColor color, double speed); } diff --git a/api/buildcraft/api/transport/IItemPluggable.java b/api/buildcraft/api/transport/IItemPluggable.java index a55a0c4..d752ca7 100644 --- a/api/buildcraft/api/transport/IItemPluggable.java +++ b/api/buildcraft/api/transport/IItemPluggable.java @@ -1,27 +1,25 @@ package buildcraft.api.transport; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; - import buildcraft.api.transport.pipe.IPipeHolder; import buildcraft.api.transport.pluggable.PipePluggable; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** Designates an item that can be placed onto a pipe as a {@link PipePluggable}. */ public interface IItemPluggable { /** Called when this item is placed onto a pipe holder. This can return null if this item does not make a valid * pluggable. Note that if you return a non-null pluggable then it will *definitely* be added to the pipe, and you * are responsible for making all the effects yourself (like the sound effect). - * + * * @param stack The stack that holds this item * @param holder The pipe holder * @param side The side that the pluggable should be placed on * @return A pluggable to place onto the pipe */ @Nullable - PipePluggable onPlace(@Nonnull ItemStack stack, IPipeHolder holder, EnumFacing side, EntityPlayer player, - EnumHand hand); + PipePluggable onPlace(@Nonnull ItemStack stack, IPipeHolder holder, Direction side, Player player, InteractionHand hand); } diff --git a/api/buildcraft/api/transport/IStripesActivator.java b/api/buildcraft/api/transport/IStripesActivator.java index a0dd7c8..a39d034 100644 --- a/api/buildcraft/api/transport/IStripesActivator.java +++ b/api/buildcraft/api/transport/IStripesActivator.java @@ -4,13 +4,13 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.transport; -import javax.annotation.Nonnull; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; +import javax.annotation.Nonnull; public interface IStripesActivator { - boolean sendItem(@Nonnull ItemStack itemStack, EnumFacing from); + boolean sendItem(@Nonnull ItemStack itemStack, Direction from); - void dropItem(@Nonnull ItemStack itemStack, EnumFacing from); + void dropItem(@Nonnull ItemStack itemStack, Direction from); } diff --git a/api/buildcraft/api/transport/IStripesHandlerBlock.java b/api/buildcraft/api/transport/IStripesHandlerBlock.java index 888cac4..e94c8da 100644 --- a/api/buildcraft/api/transport/IStripesHandlerBlock.java +++ b/api/buildcraft/api/transport/IStripesHandlerBlock.java @@ -1,9 +1,9 @@ package buildcraft.api.transport; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; public interface IStripesHandlerBlock { @@ -14,5 +14,5 @@ public interface IStripesHandlerBlock { * @param activator * @return True if this broke a block, false otherwise (note that this handler MUST NOT return false if it has * changed the world in any way) */ - boolean handle(World world, BlockPos pos, EnumFacing direction, EntityPlayer player, IStripesActivator activator); + boolean handle(Level world, BlockPos pos, Direction direction, Player player, IStripesActivator activator); } diff --git a/api/buildcraft/api/transport/IStripesHandlerItem.java b/api/buildcraft/api/transport/IStripesHandlerItem.java index 6512be8..e361baa 100644 --- a/api/buildcraft/api/transport/IStripesHandlerItem.java +++ b/api/buildcraft/api/transport/IStripesHandlerItem.java @@ -4,20 +4,20 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.transport; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; public interface IStripesHandlerItem { /** Called to handle the given {@link ItemStack} within the world. Note that the player's inventory will be empty, - * except that the target stack will be set into its {@link EnumHand#MAIN_HAND}. Any items left in the players + * except that the target stack will be set into its {@link InteractionHand#MAIN_HAND}. Any items left in the players * inventory will be returned back through the activator with - * {@link IStripesActivator#sendItem(ItemStack, EnumFacing)} - * + * {@link IStripesActivator#sendItem(ItemStack, Direction)} + * * @param world * @param pos * @param direction @@ -26,5 +26,5 @@ public interface IStripesHandlerItem { * @param activator * @return True if this used the item, false otherwise (note that this handler MUST NOT return false if it has * changed the world in any way) */ - boolean handle(World world, BlockPos pos, EnumFacing direction, ItemStack stack, EntityPlayer player, IStripesActivator activator); + boolean handle(Level world, BlockPos pos, Direction direction, ItemStack stack, Player player, IStripesActivator activator); } diff --git a/api/buildcraft/api/transport/IStripesRegistry.java b/api/buildcraft/api/transport/IStripesRegistry.java index ae69806..b9819e8 100644 --- a/api/buildcraft/api/transport/IStripesRegistry.java +++ b/api/buildcraft/api/transport/IStripesRegistry.java @@ -1,12 +1,11 @@ package buildcraft.api.transport; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - import buildcraft.api.core.EnumHandlerPriority; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; public interface IStripesRegistry { /** Adds a handler with a {@link EnumHandlerPriority} of {@linkplain EnumHandlerPriority#NORMAL} */ @@ -25,17 +24,17 @@ default void addHandler(IStripesHandlerBlock handler) { /** @param pos The position of the stripes pipe. * @return True if a handler handled the itemstack, false otherwise (and so nothing has been done) */ - boolean handleItem(World world, + boolean handleItem(Level world, BlockPos pos, - EnumFacing direction, + Direction direction, ItemStack stack, - EntityPlayer player, + Player player, IStripesActivator activator); /** @return True if a handler broke a block, false otherwise (and so nothing has been done) */ - boolean handleBlock(World world, + boolean handleBlock(Level world, BlockPos pos, - EnumFacing direction, - EntityPlayer player, + Direction direction, + Player player, IStripesActivator activator); } diff --git a/api/buildcraft/api/transport/IWireEmitter.java b/api/buildcraft/api/transport/IWireEmitter.java index 4b480e2..bf7a844 100644 --- a/api/buildcraft/api/transport/IWireEmitter.java +++ b/api/buildcraft/api/transport/IWireEmitter.java @@ -6,13 +6,13 @@ package buildcraft.api.transport; -import net.minecraft.item.EnumDyeColor; +import net.minecraft.world.item.DyeColor; public interface IWireEmitter { /** Checks to see if this wire emitter is currently emitting the given colour. Only used to check if a given emitter * is still active. */ - boolean isEmitting(EnumDyeColor colour); + boolean isEmitting(DyeColor colour); /** Emits the given wire colour this tick. */ - void emitWire(EnumDyeColor colour); + void emitWire(DyeColor colour); } diff --git a/api/buildcraft/api/transport/IWireManager.java b/api/buildcraft/api/transport/IWireManager.java index 942c3ab..c55514f 100644 --- a/api/buildcraft/api/transport/IWireManager.java +++ b/api/buildcraft/api/transport/IWireManager.java @@ -1,8 +1,7 @@ package buildcraft.api.transport; -import net.minecraft.item.EnumDyeColor; - import buildcraft.api.transport.pipe.IPipeHolder; +import net.minecraft.world.item.DyeColor; public interface IWireManager { @@ -10,15 +9,15 @@ public interface IWireManager { void updateBetweens(boolean recursive); - EnumDyeColor getColorOfPart(EnumWirePart part); + DyeColor getColorOfPart(EnumWirePart part); - EnumDyeColor removePart(EnumWirePart part); + DyeColor removePart(EnumWirePart part); - boolean addPart(EnumWirePart part, EnumDyeColor colour); + boolean addPart(EnumWirePart part, DyeColor colour); - boolean hasPartOfColor(EnumDyeColor color); + boolean hasPartOfColor(DyeColor color); boolean isPowered(EnumWirePart part); - boolean isAnyPowered(EnumDyeColor color); + boolean isAnyPowered(DyeColor color); } diff --git a/api/buildcraft/api/transport/WireNode.java b/api/buildcraft/api/transport/WireNode.java index 5430b64..1f23bfd 100644 --- a/api/buildcraft/api/transport/WireNode.java +++ b/api/buildcraft/api/transport/WireNode.java @@ -1,12 +1,12 @@ package buildcraft.api.transport; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.AxisDirection; + import java.util.EnumMap; import java.util.Map; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumFacing.AxisDirection; -import net.minecraft.util.math.BlockPos; - public class WireNode { public final BlockPos pos; public final EnumWirePart part; @@ -30,7 +30,7 @@ public boolean equals(Object obj) { if (getClass() != obj.getClass()) return false; WireNode other = (WireNode) obj; return part == other.part // - && pos.equals(other.pos); + && pos.equals(other.pos); } @Override @@ -38,22 +38,22 @@ public String toString() { return "(" + pos.getX() + ", " + pos.getY() + ", " + pos.getZ() + ", " + part + ")"; } - public WireNode offset(EnumFacing face) { - int nx = (part.x == AxisDirection.POSITIVE ? 1 : 0) + face.getFrontOffsetX(); - int ny = (part.y == AxisDirection.POSITIVE ? 1 : 0) + face.getFrontOffsetY(); - int nz = (part.z == AxisDirection.POSITIVE ? 1 : 0) + face.getFrontOffsetZ(); + public WireNode offset(Direction face) { + int nx = (part.x == AxisDirection.POSITIVE ? 1 : 0) + face.getStepX(); + int ny = (part.y == AxisDirection.POSITIVE ? 1 : 0) + face.getStepY(); + int nz = (part.z == AxisDirection.POSITIVE ? 1 : 0) + face.getStepZ(); EnumWirePart nPart = EnumWirePart.get(nx, ny, nz); if (nx < 0 || ny < 0 || nz < 0 || nx > 1 || ny > 1 || nz > 1) { - return new WireNode(pos.offset(face), nPart); + return new WireNode(pos.relative(face), nPart); } else { return new WireNode(pos, nPart); } } - public Map getAllPossibleConnections() { - Map map = new EnumMap<>(EnumFacing.class); + public Map getAllPossibleConnections() { + Map map = new EnumMap<>(Direction.class); - for (EnumFacing face : EnumFacing.VALUES) { + for (Direction face : Direction.VALUES) { map.put(face, offset(face)); } return map; diff --git a/api/buildcraft/api/transport/package-info.java b/api/buildcraft/api/transport/package-info.java index b9cd4de..ea4e143 100644 --- a/api/buildcraft/api/transport/package-info.java +++ b/api/buildcraft/api/transport/package-info.java @@ -2,7 +2,5 @@ * * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "5.0", owner = "buildcraftapi_core", provides = "buildcraftapi_transport") +//@API(apiVersion = "5.0", owner = "buildcraftapi_core", provides = "buildcraftapi_transport") package buildcraft.api.transport; - -import net.minecraftforge.fml.common.API; diff --git a/api/buildcraft/api/transport/pipe/ICustomPipeConnection.java b/api/buildcraft/api/transport/pipe/ICustomPipeConnection.java index d4ca9ab..41b317b 100644 --- a/api/buildcraft/api/transport/pipe/ICustomPipeConnection.java +++ b/api/buildcraft/api/transport/pipe/ICustomPipeConnection.java @@ -1,13 +1,13 @@ package buildcraft.api.transport.pipe; -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; public interface ICustomPipeConnection { /** @return How long the connecting pipe should extend for, in addition to its normal 4/16f connection. Values less * than or equal to -4 / 16.0f indicate that the pipe will not connect at all, and will render - * as it it was not connected. */ - float getExtension(World world, BlockPos pos, EnumFacing face, IBlockState state); + * as it was not connected. */ + float getExtension(Level world, BlockPos pos, Direction face, BlockState state); } diff --git a/api/buildcraft/api/transport/pipe/IFlowFluid.java b/api/buildcraft/api/transport/pipe/IFlowFluid.java index 259736a..0c5b595 100644 --- a/api/buildcraft/api/transport/pipe/IFlowFluid.java +++ b/api/buildcraft/api/transport/pipe/IFlowFluid.java @@ -1,24 +1,24 @@ package buildcraft.api.transport.pipe; -import javax.annotation.Nullable; - -import net.minecraft.util.ActionResult; -import net.minecraft.util.EnumActionResult; -import net.minecraft.util.EnumFacing; - -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; - import buildcraft.api.core.IFluidFilter; import buildcraft.api.core.IFluidHandlerAdv; import buildcraft.api.transport.pluggable.PipePluggable; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; + +import javax.annotation.Nullable; public interface IFlowFluid { /** @deprecated use the version below with a simulate paramater. */ @Nullable @Deprecated - default FluidStack tryExtractFluid(int millibuckets, EnumFacing from, FluidStack filter) { - return tryExtractFluid(millibuckets, from, filter, false); + default FluidStack tryExtractFluid(int millibuckets, Direction from, FluidStack filter) { +// return tryExtractFluid(millibuckets, from, filter, false); + return tryExtractFluid(millibuckets, from, filter, FluidAction.EXECUTE); } /** @param millibuckets @@ -26,41 +26,46 @@ default FluidStack tryExtractFluid(int millibuckets, EnumFacing from, FluidStack * @param filter The fluidstack that the extracted fluid must match, or null for any fluid. * @return The fluidstack extracted and inserted into the pipe. */ @Nullable - FluidStack tryExtractFluid(int millibuckets, EnumFacing from, FluidStack filter, boolean simulate); +// FluidStack tryExtractFluid(int millibuckets, Direction from, FluidStack filter, boolean simulate); + FluidStack tryExtractFluid(int millibuckets, Direction from, FluidStack filter, FluidAction action); /** @deprecated use the version below with a simulate paramater. */ @Deprecated - default ActionResult tryExtractFluidAdv(int millibuckets, EnumFacing from, IFluidFilter filter) { - return tryExtractFluidAdv(millibuckets, from, filter, false); + default InteractionResultHolder tryExtractFluidAdv(int millibuckets, Direction from, IFluidFilter filter) { +// return tryExtractFluidAdv(millibuckets, from, filter, false); + return tryExtractFluidAdv(millibuckets, from, filter, FluidAction.EXECUTE); } - /** Advanced version of {@link #tryExtractFluid(int, EnumFacing, FluidStack, boolean)}. Note that this only works for + /** Advanced version of {@link #tryExtractFluid(int, Direction, FluidStack, FluidAction)}. Note that this only works for * instances of {@link IFluidHandler} that ALSO extends {@link IFluidHandlerAdv} - * + * * @param millibuckets * @param from - * @param filter A filter to try and match fluids. - * @return The fluidstack extracted and inserted into the pipe. If {@link ActionResult#getType()} equals - * {@link EnumActionResult#PASS} then it means that the {@link IFluidHandler} didn't implement - * {@link IFluidHandlerAdv} and you should call the basic version, if you can. */ - ActionResult tryExtractFluidAdv(int millibuckets, EnumFacing from, IFluidFilter filter, boolean simulate); + * @param filter A filter to try and match fluids. + * @return The fluidstack extracted and inserted into the pipe. If {@link InteractionResultHolder#getResult()} equals + * {@link InteractionResult#PASS} then it means that the {@link IFluidHandler} didn't implement + * {@link IFluidHandlerAdv} and you should call the basic version, if you can. */ +// InteractionResultHolder tryExtractFluidAdv(int millibuckets, Direction from, IFluidFilter filter, boolean simulate); + InteractionResultHolder tryExtractFluidAdv(int millibuckets, Direction from, IFluidFilter filter, FluidAction action); /** Attempts to insert a fluid directly into the pipe. Note that this will fail if the pipe currently contains a * different fluid type. - * + * * @param from The side that the fluid should *not* go in, or null if the fluid may flow in any direction. * @return The amount of fluid that was accepted, or 0 if no fluid was accepted. */ - int insertFluidsForce(FluidStack fluid, @Nullable EnumFacing from, boolean simulate); +// int insertFluidsForce(FluidStack fluid, @Nullable EnumFacing from, boolean simulate); + int insertFluidsForce(FluidStack fluid, @Nullable Direction from, FluidAction action); /** Tries to extract fluids directly from the pipe. NOTE: This is intended for {@link PipeBehaviour} and * {@link PipePluggable} implementors ONLY! This will result in very buggy behaviour if external tiles try to use * this! - * + * * @param min The minimum amount of fluid to extract. If less than this amount is in the given center then nothing * will be extracted. * @param section The section to extract from. Null means the center. - * @param simulate + * @param action * @return */ @Nullable - FluidStack extractFluidsForce(int min, int max, @Nullable EnumFacing section, boolean simulate); +// FluidStack extractFluidsForce(int min, int max, @Nullable EnumFacing section, boolean simulate); + FluidStack extractFluidsForce(int min, int max, @Nullable Direction section, FluidAction action); } diff --git a/api/buildcraft/api/transport/pipe/IFlowItems.java b/api/buildcraft/api/transport/pipe/IFlowItems.java index bdedd38..ec032f0 100644 --- a/api/buildcraft/api/transport/pipe/IFlowItems.java +++ b/api/buildcraft/api/transport/pipe/IFlowItems.java @@ -1,45 +1,44 @@ package buildcraft.api.transport.pipe; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.item.EnumDyeColor; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; - import buildcraft.api.core.IStackFilter; import buildcraft.api.transport.IInjectable; +import net.minecraft.core.Direction; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; public interface IFlowItems extends IInjectable { /** @deprecated Use the version below with a simulate paramater. */ @Deprecated - default int tryExtractItems(int count, EnumFacing from, @Nullable EnumDyeColor colour, IStackFilter filter) { + default int tryExtractItems(int count, Direction from, @Nullable DyeColor colour, IStackFilter filter) { return tryExtractItems(count, from, colour, filter, false); } /** Attempts to extract items from the inventory connected to this pipe on the given side. - * + * * @param count The maximum number of items to extract * @param from The direction to extract from. * @param colour The colour that extracted items should be painted. * @param filter The filter to determine what can be extracted. * @param simulate If true then only simulate the extraction. * @return The number of items extracted. */ - int tryExtractItems(int count, EnumFacing from, @Nullable EnumDyeColor colour, IStackFilter filter, boolean simulate); + int tryExtractItems(int count, Direction from, @Nullable DyeColor colour, IStackFilter filter, boolean simulate); /** Inserts an item directly into the centre of this pipe, going in the given direction. This should ONLY be called * from an instance of {@link PipeBehaviour}, as otherwise it can lead to problems. (For example crashing if a pipe * contains an item that the pipe behaviour doesn't expect). - * + * * @param stack ItemStack offered for addition. Do not manipulate this! * @param from Orientation the ItemStack should pretend to be coming from. * @param colour The colour of the item to be added to the pipe, or null for no colour. * @param speed The speed of the item to be added (in blocks per tick) or {@code <=0} if a default should be * used. */ - void insertItemsForce(@Nonnull ItemStack stack, EnumFacing from, @Nullable EnumDyeColor colour, double speed); + void insertItemsForce(@Nonnull ItemStack stack, Direction from, @Nullable DyeColor colour, double speed); /** Sends a phantom (fake) item from the given facing, to the other facing. If from is null then it will start at * the center, or if to is null then it will end at the center. */ - void sendPhantomItem(@Nonnull ItemStack stack, @Nullable EnumFacing from, @Nullable EnumFacing to, @Nullable EnumDyeColor colour); + void sendPhantomItem(@Nonnull ItemStack stack, @Nullable Direction from, @Nullable Direction to, @Nullable DyeColor colour); } diff --git a/api/buildcraft/api/transport/pipe/IFlowPower.java b/api/buildcraft/api/transport/pipe/IFlowPower.java index 051d0ad..4b33292 100644 --- a/api/buildcraft/api/transport/pipe/IFlowPower.java +++ b/api/buildcraft/api/transport/pipe/IFlowPower.java @@ -1,17 +1,16 @@ package buildcraft.api.transport.pipe; -import net.minecraft.util.EnumFacing; - import buildcraft.api.mj.IMjPassiveProvider; +import net.minecraft.core.Direction; public interface IFlowPower { /** Makes this pipe reconfigure itself, possibly due to the addition of new modules. */ void reconfigure(); /** Attempts to extract power from the {@link IMjPassiveProvider} connected to this pipe on the given side. - * + * * @param maxPower The Maximum amount of power that can be extracted. * @param from The side (of this pipe) to take power from. * @return The amount of power extracted. */ - long tryExtractPower(long maxPower, EnumFacing from); + long tryExtractPower(long maxPower, Direction from); } diff --git a/api/buildcraft/api/transport/pipe/IItemPipe.java b/api/buildcraft/api/transport/pipe/IItemPipe.java index 1d2d377..a1472b5 100644 --- a/api/buildcraft/api/transport/pipe/IItemPipe.java +++ b/api/buildcraft/api/transport/pipe/IItemPipe.java @@ -1,7 +1,14 @@ package buildcraft.api.transport.pipe; +import net.minecraft.world.item.DyeColor; + +import javax.annotation.Nullable; + /** To be implemented by the real item pipe in Transport mod, but leaves knowledge for classes that do not have direct * dependency on transport. */ public interface IItemPipe { PipeDefinition getDefinition(); + + @Nullable + DyeColor getColour(); } diff --git a/api/buildcraft/api/transport/pipe/IPipe.java b/api/buildcraft/api/transport/pipe/IPipe.java index 8f3d51e..a6ebdf4 100644 --- a/api/buildcraft/api/transport/pipe/IPipe.java +++ b/api/buildcraft/api/transport/pipe/IPipe.java @@ -1,9 +1,8 @@ package buildcraft.api.transport.pipe; -import net.minecraft.item.EnumDyeColor; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; - +import net.minecraft.core.Direction; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.common.capabilities.ICapabilityProvider; public interface IPipe extends ICapabilityProvider { @@ -15,19 +14,19 @@ public interface IPipe extends ICapabilityProvider { PipeFlow getFlow(); - EnumDyeColor getColour(); + DyeColor getColour(); - void setColour(EnumDyeColor colour); + void setColour(DyeColor colour); void markForUpdate(); - TileEntity getConnectedTile(EnumFacing side); + BlockEntity getConnectedTile(Direction side); - IPipe getConnectedPipe(EnumFacing side); + IPipe getConnectedPipe(Direction side); - boolean isConnected(EnumFacing side); + boolean isConnected(Direction side); - ConnectedType getConnectedType(EnumFacing side); + ConnectedType getConnectedType(Direction side); enum ConnectedType { TILE, diff --git a/api/buildcraft/api/transport/pipe/IPipeBehaviourBaker.java b/api/buildcraft/api/transport/pipe/IPipeBehaviourBaker.java index f5c50cb..c4a4a46 100644 --- a/api/buildcraft/api/transport/pipe/IPipeBehaviourBaker.java +++ b/api/buildcraft/api/transport/pipe/IPipeBehaviourBaker.java @@ -1,9 +1,9 @@ package buildcraft.api.transport.pipe; -import java.util.List; - import net.minecraft.client.renderer.block.model.BakedQuad; +import java.util.List; + public interface IPipeBehaviourBaker { List bake(B behaviour); } diff --git a/api/buildcraft/api/transport/pipe/IPipeBehaviourRenderer.java b/api/buildcraft/api/transport/pipe/IPipeBehaviourRenderer.java index 5b00179..f420c9b 100644 --- a/api/buildcraft/api/transport/pipe/IPipeBehaviourRenderer.java +++ b/api/buildcraft/api/transport/pipe/IPipeBehaviourRenderer.java @@ -1,12 +1,12 @@ package buildcraft.api.transport.pipe; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraft.client.renderer.BufferBuilder; - -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) +@OnlyIn(Dist.CLIENT) public interface IPipeBehaviourRenderer { - void render(B behaviour, double x, double y, double z, float partialTicks, BufferBuilder bb); + // void render(B behaviour, double x, double y, double z, float partialTicks, BufferBuilder bb); + public void render(B gate, float partialTicks, PoseStack poseStack, VertexConsumer vertexConsumer, int combinedLight, int combinedOverlay); } diff --git a/api/buildcraft/api/transport/pipe/IPipeConnection.java b/api/buildcraft/api/transport/pipe/IPipeConnection.java index 55a5142..2031feb 100644 --- a/api/buildcraft/api/transport/pipe/IPipeConnection.java +++ b/api/buildcraft/api/transport/pipe/IPipeConnection.java @@ -4,7 +4,7 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.transport.pipe; -import net.minecraft.util.EnumFacing; +import net.minecraft.core.Direction; @Deprecated // TODO: Test to see if this is necessary! (Or perhaps make it a capability) @@ -22,5 +22,5 @@ enum ConnectOverride { * @param type * @param with * @return CONNECT to force a connection, DISCONNECT to force no connection, and DEFAULT to let the pipe decide. */ - ConnectOverride overridePipeConnection(Object/*IPipeTile.PipeType*/ type, EnumFacing with); + ConnectOverride overridePipeConnection(Object/*IPipeTile.PipeType*/ type, Direction with); } diff --git a/api/buildcraft/api/transport/pipe/IPipeExtensionManager.java b/api/buildcraft/api/transport/pipe/IPipeExtensionManager.java index eaf6628..5a85944 100644 --- a/api/buildcraft/api/transport/pipe/IPipeExtensionManager.java +++ b/api/buildcraft/api/transport/pipe/IPipeExtensionManager.java @@ -4,12 +4,11 @@ * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.api.transport.pipe; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - import buildcraft.api.transport.IStripesActivator; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; public interface IPipeExtensionManager { @@ -26,7 +25,7 @@ public interface IPipeExtensionManager { * @param stack the pipe stack to use (Note: only uses one item and sends the rest back) * @return true on success, false otherwise */ - boolean requestPipeExtension(World world, BlockPos pos, EnumFacing dir, IStripesActivator stripes, ItemStack stack); + boolean requestPipeExtension(Level world, BlockPos pos, Direction dir, IStripesActivator stripes, ItemStack stack); /** * Registers a pipe as a retraction trigger for pipe extension requests diff --git a/api/buildcraft/api/transport/pipe/IPipeFlowBaker.java b/api/buildcraft/api/transport/pipe/IPipeFlowBaker.java index 97bcf98..c23afc2 100644 --- a/api/buildcraft/api/transport/pipe/IPipeFlowBaker.java +++ b/api/buildcraft/api/transport/pipe/IPipeFlowBaker.java @@ -1,9 +1,9 @@ package buildcraft.api.transport.pipe; -import java.util.List; - import net.minecraft.client.renderer.block.model.BakedQuad; +import java.util.List; + public interface IPipeFlowBaker { List bake(F flow); } diff --git a/api/buildcraft/api/transport/pipe/IPipeFlowRenderer.java b/api/buildcraft/api/transport/pipe/IPipeFlowRenderer.java index 7ce7636..d5021a3 100644 --- a/api/buildcraft/api/transport/pipe/IPipeFlowRenderer.java +++ b/api/buildcraft/api/transport/pipe/IPipeFlowRenderer.java @@ -1,12 +1,11 @@ package buildcraft.api.transport.pipe; -import net.minecraft.client.renderer.BufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.MultiBufferSource; public interface IPipeFlowRenderer { /** @param flow The flow to render - * @param x - * @param y - * @param z - * @param bufferBuilder The (optional) vertex buffer that you can render into. Note that you can still do GL stuff. */ - void render(F flow, double x, double y, double z, float partialTicks, BufferBuilder bufferBuilder); + * @param bufferSource The buffer source of (optional) vertex buffer that you can render into. Note that you can still do GL stuff. */ +// void render(F flow, double x, double y, double z, float partialTicks, BufferBuilder bufferBuilder); + void render(F flow, float partialTicks, PoseStack poseStack, MultiBufferSource bufferSource, int combinedLight, int combinedOverlay); } diff --git a/api/buildcraft/api/transport/pipe/IPipeHolder.java b/api/buildcraft/api/transport/pipe/IPipeHolder.java index ef00690..e1bfb46 100644 --- a/api/buildcraft/api/transport/pipe/IPipeHolder.java +++ b/api/buildcraft/api/transport/pipe/IPipeHolder.java @@ -1,50 +1,49 @@ package buildcraft.api.transport.pipe; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import com.mojang.authlib.GameProfile; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import net.minecraftforge.common.capabilities.Capability; - import buildcraft.api.statements.containers.IRedstoneStatementContainer; +import buildcraft.api.tiles.IBCTileMenuProvider; +import buildcraft.api.tiles.ITickable; import buildcraft.api.transport.IWireManager; import buildcraft.api.transport.pluggable.PipePluggable; +import com.mojang.authlib.GameProfile; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.common.capabilities.Capability; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** Designates a tile that can contain a pipe, up to 6 sided pluggables. */ -public interface IPipeHolder extends IRedstoneStatementContainer { - World getPipeWorld(); +public interface IPipeHolder extends IRedstoneStatementContainer, IBCTileMenuProvider, ITickable { + Level getPipeWorld(); BlockPos getPipePos(); - TileEntity getPipeTile(); + BlockEntity getPipeTile(); IPipe getPipe(); /** @return true if the player should be able to interact with the pipe holder in GUI form. Implementors should * generally check to ensure they are still present in-world. */ - boolean canPlayerInteract(EntityPlayer player); + boolean canPlayerInteract(Player player); @Nullable - PipePluggable getPluggable(EnumFacing side); + PipePluggable getPluggable(Direction side); @Nullable - TileEntity getNeighbourTile(EnumFacing side); + BlockEntity getNeighbourTile(Direction side); @Nullable - IPipe getNeighbourPipe(EnumFacing side); + IPipe getNeighbourPipe(Direction side); /** Gets the given capability going outwards from the pipe. This will test the * {@link PipePluggable#getInternalCapability(Capability)} first, and the look at the neighbouring tile. */ @Nullable - T getCapabilityFromPipe(EnumFacing side, @Nonnull Capability capability); + T getCapabilityFromPipe(Direction side, @Nonnull Capability capability); IWireManager getWireManager(); @@ -60,7 +59,7 @@ public interface IPipeHolder extends IRedstoneStatementContainer { /** Schedules a GUI network update, that is only the players who currently have a pipe element open in a GUI will be * updated. - * + * * @param parts The parts that want to send a network update. */ void scheduleNetworkGuiUpdate(PipeMessageReceiver... parts); @@ -71,20 +70,25 @@ public interface IPipeHolder extends IRedstoneStatementContainer { void sendGuiMessage(PipeMessageReceiver to, IWriter writer); /** Called on the server whenever a gui container object is opened. */ - void onPlayerOpen(EntityPlayer player); + void onPlayerOpen(Player player); + + @Override + default void update() { + ITickable.super.update(); + } /** Called on the server whenever a gui container object is closed. */ - void onPlayerClose(EntityPlayer player); + void onPlayerClose(Player player); enum PipeMessageReceiver { BEHAVIOUR(null), FLOW(null), - PLUGGABLE_DOWN(EnumFacing.DOWN), - PLUGGABLE_UP(EnumFacing.UP), - PLUGGABLE_NORTH(EnumFacing.NORTH), - PLUGGABLE_SOUTH(EnumFacing.SOUTH), - PLUGGABLE_WEST(EnumFacing.WEST), - PLUGGABLE_EAST(EnumFacing.EAST), + PLUGGABLE_DOWN(Direction.DOWN), + PLUGGABLE_UP(Direction.UP), + PLUGGABLE_NORTH(Direction.NORTH), + PLUGGABLE_SOUTH(Direction.SOUTH), + PLUGGABLE_WEST(Direction.WEST), + PLUGGABLE_EAST(Direction.EAST), WIRES(null); // Wires are updated differently (they never use this API) @@ -99,14 +103,14 @@ enum PipeMessageReceiver { } } - public final EnumFacing face; + public final Direction face; - PipeMessageReceiver(EnumFacing face) { + PipeMessageReceiver(Direction face) { this.face = face; } } interface IWriter { - void write(PacketBuffer buffer); + void write(FriendlyByteBuf buffer); } } diff --git a/api/buildcraft/api/transport/pipe/IPipeRegistry.java b/api/buildcraft/api/transport/pipe/IPipeRegistry.java index e4ead26..84df580 100644 --- a/api/buildcraft/api/transport/pipe/IPipeRegistry.java +++ b/api/buildcraft/api/transport/pipe/IPipeRegistry.java @@ -1,36 +1,42 @@ package buildcraft.api.transport.pipe; -import java.util.Map; -import java.util.function.Consumer; - -import javax.annotation.Nullable; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; +import net.minecraftforge.registries.RegistryObject; -import net.minecraft.item.Item; -import net.minecraft.util.ResourceLocation; +import java.util.Map; public interface IPipeRegistry { PipeDefinition getDefinition(ResourceLocation identifier); void registerPipe(PipeDefinition definition); - /** Maps the given {@link PipeDefinition} to an {@link IItemPipe}. This acts exactly akin to - * {@link Map#put(Object, Object)}. */ - void setItemForPipe(PipeDefinition definition, @Nullable IItemPipe item); + /** + * Maps the given {@link PipeDefinition} to an {@link IItemPipe}. This acts exactly akin to + * {@link Map#put(Object, Object)}. + */ +// void setItemForPipe(PipeDefinition definition, @Nullable IItemPipe item); + void setItemForPipe(PipeDefinition definition, Map> item); - IItemPipe getItemForPipe(PipeDefinition definition); + /** Creates a pipe item with a single colour */ + // IItemPipe getItemForPipe(PipeDefinition definition); + IItemPipe getItemForPipe(PipeDefinition definition, DyeColor colour); - /** Creates an {@link IItemPipe} for the given {@link PipeDefinition}. If the {@link PipeDefinition} has been + /** + * Creates an {@link IItemPipe} for the given {@link PipeDefinition}. If the {@link PipeDefinition} has been * registered with {@link #registerPipe(PipeDefinition)} then it will also be registered with - * {@link #setItemForPipe(PipeDefinition, IItemPipe)}. The returned item will be automatically registered with - * forge. */ - IItemPipe createItemForPipe(PipeDefinition definition); - - /** Identical to {@link #createItemForPipe(PipeDefinition)}, but doesn't require registering tags with buildcraft - * lib in order to register. - * - * @param postCreate A function to call in order to setup the {@link Item#setRegistryName(ResourceLocation)} and - * {@link Item#setUnlocalizedName(String)}. */ - IItemPipe createUnnamedItemForPipe(PipeDefinition definition, Consumer postCreate); + * {@link #setItemForPipe(PipeDefinition, Map)}. The returned item will be automatically registered with + * forge. + */ +// IItemPipe createItemForPipe(PipeDefinition definition); + Map> createItemForPipe(PipeDefinition definition); + +// /** Identical to {@link #createItemForPipe(PipeDefinition)}, but doesn't require registering tags with buildcraftcore +// * lib in order to register. +// * +// * @param postCreate A function to call in order to setup the {@link Item#setRegistryName(ResourceLocation)} and +// * {@link Item#setUnlocalizedName(String)}. */ +// IItemPipe createUnnamedItemForPipe(PipeDefinition definition, Consumer postCreate); Iterable getAllRegisteredPipes(); } diff --git a/api/buildcraft/api/transport/pipe/PipeApi.java b/api/buildcraft/api/transport/pipe/PipeApi.java index cc9997c..904d2c1 100644 --- a/api/buildcraft/api/transport/pipe/PipeApi.java +++ b/api/buildcraft/api/transport/pipe/PipeApi.java @@ -1,18 +1,19 @@ package buildcraft.api.transport.pipe; -import java.util.IdentityHashMap; -import java.util.Map; - -import javax.annotation.Nonnull; - -import net.minecraftforge.common.capabilities.Capability; - -import buildcraft.api.core.CapabilitiesHelper; import buildcraft.api.mj.MjAPI; import buildcraft.api.transport.IInjectable; import buildcraft.api.transport.IStripesRegistry; import buildcraft.api.transport.pluggable.IPluggableRegistry; import buildcraft.api.transport.pluggable.PipePluggable; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.CapabilityToken; +import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +import javax.annotation.Nonnull; +import java.util.IdentityHashMap; +import java.util.Map; /** The central holding class for all pipe related registers and methods. */ public final class PipeApi { @@ -37,16 +38,20 @@ public final class PipeApi { public static final Map powerTransferData = new IdentityHashMap<>(); @Nonnull - public static final Capability CAP_PIPE_HOLDER; + public static final Capability CAP_PIPE_HOLDER = CapabilityManager.get(new CapabilityToken<>() { + }); @Nonnull - public static final Capability CAP_PIPE; + public static final Capability CAP_PIPE = CapabilityManager.get(new CapabilityToken<>() { + }); @Nonnull - public static final Capability CAP_PLUG; + public static final Capability CAP_PLUG = CapabilityManager.get(new CapabilityToken<>() { + }); @Nonnull - public static final Capability CAP_INJECTABLE; + public static final Capability CAP_INJECTABLE = CapabilityManager.get(new CapabilityToken<>() { + }); public static FluidTransferInfo getFluidTransferInfo(PipeDefinition def) { FluidTransferInfo info = fluidTransferData.get(def); @@ -93,7 +98,7 @@ public static class PowerTransferInfo { public final boolean isReceiver; /** Sets resistancePerTick to be equal to lossPerTick when full power is being transferred, scaling down to 0. - * + * * @param transferPerTick * @param lossPerTick * @param isReceiver */ @@ -102,7 +107,7 @@ public static PowerTransferInfo createFromLoss(long transferPerTick, long lossPe } /** Sets lossPerTick to be equal to resistancePerTick when full power is being transferred. - * + * * @param transferPerTick * @param resistancePerTick * @param isReceiver */ @@ -123,10 +128,11 @@ public PowerTransferInfo(long transferPerTick, long lossPerTick, long resistance // Internals - static { - CAP_PIPE = CapabilitiesHelper.registerCapability(IPipe.class); - CAP_PLUG = CapabilitiesHelper.registerCapability(PipePluggable.class); - CAP_PIPE_HOLDER = CapabilitiesHelper.registerCapability(IPipeHolder.class); - CAP_INJECTABLE = CapabilitiesHelper.registerCapability(IInjectable.class); + @SubscribeEvent + public static void registerCapability(RegisterCapabilitiesEvent event) { + event.register(IPipe.class); + event.register(PipePluggable.class); + event.register(IPipeHolder.class); + event.register(IInjectable.class); } } diff --git a/api/buildcraft/api/transport/pipe/PipeApiClient.java b/api/buildcraft/api/transport/pipe/PipeApiClient.java index ebcd9e6..461c2da 100644 --- a/api/buildcraft/api/transport/pipe/PipeApiClient.java +++ b/api/buildcraft/api/transport/pipe/PipeApiClient.java @@ -1,14 +1,13 @@ package buildcraft.api.transport.pipe; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - import buildcraft.api.transport.pluggable.IPlugDynamicRenderer; import buildcraft.api.transport.pluggable.IPluggableStaticBaker; import buildcraft.api.transport.pluggable.PipePluggable; import buildcraft.api.transport.pluggable.PluggableModelKey; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; -@SideOnly(Side.CLIENT) +@OnlyIn(Dist.CLIENT) public enum PipeApiClient { INSTANCE; @@ -22,12 +21,10 @@ public interface IClientRegistry { /** Registers a dynamic renderer for the given pipe behaviour. Most {@link PipeBehaviour} types will have no use * for this. */ - void registerRenderer(Class behaviourClass, - IPipeBehaviourRenderer renderer); + void registerRenderer(Class behaviourClass, IPipeBehaviourRenderer renderer);

    void registerRenderer(Class plugClass, IPlugDynamicRenderer

    renderer); -

    void registerBaker(Class keyClass, - IPluggableStaticBaker

    renderer); +

    void registerBaker(Class keyClass, IPluggableStaticBaker

    renderer); } } diff --git a/api/buildcraft/api/transport/pipe/PipeBehaviour.java b/api/buildcraft/api/transport/pipe/PipeBehaviour.java index e4622bc..bba3609 100644 --- a/api/buildcraft/api/transport/pipe/PipeBehaviour.java +++ b/api/buildcraft/api/transport/pipe/PipeBehaviour.java @@ -1,25 +1,24 @@ package buildcraft.api.transport.pipe; -import java.io.IOException; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.RayTraceResult; - +import buildcraft.api.core.EnumPipePart; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.network.NetworkDirection; +import net.minecraftforge.network.NetworkEvent; -import buildcraft.api.core.EnumPipePart; +import javax.annotation.Nonnull; +import java.io.IOException; public abstract class PipeBehaviour implements ICapabilityProvider { public final IPipe pipe; @@ -28,63 +27,70 @@ public PipeBehaviour(IPipe pipe) { this.pipe = pipe; } - public PipeBehaviour(IPipe pipe, NBTTagCompound nbt) { + public PipeBehaviour(IPipe pipe, CompoundTag nbt) { this.pipe = pipe; } - public NBTTagCompound writeToNbt() { - NBTTagCompound nbt = new NBTTagCompound(); + public CompoundTag writeToNbt() { + CompoundTag nbt = new CompoundTag(); return nbt; } - public void writePayload(PacketBuffer buffer, Side side) {} + public void writePayload(FriendlyByteBuf buffer, Dist side) { + } - public void readPayload(PacketBuffer buffer, Side side, MessageContext ctx) throws IOException {} + // public void readPayload(FriendlyByteBuf buffer, Dist side, MessageContext ctx) throws IOException {} + public void readPayload(FriendlyByteBuf buffer, NetworkDirection side, NetworkEvent.Context ctx) throws IOException { + } - /** @deprecated Replaced by {@link #getTextureData(EnumFacing)}. */ + /** @deprecated Replaced by {@link #getTextureData(Direction)}. */ @Deprecated - public int getTextureIndex(EnumFacing face) { + public int getTextureIndex(Direction face) { return 0; } - public PipeFaceTex getTextureData(EnumFacing face) { + public PipeFaceTex getTextureData(Direction face) { return PipeFaceTex.get(getTextureIndex(face)); } // Event handling - public boolean canConnect(EnumFacing face, PipeBehaviour other) { + public boolean canConnect(Direction face, PipeBehaviour other) { return true; } - public boolean canConnect(EnumFacing face, TileEntity oTile) { + public boolean canConnect(Direction face, BlockEntity oTile) { return true; } /** Used to force a connection to a given tile, even if the {@link PipeFlow} wouldn't normally connect to it. */ - public boolean shouldForceConnection(EnumFacing face, TileEntity oTile) { + public boolean shouldForceConnection(Direction face, BlockEntity oTile) { return false; } - public boolean onPipeActivate(EntityPlayer player, RayTraceResult trace, float hitX, float hitY, float hitZ, - EnumPipePart part) { + public boolean onPipeActivate(Player player, HitResult trace, float hitX, float hitY, float hitZ, EnumPipePart part) { return false; } - public void onEntityCollide(Entity entity) {} - - public void onTick() {} + public void onEntityCollide(Entity entity) { + } - @Override - public boolean hasCapability(@Nonnull Capability capability, EnumFacing facing) { - return getCapability(capability, facing) != null; + public void onTick() { } + // 1.18.2: getCapability().isPresent() +// @Override +// public boolean hasCapability(@Nonnull Capability capability, EnumFacing facing) { +// return getCapability(capability, facing) != null; +// } + + @Nonnull @Override - public T getCapability(@Nonnull Capability capability, EnumFacing facing) { - return null; + public LazyOptional getCapability(@Nonnull Capability capability, Direction facing) { + return LazyOptional.empty(); } - public void addDrops(NonNullList toDrop, int fortune) {} + public void addDrops(NonNullList toDrop, int fortune) { + } } diff --git a/api/buildcraft/api/transport/pipe/PipeConnectionAPI.java b/api/buildcraft/api/transport/pipe/PipeConnectionAPI.java index 9872034..b038090 100644 --- a/api/buildcraft/api/transport/pipe/PipeConnectionAPI.java +++ b/api/buildcraft/api/transport/pipe/PipeConnectionAPI.java @@ -1,10 +1,9 @@ package buildcraft.api.transport.pipe; -import java.util.Map; - import com.google.common.collect.Maps; +import net.minecraft.world.level.block.Block; -import net.minecraft.block.Block; +import java.util.Map; /** Use this class to register blocks with custom block sizes so that pipes can connect to them properly. Note that you * do not need to register a custom pipe connection if your block implements ICustomPipeConnection. The registered @@ -15,7 +14,7 @@ public final class PipeConnectionAPI { /** Register a block with a custom connection. Useful if you don't own the block class or are adding it for some-one * else. - * + * * @param block The block instance * @param connection The connection instance */ public static void registerConnection(Block block, ICustomPipeConnection connection) { diff --git a/api/buildcraft/api/transport/pipe/PipeDefinition.java b/api/buildcraft/api/transport/pipe/PipeDefinition.java index cfd3e68..f991d1e 100644 --- a/api/buildcraft/api/transport/pipe/PipeDefinition.java +++ b/api/buildcraft/api/transport/pipe/PipeDefinition.java @@ -1,15 +1,17 @@ package buildcraft.api.transport.pipe; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Rarity; +import net.minecraftforge.fml.ModContainer; +import net.minecraftforge.fml.ModLoadingContext; + import javax.annotation.Nonnull; import javax.annotation.Nullable; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ResourceLocation; - -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.ModContainer; - public final class PipeDefinition { + public final Item.Properties properties; public final ResourceLocation identifier; public final IPipeCreator logicConstructor; public final IPipeLoader logicLoader; @@ -23,6 +25,7 @@ public final class PipeDefinition { private EnumPipeColourType colourType; public PipeDefinition(PipeDefinitionBuilder builder) { + this.properties = builder.properties; this.identifier = builder.identifier; this.textures = new String[builder.textureSuffixes.length]; for (int i = 0; i < textures.length; i++) { @@ -63,10 +66,14 @@ public interface IPipeCreator { @FunctionalInterface public interface IPipeLoader { - PipeBehaviour loadBehaviour(IPipe t, NBTTagCompound u); + PipeBehaviour loadBehaviour(IPipe t, CompoundTag u); } public static class PipeDefinitionBuilder { + public Item.Properties properties = new Item.Properties() + .rarity(Rarity.COMMON) + .durability(0) + .stacksTo(64); public ResourceLocation identifier; public String texturePrefix; public String[] textureSuffixes = { "" }; @@ -81,10 +88,11 @@ public static class PipeDefinitionBuilder { public boolean canBeColoured; public EnumPipeColourType colourType; - public PipeDefinitionBuilder() {} + public PipeDefinitionBuilder() { + } public PipeDefinitionBuilder(ResourceLocation identifier, IPipeCreator logicConstructor, - IPipeLoader logicLoader, PipeFlowType flowType) { + IPipeLoader logicLoader, PipeFlowType flowType) { this.identifier = identifier; this.logicConstructor = logicConstructor; this.logicLoader = logicLoader; @@ -100,10 +108,10 @@ public PipeDefinitionBuilder idTex(String both) { } private static String getActiveModId() { - ModContainer mod = Loader.instance().activeModContainer(); + ModContainer mod = ModLoadingContext.get().getActiveContainer(); if (mod == null) { throw new IllegalStateException( - "Cannot interact with PipeDefinition outside of an actively scoped mod!"); + "Cannot interact with PipeDefinition outside of an actively scoped mod!"); } return mod.getModId(); } @@ -119,7 +127,7 @@ public PipeDefinitionBuilder tex(String prefix, String... suffixes) { /** Sets the texture prefix to be: [current_mod_id]:pipes/[prefix] where [current_mod_id] is the * modid of the currently loaded mod, and [prefix] is the string parameter given. - * + * * @return this */ public PipeDefinitionBuilder texPrefix(String prefix) { return texPrefixDirect(getActiveModId() + ":pipes/" + prefix); @@ -127,7 +135,7 @@ public PipeDefinitionBuilder texPrefix(String prefix) { /** Sets the {@link #texturePrefix} to the input string, without any additions or changes (unlike * {@link #texPrefix(String)}) - * + * * @return this */ public PipeDefinitionBuilder texPrefixDirect(String prefix) { texturePrefix = prefix; @@ -136,7 +144,7 @@ public PipeDefinitionBuilder texPrefixDirect(String prefix) { /** Sets {@link #textureSuffixes} to the given array, or to {""} if the argument list is empty or * null. - * + * * @return this. */ public PipeDefinitionBuilder texSuffixes(String... suffixes) { if (suffixes == null || suffixes.length == 0) { diff --git a/api/buildcraft/api/transport/pipe/PipeEventConnectionChange.java b/api/buildcraft/api/transport/pipe/PipeEventConnectionChange.java index fe529dd..01487ed 100644 --- a/api/buildcraft/api/transport/pipe/PipeEventConnectionChange.java +++ b/api/buildcraft/api/transport/pipe/PipeEventConnectionChange.java @@ -1,14 +1,14 @@ package buildcraft.api.transport.pipe; -import net.minecraft.util.EnumFacing; +import net.minecraft.core.Direction; /** Fired whenever a connection change is picked up by an {@link IPipe}. This even doesn't include the new value - * (boolean isConnected) as it can be accessed via {@link IPipe#isConnected(EnumFacing)}. */ + * (boolean isConnected) as it can be accessed via {@link IPipe#isConnected(Direction)}. */ public class PipeEventConnectionChange extends PipeEvent { - public final EnumFacing direction; + public final Direction direction; - public PipeEventConnectionChange(IPipeHolder holder, EnumFacing direction) { + public PipeEventConnectionChange(IPipeHolder holder, Direction direction) { super(holder); this.direction = direction; } diff --git a/api/buildcraft/api/transport/pipe/PipeEventFluid.java b/api/buildcraft/api/transport/pipe/PipeEventFluid.java index e057122..cf3c4e9 100644 --- a/api/buildcraft/api/transport/pipe/PipeEventFluid.java +++ b/api/buildcraft/api/transport/pipe/PipeEventFluid.java @@ -1,15 +1,13 @@ package buildcraft.api.transport.pipe; +import net.minecraft.core.Direction; +import net.minecraftforge.fluids.FluidStack; + +import javax.annotation.Nonnull; import java.util.Arrays; import java.util.Collection; import java.util.EnumSet; -import javax.annotation.Nonnull; - -import net.minecraft.util.EnumFacing; - -import net.minecraftforge.fluids.FluidStack; - public abstract class PipeEventFluid extends PipeEvent { public final IFlowFluid flow; @@ -27,12 +25,12 @@ protected PipeEventFluid(boolean canBeCancelled, IPipeHolder holder, IFlowFluid } public static class TryInsert extends PipeEventFluid { - public final EnumFacing from; + public final Direction from; /** The incoming fluidstack. Currently changing this does nothing. */ @Nonnull public final FluidStack fluid; - public TryInsert(IPipeHolder holder, IFlowFluid flow, EnumFacing from, @Nonnull FluidStack fluid) { + public TryInsert(IPipeHolder holder, IFlowFluid flow, Direction from, @Nonnull FluidStack fluid) { super(true, holder, flow); this.from = from; this.fluid = fluid; @@ -48,19 +46,19 @@ public static class PreMoveToCentre extends PipeEventFluid { /** The maximum amount of fluid that the centre pipe could accept. */ public final int totalAcceptable; - /** Array of {@link EnumFacing#getIndex()} to the maximum amount of fluid that a given side can offer. DO NOT + /** Array of {@link Direction#get3DDataValue()} to the maximum amount of fluid that a given side can offer. DO NOT * CHANGE THIS! */ public final int[] totalOffered; // Used for checking the state private final int[] totalOfferedCheck; - /** Array of {@link EnumFacing#getIndex()} to the amount of fluid that the given side will actually offer to the + /** Array of {@link Direction#get3DDataValue()} to the amount of fluid that the given side will actually offer to the * centre. This should *never* be larger than */ public final int[] actuallyOffered; public PreMoveToCentre(IPipeHolder holder, IFlowFluid flow, FluidStack fluid, int totalAcceptable, - int[] totalOffered, int[] actuallyOffered) { + int[] totalOffered, int[] actuallyOffered) { super(holder, flow); this.fluid = fluid; this.totalAcceptable = totalAcceptable; @@ -77,7 +75,7 @@ public String checkStateForErrors() { } if (actuallyOffered[i] > totalOffered[i]) { return "actuallyOffered[" + i + "](=" + actuallyOffered[i] - + ") shouldn't be greater than totalOffered[" + i + "](=" + totalOffered[i] + ")"; + + ") shouldn't be greater than totalOffered[" + i + "](=" + totalOffered[i] + ")"; } } return super.checkStateForErrors(); @@ -97,7 +95,7 @@ public static class OnMoveToCentre extends PipeEventFluid { private final int[] fluidLeaveCheck, fluidEnterCheck; public OnMoveToCentre(IPipeHolder holder, IFlowFluid flow, FluidStack fluid, int[] fluidLeavingSide, - int[] fluidEnteringCentre) { + int[] fluidEnteringCentre) { super(holder, flow); this.fluid = fluid; this.fluidLeavingSide = fluidLeavingSide; @@ -111,15 +109,15 @@ public String checkStateForErrors() { for (int i = 0; i < fluidLeavingSide.length; i++) { if (fluidLeavingSide[i] > fluidLeaveCheck[i]) { return "fluidLeavingSide[" + i + "](=" + fluidLeavingSide[i] - + ") shouldn't be bigger than its original value!(=" + fluidLeaveCheck[i] + ")"; + + ") shouldn't be bigger than its original value!(=" + fluidLeaveCheck[i] + ")"; } if (fluidEnteringCentre[i] > fluidEnterCheck[i]) { return "fluidEnteringCentre[" + i + "](=" + fluidEnteringCentre[i] - + ") shouldn't be bigger than its original value!(=" + fluidEnterCheck[i] + ")"; + + ") shouldn't be bigger than its original value!(=" + fluidEnterCheck[i] + ")"; } if (fluidEnteringCentre[i] > fluidLeavingSide[i]) { return "fluidEnteringCentre[" + i + "](=" + fluidEnteringCentre[i] - + ") shouldn't be bigger than fluidLeavingSide[" + i + "](=" + fluidLeavingSide[i] + ")"; + + ") shouldn't be bigger than fluidLeavingSide[" + i + "](=" + fluidLeavingSide[i] + ")"; } } return super.checkStateForErrors(); @@ -132,7 +130,7 @@ public static class SideCheck extends PipeEventFluid { /** The priorities of each side. Stored inversely to the values given, so a higher priority will have a lower * value than a lower priority. */ private final int[] priority = new int[6]; - private final EnumSet allowed = EnumSet.allOf(EnumFacing.class); + private final EnumSet allowed = EnumSet.allOf(Direction.class); public SideCheck(IPipeHolder holder, IFlowFluid flow, FluidStack fluid) { super(holder, flow); @@ -142,23 +140,23 @@ public SideCheck(IPipeHolder holder, IFlowFluid flow, FluidStack fluid) { /** Checks to see if a side if allowed. Note that this may return true even though a later handler might * disallow a side, so you should only use this to skip checking a side (for example a diamond pipe might not * check the filters for a specific side if its already been disallowed) */ - public boolean isAllowed(EnumFacing side) { + public boolean isAllowed(Direction side) { return allowed.contains(side); } /** Disallows the specific side(s) from being a destination for the item. If no sides are allowed, then the * fluid will stay in the current pipe section. */ - public void disallow(EnumFacing... sides) { - for (EnumFacing side : sides) { + public void disallow(Direction... sides) { + for (Direction side : sides) { allowed.remove(side); } } - public void disallowAll(Collection sides) { + public void disallowAll(Collection sides) { allowed.removeAll(sides); } - public void disallowAllExcept(EnumFacing side) { + public void disallowAllExcept(Direction side) { if (allowed.contains(side)) { allowed.clear(); allowed.add(side); @@ -167,7 +165,7 @@ public void disallowAllExcept(EnumFacing side) { } } - public void disallowAllExcept(EnumFacing... sides) { + public void disallowAllExcept(Direction... sides) { switch (sides.length) { case 0: { allowed.clear(); @@ -190,8 +188,8 @@ public void disallowAllExcept(EnumFacing... sides) { return; } default: { - EnumSet except = EnumSet.noneOf(EnumFacing.class); - for (EnumFacing face : sides) { + EnumSet except = EnumSet.noneOf(Direction.class); + for (Direction face : sides) { except.add(face); } this.allowed.retainAll(except); @@ -200,7 +198,7 @@ public void disallowAllExcept(EnumFacing... sides) { } } - public void disallowAllExcept(Collection sides) { + public void disallowAllExcept(Collection sides) { allowed.retainAll(sides); } @@ -208,30 +206,31 @@ public void disallowAll() { allowed.clear(); } - public void increasePriority(EnumFacing side) { + public void increasePriority(Direction side) { increasePriority(side, 1); } - public void increasePriority(EnumFacing side, int by) { + public void increasePriority(Direction side, int by) { priority[side.ordinal()] -= by; } - public void decreasePriority(EnumFacing side) { + public void decreasePriority(Direction side) { decreasePriority(side, 1); } - public void decreasePriority(EnumFacing side, int by) { + public void decreasePriority(Direction side, int by) { increasePriority(side, -by); } - public EnumSet getOrder() { + public EnumSet getOrder() { if (allowed.isEmpty()) { - return EnumSet.noneOf(EnumFacing.class); + return EnumSet.noneOf(Direction.class); } if (allowed.size() == 1) { return allowed; } - priority_search: { + priority_search: + { int val = priority[0]; for (int i = 1; i < priority.length; i++) { if (priority[i] != val) { @@ -251,8 +250,8 @@ public EnumSet getOrder() { continue; } last = current; - EnumSet set = EnumSet.noneOf(EnumFacing.class); - for (EnumFacing face : EnumFacing.VALUES) { + EnumSet set = EnumSet.noneOf(Direction.class); + for (Direction face : Direction.VALUES) { if (allowed.contains(face)) { if (priority[face.ordinal()] == current) { set.add(face); @@ -263,7 +262,7 @@ public EnumSet getOrder() { return set; } } - return EnumSet.noneOf(EnumFacing.class); + return EnumSet.noneOf(Direction.class); } } } diff --git a/api/buildcraft/api/transport/pipe/PipeEventHandler.java b/api/buildcraft/api/transport/pipe/PipeEventHandler.java index 15eaeca..44d9424 100644 --- a/api/buildcraft/api/transport/pipe/PipeEventHandler.java +++ b/api/buildcraft/api/transport/pipe/PipeEventHandler.java @@ -9,11 +9,11 @@ * extends {@link PipeEvent}.
    * An example is:
    * - @PipeEventHandler
    - public void sideCheck(PipeEventItem.SideCheck sideCheck) {
    - // Logic omitted
    - } - * + @PipeEventHandler
    + public void sideCheck(PipeEventItem.SideCheck sideCheck) {
    + // Logic omitted
    + } + * *
    */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) diff --git a/api/buildcraft/api/transport/pipe/PipeEventItem.java b/api/buildcraft/api/transport/pipe/PipeEventItem.java index e049029..3940ca8 100644 --- a/api/buildcraft/api/transport/pipe/PipeEventItem.java +++ b/api/buildcraft/api/transport/pipe/PipeEventItem.java @@ -1,23 +1,16 @@ package buildcraft.api.transport.pipe; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.EnumSet; -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.EnumDyeColor; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.*; public abstract class PipeEventItem extends PipeEvent { @@ -44,8 +37,8 @@ protected PipeEventItem(boolean canBeCancelled, IPipeHolder holder, IFlowItems f /** Fires whenever item insertion is attempted. The item might have been extracted by the pipe behaviour, inserted * by another pipe or even a different kind of tile. Note that you have no way of telling what caused this event. */ public static class TryInsert extends PipeEventItem { - public final EnumDyeColor colour; - public final EnumFacing from; + public final DyeColor colour; + public final Direction from; /** The itemstack that is attempting to be inserted. NEVER CHANGE THIS! */ @Nonnull public final ItemStack attempting; @@ -53,8 +46,8 @@ public static class TryInsert extends PipeEventItem { * {@link #attempting} */ public int accepted; - public TryInsert(IPipeHolder holder, IFlowItems flow, EnumDyeColor colour, EnumFacing from, - @Nonnull ItemStack attempting) { + public TryInsert(IPipeHolder holder, IFlowItems flow, DyeColor colour, Direction from, + @Nonnull ItemStack attempting) { super(true, holder, flow); this.colour = colour; this.from = from; @@ -70,11 +63,11 @@ public void cancel() { } public static abstract class ReachDest extends PipeEventItem { - public EnumDyeColor colour; + public DyeColor colour; @Nonnull private ItemStack stack; - public ReachDest(IPipeHolder holder, IFlowItems flow, EnumDyeColor colour, @Nonnull ItemStack stack) { + public ReachDest(IPipeHolder holder, IFlowItems flow, DyeColor colour, @Nonnull ItemStack stack) { super(holder, flow); this.colour = colour; this.stack = stack; @@ -96,10 +89,10 @@ public void setStack(ItemStack stack) { /** Fired after {@link TryInsert} (if some items were allowed in) to modify the incoming itemstack or its colour. */ public static class OnInsert extends ReachDest { - public final EnumFacing from; + public final Direction from; - public OnInsert(IPipeHolder holder, IFlowItems flow, EnumDyeColor colour, @Nonnull ItemStack stack, - EnumFacing from) { + public OnInsert(IPipeHolder holder, IFlowItems flow, DyeColor colour, @Nonnull ItemStack stack, + Direction from) { super(holder, flow, colour, stack); this.from = from; } @@ -107,10 +100,10 @@ public OnInsert(IPipeHolder holder, IFlowItems flow, EnumDyeColor colour, @Nonnu /** Fired whenever an item reaches the centre of a pipe. Note that you *can* change the itemstack or the colour. */ public static class ReachCenter extends ReachDest { - public final EnumFacing from; + public final Direction from; - public ReachCenter(IPipeHolder holder, IFlowItems flow, EnumDyeColor colour, @Nonnull ItemStack stack, - EnumFacing from) { + public ReachCenter(IPipeHolder holder, IFlowItems flow, DyeColor colour, @Nonnull ItemStack stack, + Direction from) { super(holder, flow, colour, stack); this.from = from; } @@ -118,10 +111,10 @@ public ReachCenter(IPipeHolder holder, IFlowItems flow, EnumDyeColor colour, @No /** Fired whenever an item reaches the end of a pipe. Note that you *can* change the itemstack or the colour. */ public static class ReachEnd extends ReachDest { - public final EnumFacing to; + public final Direction to; - public ReachEnd(IPipeHolder holder, IFlowItems flow, EnumDyeColor colour, @Nonnull ItemStack stack, - EnumFacing to) { + public ReachEnd(IPipeHolder holder, IFlowItems flow, DyeColor colour, @Nonnull ItemStack stack, + Direction to) { super(holder, flow, colour, stack); this.to = to; } @@ -139,9 +132,9 @@ public static abstract class Ejected extends PipeEventItem { private ItemStack excess; /** The side that the item has been ejected to. */ - public final EnumFacing to; + public final Direction to; - protected Ejected(IPipeHolder holder, IFlowItems flow, ItemStack inserted, ItemStack excess, EnumFacing to) { + protected Ejected(IPipeHolder holder, IFlowItems flow, ItemStack inserted, ItemStack excess, Direction to) { super(holder, flow); this.inserted = inserted; this.excess = excess; @@ -165,8 +158,8 @@ public void setExcess(ItemStack stack) { public static class IntoPipe extends Ejected { public final IFlowItems otherPipe; - public IntoPipe(IPipeHolder holder, IFlowItems flow, ItemStack inserted, ItemStack excess, EnumFacing to, - IFlowItems otherPipe) { + public IntoPipe(IPipeHolder holder, IFlowItems flow, ItemStack inserted, ItemStack excess, Direction to, + IFlowItems otherPipe) { super(holder, flow, inserted, excess, to); this.otherPipe = otherPipe; } @@ -174,10 +167,10 @@ public IntoPipe(IPipeHolder holder, IFlowItems flow, ItemStack inserted, ItemSta /** Fired when an item is injected into a tile entity. (Refer to {@link Ejected} for more details) */ public static class IntoTile extends Ejected { - public final TileEntity tile; + public final BlockEntity tile; - public IntoTile(IPipeHolder holder, IFlowItems flow, ItemStack inserted, ItemStack excess, EnumFacing to, - TileEntity tile) { + public IntoTile(IPipeHolder holder, IFlowItems flow, ItemStack inserted, ItemStack excess, Direction to, + BlockEntity tile) { super(holder, flow, inserted, excess, to); this.tile = tile; } @@ -193,18 +186,18 @@ public IntoTile(IPipeHolder holder, IFlowItems flow, ItemStack inserted, ItemSta /** Fired after {@link ReachCenter} to determine what sides are the items NOT allowed to go to, and the order of * priority for the allowed sides. */ public static class SideCheck extends PipeEventItem { - public final EnumDyeColor colour; - public final EnumFacing from; + public final DyeColor colour; + public final Direction from; @Nonnull public final ItemStack stack; /** The priorities of each side. Stored inversely to the values given, so a higher priority will have a lower * value than a lower priority. */ private final int[] priority = new int[6]; - private final EnumSet allowed = EnumSet.allOf(EnumFacing.class); + private final EnumSet allowed = EnumSet.allOf(Direction.class); - public SideCheck(IPipeHolder holder, IFlowItems flow, EnumDyeColor colour, EnumFacing from, - @Nonnull ItemStack stack) { + public SideCheck(IPipeHolder holder, IFlowItems flow, DyeColor colour, Direction from, + @Nonnull ItemStack stack) { super(holder, flow); this.colour = colour; this.from = from; @@ -214,23 +207,23 @@ public SideCheck(IPipeHolder holder, IFlowItems flow, EnumDyeColor colour, EnumF /** Checks to see if a side if allowed. Note that this may return true even though a later handler might * disallow a side, so you should only use this to skip checking a side (for example a diamond pipe might not * check the filters for a specific side if its already been disallowed) */ - public boolean isAllowed(EnumFacing side) { + public boolean isAllowed(Direction side) { return allowed.contains(side); } /** Disallows the specific side(s) from being a destination for the item. If no sides are allowed, then * {@link TryBounce} will be fired to test if the item can bounce back. */ - public void disallow(EnumFacing... sides) { - for (EnumFacing side : sides) { + public void disallow(Direction... sides) { + for (Direction side : sides) { allowed.remove(side); } } - public void disallowAll(Collection sides) { + public void disallowAll(Collection sides) { allowed.removeAll(sides); } - public void disallowAllExcept(EnumFacing... sides) { + public void disallowAllExcept(Direction... sides) { allowed.retainAll(Lists.newArrayList(sides)); } @@ -238,23 +231,23 @@ public void disallowAll() { allowed.clear(); } - public void increasePriority(EnumFacing side) { + public void increasePriority(Direction side) { increasePriority(side, 1); } - public void increasePriority(EnumFacing side, int by) { + public void increasePriority(Direction side, int by) { priority[side.ordinal()] -= by; } - public void decreasePriority(EnumFacing side) { + public void decreasePriority(Direction side) { decreasePriority(side, 1); } - public void decreasePriority(EnumFacing side, int by) { + public void decreasePriority(Direction side, int by) { increasePriority(side, -by); } - public List> getOrder() { + public List> getOrder() { // Skip the calculations if the size is simple switch (allowed.size()) { case 0: @@ -263,7 +256,8 @@ public List> getOrder() { return ImmutableList.of(allowed); default: } - priority_search: { + priority_search: + { int val = priority[0]; for (int i = 1; i < priority.length; i++) { if (priority[i] != val) { @@ -277,15 +271,15 @@ public List> getOrder() { int[] ordered = Arrays.copyOf(priority, 6); Arrays.sort(ordered); int last = 0; - List> list = Lists.newArrayList(); + List> list = Lists.newArrayList(); for (int i = 0; i < 6; i++) { int current = ordered[i]; if (i != 0 && current == last) { continue; } last = current; - EnumSet set = EnumSet.noneOf(EnumFacing.class); - for (EnumFacing face : EnumFacing.VALUES) { + EnumSet set = EnumSet.noneOf(Direction.class); + for (Direction face : Direction.VALUES) { if (allowed.contains(face)) { if (priority[face.ordinal()] == current) { set.add(face); @@ -303,14 +297,14 @@ public List> getOrder() { /** Fired after {@link SideCheck} (if all sides were disallowed) to see if the item is allowed to bounce back to * where it was inserted. */ public static class TryBounce extends PipeEventItem { - public final EnumDyeColor colour; - public final EnumFacing from; + public final DyeColor colour; + public final Direction from; @Nonnull public final ItemStack stack; public boolean canBounce = false; - public TryBounce(IPipeHolder holder, IFlowItems flow, EnumDyeColor colour, EnumFacing from, - @Nonnull ItemStack stack) { + public TryBounce(IPipeHolder holder, IFlowItems flow, DyeColor colour, Direction from, + @Nonnull ItemStack stack) { super(holder, flow); this.colour = colour; this.from = from; @@ -319,9 +313,9 @@ public TryBounce(IPipeHolder holder, IFlowItems flow, EnumDyeColor colour, EnumF } public static class Drop extends PipeEventItem { - private final EntityItem entity; + private final ItemEntity entity; - public Drop(IPipeHolder holder, IFlowItems flow, EntityItem entity) { + public Drop(IPipeHolder holder, IFlowItems flow, ItemEntity entity) { super(holder, flow); this.entity = entity; } @@ -342,32 +336,32 @@ public void setStack(ItemStack stack) { } } - public EntityItem getEntity() { + public ItemEntity getEntity() { return this.entity; } } /** Base class for {@link Split} and {@link FindDest}. Do not listen to this directly! */ public static abstract class OrderedEvent extends PipeEventItem { - public final List> orderedDestinations; + public final List> orderedDestinations; - public OrderedEvent(IPipeHolder holder, IFlowItems flow, List> orderedDestinations) { + public OrderedEvent(IPipeHolder holder, IFlowItems flow, List> orderedDestinations) { super(holder, flow); this.orderedDestinations = orderedDestinations; } - public EnumSet getAllPossibleDestinations() { - EnumSet set = EnumSet.noneOf(EnumFacing.class); - for (EnumSet e : orderedDestinations) { + public EnumSet getAllPossibleDestinations() { + EnumSet set = EnumSet.noneOf(Direction.class); + for (EnumSet e : orderedDestinations) { set.addAll(e); } return set; } - public ImmutableList generateRandomOrder() { - ImmutableList.Builder builder = ImmutableList.builder(); - for (EnumSet set : orderedDestinations) { - List faces = new ArrayList<>(set); + public ImmutableList generateRandomOrder() { + ImmutableList.Builder builder = ImmutableList.builder(); + for (EnumSet set : orderedDestinations) { + List faces = new ArrayList<>(set); Collections.shuffle(faces); builder.addAll(faces); } @@ -382,7 +376,7 @@ public ImmutableList generateRandomOrder() { public static class Split extends OrderedEvent { public final List items = new ArrayList<>(); - public Split(IPipeHolder holder, IFlowItems flow, List> order, ItemEntry toSplit) { + public Split(IPipeHolder holder, IFlowItems flow, List> order, ItemEntry toSplit) { super(holder, flow, order); items.add(toSplit); } @@ -394,8 +388,8 @@ public Split(IPipeHolder holder, IFlowItems flow, List> orde public static class FindDest extends OrderedEvent { public final ImmutableList items; - public FindDest(IPipeHolder holder, IFlowItems flow, List> orderedDestinations, - ImmutableList items) { + public FindDest(IPipeHolder holder, IFlowItems flow, List> orderedDestinations, + ImmutableList items) { super(holder, flow, orderedDestinations); this.items = items; } @@ -422,15 +416,15 @@ public void modifyTo(double target, double maxDelta) { /** Mostly immutable holding class for item stacks. */ public static class ItemEntry { - public final EnumDyeColor colour; + public final DyeColor colour; @Nonnull public final ItemStack stack; - public final EnumFacing from; + public final Direction from; /** The list of the destinations to try, in order. */ @Nullable - public List to; + public List to; - public ItemEntry(EnumDyeColor colour, @Nonnull ItemStack stack, EnumFacing from) { + public ItemEntry(DyeColor colour, @Nonnull ItemStack stack, Direction from) { this.colour = colour; this.stack = stack; this.from = from; diff --git a/api/buildcraft/api/transport/pipe/PipeEventPower.java b/api/buildcraft/api/transport/pipe/PipeEventPower.java index 4e356eb..fc30a20 100644 --- a/api/buildcraft/api/transport/pipe/PipeEventPower.java +++ b/api/buildcraft/api/transport/pipe/PipeEventPower.java @@ -1,8 +1,7 @@ package buildcraft.api.transport.pipe; -import net.minecraft.util.EnumFacing; - import buildcraft.api.mj.MjAPI; +import net.minecraft.core.Direction; public abstract class PipeEventPower extends PipeEvent { public final IFlowPower flow; @@ -74,18 +73,18 @@ public void setReceiver(boolean receiver) { } public static class PrimaryDirection extends PipeEventPower { - private EnumFacing facing; + private Direction facing; - public PrimaryDirection(IPipeHolder holder, IFlowPower flow, EnumFacing facing) { + public PrimaryDirection(IPipeHolder holder, IFlowPower flow, Direction facing) { super(holder, flow); this.facing = facing; } - public EnumFacing getFacing() { + public Direction getFacing() { return facing; } - public void setFacing(EnumFacing facing) { + public void setFacing(Direction facing) { this.facing = facing; } } diff --git a/api/buildcraft/api/transport/pipe/PipeEventStatement.java b/api/buildcraft/api/transport/pipe/PipeEventStatement.java index 5d96caf..7a236f0 100644 --- a/api/buildcraft/api/transport/pipe/PipeEventStatement.java +++ b/api/buildcraft/api/transport/pipe/PipeEventStatement.java @@ -1,15 +1,13 @@ package buildcraft.api.transport.pipe; -import java.util.Collection; - -import javax.annotation.Nonnull; - -import net.minecraft.util.EnumFacing; - import buildcraft.api.statements.IActionInternal; import buildcraft.api.statements.IActionInternalSided; import buildcraft.api.statements.ITriggerInternal; import buildcraft.api.statements.ITriggerInternalSided; +import net.minecraft.core.Direction; + +import javax.annotation.Nonnull; +import java.util.Collection; public abstract class PipeEventStatement extends PipeEvent { public PipeEventStatement(IPipeHolder holder) { @@ -31,9 +29,9 @@ public static class AddTriggerInternalSided extends PipeEventStatement { public final Collection triggers; @Nonnull - public final EnumFacing side; + public final Direction side; - public AddTriggerInternalSided(IPipeHolder holder, Collection triggers, @Nonnull EnumFacing side) { + public AddTriggerInternalSided(IPipeHolder holder, Collection triggers, @Nonnull Direction side) { super(holder); this.triggers = triggers; this.side = side; @@ -55,9 +53,9 @@ public static class AddActionInternalSided extends PipeEventStatement { public final Collection actions; @Nonnull - public final EnumFacing side; + public final Direction side; - public AddActionInternalSided(IPipeHolder holder, Collection actions, @Nonnull EnumFacing side) { + public AddActionInternalSided(IPipeHolder holder, Collection actions, @Nonnull Direction side) { super(holder); this.actions = actions; this.side = side; diff --git a/api/buildcraft/api/transport/pipe/PipeEventTileState.java b/api/buildcraft/api/transport/pipe/PipeEventTileState.java index 1847561..885c941 100644 --- a/api/buildcraft/api/transport/pipe/PipeEventTileState.java +++ b/api/buildcraft/api/transport/pipe/PipeEventTileState.java @@ -1,6 +1,6 @@ package buildcraft.api.transport.pipe; -import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.level.block.entity.BlockEntity; /** Fired when the state of a pipe's tile entity changes. Listen for subclasses, not this one! */ public abstract class PipeEventTileState extends PipeEvent { @@ -8,21 +8,21 @@ public abstract class PipeEventTileState extends PipeEvent { super(holder); } - /** Fired in {@link TileEntity#invalidate()} */ + /** Fired in {@link BlockEntity#setRemoved()} */ public static class Invalidate extends PipeEventTileState { public Invalidate(IPipeHolder holder) { super(holder); } } - /** Fired in {@link TileEntity#validate()} */ + /** Fired in {@link BlockEntity#clearRemoved()} */ public static class Validate extends PipeEventTileState { public Validate(IPipeHolder holder) { super(holder); } } - /** Fired in {@link TileEntity#onChunkUnload()} */ + /** Fired in {@link BlockEntity#onChunkUnloaded()} */ public static class ChunkUnload extends PipeEventTileState { public ChunkUnload(IPipeHolder holder) { super(holder); diff --git a/api/buildcraft/api/transport/pipe/PipeFaceTex.java b/api/buildcraft/api/transport/pipe/PipeFaceTex.java index 2c90354..af557ae 100644 --- a/api/buildcraft/api/transport/pipe/PipeFaceTex.java +++ b/api/buildcraft/api/transport/pipe/PipeFaceTex.java @@ -120,7 +120,7 @@ public boolean equals(Object obj) { if (!Arrays.equals(textures, other.textures)) { return false; } - for (int i = textures.length; i > 0;) { + for (int i = textures.length; i > 0; ) { i--; if (getColour(i) != other.getColour(i)) { return false; diff --git a/api/buildcraft/api/transport/pipe/PipeFlow.java b/api/buildcraft/api/transport/pipe/PipeFlow.java index 3ec2117..12222d8 100644 --- a/api/buildcraft/api/transport/pipe/PipeFlow.java +++ b/api/buildcraft/api/transport/pipe/PipeFlow.java @@ -1,25 +1,24 @@ package buildcraft.api.transport.pipe; -import java.io.IOException; - -import javax.annotation.Nonnull; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.RayTraceResult; - -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.fml.relauncher.Side; - import buildcraft.api.core.EnumPipePart; import buildcraft.api.transport.pipe.IPipeHolder.IWriter; import buildcraft.api.transport.pipe.IPipeHolder.PipeMessageReceiver; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.network.NetworkDirection; + +import javax.annotation.Nonnull; +import java.io.IOException; public abstract class PipeFlow implements ICapabilityProvider { /** The ID for completely refreshing the state of this flow. */ @@ -34,59 +33,64 @@ public PipeFlow(IPipe pipe) { this.pipe = pipe; } - public PipeFlow(IPipe pipe, NBTTagCompound nbt) { + public PipeFlow(IPipe pipe, CompoundTag nbt) { this.pipe = pipe; } - public NBTTagCompound writeToNbt() { - return new NBTTagCompound(); + public CompoundTag writeToNbt() { + return new CompoundTag(); } /** Writes a payload with the specified id. Standard ID's are NET_ID_FULL_STATE and NET_ID_UPDATE. */ - public void writePayload(int id, PacketBuffer buffer, Side side) {} + public void writePayload(int id, FriendlyByteBuf buffer, Dist side) { + } /** Reads a payload with the specified id. Standard ID's are NET_ID_FULL_STATE and NET_ID_UPDATE. */ - public void readPayload(int id, PacketBuffer buffer, Side side) throws IOException {} + public void readPayload(int id, FriendlyByteBuf buffer, NetworkDirection side) throws IOException { + } public void sendPayload(int id) { - final Side side = pipe.getHolder().getPipeWorld().isRemote ? Side.CLIENT : Side.SERVER; + final Dist side = pipe.getHolder().getPipeWorld().isClientSide ? Dist.CLIENT : Dist.DEDICATED_SERVER; sendCustomPayload(id, (buf) -> writePayload(id, buf, side)); } public final void sendCustomPayload(int id, IWriter writer) { - pipe.getHolder().sendMessage(PipeMessageReceiver.FLOW, buffer -> { + pipe.getHolder().sendMessage(PipeMessageReceiver.FLOW, buffer -> + { buffer.writeBoolean(true); buffer.writeShort(id); writer.write(buffer); }); } - public abstract boolean canConnect(EnumFacing face, PipeFlow other); + public abstract boolean canConnect(Direction face, PipeFlow other); - public abstract boolean canConnect(EnumFacing face, TileEntity oTile); + public abstract boolean canConnect(Direction face, BlockEntity oTile); /** Used to force a connection to a given tile, even if the {@link PipeBehaviour} wouldn't normally connect to * it. */ - public boolean shouldForceConnection(EnumFacing face, TileEntity oTile) { + public boolean shouldForceConnection(Direction face, BlockEntity oTile) { return false; } - public void onTick() {} + public void onTick() { + } - public void addDrops(NonNullList toDrop, int fortune) {} + public void addDrops(NonNullList toDrop, int fortune) { + } - public boolean onFlowActivate(EntityPlayer player, RayTraceResult trace, float hitX, float hitY, float hitZ, - EnumPipePart part) { + public boolean onFlowActivate(Player player, HitResult trace, float hitX, float hitY, float hitZ, + EnumPipePart part) { return false; } - @Override - public final boolean hasCapability(@Nonnull Capability capability, EnumFacing facing) { - return getCapability(capability, facing) != null; - } +// @Override +// public final boolean hasCapability(@Nonnull Capability capability, EnumFacing facing) { +// return getCapability(capability, facing) != null; +// } @Override - public T getCapability(@Nonnull Capability capability, EnumFacing facing) { - return null; + public LazyOptional getCapability(@Nonnull Capability capability, Direction facing) { + return LazyOptional.empty(); } } diff --git a/api/buildcraft/api/transport/pipe/PipeFlowType.java b/api/buildcraft/api/transport/pipe/PipeFlowType.java index fb79d40..2cb320f 100644 --- a/api/buildcraft/api/transport/pipe/PipeFlowType.java +++ b/api/buildcraft/api/transport/pipe/PipeFlowType.java @@ -1,6 +1,6 @@ package buildcraft.api.transport.pipe; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundTag; public final class PipeFlowType { public final IFlowCreator creator; @@ -27,6 +27,6 @@ public interface IFlowCreator { @FunctionalInterface public interface IFlowLoader { - PipeFlow loadFlow(IPipe t, NBTTagCompound u); + PipeFlow loadFlow(IPipe t, CompoundTag u); } } diff --git a/api/buildcraft/api/transport/pluggable/IPlugDynamicRenderer.java b/api/buildcraft/api/transport/pluggable/IPlugDynamicRenderer.java index 1a71aa3..5ae33c5 100644 --- a/api/buildcraft/api/transport/pluggable/IPlugDynamicRenderer.java +++ b/api/buildcraft/api/transport/pluggable/IPlugDynamicRenderer.java @@ -1,8 +1,9 @@ package buildcraft.api.transport.pluggable; - -import net.minecraft.client.renderer.BufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; public interface IPlugDynamicRenderer

    { - void render(P plug, double x, double y, double z, float partialTicks, BufferBuilder bb); + // void render(P plug, double x, double y, double z, float partialTicks, BufferBuilder bb); + void render(P gate, float partialTicks, PoseStack poseStack, VertexConsumer vertexConsumer, int combinedLight, int combinedOverlay); } diff --git a/api/buildcraft/api/transport/pluggable/IPluggableRegistry.java b/api/buildcraft/api/transport/pluggable/IPluggableRegistry.java index 243731c..5fa459a 100644 --- a/api/buildcraft/api/transport/pluggable/IPluggableRegistry.java +++ b/api/buildcraft/api/transport/pluggable/IPluggableRegistry.java @@ -1,6 +1,6 @@ package buildcraft.api.transport.pluggable; -import net.minecraft.util.ResourceLocation; +import net.minecraft.resources.ResourceLocation; public interface IPluggableRegistry { default void register(PluggableDefinition definition) { diff --git a/api/buildcraft/api/transport/pluggable/IPluggableStaticBaker.java b/api/buildcraft/api/transport/pluggable/IPluggableStaticBaker.java index a3f0012..f33eb34 100644 --- a/api/buildcraft/api/transport/pluggable/IPluggableStaticBaker.java +++ b/api/buildcraft/api/transport/pluggable/IPluggableStaticBaker.java @@ -1,13 +1,12 @@ package buildcraft.api.transport.pluggable; -import java.util.List; - import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import java.util.List; -@SideOnly(Side.CLIENT) +@OnlyIn(Dist.CLIENT) public interface IPluggableStaticBaker { List bake(K key); } diff --git a/api/buildcraft/api/transport/pluggable/PipePluggable.java b/api/buildcraft/api/transport/pluggable/PipePluggable.java index 73d22b6..62e3e1e 100644 --- a/api/buildcraft/api/transport/pluggable/PipePluggable.java +++ b/api/buildcraft/api/transport/pluggable/PipePluggable.java @@ -1,75 +1,73 @@ package buildcraft.api.transport.pluggable; -import java.io.IOException; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import net.minecraft.block.Block; -import net.minecraft.block.state.BlockFaceShape; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.Explosion; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - +import buildcraft.api.transport.pipe.IPipeHolder; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.network.NetworkDirection; +import net.minecraftforge.network.NetworkEvent; -import buildcraft.api.transport.pipe.IPipeHolder; -import buildcraft.api.transport.pipe.IPipeHolder.PipeMessageReceiver; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.IOException; public abstract class PipePluggable { public final PluggableDefinition definition; public final IPipeHolder holder; - public final EnumFacing side; + public final Direction side; - public PipePluggable(PluggableDefinition definition, IPipeHolder holder, EnumFacing side) { + public PipePluggable(PluggableDefinition definition, IPipeHolder holder, Direction side) { this.definition = definition; this.holder = holder; this.side = side; } - public NBTTagCompound writeToNbt() { - NBTTagCompound nbt = new NBTTagCompound(); + public CompoundTag writeToNbt() { + CompoundTag nbt = new CompoundTag(); return nbt; } /** Writes the payload that will be passed into - * {@link PluggableDefinition#loadFromBuffer(IPipeHolder, EnumFacing, PacketBuffer)} on the client. (This is called + * {@link PluggableDefinition#loadFromBuffer(IPipeHolder, Direction, FriendlyByteBuf)} on the client. (This is called * on the server and sent to the client). Note that this will be called *instead* of write and read payload. */ - public void writeCreationPayload(PacketBuffer buffer) { + public void writeCreationPayload(FriendlyByteBuf buffer) { } - public void writePayload(PacketBuffer buffer, Side side) { + public void writePayload(FriendlyByteBuf buffer, Dist side) { } - public void readPayload(PacketBuffer buffer, Side side, MessageContext ctx) throws IOException { + public void readPayload(FriendlyByteBuf buffer, NetworkDirection side, NetworkEvent.Context ctx) throws IOException { } public final void scheduleNetworkUpdate() { - holder.scheduleNetworkUpdate(PipeMessageReceiver.PLUGGABLES[side.ordinal()]); + holder.scheduleNetworkUpdate(IPipeHolder.PipeMessageReceiver.PLUGGABLES[side.ordinal()]); } - public void onTick() {} + public void onTick() { + } /** @return A bounding box that will be used for collisions and raytracing. */ - public abstract AxisAlignedBB getBoundingBox(); + public abstract VoxelShape getBoundingBox(); /** @return True if the pipe cannot connect outwards (it is blocked), or False if this does not block the pipe. */ public boolean isBlocking() { @@ -78,14 +76,14 @@ public boolean isBlocking() { /** Gets the value of a specified capability key, or null if the given capability is not supported at the call time. * This is effectively {@link ICapabilityProvider}, but where - * {@link ICapabilityProvider#hasCapability(Capability, EnumFacing)} will return true when this returns a non-null + * {@link ICapabilityProvider#getCapability(Capability, Direction)#isPresent()} will return true when this returns a non-null * value. */ - public T getCapability(@Nonnull Capability cap) { - return null; + public LazyOptional getCapability(@Nonnull Capability cap) { + return LazyOptional.empty(); } /** Gets the {@link Capability} that is accessible from the pipe that this is attached to. - * + * * @param cap * @return */ public T getInternalCapability(@Nonnull Capability cap) { @@ -93,7 +91,8 @@ public T getInternalCapability(@Nonnull Capability cap) { } /** Called whenever this pluggable is removed from the pipe. */ - public void onRemove() {} + public void onRemove() { + } /** @param toDrop A list containing all the items to drop (so you should add your items to this list) */ public void addDrops(NonNullList toDrop, int fortune) { @@ -104,58 +103,61 @@ public void addDrops(NonNullList toDrop, int fortune) { } /** Called whenever this pluggable is picked by the player (similar to Block.getPickBlock) - * + * * @return The stack that should be picked, or ItemStack.EMPTY if no stack can be picked from this pluggable. */ public ItemStack getPickStack() { return ItemStack.EMPTY; } - public boolean onPluggableActivate(EntityPlayer player, RayTraceResult trace, float hitX, float hitY, float hitZ) { + public boolean onPluggableActivate(Player player, HitResult trace, float hitX, float hitY, float hitZ) { return false; } + @OnlyIn(Dist.CLIENT) @Nullable - public PluggableModelKey getModelRenderKey(BlockRenderLayer layer) { + public PluggableModelKey getModelRenderKey(RenderType layer) { return null; } /** Called if the {@link IPluggableStaticBaker} returns quads with tint indexes set to * data * 6 + key.side.ordinal(). "data" is passed in here as "tintIndex". - * + * * @return The tint index to render the quad with, or -1 for default. */ - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) public int getBlockColor(int tintIndex) { return -1; } /** PipePluggable version of - * {@link Block#canBeConnectedTo(net.minecraft.world.IBlockAccess, net.minecraft.util.math.BlockPos, EnumFacing)}. */ + * {@link Block#canBeConnectedTo(net.minecraft.world.level.LevelAccessor, BlockPos, Direction)}. */ public boolean canBeConnected() { return false; } /** PipePluggable version of - * {@link net.minecraft.block.state.IBlockState#isSideSolid(IBlockAccess, BlockPos, EnumFacing)} */ + * {@link BlockState#isSideSolid(IBlockAccess, BlockPos, Direction)} */ public boolean isSideSolid() { return false; } - /** PipePluggable version of {@link Block#getExplosionResistance(World, BlockPos, Entity, Explosion)} */ - public float getExplosionResistance(@Nullable Entity exploder, Explosion explosion) { + /** PipePluggable version of {@link Block#getExplosionResistance(BlockState, BlockGetter, BlockPos, Explosion)} */ +// public float getExplosionResistance(@Nullable Entity exploder, Explosion explosion) + public float getExplosionResistance(@Nonnull Entity exploder, Explosion explosion) { return 0; } - public boolean canConnectToRedstone(@Nullable EnumFacing to) { + public boolean canConnectToRedstone(@Nullable Direction to) { return false; } - /** PipePluggable version of - * {@link net.minecraft.block.state.IBlockState#getBlockFaceShape(IBlockAccess, BlockPos, EnumFacing)} */ - public BlockFaceShape getBlockFaceShape() { - return BlockFaceShape.UNDEFINED; - } + // Calen: seems use block Shape in 1.18.2 +// /** PipePluggable version of +// * {@link net.minecraft.block.state.IBlockState#getBlockFaceShape(IBlockAccess, BlockPos, EnumFacing)} */ +// public BlockFaceShape getBlockFaceShape() { +// return BlockFaceShape.UNDEFINED; +// } - public void onPlacedBy(EntityPlayer player) { + public void onPlacedBy(Player player) { } } diff --git a/api/buildcraft/api/transport/pluggable/PluggableDefinition.java b/api/buildcraft/api/transport/pluggable/PluggableDefinition.java index 4d7fdaa..bed9289 100644 --- a/api/buildcraft/api/transport/pluggable/PluggableDefinition.java +++ b/api/buildcraft/api/transport/pluggable/PluggableDefinition.java @@ -1,14 +1,13 @@ package buildcraft.api.transport.pluggable; -import javax.annotation.Nullable; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.ResourceLocation; - import buildcraft.api.core.InvalidInputDataException; import buildcraft.api.transport.pipe.IPipeHolder; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +import javax.annotation.Nullable; public final class PluggableDefinition { public final ResourceLocation identifier; @@ -33,12 +32,12 @@ public PluggableDefinition(ResourceLocation identifier, @Nullable IPluggableCrea this.creator = creator; } - public PipePluggable readFromNbt(IPipeHolder holder, EnumFacing side, NBTTagCompound nbt) { + public PipePluggable readFromNbt(IPipeHolder holder, Direction side, CompoundTag nbt) { return reader.readFromNbt(this, holder, side, nbt); } - public PipePluggable loadFromBuffer(IPipeHolder holder, EnumFacing side, PacketBuffer buffer) - throws InvalidInputDataException { + public PipePluggable loadFromBuffer(IPipeHolder holder, Direction side, FriendlyByteBuf buffer) + throws InvalidInputDataException { return loader.loadFromBuffer(this, holder, side, buffer); } @@ -47,30 +46,26 @@ public interface IPluggableNbtReader { /** Reads the pipe pluggable from NBT. Unlike {@link IPluggableNetLoader} (which is allowed to fail and throw an * exception if the wrong data is given) this should make a best effort to read the pluggable from nbt, or fall * back to sensible defaults. */ - PipePluggable readFromNbt(PluggableDefinition definition, IPipeHolder holder, EnumFacing side, - NBTTagCompound nbt); + PipePluggable readFromNbt(PluggableDefinition definition, IPipeHolder holder, Direction side, CompoundTag nbt); } @FunctionalInterface public interface IPluggableNetLoader { - PipePluggable loadFromBuffer(PluggableDefinition definition, IPipeHolder holder, EnumFacing side, - PacketBuffer buffer) throws InvalidInputDataException; + PipePluggable loadFromBuffer(PluggableDefinition definition, IPipeHolder holder, Direction side, FriendlyByteBuf buffer) throws InvalidInputDataException; } @FunctionalInterface public interface IPluggableCreator extends IPluggableNbtReader, IPluggableNetLoader { @Override - default PipePluggable loadFromBuffer(PluggableDefinition definition, IPipeHolder holder, EnumFacing side, - PacketBuffer buffer) { + default PipePluggable loadFromBuffer(PluggableDefinition definition, IPipeHolder holder, Direction side, FriendlyByteBuf buffer) { return createSimplePluggable(definition, holder, side); } @Override - default PipePluggable readFromNbt(PluggableDefinition definition, IPipeHolder holder, EnumFacing side, - NBTTagCompound nbt) { + default PipePluggable readFromNbt(PluggableDefinition definition, IPipeHolder holder, Direction side, CompoundTag nbt) { return createSimplePluggable(definition, holder, side); } - PipePluggable createSimplePluggable(PluggableDefinition definition, IPipeHolder holder, EnumFacing side); + PipePluggable createSimplePluggable(PluggableDefinition definition, IPipeHolder holder, Direction side); } } diff --git a/api/buildcraft/api/transport/pluggable/PluggableModelKey.java b/api/buildcraft/api/transport/pluggable/PluggableModelKey.java index 7c832c1..83525c0 100644 --- a/api/buildcraft/api/transport/pluggable/PluggableModelKey.java +++ b/api/buildcraft/api/transport/pluggable/PluggableModelKey.java @@ -1,17 +1,17 @@ package buildcraft.api.transport.pluggable; -import java.util.Objects; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.Direction; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.EnumFacing; +import java.util.Objects; public abstract class PluggableModelKey { - public final BlockRenderLayer layer; - public final EnumFacing side; + public final RenderType layer; + public final Direction side; private final int hash; - public PluggableModelKey(BlockRenderLayer layer, EnumFacing side) { - if (layer != BlockRenderLayer.CUTOUT && layer != BlockRenderLayer.TRANSLUCENT) { + public PluggableModelKey(RenderType layer, Direction side) { + if (layer != RenderType.cutout() && layer != RenderType.translucent()) { throw new IllegalArgumentException("Can only use CUTOUT or TRANSLUCENT at the moment (was " + layer + ")"); } if (side == null) throw new NullPointerException("side"); diff --git a/build.properties b/build.properties index d21cfb0..becf4ef 100644 --- a/build.properties +++ b/build.properties @@ -1,4 +1,5 @@ -mc_version=1.12.2 -forge_version=14.23.0.2532 -mappings_version=snapshot_20170629 -mod_version=7.99 +mc_version=1.20.1 +forge_version=47.3.12 +mappings_channel=official +mappings_version=1.20.1 +mod_version=7.99.24.9 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 30d399d8d2bf522ff5de94bf434a7cc43a9a74b5..41d9927a4d4fb3f96a785543079b8df6723c946b 100644 GIT binary patch literal 59821 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 literal 52271 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 p '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} + +# 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"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum -warn ( ) { +warn () { echo "$*" -} +} >&2 -die ( ) { +die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -82,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + 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. Please set the JAVA_HOME variable in your environment to match the @@ -90,75 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +# 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. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index aec9973..ac1b06f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -8,20 +24,23 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,34 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/resources/accesstransformer.cfg b/resources/accesstransformer.cfg new file mode 100644 index 0000000..4580094 --- /dev/null +++ b/resources/accesstransformer.cfg @@ -0,0 +1,2 @@ +public net.minecraft.core.Direction f_122349_ # BY_2D_DATA +public net.minecraft.core.Direction f_122346_ # VALUES diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..93f1b80 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,13 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { + name = 'MinecraftForge' + url = 'https://maven.minecraftforge.net/' + } + } +} + +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' +} \ No newline at end of file From 53b787c77fc806fb1e5f9f94ec5a9b1e7393bfb2 Mon Sep 17 00:00:00 2001 From: CalenXwX Date: Tue, 17 Dec 2024 18:23:18 +0800 Subject: [PATCH 2/9] 1.20.1 build.gradle --- build.gradle | 259 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 197 insertions(+), 62 deletions(-) diff --git a/build.gradle b/build.gradle index 0efb16f..477c406 100644 --- a/build.gradle +++ b/build.gradle @@ -1,22 +1,23 @@ - -// For those who want the bleeding edge buildscript { repositories { - jcenter() - maven { - name = "forge" - url = "http://files.minecraftforge.net/maven" - } + // These repositories are only for Gradle plugins, put any other repositories in the repository core further below + maven { url = 'https://maven.minecraftforge.net' } + mavenCentral() } dependencies { - classpath "net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT" + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true + // Mixin + classpath 'org.spongepowered:mixingradle:0.7.+' } } -apply plugin: "net.minecraftforge.gradle.forge" - -if (gradle.startParameter.taskNames.contains("checkstyle")) { - apply plugin: "checkstyle" +// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. +plugins { + id 'eclipse' + id 'idea' + id 'maven-publish' + id 'net.minecraftforge.gradle' version '[6.0,6.2)' } +apply plugin: 'net.minecraftforge.gradle' ext.configFile = file "build.properties" configFile.withReader { @@ -27,85 +28,219 @@ configFile.withReader { } version = config.mod_version -group= "com.mod-buildcraft.api" // http://maven.apache.org/guides/mini/guide-naming-conventions.html +group = "com.mod-buildcraft.api" archivesBaseName = "buildcraft-api" // the name that all artifacts will use as a base. artifacts names follow this pattern: [baseName]-[appendix]-[version]-[classifier].[extension] -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +// Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. +java.toolchain.languageVersion = JavaLanguageVersion.of(17) +println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}" minecraft { - version = config.mc_version + "-" + config.forge_version - runDir = "run" + // The mappings can be changed at any time and must be in the following format. + // Channel: Version: + // official MCVersion Official field/method names from Mojang mapping files + // parchment YYYY.MM.DD-MCVersion Open community-sourced parameter names and javadocs layered on top of official + // + // You must be aware of the Mojang license when using the 'official' or 'parchment' mappings. + // See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md + // + // Parchment is an unofficial project maintained by ParchmentMC, separate from MinecraftForge + // Additional setup is needed to use their mappings: https://github.com/ParchmentMC/Parchment/wiki/Getting-Started + // + // Use non-default mappings at your own risk. They may not always work. + // Simply re-run your setup task after changing the mappings to update your workspace. + mappings channel: config.mappings_channel, version: config.mappings_version + + copyIdeResources = true + + accessTransformer = file('resources/accesstransformer.cfg') + + // Currently, this location cannot be changed from the default. + + // Default run configurations. + // These can be tweaked, removed, or duplicated as needed. + runs { + // applies to all the run configs below + configureEach { + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + // The markers can be added/remove as needed separated by commas. + // "SCAN": For mods scan. + // "REGISTRIES": For firing of registry events. + // "REGISTRYDUMP": For getting the contents of all registries. + property 'forge.logging.markers', 'REGISTRIES' + + // Recommended logging level for the console + // You can set various levels here. + // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels + property 'forge.logging.console.level', 'debug' + + mods { + "${mod_id}" { + source sourceSets.main + } + } + } + } +} - // the mappings can be changed at any time, and must be in the following format. - // snapshot_YYYYMMDD snapshot are built nightly. - // stable_# stables are built at the discretion of the MCP team. - // Use non-default mappings at your own risk. they may not always work. - // simply re-run your setup task after changing the mappings to update your workspace. - mappings = config.mappings_version - // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. +compileJava { + options.compilerArgs << "-Xmaxerrs" << "2000" + options.compilerArgs << "-Xmaxwarns" << "2" + options.compilerArgs << "-Xlint:all" + options.compilerArgs << "-Xdiags:verbose" + options.compilerArgs << "-encoding" << "UTF-8" } +javadoc { + options.setUse(true) + options.addStringsOption("Xmaxerrs").setValue(["2000"]) + options.addStringsOption("Xmaxwarns").setValue(["2"]) +} + +task javadocJar(type: Jar, dependsOn: javadoc) { +// classifier = 'javadoc' + from javadoc.destinationDir +} + +// Include resources generated by data generators. sourceSets { main { java { srcDir "api" } + resources { + } } } -if (gradle.startParameter.taskNames.contains("checkstyle")) { - checkstyle { - configFile = file("guidelines/buildcraft.checkstyle") - } +repositories { + // Put repositories for dependencies here + // ForgeGradle automatically adds the Forge maven and Maven Central for you - task checkstyle {} - tasks["checkstyle"].dependsOn checkstyleApi - tasks["checkstyle"].dependsOn checkstyleMain + // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: + // flatDir { + // dir 'libs' + // } - tasks["checkstyleApi"].enabled = gradle.startParameter.taskNames.contains("checkstyle") - tasks["checkstyleMain"].enabled = gradle.startParameter.taskNames.contains("checkstyle") + maven { + name 'CurseMaven' + url 'https://www.cursemaven.com' + content { + includeGroup 'curse.maven' + } + } } -processResources -{ - // this will ensure that this task is redone when the versions change. - inputs.property "version", project.version - inputs.property "mcversion", project.minecraft.version +dependencies { + // Specify the version of Minecraft to use. If this is any group other than 'net.minecraft', it is assumed + // that the dep is a ForgeGradle 'patcher' dependency, and its patches will be applied. + // The userdev artifact is a special name and will get all sorts of transformations applied to it. - // replace stuff in mcmod.info, nothing else - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info' + minecraft "net.minecraftforge:forge:${config.mc_version}-${config.forge_version}" - // replace version and mcversion - expand 'version':project.version, 'mcversion':project.minecraft.version - } + // Examples using mod jars from ./libs - // copy everything else, thats not the mcmod.info - from(sourceSets.main.resources.srcDirs) { - exclude 'mcmod.info' - } -} + // For more info... + // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html + // http://www.gradle.org/docs/current/userguide/dependency_management.html -compileJava { - options.compilerArgs << "-Xmaxerrs" << "2000" - options.compilerArgs << "-Xmaxwarns" << "2" - options.compilerArgs << "-Xlint:all" - options.compilerArgs << "-Xdiags:verbose" - options.compilerArgs << "-encoding" << "UTF-8" + annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' } -javadoc { - options.setUse(true) - options.addStringsOption("Xmaxerrs").setValue(["2000"]) - options.addStringsOption("Xmaxwarns").setValue(["2"]) +if (gradle.startParameter.taskNames.contains("checkstyle")) { + checkstyle { + configFile = file("guidelines/buildcraft.checkstyle") + } + + task checkstyle {} + tasks["checkstyle"].dependsOn checkstyleApi + tasks["checkstyle"].dependsOn checkstyleMain + + tasks["checkstyleApi"].enabled = gradle.startParameter.taskNames.contains("checkstyle") + tasks["checkstyleMain"].enabled = gradle.startParameter.taskNames.contains("checkstyle") } -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir +tasks.named('processResources', ProcessResources).configure { +// var replaceProperties = [ +// minecraft_version : config.mc_version, +// minecraft_version_range: minecraft_version_range, +// forge_version : config.forge_version, +// forge_version_range : forge_version_range, +// loader_version_range : loader_version_range, +// mod_id : mod_id, +// mod_name : mod_name, +// mod_license : mod_license, +// mod_version : mod_version, +// mod_authors : mod_authors, +// mod_description : mod_description, +// ] +// inputs.properties replaceProperties + +// filesMatching(['META-INF/mods.toml', 'pack.mcmeta']) { +// expand replaceProperties + [project: project] +// } +// // this will ensure that this task is redone when the versions change. +// inputs.property "version", project.version +// inputs.property "mcversion", config.mc_version + "-" + config.forge_version +// +// // replace stuff in mcmod.info, nothing else +// from(sourceSets.main.resources.srcDirs) { +// include 'mcmod.info' +// +// // replace version and mcversion +// expand 'version':project.version, 'mcversion':config.mc_version + "-" + config.forge_version +// } +// +// // copy everything else, thats not the mcmod.info +// from(sourceSets.main.resources.srcDirs) { +// exclude 'mcmod.info' +// } } artifacts { archives javadocJar } + +// Example for how to get properties into the manifest for reading at runtime. +tasks.named('jar', Jar).configure { + manifest { + attributes([ + "Specification-Title" : "BuildCraft", + "Specification-Vendor" : "BuildCraft Team", + "Specification-Version" : project.version, + "Implementation-Title" : project.name, + "Implementation-Version" : project.jar.archiveVersion, + "Implementation-Vendor" : "BuildCraft Team", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) + } + include '**/**/**/libs/*' +} + +// Example configuration to allow publishing using the maven-publish plugin +// This is the preferred method to reobfuscate your jar file +jar.finalizedBy('reobfJar') +// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing +// publish.dependsOn('reobfJar') + +publishing { + publications { + register('mavenJava', MavenPublication) { + artifact jar + } + } + repositories { + maven { +// url "file://${project.projectDir}/mcmodsrepo" + url System.getenv("MAVEN_DIR") ?: "$projectDir/build/maven" + } + } +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation +} + +jar.enabled = true From 0ad6f8d99c8a81be935a4af7c47b24c42f9fe952 Mon Sep 17 00:00:00 2001 From: CalenXwX Date: Tue, 17 Dec 2024 18:40:06 +0800 Subject: [PATCH 3/9] Updated build.gradle & gradle.properties --- build.gradle | 29 ----------------------------- gradle.properties | 2 ++ 2 files changed, 2 insertions(+), 29 deletions(-) create mode 100644 gradle.properties diff --git a/build.gradle b/build.gradle index 477c406..730359a 100644 --- a/build.gradle +++ b/build.gradle @@ -54,35 +54,6 @@ minecraft { copyIdeResources = true accessTransformer = file('resources/accesstransformer.cfg') - - // Currently, this location cannot be changed from the default. - - // Default run configurations. - // These can be tweaked, removed, or duplicated as needed. - runs { - // applies to all the run configs below - configureEach { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - // The markers can be added/remove as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - property 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - property 'forge.logging.console.level', 'debug' - - mods { - "${mod_id}" { - source sourceSets.main - } - } - } - } } compileJava { diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..29b2ac4 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false From aaa056deda6b485a38e610eb96bc01d0322fdc47 Mon Sep 17 00:00:00 2001 From: CalenXwX Date: Sat, 25 Jan 2025 18:14:46 +0800 Subject: [PATCH 4/9] Updated engine type --- api/buildcraft/api/core/IEngineType.java | 3 +-- api/buildcraft/api/enums/EnumEngineType.java | 12 ++++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/api/buildcraft/api/core/IEngineType.java b/api/buildcraft/api/core/IEngineType.java index 3b3750b..d6fc9c3 100644 --- a/api/buildcraft/api/core/IEngineType.java +++ b/api/buildcraft/api/core/IEngineType.java @@ -1,6 +1,5 @@ package buildcraft.api.core; public interface IEngineType { - @Deprecated(forRemoval = true) - String getItemModelLocation(); +// String getItemModelLocation(); } diff --git a/api/buildcraft/api/enums/EnumEngineType.java b/api/buildcraft/api/enums/EnumEngineType.java index 0fa9f9b..22d4298 100644 --- a/api/buildcraft/api/enums/EnumEngineType.java +++ b/api/buildcraft/api/enums/EnumEngineType.java @@ -11,7 +11,8 @@ public enum EnumEngineType implements StringRepresentable, IEngineType { CREATIVE("core", "creative"), ; - public final String unlocalizedTag; + // public final String unlocalizedTag; + private final String unlocalizedTag; @Deprecated(forRemoval = true) public final String resourceLocation; @@ -22,11 +23,10 @@ public enum EnumEngineType implements StringRepresentable, IEngineType { resourceLocation = "buildcraft" + mod + ":block/engine/inv/" + loc; } - @Deprecated(forRemoval = true) - @Override - public String getItemModelLocation() { - return resourceLocation; - } +// @Override +// public String getItemModelLocation() { +// return resourceLocation; +// } @Override public String getSerializedName() { From 5317777155a369ec0f124936994880e4abffcb4d Mon Sep 17 00:00:00 2001 From: CalenXwX Date: Mon, 21 Apr 2025 10:05:16 +0800 Subject: [PATCH 5/9] Robotics! --- .../api/boards/RedstoneBoardNBT.java | 27 +++++-- .../api/boards/RedstoneBoardRegistry.java | 14 +++- .../api/boards/RedstoneBoardRobotNBT.java | 6 ++ api/buildcraft/api/core/BuildCraftAPI.java | 36 ++++----- api/buildcraft/api/core/IBlockFilter.java | 13 +++ api/buildcraft/api/core/IEntityFilter.java | 13 +++ api/buildcraft/api/core/IInvSlot.java | 6 +- api/buildcraft/api/core/IZone.java | 4 +- api/buildcraft/api/crops/CropManager.java | 14 +++- api/buildcraft/api/crops/ICropHandler.java | 6 +- api/buildcraft/api/gates/IGateProvider.java | 6 ++ api/buildcraft/api/mj/IMjContainerItem.java | 13 +++ api/buildcraft/api/mj/MjBattery.java | 6 +- .../api/recipes/BuildcraftRecipeRegistry.java | 1 + .../recipes/IIntegrationRecipeProvider.java | 7 +- .../recipes/IIntegrationRecipeRegistry.java | 5 +- .../api/recipes/IProgrammingRecipe.java | 79 +++++++++++++++++++ .../recipes/IProgrammingRecipeManager.java | 29 +++++++ .../api/recipes/IntegrationRecipe.java | 68 ++++++++++++++-- .../api/registry/EventBuildCraftReload.java | 10 ++- .../api/robots/EntityRobotBase.java | 12 +-- .../api/robots/IRequestProvider.java | 4 + .../api/robots/IRobotOverlayItem.java | 4 +- api/buildcraft/api/robots/IStationFilter.java | 10 +++ .../api/statements/ActionState.java | 10 +++ .../api/statements/IStatementParameter.java | 6 +- .../api/transport/IStripesRegistry.java | 8 ++ .../transport/pluggable/ActionIterator.java | 69 ++++++++++++++++ 28 files changed, 422 insertions(+), 64 deletions(-) create mode 100644 api/buildcraft/api/core/IBlockFilter.java create mode 100644 api/buildcraft/api/core/IEntityFilter.java create mode 100644 api/buildcraft/api/gates/IGateProvider.java create mode 100644 api/buildcraft/api/mj/IMjContainerItem.java create mode 100644 api/buildcraft/api/recipes/IProgrammingRecipe.java create mode 100644 api/buildcraft/api/recipes/IProgrammingRecipeManager.java create mode 100644 api/buildcraft/api/robots/IStationFilter.java create mode 100644 api/buildcraft/api/statements/ActionState.java create mode 100644 api/buildcraft/api/transport/pluggable/ActionIterator.java diff --git a/api/buildcraft/api/boards/RedstoneBoardNBT.java b/api/buildcraft/api/boards/RedstoneBoardNBT.java index 1508afa..f8e7739 100755 --- a/api/buildcraft/api/boards/RedstoneBoardNBT.java +++ b/api/buildcraft/api/boards/RedstoneBoardNBT.java @@ -6,9 +6,13 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; -import net.minecraft.world.entity.player.Player; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import javax.annotation.Nullable; import java.util.List; import java.util.Random; @@ -16,19 +20,26 @@ public abstract class RedstoneBoardNBT { private static Random rand = new Random(); - public abstract String getID(); + public abstract ResourceLocation getID(); - public abstract void addInformation(ItemStack stack, Player player, List list, boolean advanced); + // public abstract void addInformation(ItemStack stack, Player player, List list, boolean advanced); + public abstract void addInformation(ItemStack stack, @Nullable Level world, List list, TooltipFlag flag); - public abstract String getDisplayName(); + // public abstract String getDisplayName(); + public final String getDisplayName() { + return getDisplayNameComponent().getString(); + } + + public abstract Component getDisplayNameComponent(); public abstract IRedstoneBoard create(CompoundTag nbt, T object); - public abstract String getItemModelLocation(); + // public abstract String getItemModelLocation(); + public abstract String getBoardTexture(); - public void createBoard(CompoundTag nbt) { - nbt.putString("id", getID()); - } +// public void createBoard(CompoundTag nbt) { +// nbt.putString("id", getID().toString()); +// } public int getParameterNumber(CompoundTag nbt) { if (!nbt.contains("parameters")) { diff --git a/api/buildcraft/api/boards/RedstoneBoardRegistry.java b/api/buildcraft/api/boards/RedstoneBoardRegistry.java index c3b6157..d923ff6 100755 --- a/api/buildcraft/api/boards/RedstoneBoardRegistry.java +++ b/api/buildcraft/api/boards/RedstoneBoardRegistry.java @@ -5,8 +5,12 @@ package buildcraft.api.boards; import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraftforge.registries.RegistryObject; -import java.util.Collection; +import java.util.List; +import java.util.Map; public abstract class RedstoneBoardRegistry { @@ -24,9 +28,13 @@ public abstract class RedstoneBoardRegistry { public abstract RedstoneBoardNBT getRedstoneBoard(CompoundTag nbt); - public abstract RedstoneBoardNBT getRedstoneBoard(String id); + // public abstract RedstoneBoardNBT getRedstoneBoard(String id); + public abstract RedstoneBoardNBT getRedstoneBoard(ResourceLocation id); - public abstract Collection> getAllBoardNBTs(); + // public abstract Collection> getAllBoardNBTs(); + public abstract List> getAllBoardNBTs(); + + public abstract Map, RegistryObject> getBoardNBTItemMap(); public abstract long getPowerCost(RedstoneBoardNBT board); } diff --git a/api/buildcraft/api/boards/RedstoneBoardRobotNBT.java b/api/buildcraft/api/boards/RedstoneBoardRobotNBT.java index cb7debb..acaa94c 100755 --- a/api/buildcraft/api/boards/RedstoneBoardRobotNBT.java +++ b/api/buildcraft/api/boards/RedstoneBoardRobotNBT.java @@ -19,4 +19,10 @@ public RedstoneBoardRobot create(CompoundTag nbt, EntityRobotBase robot) { public abstract ResourceLocation getRobotTexture(); + // Calen 1.18.2 + public abstract ResourceLocation getRobotItemTexture(); + + public abstract ResourceLocation getRobotTextureFullLocation(); + + public abstract ResourceLocation getRobotId(); } diff --git a/api/buildcraft/api/core/BuildCraftAPI.java b/api/buildcraft/api/core/BuildCraftAPI.java index 3081f26..81b7d60 100644 --- a/api/buildcraft/api/core/BuildCraftAPI.java +++ b/api/buildcraft/api/core/BuildCraftAPI.java @@ -4,24 +4,16 @@ * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.core; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.ModLoadingContext; -import java.util.HashMap; -import java.util.Set; - public final class BuildCraftAPI { public static IFakePlayerProvider fakePlayerProvider; - public static final Set softBlocks = Sets.newHashSet(); - public static final HashMap worldProperties = Maps.newHashMap(); + // public static final Set softBlocks = Sets.newHashSet(); + // public static final HashMap worldProperties = Maps.newHashMap(); /** Deactivate constructor */ private BuildCraftAPI() { @@ -35,20 +27,20 @@ public static String getVersion() { return "UNKNOWN VERSION"; } - public static IWorldProperty getWorldProperty(String name) { - return worldProperties.get(name); - } +// public static IWorldProperty getWorldProperty(String name) { +// return worldProperties.get(name); +// } - public static void registerWorldProperty(String name, IWorldProperty property) { - if (worldProperties.containsKey(name)) { - BCLog.logger.warn("The WorldProperty key '" + name + "' is being overridden with " + property.getClass().getSimpleName() + "!"); - } - worldProperties.put(name, property); - } +// public static void registerWorldProperty(String name, IWorldProperty property) { +// if (worldProperties.containsKey(name)) { +// BCLog.logger.warn("The WorldProperty key '" + name + "' is being overridden with " + property.getClass().getSimpleName() + "!"); +// } +// worldProperties.put(name, property); +// } - public static boolean isSoftBlock(Level world, BlockPos pos) { - return worldProperties.get("soft").get(world, pos); - } +// public static boolean isSoftBlock(Level world, BlockPos pos) { +// return worldProperties.get("soft").get(world, pos); +// } public static ResourceLocation nameToResourceLocation(String name) { if (name.indexOf(':') > 0) return new ResourceLocation(name); diff --git a/api/buildcraft/api/core/IBlockFilter.java b/api/buildcraft/api/core/IBlockFilter.java new file mode 100644 index 0000000..f7b3e82 --- /dev/null +++ b/api/buildcraft/api/core/IBlockFilter.java @@ -0,0 +1,13 @@ +/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com + *

    + * BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents + * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ +package buildcraft.api.core; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; + +// Calen 1.18.2 from 1.8.9 +public interface IBlockFilter { + boolean matches(Level world, BlockPos pos); +} diff --git a/api/buildcraft/api/core/IEntityFilter.java b/api/buildcraft/api/core/IEntityFilter.java new file mode 100644 index 0000000..0c836de --- /dev/null +++ b/api/buildcraft/api/core/IEntityFilter.java @@ -0,0 +1,13 @@ +/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com + *

    + * BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents + * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ +package buildcraft.api.core; + +import net.minecraft.world.entity.Entity; + +public interface IEntityFilter { + + boolean matches(Entity entity); + +} diff --git a/api/buildcraft/api/core/IInvSlot.java b/api/buildcraft/api/core/IInvSlot.java index d39119a..191fd9f 100644 --- a/api/buildcraft/api/core/IInvSlot.java +++ b/api/buildcraft/api/core/IInvSlot.java @@ -6,6 +6,8 @@ import net.minecraft.world.item.ItemStack; +import javax.annotation.Nonnull; + public interface IInvSlot { /** Returns the slot number of the underlying Inventory. * @@ -18,9 +20,11 @@ public interface IInvSlot { boolean isItemValidForSlot(ItemStack stack); + @Nonnull ItemStack decreaseStackInSlot(int amount); + @Nonnull ItemStack getStackInSlot(); - void setStackInSlot(ItemStack stack); + void setStackInSlot(@Nonnull ItemStack stack); } diff --git a/api/buildcraft/api/core/IZone.java b/api/buildcraft/api/core/IZone.java index a09ca8c..1214c77 100755 --- a/api/buildcraft/api/core/IZone.java +++ b/api/buildcraft/api/core/IZone.java @@ -5,6 +5,7 @@ package buildcraft.api.core; import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; import net.minecraft.world.phys.Vec3; import java.util.Random; @@ -23,5 +24,6 @@ public interface IZone { boolean contains(Vec3 point); /** Gets a random position that {@link #contains(Vec3)} will return true. */ - BlockPos getRandomBlockPos(Random rand); + // BlockPos getRandomBlockPos(Random rand); + BlockPos getRandomBlockPos(RandomSource rand); } diff --git a/api/buildcraft/api/crops/CropManager.java b/api/buildcraft/api/crops/CropManager.java index cf439e2..8429dbe 100644 --- a/api/buildcraft/api/crops/CropManager.java +++ b/api/buildcraft/api/crops/CropManager.java @@ -12,6 +12,12 @@ import java.util.List; public final class CropManager { + public enum HarvestResult { + SUCCESS, + FAIL, + PROGRESS; + } + private static List handlers = new ArrayList<>(); private static ICropHandler defaultHandler; @@ -73,13 +79,15 @@ public static boolean isMature(LevelAccessor blockAccess, BlockState state, Bloc return defaultHandler.isMature(blockAccess, state, pos); } - public static boolean harvestCrop(Level world, BlockPos pos, NonNullList drops) { + // public static boolean harvestCrop(Level world, BlockPos pos, NonNullList drops) + public static HarvestResult harvestCrop(Level world, BlockPos pos, ItemStack tool, NonNullList drops) { BlockState state = world.getBlockState(pos); for (ICropHandler cropHandler : handlers) { if (cropHandler.isMature(world, state, pos)) { - return cropHandler.harvestCrop(world, pos, drops); + return cropHandler.harvestCrop(world, pos, tool, drops); } } - return defaultHandler.isMature(world, state, pos) && defaultHandler.harvestCrop(world, pos, drops); + // return defaultHandler.isMature(world, state, pos) && defaultHandler.harvestCrop(world, pos, drops); + return defaultHandler.isMature(world, state, pos) ? defaultHandler.harvestCrop(world, pos, tool, drops) : HarvestResult.FAIL; } } diff --git a/api/buildcraft/api/crops/ICropHandler.java b/api/buildcraft/api/crops/ICropHandler.java index 8d5f426..701abf8 100644 --- a/api/buildcraft/api/crops/ICropHandler.java +++ b/api/buildcraft/api/crops/ICropHandler.java @@ -8,6 +8,8 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; +import javax.annotation.Nonnull; + public interface ICropHandler { /** Check if an item is a seed. @@ -46,8 +48,10 @@ public interface ICropHandler { * * @param world * @param pos + * @param tool * @param drops a list to return the harvest's drops. * @return true if the block was successfully harvested. */ - boolean harvestCrop(Level world, BlockPos pos, NonNullList drops); + // boolean harvestCrop(Level world, BlockPos pos, NonNullList drops); + CropManager.HarvestResult harvestCrop(Level world, BlockPos pos, @Nonnull ItemStack tool, NonNullList drops); } diff --git a/api/buildcraft/api/gates/IGateProvider.java b/api/buildcraft/api/gates/IGateProvider.java new file mode 100644 index 0000000..6e8f3bd --- /dev/null +++ b/api/buildcraft/api/gates/IGateProvider.java @@ -0,0 +1,6 @@ +package buildcraft.api.gates; + +// Calen 1.18.2 +public interface IGateProvider { + IGate getGate(); +} diff --git a/api/buildcraft/api/mj/IMjContainerItem.java b/api/buildcraft/api/mj/IMjContainerItem.java new file mode 100644 index 0000000..aa537a5 --- /dev/null +++ b/api/buildcraft/api/mj/IMjContainerItem.java @@ -0,0 +1,13 @@ +package buildcraft.api.mj; + +import net.minecraft.world.item.ItemStack; + +public interface IMjContainerItem { + long receivePower(ItemStack container, long maxReceive, boolean simulate); + + long extractPower(ItemStack container, long maxExtract, boolean simulate); + + long getPowerStored(ItemStack container); + + long getMaxPowerStored(ItemStack container); +} diff --git a/api/buildcraft/api/mj/MjBattery.java b/api/buildcraft/api/mj/MjBattery.java index cfe7ee1..dbe682b 100644 --- a/api/buildcraft/api/mj/MjBattery.java +++ b/api/buildcraft/api/mj/MjBattery.java @@ -10,6 +10,8 @@ /** Provides a basic implementation of a simple battery. Note that you should call {@link #tick(Level, BlockPos)} or * {@link #tick(Level, Vec3)} every tick to allow for losing excess power. */ public class MjBattery implements INBTSerializable { + public static final String NBT_STORED = "stored"; + private final long capacity; private long microJoules = 0; @@ -20,13 +22,13 @@ public MjBattery(long capacity) { @Override public CompoundTag serializeNBT() { CompoundTag nbt = new CompoundTag(); - nbt.putLong("stored", microJoules); + nbt.putLong(NBT_STORED, microJoules); return nbt; } @Override public void deserializeNBT(CompoundTag nbt) { - microJoules = nbt.getLong("stored"); + microJoules = nbt.getLong(NBT_STORED); } public void writeToBuffer(ByteBuf buffer) { diff --git a/api/buildcraft/api/recipes/BuildcraftRecipeRegistry.java b/api/buildcraft/api/recipes/BuildcraftRecipeRegistry.java index 6174520..6e6218f 100644 --- a/api/buildcraft/api/recipes/BuildcraftRecipeRegistry.java +++ b/api/buildcraft/api/recipes/BuildcraftRecipeRegistry.java @@ -8,6 +8,7 @@ public final class BuildcraftRecipeRegistry { public static IIntegrationRecipeRegistry integrationRecipes; public static IRefineryRecipeManager refineryRecipes; + public static IProgrammingRecipeManager programmingRecipes; private BuildcraftRecipeRegistry() { } diff --git a/api/buildcraft/api/recipes/IIntegrationRecipeProvider.java b/api/buildcraft/api/recipes/IIntegrationRecipeProvider.java index 0185609..2f4aa08 100644 --- a/api/buildcraft/api/recipes/IIntegrationRecipeProvider.java +++ b/api/buildcraft/api/recipes/IIntegrationRecipeProvider.java @@ -3,6 +3,7 @@ import net.minecraft.core.NonNullList; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -17,10 +18,12 @@ public interface IIntegrationRecipeProvider { * @param toIntegrate A list of stacks to try to integrate to the * @return */ @Nullable - IntegrationRecipe getRecipeFor(@Nonnull ItemStack target, @Nonnull NonNullList toIntegrate); + // IntegrationRecipe getRecipeFor(@Nonnull ItemStack target, @Nonnull NonNullList toIntegrate); + IntegrationRecipe getRecipeFor(@Nonnull ItemStack target, @Nonnull NonNullList toIntegrate, Level world); /** * Returns recipe by it's name */ - IntegrationRecipe getRecipe(@Nonnull ResourceLocation name); + // IntegrationRecipe getRecipe(@Nonnull ResourceLocation name); + IntegrationRecipe getRecipe(@Nonnull ResourceLocation name, Level world); } diff --git a/api/buildcraft/api/recipes/IIntegrationRecipeRegistry.java b/api/buildcraft/api/recipes/IIntegrationRecipeRegistry.java index d4bd8ee..8f94814 100644 --- a/api/buildcraft/api/recipes/IIntegrationRecipeRegistry.java +++ b/api/buildcraft/api/recipes/IIntegrationRecipeRegistry.java @@ -1,5 +1,7 @@ package buildcraft.api.recipes; +import net.minecraft.world.level.Level; + import java.util.Iterator; public interface IIntegrationRecipeRegistry extends IIntegrationRecipeProvider { @@ -9,6 +11,7 @@ public interface IIntegrationRecipeRegistry extends IIntegrationRecipeProvider { * Gets all of the simple recipes that are registered. Note that you *can* use the returned iterator's * {@link Iterator#remove()} method to remove recipes from this registry. */ - Iterable getAllRecipes(); + // Iterable getAllRecipes(); + Iterable getAllRecipes(Level world); } diff --git a/api/buildcraft/api/recipes/IProgrammingRecipe.java b/api/buildcraft/api/recipes/IProgrammingRecipe.java new file mode 100644 index 0000000..316295d --- /dev/null +++ b/api/buildcraft/api/recipes/IProgrammingRecipe.java @@ -0,0 +1,79 @@ +package buildcraft.api.recipes; + +import buildcraft.api.BCModules; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; + +// public interface IProgrammingRecipe +public interface IProgrammingRecipe extends Recipe { + public static final ResourceLocation TYPE_ID = new ResourceLocation(BCModules.SILICON.getModId(), "programming"); + + public static final RecipeType TYPE = RecipeType.simple(TYPE_ID); + + @Override + default RecipeType getType() { + return TYPE; + } + + ResourceLocation getId(); + +// /** Get a list (size at least width*height) of ItemStacks representing options. +// * +// * @param width The width of the Programming Table panel. +// * @param height The height of the Programming Table panel. +// * @return */ +// List getOptions(int width, int height); + + /** Get the energy cost of a given option ItemStack. + * + * @return */ + // int getEnergyCost(ItemStack option); + long getEnergyCost(); + + /** @param input The input stack. + * @return Whether this recipe applies to the given input stack. */ + boolean canCraft(ItemStack input); + + /** Craft the input ItemStack with the given option into an output ItemStack. + * + * @param input + * @return The output ItemStack. */ + // ItemStack craft(ItemStack input, ItemStack option); + ItemStack craft(ItemStack input); + + IngredientStack getInput(); + + ItemStack getOutput(); + + // Recipe + + @Override + public default boolean matches(Container inv, Level world) { + return false; + } + + @Override + default ItemStack assemble(Container inv, RegistryAccess registryAccess) { + return ItemStack.EMPTY; + } + + @Override + public default boolean canCraftInDimensions(int width, int height) { + return true; + } + + @Override + default ItemStack getResultItem(RegistryAccess registryAccess) { + return ItemStack.EMPTY; + } + + @Override + public default boolean isSpecial() { + return true; + } +} diff --git a/api/buildcraft/api/recipes/IProgrammingRecipeManager.java b/api/buildcraft/api/recipes/IProgrammingRecipeManager.java new file mode 100644 index 0000000..360b695 --- /dev/null +++ b/api/buildcraft/api/recipes/IProgrammingRecipeManager.java @@ -0,0 +1,29 @@ +/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com + * + * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which + * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ +package buildcraft.api.recipes; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; + +import java.util.Collection; +import java.util.List; + +public interface IProgrammingRecipeManager { + void addRecipe(IProgrammingRecipe recipe); + + // void removeRecipe(String id); + void removeRecipe(ResourceLocation id); + + void removeRecipe(IProgrammingRecipe recipe); + + // IProgrammingRecipe getRecipe(String id); + IProgrammingRecipe getRecipe(Level world, ResourceLocation id); + + // Collection getRecipes(); + Collection getRecipes(Level world); + + // Calen 1.18.2 + List getOptions(List recipes, int width, int height); +} diff --git a/api/buildcraft/api/recipes/IntegrationRecipe.java b/api/buildcraft/api/recipes/IntegrationRecipe.java index 7dcc001..29da7f3 100644 --- a/api/buildcraft/api/recipes/IntegrationRecipe.java +++ b/api/buildcraft/api/recipes/IntegrationRecipe.java @@ -1,17 +1,32 @@ package buildcraft.api.recipes; +import buildcraft.api.BCModules; import com.google.common.collect.ImmutableList; import net.minecraft.core.NonNullList; +import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Container; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; import javax.annotation.Nonnull; -public abstract class IntegrationRecipe { +public abstract class IntegrationRecipe implements Recipe { + public static final ResourceLocation TYPE_ID = new ResourceLocation(BCModules.SILICON.getModId(), "integration"); + + public static final RecipeType TYPE = RecipeType.simple(TYPE_ID); + public final ResourceLocation name; - public IntegrationRecipe(ResourceLocation name) { + private final long energyCost; + private final int maxExpansionCount; + + public IntegrationRecipe(ResourceLocation name, long energyCost, int maxExpansionCount) { this.name = name; + this.energyCost = energyCost; + this.maxExpansionCount = maxExpansionCount; } /** @@ -22,22 +37,31 @@ public IntegrationRecipe(ResourceLocation name) { */ public abstract ItemStack getOutput(@Nonnull ItemStack target, NonNullList toIntegrate); + // Calen 1.18.2 + public abstract ItemStack getExampleOutput(); + /** * Determines the components to use when crafting finishes - * @param output The generated outputted, determined by getOutput * @return The components to use up */ - public abstract ImmutableList getRequirements(@Nonnull ItemStack output); + // public abstract ImmutableList getRequirements(@Nonnull ItemStack output); + public abstract ImmutableList getRequirements(); /** * Determines the amount of MJ required to integrate - * @param output The output that would be generated * @return The powercost in microjoules */ - public abstract long getRequiredMicroJoules(ItemStack output); + // public abstract long getRequiredMicroJoules(ItemStack output); + public final long getRequiredMicroJoules() { + return energyCost; + } public abstract IngredientStack getCenterStack(); + public int getMaxExpansionCount() { + return maxExpansionCount; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -56,4 +80,36 @@ public boolean equals(Object o) { public int hashCode() { return name.hashCode(); } + + // Recipe + + @Override + public boolean matches(Container inv, Level world) { + return false; + } + + @Override + public ItemStack assemble(Container inv, RegistryAccess registryAccess) { + return ItemStack.EMPTY; + } + + @Override + public boolean canCraftInDimensions(int width, int height) { + return true; + } + + @Override + public ItemStack getResultItem(RegistryAccess registryAccess) { + return ItemStack.EMPTY; + } + + @Override + public boolean isSpecial() { + return true; + } + + @Override + public RecipeType getType() { + return TYPE; + } } diff --git a/api/buildcraft/api/registry/EventBuildCraftReload.java b/api/buildcraft/api/registry/EventBuildCraftReload.java index 9cda724..d51d051 100644 --- a/api/buildcraft/api/registry/EventBuildCraftReload.java +++ b/api/buildcraft/api/registry/EventBuildCraftReload.java @@ -5,11 +5,13 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.event.IModBusEvent; import javax.annotation.Nullable; import java.util.Set; -public abstract class EventBuildCraftReload extends Event { +// public abstract class EventBuildCraftReload extends Event +public abstract class EventBuildCraftReload extends Event implements IModBusEvent { /** The manager that is being reloaded. */ public final IReloadableRegistryManager manager; @@ -26,7 +28,7 @@ public EventBuildCraftReload(IReloadableRegistryManager manager, Set> reloadingRegistries) { + @Nullable Set> reloadingRegistries) { super(manager, reloadingRegistries); } } @@ -47,7 +49,7 @@ public static class PopulateGson extends EventBuildCraftReload { public final GsonBuilder gsonBuilder; public PopulateGson(IReloadableRegistryManager manager, - @Nullable Set> reloadingRegistries, GsonBuilder gsonBuilder) { + @Nullable Set> reloadingRegistries, GsonBuilder gsonBuilder) { super(manager, reloadingRegistries); this.gsonBuilder = gsonBuilder; } @@ -65,7 +67,7 @@ public PostLoad(IReloadableRegistryManager manager, @Nullable Set> reloadingRegistries) { + @Nullable Set> reloadingRegistries) { super(manager, reloadingRegistries); } } diff --git a/api/buildcraft/api/robots/EntityRobotBase.java b/api/buildcraft/api/robots/EntityRobotBase.java index bc74a98..65403aa 100755 --- a/api/buildcraft/api/robots/EntityRobotBase.java +++ b/api/buildcraft/api/robots/EntityRobotBase.java @@ -5,7 +5,6 @@ package buildcraft.api.robots; import buildcraft.api.boards.RedstoneBoardRobot; -import buildcraft.api.core.IFluidHandlerAdv; import buildcraft.api.core.IZone; import buildcraft.api.mj.MjAPI; import buildcraft.api.mj.MjBattery; @@ -16,20 +15,21 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.items.IItemHandler; -public abstract class EntityRobotBase extends LivingEntity implements IItemHandler, IFluidHandlerAdv { +import javax.annotation.Nonnull; + +public abstract class EntityRobotBase extends LivingEntity { public static final long MAX_POWER = 5000 * MjAPI.MJ; public static final long SAFETY_POWER = MAX_POWER / 5; public static final long SHUTDOWN_POWER = 0; public static final long NULL_ROBOT_ID = Long.MAX_VALUE; - public EntityRobotBase(EntityType entityType, Level par1World) { - super(entityType, par1World); + public EntityRobotBase(EntityType entityType, Level world) { + super(entityType, world); } - public abstract void setItemInUse(ItemStack stack); + public abstract void setItemInUse(@Nonnull ItemStack stack); public abstract void setItemActive(boolean b); diff --git a/api/buildcraft/api/robots/IRequestProvider.java b/api/buildcraft/api/robots/IRequestProvider.java index 22dbcb8..1e7bde5 100755 --- a/api/buildcraft/api/robots/IRequestProvider.java +++ b/api/buildcraft/api/robots/IRequestProvider.java @@ -6,6 +6,8 @@ import net.minecraft.world.item.ItemStack; +import javax.annotation.Nonnull; + /** Provide requests of items that need to be fulfilled. * * Requests are organized as an linear array, where null entries mark slots without a requests. A request in a slot, or @@ -21,6 +23,7 @@ public interface IRequestProvider { * * @param slot * @return the request in the slot, or null if there's no request. */ + @Nonnull ItemStack getRequest(int slot); /** Fulfill the request in slot with the stack given and return any excess. @@ -28,5 +31,6 @@ public interface IRequestProvider { * @param slot * @param stack * @return any excess that was not used to fulfill the request. */ + @Nonnull ItemStack offerItem(int slot, ItemStack stack); } diff --git a/api/buildcraft/api/robots/IRobotOverlayItem.java b/api/buildcraft/api/robots/IRobotOverlayItem.java index 6562302..d3e6a5f 100644 --- a/api/buildcraft/api/robots/IRobotOverlayItem.java +++ b/api/buildcraft/api/robots/IRobotOverlayItem.java @@ -1,6 +1,5 @@ package buildcraft.api.robots; -import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -9,5 +8,6 @@ public interface IRobotOverlayItem { boolean isValidRobotOverlay(ItemStack stack); @OnlyIn(Dist.CLIENT) - void renderRobotOverlay(ItemStack stack, TextureManager textureManager); + // void renderRobotOverlay(ItemStack stack, TextureManager textureManager); + void renderRobotOverlay(ItemStack stack); } diff --git a/api/buildcraft/api/robots/IStationFilter.java b/api/buildcraft/api/robots/IStationFilter.java new file mode 100644 index 0000000..809c08d --- /dev/null +++ b/api/buildcraft/api/robots/IStationFilter.java @@ -0,0 +1,10 @@ +/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com + *

    + * BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents + * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ +package buildcraft.api.robots; + +public interface IStationFilter { + + boolean matches(DockingStation station); +} diff --git a/api/buildcraft/api/statements/ActionState.java b/api/buildcraft/api/statements/ActionState.java new file mode 100644 index 0000000..b4c364c --- /dev/null +++ b/api/buildcraft/api/statements/ActionState.java @@ -0,0 +1,10 @@ +/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com + * + * The BuildCraft API is distributed under the terms of the MIT License. Please check the contents of the license, which + * should be located as "LICENSE.API" in the BuildCraft source code distribution. */ +package buildcraft.api.statements; + +// Calen 1.18.2: from 1.8.9 +public class ActionState { + +} diff --git a/api/buildcraft/api/statements/IStatementParameter.java b/api/buildcraft/api/statements/IStatementParameter.java index e03889e..45a4d52 100755 --- a/api/buildcraft/api/statements/IStatementParameter.java +++ b/api/buildcraft/api/statements/IStatementParameter.java @@ -27,8 +27,10 @@ default DrawType getDrawType() { * possible values to be shown, or null if you did nothing and wish to show all possible values. * * @see #getPossible(IStatementContainer) */ - IStatementParameter onClick(IStatementContainer source, IStatement stmt, ItemStack stack, - StatementMouseClick mouse); + IStatementParameter onClick(IStatementContainer source, IStatement stmt, @Nonnull ItemStack stack, StatementMouseClick mouse); + + // Calen 1.18.2 + default IStatementParameter onScroll(IStatementContainer source, IStatement stmt, @Nonnull ItemStack stack, double delta) {return this;} void writeToNbt(CompoundTag nbt); diff --git a/api/buildcraft/api/transport/IStripesRegistry.java b/api/buildcraft/api/transport/IStripesRegistry.java index b9819e8..f71bb26 100644 --- a/api/buildcraft/api/transport/IStripesRegistry.java +++ b/api/buildcraft/api/transport/IStripesRegistry.java @@ -7,6 +7,9 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import java.util.EnumMap; +import java.util.List; + public interface IStripesRegistry { /** Adds a handler with a {@link EnumHandlerPriority} of {@linkplain EnumHandlerPriority#NORMAL} */ default void addHandler(IStripesHandlerItem handler) { @@ -37,4 +40,9 @@ boolean handleBlock(Level world, Direction direction, Player player, IStripesActivator activator); + + // Calen 1.18.2 + public EnumMap> getItemHandlers(); + + public EnumMap> getBlockHandlers(); } diff --git a/api/buildcraft/api/transport/pluggable/ActionIterator.java b/api/buildcraft/api/transport/pluggable/ActionIterator.java new file mode 100644 index 0000000..ecb9d5a --- /dev/null +++ b/api/buildcraft/api/transport/pluggable/ActionIterator.java @@ -0,0 +1,69 @@ +/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com + *

    + * BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents + * of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */ +package buildcraft.api.transport.pluggable; + +import buildcraft.api.gates.IGateProvider; +import buildcraft.api.statements.StatementSlot; +import buildcraft.api.transport.pipe.IPipe; +import net.minecraft.core.Direction; + +import java.util.Iterator; +import java.util.List; + +public class ActionIterator implements Iterable { + private final IPipe pipe; + + public ActionIterator(IPipe iPipe) { + pipe = iPipe; + } + + @Override + public Iterator iterator() { + return new It(); + } + + private class It implements Iterator { + + private Direction curDir = Direction.values()[0]; + private int index = 0; + + @Override + public boolean hasNext() { + return getNext(false) != null; + } + + @Override + public StatementSlot next() { + return getNext(true); + } + + private StatementSlot getNext(boolean advance) { + Direction curDir = this.curDir; + int index = this.index; + while (true) { + // List lst = pipe.hasGate(curDir) ? pipe.getGate(curDir).getActiveActions() : null; + List lst = pipe.getHolder().getPluggable(curDir) instanceof IGateProvider ? ((IGateProvider) pipe.getHolder().getPluggable(curDir)).getGate().getActiveActions() : null; + if (lst == null || index >= lst.size()) { + if (curDir.ordinal() == 5) { + return null; + } + curDir = Direction.values()[curDir.ordinal() + 1]; + } else { + index++; + if (advance) { + this.curDir = curDir; + this.index = index; + } + return lst.get(index - 1); + } + } + } + + @Override + public void remove() { + throw new UnsupportedOperationException("Remove not supported."); + } + } +} From 075dc35834dddb52771515655c2d5c1452992970 Mon Sep 17 00:00:00 2001 From: CalenXwX Date: Thu, 24 Apr 2025 12:34:02 +0800 Subject: [PATCH 6/9] Update from latest commits of 1.12.2: Engine Pipe RF --- api/buildcraft/api/enums/EnumEngineType.java | 1 + api/buildcraft/api/mj/IMjToRfStatus.java | 43 ++++ api/buildcraft/api/mj/MjAPI.java | 8 + api/buildcraft/api/mj/MjCapabilityHelper.java | 119 +++++++++++ api/buildcraft/api/mj/MjRfConversion.java | 46 +++++ .../api/mj/MjToRfAutoConvertor.java | 192 ++++++++++++++++++ .../api/transport/pipe/IFlowPower.java | 3 +- .../api/transport/pipe/IFlowPowerLike.java | 6 + .../api/transport/pipe/IFlowRedstoneFlux.java | 18 ++ .../api/transport/pipe/PipeApi.java | 25 +++ .../api/transport/pipe/PipeEventPower.java | 9 + .../transport/pipe/PipeEventRedstoneFlux.java | 69 +++++++ .../api/transport/pipe/PipeFlow.java | 8 +- 13 files changed, 542 insertions(+), 5 deletions(-) create mode 100644 api/buildcraft/api/mj/IMjToRfStatus.java create mode 100644 api/buildcraft/api/mj/MjRfConversion.java create mode 100644 api/buildcraft/api/mj/MjToRfAutoConvertor.java create mode 100644 api/buildcraft/api/transport/pipe/IFlowPowerLike.java create mode 100644 api/buildcraft/api/transport/pipe/IFlowRedstoneFlux.java create mode 100644 api/buildcraft/api/transport/pipe/PipeEventRedstoneFlux.java diff --git a/api/buildcraft/api/enums/EnumEngineType.java b/api/buildcraft/api/enums/EnumEngineType.java index 22d4298..9ba926a 100644 --- a/api/buildcraft/api/enums/EnumEngineType.java +++ b/api/buildcraft/api/enums/EnumEngineType.java @@ -9,6 +9,7 @@ public enum EnumEngineType implements StringRepresentable, IEngineType { IRON("energy", "iron"), // CREATIVE("energy", "creative"), CREATIVE("core", "creative"), + RF("energy", "rf"), ; // public final String unlocalizedTag; diff --git a/api/buildcraft/api/mj/IMjToRfStatus.java b/api/buildcraft/api/mj/IMjToRfStatus.java new file mode 100644 index 0000000..525bf2c --- /dev/null +++ b/api/buildcraft/api/mj/IMjToRfStatus.java @@ -0,0 +1,43 @@ +package buildcraft.api.mj; + +import buildcraft.api.BCModules; + +public interface IMjToRfStatus { + + public static IMjToRfStatus get() { + return MjToRfStatusHolder.STATUS; + } + + MjRfConversion getConversion(); + + boolean isAutoconvertEnabled(); +} + +final class MjToRfStatusHolder implements IMjToRfStatus { + + static final IMjToRfStatus STATUS = get0(); + + private static IMjToRfStatus get0() { + if (BCModules.LIB.isLoaded()) { + try { + return (IMjToRfStatus) Class.forName("buildcraft.lib.BCLibConfig$MjToRfStatus").newInstance(); + } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { + throw new Error(e); + } + } else { + return new MjToRfStatusHolder(); + } + } + + private final MjRfConversion defaultConversion = MjRfConversion.createDefault(); + + @Override + public MjRfConversion getConversion() { + return defaultConversion; + } + + @Override + public boolean isAutoconvertEnabled() { + return false; + } +} diff --git a/api/buildcraft/api/mj/MjAPI.java b/api/buildcraft/api/mj/MjAPI.java index 282f0cb..b0438f1 100644 --- a/api/buildcraft/api/mj/MjAPI.java +++ b/api/buildcraft/api/mj/MjAPI.java @@ -45,6 +45,14 @@ private static String formatMjInternal(double val) { return MJ_DISPLAY_FORMAT.format(val); } + public static MjRfConversion getRfConversion() { + return IMjToRfStatus.get().getConversion(); + } + + public static boolean isRfAutoConversionEnabled() { + return IMjToRfStatus.get().isAutoconvertEnabled(); + } + // ######################################## // // Null based classes diff --git a/api/buildcraft/api/mj/MjCapabilityHelper.java b/api/buildcraft/api/mj/MjCapabilityHelper.java index ae9a9a1..be21aa2 100644 --- a/api/buildcraft/api/mj/MjCapabilityHelper.java +++ b/api/buildcraft/api/mj/MjCapabilityHelper.java @@ -2,8 +2,10 @@ import net.minecraft.core.Direction; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.energy.IEnergyStorage; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -26,12 +28,126 @@ public class MjCapabilityHelper implements ICapabilityProvider { @Nullable private final IMjPassiveProvider provider; + @Nullable + private final IEnergyStorage rfAutoConvert; + public MjCapabilityHelper(@Nonnull IMjConnector mj) { this.connector = mj; this.receiver = mj instanceof IMjReceiver ? (IMjReceiver) mj : null; this.rsReceiver = mj instanceof IMjRedstoneReceiver ? (IMjRedstoneReceiver) mj : null; this.readable = mj instanceof IMjReadable ? (IMjReadable) mj : null; this.provider = mj instanceof IMjPassiveProvider ? (IMjPassiveProvider) mj : null; + + if (MjAPI.isRfAutoConversionEnabled()) { + rfAutoConvert = new IEnergyStorage() { + + @Override + public int getEnergyStored() { + IMjReadable read = readable; + if (read != null) { + long mjPerRf = MjAPI.getRfConversion().mjPerRf; + return (int) (read.getStored() / mjPerRf); + } else { + return 0; + } + } + + @Override + public int getMaxEnergyStored() { + IMjReadable read = readable; + if (read != null) { + long mjPerRf = MjAPI.getRfConversion().mjPerRf; + return (int) (read.getCapacity() / mjPerRf); + } else { + return 0; + } + } + + @Override + public boolean canReceive() { + return receiver != null && receiver.canReceive(); + } + + /** @return Amount of energy that was (or would have been, if simulated) accepted by the storage. */ + @Override + public int receiveEnergy(int maxReceive, boolean simulate) { + + if (maxReceive <= 0) { + return 0; + } + + IMjReceiver recv = receiver; + if (recv == null || !recv.canReceive()) { + return 0; + } + + long mjPerRf = MjAPI.getRfConversion().mjPerRf; + long maxReceiveMj = maxReceive * mjPerRf; + long excess = recv.receivePower(maxReceiveMj, true); + + // Actual MJ that was accepted + long acceptedMj = maxReceiveMj - excess; + + if (acceptedMj < mjPerRf) { + return 0; + } + + // MJ that was accepted but cannot be converted back to RF + // (We need to actual accepted MJ to be some integer multiple of mjPerRf) + long excessMj = acceptedMj % mjPerRf; + // An MJ value that is an integer multiple of mjPerRf + long exactAcceptableMj = maxReceiveMj - excessMj; + + if (exactAcceptableMj <= 0) { + return 0; + } + + int rf = (int) (exactAcceptableMj / mjPerRf); + if (rf * mjPerRf != exactAcceptableMj) { + // Sanity check + throw new IllegalStateException( + "Programmer made a mistake?? mjPerRf=" + mjPerRf + ", rf=" + rf + ", exactAcceptableMJ=" + + exactAcceptableMj + ); + } + + long excess2 = recv.receivePower(exactAcceptableMj, true); + + if (excess2 != 0) { + // Odd. This means we can't actually accept the exact amount + // not actually a crash + return 0; + } + + if (!simulate) { + long excess3 = recv.receivePower(exactAcceptableMj, simulate); + + if (excess3 != excess2) { + throw new IllegalStateException("Bad impl: " + recv.getClass() + " of receivePower"); + } + } + + return rf; + } + + @Override + public boolean canExtract() { + return provider != null; + } + + /** @return Amount of energy that was (or would have been, if simulated) extracted from the storage. */ + @Override + public int extractEnergy(int maxExtract, boolean simulate) { + long mjPerRf = MjAPI.getRfConversion().mjPerRf; + // TODO! + // (Nothing in buildcraft supports this at the moment) + return 0; + } + + }; + } else { + rfAutoConvert = null; + } } // @Override @@ -61,6 +177,9 @@ public LazyOptional getCapability(@Nonnull Capability capability, Dire // return MjAPI.CAP_PASSIVE_PROVIDER.cast(provider); return provider == null ? LazyOptional.empty() : LazyOptional.of(() -> provider).cast(); } + if (capability == ForgeCapabilities.ENERGY) { + return provider == null ? LazyOptional.empty() : LazyOptional.of(() -> rfAutoConvert).cast(); + } return LazyOptional.empty(); } } diff --git a/api/buildcraft/api/mj/MjRfConversion.java b/api/buildcraft/api/mj/MjRfConversion.java new file mode 100644 index 0000000..8f922b9 --- /dev/null +++ b/api/buildcraft/api/mj/MjRfConversion.java @@ -0,0 +1,46 @@ +package buildcraft.api.mj; + +public class MjRfConversion { + + /** Maximum MJ per RF, or minimum of 5 RF to make 1 MJ. */ + public static final long MAX_MJ_PER_RF = MjAPI.MJ / 5; + + /** Minimum MJ per RF, or maximum of 10,000 RF to make 1 MJ */ + public static final long MIN_MJ_PER_RF = MjAPI.MJ / 10_000; + + /** Default MJ per RF. */ + public static final long DEFAULT_MJ_PER_RF = MjAPI.MJ / 10; + + /** micro MJ per 1 int rf. */ + public final long mjPerRf; + + /** Set to true if {@link #mjPerRf} has been set to the {@link #DEFAULT_MJ_PER_RF} because the passed in value was + * out-of-bounds. (This is used to differentiate between it being explicitly set to the default value). */ + public final boolean usingDefaultValue; + + private MjRfConversion(long mjPerRf) { + if (MIN_MJ_PER_RF <= mjPerRf && mjPerRf <= MAX_MJ_PER_RF) { + usingDefaultValue = false; + this.mjPerRf = mjPerRf; + } else { + usingDefaultValue = true; + this.mjPerRf = DEFAULT_MJ_PER_RF; + } + } + + /** @param mjPerRf Micro Minecraft Joules per 1 RF */ + public static MjRfConversion createRaw(long mjPerRf) { + return new MjRfConversion(mjPerRf); + } + + /** @param configMjPerRf {@link MjAPI#MJ} per RF. This is rounded to the nearest 100 micro MJ */ + public static MjRfConversion createParsed(double configMjPerRf) { + long value = Math.round(configMjPerRf * 10_000); + return new MjRfConversion(value * MjAPI.MJ / 10_000); + } + + public static MjRfConversion createDefault() { + // -10 is always out of range + return new MjRfConversion(-10); + } +} diff --git a/api/buildcraft/api/mj/MjToRfAutoConvertor.java b/api/buildcraft/api/mj/MjToRfAutoConvertor.java new file mode 100644 index 0000000..4507c6b --- /dev/null +++ b/api/buildcraft/api/mj/MjToRfAutoConvertor.java @@ -0,0 +1,192 @@ +package buildcraft.api.mj; + +import net.minecraftforge.energy.IEnergyStorage; + +/** Automatic conversion utility class for treating an RF {@link IEnergyStorage} in the MJ API. */ +public class MjToRfAutoConvertor implements IMjReadable { + + final IEnergyStorage rf; + + /** @return An {@link MjToRfAutoConvertor} that may implement {@link IMjPassiveProvider} and/or {@link IMjReceiver} + * if the given storage can provide/receive energy, or null if the given storage is null, or if + * RF<->MJ autoconversion is not enabled ( {@link MjAPI#isRfAutoConversionEnabled()} ) */ + public static MjToRfAutoConvertor create(IEnergyStorage rf) { + + if (rf == null) { + return null; + } + + if (!MjAPI.isRfAutoConversionEnabled()) { + return null; + } + + if (rf.canReceive()) { + if (rf.canExtract()) { + return new OfBoth(rf); + } else { + return new OfReceiver(rf); + } + } else { + if (rf.canExtract()) { + return new OfProvider(rf); + } else { + return new MjToRfAutoConvertor(rf); + } + } + } + + /** @return An {@link MjToRfAutoConvertor} that may implements {@link IMjReceiver} if the given storage can receive + * energy, or null if the given storage is null, or if RF<->MJ autoconversion is not enabled ( + * {@link MjAPI#isRfAutoConversionEnabled()} ) */ + public static IMjReceiver createReceiver(IEnergyStorage rf) { + MjToRfAutoConvertor convertor = create(rf); + if (convertor instanceof IMjReceiver) { + return (IMjReceiver) convertor; + } else { + return null; + } + } + + /** @return An {@link MjToRfAutoConvertor} that may implements {@link IMjPassiveProvider} if the given storage can + * provide energy, or null if the given storage is null, or if RF<->MJ autoconversion is not enabled ( + * {@link MjAPI#isRfAutoConversionEnabled()} ) */ + public static IMjPassiveProvider createProvider(IEnergyStorage rf) { + MjToRfAutoConvertor convertor = create(rf); + if (convertor instanceof IMjPassiveProvider) { + return (IMjPassiveProvider) convertor; + } else { + return null; + } + } + + MjToRfAutoConvertor(IEnergyStorage storage) { + this.rf = storage; + } + + /** @return true. (Redstone-like engines are expected to not connect due to this class never implementing + * {@link IMjRedstoneReceiver}) */ + @Override + public boolean canConnect(IMjConnector other) { + return true; + } + + @Override + public long getStored() { + return rf.getEnergyStored() * MjAPI.getRfConversion().mjPerRf; + } + + @Override + public long getCapacity() { + return rf.getMaxEnergyStored() * MjAPI.getRfConversion().mjPerRf; + } + + long implGetPowerRequested() { + return (rf.getMaxEnergyStored() - rf.getEnergyStored()) * MjAPI.getRfConversion().mjPerRf; + } + + /** @return excess */ + long implReceivePower(long microJoules, boolean simulate) { + if (!rf.canReceive()) { + return microJoules; + } + + long mjPerRf = MjAPI.getRfConversion().mjPerRf; + + int maxRf = (int) (microJoules / mjPerRf); + + if (maxRf <= 0) { + return microJoules; + } + + int received = rf.receiveEnergy(maxRf, simulate); + + return microJoules - received * mjPerRf; + } + + long implExtractPower(long min, long max, boolean simulate) { + + if (!rf.canExtract()) { + return 0; + } + + long mjPerRf = MjAPI.getRfConversion().mjPerRf; + + int maxRf = (int) (max / mjPerRf); + + if (maxRf <= 0) { + return 0; + } + + int extractedRF = rf.extractEnergy(maxRf, true); + long extractedMJ = extractedRF * mjPerRf; + if (extractedMJ < min) { + return 0; + } + + if (!simulate) { + rf.extractEnergy(maxRf, simulate); + } + + return extractedMJ; + } +} + +final class OfReceiver extends MjToRfAutoConvertor implements IMjReceiver { + + OfReceiver(IEnergyStorage storage) { + super(storage); + } + + @Override + public boolean canReceive() { + return rf.canReceive(); + } + + @Override + public long getPowerRequested() { + return implGetPowerRequested(); + } + + @Override + public long receivePower(long microJoules, boolean simulate) { + return implReceivePower(microJoules, simulate); + } +} + +final class OfProvider extends MjToRfAutoConvertor implements IMjPassiveProvider { + OfProvider(IEnergyStorage storage) { + super(storage); + } + + @Override + public long extractPower(long min, long max, boolean simulate) { + return implExtractPower(min, max, simulate); + } +} + +final class OfBoth extends MjToRfAutoConvertor implements IMjReceiver, IMjPassiveProvider { + + OfBoth(IEnergyStorage storage) { + super(storage); + } + + @Override + public boolean canReceive() { + return rf.canReceive(); + } + + @Override + public long getPowerRequested() { + return implGetPowerRequested(); + } + + @Override + public long receivePower(long microJoules, boolean simulate) { + return implReceivePower(microJoules, simulate); + } + + @Override + public long extractPower(long min, long max, boolean simulate) { + return implExtractPower(min, max, simulate); + } +} diff --git a/api/buildcraft/api/transport/pipe/IFlowPower.java b/api/buildcraft/api/transport/pipe/IFlowPower.java index 4b33292..a240e31 100644 --- a/api/buildcraft/api/transport/pipe/IFlowPower.java +++ b/api/buildcraft/api/transport/pipe/IFlowPower.java @@ -3,8 +3,9 @@ import buildcraft.api.mj.IMjPassiveProvider; import net.minecraft.core.Direction; -public interface IFlowPower { +public interface IFlowPower extends IFlowPowerLike { /** Makes this pipe reconfigure itself, possibly due to the addition of new modules. */ + @Override void reconfigure(); /** Attempts to extract power from the {@link IMjPassiveProvider} connected to this pipe on the given side. diff --git a/api/buildcraft/api/transport/pipe/IFlowPowerLike.java b/api/buildcraft/api/transport/pipe/IFlowPowerLike.java new file mode 100644 index 0000000..c56b085 --- /dev/null +++ b/api/buildcraft/api/transport/pipe/IFlowPowerLike.java @@ -0,0 +1,6 @@ +package buildcraft.api.transport.pipe; + +public interface IFlowPowerLike { + /** Makes this pipe reconfigure itself, possibly due to the addition of new modules. */ + void reconfigure(); +} diff --git a/api/buildcraft/api/transport/pipe/IFlowRedstoneFlux.java b/api/buildcraft/api/transport/pipe/IFlowRedstoneFlux.java new file mode 100644 index 0000000..d87b98c --- /dev/null +++ b/api/buildcraft/api/transport/pipe/IFlowRedstoneFlux.java @@ -0,0 +1,18 @@ +package buildcraft.api.transport.pipe; + +import net.minecraft.core.Direction; +import net.minecraftforge.energy.IEnergyStorage; + +public interface IFlowRedstoneFlux extends IFlowPowerLike { + /** Makes this pipe reconfigure itself, possibly due to the addition of new modules. */ + @Override + void reconfigure(); + + /** Attempts to extract power from the {@link IEnergyStorage} connected to this pipe on the given side. + * + * @param maxPower The Maximum amount of power that can be extracted. + * @param from The side (of this pipe) to take power from. + * @return The amount of power extracted. */ + // int tryExtractPower(int maxPower, EnumFacing from); + int tryExtractPower(int maxPower, Direction from); +} diff --git a/api/buildcraft/api/transport/pipe/PipeApi.java b/api/buildcraft/api/transport/pipe/PipeApi.java index 904d2c1..1eace25 100644 --- a/api/buildcraft/api/transport/pipe/PipeApi.java +++ b/api/buildcraft/api/transport/pipe/PipeApi.java @@ -25,6 +25,7 @@ public final class PipeApi { public static PipeFlowType flowItems; public static PipeFlowType flowFluids; public static PipeFlowType flowPower; + public static PipeFlowType flowRf; /** The default transfer information used if a pipe definition has not been registered. Note that this is replaced * by BuildCraft Transport to config-defined values. */ @@ -34,8 +35,13 @@ public final class PipeApi { * by BuildCraft Transport to config-defined values. */ public static PowerTransferInfo powerInfoDefault = PowerTransferInfo.createFromResistance(8 * MjAPI.MJ, MjAPI.MJ / 32, false); + /** The default transfer information used if a pipe definition has not been registered. Note that this is replaced + * by BuildCraft Transport to config-defined values. */ + public static RedstoneFluxTransferInfo rfInfoDefault = new RedstoneFluxTransferInfo(80, false); + public static final Map fluidTransferData = new IdentityHashMap<>(); public static final Map powerTransferData = new IdentityHashMap<>(); + public static final Map rfTransferData = new IdentityHashMap<>(); @Nonnull public static final Capability CAP_PIPE_HOLDER = CapabilityManager.get(new CapabilityToken<>() { @@ -71,6 +77,15 @@ public static PowerTransferInfo getPowerTransferInfo(PipeDefinition def) { } } + public static RedstoneFluxTransferInfo getRfTransferInfo(PipeDefinition def) { + RedstoneFluxTransferInfo info = rfTransferData.get(def); + if (info == null) { + return rfInfoDefault; + } else { + return info; + } + } + public static class FluidTransferInfo { /** Controls the maximum amount of fluid that can be transferred around and out of a pipe per tick. Note that * this does not affect the flow rate coming into the pipe. */ @@ -126,6 +141,16 @@ public PowerTransferInfo(long transferPerTick, long lossPerTick, long resistance } } + public static class RedstoneFluxTransferInfo { + public final int transferPerTick; + public final boolean isReceiver; + + public RedstoneFluxTransferInfo(int transferPerTick, boolean isReceiver) { + this.transferPerTick = transferPerTick; + this.isReceiver = isReceiver; + } + } + // Internals @SubscribeEvent diff --git a/api/buildcraft/api/transport/pipe/PipeEventPower.java b/api/buildcraft/api/transport/pipe/PipeEventPower.java index fc30a20..4c23d2a 100644 --- a/api/buildcraft/api/transport/pipe/PipeEventPower.java +++ b/api/buildcraft/api/transport/pipe/PipeEventPower.java @@ -25,6 +25,7 @@ public static class Configure extends PipeEventPower { * or by {@link #powerResistance} if it is set. This is capped at the value given in {@link #getMaxPower()} */ private long powerLoss = -1; private boolean receiver = false; + private boolean disabled = false; public Configure(IPipeHolder holder, IFlowPower flow) { super(holder, flow); @@ -70,6 +71,14 @@ public boolean isReceiver() { public void setReceiver(boolean receiver) { this.receiver = receiver; } + + public void disableTransfer() { + disabled = true; + } + + public boolean isTransferDisabled() { + return disabled; + } } public static class PrimaryDirection extends PipeEventPower { diff --git a/api/buildcraft/api/transport/pipe/PipeEventRedstoneFlux.java b/api/buildcraft/api/transport/pipe/PipeEventRedstoneFlux.java new file mode 100644 index 0000000..bf66008 --- /dev/null +++ b/api/buildcraft/api/transport/pipe/PipeEventRedstoneFlux.java @@ -0,0 +1,69 @@ +package buildcraft.api.transport.pipe; + +import net.minecraft.core.Direction; + +public abstract class PipeEventRedstoneFlux extends PipeEvent { + public final IFlowRedstoneFlux flow; + + protected PipeEventRedstoneFlux(IPipeHolder holder, IFlowRedstoneFlux flow) { + super(holder); + this.flow = flow; + } + + protected PipeEventRedstoneFlux(boolean canBeCancelled, IPipeHolder holder, IFlowRedstoneFlux flow) { + super(canBeCancelled, holder); + this.flow = flow; + } + + public static class Configure extends PipeEventRedstoneFlux { + private int maxPower = 100; + private boolean receiver = false; + private boolean disabled = false; + + public Configure(IPipeHolder holder, IFlowRedstoneFlux flow) { + super(holder, flow); + } + + public int getMaxPower() { + return this.maxPower; + } + + public void setMaxPower(int maxPower) { + this.maxPower = maxPower; + } + + public boolean isReceiver() { + return this.receiver; + } + + /** Sets this pipe to be one that receives power from external sources. */ + public void setReceiver(boolean receiver) { + this.receiver = receiver; + } + + public void disableTransfer() { + disabled = true; + } + + public boolean isTransferDisabled() { + return disabled; + } + } + + public static class PrimaryDirection extends PipeEventRedstoneFlux { + private Direction facing; + + public PrimaryDirection(IPipeHolder holder, IFlowRedstoneFlux flow, Direction facing) { + super(holder, flow); + this.facing = facing; + } + + public Direction getFacing() { + return facing; + } + + public void setFacing(Direction facing) { + this.facing = facing; + } + } +} diff --git a/api/buildcraft/api/transport/pipe/PipeFlow.java b/api/buildcraft/api/transport/pipe/PipeFlow.java index 12222d8..4608edb 100644 --- a/api/buildcraft/api/transport/pipe/PipeFlow.java +++ b/api/buildcraft/api/transport/pipe/PipeFlow.java @@ -73,11 +73,11 @@ public boolean shouldForceConnection(Direction face, BlockEntity oTile) { return false; } - public void onTick() { - } + public void onTick() {} - public void addDrops(NonNullList toDrop, int fortune) { - } + public void postPluggableTick() {} + + public void addDrops(NonNullList toDrop, int fortune) {} public boolean onFlowActivate(Player player, HitResult trace, float hitX, float hitY, float hitZ, EnumPipePart part) { From bc7e25ba5b10901a4b3b648573583bf35849802e Mon Sep 17 00:00:00 2001 From: CalenXwX Date: Thu, 24 Apr 2025 18:38:24 +0800 Subject: [PATCH 7/9] Update engine type --- api/buildcraft/api/core/IEngineType.java | 5 +++- api/buildcraft/api/enums/EnumEngineType.java | 24 +++++++++++--------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/api/buildcraft/api/core/IEngineType.java b/api/buildcraft/api/core/IEngineType.java index d6fc9c3..ee1ae91 100644 --- a/api/buildcraft/api/core/IEngineType.java +++ b/api/buildcraft/api/core/IEngineType.java @@ -1,5 +1,8 @@ package buildcraft.api.core; +import net.minecraft.resources.ResourceLocation; + public interface IEngineType { -// String getItemModelLocation(); + // String getItemModelLocation(); + ResourceLocation getItemModelLocation(); } diff --git a/api/buildcraft/api/enums/EnumEngineType.java b/api/buildcraft/api/enums/EnumEngineType.java index 9ba926a..b3aa418 100644 --- a/api/buildcraft/api/enums/EnumEngineType.java +++ b/api/buildcraft/api/enums/EnumEngineType.java @@ -1,33 +1,35 @@ package buildcraft.api.enums; import buildcraft.api.core.IEngineType; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.StringRepresentable; public enum EnumEngineType implements StringRepresentable, IEngineType { WOOD("core", "wood"), - STONE("energy", "stone"), - IRON("energy", "iron"), - // CREATIVE("energy", "creative"), + STONE("core", "stone"), + IRON("core", "iron"), CREATIVE("core", "creative"), - RF("energy", "rf"), + RF("core", "rf"), ; // public final String unlocalizedTag; private final String unlocalizedTag; - @Deprecated(forRemoval = true) - public final String resourceLocation; + // public final String resourceLocation; + public final ResourceLocation resourceLocation; public static final EnumEngineType[] VALUES = values(); EnumEngineType(String mod, String loc) { unlocalizedTag = loc; - resourceLocation = "buildcraft" + mod + ":block/engine/inv/" + loc; + // resourceLocation = "buildcraft" + mod + ":blocks/engine/inv/" + loc; + resourceLocation = new ResourceLocation("buildcraft" + mod, "engine_" + loc); } -// @Override -// public String getItemModelLocation() { -// return resourceLocation; -// } + @Override + // public String getItemModelLocation() + public ResourceLocation getItemModelLocation() { + return resourceLocation; + } @Override public String getSerializedName() { From 744d000f4c04e0ce75fd48e00fe782f1e6a7f0ed Mon Sep 17 00:00:00 2001 From: CalenXwX Date: Sat, 26 Apr 2025 14:56:27 +0800 Subject: [PATCH 8/9] Update IMessage --- api/buildcraft/api/net/IMessage.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/buildcraft/api/net/IMessage.java b/api/buildcraft/api/net/IMessage.java index 612c15c..4e16d57 100644 --- a/api/buildcraft/api/net/IMessage.java +++ b/api/buildcraft/api/net/IMessage.java @@ -8,9 +8,9 @@ public interface IMessage { void toBytes(FriendlyByteBuf buf); - public static IMessage staticFromBytes(Class clazz, FriendlyByteBuf buf) { + public static MSG staticFromBytes(Class clazz, FriendlyByteBuf buf) { try { - IMessage message = clazz.newInstance(); + MSG message = clazz.newInstance(); message.fromBytes(buf); return message; } catch (Exception e) { From fc7b0927a6d6461d37c8918d367ee19829498198 Mon Sep 17 00:00:00 2001 From: CalenXwX Date: Wed, 7 May 2025 21:48:42 +0800 Subject: [PATCH 9/9] Fix MJ-RF conversion --- api/buildcraft/api/mj/MjCapabilityHelper.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/api/buildcraft/api/mj/MjCapabilityHelper.java b/api/buildcraft/api/mj/MjCapabilityHelper.java index be21aa2..24a9a47 100644 --- a/api/buildcraft/api/mj/MjCapabilityHelper.java +++ b/api/buildcraft/api/mj/MjCapabilityHelper.java @@ -96,7 +96,9 @@ public int receiveEnergy(int maxReceive, boolean simulate) { // (We need to actual accepted MJ to be some integer multiple of mjPerRf) long excessMj = acceptedMj % mjPerRf; // An MJ value that is an integer multiple of mjPerRf - long exactAcceptableMj = maxReceiveMj - excessMj; + // Calen FIX: acceptedMj, not maxReceiveMj + // long exactAcceptableMj = maxReceiveMj - excessMj; + long exactAcceptableMj = acceptedMj - excessMj; if (exactAcceptableMj <= 0) { return 0; @@ -178,7 +180,7 @@ public LazyOptional getCapability(@Nonnull Capability capability, Dire return provider == null ? LazyOptional.empty() : LazyOptional.of(() -> provider).cast(); } if (capability == ForgeCapabilities.ENERGY) { - return provider == null ? LazyOptional.empty() : LazyOptional.of(() -> rfAutoConvert).cast(); + return rfAutoConvert == null ? LazyOptional.empty() : LazyOptional.of(() -> rfAutoConvert).cast(); } return LazyOptional.empty(); }