Merge branch '1.12-WIP' into registry-rewrite
This commit is contained in:
commit
b1efc3592c
17 changed files with 638 additions and 29 deletions
src/main
java/com/zixiken/dimdoors
DimDoors.java
shared
resources/assets/dimdoors
blockstates
models/block
textures/blocks
|
@ -5,6 +5,8 @@ import com.zixiken.dimdoors.shared.commands.TeleportCommand;
|
|||
import com.zixiken.dimdoors.shared.DDConfig;
|
||||
import com.zixiken.dimdoors.shared.DDProxyCommon;
|
||||
import com.zixiken.dimdoors.shared.items.ModItems;
|
||||
import com.zixiken.dimdoors.shared.world.gateways.GatewayGenerator;
|
||||
import lombok.Getter;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
@ -14,6 +16,7 @@ import net.minecraftforge.fml.common.FMLLog;
|
|||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.SidedProxy;
|
||||
import net.minecraftforge.fml.common.event.*;
|
||||
import net.minecraftforge.fml.common.registry.GameRegistry;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
|
@ -24,6 +27,7 @@ public class DimDoors {
|
|||
|
||||
public static final String MODID = "dimdoors";
|
||||
public static final String VERSION = "${version}";
|
||||
@Getter private GatewayGenerator gatewayGenerator;
|
||||
|
||||
@SidedProxy(clientSide = "com.zixiken.dimdoors.client.DDProxyClient",
|
||||
serverSide = "com.zixiken.dimdoors.server.DDProxyServer")
|
||||
|
@ -40,6 +44,7 @@ public class DimDoors {
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
@Mod.EventHandler
|
||||
public void onPreInitialization(FMLPreInitializationEvent event) {
|
||||
proxy.onPreInitialization(event);
|
||||
|
@ -49,6 +54,8 @@ public class DimDoors {
|
|||
@Mod.EventHandler
|
||||
public void onInitialization(FMLInitializationEvent event) {
|
||||
proxy.onInitialization(event);
|
||||
gatewayGenerator = new GatewayGenerator();
|
||||
GameRegistry.registerWorldGenerator(gatewayGenerator, 0);
|
||||
}
|
||||
|
||||
@Mod.EventHandler
|
||||
|
|
|
@ -3,6 +3,8 @@ package com.zixiken.dimdoors.shared;
|
|||
import com.zixiken.dimdoors.DimDoors;
|
||||
import java.io.File;
|
||||
|
||||
import com.zixiken.dimdoors.shared.world.gateways.DimensionFilter;
|
||||
import com.zixiken.dimdoors.shared.world.gateways.GatewayGenerator;
|
||||
import lombok.Getter;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import net.minecraftforge.common.config.Property;
|
||||
|
@ -32,6 +34,18 @@ public class DDConfig {
|
|||
@Getter private static boolean dangerousLimboMonolithsEnabled = false;
|
||||
@Getter private static boolean monolithTeleportationEnabled = true;
|
||||
|
||||
@Getter private static int clusterGenerationChance;
|
||||
@Getter private static int gatewayGenerationChance;
|
||||
|
||||
@Getter private static boolean limboEscapeEnabled;
|
||||
@Getter private static boolean universalLimboEnabled;
|
||||
|
||||
@Getter private static DimensionFilter riftClusterDimensions;
|
||||
@Getter private static DimensionFilter riftGatewayDimensions;
|
||||
|
||||
//Names of categories
|
||||
private static final String CATEGORY_WORLD_GENERATION = "world generation";
|
||||
|
||||
private static int setConfigIntWithMaxAndMin(Configuration config, String category, String key, int defaultValue, String comment, int minValue, int maxValue) {
|
||||
Property prop = config.get(category, key, defaultValue, comment, minValue, maxValue);
|
||||
int value = prop.getInt(defaultValue);
|
||||
|
@ -107,6 +121,35 @@ public class DDConfig {
|
|||
publicPocketSize = setConfigIntWithMaxAndMin(config, "pocket_dimension", "publicPocketSize", publicPocketSize,
|
||||
"Sets how deep and wide any public pocket can be. [min: 0, max: maxPocketSize, default: 2]", 0, maxPocketSize);
|
||||
|
||||
clusterGenerationChance = config.get(Configuration.CATEGORY_GENERAL, "Cluster Generation Chance", 2,
|
||||
"Sets the chance (out of " + GatewayGenerator.MAX_CLUSTER_GENERATION_CHANCE + ") that a cluster of rifts will " +
|
||||
"generate in a given chunk. The default chance is 2.").getInt();
|
||||
|
||||
gatewayGenerationChance = config.get(Configuration.CATEGORY_GENERAL, "Gateway Generation Chance", 15,
|
||||
"Sets the chance (out of " + GatewayGenerator.MAX_GATEWAY_GENERATION_CHANCE + ") that a Rift Gateway will " +
|
||||
"generate in a given chunk. The default chance is 15.").getInt();
|
||||
|
||||
//World Generation
|
||||
config.addCustomCategoryComment(CATEGORY_WORLD_GENERATION,
|
||||
"The following settings require lists of dimensions in a specific format. " +
|
||||
"A list must consist of ranges separated by commas. A range may be a single number to indicate " +
|
||||
"just one dimension or two numbers in the form \"X - Y\". Spaces are permitted " +
|
||||
"but not required. Example: -100, -10 - -1, 20 - 30");
|
||||
|
||||
riftClusterDimensions = loadFilter(config, "Rift Cluster", "Rift Clusters");
|
||||
riftGatewayDimensions = loadFilter(config, "Rift Gateway", "Rift Gateways");
|
||||
|
||||
limboEscapeEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Limbo Escape", true,
|
||||
"Sets whether players are teleported out of Limbo when walking over the Eternal Fabric that " +
|
||||
"generates near the bottom of the dimension. If disabled, players could still leave through " +
|
||||
"dungeons in Limbo or by dying (if Hardcore Limbo is disabled). The default value is true.").getBoolean(true);
|
||||
|
||||
universalLimboEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Universal Limbo", false,
|
||||
"Sets whether players are teleported to Limbo when they die in any dimension (except Limbo). " +
|
||||
"Normally, players only go to Limbo if they die in a pocket dimension. This setting will not " +
|
||||
"affect deaths in Limbo, which can be set with the Hardcore Limbo option. " +
|
||||
"The default value is false.").getBoolean(false);
|
||||
|
||||
// Save config
|
||||
config.save();
|
||||
}
|
||||
|
@ -127,4 +170,27 @@ public class DDConfig {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static DimensionFilter loadFilter(Configuration config, String prefix, String description) {
|
||||
boolean enableBlacklist = config.get(CATEGORY_WORLD_GENERATION, "Enable " + prefix + " Blacklist", true,
|
||||
"Sets whether " + description + " will not generate in certain blacklisted dimensions. " +
|
||||
"If set to false, then " + description + " will follow a whitelist instead.").getBoolean(true);
|
||||
|
||||
String whitelist = config.get(CATEGORY_WORLD_GENERATION, prefix + " Whitelist", "",
|
||||
"A list of the only dimensions in which " + description + " may generate.").getString();
|
||||
|
||||
String blacklist = config.get(CATEGORY_WORLD_GENERATION, prefix + " Blacklist", "",
|
||||
"A list of dimensions in which " + description + " may not generate.").getString();
|
||||
|
||||
try {
|
||||
if (enableBlacklist) {
|
||||
return DimensionFilter.parseBlacklist(blacklist);
|
||||
} else {
|
||||
return DimensionFilter.parseWhitelist(whitelist);
|
||||
}
|
||||
} catch (Exception inner) {
|
||||
throw new RuntimeException("An error occurred while loading a whitelist or blacklist setting for " +
|
||||
description + ". Please make sure that your configuration file is set up correctly.", inner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,6 +25,6 @@ public class BlockDimDoorTransient extends BlockDimDoorBase { // TODO: convert t
|
|||
|
||||
@Override
|
||||
public boolean isCollidable() {
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -219,7 +219,7 @@ public class BlockFabric extends Block {
|
|||
@Override
|
||||
public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) { //if this creates more problems, because everything ticks, we should probably move this to its own class again
|
||||
//Make sure this block is unraveled fabric in Limbo
|
||||
if (state.getValue(TYPE) == EnumType.UNRAVELED && worldIn.provider instanceof WorldProviderLimbo) {
|
||||
if (state.getValue(TYPE) == EnumType.ANCIENT && worldIn.provider instanceof WorldProviderLimbo) {
|
||||
LimboDecay.applySpreadDecay(worldIn, pos);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,13 +1,20 @@
|
|||
package com.zixiken.dimdoors.shared.util;
|
||||
|
||||
import com.zixiken.dimdoors.DimDoors;
|
||||
import com.zixiken.dimdoors.shared.blocks.ModBlocks;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.fml.common.registry.ForgeRegistries;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Robijnvogel
|
||||
|
@ -39,32 +46,69 @@ public class SchematicConverter {
|
|||
schematic.length = nbt.getShort("Length");
|
||||
//schematic.offset = new int[]{0, 0, 0}; //already the default value
|
||||
|
||||
NBTTagList paletteNBT = (NBTTagList) nbt.getTag("Palette");
|
||||
for (int i = 0; i < paletteNBT.tagCount(); i++) {
|
||||
//DimDoors.log(Schematic.class, "reading pallete from schematic... i = " + i);
|
||||
String blockString = paletteNBT.getStringTagAt(i);
|
||||
boolean isAncientFabric = false;
|
||||
if (blockString.startsWith("dimdoors")) {
|
||||
String dimdoorsBlockName = blockString.split(":")[1];
|
||||
if (dimdoorsBlockName.equals("Fabric of RealityPerm")) { //only special case, because this is now another state of another block
|
||||
isAncientFabric = true;
|
||||
byte[] blockIntArray = nbt.getByteArray("Blocks");
|
||||
if (nbt.hasKey("Palette")) {
|
||||
NBTTagList paletteNBT = (NBTTagList) nbt.getTag("Palette");
|
||||
for (int i = 0; i < paletteNBT.tagCount(); i++) {
|
||||
//DimDoors.log(Schematic.class, "reading pallete from schematic... i = " + i);
|
||||
String blockString = paletteNBT.getStringTagAt(i);
|
||||
boolean isAncientFabric = false;
|
||||
if (blockString.startsWith("dimdoors")) {
|
||||
String dimdoorsBlockName = blockString.split(":")[1];
|
||||
if (dimdoorsBlockName.equals("Fabric of RealityPerm")) { //only special case, because this is now another state of another block
|
||||
isAncientFabric = true;
|
||||
} else {
|
||||
dimdoorsBlockName = convertOldDimDoorsBlockNameToNewDimDoorsBlockName(dimdoorsBlockName);
|
||||
blockString = "dimdoors:" + dimdoorsBlockName;
|
||||
}
|
||||
}
|
||||
IBlockState blockstate;
|
||||
if (!isAncientFabric) {
|
||||
Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockString));
|
||||
blockstate = block.getDefaultState();
|
||||
} else {
|
||||
dimdoorsBlockName = convertOldDimDoorsBlockNameToNewDimDoorsBlockName(dimdoorsBlockName);
|
||||
blockString = "dimdoors:" + dimdoorsBlockName;
|
||||
Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("dimdoors:FABRIC"));
|
||||
blockstate = Schematic.getBlockStateWithProperties(block, new String[]{"type=ancient"});
|
||||
}
|
||||
schematic.pallette.add(blockstate);
|
||||
}
|
||||
} else {
|
||||
byte[] addId = nbt.getByteArray("AddBlocks");
|
||||
Map<Integer, Byte> palletteMap = new HashMap<>(); // block ID -> pallette index
|
||||
byte currentPalletteIndex = 0;
|
||||
for (int i = 0; i < blockIntArray.length; i++) {
|
||||
int id;
|
||||
if (i >> 1 >= addId.length) {
|
||||
id = (short) (blockIntArray[i] & 0xFF);
|
||||
} else if ((i & 1) == 0) {
|
||||
id = (short) (((addId[i >> 1] & 0x0F) << 8) + (blockIntArray[i] & 0xFF));
|
||||
} else {
|
||||
id = (short) (((addId[i >> 1] & 0xF0) << 4) + (blockIntArray[i] & 0xFF));
|
||||
}
|
||||
if (palletteMap.containsKey(id)) {
|
||||
blockIntArray[i] = palletteMap.get(id);
|
||||
} else {
|
||||
Block block = Block.getBlockById(id);
|
||||
switch (id) {
|
||||
case 1975:
|
||||
block = ModBlocks.WARP_DIMENSIONAL_DOOR;
|
||||
break;
|
||||
case 1970:
|
||||
block = ModBlocks.DIMENSIONAL_DOOR;
|
||||
break;
|
||||
case 1979:
|
||||
block = ModBlocks.TRANSIENT_DIMENSIONAL_DOOR;
|
||||
break;
|
||||
}
|
||||
//if (id != 0 && block.getRegistryName().toString().equals("minecraft:air")) throw new RuntimeException("Change conversion code!");
|
||||
schematic.pallette.add(block.getDefaultState());
|
||||
palletteMap.put(id, currentPalletteIndex);
|
||||
blockIntArray[i] = currentPalletteIndex;
|
||||
currentPalletteIndex++;
|
||||
}
|
||||
}
|
||||
IBlockState blockstate;
|
||||
if (!isAncientFabric) {
|
||||
Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockString));
|
||||
blockstate = block.getDefaultState();
|
||||
} else {
|
||||
Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation("dimdoors:FABRIC"));
|
||||
blockstate = Schematic.getBlockStateWithProperties(block, new String[]{"type=ancient"});
|
||||
}
|
||||
schematic.pallette.add(blockstate);
|
||||
}
|
||||
|
||||
byte[] blockIntArray = nbt.getByteArray("Blocks");
|
||||
byte[] dataIntArray = nbt.getByteArray("Data");
|
||||
schematic.blockData = new int[schematic.width][schematic.height][schematic.length];
|
||||
for (int x = 0; x < schematic.width; x++) {
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
package com.zixiken.dimdoors.shared.world.gateways;
|
||||
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
|
||||
public abstract class BaseGateway {
|
||||
public BaseGateway() { }
|
||||
|
||||
/**
|
||||
* Generates the gateway centered on the given coordinates
|
||||
* @param world - the world in which to generate the gateway
|
||||
* @param x - the x-coordinate at which to center the gateway; usually where the door is placed
|
||||
* @param y - the y-coordinate of the block on which the gateway may be built
|
||||
* @param z - the z-coordinate at which to center the gateway; usually where the door is placed
|
||||
*/
|
||||
public abstract boolean generate(World world, int x, int y, int z);
|
||||
|
||||
/**
|
||||
* Determines whether the specified biome is a valid biome in which to generate this gateway
|
||||
* @param biome - the biome to be checked
|
||||
* @return <code>true</code> true if the specified biome is a valid for generating this gateway, otherwise <code>false</code>
|
||||
*/
|
||||
protected boolean isBiomeValid(Biome biome) {
|
||||
Biome[] biomes = this.getBiomes();
|
||||
if (biomes != null) {
|
||||
for (Biome b : biomes) {
|
||||
if (b.equals(biome)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether the specified world and coordinates are a valid location for generating this gateway
|
||||
* @param world - the world in which to generate the gateway
|
||||
* @param x - the x-coordinate at which to center the gateway; usually where the door is placed
|
||||
* @param y - the y-coordinate of the block on which the gateway may be built
|
||||
* @param z - the z-coordinate at which to center the gateway; usually where the door is placed
|
||||
* @return <code>true</code> if the location is valid, otherwise <code>false</code>
|
||||
*/
|
||||
public boolean isLocationValid(World world, int x, int y, int z)
|
||||
{
|
||||
return isBiomeValid(world.getBiome(new BlockPos(x,y,z)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the lowercase keywords to be used in checking whether a given biome is a valid location for this gateway
|
||||
* @return an array of biome keywords to match against
|
||||
*/
|
||||
public Biome[] getBiomes() {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
package com.zixiken.dimdoors.shared.world.gateways;
|
||||
|
||||
import com.zixiken.dimdoors.DimDoors;
|
||||
import com.zixiken.dimdoors.shared.SchematicHandler;
|
||||
import com.zixiken.dimdoors.shared.util.Schematic;
|
||||
import com.zixiken.dimdoors.shared.util.SchematicConverter;
|
||||
import net.minecraft.nbt.CompressedStreamTools;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public abstract class BaseSchematicGateway extends BaseGateway {
|
||||
private Schematic schematic;
|
||||
|
||||
public BaseSchematicGateway(String name) {
|
||||
String schematicJarDirectory = "/assets/dimdoors/gateways/";
|
||||
|
||||
//Initialising the possible locations/formats for the schematic file
|
||||
InputStream oldVersionSchematicStream = DimDoors.class.getResourceAsStream(schematicJarDirectory + name + ".schematic"); //@todo also check for other schematics
|
||||
|
||||
//determine which location to load the schematic file from (and what format)
|
||||
DataInputStream schematicDataStream = null;
|
||||
boolean streamOpened = false;
|
||||
if (oldVersionSchematicStream != null) {
|
||||
schematicDataStream = new DataInputStream(oldVersionSchematicStream);
|
||||
streamOpened = true;
|
||||
} else {
|
||||
DimDoors.warn(SchematicHandler.class, "Schematic '" + name + "' was not found in the jar or config directory, neither with the .schem extension, nor with the .schematic extension.");
|
||||
}
|
||||
|
||||
NBTTagCompound schematicNBT;
|
||||
this.schematic = null;
|
||||
if (streamOpened) {
|
||||
try {
|
||||
schematicNBT = CompressedStreamTools.readCompressed(schematicDataStream);
|
||||
schematic = SchematicConverter.loadOldDimDoorSchematicFromNBT(schematicNBT, name);
|
||||
schematicDataStream.close();
|
||||
} catch (IOException ex) {
|
||||
Logger.getLogger(SchematicHandler.class.getName()).log(Level.SEVERE, "Schematic file for " + name + " could not be read as a valid schematic NBT file.", ex);
|
||||
} finally {
|
||||
try {
|
||||
schematicDataStream.close();
|
||||
} catch (IOException ex) {
|
||||
Logger.getLogger(SchematicHandler.class.getName()).log(Level.SEVERE, "Error occured while closing schematicDataStream", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean generate(World world, int x, int y, int z) {
|
||||
Schematic.place(schematic, world, x, y, z);
|
||||
this.generateRandomBits(world, x, y, z);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates randomized portions of the gateway structure (e.g. rubble, foliage)
|
||||
*
|
||||
* @param world - the world in which to generate the gateway
|
||||
* @param x - the x-coordinate at which to center the gateway; usually where the door is placed
|
||||
* @param y - the y-coordinate of the block on which the gateway may be built
|
||||
* @param z - the z-coordinate at which to center the gateway; usually where the door is placed
|
||||
*/
|
||||
protected void generateRandomBits(World world, int x, int y, int z) {
|
||||
}
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
package com.zixiken.dimdoors.shared.world.gateways;
|
||||
|
||||
import com.google.common.collect.Range;
|
||||
import com.google.common.collect.RangeSet;
|
||||
import com.google.common.collect.TreeRangeSet;
|
||||
|
||||
public class DimensionFilter {
|
||||
private RangeSet<Integer> blacklist;
|
||||
|
||||
private DimensionFilter(RangeSet<Integer> blacklist) {
|
||||
this.blacklist = blacklist;
|
||||
}
|
||||
|
||||
public boolean isAccepted(int dimensionID) {
|
||||
return !blacklist.contains(dimensionID);
|
||||
}
|
||||
|
||||
public boolean isRejected(int dimensionID) {
|
||||
return blacklist.contains(dimensionID);
|
||||
}
|
||||
|
||||
private static RangeSet<Integer> parseRangeSet(String list) {
|
||||
int index;
|
||||
int start;
|
||||
int end;
|
||||
String startPart;
|
||||
String endPart;
|
||||
String[] intervals;
|
||||
RangeSet<Integer> ranges = TreeRangeSet.create();
|
||||
|
||||
// Strip out all whitespace characters
|
||||
list = list.replaceAll("\\s", "");
|
||||
if (list.isEmpty()) {
|
||||
return ranges;
|
||||
}
|
||||
intervals = list.split(",");
|
||||
|
||||
// Iterate over all the interval strings
|
||||
for (String interval : intervals) {
|
||||
// Check if the interval contains a minus sign after the first character
|
||||
// That indicates that we're dealing with an interval and not a single number
|
||||
if (interval.length() > 1) {
|
||||
index = interval.indexOf("-", 1);
|
||||
} else {
|
||||
index = -1;
|
||||
} try {
|
||||
if (index >= 0) {
|
||||
// Parse this as a range with two values as endpoints
|
||||
startPart = interval.substring(0, index);
|
||||
endPart = interval.substring(index + 1);
|
||||
start = Integer.parseInt(startPart);
|
||||
end = Integer.parseInt(endPart);
|
||||
} else {
|
||||
// Parse this as a single value
|
||||
start = Integer.parseInt(interval);
|
||||
end = start;
|
||||
}
|
||||
// Add the interval to the set of intervals
|
||||
ranges.add( Range.closed(start, end) );
|
||||
} catch (Exception e) {
|
||||
throw new IllegalArgumentException("\"" + interval + "\" is not a valid value or range for dimension IDs");
|
||||
}
|
||||
}
|
||||
|
||||
return ranges;
|
||||
}
|
||||
|
||||
public static DimensionFilter parseWhitelist(String list) {
|
||||
return new DimensionFilter(parseRangeSet(list).complement());
|
||||
}
|
||||
|
||||
public static DimensionFilter parseBlacklist(String list) {
|
||||
return new DimensionFilter(parseRangeSet(list));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,137 @@
|
|||
package com.zixiken.dimdoors.shared.world.gateways;
|
||||
|
||||
import com.zixiken.dimdoors.shared.DDConfig;
|
||||
import com.zixiken.dimdoors.shared.blocks.ModBlocks;
|
||||
import com.zixiken.dimdoors.shared.world.PocketProvider;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.chunk.IChunkProvider;
|
||||
import net.minecraft.world.gen.IChunkGenerator;
|
||||
import net.minecraftforge.fml.common.IWorldGenerator;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Random;
|
||||
|
||||
public class GatewayGenerator implements IWorldGenerator
|
||||
{
|
||||
public static final int MAX_GATEWAY_GENERATION_CHANCE = 10000;
|
||||
public static final int MAX_CLUSTER_GENERATION_CHANCE = 10000;
|
||||
private static final int CLUSTER_GROWTH_CHANCE = 80;
|
||||
private static final int MAX_CLUSTER_GROWTH_CHANCE = 100;
|
||||
private static final int MIN_RIFT_Y = 4;
|
||||
private static final int MAX_RIFT_Y = 240;
|
||||
private static final int CHUNK_LENGTH = 16;
|
||||
private static final int GATEWAY_RADIUS = 4;
|
||||
private static final int MAX_GATEWAY_GENERATION_ATTEMPTS = 10;
|
||||
private static final int OVERWORLD_DIMENSION_ID = 0;
|
||||
private static final int NETHER_DIMENSION_ID = -1;
|
||||
private static final int END_DIMENSION_ID = 1;
|
||||
|
||||
private ArrayList<BaseGateway> gateways;
|
||||
private BaseGateway defaultGateway;
|
||||
|
||||
public GatewayGenerator() {
|
||||
this.initialize();
|
||||
}
|
||||
|
||||
private void initialize() {
|
||||
gateways = new ArrayList<>();
|
||||
defaultGateway = new GatewayTwoPillars();
|
||||
|
||||
// Add gateways here
|
||||
gateways.add(new GatewaySandstonePillars());
|
||||
gateways.add(new GatewayLimbo());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) {
|
||||
// Don't generate rifts or gateways if the current world is a pocket dimension or the world is remote.
|
||||
// Also don't generate anything in the Nether, The End, or in Witchery's Spirit World.
|
||||
// We only match against Spirit World using hashing to speed up the process a little (hopefully).
|
||||
int dimensionID = world.provider.getDimension();
|
||||
if (world.isRemote || (world.provider instanceof PocketProvider) || (dimensionID == END_DIMENSION_ID) || (dimensionID == NETHER_DIMENSION_ID)) {
|
||||
return;
|
||||
}
|
||||
|
||||
int x, y, z;
|
||||
int attempts;
|
||||
boolean valid;
|
||||
|
||||
// Check if we're allowed to generate rift clusters in this dimension.
|
||||
// If so, randomly decide whether to one.
|
||||
if (DDConfig.getRiftClusterDimensions().isAccepted(dimensionID) && random.nextInt(MAX_CLUSTER_GENERATION_CHANCE) < DDConfig.getClusterGenerationChance()) {
|
||||
do {
|
||||
//Pick a random point on the surface of the chunk
|
||||
x = chunkX * CHUNK_LENGTH + random.nextInt(CHUNK_LENGTH);
|
||||
z = chunkZ * CHUNK_LENGTH + random.nextInt(CHUNK_LENGTH);
|
||||
y = world.getHeight(x, z);
|
||||
|
||||
//If the point is within the acceptable altitude range, the block above is empty, and we're
|
||||
//not building on bedrock, then generate a rift there
|
||||
if (y >= MIN_RIFT_Y && y <= MAX_RIFT_Y && world.isAirBlock(new BlockPos(x, y + 1, z)) &&
|
||||
world.getBlockState(new BlockPos(x, y, z)).getBlock() != Blocks.BEDROCK && //<-- Stops Nether roof spawning. DO NOT REMOVE!
|
||||
world.getBlockState(new BlockPos(x, y - 1, z)).getBlock() != Blocks.BEDROCK &&
|
||||
world.getBlockState(new BlockPos(x, y - 2, z)).getBlock() != Blocks.BEDROCK) {
|
||||
//Create a link. If this is not the first time, create a child link and connect it to the first link.
|
||||
world.setBlockState(new BlockPos(x,y,z), ModBlocks.RIFT.getDefaultState());
|
||||
}
|
||||
}
|
||||
//Randomly decide whether to repeat the process and add another rift to the cluster
|
||||
while (random.nextInt(MAX_CLUSTER_GROWTH_CHANCE) < CLUSTER_GROWTH_CHANCE);
|
||||
}
|
||||
|
||||
// Check if we can place a Rift Gateway in this dimension, then randomly decide whether to place one.
|
||||
// This only happens if a rift cluster was NOT generated.
|
||||
else if (DDConfig.getRiftGatewayDimensions().isAccepted(dimensionID) && random.nextInt(MAX_GATEWAY_GENERATION_CHANCE) < DDConfig.getGatewayGenerationChance()) {
|
||||
valid = false;
|
||||
x = y = z = 0; //Stop the compiler from freaking out
|
||||
|
||||
//Check locations for the gateway until we are satisfied or run out of attempts.
|
||||
for (attempts = 0; attempts < MAX_GATEWAY_GENERATION_ATTEMPTS && !valid; attempts++) {
|
||||
//Pick a random point on the surface of the chunk and check its materials
|
||||
x = chunkX * CHUNK_LENGTH + random.nextInt(CHUNK_LENGTH);
|
||||
z = chunkZ * CHUNK_LENGTH + random.nextInt(CHUNK_LENGTH);
|
||||
y = world.getHeight(x, z);
|
||||
valid = checkGatewayLocation(world, new BlockPos(x, y, z));
|
||||
}
|
||||
|
||||
// Build the gateway if we found a valid location
|
||||
if (valid) {
|
||||
ArrayList<BaseGateway> validGateways = new ArrayList<BaseGateway>();
|
||||
for (BaseGateway gateway : gateways) {
|
||||
if (gateway.isLocationValid(world, x, y, z)) {
|
||||
validGateways.add(gateway);
|
||||
}
|
||||
}
|
||||
// Add the default gateway if the rest were rejected
|
||||
if (validGateways.isEmpty()) {
|
||||
validGateways.add(defaultGateway);
|
||||
}
|
||||
// Randomly select a gateway from the pool of viable gateways
|
||||
validGateways.get(random.nextInt(validGateways.size())).generate(world, x, y - 1, z);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean checkGatewayLocation(World world, BlockPos pos) {
|
||||
//Check if the point is within the acceptable altitude range, the block above that point is empty,
|
||||
//and the block two levels down is opaque and has a reasonable material. Plus that we're not building
|
||||
//on top of bedrock.
|
||||
return (pos.getY() >= MIN_RIFT_Y && pos.getY() <= MAX_RIFT_Y &&
|
||||
world.isAirBlock(pos.up()) &&
|
||||
world.getBlockState(pos).getBlock() != Blocks.BEDROCK && //<-- Stops Nether roof spawning. DO NOT REMOVE!
|
||||
world.getBlockState(pos.down()) != Blocks.BEDROCK &&
|
||||
checkFoundationMaterial(world, pos.down()));
|
||||
}
|
||||
|
||||
private static boolean checkFoundationMaterial(World world, BlockPos pos) {
|
||||
//We check the material and opacity to prevent generating gateways on top of trees or houses,
|
||||
//or on top of strange things like tall grass, water, slabs, or torches.
|
||||
//We also want to avoid generating things on top of the Nether's bedrock!
|
||||
Material material = world.getBlockState(pos).getMaterial();
|
||||
return (material != Material.LEAVES && material != Material.WOOD && material != Material.GOURD
|
||||
&& world.isBlockNormalCube(pos, false) && world.getBlockState(pos).getBlock() != Blocks.BEDROCK);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package com.zixiken.dimdoors.shared.world.gateways;
|
||||
|
||||
import com.zixiken.dimdoors.shared.blocks.BlockFabric;
|
||||
import com.zixiken.dimdoors.shared.blocks.ModBlocks;
|
||||
import com.zixiken.dimdoors.shared.world.limbodimension.WorldProviderLimbo;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.item.ItemDoor;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class GatewayLimbo extends BaseGateway {
|
||||
@Override
|
||||
public boolean generate(World world, int x, int y, int z)
|
||||
{
|
||||
IBlockState limbo = ModBlocks.FABRIC.getDefaultState().withProperty(BlockFabric.TYPE, BlockFabric.EnumType.UNRAVELED);
|
||||
// Build the gateway out of Unraveled Fabric. Since nearly all the blocks in Limbo are of
|
||||
// that type, there is no point replacing the ground.
|
||||
world.setBlockState(new BlockPos(x, y + 3, z + 1), limbo);
|
||||
world.setBlockState(new BlockPos(x, y + 3, z - 1), limbo);
|
||||
|
||||
// Build the columns around the door
|
||||
world.setBlockState(new BlockPos(x, y + 2, z - 1), limbo);
|
||||
world.setBlockState(new BlockPos(x, y + 2, z + 1), limbo);
|
||||
world.setBlockState(new BlockPos(x, y + 1, z - 1), limbo);
|
||||
world.setBlockState(new BlockPos(x, y + 1, z + 1), limbo);
|
||||
|
||||
ItemDoor.placeDoor(world, new BlockPos(x, y + 1, z), EnumFacing.getHorizontal(0), ModBlocks.TRANSIENT_DIMENSIONAL_DOOR, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLocationValid(World world, int x, int y, int z) {
|
||||
return world.provider instanceof WorldProviderLimbo;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package com.zixiken.dimdoors.shared.world.gateways;
|
||||
|
||||
import net.minecraft.init.Biomes;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
|
||||
public class GatewaySandstonePillars extends BaseSchematicGateway {
|
||||
public GatewaySandstonePillars() {
|
||||
super("sandstonePillars");
|
||||
}
|
||||
|
||||
public Biome[] getBiomes() {
|
||||
return new Biome[] {Biomes.DESERT, Biomes.DESERT_HILLS, Biomes.MUTATED_DESERT};
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
package com.zixiken.dimdoors.shared.world.gateways;
|
||||
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class GatewayTwoPillars extends BaseSchematicGateway {
|
||||
private static final int GATEWAY_RADIUS = 4;
|
||||
|
||||
public GatewayTwoPillars() {
|
||||
super("twoPillars");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void generateRandomBits(World world, int x, int y, int z) {
|
||||
IBlockState state = Blocks.STONEBRICK.getDefaultState();
|
||||
|
||||
//Replace some of the ground around the gateway with bricks
|
||||
for (int xc = -GATEWAY_RADIUS; xc <= GATEWAY_RADIUS; xc++) {
|
||||
for (int zc = -GATEWAY_RADIUS; zc <= GATEWAY_RADIUS; zc++) {
|
||||
//Check that the block is supported by an opaque block.
|
||||
//This prevents us from building over a cliff, on the peak of a mountain,
|
||||
//or the surface of the ocean or a frozen lake.
|
||||
if (world.getBlockState(new BlockPos(x + xc, y - 1, z + zc)).getMaterial().isSolid()) {
|
||||
//Randomly choose whether to place bricks or not. The math is designed so that the
|
||||
//chances of placing a block decrease as we get farther from the gateway's center.
|
||||
if (Math.abs(xc) + Math.abs(zc) < world.rand.nextInt(2) + 3) {
|
||||
//Place Stone Bricks
|
||||
world.setBlockState(new BlockPos(x + xc, y, z + zc), state);
|
||||
} else if (Math.abs(xc) + Math.abs(zc) < world.rand.nextInt(3) + 3) {
|
||||
//Place Cracked Stone Bricks
|
||||
world.setBlockState(new BlockPos(x + xc, y, z + zc), state); //TODO find out what the data for cracked Stonebrick is.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -308,7 +308,7 @@ public class LimboGenerator implements IChunkGenerator {
|
|||
ModBlocks.FABRIC.getDefaultState().withProperty(BlockFabric.TYPE, BlockFabric.EnumType.UNRAVELED));
|
||||
} else if(yCoord < 6) {
|
||||
primer.setBlockState(xCoord, yCoord, zCoord,
|
||||
ModBlocks.FABRIC.getDefaultState().withProperty(BlockFabric.TYPE, BlockFabric.EnumType.ETERNAL));
|
||||
ModBlocks.FABRIC.getDefaultState().withProperty(BlockFabric.TYPE, BlockFabric.EnumType.ANCIENT));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,68 @@
|
|||
{
|
||||
"variants": {
|
||||
"normal": {"model": "dimdoors:no_texture"}
|
||||
"facing=east,half=lower,hinge=left,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=lower,hinge=left,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=lower,hinge=left,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=lower,hinge=left,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=lower,hinge=right,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=lower,hinge=right,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=lower,hinge=right,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=lower,hinge=right,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=lower,hinge=left,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=lower,hinge=left,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=lower,hinge=left,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=lower,hinge=left,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=lower,hinge=right,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=lower,hinge=right,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=lower,hinge=right,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=lower,hinge=right,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=upper,hinge=left,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=upper,hinge=left,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=upper,hinge=left,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=upper,hinge=left,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=upper,hinge=right,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=upper,hinge=right,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=upper,hinge=right,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=upper,hinge=right,open=false,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=upper,hinge=left,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=upper,hinge=left,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=upper,hinge=left,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=upper,hinge=left,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=upper,hinge=right,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=upper,hinge=right,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=upper,hinge=right,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=upper,hinge=right,open=true,powered=false": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=lower,hinge=left,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=lower,hinge=left,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=lower,hinge=left,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=lower,hinge=left,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=lower,hinge=right,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=lower,hinge=right,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=lower,hinge=right,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=lower,hinge=right,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=lower,hinge=left,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=lower,hinge=left,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=lower,hinge=left,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=lower,hinge=left,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=lower,hinge=right,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=lower,hinge=right,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=lower,hinge=right,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=lower,hinge=right,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=upper,hinge=left,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=upper,hinge=left,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=upper,hinge=left,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=upper,hinge=left,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=upper,hinge=right,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=upper,hinge=right,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=upper,hinge=right,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=upper,hinge=right,open=false,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=upper,hinge=left,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=upper,hinge=left,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=upper,hinge=left,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=upper,hinge=left,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=east,half=upper,hinge=right,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=south,half=upper,hinge=right,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=west,half=upper,hinge=right,open=true,powered=true": { "model": "dimdoors:no_texture" },
|
||||
"facing=north,half=upper,hinge=right,open=true,powered=true": { "model": "dimdoors:no_texture" }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
{
|
||||
"parent": "builtin/missing"
|
||||
"parent": "block/block"
|
||||
}
|
||||
|
|
Binary file not shown.
Before ![]() (image error) Size: 1.3 KiB After ![]() (image error) Size: 527 B ![]() ![]() |
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"animation": { "frametime": 10 }
|
||||
}
|
Loading…
Add table
Reference in a new issue