diff --git a/build.gradle b/build.gradle index b893726b0..b341f3b6b 100644 --- a/build.gradle +++ b/build.gradle @@ -72,12 +72,6 @@ archivesBaseName = artifact_basename sourceSets { api main { - java { - exclude 'appeng/spatial/StorageChunkProvider.java' - exclude 'appeng/spatial/StorageHelper.java' - exclude 'appeng/spatial/CachedPlane.java' - exclude 'appeng/spatial/StorageWorldProvider.java' - } compileClasspath += sourceSets.api.output runtimeClasspath += sourceSets.api.output resources { diff --git a/src/api/java/appeng/api/implementations/items/ISpatialStorageCell.java b/src/api/java/appeng/api/implementations/items/ISpatialStorageCell.java index 627973aba..e8f843441 100644 --- a/src/api/java/appeng/api/implementations/items/ISpatialStorageCell.java +++ b/src/api/java/appeng/api/implementations/items/ISpatialStorageCell.java @@ -31,6 +31,7 @@ import net.minecraft.world.World; import appeng.api.implementations.TransitionResult; import appeng.api.storage.ISpatialDimension; import appeng.api.util.WorldCoord; +import net.minecraft.world.dimension.DimensionType; /** @@ -53,12 +54,6 @@ public interface ISpatialStorageCell */ int getMaxStoredDim( ItemStack is ); - /** - * @param is spatial storage cell - * - * @return the world for this cell - */ - ISpatialDimension getSpatialDimension(); /** * get the currently stored size. @@ -76,7 +71,7 @@ public interface ISpatialStorageCell * * @return dimension id or -1 */ - int getStoredDimensionID( ItemStack is ); + DimensionType getStoredDimension(ItemStack is ); /** * Perform a spatial swap with the contents of the cell, and the world. diff --git a/src/api/java/appeng/api/storage/ISpatialDimension.java b/src/api/java/appeng/api/storage/ISpatialDimension.java index 69159988b..ddd2c3743 100644 --- a/src/api/java/appeng/api/storage/ISpatialDimension.java +++ b/src/api/java/appeng/api/storage/ISpatialDimension.java @@ -21,21 +21,26 @@ package appeng.api.storage; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.server.ServerWorld; + +import javax.annotation.Nullable; public interface ISpatialDimension { - World getWorld(); + ServerWorld getWorld(DimensionType cellDim ); - int createNewCellDimension( BlockPos contentSize, int playerId ); + @Nullable + DimensionType createNewCellDimension(BlockPos contentSize, int playerId ); - void deleteCellDimension( int cellDimId ); + void deleteCellDimension( DimensionType cellDim ); - boolean isCellDimension( int cellDimID ); + boolean isCellDimension( DimensionType cellDim ); - int getCellDimensionOwner( int cellDimId ); + int getCellDimensionOwner( DimensionType cellDim ); - BlockPos getCellDimensionOrigin( int cellDimId ); + BlockPos getCellDimensionOrigin( DimensionType cellDim ); - BlockPos getCellContentSize( int cellDimId ); + BlockPos getCellContentSize( DimensionType cellDim ); } diff --git a/src/main/java/appeng/FixupIngredients.java b/src/main/java/appeng/FixupIngredients.java deleted file mode 100644 index a9db46085..000000000 --- a/src/main/java/appeng/FixupIngredients.java +++ /dev/null @@ -1,182 +0,0 @@ -package appeng; - -import appeng.api.util.AEColor; -import appeng.core.AppEng; -import appeng.items.materials.MaterialType; -import appeng.items.parts.PartType; -import com.google.gson.*; - -import java.io.IOException; -import java.io.Reader; -import java.io.Writer; -import java.nio.charset.StandardCharsets; -import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.Map; - -public class FixupIngredients { - - private static Gson gson = new GsonBuilder() - .setPrettyPrinting() - .create(); - - private static JsonObject visitObjProps(JsonObject obj) { - for (Map.Entry e : obj.entrySet()) { - e.setValue(visitAndReplace(e.getValue())); - } - return obj; - } - - private static JsonElement visitAndReplace(JsonElement el) { - if (el.isJsonArray()) { - JsonArray arr = el.getAsJsonArray(); - for (int i = 0; i < arr.size(); i++) { - arr.set(i, visitAndReplace(arr.get(i))); - } - return arr; - } - if (!el.isJsonObject()) { - return el; - } - - JsonObject obj = el.getAsJsonObject(); - if (obj.size() != 2 && (obj.size() != 3 || !obj.has("count"))) { - return visitObjProps(obj); - } - Integer count = null; - if (obj.has("count")) { - count = obj.get("count").getAsInt(); - } - - JsonPrimitive type = obj.getAsJsonPrimitive("type"); - - if (type == null) { - return visitObjProps(obj); - } - - if ("forge:ore_dict".equals(type.getAsString())) { - String ore = obj.get("ore").getAsString(); - JsonObject r = new JsonObject(); - r.add("tag", new JsonPrimitive(AppEng.MOD_ID + ':' + "ore_" + ore)); - return r; - } - - if (!type.getAsString().equals("appliedenergistics2:part")) { - return visitObjProps(obj); - } - String part = obj.getAsJsonPrimitive("part").getAsString(); - - String itemName = null; - if (part.startsWith("material.")) { - String mtName = part.substring(9).toUpperCase(); - if ("WIRELESS".equals(mtName)) { - mtName = "WIRELESS_RECEIVER"; - } - - itemName = mtName.toLowerCase(); - } else if (part.startsWith("part.")) { - part = part.substring(5); - - if ("fluid_interface".equals(part)) { - part = "cable_fluid_interface"; - } else if ("interface".equals(part)) { - part = "cable_interface"; - } - } - - if (itemName == null) { - // Handle tags - String tagName = null; - if ( part.equalsIgnoreCase("cable_glass")) { - tagName = "glass_cable"; - } else if (part.equalsIgnoreCase("cable_covered")) { - tagName = "covered_cable"; - } else if (part.equalsIgnoreCase("cable_smart")) { - tagName = "smart_cable"; - } else if (part.equalsIgnoreCase("cable_dense_covered")) { - tagName = "covered_dense_cable"; - } else if (part.equalsIgnoreCase("cable_dense_smart")) { - tagName = "smart_dense_cable"; - } - if (tagName != null) { - JsonObject r = new JsonObject(); - r.add("tag", new JsonPrimitive(AppEng.MOD_ID + ':' + tagName)); - return r; - } - itemName = part.toLowerCase(); - } - - for (AEColor c : AEColor.values()) { - String colorSuffix = '.' + c.registryPrefix; - if (itemName.endsWith(colorSuffix)) { - String p = itemName.substring(0, itemName.length() - colorSuffix.length()); - itemName = c.registryPrefix + "_" + p; - break; - } - } - - if (itemName.startsWith("p2p_tunnel_")) { - itemName = itemName.substring("p2p_tunnel_".length()) + "_p2p_tunnel"; - } - - JsonObject r = new JsonObject(); - r.add("item", new JsonPrimitive(AppEng.MOD_ID + ':' + itemName)); - if (count != null) { - r.add("count", new JsonPrimitive(count)); - } - return r; - - } - - public static void main(String[] args) throws IOException { - - Path p= Paths.get("D:\\Applied-Energistics-2\\src\\main\\resources\\data\\appliedenergistics2"); - - Files.walkFileTree(p, new FileVisitor() { - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - if (!file.getFileName().toString().endsWith(".json")) { - return FileVisitResult.CONTINUE; - } - if (file.getFileName().toString().contains("_constants")) { - return FileVisitResult.CONTINUE; - } - if (file.getFileName().toString().contains("_factories")) { - return FileVisitResult.CONTINUE; - } - - JsonElement el; - try (Reader r = Files.newBufferedReader(file, StandardCharsets.UTF_8)) { - el = visitAndReplace(gson.fromJson(r, JsonElement.class)); - } catch (Exception e) { - System.err.println("Failed to process file " + file); - e.printStackTrace(); - return FileVisitResult.CONTINUE; - } - - try (Writer w = Files.newBufferedWriter(file, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) { - gson.toJson(el, w); - } - - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { - return FileVisitResult.CONTINUE; - } - }); - - } - -} diff --git a/src/main/java/appeng/block/spatial/BlockMatrixFrame.java b/src/main/java/appeng/block/spatial/BlockMatrixFrame.java index a10f954c5..1cf7262a6 100644 --- a/src/main/java/appeng/block/spatial/BlockMatrixFrame.java +++ b/src/main/java/appeng/block/spatial/BlockMatrixFrame.java @@ -52,7 +52,7 @@ public class BlockMatrixFrame extends AEBaseBlock public BlockMatrixFrame() { - super( Properties.create(MATERIAL).hardnessAndResistance(-1.0F, 6000000.0F).noDrops().notSolid() ); + super( Properties.create(MATERIAL).hardnessAndResistance(-1.0F, 6000000.0F).noDrops() ); // FIXME this.setLightOpacity( 0 ); // FIXME this.setOpaque( false ); } @@ -76,7 +76,7 @@ public class BlockMatrixFrame extends AEBaseBlock @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return VoxelShapes.empty(); + return VoxelShapes.fullCube(); } @Override diff --git a/src/main/java/appeng/capabilities/NullSpatialDimension.java b/src/main/java/appeng/capabilities/NullSpatialDimension.java index eaffd7f23..ec1e986db 100644 --- a/src/main/java/appeng/capabilities/NullSpatialDimension.java +++ b/src/main/java/appeng/capabilities/NullSpatialDimension.java @@ -23,47 +23,49 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import appeng.api.storage.ISpatialDimension; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.server.ServerWorld; class NullSpatialDimension implements ISpatialDimension { @Override - public int createNewCellDimension( BlockPos size, int owner ) - { - return -1; - } - - @Override - public void deleteCellDimension( int cellStorageId ) - { - } - - @Override - public int getCellDimensionOwner( int cellStorageId ) - { - return -1; - } - - @Override - public BlockPos getCellDimensionOrigin( int cellStorageId ) + public DimensionType createNewCellDimension(BlockPos size, int owner ) { return null; } @Override - public World getWorld() + public void deleteCellDimension( DimensionType cellStorageId ) + { + } + + @Override + public int getCellDimensionOwner( DimensionType cellStorageId ) + { + return -1; + } + + @Override + public BlockPos getCellDimensionOrigin( DimensionType cellStorageId ) { return null; } @Override - public boolean isCellDimension( int cellDimID ) + public ServerWorld getWorld(DimensionType cellStorageId ) + { + return null; + } + + @Override + public boolean isCellDimension( DimensionType cellDimID ) { return false; } @Override - public BlockPos getCellContentSize( int cellDimId ) + public BlockPos getCellContentSize( DimensionType cellDimId ) { return null; } diff --git a/src/main/java/appeng/client/render/SpatialSkyRender.java b/src/main/java/appeng/client/render/SpatialSkyRender.java index 3a98fe545..83d509f49 100644 --- a/src/main/java/appeng/client/render/SpatialSkyRender.java +++ b/src/main/java/appeng/client/render/SpatialSkyRender.java @@ -50,15 +50,18 @@ public class SpatialSkyRender implements IRenderHandler this.dspList = GL11.glGenLists( 1 ); } - //FIXME, Do not use this until the above PR is merged. - // public static IRenderHandler getInstance() - // { - // return INSTANCE; - // } + public static IRenderHandler getInstance() + { + return INSTANCE; + } @Override public void render( final int ticks, final float partialTicks, final ClientWorld world, final Minecraft mc ) { + //FIXME, Do not use this until the above PR is merged. + if (true) { + return; + } final long now = System.currentTimeMillis(); if( now - this.cycle > 2000 ) diff --git a/src/main/java/appeng/core/AppEng.java b/src/main/java/appeng/core/AppEng.java index 813ddd38b..08ea8a349 100644 --- a/src/main/java/appeng/core/AppEng.java +++ b/src/main/java/appeng/core/AppEng.java @@ -54,6 +54,10 @@ import net.minecraft.particles.ParticleType; import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ResourceLocation; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.server.ServerWorld; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.feature.Feature; import net.minecraft.world.server.ServerWorld; @@ -62,6 +66,8 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.client.model.geometry.IModelGeometry; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.ModDimension; +import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.CrashReportExtender; @@ -132,6 +138,8 @@ public final class AppEng modEventBus.addGenericListener(ContainerType.class, registration::registerContainerTypes); modEventBus.addGenericListener(IRecipeSerializer.class, registration::registerRecipeSerializers); modEventBus.addGenericListener(Feature.class, registration::registerWorldGen); + modEventBus.addGenericListener(Biome.class, registration::registerBiomes); + modEventBus.addGenericListener(ModDimension.class, registration::registerModDimension); modEventBus.addListener(registration::registerParticleFactories); modEventBus.addListener(registration::registerTextures); modEventBus.addListener(registration::registerCommands); diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index 7d6f6b863..09853d107 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -38,39 +38,7 @@ import appeng.api.networking.storage.IStorageGrid; import appeng.api.networking.ticking.ITickManager; import appeng.bootstrap.IModelRegistry; import appeng.bootstrap.components.*; -import appeng.client.gui.implementations.GuiCellWorkbench; -import appeng.client.gui.implementations.GuiChest; -import appeng.client.gui.implementations.GuiCondenser; -import appeng.client.gui.implementations.GuiCraftAmount; -import appeng.client.gui.implementations.GuiCraftConfirm; -import appeng.client.gui.implementations.GuiCraftingCPU; -import appeng.client.gui.implementations.GuiCraftingStatus; -import appeng.client.gui.implementations.GuiCraftingTerm; -import appeng.client.gui.implementations.GuiDrive; -import appeng.client.gui.implementations.GuiFormationPlane; -import appeng.client.gui.implementations.GuiGrinder; -import appeng.client.gui.implementations.GuiIOPort; -import appeng.client.gui.implementations.GuiInscriber; -import appeng.client.gui.implementations.GuiInterface; -import appeng.client.gui.implementations.GuiInterfaceTerminal; -import appeng.client.gui.implementations.GuiLevelEmitter; -import appeng.client.gui.implementations.GuiMAC; -import appeng.client.gui.implementations.GuiMEMonitorable; -import appeng.client.gui.implementations.GuiMEPortableCell; -import appeng.client.gui.implementations.GuiNetworkStatus; -import appeng.client.gui.implementations.GuiNetworkTool; -import appeng.client.gui.implementations.GuiPatternTerm; -import appeng.client.gui.implementations.GuiPriority; -import appeng.client.gui.implementations.GuiQNB; -import appeng.client.gui.implementations.GuiQuartzKnife; -import appeng.client.gui.implementations.GuiSecurityStation; -import appeng.client.gui.implementations.GuiSkyChest; -import appeng.client.gui.implementations.GuiSpatialIOPort; -import appeng.client.gui.implementations.GuiStorageBus; -import appeng.client.gui.implementations.GuiUpgradeable; -import appeng.client.gui.implementations.GuiVibrationChamber; -import appeng.client.gui.implementations.GuiWireless; -import appeng.client.gui.implementations.GuiWirelessTerm; +import appeng.client.gui.implementations.*; import appeng.client.render.effects.*; import appeng.client.render.model.BiometricCardModel; import appeng.client.render.model.DriveModel; @@ -99,7 +67,10 @@ import appeng.recipes.handlers.GrinderRecipeSerializer; import appeng.recipes.handlers.InscriberRecipe; import appeng.recipes.handlers.InscriberRecipeSerializer; import appeng.server.AECommand; +import appeng.spatial.StorageCellBiome; +import appeng.spatial.StorageCellModDimension; import appeng.tile.AEBaseTile; +import appeng.worldgen.MeteoriteWorldGen; import net.minecraft.advancements.CriteriaTriggers; import appeng.worldgen.MeteoriteWorldGen; import net.minecraft.block.Block; @@ -109,10 +80,16 @@ import net.minecraft.entity.EntityType; import net.minecraft.inventory.container.ContainerType; import net.minecraft.item.Item; import net.minecraft.item.crafting.IRecipeSerializer; -import net.minecraft.item.crafting.IRecipeType; import net.minecraft.particles.ParticleType; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ResourceLocation; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.NoFeatureConfig; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.GenerationStage; import net.minecraft.world.gen.feature.ConfiguredFeature; @@ -124,8 +101,8 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.*; import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.common.ModDimension; import net.minecraftforge.common.crafting.CraftingHelper; -import net.minecraftforge.common.crafting.conditions.IConditionSerializer; import net.minecraftforge.common.extensions.IForgeContainerType; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.DistExecutor; @@ -146,62 +123,8 @@ final class Registration advancementTriggers = new AdvancementTriggers( CriteriaTriggers::register ); } - // DimensionType storageDimensionType; -// int storageDimensionID; -// Biome storageBiome; AdvancementTriggers advancementTriggers; -// private void registerSpatialBiome( IForgeRegistry registry ) -// { -// if( !AEConfig.instance().isFeatureEnabled( AEFeature.SPATIAL_IO ) ) -// { -// return; -// } -// -// if( this.storageBiome == null ) -// { -// this.storageBiome = new BiomeGenStorage(); -// } -// registry.register( this.storageBiome.setRegistryName( "appliedenergistics2:storage_biome" ) ); -// } -// -// private void registerSpatialDimension() -// { -// final AEConfig config = AEConfig.instance(); -// if( !config.isFeatureEnabled( AEFeature.SPATIAL_IO ) ) -// { -// return; -// } -// -// if( config.getStorageProviderID() == -1 ) -// { -// final Set ids = new HashSet<>(); -// for( DimensionType type : DimensionType.values() ) -// { -// ids.add( type.getId() ); -// } -// -// int newId = -11; -// while( ids.contains( newId ) ) -// { -// --newId; -// } -// config.setStorageProviderID( newId ); -// config.save(); -// } -// -// this.storageDimensionType = DimensionType.register( "Storage Cell", "_cell", config.getStorageProviderID(), StorageWorldProvider.class, true ); -// -// if( config.getStorageDimensionID() == -1 ) -// { -// config.setStorageDimensionID( DimensionManager.getNextFreeDimId() ); -// config.save(); -// } -// this.storageDimensionID = config.getStorageDimensionID(); -// -// DimensionManager.registerDimension( this.storageDimensionID, this.storageDimensionType ); -// } - public static void setupInternalRegistries() { // TODO: Do not use the internal API @@ -233,13 +156,6 @@ final class Registration PartItemPredicate.register(); } -// @SubscribeEvent -// public void registerBiomes( RegistryEvent.Register event ) -// { -// final IForgeRegistry registry = event.getRegistry(); -// this.registerSpatialBiome( registry ); -// } -// @OnlyIn( Dist.CLIENT ) public void modelRegistryEvent( ModelRegistryEvent event ) { @@ -837,33 +753,14 @@ final class Registration r.register( MeteoriteWorldGen.INSTANCE ); } -// private static class ModelLoaderWrapper implements IModelRegistry -// { -// -// @Override -// public void registerItemVariants( Item item, ResourceLocation... names ) -// { -// ModelLoader.registerItemVariants( item, names ); -// } -// -// @Override -// public void setCustomModelResourceLocation( Item item, int metadata, ModelResourceLocation model ) -// { -// ModelLoader.setCustomModelResourceLocation( item, metadata, model ); -// } -// -// @Override -// public void setCustomMeshDefinition( Item item, ItemMeshDefinition meshDefinition ) -// { -// ModelLoader.setCustomMeshDefinition( item, meshDefinition ); -// } -// -// @Override -// public void setCustomStateMapper( Block block, IStateMapper mapper ) -// { -// ModelLoader.setCustomStateMapper( block, mapper ); -// } -// } + public void registerBiomes(RegistryEvent.Register evt) { + evt.getRegistry().register(StorageCellBiome.INSTANCE); + } + + public void registerModDimension(RegistryEvent.Register evt) + { + evt.getRegistry().register(StorageCellModDimension.INSTANCE); + } public void registerTextures(TextureStitchEvent.Pre event) { SkyChestTESR.registerTextures(event); @@ -887,4 +784,5 @@ final class Registration final ApiDefinitions definitions = Api.INSTANCE.definitions(); definitions.getRegistry().getBootstrapComponents( IModelBakeComponent.class ).forEachRemaining(c -> c.onModelBakeEvent(event)); } + } diff --git a/src/main/java/appeng/core/api/definitions/ApiItems.java b/src/main/java/appeng/core/api/definitions/ApiItems.java index 1e2fe203d..7c717da0f 100644 --- a/src/main/java/appeng/core/api/definitions/ApiItems.java +++ b/src/main/java/appeng/core/api/definitions/ApiItems.java @@ -248,21 +248,23 @@ public final class ApiItems implements IItems .features( AEFeature.VIEW_CELL ) .build(); - FeatureFactory storageCells = registry.features( AEFeature.STORAGE_CELLS ); - this.cell1k = storageCells.item( "1k_storage_cell", props -> new BasicItemStorageCell(props, MaterialType.ITEM_1K_CELL_COMPONENT, 1 ) ).build(); - this.cell4k = storageCells.item( "4k_storage_cell", props -> new BasicItemStorageCell(props, MaterialType.ITEM_4K_CELL_COMPONENT, 4 ) ).build(); - this.cell16k = storageCells.item( "16k_storage_cell", props -> new BasicItemStorageCell(props, MaterialType.ITEM_16K_CELL_COMPONENT, 16 ) ).build(); - this.cell64k = storageCells.item( "64k_storage_cell", props -> new BasicItemStorageCell(props, MaterialType.ITEM_64K_CELL_COMPONENT, 64 ) ).build(); + Consumer storageCellProps = p -> p.maxStackSize(1); - this.fluidCell1k = storageCells.item( "1k_fluid_storage_cell", props -> new BasicFluidStorageCell(props, MaterialType.FLUID_1K_CELL_COMPONENT, 1 ) ).build(); - this.fluidCell4k = storageCells.item( "4k_fluid_storage_cell", props -> new BasicFluidStorageCell(props, MaterialType.FLUID_4K_CELL_COMPONENT, 4 ) ).build(); - this.fluidCell16k = storageCells.item( "16k_fluid_storage_cell", props -> new BasicFluidStorageCell(props, MaterialType.FLUID_16K_CELL_COMPONENT, 16 ) ).build(); - this.fluidCell64k = storageCells.item( "64k_fluid_storage_cell", props -> new BasicFluidStorageCell(props, MaterialType.FLUID_64K_CELL_COMPONENT, 64 ) ).build(); + FeatureFactory storageCells = registry.features( AEFeature.STORAGE_CELLS ); + this.cell1k = storageCells.item( "1k_storage_cell", props -> new BasicItemStorageCell(props, MaterialType.ITEM_1K_CELL_COMPONENT, 1 ) ).props(storageCellProps).build(); + this.cell4k = storageCells.item( "4k_storage_cell", props -> new BasicItemStorageCell(props, MaterialType.ITEM_4K_CELL_COMPONENT, 4 ) ).props(storageCellProps).build(); + this.cell16k = storageCells.item( "16k_storage_cell", props -> new BasicItemStorageCell(props, MaterialType.ITEM_16K_CELL_COMPONENT, 16 ) ).props(storageCellProps).build(); + this.cell64k = storageCells.item( "64k_storage_cell", props -> new BasicItemStorageCell(props, MaterialType.ITEM_64K_CELL_COMPONENT, 64 ) ).props(storageCellProps).build(); + + this.fluidCell1k = storageCells.item( "1k_fluid_storage_cell", props -> new BasicFluidStorageCell(props, MaterialType.FLUID_1K_CELL_COMPONENT, 1 ) ).props(storageCellProps).build(); + this.fluidCell4k = storageCells.item( "4k_fluid_storage_cell", props -> new BasicFluidStorageCell(props, MaterialType.FLUID_4K_CELL_COMPONENT, 4 ) ).props(storageCellProps).build(); + this.fluidCell16k = storageCells.item( "16k_fluid_storage_cell", props -> new BasicFluidStorageCell(props, MaterialType.FLUID_16K_CELL_COMPONENT, 16 ) ).props(storageCellProps).build(); + this.fluidCell64k = storageCells.item( "64k_fluid_storage_cell", props -> new BasicFluidStorageCell(props, MaterialType.FLUID_64K_CELL_COMPONENT, 64 ) ).props(storageCellProps).build(); FeatureFactory spatialCells = registry.features( AEFeature.SPATIAL_IO ); - this.spatialCell2 = spatialCells.item( "2_cubed_spatial_storage_cell", props -> new ItemSpatialStorageCell(props, 2 ) ).build(); - this.spatialCell16 = spatialCells.item( "16_cubed_spatial_storage_cell", props -> new ItemSpatialStorageCell(props, 16 ) ).build(); - this.spatialCell128 = spatialCells.item( "128_cubed_spatial_storage_cell", props -> new ItemSpatialStorageCell(props, 128 ) ).build(); + this.spatialCell2 = spatialCells.item( "2_cubed_spatial_storage_cell", props -> new ItemSpatialStorageCell(props, 2 ) ).props(storageCellProps).build(); + this.spatialCell16 = spatialCells.item( "16_cubed_spatial_storage_cell", props -> new ItemSpatialStorageCell(props, 16 ) ).props(storageCellProps).build(); + this.spatialCell128 = spatialCells.item( "128_cubed_spatial_storage_cell", props -> new ItemSpatialStorageCell(props, 128 ) ).props(storageCellProps).build(); this.facade = registry.item( "facade", ItemFacade::new ) .features( AEFeature.FACADES ) diff --git a/src/main/java/appeng/core/worlddata/SpatialDimensionManager.java b/src/main/java/appeng/core/worlddata/SpatialDimensionManager.java index d8ea8dfdf..ea89d5245 100644 --- a/src/main/java/appeng/core/worlddata/SpatialDimensionManager.java +++ b/src/main/java/appeng/core/worlddata/SpatialDimensionManager.java @@ -19,164 +19,126 @@ package appeng.core.worlddata; -import java.util.HashMap; -import java.util.Map; - -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ICapabilitySerializable; -import net.minecraftforge.common.util.INBTSerializable; - import appeng.api.storage.ISpatialDimension; -import appeng.capabilities.Capabilities; -import net.minecraftforge.common.util.LazyOptional; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import appeng.core.AELog; +import appeng.core.AppEng; +import appeng.spatial.StorageCellModDimension; +import io.netty.buffer.Unpooled; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.PacketBuffer; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.util.INBTSerializable; +import net.minecraftforge.fml.server.ServerLifecycleHooks; -public class SpatialDimensionManager implements ISpatialDimension, ICapabilitySerializable +public class SpatialDimensionManager implements ISpatialDimension { - private static final String NBT_SPATIAL_DATA_KEY = "spatial_data"; - private static final String NBT_SPATIAL_ID_KEY = "id"; - - private World world; - private Map spatialData = new HashMap<>(); + private static final int MAX_DIM_PER_PLAYER = 999; private static final int MAX_CELL_DIMENSION = 512; - public SpatialDimensionManager( World world ) - { - this.world = world; + @Override + public ServerWorld getWorld(DimensionType cellDim) { + return DimensionManager.getWorld(getServer(), cellDim, true, true); } @Override - public World getWorld() + public DimensionType createNewCellDimension( BlockPos contentSize, int owner ) { - return this.world; - } - - @Override - public int createNewCellDimension( BlockPos contentSize, int owner ) - { - int newId = this.getNextId(); + // Try to find a free dimension ID for the player + ResourceLocation dimKey = null; + for (int i = 1; i <= MAX_DIM_PER_PLAYER; i++) { + dimKey = new ResourceLocation(AppEng.MOD_ID, "spatial_cell_" + owner + "_" + i); + if (DimensionType.byName(dimKey) == null) { + break; + } + dimKey = null; + } + if (dimKey == null) { + return null; + } StorageCellData data = new StorageCellData(); data.contentDimension = contentSize; data.owner = owner; - this.spatialData.put( newId, data ); + PacketBuffer extraData = new PacketBuffer(Unpooled.buffer()); + extraData.writeInt(owner); + extraData.writeBlockPos(contentSize); - return newId; + return DimensionManager.registerDimension(dimKey, StorageCellModDimension.INSTANCE, extraData, true); } @Override - public void deleteCellDimension( int cellStorageId ) + public void deleteCellDimension( DimensionType cellDim ) { - StorageCellData removed = this.spatialData.remove( cellStorageId ); - if( removed != null ) - { - this.clearCellArea( cellStorageId, removed ); + AELog.info("Unregistering storage cell dimension %s", cellDim.getRegistryName()); + MinecraftServer server = getServer(); + ServerWorld world = DimensionManager.getWorld(server, cellDim, false, false); + if (world != null) { + DimensionManager.unloadWorld(world); } + DimensionManager.unloadWorlds(server, true); + DimensionManager.unregisterDimension(cellDim.getId()); + } + + private static MinecraftServer getServer() { + return ServerLifecycleHooks.getCurrentServer(); } @Override - public boolean isCellDimension( int cellStorageId ) + public boolean isCellDimension( DimensionType cellDim ) { - return this.spatialData.containsKey( cellStorageId ); - } - - @Override - public int getCellDimensionOwner( int cellStorageId ) - { - StorageCellData cell = this.spatialData.get( cellStorageId ); - if( cell != null ) - { - return cell.owner; + // Check if the cell dimension type is even registered + if (cellDim.getRegistryName() == null || !cellDim.getRegistryName().equals(DimensionType.getKey(cellDim))) { + return false; } - return -1; + + return cellDim.getModType() instanceof StorageCellModDimension; } @Override - public BlockPos getCellDimensionOrigin( int cellStorageId ) + public int getCellDimensionOwner( DimensionType cellDim ) { - if( this.isCellDimension( cellStorageId ) ) - { - return this.getBlockPosFromId( cellStorageId ); + if (!(cellDim.getModType() instanceof StorageCellModDimension)) { + return -1; } - return null; + + PacketBuffer data = cellDim.getData(); + if (data == null) { + return -1; + } + data.readerIndex(0); + return data.readInt(); } @Override - public BlockPos getCellContentSize( int cellStorageId ) + public BlockPos getCellDimensionOrigin( DimensionType cellDim ) { - StorageCellData cell = this.spatialData.get( cellStorageId ); - if( cell != null ) - { - return cell.contentDimension; - } - return null; - } - - @SuppressWarnings("unchecked") - @Nonnull - @Override - public LazyOptional getCapability(@Nonnull Capability cap) { - if( cap == Capabilities.SPATIAL_DIMENSION ) - { - return LazyOptional.of(() -> (T) this); - } - return LazyOptional.empty(); - } - - @Nonnull - @Override - public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { - return getCapability(cap); + // A region file is 512x512 blocks (32x32 chunks), + // to avoid creating the 4 regions around 0,0,0, + // we move the origin to the middle of region 0,0 + return new BlockPos(512 / 2, 61, 512 / 2); } @Override - public CompoundNBT serializeNBT() + public BlockPos getCellContentSize( DimensionType cellDim ) { - final CompoundNBT ret = new CompoundNBT(); - final ListNBT list = new ListNBT(); - - for( Map.Entry entry : this.spatialData.entrySet() ) - { - final CompoundNBT nbt = entry.getValue().serializeNBT(); - nbt.putInt( NBT_SPATIAL_ID_KEY, entry.getKey() ); - list.add( nbt ); + if (!(cellDim.getModType() instanceof StorageCellModDimension)) { + return BlockPos.ZERO; } - ret.put( NBT_SPATIAL_DATA_KEY, list ); - return ret; - } - @Override - public void deserializeNBT( CompoundNBT nbt ) - { - if( nbt.contains(NBT_SPATIAL_DATA_KEY) ) - { - final ListNBT list = (ListNBT) nbt.get( NBT_SPATIAL_DATA_KEY ); - - this.spatialData.clear(); - for( int i = 0; i < list.size(); ++i ) - { - final CompoundNBT entry = list.getCompound( i ); - final StorageCellData data = new StorageCellData(); - final int id = entry.getInt( NBT_SPATIAL_ID_KEY ); - data.deserializeNBT( entry ); - this.spatialData.put( id, data ); - } + PacketBuffer data = cellDim.getData(); + if (data == null) { + return BlockPos.ZERO; } - } - - private int getNextId() - { - return this.spatialData.keySet().stream().max( Integer::compare ).orElse( -1 ) + 1; + data.readerIndex(4); + return data.readBlockPos(); } private BlockPos getBlockPosFromId( int id ) @@ -214,11 +176,6 @@ public class SpatialDimensionManager implements ISpatialDimension, ICapabilitySe return new BlockPos( posx, 64, posz ); } - private void clearCellArea( int cellId, StorageCellData cell ) - { - // TODO reset chunks? - } - private static class StorageCellData implements INBTSerializable { private static final String NBT_OWNER_KEY = "owner"; diff --git a/src/main/java/appeng/items/storage/ItemSpatialStorageCell.java b/src/main/java/appeng/items/storage/ItemSpatialStorageCell.java index 0f5dc6165..4d3a13f57 100644 --- a/src/main/java/appeng/items/storage/ItemSpatialStorageCell.java +++ b/src/main/java/appeng/items/storage/ItemSpatialStorageCell.java @@ -21,12 +21,18 @@ package appeng.items.storage; import java.util.List; +import appeng.core.AELog; +import appeng.core.worlddata.SpatialDimensionManager; +import appeng.spatial.StorageHelper; +import javafx.animation.Transition; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; +import net.minecraft.world.dimension.DimensionType; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -54,7 +60,6 @@ public class ItemSpatialStorageCell extends AEBaseItem implements ISpatialStorag public ItemSpatialStorageCell( Properties props, final int spatialScale ) { super(props); - // FIXME this.setMaxStackSize( 1 ); this.maxRegion = spatialScale; } @@ -62,10 +67,10 @@ public class ItemSpatialStorageCell extends AEBaseItem implements ISpatialStorag @Override public void addInformation(final ItemStack stack, final World world, final List lines, final ITooltipFlag advancedTooltips ) { - final int id = this.getStoredDimensionID( stack ); - if( id >= 0 ) + final DimensionType dimType = this.getStoredDimension( stack ); + if( dimType != null ) { - lines.add( GuiText.CellId.textComponent().appendText( ": " + id ) ); + lines.add( GuiText.CellId.textComponent().appendText( ": " + dimType.getRegistryName() ) ); } final WorldCoord wc = this.getStoredSize( stack ); @@ -87,46 +92,31 @@ public class ItemSpatialStorageCell extends AEBaseItem implements ISpatialStorag return this.maxRegion; } - @Override - public ISpatialDimension getSpatialDimension() - { - World w = null; -// FIXME final int id = AppEng.instance().getStorageDimensionID(); -// FIXME World w = DimensionManager.getWorld( id ); -// FIXME if( w == null ) -// FIXME { -// FIXME DimensionManager.initDimension( id ); -// FIXME w = DimensionManager.getWorld( id ); -// FIXME } - - if( w != null ) - { - LazyOptional spatialCap = w.getCapability(Capabilities.SPATIAL_DIMENSION, null); - return spatialCap.orElse(null); - } - return null; - } - @Override public WorldCoord getStoredSize( final ItemStack is ) { - if( is.hasTag() ) + final CompoundNBT c = is.getTag(); + if( c != null ) { - final CompoundNBT c = is.getTag(); return new WorldCoord( c.getInt( NBT_SIZE_X_KEY ), c.getInt( NBT_SIZE_Y_KEY ), c.getInt( NBT_SIZE_Z_KEY ) ); } return new WorldCoord( 0, 0, 0 ); } @Override - public int getStoredDimensionID( final ItemStack is ) + public DimensionType getStoredDimension(final ItemStack is ) { - if( is.hasTag() ) + final CompoundNBT c = is.getTag(); + if( c != null && c.contains(NBT_CELL_ID_KEY) ) { - final CompoundNBT c = is.getTag(); - return c.getInt( NBT_CELL_ID_KEY ); + try { + ResourceLocation dimTypeId = new ResourceLocation(c.getString( NBT_CELL_ID_KEY) ); + return DimensionType.byName(dimTypeId); + } catch (Exception e) { + AELog.warn("Failed to retrieve storage cell dimension.", e); + } } - return -1; + return null; } @Override @@ -139,31 +129,38 @@ public class ItemSpatialStorageCell extends AEBaseItem implements ISpatialStorag final BlockPos targetSize = new BlockPos( targetX, targetY, targetZ ); - ISpatialDimension manager = this.getSpatialDimension(); + ISpatialDimension manager = new SpatialDimensionManager(); - int cellid = this.getStoredDimensionID( is ); - if( cellid < 0 ) + DimensionType storedDim = this.getStoredDimension( is ); + if( storedDim == null ) { - cellid = manager.createNewCellDimension( targetSize, playerId ); + storedDim = manager.createNewCellDimension( targetSize, playerId ); + } + + if (storedDim == null) { + // Failed to create the dimension + return new TransitionResult(false, 0); } try { - if( manager.isCellDimension( cellid ) ) + if( manager.isCellDimension( storedDim ) ) { - BlockPos scale = manager.getCellContentSize( cellid ); + World cellWorld = manager.getWorld(storedDim); + + BlockPos scale = manager.getCellContentSize( storedDim ); if( scale.equals( targetSize ) ) { if( targetX <= maxSize && targetY <= maxSize && targetZ <= maxSize ) { - BlockPos offset = manager.getCellDimensionOrigin( cellid ); + BlockPos offset = manager.getCellDimensionOrigin( storedDim ); - this.setStorageCell( is, cellid, targetSize ); - // FIXME StorageHelper.getInstance() - // FIXME .swapRegions( w, min.x + 1, min.y + 1, min.z + 1, manager.getWorld(), offset.getX(), offset.getY(), - // FIXME offset.getZ(), targetX - 1, targetY - 1, - // FIXME targetZ - 1 ); + this.setStorageCell( is, storedDim, targetSize ); + StorageHelper.getInstance() + .swapRegions( w, min.x + 1, min.y + 1, min.z + 1, cellWorld, offset.getX(), offset.getY(), + offset.getZ(), targetX - 1, targetY - 1, + targetZ - 1 ); return new TransitionResult( true, 0 ); } @@ -174,18 +171,18 @@ public class ItemSpatialStorageCell extends AEBaseItem implements ISpatialStorag finally { // clean up newly created dimensions that failed transfer - if( manager.isCellDimension( cellid ) && this.getStoredDimensionID( is ) < 0 ) + if( manager.isCellDimension( storedDim ) && this.getStoredDimension( is ) == null ) { - manager.deleteCellDimension( cellid ); + manager.deleteCellDimension( storedDim ); } } } - private void setStorageCell( final ItemStack is, int id, BlockPos size ) + private void setStorageCell( final ItemStack is, DimensionType dim, BlockPos size ) { final CompoundNBT c = is.getOrCreateTag(); - c.putInt( NBT_CELL_ID_KEY, id ); + c.putString( NBT_CELL_ID_KEY, dim.getRegistryName().toString() ); c.putInt( NBT_SIZE_X_KEY, size.getX() ); c.putInt( NBT_SIZE_Y_KEY, size.getY() ); c.putInt( NBT_SIZE_Z_KEY, size.getZ() ); diff --git a/src/main/java/appeng/spatial/CachedPlane.java b/src/main/java/appeng/spatial/CachedPlane.java index a95330489..add4b3732 100644 --- a/src/main/java/appeng/spatial/CachedPlane.java +++ b/src/main/java/appeng/spatial/CachedPlane.java @@ -20,19 +20,19 @@ package appeng.spatial; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map.Entry; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.network.play.server.SChunkDataPacket; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ITickList; import net.minecraft.world.NextTickListEntry; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import appeng.api.AEApi; import appeng.api.movable.IMovableHandler; @@ -42,6 +42,9 @@ import appeng.api.util.WorldCoord; import appeng.core.AELog; import appeng.core.worlddata.WorldData; import appeng.util.Platform; +import net.minecraft.world.chunk.ChunkSection; +import net.minecraft.world.server.ServerChunkProvider; +import net.minecraft.world.server.ServerTickList; public class CachedPlane @@ -57,7 +60,7 @@ public class CachedPlane private final Chunk[][] myChunks; private final Column[][] myColumns; private final List tiles = new ArrayList<>(); - private final List ticks = new ArrayList<>(); + private final List> ticks = new ArrayList<>(); private final World world; private final IMovableRegistry reg = AEApi.instance().registries().movable(); private final List updates = new ArrayList<>(); @@ -121,13 +124,12 @@ public class CachedPlane { for( int cz = 0; cz < this.cz_size; cz++ ) { - final List> rawTiles = new ArrayList<>(); final List deadTiles = new ArrayList<>(); final Chunk c = w.getChunk( minCX + cx, minCZ + cz ); this.myChunks[cx][cz] = c; - rawTiles.addAll( ( (HashMap) c.getTileEntityMap() ).entrySet() ); + final List> rawTiles = new ArrayList<>(c.getTileEntityMap().entrySet()); for( final Entry tx : rawTiles ) { final BlockPos cp = tx.getKey(); @@ -165,19 +167,15 @@ public class CachedPlane c.getTileEntityMap().remove( cp ); } - final long k = this.getWorld().getGameTime(); - final List list = this.getWorld().getPendingBlockUpdates( c, false ); - if( list != null ) - { - for( final NextTickListEntry entry : list ) - { + final long gameTime = this.getWorld().getGameTime(); + final ITickList pendingBlockTicks = this.getWorld().getPendingBlockTicks(); + if (pendingBlockTicks instanceof ServerTickList) { + List> pending = ((ServerTickList) pendingBlockTicks).getPending(c.getPos(), false, true); + for (final NextTickListEntry entry : pending) { final BlockPos tePOS = entry.position; - if( tePOS.getX() >= minX && tePOS.getX() <= maxX && tePOS.getY() >= minY && tePOS.getY() <= maxY && tePOS.getZ() >= minZ && tePOS - .getZ() <= maxZ ) - { - final NextTickListEntry newEntry = new NextTickListEntry( tePOS, entry.getBlock() ); - newEntry.scheduledTime = entry.scheduledTime - k; - this.ticks.add( newEntry ); + if (tePOS.getX() >= minX && tePOS.getX() <= maxX && tePOS.getY() >= minY && tePOS.getY() <= maxY && tePOS.getZ() >= minZ && tePOS + .getZ() <= maxZ) { + this.ticks.add(new NextTickListEntry<>(tePOS, entry.getTarget(), entry.scheduledTime - gameTime, entry.priority)); } } } @@ -236,8 +234,8 @@ public class CachedPlane a.fillData( src_y, aD ); b.fillData( dst_y, bD ); - a.setBlockIDWithMetadata( src_y, bD ); - b.setBlockIDWithMetadata( dst_y, aD ); + a.setBlockState( src_y, bD ); + b.setBlockState( dst_y, aD ); } else { @@ -264,13 +262,13 @@ public class CachedPlane this.addTile( tePOS.getX() - dst.x_offset, tePOS.getY() - dst.y_offset, tePOS.getZ() - dst.z_offset, te, dst, mr ); } - for( final NextTickListEntry entry : this.ticks ) + for( final NextTickListEntry entry : this.ticks ) { final BlockPos tePOS = entry.position; dst.addTick( tePOS.getX() - this.x_offset, tePOS.getY() - this.y_offset, tePOS.getZ() - this.z_offset, entry ); } - for( final NextTickListEntry entry : dst.ticks ) + for( final NextTickListEntry entry : dst.ticks ) { final BlockPos tePOS = entry.position; this.addTick( tePOS.getX() - dst.x_offset, tePOS.getY() - dst.y_offset, tePOS.getZ() - dst.z_offset, entry ); @@ -295,9 +293,10 @@ public class CachedPlane } } - private void addTick( final int x, final int y, final int z, final NextTickListEntry entry ) + private void addTick( final int x, final int y, final int z, final NextTickListEntry entry ) { - this.world.scheduleUpdate( new BlockPos( x + this.x_offset, y + this.y_offset, z + this.z_offset ), entry.getBlock(), (int) entry.scheduledTime ); + BlockPos where = new BlockPos(x + this.x_offset, y + this.y_offset, z + this.z_offset); + this.world.getPendingBlockTicks().scheduleTick(where, entry.getTarget(), (int) entry.scheduledTime, entry.priority); } private void addTile( final int x, final int y, final int z, final TileEntity te, final CachedPlane alternateDestination, final IMovableRegistry mr ) @@ -321,16 +320,9 @@ public class CachedPlane final BlockPos pos = new BlockPos( x, y, z ); // attempt recovery... - te.setWorld( this.world ); - te.setPos( pos ); - c.c.addTileEntity( new BlockPos( c.x, y + y, c.z ), te ); - // c.c.setChunkTileEntity( c.x, y + y, c.z, te ); + c.c.addTileEntity(te); - if( c.c.isLoaded() ) - { - this.world.addTileEntity( te ); - this.world.notifyBlockUpdate( pos, this.world.getBlockState( pos ), this.world.getBlockState( pos ), z ); - } + this.world.notifyBlockUpdate( pos, this.world.getBlockState( pos ), this.world.getBlockState( pos ), z ); } mr.doneMoving( te ); @@ -355,9 +347,8 @@ public class CachedPlane for( int z = 0; z < this.cz_size; z++ ) { final Chunk c = this.myChunks[x][z]; - c.resetRelightChecks(); - c.generateSkylightMap(); - c.setModified( true ); + // FIXME: Light shit + c.markDirty(); } } @@ -371,12 +362,20 @@ public class CachedPlane for( int y = 1; y < 255; y += 32 ) { - WorldData.instance().compassData().service().updateArea( this.getWorld(), c.x << 4, y, c.z << 4 ); + WorldData.instance().compassData().service().updateArea( this.getWorld(), c.getPos().x << 4, y, c.getPos().z << 4 ); } - Platform.sendChunk( c, this.verticalBits ); + // FIXME this was sending chunks to players... + SChunkDataPacket cdp = new SChunkDataPacket(c, verticalBits); + ((ServerChunkProvider) world.getChunkProvider()).chunkManager.getTrackingPlayers(c.getPos(), false) + .forEach(spe -> spe.connection.sendPacket(cdp)); + } } + + // FIXME check if this makes any sense at all to send changes to players asap + ServerChunkProvider serverChunkProvider = (ServerChunkProvider) world.getChunkProvider(); + serverChunkProvider.tick(() -> false); } List getUpdates() @@ -408,46 +407,46 @@ public class CachedPlane this.z = z; this.c = chunk; - final ExtendedBlockStorage[] storage = this.c.getBlockStorageArray(); + final ChunkSection[] storage = this.c.getSections(); // make sure storage exists before hand... for( int ay = 0; ay < chunkHeight; ay++ ) { final int by = ( ay + chunkY ); - ExtendedBlockStorage extendedblockstorage = storage[by]; + ChunkSection extendedblockstorage = storage[by]; if( extendedblockstorage == null ) { - extendedblockstorage = storage[by] = new ExtendedBlockStorage( by << 4, this.c.getWorld().provider.hasSkyLight() ); + extendedblockstorage = storage[by] = new ChunkSection( by << 4 ); } } } - private void setBlockIDWithMetadata( final int y, BlockStorageData data ) + private void setBlockState(final int y, BlockStorageData data ) { if( data.state == CachedPlane.this.matrixBlockState ) { data.state = Platform.AIR_BLOCK.getDefaultState(); } - final ExtendedBlockStorage[] storage = this.c.getBlockStorageArray(); - final ExtendedBlockStorage extendedBlockStorage = storage[y >> 4]; - extendedBlockStorage.set( this.x, y & 15, this.z, data.state ); - extendedBlockStorage.setBlockLight( this.x, y & 15, this.z, data.light ); + final ChunkSection[] storage = this.c.getSections(); + final ChunkSection extendedBlockStorage = storage[y >> 4]; + extendedBlockStorage.setBlockState( this.x, y & 15, this.z, data.state ); + // FIXME extendedBlockStorage.setBlockLight( this.x, y & 15, this.z, data.light ); } private void fillData( final int y, BlockStorageData data ) { - final ExtendedBlockStorage[] storage = this.c.getBlockStorageArray(); - final ExtendedBlockStorage extendedblockstorage = storage[y >> 4]; + final ChunkSection[] storage = this.c.getSections(); + final ChunkSection extendedblockstorage = storage[y >> 4]; - data.state = extendedblockstorage.get( this.x, y & 15, this.z ); - data.light = extendedblockstorage.getBlockLight( this.x, y & 15, this.z ); + data.state = extendedblockstorage.getBlockState( this.x, y & 15, this.z ); + // FIXME data.light = extendedblockstorage.getBlockLight( this.x, y & 15, this.z ); } private boolean doNotSkip( final int y ) { - final ExtendedBlockStorage[] storage = this.c.getBlockStorageArray(); - final ExtendedBlockStorage extendedblockstorage = storage[y >> 4]; - if( CachedPlane.this.reg.isBlacklisted( extendedblockstorage.get( this.x, y & 15, this.z ).getBlock() ) ) + final ChunkSection[] storage = this.c.getSections(); + final ChunkSection extendedblockstorage = storage[y >> 4]; + if( CachedPlane.this.reg.isBlacklisted( extendedblockstorage.getBlockState( this.x, y & 15, this.z ).getBlock() ) ) { return false; } diff --git a/src/main/java/appeng/spatial/BiomeGenStorage.java b/src/main/java/appeng/spatial/StorageCellBiome.java similarity index 56% rename from src/main/java/appeng/spatial/BiomeGenStorage.java rename to src/main/java/appeng/spatial/StorageCellBiome.java index 98b76eb4f..9225af502 100644 --- a/src/main/java/appeng/spatial/BiomeGenStorage.java +++ b/src/main/java/appeng/spatial/StorageCellBiome.java @@ -19,17 +19,37 @@ package appeng.spatial; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorldReader; import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public class BiomeGenStorage extends Biome +public class StorageCellBiome extends Biome { - public BiomeGenStorage() + public static final StorageCellBiome INSTANCE = new StorageCellBiome(); + + static { + INSTANCE.setRegistryName("appliedenergistics2:storage"); + } + + public StorageCellBiome() { - super( new Biome.Builder().precipitation(RainType.NONE).temperature(-100).parent(null) ); + super( new Biome.Builder() + .surfaceBuilder(SurfaceBuilder.NOPE, SurfaceBuilder.STONE_STONE_GRAVEL_CONFIG) + .precipitation(RainType.NONE) + .category(Category.NONE) + .depth(0) + .scale(1) + // Copied from the vanilla void biome + .temperature(0.5F) + .downfall(0.5F) + .waterColor(4159204) + .waterFogColor(329011) + .parent(null) ); // FIXME this.decorator.treesPerChunk = 0; // FIXME this.decorator.flowersPerChunk = 0; // FIXME this.decorator.grassPerChunk = 0; @@ -42,7 +62,22 @@ public class BiomeGenStorage extends Biome @OnlyIn(Dist.CLIENT) public int getSkyColor() { - return 0; + return 0x111111; + } + + @Override + public boolean doesWaterFreeze(IWorldReader worldIn, BlockPos pos) { + return false; + } + + @Override + public boolean doesWaterFreeze(IWorldReader worldIn, BlockPos water, boolean mustBeAtEdge) { + return false; + } + + @Override + public boolean doesSnowGenerate(IWorldReader worldIn, BlockPos pos) { + return false; } } diff --git a/src/main/java/appeng/spatial/StorageWorldProvider.java b/src/main/java/appeng/spatial/StorageCellDimension.java similarity index 75% rename from src/main/java/appeng/spatial/StorageWorldProvider.java rename to src/main/java/appeng/spatial/StorageCellDimension.java index f78ca7056..bcbcb804a 100644 --- a/src/main/java/appeng/spatial/StorageWorldProvider.java +++ b/src/main/java/appeng/spatial/StorageCellDimension.java @@ -19,9 +19,10 @@ package appeng.spatial; -import net.minecraft.entity.Entity; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.dimension.Dimension; @@ -34,23 +35,21 @@ import net.minecraftforge.api.distmarker.OnlyIn; import appeng.client.render.SpatialSkyRender; import appeng.core.AppEng; +import javax.annotation.Nullable; + // FIXME: Rename suffix to Dimension -public class StorageWorldProvider extends Dimension +public class StorageCellDimension extends Dimension { - private final Biome biome; - - public StorageWorldProvider() - { - this.hasSkyLight = true; - this.biome = AppEng.instance().getStorageBiome(); - this.biomeProvider = new BiomeProviderSingle( this.biome ); + public StorageCellDimension(World world, DimensionType dimensionType) { + // FIXME: check light value + super(world, dimensionType, 1.0f); } @Override public ChunkGenerator createChunkGenerator() { - return new StorageChunkProvider( this.world, 0 ); + return new StorageChunkGenerator( this.world ); } @Override @@ -97,12 +96,6 @@ public class StorageWorldProvider extends Dimension return false; } - @Override - public DimensionType getDimensionType() - { - return AppEng.instance().getStorageDimensionType(); - } - @Override public IRenderHandler getSkyRenderer() { @@ -115,24 +108,6 @@ public class StorageWorldProvider extends Dimension return false; } - @Override - public Vec3d getSkyColor( final Entity cameraEntity, final float partialTicks ) - { - return new Vec3d( 0.07, 0.07, 0.07 ); - } - - @Override - public float getStarBrightness( final float par1 ) - { - return 0; - } - - @Override - public boolean canSnowAt( final BlockPos pos, final boolean checkLight ) - { - return false; - } - @Override public BlockPos getSpawnCoordinate() { @@ -140,7 +115,7 @@ public class StorageWorldProvider extends Dimension } @Override - public boolean isBlockHighHumidity( final BlockPos pos ) + public boolean isHighHumidity( final BlockPos pos ) { return false; } @@ -152,9 +127,20 @@ public class StorageWorldProvider extends Dimension } @Override - public Biome getBiomeForCoords( BlockPos pos ) - { - return this.biome; + public boolean canDoRainSnowIce(Chunk chunk) { + return false; + } + + @Nullable + @Override + public BlockPos findSpawn(ChunkPos chunkPosIn, boolean checkValid) { + return getSpawnCoordinate(); + } + + @Nullable + @Override + public BlockPos findSpawn(int posX, int posZ, boolean checkValid) { + return getSpawnCoordinate(); } } diff --git a/src/main/java/appeng/spatial/StorageCellModDimension.java b/src/main/java/appeng/spatial/StorageCellModDimension.java new file mode 100644 index 000000000..66a6e770b --- /dev/null +++ b/src/main/java/appeng/spatial/StorageCellModDimension.java @@ -0,0 +1,65 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.spatial; + + +import appeng.client.render.SpatialSkyRender; +import appeng.core.AppEng; +import net.minecraft.entity.Entity; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.dimension.Dimension; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.IRenderHandler; +import net.minecraftforge.common.ModDimension; + +import java.util.function.BiFunction; + +public class StorageCellModDimension extends ModDimension +{ + + public static final StorageCellModDimension INSTANCE = new StorageCellModDimension(); + + static { + INSTANCE.setRegistryName(AppEng.MOD_ID, "storage_cell"); + } + + @Override + public BiFunction getFactory() { + return StorageCellDimension::new; + } + + @Override + public void write(PacketBuffer buffer, boolean network) { + super.write(buffer, network); + } + + @Override + public void read(PacketBuffer buffer, boolean network) { + super.read(buffer, network); + } + +} diff --git a/src/main/java/appeng/spatial/StorageChunkGenerator.java b/src/main/java/appeng/spatial/StorageChunkGenerator.java new file mode 100644 index 000000000..8dabc34e8 --- /dev/null +++ b/src/main/java/appeng/spatial/StorageChunkGenerator.java @@ -0,0 +1,104 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.spatial; + + + +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; +import net.minecraft.world.World; +import net.minecraft.world.biome.provider.BiomeProvider; +import net.minecraft.world.biome.provider.SingleBiomeProvider; +import net.minecraft.world.biome.provider.SingleBiomeProviderSettings; +import net.minecraft.world.chunk.IChunk; +import net.minecraft.world.gen.ChunkGenerator; + +import appeng.api.AEApi; +import net.minecraft.world.gen.GenerationSettings; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.WorldGenRegion; + + +public class StorageChunkGenerator extends ChunkGenerator +{ + + private final BlockState defaultBlockState; + + public StorageChunkGenerator(final World world ) + { + super( world, createBiomeProvider(), createSettings() ); + this.defaultBlockState = AEApi.instance().definitions().blocks().matrixFrame().block().getDefaultState(); + } + + private static BiomeProvider createBiomeProvider() { + SingleBiomeProviderSettings biomeSettings = new SingleBiomeProviderSettings(null); + biomeSettings.setBiome(StorageCellBiome.INSTANCE); + return new SingleBiomeProvider(biomeSettings); + } + + private static GenerationSettings createSettings() { + return new GenerationSettings(); + } + + @Override + public void generateSurface(WorldGenRegion region, IChunk chunk) { + this.fillChunk( chunk ); + chunk.setModified( false ); + } + + private void fillChunk( IChunk chunk ) + { + BlockPos.Mutable mutPos = new BlockPos.Mutable(); + for( int cx = 0; cx < 16; cx++ ) + { + mutPos.setX(cx); + for( int cz = 0; cz < 16; cz++ ) + { + // FIXME: It's likely a bad idea to fill Y in the inner-loop given the storage layout of chunks + mutPos.setZ(cz); + for( int cy = 0; cy < 256; cy++ ) + { + mutPos.setY(cy); + chunk.setBlockState(mutPos, defaultBlockState, false); + } + } + } + } + + @Override + public int getGroundHeight() { + return 0; + } + + @Override + public void makeBase(IWorld worldIn, IChunk chunkIn) { + } + + @Override + public int func_222529_a(int p_222529_1_, int p_222529_2_, Heightmap.Type heightmapType) { + return 0; + } + + @Override + public void decorate(WorldGenRegion region) { + // Do not decorate chunks at all + } + +} diff --git a/src/main/java/appeng/spatial/StorageChunkProvider.java b/src/main/java/appeng/spatial/StorageChunkProvider.java deleted file mode 100644 index a840a9352..000000000 --- a/src/main/java/appeng/spatial/StorageChunkProvider.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.spatial; - - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.BlockState; -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.ChunkGeneratorOverworld; - -import appeng.api.AEApi; -import appeng.core.AppEng; - - -public class StorageChunkProvider extends ChunkGeneratorOverworld -{ - - private final World world; - - public StorageChunkProvider( final World world, final long i ) - { - super( world, i, false, null ); - this.world = world; - } - - @Override - public Chunk generateChunk( final int x, final int z ) - { - final Chunk chunk = new Chunk( this.world, x, z ); - - final byte[] biomes = chunk.getBiomeArray(); - Biome biome = AppEng.instance().getStorageBiome(); - byte biomeId = (byte) Biome.getIdForBiome( biome ); - - for( int k = 0; k < biomes.length; ++k ) - { - biomes[k] = biomeId; - } - - AEApi.instance().definitions().blocks().matrixFrame().maybeBlock().ifPresent( block -> this.fillChunk( chunk, block.getDefaultState() ) ); - - chunk.setModified( false ); - - if( !chunk.isTerrainPopulated() ) - { - chunk.setTerrainPopulated( true ); - chunk.resetRelightChecks(); - } - - return chunk; - } - - private void fillChunk( Chunk chunk, BlockState defaultState ) - { - for( int cx = 0; cx < 16; cx++ ) - { - for( int cz = 0; cz < 16; cz++ ) - { - for( int cy = 0; cy < 256; cy++ ) - { - chunk.setBlockState( new BlockPos( cx, cy, cz ), defaultState ); - } - } - } - } - - @Override - public void populate( final int par2, final int par3 ) - { - - } - - @Override - public List getPossibleCreatures( final EnumCreatureType creatureType, final BlockPos pos ) - { - return new ArrayList(); - } - - @Override - public boolean generateStructures( Chunk chunkIn, int x, int z ) - { - return false; - } - - @Override - public BlockPos getNearestStructurePos( World worldIn, String structureName, BlockPos position, boolean p_180513_4_ ) - { - return null; - } - - @Override - public void recreateStructures( Chunk chunkIn, int x, int z ) - { - - } -} diff --git a/src/main/java/appeng/spatial/StorageHelper.java b/src/main/java/appeng/spatial/StorageHelper.java index 78a3ba2e0..86517c91e 100644 --- a/src/main/java/appeng/spatial/StorageHelper.java +++ b/src/main/java/appeng/spatial/StorageHelper.java @@ -21,6 +21,7 @@ package appeng.spatial; import java.util.ArrayList; import java.util.List; +import java.util.function.Function; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -30,7 +31,7 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; -import net.minecraft.world.ServerWorld; +import net.minecraft.world.chunk.ChunkStatus; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.util.ITeleporter; @@ -91,37 +92,34 @@ public class StorageHelper } // Are we riding something? Teleport it instead. - if( entity.isRiding() ) + if( entity.isPassenger() ) { return this.teleportEntity( entity.getRidingEntity(), link ); } // Is something riding us? Handle it first. - final List passangers = entity.getPassengers(); - final List passangersOnOtherSide = new ArrayList<>(); - if( !passangers.isEmpty() ) + final List passengers = entity.getPassengers(); + final List passengersOnOtherSide = new ArrayList<>(passengers.size()); + for( Entity passenger : passengers ) { - for( Entity passanger : passangers ) - { - passanger.dismountRidingEntity(); - passangersOnOtherSide.add( this.teleportEntity( passanger, link ) ); - } - // We keep track of all so we can remount them on the other side. + passenger.stopRiding(); + passengersOnOtherSide.add( this.teleportEntity( passenger, link ) ); } + // We keep track of all so we can remount them on the other side. // load the chunk! - newWorld.getChunkProvider().provideChunk( MathHelper.floor( link.x ) >> 4, MathHelper.floor( link.z ) >> 4 ); + newWorld.getChunkProvider().getChunk( MathHelper.floor( link.x ) >> 4, MathHelper.floor( link.z ) >> 4, ChunkStatus.FULL, true ); - if( entity instanceof ServerPlayerEntity && link.dim.provider instanceof StorageWorldProvider ) + if( entity instanceof ServerPlayerEntity && link.dim.getDimension() instanceof StorageCellDimension) { AppEng.instance().getAdvancementTriggers().getSpatialExplorer().trigger( (ServerPlayerEntity) entity ); } entity.changeDimension( link.dim.getDimension().getType(), new METeleporter( link ) ); - if( !passangersOnOtherSide.isEmpty() ) + if( !passengersOnOtherSide.isEmpty() ) { - for( Entity passanger : passangersOnOtherSide ) + for( Entity passanger : passengersOnOtherSide ) { passanger.startRiding( entity, true ); } @@ -195,12 +193,12 @@ public class StorageHelper for( final WorldCoord wc : cDst.getUpdates() ) { - cSrc.getWorld().notifyNeighborsOfStateChange( wc.getPos(), Platform.AIR_BLOCK, true ); + cSrc.getWorld().notifyNeighborsOfStateChange( wc.getPos(), Platform.AIR_BLOCK ); } for( final WorldCoord wc : cSrc.getUpdates() ) { - cSrc.getWorld().notifyNeighborsOfStateChange( wc.getPos(), Platform.AIR_BLOCK, true ); + cSrc.getWorld().notifyNeighborsOfStateChange( wc.getPos(), Platform.AIR_BLOCK ); } this.transverseEdges( srcX - 1, srcY - 1, srcZ - 1, srcX + scaleX + 1, srcY + scaleY + 1, srcZ + scaleZ + 1, new TriggerUpdates( srcWorld ) ); @@ -208,14 +206,6 @@ public class StorageHelper this.transverseEdges( srcX, srcY, srcZ, srcX + scaleX, srcY + scaleY, srcZ + scaleZ, new TriggerUpdates( srcWorld ) ); this.transverseEdges( dstX, dstY, dstZ, dstX + scaleX, dstY + scaleY, dstZ + scaleZ, new TriggerUpdates( dstWorld ) ); - - /* - * IChunkProvider cp = destination.getChunkProvider(); if ( cp instanceof ChunkProviderServer ) { - * ChunkProviderServer - * srv = (ChunkProviderServer) cp; srv.unloadAllChunks(); } - * cp.unloadQueuedChunks(); - */ - } private static class TriggerUpdates implements ISpatialVisitor @@ -283,10 +273,12 @@ public class StorageHelper } @Override - public void placeEntity( World world, Entity entity, float yaw ) - { - entity.setLocationAndAngles( this.destination.x, this.destination.y, this.destination.z, yaw, entity.rotationPitch ); - entity.motionX = entity.motionY = entity.motionZ = 0.0D; + public Entity placeEntity(Entity entity, ServerWorld currentWorld, ServerWorld destWorld, float yaw, Function repositionEntity) { + Entity newEntity = repositionEntity.apply(false); + newEntity.rotationYaw = yaw; + newEntity.setPositionAndUpdate( this.destination.x, this.destination.y, this.destination.z ); + newEntity.setMotion(0, 0, 0); + return newEntity; } } } diff --git a/src/main/java/appeng/util/Platform.java b/src/main/java/appeng/util/Platform.java index a0d02aac6..a79b472dd 100644 --- a/src/main/java/appeng/util/Platform.java +++ b/src/main/java/appeng/util/Platform.java @@ -73,6 +73,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.crafting.IRecipe; +import net.minecraft.network.play.server.SChunkDataPacket; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; @@ -82,6 +83,7 @@ import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -89,6 +91,8 @@ import net.minecraftforge.common.util.FakePlayerFactory; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.common.thread.SidedThreadGroups; import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.fml.network.FMLNetworkConstants; +import net.minecraftforge.fml.network.NetworkDirection; import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.registries.ForgeRegistries; @@ -1528,26 +1532,7 @@ public class Platform // // return Lists.newArrayList( is ); // } -// -// public static void sendChunk( final Chunk c, final int verticalBits ) -// { -// try -// { -// // FIXME final ServerWorld ws = (ServerWorld) c.getWorld(); -// // FIXME final PlayerChunkMap pm = ws.getPlayerChunkMap(); -// // FIXME final PlayerChunkMapEntry playerInstance = pm.getEntry( c.x, c.z ); -//// FIXME -// // FIXME if( playerInstance != null ) -// // FIXME { -// // FIXME playerInstance.sendPacket( new SChunkDataPacket( c, verticalBits ) ); -// // FIXME } -// } -// catch( final Throwable t ) -// { -// AELog.debug( t ); -// } -// } -// + public static float getEyeOffset( final PlayerEntity player ) { assert player.world.isRemote : "Valid only on client"; diff --git a/src/test/java/appeng/core/worlddata/MeteorDataNameEncoderTest.java b/src/test/java/appeng/core/worlddata/MeteorDataNameEncoderTest.java index f66575b07..bbe6f44e4 100644 --- a/src/test/java/appeng/core/worlddata/MeteorDataNameEncoderTest.java +++ b/src/test/java/appeng/core/worlddata/MeteorDataNameEncoderTest.java @@ -32,12 +32,10 @@ import org.junit.Test; */ public class MeteorDataNameEncoderTest { - private static final int WITHOUT_DIMENSION = -5; private static final int WITHOUT_CHUNK_X = 0; private static final int WITHOUT_CHUNK_Z = 13; private static final String WITHOUT_EXPECTED = "-5_0_13.dat"; - private static final int WITH_DIMENSION = 3; private static final int WITH_CHUNK_X = 32; private static final int WITH_CHUNK_Z = -64; private static final String WITH_EXPECTED = "3_2_-4.dat"; @@ -49,7 +47,7 @@ public class MeteorDataNameEncoderTest public void testEncoderWithoutShifting() { final String expected = WITHOUT_EXPECTED; - final String actual = this.encoderWithZeroShifting.encode( WITHOUT_DIMENSION, WITHOUT_CHUNK_X, WITHOUT_CHUNK_Z ); + final String actual = this.encoderWithZeroShifting.encode( WITHOUT_CHUNK_X, WITHOUT_CHUNK_Z ); Assert.assertEquals( expected, actual ); } @@ -58,7 +56,7 @@ public class MeteorDataNameEncoderTest public void testEncoderWithShifting() { final String expected = WITH_EXPECTED; - final String actual = this.encoderWithFourShifting.encode( WITH_DIMENSION, WITH_CHUNK_X, WITH_CHUNK_Z ); + final String actual = this.encoderWithFourShifting.encode( WITH_CHUNK_X, WITH_CHUNK_Z ); Assert.assertEquals( expected, actual ); } diff --git a/src/test/java/appeng/core/worlddata/SpatialDimensionManagerTest.java b/src/test/java/appeng/core/worlddata/SpatialDimensionManagerTest.java deleted file mode 100644 index d68a14a5c..000000000 --- a/src/test/java/appeng/core/worlddata/SpatialDimensionManagerTest.java +++ /dev/null @@ -1,75 +0,0 @@ - -package appeng.core.worlddata; - - -import org.junit.Assert; -import org.junit.Test; - -import net.minecraft.util.math.BlockPos; - - -public class SpatialDimensionManagerTest -{ - private static final BlockPos CONTENT = new BlockPos( 1, 1, 1 ); - - private static final int ID_1 = 0; - private static final int ID_2 = 1; - private static final int ID_3 = 2; - private static final int ID_4 = 3; - private static final int ID_5 = 4; - private static final int ID_6 = 5; - private static final int ID_7 = 6; - private static final int ID_8 = 7; - private static final int ID_9 = 8; - private static final int ID_A = 9; - private static final int ID_B = 10; - private static final int ID_C = 11; - - private static final BlockPos POS_1 = new BlockPos( -320, 64, -320 ); - private static final BlockPos POS_2 = new BlockPos( 192, 64, -320 ); - private static final BlockPos POS_3 = new BlockPos( -320, 64, 192 ); - private static final BlockPos POS_4 = new BlockPos( 192, 64, 192 ); - - private static final BlockPos POS_5 = new BlockPos( -832, 64, -320 ); - private static final BlockPos POS_6 = new BlockPos( 704, 64, -320 ); - private static final BlockPos POS_7 = new BlockPos( -832, 64, 192 ); - private static final BlockPos POS_8 = new BlockPos( 704, 64, 192 ); - - private static final BlockPos POS_9 = new BlockPos( -320, 64, -832 ); - private static final BlockPos POS_A = new BlockPos( 192, 64, -832 ); - private static final BlockPos POS_B = new BlockPos( -320, 64, 704 ); - private static final BlockPos POS_C = new BlockPos( 192, 64, 704 ); - - @Test - public void testBlockPosGeneration() - { - SpatialDimensionManager manager = new SpatialDimensionManager( null ); - - Assert.assertEquals( ID_1, manager.createNewCellDimension( CONTENT, -1 ) ); - Assert.assertEquals( ID_2, manager.createNewCellDimension( CONTENT, -1 ) ); - Assert.assertEquals( ID_3, manager.createNewCellDimension( CONTENT, -1 ) ); - Assert.assertEquals( ID_4, manager.createNewCellDimension( CONTENT, -1 ) ); - Assert.assertEquals( ID_5, manager.createNewCellDimension( CONTENT, -1 ) ); - Assert.assertEquals( ID_6, manager.createNewCellDimension( CONTENT, -1 ) ); - Assert.assertEquals( ID_7, manager.createNewCellDimension( CONTENT, -1 ) ); - Assert.assertEquals( ID_8, manager.createNewCellDimension( CONTENT, -1 ) ); - Assert.assertEquals( ID_9, manager.createNewCellDimension( CONTENT, -1 ) ); - Assert.assertEquals( ID_A, manager.createNewCellDimension( CONTENT, -1 ) ); - Assert.assertEquals( ID_B, manager.createNewCellDimension( CONTENT, -1 ) ); - Assert.assertEquals( ID_C, manager.createNewCellDimension( CONTENT, -1 ) ); - - Assert.assertEquals( POS_1, manager.getCellDimensionOrigin( ID_1 ) ); - Assert.assertEquals( POS_2, manager.getCellDimensionOrigin( ID_2 ) ); - Assert.assertEquals( POS_3, manager.getCellDimensionOrigin( ID_3 ) ); - Assert.assertEquals( POS_4, manager.getCellDimensionOrigin( ID_4 ) ); - Assert.assertEquals( POS_5, manager.getCellDimensionOrigin( ID_5 ) ); - Assert.assertEquals( POS_6, manager.getCellDimensionOrigin( ID_6 ) ); - Assert.assertEquals( POS_7, manager.getCellDimensionOrigin( ID_7 ) ); - Assert.assertEquals( POS_8, manager.getCellDimensionOrigin( ID_8 ) ); - Assert.assertEquals( POS_9, manager.getCellDimensionOrigin( ID_9 ) ); - Assert.assertEquals( POS_A, manager.getCellDimensionOrigin( ID_A ) ); - Assert.assertEquals( POS_B, manager.getCellDimensionOrigin( ID_B ) ); - Assert.assertEquals( POS_C, manager.getCellDimensionOrigin( ID_C ) ); - } - -}