Did another massive chunk of changes
And still many more to got through. Sigh.
This commit is contained in:
parent
0174899d2e
commit
d28c48c3c7
28 changed files with 595 additions and 1862 deletions
|
@ -10,20 +10,19 @@ import com.zixiken.dimdoors.dungeon.DungeonData;
|
||||||
import com.zixiken.dimdoors.helpers.DungeonHelper;
|
import com.zixiken.dimdoors.helpers.DungeonHelper;
|
||||||
import com.zixiken.dimdoors.world.PocketBuilder;
|
import com.zixiken.dimdoors.world.PocketBuilder;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.util.BlockPos;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.MathHelper;
|
import net.minecraft.util.MathHelper;
|
||||||
import com.zixiken.dimdoors.core.NewDimData;
|
import com.zixiken.dimdoors.core.NewDimData;
|
||||||
|
|
||||||
public class CommandCreateDungeonRift extends DDCommandBase
|
public class CommandCreateDungeonRift extends DDCommandBase {
|
||||||
{
|
|
||||||
private static CommandCreateDungeonRift instance = null;
|
private static CommandCreateDungeonRift instance = null;
|
||||||
|
|
||||||
private CommandCreateDungeonRift()
|
private CommandCreateDungeonRift() {
|
||||||
{
|
|
||||||
super("dd-rift", "<dungeon name>");
|
super("dd-rift", "<dungeon name>");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CommandCreateDungeonRift instance()
|
public static CommandCreateDungeonRift instance() {
|
||||||
{
|
|
||||||
if (instance == null)
|
if (instance == null)
|
||||||
instance = new CommandCreateDungeonRift();
|
instance = new CommandCreateDungeonRift();
|
||||||
|
|
||||||
|
@ -31,79 +30,67 @@ public class CommandCreateDungeonRift extends DDCommandBase
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
protected DDCommandResult processCommand(EntityPlayer sender, String[] command) {
|
||||||
{
|
|
||||||
NewDimData dimension;
|
NewDimData dimension;
|
||||||
DungeonHelper dungeonHelper = DungeonHelper.instance();
|
DungeonHelper dungeonHelper = DungeonHelper.instance();
|
||||||
|
|
||||||
if (command.length == 0)
|
if (command.length == 0) {
|
||||||
{
|
|
||||||
return DDCommandResult.TOO_FEW_ARGUMENTS;
|
return DDCommandResult.TOO_FEW_ARGUMENTS;
|
||||||
}
|
} if (command.length > 1) {
|
||||||
if (command.length > 1)
|
|
||||||
{
|
|
||||||
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DimLink link;
|
DimLink link;
|
||||||
DungeonData result;
|
DungeonData result;
|
||||||
int x = MathHelper.floor_double(sender.posX);
|
|
||||||
int y = MathHelper.floor_double(sender.posY);
|
BlockPos pos = new BlockPos(MathHelper.floor_double(sender.posX), MathHelper.floor_double(sender.posY), MathHelper.floor_double (sender.posZ));
|
||||||
int z = MathHelper.floor_double (sender.posZ);
|
|
||||||
int orientation = MathHelper.floor_double((sender.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3;
|
EnumFacing facing = EnumFacing.fromAngle(sender.rotationYaw).getOpposite();
|
||||||
|
|
||||||
result = findDungeonByPartialName(command[0], dungeonHelper.getRegisteredDungeons());
|
result = findDungeonByPartialName(command[0], dungeonHelper.getRegisteredDungeons());
|
||||||
if (result == null)
|
|
||||||
{
|
if (result == null) {
|
||||||
result = findDungeonByPartialName(command[0], dungeonHelper.getUntaggedDungeons());
|
result = findDungeonByPartialName(command[0], dungeonHelper.getUntaggedDungeons());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if we found any matches
|
// Check if we found any matches
|
||||||
if (result != null)
|
if (result != null) {
|
||||||
{
|
|
||||||
dimension = PocketManager.getDimensionData(sender.worldObj);
|
dimension = PocketManager.getDimensionData(sender.worldObj);
|
||||||
link = dimension.createLink(x, y + 1, z, LinkType.DUNGEON, orientation);
|
link = dimension.createLink(pos.up(), LinkType.DUNGEON, facing);
|
||||||
|
|
||||||
if (PocketBuilder.generateSelectedDungeonPocket(link, DimDoors.properties, result))
|
if (PocketBuilder.generateSelectedDungeonPocket(link, DimDoors.properties, result)) {
|
||||||
{
|
|
||||||
// Create a rift to our selected dungeon and notify the player
|
// Create a rift to our selected dungeon and notify the player
|
||||||
sender.worldObj.setBlock(x, y + 1, z, DimDoors.blockRift, 0, 3);
|
sender.worldObj.setBlockState(pos.up(), DimDoors.blockRift.getDefaultState());
|
||||||
sendChat(sender, "Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination().getDimension() + ").");
|
sendChat(sender, "Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination().getDimension() + ").");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
// Dungeon generation failed somehow. Notify the user and remove the useless link.
|
// Dungeon generation failed somehow. Notify the user and remove the useless link.
|
||||||
dimension.deleteLink(link);
|
dimension.deleteLink(link);
|
||||||
sendChat(sender, "Dungeon generation failed unexpectedly!");
|
sendChat(sender, "Dungeon generation failed unexpectedly!");
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
//No matches!
|
//No matches!
|
||||||
return new DDCommandResult("Error: The specified dungeon was not found. Use 'dd-list' to see a list of the available dungeons.");
|
return new DDCommandResult("Error: The specified dungeon was not found. Use 'dd-list' to see a list of the available dungeons.");
|
||||||
}
|
}
|
||||||
return DDCommandResult.SUCCESS;
|
return DDCommandResult.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DungeonData findDungeonByPartialName(String query, Collection<DungeonData> dungeons)
|
private static DungeonData findDungeonByPartialName(String query, Collection<DungeonData> dungeons) {
|
||||||
{
|
|
||||||
//Search for the shortest dungeon name that contains the lowercase query string.
|
//Search for the shortest dungeon name that contains the lowercase query string.
|
||||||
String dungeonName;
|
String dungeonName;
|
||||||
String normalQuery = query.toLowerCase();
|
String normalQuery = query.toLowerCase();
|
||||||
DungeonData bestMatch = null;
|
DungeonData bestMatch = null;
|
||||||
int matchLength = Integer.MAX_VALUE;
|
int matchLength = Integer.MAX_VALUE;
|
||||||
|
|
||||||
for (DungeonData dungeon : dungeons)
|
for (DungeonData dungeon : dungeons) {
|
||||||
{
|
|
||||||
//We need to extract the file's name. Comparing against schematicPath could
|
//We need to extract the file's name. Comparing against schematicPath could
|
||||||
//yield false matches if the query string is contained within the path.
|
//yield false matches if the query string is contained within the path.
|
||||||
dungeonName = dungeon.schematicName().toLowerCase();
|
dungeonName = dungeon.schematicName().toLowerCase();
|
||||||
if (dungeonName.length() < matchLength && dungeonName.contains(normalQuery))
|
if (dungeonName.length() < matchLength && dungeonName.contains(normalQuery)) {
|
||||||
{
|
|
||||||
matchLength = dungeonName.length();
|
matchLength = dungeonName.length();
|
||||||
bestMatch = dungeon;
|
bestMatch = dungeon;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return bestMatch;
|
return bestMatch;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -3,17 +3,14 @@ package com.zixiken.dimdoors.commands;
|
||||||
import com.zixiken.dimdoors.helpers.DungeonHelper;
|
import com.zixiken.dimdoors.helpers.DungeonHelper;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
|
||||||
public class CommandCreatePocket extends DDCommandBase
|
public class CommandCreatePocket extends DDCommandBase {
|
||||||
{
|
|
||||||
private static CommandCreatePocket instance = null;
|
private static CommandCreatePocket instance = null;
|
||||||
|
|
||||||
private CommandCreatePocket()
|
private CommandCreatePocket() {
|
||||||
{
|
|
||||||
super("dd-create", "");
|
super("dd-create", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CommandCreatePocket instance()
|
public static CommandCreatePocket instance() {
|
||||||
{
|
|
||||||
if (instance == null)
|
if (instance == null)
|
||||||
instance = new CommandCreatePocket();
|
instance = new CommandCreatePocket();
|
||||||
|
|
||||||
|
@ -21,10 +18,8 @@ public class CommandCreatePocket extends DDCommandBase
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
protected DDCommandResult processCommand(EntityPlayer sender, String[] command) {
|
||||||
{
|
if (command.length > 0) {
|
||||||
if (command.length > 0)
|
|
||||||
{
|
|
||||||
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,21 +12,20 @@ import com.zixiken.dimdoors.dungeon.DungeonData;
|
||||||
import com.zixiken.dimdoors.helpers.DungeonHelper;
|
import com.zixiken.dimdoors.helpers.DungeonHelper;
|
||||||
import com.zixiken.dimdoors.world.PocketBuilder;
|
import com.zixiken.dimdoors.world.PocketBuilder;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.util.BlockPos;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.MathHelper;
|
import net.minecraft.util.MathHelper;
|
||||||
import com.zixiken.dimdoors.core.NewDimData;
|
import com.zixiken.dimdoors.core.NewDimData;
|
||||||
|
|
||||||
public class CommandCreateRandomRift extends DDCommandBase
|
public class CommandCreateRandomRift extends DDCommandBase {
|
||||||
{
|
|
||||||
private static CommandCreateRandomRift instance = null;
|
private static CommandCreateRandomRift instance = null;
|
||||||
private static Random random = new Random();
|
private static Random random = new Random();
|
||||||
|
|
||||||
private CommandCreateRandomRift()
|
private CommandCreateRandomRift() {
|
||||||
{
|
|
||||||
super("dd-random", "<dungeon name>");
|
super("dd-random", "<dungeon name>");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CommandCreateRandomRift instance()
|
public static CommandCreateRandomRift instance() {
|
||||||
{
|
|
||||||
if (instance == null)
|
if (instance == null)
|
||||||
instance = new CommandCreateRandomRift();
|
instance = new CommandCreateRandomRift();
|
||||||
|
|
||||||
|
@ -34,60 +33,46 @@ public class CommandCreateRandomRift extends DDCommandBase
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
protected DDCommandResult processCommand(EntityPlayer sender, String[] command) {
|
||||||
{
|
|
||||||
NewDimData dimension;
|
NewDimData dimension;
|
||||||
DungeonHelper dungeonHelper = DungeonHelper.instance();
|
DungeonHelper dungeonHelper = DungeonHelper.instance();
|
||||||
|
|
||||||
if (command.length > 1)
|
if (command.length > 1)
|
||||||
{
|
{return DDCommandResult.TOO_MANY_ARGUMENTS;
|
||||||
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DimLink link;
|
DimLink link;
|
||||||
DungeonData result;
|
DungeonData result;
|
||||||
int x = MathHelper.floor_double(sender.posX);
|
BlockPos pos = new BlockPos(MathHelper.floor_double(sender.posX), MathHelper.floor_double(sender.posY), MathHelper.floor_double(sender.posZ));
|
||||||
int y = MathHelper.floor_double(sender.posY);
|
EnumFacing facing = EnumFacing.fromAngle(sender.rotationYaw).getOpposite();
|
||||||
int z = MathHelper.floor_double (sender.posZ);
|
|
||||||
int orientation = MathHelper.floor_double((sender.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3;
|
|
||||||
|
|
||||||
if (command.length == 0)
|
if (command.length == 0) {
|
||||||
{
|
|
||||||
dimension = PocketManager.getDimensionData(sender.worldObj);
|
dimension = PocketManager.getDimensionData(sender.worldObj);
|
||||||
link = dimension.createLink(x, y + 1, z, LinkType.DUNGEON, orientation);
|
link = dimension.createLink(pos.up(), LinkType.DUNGEON, facing);
|
||||||
|
|
||||||
sender.worldObj.setBlock(x, y + 1, z, DimDoors.blockRift, 0, 3);
|
sender.worldObj.setBlockState(pos.up(), DimDoors.blockRift.getDefaultState());
|
||||||
sendChat(sender, "Created a rift to a random dungeon.");
|
sendChat(sender, "Created a rift to a random dungeon.");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
result = getRandomDungeonByPartialName(command[0], dungeonHelper.getRegisteredDungeons());
|
result = getRandomDungeonByPartialName(command[0], dungeonHelper.getRegisteredDungeons());
|
||||||
if (result == null)
|
if (result == null) {
|
||||||
{
|
|
||||||
result = getRandomDungeonByPartialName(command[0], dungeonHelper.getUntaggedDungeons());
|
result = getRandomDungeonByPartialName(command[0], dungeonHelper.getUntaggedDungeons());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if we found any matches
|
// Check if we found any matches
|
||||||
if (result != null)
|
if (result != null) {
|
||||||
{
|
|
||||||
dimension = PocketManager.getDimensionData(sender.worldObj);
|
dimension = PocketManager.getDimensionData(sender.worldObj);
|
||||||
link = dimension.createLink(x, y + 1, z, LinkType.DUNGEON, orientation);
|
link = dimension.createLink(pos.up(), LinkType.DUNGEON, facing);
|
||||||
|
|
||||||
if (PocketBuilder.generateSelectedDungeonPocket(link, DimDoors.properties, result))
|
if (PocketBuilder.generateSelectedDungeonPocket(link, DimDoors.properties, result)) {
|
||||||
{
|
|
||||||
// Create a rift to our selected dungeon and notify the player
|
// Create a rift to our selected dungeon and notify the player
|
||||||
sender.worldObj.setBlock(x, y + 1, z, DimDoors.blockRift, 0, 3);
|
sender.worldObj.setBlockState(pos.up(), DimDoors.blockRift.getDefaultState());
|
||||||
sendChat(sender, "Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination().getDimension() + ").");
|
sendChat(sender, "Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination().getDimension() + ").");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
// Dungeon generation failed somehow. Notify the user and remove the useless link.
|
// Dungeon generation failed somehow. Notify the user and remove the useless link.
|
||||||
dimension.deleteLink(link);
|
dimension.deleteLink(link);
|
||||||
sendChat(sender, "Dungeon generation failed unexpectedly!");
|
sendChat(sender, "Dungeon generation failed unexpectedly!");
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
//No matches!
|
//No matches!
|
||||||
return new DDCommandResult("Error: The specified dungeon was not found. Use 'list' to see a list of the available dungeons.");
|
return new DDCommandResult("Error: The specified dungeon was not found. Use 'list' to see a list of the available dungeons.");
|
||||||
}
|
}
|
||||||
|
@ -95,25 +80,20 @@ public class CommandCreateRandomRift extends DDCommandBase
|
||||||
return DDCommandResult.SUCCESS;
|
return DDCommandResult.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DungeonData getRandomDungeonByPartialName(String query, Collection<DungeonData> dungeons)
|
private static DungeonData getRandomDungeonByPartialName(String query, Collection<DungeonData> dungeons) {
|
||||||
{
|
|
||||||
// Search for all dungeons that contain the lowercase query string.
|
// Search for all dungeons that contain the lowercase query string.
|
||||||
String dungeonName;
|
String dungeonName;
|
||||||
String normalQuery = query.toLowerCase();
|
String normalQuery = query.toLowerCase();
|
||||||
ArrayList<DungeonData> matches = new ArrayList<DungeonData>();
|
ArrayList<DungeonData> matches = new ArrayList<DungeonData>();
|
||||||
|
|
||||||
for (DungeonData dungeon : dungeons)
|
for (DungeonData dungeon : dungeons) {
|
||||||
{
|
|
||||||
// We need to extract the file's name. Comparing against schematicPath could
|
// We need to extract the file's name. Comparing against schematicPath could
|
||||||
// yield false matches if the query string is contained within the path.
|
// yield false matches if the query string is contained within the path.
|
||||||
dungeonName = dungeon.schematicName().toLowerCase();
|
dungeonName = dungeon.schematicName().toLowerCase();
|
||||||
if (dungeonName.contains(normalQuery))
|
if (dungeonName.contains(normalQuery)) {
|
||||||
{
|
|
||||||
matches.add(dungeon);
|
matches.add(dungeon);
|
||||||
}
|
}
|
||||||
}
|
} if (matches.isEmpty()) {
|
||||||
if (matches.isEmpty())
|
|
||||||
{
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return matches.get( random.nextInt(matches.size()) );
|
return matches.get( random.nextInt(matches.size()) );
|
||||||
|
|
|
@ -5,20 +5,19 @@ import java.io.File;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import com.zixiken.dimdoors.config.DDProperties;
|
import com.zixiken.dimdoors.config.DDProperties;
|
||||||
import com.zixiken.dimdoors.helpers.DungeonHelper;
|
import com.zixiken.dimdoors.helpers.DungeonHelper;
|
||||||
|
import net.minecraft.util.BlockPos;
|
||||||
|
|
||||||
public class CommandExportDungeon extends DDCommandBase
|
public class CommandExportDungeon extends DDCommandBase
|
||||||
{
|
{
|
||||||
private static CommandExportDungeon instance = null;
|
private static CommandExportDungeon instance = null;
|
||||||
|
|
||||||
private CommandExportDungeon()
|
private CommandExportDungeon() {
|
||||||
{
|
|
||||||
super("dd-export", new String[] {
|
super("dd-export", new String[] {
|
||||||
"<dungeon type> <dungeon name> <'open' | 'closed'> [weight]",
|
"<dungeon type> <dungeon name> <'open' | 'closed'> [weight]",
|
||||||
"<schematic name> override" } );
|
"<schematic name> override" } );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CommandExportDungeon instance()
|
public static CommandExportDungeon instance() {
|
||||||
{
|
|
||||||
if (instance == null)
|
if (instance == null)
|
||||||
instance = new CommandExportDungeon();
|
instance = new CommandExportDungeon();
|
||||||
|
|
||||||
|
@ -26,8 +25,7 @@ public class CommandExportDungeon extends DDCommandBase
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
protected DDCommandResult processCommand(EntityPlayer sender, String[] command) {
|
||||||
{
|
|
||||||
/*
|
/*
|
||||||
* There are two versions of this command. One version takes 3 to 4 arguments consisting
|
* There are two versions of this command. One version takes 3 to 4 arguments consisting
|
||||||
* of the information needed for a proper schematic name.
|
* of the information needed for a proper schematic name.
|
||||||
|
@ -39,23 +37,18 @@ public class CommandExportDungeon extends DDCommandBase
|
||||||
|
|
||||||
DungeonHelper dungeonHelper = DungeonHelper.instance();
|
DungeonHelper dungeonHelper = DungeonHelper.instance();
|
||||||
|
|
||||||
if (command.length < 2)
|
if (command.length < 2) {
|
||||||
{
|
|
||||||
return DDCommandResult.TOO_FEW_ARGUMENTS;
|
return DDCommandResult.TOO_FEW_ARGUMENTS;
|
||||||
}
|
}
|
||||||
if (command.length > 4)
|
if (command.length > 4) {
|
||||||
{
|
|
||||||
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Check if we received the 2-argument version
|
//Check if we received the 2-argument version
|
||||||
if (command.length == 2)
|
if (command.length == 2) {
|
||||||
{
|
if (command[1].equalsIgnoreCase("override")) {
|
||||||
if (command[1].equalsIgnoreCase("override"))
|
|
||||||
{
|
|
||||||
//Check that the schematic name is a legal name
|
//Check that the schematic name is a legal name
|
||||||
if (DungeonHelper.SCHEMATIC_NAME_PATTERN.matcher(command[0]).matches())
|
if (DungeonHelper.SCHEMATIC_NAME_PATTERN.matcher(command[0]).matches()) {
|
||||||
{
|
|
||||||
//Export the schematic
|
//Export the schematic
|
||||||
return exportDungeon(sender, command[0]);
|
return exportDungeon(sender, command[0]);
|
||||||
}
|
}
|
||||||
|
@ -71,80 +64,70 @@ public class CommandExportDungeon extends DDCommandBase
|
||||||
//TODO: This validation should be in DungeonHelper or in another class. We should move it
|
//TODO: This validation should be in DungeonHelper or in another class. We should move it
|
||||||
//during the save file format rewrite. ~SenseiKiwi
|
//during the save file format rewrite. ~SenseiKiwi
|
||||||
|
|
||||||
if (!dungeonHelper.validateDungeonType(command[0], dungeonHelper.getDungeonPack("ruins")))
|
if (!dungeonHelper.validateDungeonType(command[0], dungeonHelper.getDungeonPack("ruins"))) {
|
||||||
{
|
|
||||||
return new DDCommandResult("Error: Invalid dungeon type. Please use one of the existing types.");
|
return new DDCommandResult("Error: Invalid dungeon type. Please use one of the existing types.");
|
||||||
}
|
} if (!DungeonHelper.DUNGEON_NAME_PATTERN.matcher(command[1]).matches()) {
|
||||||
if (!DungeonHelper.DUNGEON_NAME_PATTERN.matcher(command[1]).matches())
|
|
||||||
{
|
|
||||||
return new DDCommandResult("Error: Invalid dungeon name. Please use only letters, numbers, and dashes.");
|
return new DDCommandResult("Error: Invalid dungeon name. Please use only letters, numbers, and dashes.");
|
||||||
}
|
} if (!command[2].equalsIgnoreCase("open") && !command[2].equalsIgnoreCase("closed")) {
|
||||||
if (!command[2].equalsIgnoreCase("open") && !command[2].equalsIgnoreCase("closed"))
|
|
||||||
{
|
|
||||||
return new DDCommandResult("Error: Please specify whether the dungeon is 'open' or 'closed'.");
|
return new DDCommandResult("Error: Please specify whether the dungeon is 'open' or 'closed'.");
|
||||||
}
|
}
|
||||||
|
|
||||||
//If there are no more arguments, export the dungeon.
|
//If there are no more arguments, export the dungeon.
|
||||||
if (command.length == 3)
|
if (command.length == 3) {
|
||||||
{
|
|
||||||
return exportDungeon(sender, join(command, "_", 0, 3));
|
return exportDungeon(sender, join(command, "_", 0, 3));
|
||||||
}
|
}
|
||||||
|
|
||||||
//Validate the weight argument
|
//Validate the weight argument
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
int weight = Integer.parseInt(command[3]);
|
int weight = Integer.parseInt(command[3]);
|
||||||
if (weight >= DungeonHelper.MIN_DUNGEON_WEIGHT && weight <= DungeonHelper.MAX_DUNGEON_WEIGHT)
|
if (weight >= DungeonHelper.MIN_DUNGEON_WEIGHT && weight <= DungeonHelper.MAX_DUNGEON_WEIGHT) {
|
||||||
{
|
|
||||||
return exportDungeon(sender, join(command, "_", 0, 4));
|
return exportDungeon(sender, join(command, "_", 0, 4));
|
||||||
}
|
}
|
||||||
}
|
} catch (Exception e) { }
|
||||||
catch (Exception e) { }
|
|
||||||
|
|
||||||
//If we've reached this point, then we must have an invalid weight.
|
//If we've reached this point, then we must have an invalid weight.
|
||||||
return new DDCommandResult("Invalid dungeon weight. Please specify a weight between "
|
return new DDCommandResult("Invalid dungeon weight. Please specify a weight between "
|
||||||
+ DungeonHelper.MIN_DUNGEON_WEIGHT + " and " + DungeonHelper.MAX_DUNGEON_WEIGHT + ", inclusive.");
|
+ DungeonHelper.MIN_DUNGEON_WEIGHT + " and " + DungeonHelper.MAX_DUNGEON_WEIGHT + ", inclusive.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DDCommandResult exportDungeon(EntityPlayer player, String name)
|
private static DDCommandResult exportDungeon(EntityPlayer player, String name) {
|
||||||
{
|
|
||||||
DDProperties properties = DDProperties.instance();
|
DDProperties properties = DDProperties.instance();
|
||||||
DungeonHelper dungeonHelper = DungeonHelper.instance();
|
DungeonHelper dungeonHelper = DungeonHelper.instance();
|
||||||
|
|
||||||
int x = (int) player.posX;
|
BlockPos pos = new BlockPos((int) player.posX, (int) player.posY, (int) player.posZ);
|
||||||
int y = (int) player.posY;
|
|
||||||
int z = (int) player.posZ;
|
|
||||||
String exportPath = properties.CustomSchematicDirectory + File.separator + name + ".schematic";
|
String exportPath = properties.CustomSchematicDirectory + File.separator + name + ".schematic";
|
||||||
if (dungeonHelper.exportDungeon(player.worldObj, x, y, z, exportPath))
|
|
||||||
{
|
if (dungeonHelper.exportDungeon(player.worldObj, pos, exportPath)) {
|
||||||
sendChat(player,("Saved dungeon schematic in " + exportPath));
|
sendChat(player,("Saved dungeon schematic in " + exportPath));
|
||||||
dungeonHelper.registerDungeon(exportPath, dungeonHelper.getDungeonPack("ruins"), false, true);
|
dungeonHelper.registerDungeon(exportPath, dungeonHelper.getDungeonPack("ruins"), false, true);
|
||||||
return DDCommandResult.SUCCESS;
|
return DDCommandResult.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new DDCommandResult("Error: Failed to save dungeon schematic!");
|
return new DDCommandResult("Error: Failed to save dungeon schematic!");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String join(String[] source, String delimiter, int start, int end)
|
private static String join(String[] source, String delimiter, int start, int end) {
|
||||||
{
|
|
||||||
//TODO: This function should be moved to a helper, but we have several single-function helpers as is.
|
//TODO: This function should be moved to a helper, but we have several single-function helpers as is.
|
||||||
//I find that to be worse than keeping this private. ~SenseiKiwi
|
//I find that to be worse than keeping this private. ~SenseiKiwi
|
||||||
|
|
||||||
int index;
|
int index;
|
||||||
int length = 0;
|
int length = 0;
|
||||||
StringBuilder buffer;
|
StringBuilder buffer;
|
||||||
for (index = start; index < end; index++)
|
|
||||||
{
|
for (index = start; index < end; index++) {
|
||||||
length += source[index].length();
|
length += source[index].length();
|
||||||
}
|
}
|
||||||
|
|
||||||
length += (end - start - 1) * delimiter.length();
|
length += (end - start - 1) * delimiter.length();
|
||||||
|
|
||||||
buffer = new StringBuilder(length);
|
buffer = new StringBuilder(length);
|
||||||
buffer.append(source[start]);
|
buffer.append(source[start]);
|
||||||
for (index = start + 1; index < end; index++)
|
|
||||||
{
|
for (index = start + 1; index < end; index++) {
|
||||||
buffer.append(delimiter);
|
buffer.append(delimiter);
|
||||||
buffer.append(source[index]);
|
buffer.append(source[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return buffer.toString();
|
return buffer.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -5,17 +5,14 @@ import java.util.ArrayList;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import com.zixiken.dimdoors.helpers.DungeonHelper;
|
import com.zixiken.dimdoors.helpers.DungeonHelper;
|
||||||
|
|
||||||
public class CommandListDungeons extends DDCommandBase
|
public class CommandListDungeons extends DDCommandBase {
|
||||||
{
|
|
||||||
private static CommandListDungeons instance = null;
|
private static CommandListDungeons instance = null;
|
||||||
|
|
||||||
private CommandListDungeons()
|
private CommandListDungeons() {
|
||||||
{
|
|
||||||
super("dd-list", "<page>");
|
super("dd-list", "<page>");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CommandListDungeons instance()
|
public static CommandListDungeons instance() {
|
||||||
{
|
|
||||||
if (instance == null)
|
if (instance == null)
|
||||||
instance = new CommandListDungeons();
|
instance = new CommandListDungeons();
|
||||||
|
|
||||||
|
@ -23,46 +20,42 @@ public class CommandListDungeons extends DDCommandBase
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
protected DDCommandResult processCommand(EntityPlayer sender, String[] command) {
|
||||||
{
|
|
||||||
int page;
|
int page;
|
||||||
int index;
|
int index;
|
||||||
int limit;
|
int limit;
|
||||||
int pageCount;
|
int pageCount;
|
||||||
ArrayList<String> dungeonNames;
|
ArrayList<String> dungeonNames;
|
||||||
|
|
||||||
if (command.length > 1)
|
if (command.length > 1) {
|
||||||
{
|
|
||||||
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
||||||
}
|
}
|
||||||
if (command.length == 0)
|
|
||||||
{
|
if (command.length == 0) {
|
||||||
page = 1;
|
page = 1;
|
||||||
}
|
} else {
|
||||||
else
|
try {
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
page = Integer.parseInt(command[0]);
|
page = Integer.parseInt(command[0]);
|
||||||
}
|
} catch (NumberFormatException e) {
|
||||||
catch (NumberFormatException e)
|
|
||||||
{
|
|
||||||
return DDCommandResult.INVALID_ARGUMENTS;
|
return DDCommandResult.INVALID_ARGUMENTS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dungeonNames = DungeonHelper.instance().getDungeonNames();
|
dungeonNames = DungeonHelper.instance().getDungeonNames();
|
||||||
pageCount = (dungeonNames.size() - 1) / 10 + 1;
|
pageCount = (dungeonNames.size() - 1) / 10 + 1;
|
||||||
if (page < 1 || page > pageCount)
|
|
||||||
{
|
if (page < 1 || page > pageCount) {
|
||||||
return DDCommandResult.INVALID_ARGUMENTS;
|
return DDCommandResult.INVALID_ARGUMENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
sendChat(sender, "List of dungeons (page " + page + " of " + pageCount + "):");
|
sendChat(sender, "List of dungeons (page " + page + " of " + pageCount + "):");
|
||||||
index = (page - 1) * 10;
|
index = (page - 1) * 10;
|
||||||
limit = Math.min(index + 10, dungeonNames.size());
|
limit = Math.min(index + 10, dungeonNames.size());
|
||||||
for (; index < limit; index++)
|
|
||||||
{
|
for (; index < limit; index++) {
|
||||||
sendChat(sender, dungeonNames.get(index));
|
sendChat(sender, dungeonNames.get(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
sendChat(sender, "");
|
sendChat(sender, "");
|
||||||
|
|
||||||
return DDCommandResult.SUCCESS;
|
return DDCommandResult.SUCCESS;
|
||||||
|
|
|
@ -10,17 +10,14 @@ import com.zixiken.dimdoors.core.LinkType;
|
||||||
import com.zixiken.dimdoors.core.NewDimData;
|
import com.zixiken.dimdoors.core.NewDimData;
|
||||||
import com.zixiken.dimdoors.core.PocketManager;
|
import com.zixiken.dimdoors.core.PocketManager;
|
||||||
|
|
||||||
public class CommandResetDungeons extends DDCommandBase
|
public class CommandResetDungeons extends DDCommandBase {
|
||||||
{
|
|
||||||
private static CommandResetDungeons instance = null;
|
private static CommandResetDungeons instance = null;
|
||||||
|
|
||||||
private CommandResetDungeons()
|
private CommandResetDungeons() {
|
||||||
{
|
|
||||||
super("dd-resetdungeons", "");
|
super("dd-resetdungeons", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CommandResetDungeons instance()
|
public static CommandResetDungeons instance() {
|
||||||
{
|
|
||||||
if (instance == null)
|
if (instance == null)
|
||||||
instance = new CommandResetDungeons();
|
instance = new CommandResetDungeons();
|
||||||
|
|
||||||
|
@ -28,10 +25,8 @@ public class CommandResetDungeons extends DDCommandBase
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
protected DDCommandResult processCommand(EntityPlayer sender, String[] command) {
|
||||||
{
|
if (command.length > 0) {
|
||||||
if (command.length > 0)
|
|
||||||
{
|
|
||||||
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,8 +39,8 @@ public class CommandResetDungeons extends DDCommandBase
|
||||||
// Copy the list of dimensions to iterate over the copy. Otherwise,
|
// Copy the list of dimensions to iterate over the copy. Otherwise,
|
||||||
// we would trigger an exception by modifying the original list.
|
// we would trigger an exception by modifying the original list.
|
||||||
ArrayList<NewDimData> dimensions = new ArrayList<NewDimData>();
|
ArrayList<NewDimData> dimensions = new ArrayList<NewDimData>();
|
||||||
for (NewDimData dimension : PocketManager.getDimensions())
|
|
||||||
{
|
for (NewDimData dimension : PocketManager.getDimensions()) {
|
||||||
|
|
||||||
dimensions.add(dimension);
|
dimensions.add(dimension);
|
||||||
}
|
}
|
||||||
|
@ -53,48 +48,35 @@ public class CommandResetDungeons extends DDCommandBase
|
||||||
// Iterate over the list of dimensions. Check which ones are dungeons.
|
// Iterate over the list of dimensions. Check which ones are dungeons.
|
||||||
// If a dungeon is found, try to delete it. If it can't be deleted,
|
// If a dungeon is found, try to delete it. If it can't be deleted,
|
||||||
// then it must be loaded and needs to be updated to prevent bugs.
|
// then it must be loaded and needs to be updated to prevent bugs.
|
||||||
for (NewDimData dimension : dimensions)
|
for (NewDimData dimension : dimensions) {
|
||||||
{
|
if (dimension.type() == DimensionType.DUNGEON) {
|
||||||
if (dimension.type() == DimensionType.DUNGEON)
|
|
||||||
{
|
|
||||||
dungeonCount++;
|
dungeonCount++;
|
||||||
id = dimension.id();
|
id = dimension.id();
|
||||||
if (PocketManager.deletePocket(dimension, true))
|
|
||||||
{
|
if (PocketManager.deletePocket(dimension, true)) {
|
||||||
resetCount++;
|
resetCount++;
|
||||||
deletedDimensions.add(id);
|
deletedDimensions.add(id);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
loadedDungeons.add(dimension);
|
loadedDungeons.add(dimension);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Modify the loaded dungeons to prevent bugs
|
// Modify the loaded dungeons to prevent bugs
|
||||||
for (NewDimData dungeon : loadedDungeons)
|
for (NewDimData dungeon : loadedDungeons) {
|
||||||
{
|
|
||||||
// Find top-most loaded dungeons and update their parents.
|
// Find top-most loaded dungeons and update their parents.
|
||||||
// They will automatically update their children.
|
// They will automatically update their children.
|
||||||
// Dungeons with non-dungeon parents don't need to be fixed.
|
// Dungeons with non-dungeon parents don't need to be fixed.
|
||||||
if (dungeon.parent() == null)
|
if (dungeon.parent() == null) {
|
||||||
{
|
|
||||||
dungeon.setParentToRoot();
|
dungeon.setParentToRoot();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Links to any deleted dungeons must be replaced
|
// Links to any deleted dungeons must be replaced
|
||||||
for (DimLink link : dungeon.links())
|
for (DimLink link : dungeon.links()) {
|
||||||
{
|
if (link.hasDestination() && deletedDimensions.contains(link.destination().getDimension())) {
|
||||||
if (link.hasDestination() && deletedDimensions.contains(link.destination().getDimension()))
|
if (link.linkType() == LinkType.DUNGEON) {
|
||||||
{
|
|
||||||
|
|
||||||
if (link.linkType() == LinkType.DUNGEON)
|
|
||||||
{
|
|
||||||
dungeon.createLink(link.source(), LinkType.DUNGEON, link.orientation(), null);
|
dungeon.createLink(link.source(), LinkType.DUNGEON, link.orientation(), null);
|
||||||
}
|
} else if (link.linkType() == LinkType.REVERSE) {
|
||||||
else if (link.linkType() == LinkType.REVERSE)
|
|
||||||
{
|
|
||||||
dungeon.createLink(link.source(), LinkType.DUNGEON_EXIT, link.orientation(), null);
|
dungeon.createLink(link.source(), LinkType.DUNGEON_EXIT, link.orientation(), null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,26 +2,24 @@ package com.zixiken.dimdoors.commands;
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import net.minecraft.util.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import com.zixiken.dimdoors.core.DDTeleporter;
|
import com.zixiken.dimdoors.core.DDTeleporter;
|
||||||
import com.zixiken.dimdoors.core.NewDimData;
|
import com.zixiken.dimdoors.core.NewDimData;
|
||||||
import com.zixiken.dimdoors.core.PocketManager;
|
import com.zixiken.dimdoors.core.PocketManager;
|
||||||
import com.zixiken.dimdoors.util.Point4D;
|
import com.zixiken.dimdoors.util.Point4D;
|
||||||
|
|
||||||
public class CommandTeleportPlayer extends DDCommandBase
|
public class CommandTeleportPlayer extends DDCommandBase {
|
||||||
{
|
|
||||||
private static CommandTeleportPlayer instance = null;
|
private static CommandTeleportPlayer instance = null;
|
||||||
|
|
||||||
private CommandTeleportPlayer()
|
private CommandTeleportPlayer() {
|
||||||
{
|
|
||||||
super("dd-tp", new String[] {
|
super("dd-tp", new String[] {
|
||||||
"<player name> <dimension number>",
|
"<player name> <dimension number>",
|
||||||
"<player name> <x> <y> <z>",
|
"<player name> <x> <y> <z>",
|
||||||
"<player name> <dimension number> <x> <y> <z>"} );
|
"<player name> <dimension number> <x> <y> <z>"} );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CommandTeleportPlayer instance()
|
public static CommandTeleportPlayer instance() {
|
||||||
{
|
|
||||||
if (instance == null)
|
if (instance == null)
|
||||||
instance = new CommandTeleportPlayer();
|
instance = new CommandTeleportPlayer();
|
||||||
|
|
||||||
|
@ -29,11 +27,8 @@ public class CommandTeleportPlayer extends DDCommandBase
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
protected DDCommandResult processCommand(EntityPlayer sender, String[] command) {
|
||||||
{
|
BlockPos pos;
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
int z;
|
|
||||||
World world;
|
World world;
|
||||||
int dimensionID;
|
int dimensionID;
|
||||||
Point4D destination;
|
Point4D destination;
|
||||||
|
@ -41,45 +36,36 @@ public class CommandTeleportPlayer extends DDCommandBase
|
||||||
boolean checkOrientation;
|
boolean checkOrientation;
|
||||||
EntityPlayer targetPlayer;
|
EntityPlayer targetPlayer;
|
||||||
|
|
||||||
if (command.length < 2)
|
if (command.length < 2) {
|
||||||
{
|
|
||||||
return DDCommandResult.TOO_FEW_ARGUMENTS;
|
return DDCommandResult.TOO_FEW_ARGUMENTS;
|
||||||
}
|
}
|
||||||
if (command.length > 5)
|
if (command.length > 5) {
|
||||||
{
|
|
||||||
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
||||||
}
|
}
|
||||||
if (command.length == 3)
|
if (command.length == 3) {
|
||||||
{
|
|
||||||
return DDCommandResult.INVALID_ARGUMENTS;
|
return DDCommandResult.INVALID_ARGUMENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check that all arguments after the username are integers
|
// Check that all arguments after the username are integers
|
||||||
for (int k = 1; k < command.length; k++)
|
for (int k = 1; k < command.length; k++) {
|
||||||
{
|
if (!isInteger(command[k])) {
|
||||||
if (!isInteger(command[k]))
|
|
||||||
{
|
|
||||||
return DDCommandResult.INVALID_ARGUMENTS;
|
return DDCommandResult.INVALID_ARGUMENTS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Check if the target player is logged in
|
// Check if the target player is logged in
|
||||||
targetPlayer = MinecraftServer.getServer().getConfigurationManager().func_152612_a(command[0]);
|
targetPlayer = MinecraftServer.getServer().getConfigurationManager().getPlayerByUsername(command[0]);
|
||||||
if (targetPlayer == null)
|
if (targetPlayer == null) {
|
||||||
{
|
|
||||||
return DDCommandResult.PLAYER_OFFLINE;
|
return DDCommandResult.PLAYER_OFFLINE;
|
||||||
}
|
}
|
||||||
// If a dimension ID was provided, try to load it
|
// If a dimension ID was provided, try to load it
|
||||||
if (command.length != 4)
|
if (command.length != 4) {
|
||||||
{
|
|
||||||
dimensionID = Integer.parseInt(command[1]);
|
dimensionID = Integer.parseInt(command[1]);
|
||||||
world = PocketManager.loadDimension(dimensionID);
|
world = PocketManager.loadDimension(dimensionID);
|
||||||
if (world == null)
|
if (world == null) {
|
||||||
{
|
|
||||||
return DDCommandResult.UNREGISTERED_DIMENSION;
|
return DDCommandResult.UNREGISTERED_DIMENSION;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
dimensionID = targetPlayer.worldObj.provider.getDimensionId();
|
||||||
{
|
|
||||||
dimensionID = targetPlayer.worldObj.provider.dimensionId;
|
|
||||||
world = targetPlayer.worldObj;
|
world = targetPlayer.worldObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,55 +77,45 @@ public class CommandTeleportPlayer extends DDCommandBase
|
||||||
// The Y coordinate must be increased by 1 because of the way that
|
// The Y coordinate must be increased by 1 because of the way that
|
||||||
// DDTeleporter considers destination points. It assumes that the
|
// DDTeleporter considers destination points. It assumes that the
|
||||||
// point provided is the upper block of a door.
|
// point provided is the upper block of a door.
|
||||||
if (command.length == 2)
|
if (command.length == 2) {
|
||||||
{
|
|
||||||
// Check if the destination is a pocket dimension
|
// Check if the destination is a pocket dimension
|
||||||
dimension = PocketManager.createDimensionData(world);
|
dimension = PocketManager.createDimensionData(world);
|
||||||
if (dimension.isPocketDimension())
|
if (dimension.isPocketDimension()) {
|
||||||
{
|
|
||||||
// The destination is a pocket dimension.
|
// The destination is a pocket dimension.
|
||||||
// Teleport the player to its original entrance (the origin).
|
// Teleport the player to its original entrance (the origin).
|
||||||
destination = dimension.origin();
|
destination = dimension.origin();
|
||||||
checkOrientation = true;
|
checkOrientation = true;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
// The destination is not a pocket dimension, which means we
|
// The destination is not a pocket dimension, which means we
|
||||||
// don't automatically know a safe location where we can send
|
// don't automatically know a safe location where we can send
|
||||||
// the player. Send the player to (0, Y, 0), where Y is chosen
|
// the player. Send the player to (0, Y, 0), where Y is chosen
|
||||||
// by searching. Add 2 to place the player ABOVE the top block.
|
// by searching. Add 2 to place the player ABOVE the top block.
|
||||||
y = world.getTopSolidOrLiquidBlock(0, 0) + 2;
|
|
||||||
destination = new Point4D(0, y, 0, dimensionID);
|
destination = new Point4D(world.getTopSolidOrLiquidBlock(BlockPos.ORIGIN).up(2), dimensionID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (command.length == 4)
|
else if (command.length == 4) {
|
||||||
{
|
pos = new BlockPos(Integer.parseInt(command[1]),
|
||||||
x = Integer.parseInt(command[1]);
|
Integer.parseInt(command[2]) + 1, // Correct the Y value
|
||||||
y = Integer.parseInt(command[2]) + 1; // Correct the Y value
|
Integer.parseInt(command[3]));
|
||||||
z = Integer.parseInt(command[3]);
|
destination = new Point4D(pos, dimensionID);
|
||||||
destination = new Point4D(x, y, z, dimensionID);
|
} else {
|
||||||
}
|
pos = new BlockPos(Integer.parseInt(command[2]),
|
||||||
else
|
Integer.parseInt(command[3]) + 1, // Correct the Y value
|
||||||
{
|
Integer.parseInt(command[4]));
|
||||||
x = Integer.parseInt(command[2]);
|
destination = new Point4D(pos, dimensionID);
|
||||||
y = Integer.parseInt(command[3]) + 1; // Correct the Y value
|
|
||||||
z = Integer.parseInt(command[4]);
|
|
||||||
destination = new Point4D(x, y, z, dimensionID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Teleport!
|
// Teleport!
|
||||||
DDTeleporter.teleportEntity(targetPlayer, destination, checkOrientation);
|
DDTeleporter.teleportEntity(targetPlayer, destination, checkOrientation);
|
||||||
return DDCommandResult.SUCCESS;
|
return DDCommandResult.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isInteger(String input)
|
private static boolean isInteger(String input) {
|
||||||
{
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
Integer.parseInt(input);
|
Integer.parseInt(input);
|
||||||
return true;
|
return true;
|
||||||
}
|
} catch(Exception e) {
|
||||||
catch(Exception e)
|
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.zixiken.dimdoors.commands;
|
||||||
import net.minecraft.command.CommandBase;
|
import net.minecraft.command.CommandBase;
|
||||||
import net.minecraft.command.ICommand;
|
import net.minecraft.command.ICommand;
|
||||||
import net.minecraft.command.ICommandSender;
|
import net.minecraft.command.ICommandSender;
|
||||||
|
import net.minecraft.command.PlayerNotFoundException;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.util.ChatComponentText;
|
import net.minecraft.util.ChatComponentText;
|
||||||
|
|
||||||
|
@ -62,10 +63,15 @@ public abstract class DDCommandBase extends CommandBase
|
||||||
* to provide the sending player directly.
|
* to provide the sending player directly.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public final void processCommand(ICommandSender sender, String[] command)
|
public final void processCommand(ICommandSender sender, String[] command) {
|
||||||
{
|
|
||||||
//Forward the command
|
//Forward the command
|
||||||
EntityPlayer player = getCommandSenderAsPlayer(sender);
|
EntityPlayer player = null;
|
||||||
|
try {
|
||||||
|
player = getCommandSenderAsPlayer(sender);
|
||||||
|
} catch (PlayerNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
DDCommandResult result = processCommand(player, command);
|
DDCommandResult result = processCommand(player, command);
|
||||||
|
|
||||||
//If the command failed, send the player a status message.
|
//If the command failed, send the player a status message.
|
||||||
|
@ -99,10 +105,4 @@ public abstract class DDCommandBase extends CommandBase
|
||||||
{
|
{
|
||||||
return this.getCommandName().compareTo(command.getCommandName());
|
return this.getCommandName().compareTo(command.getCommandName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compareTo(Object other)
|
|
||||||
{
|
|
||||||
return this.compareTo((ICommand) other);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,40 +17,33 @@ public class DDCommandResult {
|
||||||
private String message;
|
private String message;
|
||||||
private boolean printUsage;
|
private boolean printUsage;
|
||||||
|
|
||||||
private DDCommandResult(int code, String message, boolean printUsage)
|
private DDCommandResult(int code, String message, boolean printUsage) {
|
||||||
{
|
|
||||||
this.code = code;
|
this.code = code;
|
||||||
this.message = message;
|
this.message = message;
|
||||||
this.printUsage = printUsage;
|
this.printUsage = printUsage;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DDCommandResult(String message)
|
public DDCommandResult(String message) {
|
||||||
{
|
|
||||||
this(CUSTOM_ERROR_CODE, message, false);
|
this(CUSTOM_ERROR_CODE, message, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DDCommandResult(String message, boolean printUsage)
|
public DDCommandResult(String message, boolean printUsage) {
|
||||||
{
|
|
||||||
this(CUSTOM_ERROR_CODE, message, printUsage);
|
this(CUSTOM_ERROR_CODE, message, printUsage);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean failed()
|
public boolean failed() {
|
||||||
{
|
|
||||||
return (code != 0);
|
return (code != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getCode()
|
public int getCode() {
|
||||||
{
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getMessage()
|
public String getMessage() {
|
||||||
{
|
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean shouldPrintUsage()
|
public boolean shouldPrintUsage() {
|
||||||
{
|
|
||||||
return printUsage;
|
return printUsage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,7 @@ import com.zixiken.dimdoors.dungeon.pack.DungeonType;
|
||||||
import com.zixiken.dimdoors.helpers.DungeonHelper;
|
import com.zixiken.dimdoors.helpers.DungeonHelper;
|
||||||
import com.zixiken.dimdoors.schematic.InvalidSchematicException;
|
import com.zixiken.dimdoors.schematic.InvalidSchematicException;
|
||||||
|
|
||||||
public class DungeonData
|
public class DungeonData {
|
||||||
{
|
|
||||||
private final int weight;
|
private final int weight;
|
||||||
private final boolean isOpen;
|
private final boolean isOpen;
|
||||||
private final boolean isInternal;
|
private final boolean isInternal;
|
||||||
|
@ -15,8 +14,7 @@ public class DungeonData
|
||||||
private final String schematicName;
|
private final String schematicName;
|
||||||
private final DungeonType dungeonType;
|
private final DungeonType dungeonType;
|
||||||
|
|
||||||
public DungeonData(String schematicPath, boolean isInternal, DungeonType dungeonType, boolean isOpen, int weight)
|
public DungeonData(String schematicPath, boolean isInternal, DungeonType dungeonType, boolean isOpen, int weight) {
|
||||||
{
|
|
||||||
this.schematicPath = schematicPath;
|
this.schematicPath = schematicPath;
|
||||||
this.schematicName = getSchematicName(schematicPath);
|
this.schematicName = getSchematicName(schematicPath);
|
||||||
this.dungeonType = dungeonType;
|
this.dungeonType = dungeonType;
|
||||||
|
@ -25,8 +23,7 @@ public class DungeonData
|
||||||
this.weight = weight;
|
this.weight = weight;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getSchematicName(String schematicPath)
|
private static String getSchematicName(String schematicPath) {
|
||||||
{
|
|
||||||
int indexA = schematicPath.lastIndexOf('\\');
|
int indexA = schematicPath.lastIndexOf('\\');
|
||||||
int indexB = schematicPath.lastIndexOf('/');
|
int indexB = schematicPath.lastIndexOf('/');
|
||||||
indexA = Math.max(indexA, indexB) + 1;
|
indexA = Math.max(indexA, indexB) + 1;
|
||||||
|
@ -34,44 +31,34 @@ public class DungeonData
|
||||||
return schematicPath.substring(indexA, schematicPath.length() - DungeonHelper.SCHEMATIC_FILE_EXTENSION.length());
|
return schematicPath.substring(indexA, schematicPath.length() - DungeonHelper.SCHEMATIC_FILE_EXTENSION.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
public int weight()
|
public int weight() {
|
||||||
{
|
|
||||||
return weight;
|
return weight;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isOpen()
|
public boolean isOpen() {
|
||||||
{
|
|
||||||
return isOpen;
|
return isOpen;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInternal()
|
public boolean isInternal() {
|
||||||
{
|
|
||||||
return isInternal;
|
return isInternal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String schematicPath()
|
public String schematicPath() {
|
||||||
{
|
|
||||||
return schematicPath;
|
return schematicPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DungeonType dungeonType()
|
public DungeonType dungeonType() {
|
||||||
{
|
|
||||||
return dungeonType;
|
return dungeonType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String schematicName()
|
public String schematicName() {
|
||||||
{
|
|
||||||
return schematicName;
|
return schematicName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DungeonSchematic loadSchematic() throws InvalidSchematicException, FileNotFoundException
|
public DungeonSchematic loadSchematic() throws InvalidSchematicException, FileNotFoundException {
|
||||||
{
|
if (isInternal) {
|
||||||
if (isInternal)
|
|
||||||
{
|
|
||||||
return DungeonSchematic.readFromResource(schematicPath);
|
return DungeonSchematic.readFromResource(schematicPath);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
return DungeonSchematic.readFromFile(schematicPath);
|
return DungeonSchematic.readFromFile(schematicPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,15 +13,19 @@ import com.zixiken.dimdoors.config.DDProperties;
|
||||||
import com.zixiken.dimdoors.core.DimLink;
|
import com.zixiken.dimdoors.core.DimLink;
|
||||||
import com.zixiken.dimdoors.core.LinkType;
|
import com.zixiken.dimdoors.core.LinkType;
|
||||||
import com.zixiken.dimdoors.core.PocketManager;
|
import com.zixiken.dimdoors.core.PocketManager;
|
||||||
|
import com.zixiken.dimdoors.helpers.BlockPosHelper;
|
||||||
|
import com.zixiken.dimdoors.helpers.EnumFacingHelper;
|
||||||
import com.zixiken.dimdoors.ticking.CustomLimboPopulator;
|
import com.zixiken.dimdoors.ticking.CustomLimboPopulator;
|
||||||
import com.zixiken.dimdoors.ticking.MobMonolith;
|
import com.zixiken.dimdoors.ticking.MobMonolith;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.tileentity.TileEntitySign;
|
import net.minecraft.tileentity.TileEntitySign;
|
||||||
import net.minecraft.util.BlockPos;
|
import net.minecraft.util.BlockPos;
|
||||||
|
import net.minecraft.util.ChatComponentText;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import com.zixiken.dimdoors.core.NewDimData;
|
import com.zixiken.dimdoors.core.NewDimData;
|
||||||
|
@ -93,7 +97,7 @@ public class DungeonSchematic extends Schematic {
|
||||||
Blocks.end_portal_frame, Blocks.sandstone);applyFilter(finder);
|
Blocks.end_portal_frame, Blocks.sandstone);applyFilter(finder);
|
||||||
|
|
||||||
//Flip the entrance's orientation to get the dungeon's orientation
|
//Flip the entrance's orientation to get the dungeon's orientation
|
||||||
orientation = BlockRotator.transformMetadata(finder.getEntranceOrientation(), 2, Blocks.oak_door);
|
orientation = EnumFacingHelper.getFacingFromBlockState(BlockRotator.transform(Blocks.oak_door.getDefaultState(), 2));
|
||||||
|
|
||||||
entranceDoorLocation = finder.getEntranceDoorLocation();
|
entranceDoorLocation = finder.getEntranceDoorLocation();
|
||||||
exitDoorLocations = finder.getExitDoorLocations();
|
exitDoorLocations = finder.getExitDoorLocations();
|
||||||
|
@ -108,8 +112,7 @@ public class DungeonSchematic extends Schematic {
|
||||||
applyFilter(standardizer);
|
applyFilter(standardizer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void applyExportFilters(DDProperties properties)
|
public void applyExportFilters(DDProperties properties) {
|
||||||
{
|
|
||||||
//Check if some block IDs assigned by Forge differ from our standard IDs
|
//Check if some block IDs assigned by Forge differ from our standard IDs
|
||||||
//If so, change the IDs to standard values
|
//If so, change the IDs to standard values
|
||||||
CompoundFilter standardizer = new CompoundFilter();
|
CompoundFilter standardizer = new CompoundFilter();
|
||||||
|
@ -121,16 +124,12 @@ public class DungeonSchematic extends Schematic {
|
||||||
applyFilter(standardizer);
|
applyFilter(standardizer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DungeonSchematic copyFromWorld(World world, int x, int y, int z, short width, short height, short length, boolean doCompactBounds)
|
public static DungeonSchematic copyFromWorld(World world, BlockPos pos, BlockPos size, boolean doCompactBounds) {
|
||||||
{
|
return new DungeonSchematic(Schematic.copyFromWorld(world, pos, size, doCompactBounds));
|
||||||
return new DungeonSchematic(Schematic.copyFromWorld(world, x, y, z, width, height, length, doCompactBounds));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void copyToWorld(World world, BlockPos pocketCenter, int targetOrientation, DimLink entryLink,
|
public void copyToWorld(World world, BlockPos pocketCenter, EnumFacing targetOrientation, DimLink entryLink, Random random, DDProperties properties, boolean notifyClients) {
|
||||||
Random random, DDProperties properties, boolean notifyClients)
|
if (notifyClients) {
|
||||||
{
|
|
||||||
if (notifyClients)
|
|
||||||
{
|
|
||||||
copyToWorld(world, pocketCenter, targetOrientation, entryLink, random, properties, new WorldBlockSetter(false, true, false));
|
copyToWorld(world, pocketCenter, targetOrientation, entryLink, random, properties, new WorldBlockSetter(false, true, false));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -139,39 +138,32 @@ public class DungeonSchematic extends Schematic {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void copyToWorld(World world, BlockPos pocketCenter, int targetOrientation, DimLink entryLink, Random random, DDProperties properties, IBlockSetter blockSetter)
|
public void copyToWorld(World world, BlockPos pocketCenter, EnumFacing targetOrientation, DimLink entryLink, Random random, DDProperties properties, IBlockSetter blockSetter) {
|
||||||
{
|
|
||||||
//TODO: This function is an improvised solution so we can get the release moving. In the future,
|
//TODO: This function is an improvised solution so we can get the release moving. In the future,
|
||||||
//we should generalize block transformations and implement support for them at the level of Schematic,
|
//we should generalize block transformations and implement support for them at the level of Schematic,
|
||||||
//then just use that support from DungeonSchematic instead of making this local fix.
|
//then just use that support from DungeonSchematic instead of making this local fix.
|
||||||
//It might be easiest to support transformations using a WorldOperation
|
//It might be easiest to support transformations using a WorldOperation
|
||||||
|
|
||||||
final int turnAngle = targetOrientation - this.orientation;
|
EnumFacing turnAngle = EnumFacing.getHorizontal(targetOrientation.getHorizontalIndex() - orientation.getHorizontalIndex());
|
||||||
|
|
||||||
int index;
|
int index;
|
||||||
int count;
|
int count;
|
||||||
Block block;
|
IBlockState state;
|
||||||
int blockMeta;
|
|
||||||
int dx, dy, dz;
|
int dx, dy, dz;
|
||||||
BlockPos pocketPoint = new BlockPos(0, 0, 0);
|
BlockPos pocketPoint = new BlockPos(0, 0, 0);
|
||||||
|
|
||||||
//Copy blocks and metadata into the world
|
//Copy blocks and metadata into the world
|
||||||
index = 0;
|
index = 0;
|
||||||
for (dy = 0; dy < height; dy++)
|
for (dy = 0; dy < volume.getY(); dy++) {
|
||||||
{
|
for (dz = 0; dz < volume.getZ(); dz++) {
|
||||||
for (dz = 0; dz < length; dz++)
|
for (dx = 0; dx < volume.getX(); dx++) {
|
||||||
{
|
pocketPoint = new BlockPos(dx, dy, dz);
|
||||||
for (dx = 0; dx < width; dx++)
|
state = states[index];
|
||||||
{
|
|
||||||
pocketPoint.setX(dx);
|
|
||||||
pocketPoint.setY(dy);
|
|
||||||
pocketPoint.setZ(dz);
|
|
||||||
block = blocks[index];
|
|
||||||
BlockRotator.transformPoint(pocketPoint, entranceDoorLocation, turnAngle, pocketCenter);
|
BlockRotator.transformPoint(pocketPoint, entranceDoorLocation, turnAngle, pocketCenter);
|
||||||
blockMeta = BlockRotator.transformMetadata(metadata[index], turnAngle, block);
|
state = BlockRotator.transform(states[index], turnAngle.getHorizontalIndex());
|
||||||
|
|
||||||
//In the future, we might want to make this more efficient by building whole chunks at a time
|
//In the future, we might want to make this more efficient by building whole chunks at a time
|
||||||
blockSetter.setBlock(world, pocketPoint.getX(), pocketPoint.getY(), pocketPoint.getZ(), block, blockMeta);
|
blockSetter.setBlock(world, pocketPoint, state);
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -182,25 +174,23 @@ public class DungeonSchematic extends Schematic {
|
||||||
{
|
{
|
||||||
NBTTagCompound tileTag = (NBTTagCompound) tileEntities.getCompoundTagAt(index);
|
NBTTagCompound tileTag = (NBTTagCompound) tileEntities.getCompoundTagAt(index);
|
||||||
//Rewrite its location to be in world coordinates
|
//Rewrite its location to be in world coordinates
|
||||||
pocketPoint.setX(tileTag.getInteger("x"));
|
pocketPoint = new BlockPos(tileTag.getInteger("x"), tileTag.getInteger("y"), tileTag.getInteger("z"));
|
||||||
pocketPoint.setY(tileTag.getInteger("y"));
|
|
||||||
pocketPoint.setZ(tileTag.getInteger("z"));
|
|
||||||
BlockRotator.transformPoint(pocketPoint, entranceDoorLocation, turnAngle, pocketCenter);
|
BlockRotator.transformPoint(pocketPoint, entranceDoorLocation, turnAngle, pocketCenter);
|
||||||
tileTag.setInteger("x", pocketPoint.getX());
|
tileTag.setInteger("x", pocketPoint.getX());
|
||||||
tileTag.setInteger("y", pocketPoint.getY());
|
tileTag.setInteger("y", pocketPoint.getY());
|
||||||
tileTag.setInteger("z", pocketPoint.getZ());
|
tileTag.setInteger("z", pocketPoint.getZ());
|
||||||
//Load the tile entity and put it in the world
|
//Load the tile entity and put it in the world
|
||||||
world.setTileEntity(pocketPoint.getX(), pocketPoint.getY(), pocketPoint.getZ(), TileEntity.createAndLoadEntity(tileTag));
|
world.setTileEntity(pocketPoint, TileEntity.createAndLoadEntity(tileTag));
|
||||||
}
|
}
|
||||||
|
|
||||||
setUpDungeon(PocketManager.createDimensionData(world), world, pocketCenter, turnAngle, entryLink, random, properties, blockSetter);
|
setUpDungeon(PocketManager.createDimensionData(world), world, pocketCenter, turnAngle, entryLink, random, properties, blockSetter);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpDungeon(NewDimData dimension, World world, BlockPos pocketCenter, int turnAngle, DimLink entryLink, Random random, DDProperties properties, IBlockSetter blockSetter)
|
private void setUpDungeon(NewDimData dimension, World world, BlockPos pocketCenter, EnumFacing turnAngle, DimLink entryLink, Random random, DDProperties properties, IBlockSetter blockSetter)
|
||||||
{
|
{
|
||||||
//Transform dungeon corners
|
//Transform dungeon corners
|
||||||
BlockPos minCorner = new BlockPos(0, 0, 0);
|
BlockPos minCorner = new BlockPos(0, 0, 0);
|
||||||
BlockPos maxCorner = new BlockPos(width - 1, height - 1, length - 1);
|
BlockPos maxCorner = new BlockPos(volume.subtract(BlockPosHelper.posFromSingleValue(1)));
|
||||||
transformCorners(entranceDoorLocation, pocketCenter, turnAngle, minCorner, maxCorner);
|
transformCorners(entranceDoorLocation, pocketCenter, turnAngle, minCorner, maxCorner);
|
||||||
|
|
||||||
//Fill empty chests and dispensers
|
//Fill empty chests and dispensers
|
||||||
|
@ -211,21 +201,18 @@ public class DungeonSchematic extends Schematic {
|
||||||
createEntranceReverseLink(world, dimension, pocketCenter, entryLink);
|
createEntranceReverseLink(world, dimension, pocketCenter, entryLink);
|
||||||
|
|
||||||
//Set up link data for dimensional doors
|
//Set up link data for dimensional doors
|
||||||
for (BlockPos location : dimensionalDoorLocations)
|
for (BlockPos location : dimensionalDoorLocations) {
|
||||||
{
|
|
||||||
createDimensionalDoorLink(world, dimension, location, entranceDoorLocation, turnAngle, pocketCenter);
|
createDimensionalDoorLink(world, dimension, location, entranceDoorLocation, turnAngle, pocketCenter);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Set up link data for exit door
|
//Set up link data for exit door
|
||||||
for (BlockPos location : exitDoorLocations)
|
for (BlockPos location : exitDoorLocations) {
|
||||||
{
|
|
||||||
createExitDoorLink(world, dimension, location, entranceDoorLocation, turnAngle, pocketCenter, blockSetter);
|
createExitDoorLink(world, dimension, location, entranceDoorLocation, turnAngle, pocketCenter, blockSetter);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Remove end portal frames and spawn Monoliths, if allowed
|
//Remove end portal frames and spawn Monoliths, if allowed
|
||||||
boolean canSpawn = CustomLimboPopulator.isMobSpawningAllowed();
|
boolean canSpawn = CustomLimboPopulator.isMobSpawningAllowed();
|
||||||
for (BlockPos location : monolithSpawnLocations)
|
for (BlockPos location : monolithSpawnLocations) {
|
||||||
{
|
|
||||||
spawnMonolith(world, location, entranceDoorLocation, turnAngle, pocketCenter, canSpawn, blockSetter);
|
spawnMonolith(world, location, entranceDoorLocation, turnAngle, pocketCenter, canSpawn, blockSetter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -234,82 +221,66 @@ public class DungeonSchematic extends Schematic {
|
||||||
// approach to check - if the dungeon is rooted in the Nether, then it SHOULD be a Nether dungeon.
|
// approach to check - if the dungeon is rooted in the Nether, then it SHOULD be a Nether dungeon.
|
||||||
// This isn't necessarily true if someone uses dd-rift to spawn a dungeon, but it should work under
|
// This isn't necessarily true if someone uses dd-rift to spawn a dungeon, but it should work under
|
||||||
// normal use of the mod.
|
// normal use of the mod.
|
||||||
if (dimension.root().id() == NETHER_DIMENSION_ID)
|
if (dimension.root().id() == NETHER_DIMENSION_ID) {
|
||||||
{
|
|
||||||
writeDepthSign(world, pocketCenter, dimension.depth());
|
writeDepthSign(world, pocketCenter, dimension.depth());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void transformCorners(BlockPos schematicEntrance, BlockPos pocketCenter, EnumFacing turnAngle, BlockPos minCorner, BlockPos maxCorner) {
|
private static void transformCorners(BlockPos schematicEntrance, BlockPos pocketCenter, EnumFacing turnAngle, BlockPos minCorner, BlockPos maxCorner) {
|
||||||
int temp;
|
BlockPos temp;
|
||||||
BlockRotator.transformPoint(minCorner, schematicEntrance, turnAngle, pocketCenter);
|
BlockRotator.transformPoint(minCorner, schematicEntrance, turnAngle, pocketCenter);
|
||||||
BlockRotator.transformPoint(maxCorner, schematicEntrance, turnAngle, pocketCenter);
|
BlockRotator.transformPoint(maxCorner, schematicEntrance, turnAngle, pocketCenter);
|
||||||
if (minCorner.getX() > maxCorner.getX()) {
|
|
||||||
temp = minCorner.getX();
|
temp = BlockPosHelper.min(minCorner, maxCorner);
|
||||||
minCorner = new BlockPos(maxCorner.getX(), minCorner.getY(), minCorner.getZ());
|
maxCorner = BlockPosHelper.max(minCorner, maxCorner);
|
||||||
maxCorner = new BlockPos(temp, maxCorner.getY(), maxCorner.getZ());
|
minCorner = temp;
|
||||||
} if (minCorner.getY() > maxCorner.getY()) {
|
|
||||||
temp = minCorner.getY();
|
|
||||||
minCorner.setY(maxCorner.getY());
|
|
||||||
maxCorner.setY(temp);
|
|
||||||
} if (minCorner.getZ() > maxCorner.getZ()) {
|
|
||||||
temp = minCorner.getZ();
|
|
||||||
minCorner.setZ(maxCorner.getZ());
|
|
||||||
maxCorner.setZ(temp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void createEntranceReverseLink(World world, NewDimData dimension, BlockPos pocketCenter, DimLink entryLink)
|
private static void createEntranceReverseLink(World world, NewDimData dimension, BlockPos pocketCenter, DimLink entryLink) {
|
||||||
{
|
EnumFacing orientation = EnumFacingHelper.getFacingFromBlockState(world.getBlockState(pocketCenter.down()));
|
||||||
int orientation = world.getBlockMetadata(pocketCenter.getX(), pocketCenter.getY() - 1, pocketCenter.getZ());
|
DimLink reverseLink = dimension.createLink(pocketCenter, LinkType.REVERSE, orientation);
|
||||||
DimLink reverseLink = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ(), LinkType.REVERSE, orientation);
|
|
||||||
Point4D destination = entryLink.source();
|
Point4D destination = entryLink.source();
|
||||||
NewDimData prevDim = PocketManager.getDimensionData(destination.getDimension());
|
NewDimData prevDim = PocketManager.getDimensionData(destination.getDimension());
|
||||||
prevDim.setLinkDestination(reverseLink, destination.getX(), destination.getY(), destination.getZ());
|
prevDim.setLinkDestination(reverseLink, destination.toBlockPos());
|
||||||
initDoorTileEntity(world, pocketCenter);
|
initDoorTileEntity(world, pocketCenter);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void createExitDoorLink(World world, NewDimData dimension, BlockPos point, BlockPos entrance, EnumFacing rotation, BlockPos pocketCenter, IBlockSetter blockSetter)
|
private static void createExitDoorLink(World world, NewDimData dimension, BlockPos point, BlockPos entrance, EnumFacing rotation, BlockPos pocketCenter, IBlockSetter blockSetter) {
|
||||||
|
//Transform the door's location to the pocket coordinate system
|
||||||
|
BlockPos location = point;
|
||||||
|
BlockRotator.transformPoint(location, entrance, rotation, pocketCenter);
|
||||||
|
EnumFacing orientation = EnumFacingHelper.getFacingFromBlockState(world.getBlockState(location.down()));
|
||||||
|
dimension.createLink(location, LinkType.DUNGEON_EXIT, orientation);
|
||||||
|
//Replace the sandstone block under the exit door with the same block as the one underneath it
|
||||||
|
location = location.down(3);
|
||||||
|
|
||||||
|
if (location.getY() >= 0) {
|
||||||
|
IBlockState state = world.getBlockState(location);
|
||||||
|
blockSetter.setBlock(world, location.up(), state);
|
||||||
|
}
|
||||||
|
|
||||||
|
initDoorTileEntity(world, location);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void createDimensionalDoorLink(World world, NewDimData dimension, BlockPos point, BlockPos entrance, EnumFacing rotation, BlockPos pocketCenter)
|
||||||
{
|
{
|
||||||
//Transform the door's location to the pocket coordinate system
|
//Transform the door's location to the pocket coordinate system
|
||||||
BlockPos location = point;
|
BlockPos location = point;
|
||||||
BlockRotator.transformPoint(location, entrance, rotation, pocketCenter);
|
BlockRotator.transformPoint(location, entrance, rotation, pocketCenter);
|
||||||
int orientation = world.getBlockMetadata(location.getX(), location.getY() - 1, location.getZ());
|
EnumFacing orientation = EnumFacingHelper.getFacingFromBlockState(world.getBlockState(location.down()));
|
||||||
dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkType.DUNGEON_EXIT, orientation);
|
|
||||||
//Replace the sandstone block under the exit door with the same block as the one underneath it
|
|
||||||
int x = location.getX();
|
|
||||||
int y = location.getY() - 3;
|
|
||||||
int z = location.getZ();
|
|
||||||
if (y >= 0)
|
|
||||||
{
|
|
||||||
Block block = world.getBlock(x, y, z);
|
|
||||||
int metadata = world.getBlockMetadata(x, y, z);
|
|
||||||
blockSetter.setBlock(world, x, y + 1, z, block, metadata);
|
|
||||||
}
|
|
||||||
initDoorTileEntity(world, location);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void createDimensionalDoorLink(World world, NewDimData dimension, BlockPos point, BlockPos entrance, int rotation, BlockPos pocketCenter)
|
|
||||||
{
|
|
||||||
//Transform the door's location to the pocket coordinate system
|
|
||||||
BlockPos location = point.clone();
|
|
||||||
BlockRotator.transformPoint(location, entrance, rotation, pocketCenter);
|
|
||||||
int orientation = world.getBlockMetadata(location.getX(), location.getY() - 1, location.getZ());
|
|
||||||
|
|
||||||
dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkType.DUNGEON, orientation);
|
dimension.createLink(location, LinkType.DUNGEON, orientation);
|
||||||
initDoorTileEntity(world, location);
|
initDoorTileEntity(world, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void spawnMonolith(World world, BlockPos point, BlockPos entrance, int rotation, BlockPos pocketCenter, boolean canSpawn, IBlockSetter blockSetter)
|
private static void spawnMonolith(World world, BlockPos point, BlockPos entrance, EnumFacing rotation, BlockPos pocketCenter, boolean canSpawn, IBlockSetter blockSetter) {
|
||||||
{
|
|
||||||
//Transform the frame block's location to the pocket coordinate system
|
//Transform the frame block's location to the pocket coordinate system
|
||||||
BlockPos location = point.clone();
|
BlockPos location = point;
|
||||||
BlockRotator.transformPoint(location, entrance, rotation, pocketCenter);
|
BlockRotator.transformPoint(location, entrance, rotation, pocketCenter);
|
||||||
//Remove frame block
|
//Remove frame block
|
||||||
blockSetter.setBlock(world, location.getX(), location.getY(), location.getZ(), Blocks.air, 0);
|
blockSetter.setBlock(world, location, Blocks.air.getDefaultState());
|
||||||
//Spawn Monolith
|
//Spawn Monolith
|
||||||
if (canSpawn)
|
if (canSpawn) {
|
||||||
{
|
|
||||||
Entity mob = new MobMonolith(world);
|
Entity mob = new MobMonolith(world);
|
||||||
mob.setLocationAndAngles(location.getX(), location.getY(), location.getZ(), 1, 1);
|
mob.setLocationAndAngles(location.getX(), location.getY(), location.getZ(), 1, 1);
|
||||||
world.spawnEntityInWorld(mob);
|
world.spawnEntityInWorld(mob);
|
||||||
|
@ -318,43 +289,34 @@ public class DungeonSchematic extends Schematic {
|
||||||
|
|
||||||
private static void initDoorTileEntity(World world, BlockPos point)
|
private static void initDoorTileEntity(World world, BlockPos point)
|
||||||
{
|
{
|
||||||
Block door = world.getBlock(point.getX(), point.getY(), point.getZ());
|
IBlockState door = world.getBlockState(point);
|
||||||
Block door2 = world.getBlock(point.getX(), point.getY() - 1, point.getZ());
|
IBlockState door2 = world.getBlockState(point.down());
|
||||||
|
|
||||||
if (door instanceof IDimDoor && door2 instanceof IDimDoor)
|
if (door instanceof IDimDoor && door2 instanceof IDimDoor) {
|
||||||
{
|
((IDimDoor) door).initDoorTE(world, point);
|
||||||
((IDimDoor) door).initDoorTE(world, point.getX(), point.getY(), point.getZ());
|
((IDimDoor) door).initDoorTE(world, point.down());
|
||||||
((IDimDoor) door).initDoorTE(world, point.getX(), point.getY() - 1, point.getZ());
|
} else {
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("Tried to init a dim door TE on a block that isnt a Dim Door!!");
|
throw new IllegalArgumentException("Tried to init a dim door TE on a block that isnt a Dim Door!!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void writeDepthSign(World world, BlockPos pocketCenter, int depth)
|
private static void writeDepthSign(World world, BlockPos pocketCenter, int depth) {
|
||||||
{
|
|
||||||
final int SEARCH_RANGE = 6;
|
final int SEARCH_RANGE = 6;
|
||||||
|
|
||||||
int x, y, z;
|
BlockPos pos;
|
||||||
Block block;
|
Block block;
|
||||||
int dx, dy, dz;
|
int dx, dy, dz;
|
||||||
|
|
||||||
for (dy = SEARCH_RANGE; dy >= -SEARCH_RANGE; dy--)
|
for (dy = SEARCH_RANGE; dy >= -SEARCH_RANGE; dy--) {
|
||||||
{
|
for (dz = -SEARCH_RANGE; dz <= SEARCH_RANGE; dz++) {
|
||||||
for (dz = -SEARCH_RANGE; dz <= SEARCH_RANGE; dz++)
|
for (dx = -SEARCH_RANGE; dx <= SEARCH_RANGE; dx++) {
|
||||||
{
|
pos = pocketCenter.add(dx, dy, dz);
|
||||||
for (dx = -SEARCH_RANGE; dx <= SEARCH_RANGE; dx++)
|
|
||||||
{
|
block = world.getBlockState(pos).getBlock();
|
||||||
x = pocketCenter.getX() + dx;
|
if (block == Blocks.wall_sign || block == Blocks.standing_sign) {
|
||||||
y = pocketCenter.getY() + dy;
|
|
||||||
z = pocketCenter.getZ() + dz;
|
|
||||||
block = world.getBlock(x, y, z);
|
|
||||||
if (block == Blocks.wall_sign || block == Blocks.standing_sign)
|
|
||||||
{
|
|
||||||
TileEntitySign signEntity = new TileEntitySign();
|
TileEntitySign signEntity = new TileEntitySign();
|
||||||
signEntity.signText[1] = "Level " + depth;
|
signEntity.signText[1] = new ChatComponentText("Level " + depth);
|
||||||
world.setTileEntity(x, y, z, signEntity);
|
world.setTileEntity(pocketCenter, signEntity);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,52 +4,45 @@ import java.util.Random;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockContainer;
|
import net.minecraft.block.BlockContainer;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.inventory.IInventory;
|
import net.minecraft.inventory.IInventory;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.tileentity.TileEntityChest;
|
import net.minecraft.tileentity.TileEntityChest;
|
||||||
|
import net.minecraft.util.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import com.zixiken.dimdoors.DDLoot;
|
import com.zixiken.dimdoors.DDLoot;
|
||||||
import com.zixiken.dimdoors.config.DDProperties;
|
import com.zixiken.dimdoors.config.DDProperties;
|
||||||
import com.zixiken.dimdoors.schematic.WorldOperation;
|
import com.zixiken.dimdoors.schematic.WorldOperation;
|
||||||
|
|
||||||
public class FillContainersOperation extends WorldOperation
|
public class FillContainersOperation extends WorldOperation {
|
||||||
{
|
|
||||||
private Random random;
|
private Random random;
|
||||||
private DDProperties properties;
|
private DDProperties properties;
|
||||||
|
|
||||||
private static final int GRAVE_CHEST_CHANCE = 1;
|
private static final int GRAVE_CHEST_CHANCE = 1;
|
||||||
private static final int MAX_GRAVE_CHEST_CHANCE = 6;
|
private static final int MAX_GRAVE_CHEST_CHANCE = 6;
|
||||||
|
|
||||||
public FillContainersOperation(Random random, DDProperties properties)
|
public FillContainersOperation(Random random, DDProperties properties) {
|
||||||
{
|
|
||||||
super("FillContainersOperation");
|
super("FillContainersOperation");
|
||||||
this.random = random;
|
this.random = random;
|
||||||
this.properties = properties;
|
this.properties = properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean applyToBlock(World world, int x, int y, int z)
|
protected boolean applyToBlock(World world, BlockPos pos) {
|
||||||
{
|
IBlockState state = world.getBlockState(pos);
|
||||||
Block block = world.getBlock(x, y, z);
|
|
||||||
|
|
||||||
// Fill empty chests and dispensers
|
// Fill empty chests and dispensers
|
||||||
if (block instanceof BlockContainer)
|
if (state.getBlock() instanceof BlockContainer) {
|
||||||
{
|
TileEntity tileEntity = world.getTileEntity(pos);
|
||||||
TileEntity tileEntity = world.getTileEntity(x, y, z);
|
|
||||||
|
|
||||||
// Fill chests
|
// Fill chests
|
||||||
if (tileEntity instanceof TileEntityChest)
|
if (tileEntity instanceof TileEntityChest) {
|
||||||
{
|
|
||||||
TileEntityChest chest = (TileEntityChest) tileEntity;
|
TileEntityChest chest = (TileEntityChest) tileEntity;
|
||||||
if (isInventoryEmpty(chest))
|
if (isInventoryEmpty(chest)) {
|
||||||
{
|
|
||||||
// Randomly choose whether this will be a regular dungeon chest or a grave chest
|
// Randomly choose whether this will be a regular dungeon chest or a grave chest
|
||||||
if (random.nextInt(MAX_GRAVE_CHEST_CHANCE) < GRAVE_CHEST_CHANCE)
|
if (random.nextInt(MAX_GRAVE_CHEST_CHANCE) < GRAVE_CHEST_CHANCE) {
|
||||||
{
|
|
||||||
DDLoot.fillGraveChest(chest, random, properties);
|
DDLoot.fillGraveChest(chest, random, properties);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
DDLoot.generateChestContents(DDLoot.dungeonChestInfo, chest, random);
|
DDLoot.generateChestContents(DDLoot.dungeonChestInfo, chest, random);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,13 +51,10 @@ public class FillContainersOperation extends WorldOperation
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isInventoryEmpty(IInventory inventory)
|
private static boolean isInventoryEmpty(IInventory inventory) {
|
||||||
{
|
|
||||||
int size = inventory.getSizeInventory();
|
int size = inventory.getSizeInventory();
|
||||||
for (int index = 0; index < size; index++)
|
for (int index = 0; index < size; index++) {
|
||||||
{
|
if (inventory.getStackInSlot(index) != null) {
|
||||||
if (inventory.getStackInSlot(index) != null)
|
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,8 +11,7 @@ public class ModBlockFilter extends SchematicFilter {
|
||||||
private List<Block> exceptions;
|
private List<Block> exceptions;
|
||||||
private IBlockState replacementState;
|
private IBlockState replacementState;
|
||||||
|
|
||||||
public ModBlockFilter(List<Block> exceptions, IBlockState state)
|
public ModBlockFilter(List<Block> exceptions, IBlockState state) {
|
||||||
{
|
|
||||||
super("ModBlockFilter");
|
super("ModBlockFilter");
|
||||||
this.exceptions = exceptions;
|
this.exceptions = exceptions;
|
||||||
this.replacementState = state;
|
this.replacementState = state;
|
||||||
|
@ -38,8 +37,7 @@ public class ModBlockFilter extends SchematicFilter {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean terminates()
|
protected boolean terminates() {
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,9 +2,6 @@ package com.zixiken.dimdoors.helpers;
|
||||||
|
|
||||||
import net.minecraft.util.BlockPos;
|
import net.minecraft.util.BlockPos;
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Jared Johnson on 6/22/2016.
|
|
||||||
*/
|
|
||||||
public class BlockPosHelper {
|
public class BlockPosHelper {
|
||||||
public static boolean between(BlockPos pos, BlockPos min, BlockPos max) {
|
public static boolean between(BlockPos pos, BlockPos min, BlockPos max) {
|
||||||
return ((min.getX() <= pos.getX() && pos.getX() <= max.getX()) &&
|
return ((min.getX() <= pos.getX() && pos.getX() <= max.getX()) &&
|
||||||
|
@ -27,4 +24,12 @@ public class BlockPosHelper {
|
||||||
public static boolean lessThan(BlockPos a, BlockPos b) {
|
public static boolean lessThan(BlockPos a, BlockPos b) {
|
||||||
return (a.getX() < b.getX() && a.getY() < b.getY() && a.getZ() < b.getZ());
|
return (a.getX() < b.getX() && a.getY() < b.getY() && a.getZ() < b.getZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean lessThanOrEqual(BlockPos a, BlockPos b) {
|
||||||
|
return (a.getX() <= b.getX() && a.getY() <= b.getY() && a.getZ() <= b.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BlockPos posFromSingleValue(int value) {
|
||||||
|
return new BlockPos(value, value, value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,410 +0,0 @@
|
||||||
package com.zixiken.dimdoors.helpers;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.init.Blocks;
|
|
||||||
|
|
||||||
public class BlockRotationHelper
|
|
||||||
{
|
|
||||||
public HashMap<Integer,HashMap<Block,HashMap<Integer,Integer>>> rotationMappings = new HashMap<Integer,HashMap<Block,HashMap<Integer,Integer>>>();
|
|
||||||
|
|
||||||
public BlockRotationHelper()
|
|
||||||
{
|
|
||||||
this.InitializeRotationMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void InitializeRotationMap()
|
|
||||||
{
|
|
||||||
HashMap<Block,HashMap<Integer, Integer>> orientation0 = new HashMap<Block,HashMap<Integer, Integer>>();
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> stairs0 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
stairs0.put(0, 2);
|
|
||||||
stairs0.put(1, 3);
|
|
||||||
stairs0.put(2, 1);
|
|
||||||
stairs0.put(3, 0);
|
|
||||||
stairs0.put(7, 4);
|
|
||||||
stairs0.put(6, 5);
|
|
||||||
stairs0.put(5, 7);
|
|
||||||
stairs0.put(4, 6);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> chestsLadders0 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
chestsLadders0.put(2, 5);
|
|
||||||
chestsLadders0.put(3, 4);
|
|
||||||
chestsLadders0.put(4, 2);
|
|
||||||
chestsLadders0.put(5, 3);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> vine0 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
vine0.put(1, 2);
|
|
||||||
vine0.put(2, 4);
|
|
||||||
vine0.put(4, 8);
|
|
||||||
vine0.put(8, 1);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> leverButtonTorch0 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
leverButtonTorch0.put(12, 9);
|
|
||||||
leverButtonTorch0.put(11, 10);
|
|
||||||
leverButtonTorch0.put(10, 12);
|
|
||||||
leverButtonTorch0.put(9, 11);
|
|
||||||
leverButtonTorch0.put(2, 4);
|
|
||||||
leverButtonTorch0.put(3, 2);
|
|
||||||
leverButtonTorch0.put(1, 3);
|
|
||||||
leverButtonTorch0.put(4, 1);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> pistonDropperDispenser0 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
pistonDropperDispenser0.put(4, 2);
|
|
||||||
pistonDropperDispenser0.put(5, 3);
|
|
||||||
pistonDropperDispenser0.put(13, 11);
|
|
||||||
pistonDropperDispenser0.put(3, 4);
|
|
||||||
pistonDropperDispenser0.put(2, 5);
|
|
||||||
pistonDropperDispenser0.put(11, 12);
|
|
||||||
pistonDropperDispenser0.put(10, 13);
|
|
||||||
pistonDropperDispenser0.put(12, 10);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> repeaterComparatorDoorTripwire0 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
repeaterComparatorDoorTripwire0.put(0, 1);
|
|
||||||
repeaterComparatorDoorTripwire0.put(1, 2);
|
|
||||||
repeaterComparatorDoorTripwire0.put(2, 3);
|
|
||||||
repeaterComparatorDoorTripwire0.put(3, 0);
|
|
||||||
repeaterComparatorDoorTripwire0.put(4, 5);
|
|
||||||
repeaterComparatorDoorTripwire0.put(5, 6);
|
|
||||||
repeaterComparatorDoorTripwire0.put(6, 7);
|
|
||||||
repeaterComparatorDoorTripwire0.put(7, 4);
|
|
||||||
repeaterComparatorDoorTripwire0.put(8, 9);
|
|
||||||
repeaterComparatorDoorTripwire0.put(9, 10);
|
|
||||||
repeaterComparatorDoorTripwire0.put(10, 11);
|
|
||||||
repeaterComparatorDoorTripwire0.put(11, 8);
|
|
||||||
repeaterComparatorDoorTripwire0.put(12, 13);
|
|
||||||
repeaterComparatorDoorTripwire0.put(13, 14);
|
|
||||||
repeaterComparatorDoorTripwire0.put(14, 15);
|
|
||||||
repeaterComparatorDoorTripwire0.put(15, 12);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> rails0 = new HashMap<Integer,Integer>();
|
|
||||||
rails0.put(0, 1);
|
|
||||||
rails0.put(1, 0);
|
|
||||||
rails0.put(8, 9);
|
|
||||||
rails0.put(9, 6);
|
|
||||||
rails0.put(6, 7);
|
|
||||||
rails0.put(7, 8);
|
|
||||||
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> railsSpecial0 = new HashMap<Integer,Integer>();
|
|
||||||
railsSpecial0.put(0, 1);
|
|
||||||
railsSpecial0.put(1, 0);
|
|
||||||
railsSpecial0.put(8, 9);
|
|
||||||
railsSpecial0.put(9, 8);
|
|
||||||
|
|
||||||
|
|
||||||
HashMap<Block,HashMap<Integer, Integer>> orientation1 = new HashMap<Block,HashMap<Integer, Integer>>();
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> stairs1 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
stairs1.put(0, 1);
|
|
||||||
stairs1.put(1, 0);
|
|
||||||
stairs1.put(2, 3);
|
|
||||||
stairs1.put(3, 2);
|
|
||||||
stairs1.put(7, 6);
|
|
||||||
stairs1.put(6, 7);
|
|
||||||
stairs1.put(5, 4);
|
|
||||||
stairs1.put(4, 5);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> chestsLadders1 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
chestsLadders1.put(2, 3);
|
|
||||||
chestsLadders1.put(3, 2);
|
|
||||||
chestsLadders1.put(4, 5);
|
|
||||||
chestsLadders1.put(5, 4);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> vine1 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
vine1.put(1, 4);
|
|
||||||
vine1.put(2, 8);
|
|
||||||
vine1.put(4, 1);
|
|
||||||
vine1.put(8, 2);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> leverButtonTorch1 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
leverButtonTorch1.put(12, 9);
|
|
||||||
leverButtonTorch1.put(11, 10);
|
|
||||||
leverButtonTorch1.put(10, 12);
|
|
||||||
leverButtonTorch1.put(9, 11);
|
|
||||||
leverButtonTorch1.put(2, 4);
|
|
||||||
leverButtonTorch1.put(3, 2);
|
|
||||||
leverButtonTorch1.put(1, 3);
|
|
||||||
leverButtonTorch1.put(4, 1);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> pistonDropperDispenser1 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
pistonDropperDispenser1.put(12, 11);
|
|
||||||
pistonDropperDispenser1.put(11, 12);
|
|
||||||
pistonDropperDispenser1.put(10, 9);
|
|
||||||
pistonDropperDispenser1.put(9, 10);
|
|
||||||
pistonDropperDispenser1.put(2, 1);
|
|
||||||
pistonDropperDispenser1.put(3, 4);
|
|
||||||
pistonDropperDispenser1.put(1, 2);
|
|
||||||
pistonDropperDispenser1.put(4,3);
|
|
||||||
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> repeaterComparatorDoorTripwire1 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
repeaterComparatorDoorTripwire1.put(0, 2);
|
|
||||||
repeaterComparatorDoorTripwire1.put(1, 3);
|
|
||||||
repeaterComparatorDoorTripwire1.put(2, 0);
|
|
||||||
repeaterComparatorDoorTripwire1.put(3, 1);
|
|
||||||
repeaterComparatorDoorTripwire1.put(4, 6);
|
|
||||||
repeaterComparatorDoorTripwire1.put(5, 7);
|
|
||||||
repeaterComparatorDoorTripwire1.put(6, 4);
|
|
||||||
repeaterComparatorDoorTripwire1.put(7, 5);
|
|
||||||
repeaterComparatorDoorTripwire1.put(8, 10);
|
|
||||||
repeaterComparatorDoorTripwire1.put(9, 11);
|
|
||||||
repeaterComparatorDoorTripwire1.put(10, 8);
|
|
||||||
repeaterComparatorDoorTripwire1.put(11, 9);
|
|
||||||
repeaterComparatorDoorTripwire1.put(12, 14);
|
|
||||||
repeaterComparatorDoorTripwire1.put(13, 15);
|
|
||||||
repeaterComparatorDoorTripwire1.put(14, 12);
|
|
||||||
repeaterComparatorDoorTripwire1.put(15, 13);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> rails1 = new HashMap<Integer,Integer>();
|
|
||||||
rails1.put(0, 0);
|
|
||||||
rails1.put(1, 1);
|
|
||||||
rails1.put(8, 6);
|
|
||||||
rails1.put(9, 7);
|
|
||||||
rails1.put(6, 8);
|
|
||||||
rails1.put(7, 9);
|
|
||||||
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> railsSpecial1 = new HashMap<Integer,Integer>();
|
|
||||||
railsSpecial1.put(1, 1);
|
|
||||||
railsSpecial1.put(0, 0);
|
|
||||||
railsSpecial1.put(8, 8);
|
|
||||||
railsSpecial1.put(9, 9);
|
|
||||||
|
|
||||||
HashMap<Block,HashMap<Integer, Integer>> orientation2 = new HashMap<Block,HashMap<Integer, Integer>>();
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> stairs2 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
stairs2.put(2, 0);
|
|
||||||
stairs2.put(3, 1);
|
|
||||||
stairs2.put(1, 2);
|
|
||||||
stairs2.put(0, 3);
|
|
||||||
stairs2.put(4, 7);
|
|
||||||
stairs2.put(5, 6);
|
|
||||||
stairs2.put(7, 5);
|
|
||||||
stairs2.put(6, 4);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> chestsLadders2 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
chestsLadders2.put(2, 4);
|
|
||||||
chestsLadders2.put(3, 5);
|
|
||||||
chestsLadders2.put(4, 3);
|
|
||||||
chestsLadders2.put(5, 2);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> vine2 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
vine2.put(1, 8);
|
|
||||||
vine2.put(2, 1);
|
|
||||||
vine2.put(4, 2);
|
|
||||||
vine2.put(8, 4);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> leverButtonTorch2 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
leverButtonTorch2.put(9, 12);
|
|
||||||
leverButtonTorch2.put(10, 11);
|
|
||||||
leverButtonTorch2.put(12, 10);
|
|
||||||
leverButtonTorch2.put(11, 9);
|
|
||||||
leverButtonTorch2.put(4, 2);
|
|
||||||
leverButtonTorch2.put(2, 3);
|
|
||||||
leverButtonTorch2.put(3, 1);
|
|
||||||
leverButtonTorch2.put(1, 4);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> pistonDropperDispenser2 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
pistonDropperDispenser2.put(2, 4);
|
|
||||||
pistonDropperDispenser2.put(3, 5);
|
|
||||||
pistonDropperDispenser2.put(11, 13);
|
|
||||||
pistonDropperDispenser2.put(10, 12);
|
|
||||||
pistonDropperDispenser2.put(4, 3);
|
|
||||||
pistonDropperDispenser2.put(5, 2);
|
|
||||||
pistonDropperDispenser2.put(12, 11);
|
|
||||||
pistonDropperDispenser2.put(13,10);
|
|
||||||
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> repeaterComparatorDoorTripwire2 = new HashMap<Integer,Integer>();
|
|
||||||
|
|
||||||
repeaterComparatorDoorTripwire2.put(1, 0);
|
|
||||||
repeaterComparatorDoorTripwire2.put(2, 1);
|
|
||||||
repeaterComparatorDoorTripwire2.put(3, 2);
|
|
||||||
repeaterComparatorDoorTripwire2.put(0, 3);
|
|
||||||
repeaterComparatorDoorTripwire2.put(5, 4);
|
|
||||||
repeaterComparatorDoorTripwire2.put(6, 5);
|
|
||||||
repeaterComparatorDoorTripwire2.put(7, 6);
|
|
||||||
repeaterComparatorDoorTripwire2.put(4, 7);
|
|
||||||
repeaterComparatorDoorTripwire2.put(9, 8);
|
|
||||||
repeaterComparatorDoorTripwire2.put(10, 9);
|
|
||||||
repeaterComparatorDoorTripwire2.put(11, 10);
|
|
||||||
repeaterComparatorDoorTripwire2.put(8, 11);
|
|
||||||
repeaterComparatorDoorTripwire2.put(13, 12);
|
|
||||||
repeaterComparatorDoorTripwire2.put(14, 13);
|
|
||||||
repeaterComparatorDoorTripwire2.put(15, 14);
|
|
||||||
repeaterComparatorDoorTripwire2.put(12, 15);
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> rails2 = new HashMap<Integer,Integer>();
|
|
||||||
rails2.put(0, 1);
|
|
||||||
rails2.put(1, 0);
|
|
||||||
rails2.put(8, 7);
|
|
||||||
rails2.put(9, 8);
|
|
||||||
rails2.put(6, 9);
|
|
||||||
rails2.put(7, 6);
|
|
||||||
|
|
||||||
|
|
||||||
HashMap<Integer,Integer> railsSpecial2 = new HashMap<Integer,Integer>();
|
|
||||||
railsSpecial2.put(0, 1);
|
|
||||||
railsSpecial2.put(1, 0);
|
|
||||||
railsSpecial2.put(8, 9);
|
|
||||||
railsSpecial2.put(9, 8);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
orientation0.put(Blocks.brick_stairs, stairs0);
|
|
||||||
orientation0.put(Blocks.stone_stairs, stairs0);
|
|
||||||
orientation0.put(Blocks.nether_brick_stairs, stairs0);
|
|
||||||
orientation0.put(Blocks.quartz_stairs, stairs0);
|
|
||||||
orientation0.put(Blocks.sandstone_stairs, stairs0);
|
|
||||||
orientation0.put(Blocks.stone_brick_stairs, stairs0);
|
|
||||||
orientation0.put(Blocks.birch_stairs, stairs0);
|
|
||||||
orientation0.put(Blocks.jungle_stairs, stairs0);
|
|
||||||
orientation0.put(Blocks.oak_stairs, stairs0);
|
|
||||||
orientation0.put(Blocks.spruce_stairs, stairs0);
|
|
||||||
orientation0.put(Blocks.brick_stairs, stairs0);
|
|
||||||
orientation0.put(Blocks.vine, vine0);
|
|
||||||
orientation0.put(Blocks.chest, chestsLadders0);
|
|
||||||
orientation0.put(Blocks.trapped_chest, chestsLadders0);
|
|
||||||
orientation0.put(Blocks.ladder, chestsLadders0);
|
|
||||||
orientation0.put(Blocks.lever, leverButtonTorch0);
|
|
||||||
orientation0.put(Blocks.stone_button, leverButtonTorch0);
|
|
||||||
orientation0.put(Blocks.wooden_button, leverButtonTorch0);
|
|
||||||
orientation0.put(Blocks.redstone_torch, leverButtonTorch0);
|
|
||||||
orientation0.put(Blocks.unlit_redstone_torch, leverButtonTorch0);
|
|
||||||
orientation0.put(Blocks.torch, leverButtonTorch0);
|
|
||||||
orientation0.put(Blocks.piston,pistonDropperDispenser0);
|
|
||||||
orientation0.put(Blocks.piston_head,pistonDropperDispenser0);
|
|
||||||
orientation0.put(Blocks.piston_extension,pistonDropperDispenser0);
|
|
||||||
orientation0.put(Blocks.sticky_piston,pistonDropperDispenser0);
|
|
||||||
orientation0.put(Blocks.dropper,pistonDropperDispenser0);
|
|
||||||
orientation0.put(Blocks.dispenser,pistonDropperDispenser0);
|
|
||||||
orientation0.put(Blocks.powered_comparator,pistonDropperDispenser0);
|
|
||||||
orientation0.put(Blocks.unpowered_comparator,pistonDropperDispenser0);
|
|
||||||
orientation0.put(Blocks.powered_repeater,pistonDropperDispenser0);
|
|
||||||
orientation0.put(Blocks.unpowered_repeater,pistonDropperDispenser0);
|
|
||||||
orientation0.put(Blocks.wooden_door,pistonDropperDispenser0);
|
|
||||||
orientation0.put(Blocks.iron_door,pistonDropperDispenser0);
|
|
||||||
orientation0.put(Blocks.tripwire_hook,pistonDropperDispenser0);
|
|
||||||
orientation0.put(Blocks.detector_rail,railsSpecial0);
|
|
||||||
orientation0.put(Blocks.activator_rail,railsSpecial0);
|
|
||||||
orientation0.put(Blocks.golden_rail,railsSpecial0);
|
|
||||||
orientation0.put(Blocks.rail,rails0);
|
|
||||||
|
|
||||||
orientation1.put(Blocks.brick_stairs, stairs1);
|
|
||||||
orientation1.put(Blocks.stone_stairs, stairs1);
|
|
||||||
orientation1.put(Blocks.nether_brick_stairs, stairs1);
|
|
||||||
orientation1.put(Blocks.quartz_stairs, stairs1);
|
|
||||||
orientation1.put(Blocks.sandstone_stairs, stairs1);
|
|
||||||
orientation1.put(Blocks.stone_brick_stairs, stairs1);
|
|
||||||
orientation1.put(Blocks.birch_stairs, stairs1);
|
|
||||||
orientation1.put(Blocks.jungle_stairs, stairs1);
|
|
||||||
orientation1.put(Blocks.oak_stairs, stairs1);
|
|
||||||
orientation1.put(Blocks.spruce_stairs, stairs1);
|
|
||||||
orientation1.put(Blocks.vine, vine1);
|
|
||||||
orientation1.put(Blocks.chest, chestsLadders1);
|
|
||||||
orientation1.put(Blocks.trapped_chest, chestsLadders1);
|
|
||||||
orientation1.put(Blocks.ladder, chestsLadders1);
|
|
||||||
orientation1.put(Blocks.lever, leverButtonTorch1);
|
|
||||||
orientation1.put(Blocks.stone_button, leverButtonTorch1);
|
|
||||||
orientation1.put(Blocks.wooden_button, leverButtonTorch1);
|
|
||||||
orientation1.put(Blocks.redstone_torch, leverButtonTorch1);
|
|
||||||
orientation1.put(Blocks.unlit_redstone_torch, leverButtonTorch1);
|
|
||||||
orientation1.put(Blocks.torch, leverButtonTorch1);
|
|
||||||
orientation1.put(Blocks.piston,pistonDropperDispenser1);
|
|
||||||
orientation1.put(Blocks.piston_head,pistonDropperDispenser1);
|
|
||||||
orientation1.put(Blocks.piston_extension,pistonDropperDispenser1);
|
|
||||||
orientation1.put(Blocks.sticky_piston,pistonDropperDispenser1);
|
|
||||||
orientation1.put(Blocks.dropper,pistonDropperDispenser1);
|
|
||||||
orientation1.put(Blocks.dispenser,pistonDropperDispenser1);
|
|
||||||
orientation1.put(Blocks.powered_comparator,pistonDropperDispenser1);
|
|
||||||
orientation1.put(Blocks.unpowered_comparator,pistonDropperDispenser1);
|
|
||||||
orientation1.put(Blocks.powered_repeater,pistonDropperDispenser1);
|
|
||||||
orientation1.put(Blocks.unpowered_repeater,pistonDropperDispenser1);
|
|
||||||
orientation1.put(Blocks.wooden_door,pistonDropperDispenser1);
|
|
||||||
orientation1.put(Blocks.iron_door,pistonDropperDispenser1);
|
|
||||||
orientation1.put(Blocks.tripwire_hook,pistonDropperDispenser1);
|
|
||||||
orientation1.put(Blocks.detector_rail,railsSpecial1);
|
|
||||||
orientation1.put(Blocks.activator_rail,railsSpecial1);
|
|
||||||
orientation1.put(Blocks.golden_rail,railsSpecial1);
|
|
||||||
orientation1.put(Blocks.rail,rails1);
|
|
||||||
|
|
||||||
orientation2.put(Blocks.brick_stairs, stairs2);
|
|
||||||
orientation2.put(Blocks.stone_stairs, stairs2);
|
|
||||||
orientation2.put(Blocks.nether_brick_stairs, stairs2);
|
|
||||||
orientation2.put(Blocks.quartz_stairs, stairs2);
|
|
||||||
orientation2.put(Blocks.sandstone_stairs, stairs2);
|
|
||||||
orientation2.put(Blocks.stone_brick_stairs, stairs2);
|
|
||||||
orientation2.put(Blocks.birch_stairs, stairs2);
|
|
||||||
orientation2.put(Blocks.jungle_stairs, stairs2);
|
|
||||||
orientation2.put(Blocks.oak_stairs, stairs2);
|
|
||||||
orientation2.put(Blocks.spruce_stairs, stairs2);
|
|
||||||
orientation2.put(Blocks.vine, vine2);
|
|
||||||
orientation2.put(Blocks.trapped_chest, chestsLadders2);
|
|
||||||
orientation2.put(Blocks.ladder, chestsLadders2);
|
|
||||||
orientation2.put(Blocks.lever, leverButtonTorch2);
|
|
||||||
orientation2.put(Blocks.stone_button, leverButtonTorch2);
|
|
||||||
orientation2.put(Blocks.wooden_button, leverButtonTorch2);
|
|
||||||
orientation2.put(Blocks.redstone_torch, leverButtonTorch2);
|
|
||||||
orientation2.put(Blocks.unlit_redstone_torch, leverButtonTorch2);
|
|
||||||
orientation2.put(Blocks.torch, leverButtonTorch2);
|
|
||||||
orientation2.put(Blocks.piston,pistonDropperDispenser2);
|
|
||||||
orientation2.put(Blocks.piston_head,pistonDropperDispenser2);
|
|
||||||
orientation2.put(Blocks.piston_extension,pistonDropperDispenser2);
|
|
||||||
orientation2.put(Blocks.sticky_piston,pistonDropperDispenser2);
|
|
||||||
orientation2.put(Blocks.dropper,pistonDropperDispenser2);
|
|
||||||
orientation2.put(Blocks.dispenser,pistonDropperDispenser2);
|
|
||||||
orientation2.put(Blocks.powered_comparator,pistonDropperDispenser2);
|
|
||||||
orientation2.put(Blocks.unpowered_comparator,pistonDropperDispenser2);
|
|
||||||
orientation2.put(Blocks.powered_repeater,pistonDropperDispenser2);
|
|
||||||
orientation2.put(Blocks.unpowered_repeater,pistonDropperDispenser2);
|
|
||||||
orientation2.put(Blocks.wooden_door,pistonDropperDispenser2);
|
|
||||||
orientation2.put(Blocks.iron_door,pistonDropperDispenser2);
|
|
||||||
orientation2.put(Blocks.tripwire_hook,pistonDropperDispenser2);
|
|
||||||
orientation2.put(Blocks.detector_rail,railsSpecial2);
|
|
||||||
orientation2.put(Blocks.activator_rail,railsSpecial2);
|
|
||||||
orientation2.put(Blocks.golden_rail,railsSpecial2);
|
|
||||||
orientation2.put(Blocks.rail,rails2);
|
|
||||||
|
|
||||||
this.rotationMappings.put(2, orientation2);
|
|
||||||
this.rotationMappings.put(1, orientation1);
|
|
||||||
this.rotationMappings.put(0, orientation0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getRotatedBlock(int metaData, int desiredOrientation, int blockID)
|
|
||||||
{
|
|
||||||
if(this.rotationMappings.containsKey(desiredOrientation))
|
|
||||||
{
|
|
||||||
if(this.rotationMappings.get(desiredOrientation).containsKey(blockID))
|
|
||||||
{
|
|
||||||
if(this.rotationMappings.get(desiredOrientation).get(blockID).containsKey(metaData))
|
|
||||||
{
|
|
||||||
return this.rotationMappings.get(desiredOrientation).get(blockID).get(metaData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return metaData ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -40,12 +40,10 @@ public class ChunkLoaderHelper implements LoadingCallback {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Ticket createTicket(BlockPos pos, World world)
|
public static Ticket createTicket(BlockPos pos, World world) {
|
||||||
{
|
|
||||||
NBTTagCompound data;
|
NBTTagCompound data;
|
||||||
Ticket ticket = ForgeChunkManager.requestTicket(DimDoors.instance, world, Type.NORMAL);
|
Ticket ticket = ForgeChunkManager.requestTicket(DimDoors.instance, world, Type.NORMAL);
|
||||||
if (ticket != null)
|
if (ticket != null) {
|
||||||
{
|
|
||||||
data = ticket.getModData();
|
data = ticket.getModData();
|
||||||
data.setInteger("goldDimDoorX", pos.getX());
|
data.setInteger("goldDimDoorX", pos.getX());
|
||||||
data.setInteger("goldDimDoorY", pos.getY());
|
data.setInteger("goldDimDoorY", pos.getY());
|
||||||
|
|
|
@ -12,6 +12,7 @@ import com.zixiken.dimdoors.core.NewDimData;
|
||||||
import com.zixiken.dimdoors.util.Point4D;
|
import com.zixiken.dimdoors.util.Point4D;
|
||||||
import com.zixiken.dimdoors.watcher.ClientLinkData;
|
import com.zixiken.dimdoors.watcher.ClientLinkData;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
|
||||||
public class Compactor
|
public class Compactor
|
||||||
{
|
{
|
||||||
|
@ -72,7 +73,7 @@ public class Compactor
|
||||||
for (int h = 0; h < linkCount; h++) {
|
for (int h = 0; h < linkCount; h++) {
|
||||||
ClientLinkData link = ClientLinkData.read(input);
|
ClientLinkData link = ClientLinkData.read(input);
|
||||||
Point4D source = link.point;
|
Point4D source = link.point;
|
||||||
dimension.createLink(source.getX(), source.getY(), source.getZ(), LinkType.CLIENT,0);
|
dimension.createLink(source.toBlockPos(), LinkType.CLIENT, EnumFacing.getHorizontal(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,8 @@ import com.zixiken.dimdoors.dungeon.pack.DungeonPack;
|
||||||
import com.zixiken.dimdoors.dungeon.pack.DungeonPackConfig;
|
import com.zixiken.dimdoors.dungeon.pack.DungeonPackConfig;
|
||||||
import com.zixiken.dimdoors.dungeon.pack.DungeonPackConfigReader;
|
import com.zixiken.dimdoors.dungeon.pack.DungeonPackConfigReader;
|
||||||
import com.zixiken.dimdoors.items.ItemDimensionalDoor;
|
import com.zixiken.dimdoors.items.ItemDimensionalDoor;
|
||||||
|
import net.minecraft.util.BlockPos;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.WeightedRandom;
|
import net.minecraft.util.WeightedRandom;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import com.zixiken.dimdoors.core.NewDimData;
|
import com.zixiken.dimdoors.core.NewDimData;
|
||||||
|
@ -35,8 +37,7 @@ import com.zixiken.dimdoors.dungeon.pack.DungeonType;
|
||||||
import com.zixiken.dimdoors.util.FileFilters;
|
import com.zixiken.dimdoors.util.FileFilters;
|
||||||
import com.zixiken.dimdoors.util.WeightedContainer;
|
import com.zixiken.dimdoors.util.WeightedContainer;
|
||||||
|
|
||||||
public class DungeonHelper
|
public class DungeonHelper {
|
||||||
{
|
|
||||||
private static DungeonHelper instance = null;
|
private static DungeonHelper instance = null;
|
||||||
private static DDProperties properties = null;
|
private static DDProperties properties = null;
|
||||||
|
|
||||||
|
@ -62,9 +63,7 @@ public class DungeonHelper
|
||||||
public static final int MAX_DUNGEON_WEIGHT = 10000; //Used to prevent overflows and math breaking down
|
public static final int MAX_DUNGEON_WEIGHT = 10000; //Used to prevent overflows and math breaking down
|
||||||
|
|
||||||
private static final int MAX_EXPORT_RADIUS = 50;
|
private static final int MAX_EXPORT_RADIUS = 50;
|
||||||
public static final short MAX_DUNGEON_WIDTH = 2 * MAX_EXPORT_RADIUS + 1;
|
public static final BlockPos MAX_DUNGEON_SIZE = BlockPosHelper.posFromSingleValue(2 * MAX_EXPORT_RADIUS + 1);
|
||||||
public static final short MAX_DUNGEON_HEIGHT = MAX_DUNGEON_WIDTH;
|
|
||||||
public static final short MAX_DUNGEON_LENGTH = MAX_DUNGEON_WIDTH;
|
|
||||||
|
|
||||||
private ArrayList<DungeonData> untaggedDungeons = new ArrayList<DungeonData>();
|
private ArrayList<DungeonData> untaggedDungeons = new ArrayList<DungeonData>();
|
||||||
private ArrayList<DungeonData> registeredDungeons = new ArrayList<DungeonData>();
|
private ArrayList<DungeonData> registeredDungeons = new ArrayList<DungeonData>();
|
||||||
|
@ -76,8 +75,7 @@ public class DungeonHelper
|
||||||
|
|
||||||
private DungeonData defaultError;
|
private DungeonData defaultError;
|
||||||
|
|
||||||
private DungeonHelper()
|
private DungeonHelper() {
|
||||||
{
|
|
||||||
//Load our reference to the DDProperties singleton
|
//Load our reference to the DDProperties singleton
|
||||||
if (properties == null)
|
if (properties == null)
|
||||||
properties = DDProperties.instance();
|
properties = DDProperties.instance();
|
||||||
|
@ -85,24 +83,18 @@ public class DungeonHelper
|
||||||
registerDungeons();
|
registerDungeons();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DungeonHelper initialize()
|
public static DungeonHelper initialize() {
|
||||||
{
|
if (instance == null) {
|
||||||
if (instance == null)
|
|
||||||
{
|
|
||||||
instance = new DungeonHelper();
|
instance = new DungeonHelper();
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new IllegalStateException("Cannot initialize DungeonHelper twice");
|
throw new IllegalStateException("Cannot initialize DungeonHelper twice");
|
||||||
}
|
}
|
||||||
|
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DungeonHelper instance()
|
public static DungeonHelper instance() {
|
||||||
{
|
if (instance == null) {
|
||||||
if (instance == null)
|
|
||||||
{
|
|
||||||
//This is to prevent some frustrating bugs that could arise when classes
|
//This is to prevent some frustrating bugs that could arise when classes
|
||||||
//are loaded in the wrong order. Trust me, I had to squash a few...
|
//are loaded in the wrong order. Trust me, I had to squash a few...
|
||||||
throw new IllegalStateException("Instance of DungeonHelper requested before initialization");
|
throw new IllegalStateException("Instance of DungeonHelper requested before initialization");
|
||||||
|
@ -110,11 +102,9 @@ public class DungeonHelper
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerDungeons()
|
private void registerDungeons() {
|
||||||
{
|
|
||||||
File file = new File(properties.CustomSchematicDirectory);
|
File file = new File(properties.CustomSchematicDirectory);
|
||||||
if (file.exists() || file.mkdir())
|
if (file.exists() || file.mkdir()) {
|
||||||
{
|
|
||||||
copyfile.copyFile(DUNGEON_CREATION_GUIDE_SOURCE_PATH, file.getAbsolutePath() + "/How_to_add_dungeons.txt");
|
copyfile.copyFile(DUNGEON_CREATION_GUIDE_SOURCE_PATH, file.getAbsolutePath() + "/How_to_add_dungeons.txt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,39 +113,30 @@ public class DungeonHelper
|
||||||
registerCustomDungeons(properties.CustomSchematicDirectory, reader);
|
registerCustomDungeons(properties.CustomSchematicDirectory, reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DungeonPackConfig loadDungeonPackConfig(String configPath, String name, boolean isInternal, DungeonPackConfigReader reader)
|
private static DungeonPackConfig loadDungeonPackConfig(String configPath, String name, boolean isInternal, DungeonPackConfigReader reader) {
|
||||||
{
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
DungeonPackConfig config;
|
DungeonPackConfig config;
|
||||||
if (isInternal)
|
if (isInternal) {
|
||||||
{
|
|
||||||
config = reader.readFromResource(configPath);
|
config = reader.readFromResource(configPath);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
config = reader.readFromFile(configPath);
|
config = reader.readFromFile(configPath);
|
||||||
}
|
}
|
||||||
config.setName(name);
|
config.setName(name);
|
||||||
return config;
|
return config;
|
||||||
}
|
} catch (FileNotFoundException e) {
|
||||||
catch (FileNotFoundException e)
|
|
||||||
{
|
|
||||||
System.err.println("Could not find a dungeon pack config file: " + configPath);
|
System.err.println("Could not find a dungeon pack config file: " + configPath);
|
||||||
}
|
} catch (Exception e) // handles IOException and ConfigurationProcessingException
|
||||||
catch (Exception e) // handles IOException and ConfigurationProcessingException
|
|
||||||
{
|
{
|
||||||
System.err.println(e.getMessage());
|
System.err.println(e.getMessage());
|
||||||
if (e.getCause() != null)
|
if (e.getCause() != null) {
|
||||||
{
|
|
||||||
System.err.println(e.getCause());
|
System.err.println(e.getCause());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private DungeonPack registerDungeonPack(String directory, Iterable<String> schematics, boolean isInternal, boolean verbose, DungeonPackConfigReader reader)
|
private DungeonPack registerDungeonPack(String directory, Iterable<String> schematics, boolean isInternal, boolean verbose, DungeonPackConfigReader reader) {
|
||||||
{
|
|
||||||
//First determine the pack's name and validate it
|
//First determine the pack's name and validate it
|
||||||
File packDirectory = new File(directory);
|
File packDirectory = new File(directory);
|
||||||
String name = packDirectory.getName().toUpperCase();
|
String name = packDirectory.getName().toUpperCase();
|
||||||
|
@ -166,22 +147,19 @@ public class DungeonHelper
|
||||||
//or if a user is running Linux and has two directories with names differing only by capitalization.
|
//or if a user is running Linux and has two directories with names differing only by capitalization.
|
||||||
|
|
||||||
DungeonPack pack = dungeonPackMapping.get(name);
|
DungeonPack pack = dungeonPackMapping.get(name);
|
||||||
if (pack == null)
|
if (pack == null) {
|
||||||
{
|
|
||||||
//Load the pack's configuration file
|
//Load the pack's configuration file
|
||||||
|
|
||||||
String configPath;
|
String configPath;
|
||||||
if (isInternal)
|
if (isInternal) {
|
||||||
{
|
|
||||||
configPath = directory + "/" + STANDARD_CONFIG_FILE_NAME;
|
configPath = directory + "/" + STANDARD_CONFIG_FILE_NAME;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
configPath = directory + File.separator + STANDARD_CONFIG_FILE_NAME;
|
configPath = directory + File.separator + STANDARD_CONFIG_FILE_NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
DungeonPackConfig config = loadDungeonPackConfig(configPath, name, isInternal, reader);
|
DungeonPackConfig config = loadDungeonPackConfig(configPath, name, isInternal, reader);
|
||||||
if (config == null)
|
|
||||||
{
|
if (config == null) {
|
||||||
System.err.println("Could not load config file: " + configPath);
|
System.err.println("Could not load config file: " + configPath);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -190,9 +168,7 @@ public class DungeonHelper
|
||||||
pack = new DungeonPack(config);
|
pack = new DungeonPack(config);
|
||||||
dungeonPackMapping.put(name, pack);
|
dungeonPackMapping.put(name, pack);
|
||||||
dungeonPackList.add(pack);
|
dungeonPackList.add(pack);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
//Show a warning that there is a naming conflict but keep going. People can use this to extend
|
//Show a warning that there is a naming conflict but keep going. People can use this to extend
|
||||||
//our built-in packs with custom schematics without tampering with our mod's JAR file.
|
//our built-in packs with custom schematics without tampering with our mod's JAR file.
|
||||||
System.err.println("A dungeon pack has the same name as another pack that has already been loaded: " + directory);
|
System.err.println("A dungeon pack has the same name as another pack that has already been loaded: " + directory);
|
||||||
|
@ -200,119 +176,96 @@ public class DungeonHelper
|
||||||
}
|
}
|
||||||
|
|
||||||
//Register the dungeons! ^_^
|
//Register the dungeons! ^_^
|
||||||
for (String schematicPath : schematics)
|
for (String schematicPath : schematics) {
|
||||||
{
|
|
||||||
registerDungeon(schematicPath, pack, isInternal, verbose);
|
registerDungeon(schematicPath, pack, isInternal, verbose);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pack;
|
return pack;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<DungeonData> getRegisteredDungeons()
|
public List<DungeonData> getRegisteredDungeons() {
|
||||||
{
|
|
||||||
return Collections.unmodifiableList(this.registeredDungeons);
|
return Collections.unmodifiableList(this.registeredDungeons);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<DungeonData> getUntaggedDungeons()
|
public List<DungeonData> getUntaggedDungeons() {
|
||||||
{
|
|
||||||
return Collections.unmodifiableList(this.untaggedDungeons);
|
return Collections.unmodifiableList(this.untaggedDungeons);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DungeonData getDefaultErrorDungeon()
|
public DungeonData getDefaultErrorDungeon() {
|
||||||
{
|
|
||||||
return defaultError;
|
return defaultError;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DungeonPack getDungeonPack(String name)
|
public DungeonPack getDungeonPack(String name) {
|
||||||
{
|
|
||||||
//TODO: This function might be obsolete after the new save format is implemented.
|
//TODO: This function might be obsolete after the new save format is implemented.
|
||||||
return dungeonPackMapping.get(name.toUpperCase());
|
return dungeonPackMapping.get(name.toUpperCase());
|
||||||
}
|
}
|
||||||
|
|
||||||
private DungeonPack getDimDungeonPack(NewDimData dimension)
|
private DungeonPack getDimDungeonPack(NewDimData dimension) {
|
||||||
{
|
|
||||||
// TODO: Drop support for dim-based packs and switch to embedding the pack
|
// TODO: Drop support for dim-based packs and switch to embedding the pack
|
||||||
// in the link data itself. That would solve the dungeon pre-generation issue.
|
// in the link data itself. That would solve the dungeon pre-generation issue.
|
||||||
// Gateways should dictate which packs are being used, not the dimensions.
|
// Gateways should dictate which packs are being used, not the dimensions.
|
||||||
|
|
||||||
DungeonPack pack;
|
DungeonPack pack;
|
||||||
DungeonData dungeon = dimension.dungeon();
|
DungeonData dungeon = dimension.dungeon();
|
||||||
if (dungeon != null)
|
|
||||||
{
|
if (dungeon != null) {
|
||||||
pack = dungeon.dungeonType().Owner;
|
pack = dungeon.dungeonType().Owner;
|
||||||
|
|
||||||
//Make sure the pack isn't null. This can happen for dungeons with the special UNKNOWN type.
|
//Make sure the pack isn't null. This can happen for dungeons with the special UNKNOWN type.
|
||||||
if (pack == null)
|
if (pack == null) {
|
||||||
{
|
|
||||||
pack = RuinsPack;
|
pack = RuinsPack;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
if (dimension.id() == NETHER_DIMENSION_ID) {
|
||||||
{
|
|
||||||
if (dimension.id() == NETHER_DIMENSION_ID)
|
|
||||||
{
|
|
||||||
pack = NetherPack;
|
pack = NetherPack;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
pack = RuinsPack;
|
pack = RuinsPack;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return pack;
|
return pack;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DimLink createCustomDungeonDoor(World world, int x, int y, int z)
|
public DimLink createCustomDungeonDoor(World world, BlockPos pos) {
|
||||||
{
|
|
||||||
//Create a link above the specified position. Link to a new pocket dimension.
|
//Create a link above the specified position. Link to a new pocket dimension.
|
||||||
NewDimData dimension = PocketManager.getDimensionData(world);
|
NewDimData dimension = PocketManager.getDimensionData(world);
|
||||||
DimLink link = dimension.createLink(x, y + 1, z, LinkType.POCKET, 3);
|
DimLink link = dimension.createLink(pos.up(), LinkType.POCKET, EnumFacing.NORTH);
|
||||||
|
|
||||||
//Place a Warp Door linked to that pocket
|
//Place a Warp Door linked to that pocket
|
||||||
ItemDimensionalDoor.placeDoorBlock(world, x, y, z, 3, DimDoors.warpDoor);
|
ItemDimensionalDoor.placeDoor(world, pos, EnumFacing.NORTH, DimDoors.warpDoor);
|
||||||
|
|
||||||
return link;
|
return link;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean validateDungeonType(String type, DungeonPack pack)
|
public boolean validateDungeonType(String type, DungeonPack pack) {
|
||||||
{
|
|
||||||
return pack.isKnownType(type);
|
return pack.isKnownType(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean validateSchematicName(String name, DungeonPack pack)
|
public boolean validateSchematicName(String name, DungeonPack pack) {
|
||||||
{
|
|
||||||
String[] dungeonData;
|
String[] dungeonData;
|
||||||
|
|
||||||
if (!name.endsWith(SCHEMATIC_FILE_EXTENSION))
|
if (!name.endsWith(SCHEMATIC_FILE_EXTENSION)) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
dungeonData = name.substring(0, name.length() - SCHEMATIC_FILE_EXTENSION.length()).split("_");
|
dungeonData = name.substring(0, name.length() - SCHEMATIC_FILE_EXTENSION.length()).split("_");
|
||||||
|
|
||||||
//Check for a valid number of parts
|
//Check for a valid number of parts
|
||||||
if (dungeonData.length < 3 || dungeonData.length > 4)
|
if (dungeonData.length < 3 || dungeonData.length > 4) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
//Check if the dungeon type is valid
|
//Check if the dungeon type is valid
|
||||||
if (!validateDungeonType(dungeonData[0], pack))
|
if (!validateDungeonType(dungeonData[0], pack)) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
//Check if the name is valid
|
//Check if the name is valid
|
||||||
if (!SCHEMATIC_NAME_PATTERN.matcher(dungeonData[1]).matches())
|
if (!SCHEMATIC_NAME_PATTERN.matcher(dungeonData[1]).matches()) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
//Check if the open/closed flag is present
|
//Check if the open/closed flag is present
|
||||||
if (!dungeonData[2].equalsIgnoreCase("open") && !dungeonData[2].equalsIgnoreCase("closed"))
|
if (!dungeonData[2].equalsIgnoreCase("open") && !dungeonData[2].equalsIgnoreCase("closed")) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
//If the weight is present, check that it is valid
|
//If the weight is present, check that it is valid
|
||||||
if (dungeonData.length == 4)
|
if (dungeonData.length == 4) {
|
||||||
{
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
int weight = Integer.parseInt(dungeonData[3]);
|
int weight = Integer.parseInt(dungeonData[3]);
|
||||||
if (weight < MIN_DUNGEON_WEIGHT || weight > MAX_DUNGEON_WEIGHT)
|
if (weight < MIN_DUNGEON_WEIGHT || weight > MAX_DUNGEON_WEIGHT)
|
||||||
return false;
|
return false;
|
||||||
}
|
} catch (NumberFormatException e) {
|
||||||
catch (NumberFormatException e)
|
|
||||||
{
|
|
||||||
//Not a number
|
//Not a number
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -320,8 +273,7 @@ public class DungeonHelper
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void registerDungeon(String schematicPath, DungeonPack pack, boolean isInternal, boolean verbose)
|
public void registerDungeon(String schematicPath, DungeonPack pack, boolean isInternal, boolean verbose) {
|
||||||
{
|
|
||||||
//We use schematicPath as the real path for internal files (inside our JAR) because it seems
|
//We use schematicPath as the real path for internal files (inside our JAR) because it seems
|
||||||
//that File tries to interpret it as a local drive path and mangles it.
|
//that File tries to interpret it as a local drive path and mangles it.
|
||||||
File schematicFile = new File(schematicPath);
|
File schematicFile = new File(schematicPath);
|
||||||
|
@ -329,8 +281,7 @@ public class DungeonHelper
|
||||||
String path = isInternal ? schematicPath : schematicFile.getAbsolutePath();
|
String path = isInternal ? schematicPath : schematicFile.getAbsolutePath();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (validateSchematicName(name, pack))
|
if (validateSchematicName(name, pack)) {
|
||||||
{
|
|
||||||
//Strip off the file extension while splitting the file name
|
//Strip off the file extension while splitting the file name
|
||||||
String[] dungeonData = name.substring(0, name.length() - SCHEMATIC_FILE_EXTENSION.length()).split("_");
|
String[] dungeonData = name.substring(0, name.length() - SCHEMATIC_FILE_EXTENSION.length()).split("_");
|
||||||
|
|
||||||
|
@ -343,30 +294,20 @@ public class DungeonHelper
|
||||||
|
|
||||||
pack.addDungeon(dungeon);
|
pack.addDungeon(dungeon);
|
||||||
registeredDungeons.add(dungeon);
|
registeredDungeons.add(dungeon);
|
||||||
if (verbose)
|
if (verbose) System.out.println("Registered dungeon: " + name);
|
||||||
{
|
} else {
|
||||||
System.out.println("Registered dungeon: " + name);
|
if (verbose) System.out.println("The following dungeon name is invalid for its given pack. It will not be generated naturally: " + schematicPath);
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
System.out.println("The following dungeon name is invalid for its given pack. It will not be generated naturally: " + schematicPath);
|
|
||||||
}
|
|
||||||
untaggedDungeons.add(new DungeonData(path, isInternal, DungeonType.UNKNOWN_TYPE, true, DEFAULT_DUNGEON_WEIGHT));
|
untaggedDungeons.add(new DungeonData(path, isInternal, DungeonType.UNKNOWN_TYPE, true, DEFAULT_DUNGEON_WEIGHT));
|
||||||
System.out.println("Registered untagged dungeon: " + name);
|
System.out.println("Registered untagged dungeon: " + name);
|
||||||
}
|
}
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
System.err.println("Failed to register dungeon: " + name);
|
System.err.println("Failed to register dungeon: " + name);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerCustomDungeons(String path, DungeonPackConfigReader reader)
|
private void registerCustomDungeons(String path, DungeonPackConfigReader reader) {
|
||||||
{
|
|
||||||
File[] schematics;
|
File[] schematics;
|
||||||
File[] packDirectories;
|
File[] packDirectories;
|
||||||
File[] packFiles;
|
File[] packFiles;
|
||||||
|
@ -375,60 +316,44 @@ public class DungeonHelper
|
||||||
FileFilter schematicFileFilter = new FileFilters.FileExtensionFilter(SCHEMATIC_FILE_EXTENSION);
|
FileFilter schematicFileFilter = new FileFilters.FileExtensionFilter(SCHEMATIC_FILE_EXTENSION);
|
||||||
|
|
||||||
//Check that the Ruins pack has been loaded
|
//Check that the Ruins pack has been loaded
|
||||||
if (RuinsPack == null)
|
if (RuinsPack == null) throw new IllegalStateException("Cannot register custom dungeons without first loading the Ruins dungeon pack.");
|
||||||
{
|
|
||||||
throw new IllegalStateException("Cannot register custom dungeons without first loading the Ruins dungeon pack.");
|
|
||||||
}
|
|
||||||
|
|
||||||
//Load stray dungeons directly in the custom dungeons folder
|
//Load stray dungeons directly in the custom dungeons folder
|
||||||
schematics = directory.listFiles(schematicFileFilter);
|
schematics = directory.listFiles(schematicFileFilter);
|
||||||
if (schematics != null)
|
if (schematics != null) {
|
||||||
{
|
for (File schematicFile : schematics) {
|
||||||
for (File schematicFile : schematics)
|
|
||||||
{
|
|
||||||
registerDungeon(schematicFile.getPath(), RuinsPack, false, true);
|
registerDungeon(schematicFile.getPath(), RuinsPack, false, true);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
System.err.println("Could not retrieve the list of schematics stored in the custom dungeons directory!");
|
System.err.println("Could not retrieve the list of schematics stored in the custom dungeons directory!");
|
||||||
}
|
}
|
||||||
schematics = null; //Release memory
|
schematics = null; //Release memory
|
||||||
|
|
||||||
//Load the custom dungeon packs
|
//Load the custom dungeon packs
|
||||||
packDirectories = directory.listFiles(new FileFilters.DirectoryFilter());
|
packDirectories = directory.listFiles(new FileFilters.DirectoryFilter());
|
||||||
if (packDirectories != null)
|
if (packDirectories != null) {
|
||||||
{
|
|
||||||
//Loop through each directory, which is assumed to be a dungeon pack
|
//Loop through each directory, which is assumed to be a dungeon pack
|
||||||
for (File packDirectory : packDirectories)
|
for (File packDirectory : packDirectories) {
|
||||||
{
|
|
||||||
//List the schematics within the dungeon pack directory
|
//List the schematics within the dungeon pack directory
|
||||||
packFiles = packDirectory.listFiles(schematicFileFilter);
|
packFiles = packDirectory.listFiles(schematicFileFilter);
|
||||||
if (packFiles != null)
|
if (packFiles != null) {
|
||||||
{
|
|
||||||
//Copy the pack files' paths into an ArrayList for use with registerDungeonPack()
|
//Copy the pack files' paths into an ArrayList for use with registerDungeonPack()
|
||||||
packFilePaths = new ArrayList<String>(packFiles.length);
|
packFilePaths = new ArrayList<String>(packFiles.length);
|
||||||
for (File packFile : packFiles)
|
for (File packFile : packFiles) {
|
||||||
{
|
|
||||||
packFilePaths.add(packFile.getPath());
|
packFilePaths.add(packFile.getPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
registerDungeonPack(packDirectory.getAbsolutePath(), packFilePaths, false, true, reader);
|
registerDungeonPack(packDirectory.getAbsolutePath(), packFilePaths, false, true, reader);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
System.err.println("Could not retrieve the list of schematics in a dungeon pack: " + packDirectory.getPath());
|
System.err.println("Could not retrieve the list of schematics in a dungeon pack: " + packDirectory.getPath());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
System.err.println("Could not retrieve the list of dungeon pack directories in the custom dungeons directory!");
|
System.err.println("Could not retrieve the list of dungeon pack directories in the custom dungeons directory!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerBundledDungeons(DungeonPackConfigReader reader)
|
private void registerBundledDungeons(DungeonPackConfigReader reader) {
|
||||||
{
|
|
||||||
//Register the core schematics
|
//Register the core schematics
|
||||||
//These are used for debugging and in case of unusual errors while loading dungeons
|
//These are used for debugging and in case of unusual errors while loading dungeons
|
||||||
defaultError = new DungeonData(DEFAULT_ERROR_SCHEMATIC_PATH, true, DungeonType.UNKNOWN_TYPE, true, DEFAULT_DUNGEON_WEIGHT);
|
defaultError = new DungeonData(DEFAULT_ERROR_SCHEMATIC_PATH, true, DungeonType.UNKNOWN_TYPE, true, DEFAULT_DUNGEON_WEIGHT);
|
||||||
|
@ -440,98 +365,73 @@ public class DungeonHelper
|
||||||
System.out.println("Finished registering bundled dungeon packs");
|
System.out.println("Finished registering bundled dungeon packs");
|
||||||
}
|
}
|
||||||
|
|
||||||
private DungeonPack registerBundledPack(String name, DungeonPackConfigReader reader)
|
private DungeonPack registerBundledPack(String name, DungeonPackConfigReader reader) {
|
||||||
{
|
|
||||||
System.out.println("Registering bundled dungeon pack: " + name);
|
System.out.println("Registering bundled dungeon pack: " + name);
|
||||||
|
|
||||||
String packPath = BUNDLED_PACK_BASE_PATH + name.toLowerCase();
|
String packPath = BUNDLED_PACK_BASE_PATH + name.toLowerCase();
|
||||||
String listPath = packPath + ".txt";
|
String listPath = packPath + ".txt";
|
||||||
InputStream listStream = this.getClass().getResourceAsStream(listPath);
|
InputStream listStream = this.getClass().getResourceAsStream(listPath);
|
||||||
|
|
||||||
if (listStream == null)
|
if (listStream == null) throw new IllegalStateException("Failed to open the list of bundled dungeon schematics for " + name);
|
||||||
{
|
|
||||||
throw new IllegalStateException("Failed to open the list of bundled dungeon schematics for " + name);
|
|
||||||
}
|
|
||||||
|
|
||||||
ArrayList<String> schematics = new ArrayList<String>();
|
ArrayList<String> schematics = new ArrayList<String>();
|
||||||
try
|
|
||||||
{
|
try {
|
||||||
// Read the list of schematics that come with a bundled pack
|
// Read the list of schematics that come with a bundled pack
|
||||||
BufferedReader listReader = new BufferedReader(new InputStreamReader(listStream));
|
BufferedReader listReader = new BufferedReader(new InputStreamReader(listStream));
|
||||||
String schematicPath = listReader.readLine();
|
String schematicPath = listReader.readLine();
|
||||||
while (schematicPath != null)
|
while (schematicPath != null) {
|
||||||
{
|
|
||||||
schematicPath = schematicPath.trim();
|
schematicPath = schematicPath.trim();
|
||||||
if (!schematicPath.isEmpty())
|
if (!schematicPath.isEmpty()) schematics.add(schematicPath);
|
||||||
{
|
|
||||||
schematics.add(schematicPath);
|
|
||||||
}
|
|
||||||
schematicPath = listReader.readLine();
|
schematicPath = listReader.readLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
listReader.close();
|
listReader.close();
|
||||||
}
|
} catch (IOException e) {
|
||||||
catch (IOException e)
|
|
||||||
{
|
|
||||||
throw new RuntimeException("An unexpected error occured while trying to read the list of schematics for the " + name + " bundled dungeon pack. This would inevitably cause Dimensional Doors to crash during runtime.", e);
|
throw new RuntimeException("An unexpected error occured while trying to read the list of schematics for the " + name + " bundled dungeon pack. This would inevitably cause Dimensional Doors to crash during runtime.", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register the pack
|
// Register the pack
|
||||||
DungeonPack pack = registerDungeonPack(packPath, schematics, true, false, reader);
|
DungeonPack pack = registerDungeonPack(packPath, schematics, true, false, reader);
|
||||||
if (pack == null)
|
if (pack == null) throw new RuntimeException("Failed to load the " + name + " bundled dungeon pack. This would inevitably cause Dimensional Doors to crash during runtime.");
|
||||||
{
|
|
||||||
throw new RuntimeException("Failed to load the " + name + " bundled dungeon pack. This would inevitably cause Dimensional Doors to crash during runtime.");
|
|
||||||
}
|
|
||||||
return pack;
|
return pack;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean exportDungeon(World world, int centerX, int centerY, int centerZ, String exportPath)
|
public boolean exportDungeon(World world, BlockPos center, String exportPath) {
|
||||||
{
|
|
||||||
//Write schematic data to a file
|
//Write schematic data to a file
|
||||||
try
|
try {
|
||||||
{
|
DungeonSchematic dungeon = (DungeonSchematic) DungeonSchematic.copyFromWorld(world, center.subtract(BlockPosHelper.posFromSingleValue(MAX_EXPORT_RADIUS)), MAX_DUNGEON_SIZE, true);
|
||||||
DungeonSchematic dungeon = DungeonSchematic.copyFromWorld(world,
|
|
||||||
centerX - MAX_EXPORT_RADIUS, centerY - MAX_EXPORT_RADIUS, centerZ - MAX_EXPORT_RADIUS,
|
|
||||||
MAX_DUNGEON_WIDTH, MAX_DUNGEON_HEIGHT, MAX_DUNGEON_LENGTH, true);
|
|
||||||
dungeon.applyExportFilters(properties);
|
dungeon.applyExportFilters(properties);
|
||||||
dungeon.writeToFile(exportPath);
|
dungeon.writeToFile(exportPath);
|
||||||
return true;
|
return true;
|
||||||
}
|
} catch(Exception e) {
|
||||||
catch(Exception e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public DungeonData selectNextDungeon(NewDimData parent, Random random)
|
public DungeonData selectNextDungeon(NewDimData parent, Random random) {
|
||||||
{
|
|
||||||
DungeonPack pack = getDimDungeonPack(parent);
|
DungeonPack pack = getDimDungeonPack(parent);
|
||||||
DungeonData selection;
|
DungeonData selection;
|
||||||
DungeonPackConfig config;
|
DungeonPackConfig config;
|
||||||
DungeonPack selectedPack;
|
DungeonPack selectedPack;
|
||||||
|
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
config = pack.getConfig();
|
config = pack.getConfig();
|
||||||
selectedPack = pack;
|
selectedPack = pack;
|
||||||
|
|
||||||
// Are we allowed to switch to another dungeon pack?
|
// Are we allowed to switch to another dungeon pack?
|
||||||
if (config.allowPackChangeOut())
|
if (config.allowPackChangeOut()) {
|
||||||
{
|
|
||||||
// Calculate the chance of switching to a different pack type
|
// Calculate the chance of switching to a different pack type
|
||||||
int packSwitchChance;
|
int packSwitchChance;
|
||||||
if (parent.isPocketDimension())
|
|
||||||
{
|
if (parent.isPocketDimension()) packSwitchChance = MIN_PACK_SWITCH_CHANCE + parent.packDepth() * PACK_SWITCH_CHANCE_PER_LEVEL;
|
||||||
packSwitchChance = MIN_PACK_SWITCH_CHANCE + parent.packDepth() * PACK_SWITCH_CHANCE_PER_LEVEL;
|
else packSwitchChance = START_PACK_SWITCH_CHANCE;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
packSwitchChance = START_PACK_SWITCH_CHANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decide randomly whether to switch packs or not
|
// Decide randomly whether to switch packs or not
|
||||||
if (random.nextInt(MAX_PACK_SWITCH_CHANCE) < packSwitchChance)
|
if (random.nextInt(MAX_PACK_SWITCH_CHANCE) < packSwitchChance) {
|
||||||
{
|
|
||||||
// Find another pack
|
// Find another pack
|
||||||
selectedPack = getRandomDungeonPack(pack, random);
|
selectedPack = getRandomDungeonPack(pack, random);
|
||||||
}
|
}
|
||||||
|
@ -539,18 +439,13 @@ public class DungeonHelper
|
||||||
|
|
||||||
//Pick the next dungeon
|
//Pick the next dungeon
|
||||||
selection = selectedPack.getNextDungeon(parent, random);
|
selection = selectedPack.getNextDungeon(parent, random);
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
System.err.println("An exception occurred while selecting a dungeon:");
|
System.err.println("An exception occurred while selecting a dungeon:");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
if (!pack.isEmpty())
|
if (!pack.isEmpty()) {
|
||||||
{
|
|
||||||
selection = pack.getRandomDungeon(random);
|
selection = pack.getRandomDungeon(random);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
selection = defaultError;
|
selection = defaultError;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -558,30 +453,24 @@ public class DungeonHelper
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private DungeonPack getRandomDungeonPack(DungeonPack current, Random random)
|
private DungeonPack getRandomDungeonPack(DungeonPack current, Random random) {
|
||||||
{
|
|
||||||
DungeonPack selection = current;
|
DungeonPack selection = current;
|
||||||
ArrayList<WeightedContainer<DungeonPack>> packs = new ArrayList<WeightedContainer<DungeonPack>>(dungeonPackList.size());
|
ArrayList<WeightedContainer<DungeonPack>> packs = new ArrayList<WeightedContainer<DungeonPack>>(dungeonPackList.size());
|
||||||
|
|
||||||
//Load up a list of weighted items with any usable dungeon packs that is not the current pack
|
//Load up a list of weighted items with any usable dungeon packs that is not the current pack
|
||||||
for (DungeonPack pack : dungeonPackList)
|
for (DungeonPack pack : dungeonPackList) {
|
||||||
{
|
|
||||||
DungeonPackConfig config = pack.getConfig();
|
DungeonPackConfig config = pack.getConfig();
|
||||||
if (pack != current && config.allowPackChangeIn() && !pack.isEmpty())
|
if (pack != current && config.allowPackChangeIn() && !pack.isEmpty()) {
|
||||||
{
|
|
||||||
packs.add(new WeightedContainer<DungeonPack>(pack, config.getPackWeight()));
|
packs.add(new WeightedContainer<DungeonPack>(pack, config.getPackWeight()));
|
||||||
}
|
}
|
||||||
}
|
} if (!packs.isEmpty()) {
|
||||||
if (!packs.isEmpty())
|
|
||||||
{
|
|
||||||
//Pick a random dungeon pack
|
//Pick a random dungeon pack
|
||||||
selection = ((WeightedContainer<DungeonPack>) WeightedRandom.getRandomItem(random, packs)).getData();
|
selection = ((WeightedContainer<DungeonPack>) WeightedRandom.getRandomItem(random, packs)).getData();
|
||||||
}
|
}
|
||||||
return selection;
|
return selection;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<String> getDungeonNames()
|
public ArrayList<String> getDungeonNames() {
|
||||||
{
|
|
||||||
// Use a HashSet to guarantee that all dungeon names will be distinct.
|
// Use a HashSet to guarantee that all dungeon names will be distinct.
|
||||||
// This shouldn't be necessary if we keep proper lists without repetitions,
|
// This shouldn't be necessary if we keep proper lists without repetitions,
|
||||||
// but it's a fool-proof workaround.
|
// but it's a fool-proof workaround.
|
||||||
|
@ -595,14 +484,12 @@ public class DungeonHelper
|
||||||
return sortedNames;
|
return sortedNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ArrayList<String> parseDungeonNames(ArrayList<DungeonData> dungeons)
|
private static ArrayList<String> parseDungeonNames(ArrayList<DungeonData> dungeons) {
|
||||||
{
|
|
||||||
String name;
|
String name;
|
||||||
File schematic;
|
File schematic;
|
||||||
ArrayList<String> names = new ArrayList<String>(dungeons.size());
|
ArrayList<String> names = new ArrayList<String>(dungeons.size());
|
||||||
|
|
||||||
for (DungeonData dungeon : dungeons)
|
for (DungeonData dungeon : dungeons) {
|
||||||
{
|
|
||||||
//Retrieve the file name and strip off the file extension
|
//Retrieve the file name and strip off the file extension
|
||||||
schematic = new File(dungeon.schematicPath());
|
schematic = new File(dungeon.schematicPath());
|
||||||
name = schematic.getName();
|
name = schematic.getName();
|
||||||
|
@ -619,19 +506,15 @@ public class DungeonHelper
|
||||||
* @param maxSize - the maximum number of dungeons that can be listed
|
* @param maxSize - the maximum number of dungeons that can be listed
|
||||||
* @return a list of dungeons used in a given chain
|
* @return a list of dungeons used in a given chain
|
||||||
*/
|
*/
|
||||||
public static ArrayList<DungeonData> getDungeonChainHistory(NewDimData start, DungeonPack pack, int maxSize)
|
public static ArrayList<DungeonData> getDungeonChainHistory(NewDimData start, DungeonPack pack, int maxSize) {
|
||||||
{
|
if (start == null) throw new IllegalArgumentException("dimension cannot be null.");
|
||||||
if (start == null)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("dimension cannot be null.");
|
|
||||||
}
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
NewDimData current = start;
|
NewDimData current = start;
|
||||||
DungeonData dungeon = current.dungeon();
|
DungeonData dungeon = current.dungeon();
|
||||||
ArrayList<DungeonData> history = new ArrayList<DungeonData>();
|
ArrayList<DungeonData> history = new ArrayList<DungeonData>();
|
||||||
|
|
||||||
while (count < maxSize && dungeon != null && dungeon.dungeonType().Owner == pack)
|
while (count < maxSize && dungeon != null && dungeon.dungeonType().Owner == pack) {
|
||||||
{
|
|
||||||
history.add(dungeon);
|
history.add(dungeon);
|
||||||
current = current.parent();
|
current = current.parent();
|
||||||
dungeon = current.dungeon();
|
dungeon = current.dungeon();
|
||||||
|
@ -647,8 +530,7 @@ public class DungeonHelper
|
||||||
* @param maxSize - the maximum number of dungeons that can be listed
|
* @param maxSize - the maximum number of dungeons that can be listed
|
||||||
* @return a list of the dungeons used in a given dungeon tree
|
* @return a list of the dungeons used in a given dungeon tree
|
||||||
*/
|
*/
|
||||||
public static ArrayList<DungeonData> listDungeonsInTree(NewDimData root, DungeonPack pack, int maxSize)
|
public static ArrayList<DungeonData> listDungeonsInTree(NewDimData root, DungeonPack pack, int maxSize) {
|
||||||
{
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
NewDimData current;
|
NewDimData current;
|
||||||
DungeonData dungeon;
|
DungeonData dungeon;
|
||||||
|
@ -657,17 +539,15 @@ public class DungeonHelper
|
||||||
pendingDimensions.add(root);
|
pendingDimensions.add(root);
|
||||||
|
|
||||||
// Perform a breadth-first search through the dungeon graph
|
// Perform a breadth-first search through the dungeon graph
|
||||||
while (dungeons.size() < maxSize && !pendingDimensions.isEmpty())
|
while (dungeons.size() < maxSize && !pendingDimensions.isEmpty()) {
|
||||||
{
|
|
||||||
current = pendingDimensions.remove();
|
current = pendingDimensions.remove();
|
||||||
dungeon = current.dungeon();
|
dungeon = current.dungeon();
|
||||||
// Check that this is a dungeon, and if so, that it belongs to the pack that we want
|
// Check that this is a dungeon, and if so, that it belongs to the pack that we want
|
||||||
if (dungeon != null && dungeon.dungeonType().Owner == pack)
|
|
||||||
{
|
if (dungeon != null && dungeon.dungeonType().Owner == pack) {
|
||||||
dungeons.add(dungeon);
|
dungeons.add(dungeon);
|
||||||
// Add all child dungeons for checking later
|
// Add all child dungeons for checking later
|
||||||
for (NewDimData child : current.children())
|
for (NewDimData child : current.children()) {
|
||||||
{
|
|
||||||
pendingDimensions.add(child);
|
pendingDimensions.add(child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -682,8 +562,7 @@ public class DungeonHelper
|
||||||
* @param maxLevels - the maximum number of ancestors to check
|
* @param maxLevels - the maximum number of ancestors to check
|
||||||
* @return the highest ancestor that belongs to the specified pack within the specified levels, or <code>null</code> if none exists
|
* @return the highest ancestor that belongs to the specified pack within the specified levels, or <code>null</code> if none exists
|
||||||
*/
|
*/
|
||||||
public static NewDimData getAncestor(NewDimData dimension, DungeonPack pack, int maxLevels)
|
public static NewDimData getAncestor(NewDimData dimension, DungeonPack pack, int maxLevels) {
|
||||||
{
|
|
||||||
// Find the ancestor of a dimension located a specified number of levels up.
|
// Find the ancestor of a dimension located a specified number of levels up.
|
||||||
NewDimData parent = dimension;
|
NewDimData parent = dimension;
|
||||||
NewDimData current = null;
|
NewDimData current = null;
|
||||||
|
@ -691,16 +570,13 @@ public class DungeonHelper
|
||||||
// We solve this inductively. We begin with null as the first valid ancestor,
|
// We solve this inductively. We begin with null as the first valid ancestor,
|
||||||
// like a kind of virtual child dimension. Then "current" references the
|
// like a kind of virtual child dimension. Then "current" references the
|
||||||
// highest valid ancestor found so far and "parent" references its parent
|
// highest valid ancestor found so far and "parent" references its parent
|
||||||
for (int levels = 0; levels <= maxLevels; levels++)
|
for (int levels = 0; levels <= maxLevels; levels++) {
|
||||||
{
|
if (parent == null || parent.dungeon() == null || parent.dungeon().dungeonType().Owner != pack) break;
|
||||||
if (parent == null || parent.dungeon() == null ||
|
|
||||||
parent.dungeon().dungeonType().Owner != pack)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
current = parent;
|
current = parent;
|
||||||
parent = parent.parent();
|
parent = parent.parent();
|
||||||
}
|
}
|
||||||
|
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.zixiken.dimdoors.helpers;
|
||||||
|
|
||||||
|
import net.minecraft.block.BlockDoor;
|
||||||
|
import net.minecraft.block.properties.IProperty;
|
||||||
|
import net.minecraft.block.properties.PropertyDirection;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
|
||||||
|
public class EnumFacingHelper {
|
||||||
|
public static EnumFacing getFacingFromBlockState(IBlockState state) {
|
||||||
|
for (IProperty prop : (java.util.Set<IProperty>)state.getProperties().keySet()) {
|
||||||
|
if (prop.getName().equals("facing") || prop.getName().equals("rotation")) {
|
||||||
|
return state.getValue((PropertyDirection) prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return EnumFacing.NORTH;
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ package com.zixiken.dimdoors.schematic;
|
||||||
import com.zixiken.dimdoors.DimDoors;
|
import com.zixiken.dimdoors.DimDoors;
|
||||||
import net.minecraft.block.*;
|
import net.minecraft.block.*;
|
||||||
import com.zixiken.dimdoors.Point3D;
|
import com.zixiken.dimdoors.Point3D;
|
||||||
|
import net.minecraft.block.properties.IProperty;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.util.BlockPos;
|
import net.minecraft.util.BlockPos;
|
||||||
|
@ -11,501 +12,29 @@ import net.minecraft.util.EnumFacing;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class BlockRotator
|
public class BlockRotator {
|
||||||
{
|
public static IBlockState transform(IBlockState state, int turns) {
|
||||||
//This class is temporary. It's just a place in which to hold the old block rotation and transformation code
|
|
||||||
//until we can rewrite it.
|
|
||||||
|
|
||||||
public final static int EAST_DOOR_METADATA = 0;
|
|
||||||
private final static int BLOCK_ID_COUNT = 4096;
|
|
||||||
|
|
||||||
//Provides a fast lookup table for whether blocks have orientations
|
|
||||||
private final static Map<Block, Boolean> hasOrientations = new HashMap<Block, Boolean>();
|
|
||||||
|
|
||||||
public static void setupOrientations()
|
|
||||||
{
|
|
||||||
hasOrientations.put(Blocks.dispenser, true);
|
|
||||||
hasOrientations.put(Blocks.dropper, true);
|
|
||||||
hasOrientations.put(Blocks.stone_brick_stairs, true);
|
|
||||||
hasOrientations.put(Blocks.lever, true);
|
|
||||||
hasOrientations.put(Blocks.stone_button, true);
|
|
||||||
hasOrientations.put(Blocks.wooden_button, true);
|
|
||||||
hasOrientations.put(Blocks.unpowered_repeater, true);
|
|
||||||
hasOrientations.put(Blocks.powered_repeater, true);
|
|
||||||
hasOrientations.put(Blocks.tripwire_hook, true);
|
|
||||||
hasOrientations.put(Blocks.torch, true);
|
|
||||||
hasOrientations.put(Blocks.redstone_torch, true);
|
|
||||||
hasOrientations.put(Blocks.unlit_redstone_torch, true);
|
|
||||||
hasOrientations.put(Blocks.iron_door, true);
|
|
||||||
hasOrientations.put(Blocks.wooden_door, true);
|
|
||||||
hasOrientations.put(Blocks.piston, true);
|
|
||||||
hasOrientations.put(Blocks.sticky_piston, true);
|
|
||||||
hasOrientations.put(Blocks.piston_head, true);
|
|
||||||
hasOrientations.put(Blocks.powered_comparator, true);
|
|
||||||
hasOrientations.put(Blocks.unpowered_comparator, true);
|
|
||||||
hasOrientations.put(Blocks.standing_sign, true);
|
|
||||||
hasOrientations.put(Blocks.wall_sign, true);
|
|
||||||
hasOrientations.put(Blocks.skull, true);
|
|
||||||
hasOrientations.put(Blocks.ladder, true);
|
|
||||||
hasOrientations.put(Blocks.vine, true);
|
|
||||||
hasOrientations.put(Blocks.anvil, true);
|
|
||||||
hasOrientations.put(Blocks.chest, true);
|
|
||||||
hasOrientations.put(Blocks.trapped_chest, true);
|
|
||||||
hasOrientations.put(Blocks.hopper, true);
|
|
||||||
hasOrientations.put(Blocks.nether_brick_stairs, true);
|
|
||||||
hasOrientations.put(Blocks.stone_stairs, true);
|
|
||||||
hasOrientations.put(Blocks.quartz_stairs, true);
|
|
||||||
hasOrientations.put(Blocks.sandstone_stairs, true);
|
|
||||||
hasOrientations.put(Blocks.brick_stairs, true);
|
|
||||||
hasOrientations.put(Blocks.birch_stairs, true);
|
|
||||||
hasOrientations.put(Blocks.oak_stairs, true);
|
|
||||||
hasOrientations.put(Blocks.jungle_stairs, true);
|
|
||||||
hasOrientations.put(Blocks.spruce_stairs, true);
|
|
||||||
hasOrientations.put(Blocks.log, true);
|
|
||||||
hasOrientations.put(Blocks.log2, true);
|
|
||||||
hasOrientations.put(Blocks.quartz_block, true);
|
|
||||||
hasOrientations.put(Blocks.rail, true);
|
|
||||||
hasOrientations.put(Blocks.activator_rail, true);
|
|
||||||
hasOrientations.put(Blocks.detector_rail, true);
|
|
||||||
hasOrientations.put(Blocks.golden_rail, true);
|
|
||||||
hasOrientations.put(Blocks.furnace, true);
|
|
||||||
hasOrientations.put(Blocks.lit_furnace, true);
|
|
||||||
hasOrientations.put(Blocks.bed, true);
|
|
||||||
|
|
||||||
hasOrientations.put(DimDoors.dimensionalDoor, true);
|
|
||||||
hasOrientations.put(DimDoors.warpDoor, true);
|
|
||||||
hasOrientations.put(DimDoors.goldenDimensionalDoor, true);
|
|
||||||
hasOrientations.put(DimDoors.personalDimDoor, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IBlockState transformMetadata(IBlockState state, int turns, Block block)
|
|
||||||
{
|
|
||||||
//I changed rotations to reduce the monstrous code we had. It might be
|
//I changed rotations to reduce the monstrous code we had. It might be
|
||||||
//slightly less efficient, but it's easier to maintain for now. ~SenseiKiwi
|
//slightly less efficient, but it's easier to maintain for now. ~SenseiKiwi
|
||||||
|
|
||||||
//Correct negative turns and get the minimum number of rotations needed
|
//Correct negative turns and get the minimum number of rotations needed
|
||||||
turns += 1 << 16;
|
turns += 1 << 16;
|
||||||
turns %= 4;
|
turns %= 4;
|
||||||
|
|
||||||
if (hasOrientations.containsKey(block) && hasOrientations.get(block))
|
while (turns > 0) {
|
||||||
{
|
for (IProperty prop : (java.util.Set<IProperty>)state.getProperties().keySet()) {
|
||||||
while (turns > 0)
|
if (prop.getName().equals("facing") || prop.getName().equals("rotation")) {
|
||||||
{
|
state.cycleProperty(prop);
|
||||||
state = rotateMetadataBy90(state, block);
|
}
|
||||||
turns--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
turns--;
|
||||||
}
|
}
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IBlockState rotateMetadataBy90(IBlockState state, Block block)
|
public static void transformPoint(BlockPos position, BlockPos srcOrigin, EnumFacing angle, BlockPos destOrigin) {
|
||||||
{
|
|
||||||
//TODO: Replace this horrible function with something prettier. We promise we will for the next version,
|
|
||||||
//after switching to MC 1.6. PADRE, PLEASE FORGIVE OUR SINS.
|
|
||||||
|
|
||||||
if (block == Blocks.log || block == Blocks.log2)
|
|
||||||
{
|
|
||||||
if (metadata >= 4 && metadata < 12)
|
|
||||||
{
|
|
||||||
metadata = (metadata % 8) + 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (block == Blocks.quartz_block)
|
|
||||||
{
|
|
||||||
if (metadata == 3 || metadata == 4)
|
|
||||||
{
|
|
||||||
metadata = (metadata - 2) % 2 + 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (block == Blocks.golden_rail || block == Blocks.detector_rail || block == Blocks.activator_rail)
|
|
||||||
{
|
|
||||||
switch (metadata)
|
|
||||||
{
|
|
||||||
//Powered Track/Detector Track/Activator Track (off)
|
|
||||||
case 0:
|
|
||||||
metadata = 1;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
metadata = 0;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
metadata = 5;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
metadata = 4;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
metadata = 2;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
metadata = 3;
|
|
||||||
break;
|
|
||||||
|
|
||||||
//Powered Track/Detector Track/Activator Track (on)
|
|
||||||
case 8:
|
|
||||||
metadata = 9;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
metadata = 8;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
metadata = 13;
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
metadata = 12;
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
metadata = 10;
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
metadata = 11;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (block==Blocks.rail)
|
|
||||||
{
|
|
||||||
switch (metadata)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
metadata = 1;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
metadata = 0;
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
metadata = 9;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
metadata = 6;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
metadata = 7;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
metadata = 8;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (block==Blocks.bed)
|
|
||||||
{
|
|
||||||
switch (metadata)
|
|
||||||
{
|
|
||||||
case 2:
|
|
||||||
metadata = 1;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
metadata = 0;
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
metadata = 3;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
metadata = 2;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
metadata = 9;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
metadata = 8;
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
metadata = 11;
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
metadata = 10;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (block instanceof BlockStairs)
|
|
||||||
{
|
|
||||||
|
|
||||||
switch (metadata)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
metadata = 2;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
metadata = 3;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
metadata = 1;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
metadata = 0;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
metadata = 4;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
metadata = 5;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
metadata = 7;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
metadata = 6;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (block == Blocks.chest || block == Blocks.trapped_chest || block == Blocks.ladder || block == Blocks.lit_furnace || block == Blocks.furnace)
|
|
||||||
{
|
|
||||||
switch (metadata)
|
|
||||||
{
|
|
||||||
case 2:
|
|
||||||
metadata = 5;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
metadata = 4;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
metadata = 2;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
metadata = 3;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (block == Blocks.hopper)
|
|
||||||
{
|
|
||||||
switch (metadata)
|
|
||||||
{
|
|
||||||
case 2:
|
|
||||||
metadata = 5;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
metadata = 4;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
metadata = 2;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
metadata = 3;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
metadata = 13;
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
metadata = 12;
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
metadata = 10;
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
metadata = 11;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (block==Blocks.vine)
|
|
||||||
{
|
|
||||||
switch (metadata)
|
|
||||||
{
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
metadata = 2;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
metadata = 4;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
metadata = 8;
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
metadata = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (block==Blocks.wall_sign)
|
|
||||||
{
|
|
||||||
switch (metadata)
|
|
||||||
{
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
metadata = 4;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
metadata = 5;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
metadata = 2;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
metadata = 3;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (block==Blocks.standing_sign)
|
|
||||||
{
|
|
||||||
switch (metadata)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
metadata = 4;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
metadata = 5;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
metadata = 6;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
metadata = 7;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
metadata = 8;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
metadata = 9;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
metadata = 10;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
metadata = 11;
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
metadata = 12;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
metadata = 13;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
metadata = 14;
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
metadata = 15;
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
metadata = 0;
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
metadata = 1;
|
|
||||||
break;
|
|
||||||
case 14:
|
|
||||||
metadata = 2;
|
|
||||||
break;
|
|
||||||
case 15:
|
|
||||||
metadata = 3;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(block== Blocks.lever || block == Blocks.stone_button || block == Blocks.wooden_button || block== Blocks.torch||block== Blocks.unlit_redstone_torch||block== Blocks.redstone_torch)
|
|
||||||
{
|
|
||||||
switch (metadata)
|
|
||||||
{
|
|
||||||
case 12:
|
|
||||||
metadata = 9;
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
metadata = 10;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
metadata = 12;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
metadata = 11;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
metadata = 4;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
metadata = 2;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
metadata = 3;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
metadata = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(block== Blocks.piston||block==Blocks.piston_head||block==Blocks.sticky_piston || block == Blocks.dispenser || block == Blocks.dropper)
|
|
||||||
{
|
|
||||||
switch (metadata)
|
|
||||||
{
|
|
||||||
case 4:
|
|
||||||
metadata = 2;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
metadata = 3;
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
metadata = 11;
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
metadata = 10;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
metadata = 4;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
metadata = 5;
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
metadata = 12;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
metadata = 13;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (block instanceof BlockRedstoneRepeater || block instanceof BlockDoor || block== Blocks.tripwire_hook || block instanceof BlockRedstoneComparator)
|
|
||||||
{
|
|
||||||
switch (metadata)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
metadata = 1;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
metadata = 2;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
metadata = 3;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
metadata = 0;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
metadata = 5;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
metadata = 6;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
metadata = 7;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
metadata = 4;
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
metadata = 9;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
metadata = 10;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
metadata = 11;
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
metadata = 8;
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
metadata = 13;
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
metadata = 14;
|
|
||||||
break;
|
|
||||||
case 14:
|
|
||||||
metadata = 15;
|
|
||||||
break;
|
|
||||||
case 15:
|
|
||||||
metadata = 12;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return metadata;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void transformPoint(BlockPos position, BlockPos srcOrigin, EnumFacing angle, BlockPos destOrigin)
|
|
||||||
{
|
|
||||||
//This function receives a position (e.g. point in schematic space), translates it relative
|
//This function receives a position (e.g. point in schematic space), translates it relative
|
||||||
//to a source coordinate system (e.g. the point that will be the center of a schematic),
|
//to a source coordinate system (e.g. the point that will be the center of a schematic),
|
||||||
//then rotates and translates it to obtain the corresponding point in a destination
|
//then rotates and translates it to obtain the corresponding point in a destination
|
||||||
|
|
|
@ -26,12 +26,12 @@ import net.minecraft.world.World;
|
||||||
public class Schematic {
|
public class Schematic {
|
||||||
|
|
||||||
protected BlockPos volume;
|
protected BlockPos volume;
|
||||||
protected IBlockState[] state;
|
protected IBlockState[] states;
|
||||||
protected NBTTagList tileEntities;
|
protected NBTTagList tileEntities;
|
||||||
|
|
||||||
protected Schematic(BlockPos volume, IBlockState[] state, NBTTagList tileEntities) {
|
protected Schematic(BlockPos volume, IBlockState[] state, NBTTagList tileEntities) {
|
||||||
this.volume = volume;
|
this.volume = volume;
|
||||||
this.state = state;
|
this.states = state;
|
||||||
this.tileEntities = tileEntities;
|
this.tileEntities = tileEntities;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ public class Schematic {
|
||||||
//Shallow copy constructor - critical for code reuse in derived classes since
|
//Shallow copy constructor - critical for code reuse in derived classes since
|
||||||
//source's fields will be inaccessible if the derived class is in another package.
|
//source's fields will be inaccessible if the derived class is in another package.
|
||||||
this.volume = source.volume;
|
this.volume = source.volume;
|
||||||
this.state = source.state;
|
this.states = source.states;
|
||||||
this.tileEntities = source.tileEntities;
|
this.tileEntities = source.tileEntities;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,11 +73,11 @@ public class Schematic {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Block getBlock(BlockPos pos) {
|
public Block getBlock(BlockPos pos) {
|
||||||
return state[calculateIndex(pos)].getBlock();
|
return states[calculateIndex(pos)].getBlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IBlockState getBlockState(BlockPos pos) {
|
public IBlockState getBlockState(BlockPos pos) {
|
||||||
return state[calculateIndex(pos)];
|
return states[calculateIndex(pos)];
|
||||||
}
|
}
|
||||||
|
|
||||||
public NBTTagList getTileEntities() {
|
public NBTTagList getTileEntities() {
|
||||||
|
@ -197,7 +197,7 @@ public class Schematic {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected NBTTagCompound writeToNBT(boolean copyTileEntities) {
|
protected NBTTagCompound writeToNBT(boolean copyTileEntities) {
|
||||||
return writeToNBT(volume, state, tileEntities, copyTileEntities);
|
return writeToNBT(volume, states, tileEntities, copyTileEntities);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static NBTTagCompound writeToNBT(BlockPos volume, IBlockState[] state, NBTTagList tileEntities, boolean copyTileEntities) {
|
protected static NBTTagCompound writeToNBT(BlockPos volume, IBlockState[] state, NBTTagList tileEntities, boolean copyTileEntities) {
|
||||||
|
@ -245,7 +245,7 @@ public class Schematic {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean applyFilter(SchematicFilter filter) {
|
public boolean applyFilter(SchematicFilter filter) {
|
||||||
return filter.apply(this, this.state);
|
return filter.apply(this, this.states);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void copyToWorld(World world, BlockPos pos, boolean notifyClients, boolean ignoreAir) {
|
public void copyToWorld(World world, BlockPos pos, boolean notifyClients, boolean ignoreAir) {
|
||||||
|
@ -268,7 +268,7 @@ public class Schematic {
|
||||||
for (dy = 0; dy < volume.getY(); dy++) {
|
for (dy = 0; dy < volume.getY(); dy++) {
|
||||||
for (dz = 0; dz < volume.getZ(); dz++) {
|
for (dz = 0; dz < volume.getZ(); dz++) {
|
||||||
for (dx = 0; dx < volume.getX(); dx++) {
|
for (dx = 0; dx < volume.getX(); dx++) {
|
||||||
blockSetter.setBlock(world, pos.add(dx, dy, dz), state[index]);
|
blockSetter.setBlock(world, pos.add(dx, dy, dz), states[index]);
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,32 +4,28 @@ import java.util.ArrayList;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
|
||||||
import com.zixiken.dimdoors.core.DDTeleporter;
|
import com.zixiken.dimdoors.core.DDTeleporter;
|
||||||
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||||
import cpw.mods.fml.common.gameevent.TickEvent;
|
import net.minecraftforge.fml.common.gameevent.TickEvent;
|
||||||
import cpw.mods.fml.relauncher.Side;
|
import net.minecraftforge.fml.relauncher.Side;
|
||||||
|
|
||||||
public class ServerTickHandler implements IRegularTickSender
|
public class ServerTickHandler implements IRegularTickSender {
|
||||||
{
|
|
||||||
private static final String PROFILING_LABEL = "Dimensional Doors: Server Tick";
|
private static final String PROFILING_LABEL = "Dimensional Doors: Server Tick";
|
||||||
|
|
||||||
private int tickCount = 0;
|
private int tickCount = 0;
|
||||||
private ArrayList<RegularTickReceiverInfo> receivers;
|
private ArrayList<RegularTickReceiverInfo> receivers;
|
||||||
|
|
||||||
public ServerTickHandler()
|
public ServerTickHandler() {
|
||||||
{
|
|
||||||
this.receivers = new ArrayList<RegularTickReceiverInfo>();
|
this.receivers = new ArrayList<RegularTickReceiverInfo>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerReceiver(IRegularTickReceiver receiver, int interval, boolean onTickStart)
|
public void registerReceiver(IRegularTickReceiver receiver, int interval, boolean onTickStart) {
|
||||||
{
|
|
||||||
RegularTickReceiverInfo info = new RegularTickReceiverInfo(receiver, interval, onTickStart);
|
RegularTickReceiverInfo info = new RegularTickReceiverInfo(receiver, interval, onTickStart);
|
||||||
receivers.add(info);
|
receivers.add(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void unregisterReceivers()
|
public void unregisterReceivers() {
|
||||||
{
|
|
||||||
receivers.clear();
|
receivers.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,12 +41,9 @@ public class ServerTickHandler implements IRegularTickSender
|
||||||
}
|
}
|
||||||
|
|
||||||
private void tickStart(TickEvent.Type type) {
|
private void tickStart(TickEvent.Type type) {
|
||||||
if (type.equals(EnumSet.of(TickEvent.Type.SERVER)))
|
if (type.equals(EnumSet.of(TickEvent.Type.SERVER))) {
|
||||||
{
|
for (RegularTickReceiverInfo info : receivers) {
|
||||||
for (RegularTickReceiverInfo info : receivers)
|
if (info.OnTickStart && tickCount % info.Interval == 0) {
|
||||||
{
|
|
||||||
if (info.OnTickStart && tickCount % info.Interval == 0)
|
|
||||||
{
|
|
||||||
info.RegularTickReceiver.notifyTick();
|
info.RegularTickReceiver.notifyTick();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,18 +51,14 @@ public class ServerTickHandler implements IRegularTickSender
|
||||||
|
|
||||||
//TODO: Stuck this in here because it's already rather hackish.
|
//TODO: Stuck this in here because it's already rather hackish.
|
||||||
//We should standardize this as an IRegularTickReceiver in the future. ~SenseiKiwi
|
//We should standardize this as an IRegularTickReceiver in the future. ~SenseiKiwi
|
||||||
if (DDTeleporter.cooldown > 0)
|
if (DDTeleporter.cooldown > 0) {
|
||||||
{
|
|
||||||
DDTeleporter.cooldown--;
|
DDTeleporter.cooldown--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void tickEnd(TickEvent.Type type)
|
private void tickEnd(TickEvent.Type type) {
|
||||||
{
|
for (RegularTickReceiverInfo info : receivers) {
|
||||||
for (RegularTickReceiverInfo info : receivers)
|
if (!info.OnTickStart && tickCount % info.Interval == 0) {
|
||||||
{
|
|
||||||
if (!info.OnTickStart && tickCount % info.Interval == 0)
|
|
||||||
{
|
|
||||||
info.RegularTickReceiver.notifyTick();
|
info.RegularTickReceiver.notifyTick();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import java.util.Random;
|
||||||
|
|
||||||
import com.zixiken.dimdoors.DimDoors;
|
import com.zixiken.dimdoors.DimDoors;
|
||||||
import com.zixiken.dimdoors.core.DimLink;
|
import com.zixiken.dimdoors.core.DimLink;
|
||||||
|
import com.zixiken.dimdoors.helpers.BlockPosHelper;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
|
@ -71,30 +72,22 @@ public class PocketBuilder
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean generateSelectedDungeonPocket(DimLink link, DDProperties properties, DungeonData dungeon)
|
public static boolean generateSelectedDungeonPocket(DimLink link, DDProperties properties, DungeonData dungeon) {
|
||||||
{
|
if (link == null) {
|
||||||
if (link == null)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("link cannot be null.");
|
throw new IllegalArgumentException("link cannot be null.");
|
||||||
}
|
} if (properties == null) {
|
||||||
if (properties == null)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("properties cannot be null.");
|
throw new IllegalArgumentException("properties cannot be null.");
|
||||||
}
|
} if (link.hasDestination()) {
|
||||||
if (link.hasDestination())
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("link cannot have a destination assigned already.");
|
throw new IllegalArgumentException("link cannot have a destination assigned already.");
|
||||||
}
|
} if (dungeon == null) {
|
||||||
if (dungeon == null)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("dungeon cannot be null.");
|
throw new IllegalArgumentException("dungeon cannot be null.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to load up the schematic
|
// Try to load up the schematic
|
||||||
DungeonSchematic schematic = null;
|
DungeonSchematic schematic = null;
|
||||||
schematic = loadAndValidateDungeon(dungeon, properties);
|
schematic = loadAndValidateDungeon(dungeon, properties);
|
||||||
if (schematic == null)
|
|
||||||
{
|
if (schematic == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,8 +98,7 @@ public class PocketBuilder
|
||||||
//Load a world
|
//Load a world
|
||||||
World world = PocketManager.loadDimension(dimension.id());
|
World world = PocketManager.loadDimension(dimension.id());
|
||||||
|
|
||||||
if (world == null || world.provider == null)
|
if (world == null || world.provider == null) {
|
||||||
{
|
|
||||||
System.err.println("Could not initialize dimension for a dungeon!");
|
System.err.println("Could not initialize dimension for a dungeon!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -115,30 +107,26 @@ public class PocketBuilder
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static boolean generateNewDungeonPocket(DimLink link, DDProperties properties)
|
public static boolean generateNewDungeonPocket(DimLink link, DDProperties properties) {
|
||||||
{
|
if (link == null) {
|
||||||
if (link == null)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("link cannot be null.");
|
throw new IllegalArgumentException("link cannot be null.");
|
||||||
}
|
} if (properties == null) {
|
||||||
if (properties == null)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("properties cannot be null.");
|
throw new IllegalArgumentException("properties cannot be null.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (link.hasDestination())
|
if (link.hasDestination()) {
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("link cannot have a destination assigned already.");
|
throw new IllegalArgumentException("link cannot have a destination assigned already.");
|
||||||
}
|
}
|
||||||
|
|
||||||
//Choose a dungeon to generate
|
//Choose a dungeon to generate
|
||||||
NewDimData parent = PocketManager.getDimensionData(link.source().getDimension());
|
NewDimData parent = PocketManager.getDimensionData(link.source().getDimension());
|
||||||
Pair<DungeonData, DungeonSchematic> pair = selectNextDungeon(parent, random, properties);
|
Pair<DungeonData, DungeonSchematic> pair = selectNextDungeon(parent, random, properties);
|
||||||
if (pair == null)
|
|
||||||
{
|
if (pair == null) {
|
||||||
System.err.println("Could not select a dungeon for generation!");
|
System.err.println("Could not select a dungeon for generation!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DungeonData dungeon = pair.getFirst();
|
DungeonData dungeon = pair.getFirst();
|
||||||
DungeonSchematic schematic = pair.getSecond();
|
DungeonSchematic schematic = pair.getSecond();
|
||||||
|
|
||||||
|
@ -148,8 +136,7 @@ public class PocketBuilder
|
||||||
//Load a world
|
//Load a world
|
||||||
World world = PocketManager.loadDimension(dimension.id());
|
World world = PocketManager.loadDimension(dimension.id());
|
||||||
|
|
||||||
if (world == null || world.provider == null)
|
if (world == null || world.provider == null) {
|
||||||
{
|
|
||||||
System.err.println("Could not initialize dimension for a dungeon!");
|
System.err.println("Could not initialize dimension for a dungeon!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -158,8 +145,7 @@ public class PocketBuilder
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static BlockPos calculateNoisyDestination(Point4D source, NewDimData dimension, DungeonData dungeon, int orientation)
|
private static BlockPos calculateNoisyDestination(Point4D source, NewDimData dimension, DungeonData dungeon, EnumFacing facing) {
|
||||||
{
|
|
||||||
int depth = NewDimData.calculatePackDepth(dimension.parent(), dungeon);
|
int depth = NewDimData.calculatePackDepth(dimension.parent(), dungeon);
|
||||||
int forwardNoise = MathHelper.getRandomIntegerInRange(random, 10 * depth, 130 * depth);
|
int forwardNoise = MathHelper.getRandomIntegerInRange(random, 10 * depth, 130 * depth);
|
||||||
int sidewaysNoise = MathHelper.getRandomIntegerInRange(random, -10 * depth, 10 * depth);
|
int sidewaysNoise = MathHelper.getRandomIntegerInRange(random, -10 * depth, 10 * depth);
|
||||||
|
@ -170,100 +156,80 @@ public class PocketBuilder
|
||||||
BlockPos linkDestination = new BlockPos(forwardNoise, 0, sidewaysNoise);
|
BlockPos linkDestination = new BlockPos(forwardNoise, 0, sidewaysNoise);
|
||||||
BlockPos sourcePoint = new BlockPos(source.getX(), source.getY(), source.getZ());
|
BlockPos sourcePoint = new BlockPos(source.getX(), source.getY(), source.getZ());
|
||||||
BlockPos zeroPoint = new BlockPos(0, 0, 0);
|
BlockPos zeroPoint = new BlockPos(0, 0, 0);
|
||||||
BlockRotator.transformPoint(linkDestination, zeroPoint, orientation - BlockRotator.EAST_DOOR_METADATA, sourcePoint);
|
BlockRotator.transformPoint(linkDestination, zeroPoint, facing, sourcePoint);
|
||||||
return linkDestination;
|
return linkDestination;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Pair<DungeonData, DungeonSchematic> selectNextDungeon(NewDimData parent, Random random, DDProperties properties)
|
private static Pair<DungeonData, DungeonSchematic> selectNextDungeon(NewDimData parent, Random random, DDProperties properties) {
|
||||||
{
|
|
||||||
DungeonData dungeon = null;
|
DungeonData dungeon = null;
|
||||||
DungeonSchematic schematic = null;
|
DungeonSchematic schematic = null;
|
||||||
|
|
||||||
dungeon = DungeonHelper.instance().selectNextDungeon(parent, random);
|
dungeon = DungeonHelper.instance().selectNextDungeon(parent, random);
|
||||||
|
|
||||||
if (dungeon != null)
|
if (dungeon != null) {
|
||||||
{
|
|
||||||
schematic = loadAndValidateDungeon(dungeon, properties);
|
schematic = loadAndValidateDungeon(dungeon, properties);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
System.err.println("Could not select a dungeon at all!");
|
System.err.println("Could not select a dungeon at all!");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (schematic == null)
|
if (schematic == null) {
|
||||||
{
|
|
||||||
//TODO: In the future, remove this dungeon from the generation lists altogether.
|
//TODO: In the future, remove this dungeon from the generation lists altogether.
|
||||||
//That will have to wait until our code is updated to support that more easily.
|
//That will have to wait until our code is updated to support that more easily.
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
System.err.println("Loading the default error dungeon instead...");
|
System.err.println("Loading the default error dungeon instead...");
|
||||||
dungeon = DungeonHelper.instance().getDefaultErrorDungeon();
|
dungeon = DungeonHelper.instance().getDefaultErrorDungeon();
|
||||||
schematic = loadAndValidateDungeon(dungeon, properties);
|
schematic = loadAndValidateDungeon(dungeon, properties);
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Pair<DungeonData, DungeonSchematic>(dungeon, schematic);
|
return new Pair<DungeonData, DungeonSchematic>(dungeon, schematic);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DungeonSchematic loadAndValidateDungeon(DungeonData dungeon, DDProperties properties)
|
private static DungeonSchematic loadAndValidateDungeon(DungeonData dungeon, DDProperties properties) {
|
||||||
{
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
DungeonSchematic schematic = dungeon.loadSchematic();
|
DungeonSchematic schematic = dungeon.loadSchematic();
|
||||||
|
|
||||||
//Validate the dungeon's dimensions
|
//Validate the dungeon's dimensions
|
||||||
if (hasValidDimensions(schematic))
|
if (hasValidDimensions(schematic)) {
|
||||||
{
|
|
||||||
schematic.applyImportFilters(properties);
|
schematic.applyImportFilters(properties);
|
||||||
|
|
||||||
//Check that the dungeon has an entrance or we'll have a crash
|
//Check that the dungeon has an entrance or we'll have a crash
|
||||||
if (schematic.getEntranceDoorLocation() == null)
|
if (schematic.getEntranceDoorLocation() == null) {
|
||||||
{
|
|
||||||
System.err.println("The following schematic file does not have an entrance: " + dungeon.schematicPath());
|
System.err.println("The following schematic file does not have an entrance: " + dungeon.schematicPath());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
System.err.println("The following schematic file has dimensions that exceed the maximum permitted dimensions for dungeons: " + dungeon.schematicPath());
|
System.err.println("The following schematic file has dimensions that exceed the maximum permitted dimensions for dungeons: " + dungeon.schematicPath());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return schematic;
|
return schematic;
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
System.err.println("An error occurred while loading the following schematic: " + dungeon.schematicPath());
|
System.err.println("An error occurred while loading the following schematic: " + dungeon.schematicPath());
|
||||||
System.err.println(e.getMessage());
|
System.err.println(e.getMessage());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean hasValidDimensions(DungeonSchematic schematic)
|
private static boolean hasValidDimensions(DungeonSchematic schematic) {
|
||||||
{
|
return BlockPosHelper.lessThanOrEqual(schematic.getVolume(), DungeonHelper.MAX_DUNGEON_SIZE);
|
||||||
return (schematic.getWidth() <= DungeonHelper.MAX_DUNGEON_WIDTH &&
|
|
||||||
schematic.getHeight() <= DungeonHelper.MAX_DUNGEON_HEIGHT &&
|
|
||||||
schematic.getLength() <= DungeonHelper.MAX_DUNGEON_LENGTH);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean generateNewPocket(DimLink link, DDProperties properties, Block door, DimensionType type)
|
public static boolean generateNewPocket(DimLink link, DDProperties properties, Block door, DimensionType type) {
|
||||||
{
|
|
||||||
return generateNewPocket(link, DEFAULT_POCKET_SIZE, DEFAULT_POCKET_WALL_THICKNESS, properties, door, type);
|
return generateNewPocket(link, DEFAULT_POCKET_SIZE, DEFAULT_POCKET_WALL_THICKNESS, properties, door, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getDoorOrientation(Point4D source, DDProperties properties)
|
private static int getDoorOrientation(Point4D source, DDProperties properties) {
|
||||||
{
|
|
||||||
World world = DimensionManager.getWorld(source.getDimension());
|
World world = DimensionManager.getWorld(source.getDimension());
|
||||||
if (world == null)
|
|
||||||
{
|
if (world == null) throw new IllegalStateException("The link's source world should be loaded!");
|
||||||
throw new IllegalStateException("The link's source world should be loaded!");
|
|
||||||
}
|
|
||||||
|
|
||||||
//Check if the block below that point is actually a door
|
//Check if the block below that point is actually a door
|
||||||
Block block = world.getBlock(source.getX(), source.getY() - 1, source.getZ());
|
Block block = world.getBlock(source.getX().getX(), source.getY() - 1, source.getZ());
|
||||||
if (block==null || !(block instanceof IDimDoor))
|
if (block==null || !(block instanceof IDimDoor))
|
||||||
{
|
{
|
||||||
throw new IllegalStateException("The link's source is not a door block. It should be impossible to traverse a rift without a door!");
|
throw new IllegalStateException("The link's source is not a door block. It should be impossible to traverse a rift without a door!");
|
||||||
|
|
|
@ -5,81 +5,55 @@ import java.util.List;
|
||||||
import com.zixiken.dimdoors.core.NewDimData;
|
import com.zixiken.dimdoors.core.NewDimData;
|
||||||
import com.zixiken.dimdoors.core.PocketManager;
|
import com.zixiken.dimdoors.core.PocketManager;
|
||||||
import com.zixiken.dimdoors.ticking.CustomLimboPopulator;
|
import com.zixiken.dimdoors.ticking.CustomLimboPopulator;
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.entity.EnumCreatureType;
|
import net.minecraft.entity.EnumCreatureType;
|
||||||
import net.minecraft.world.ChunkPosition;
|
import net.minecraft.util.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
|
import net.minecraft.world.chunk.ChunkPrimer;
|
||||||
import net.minecraft.world.chunk.IChunkProvider;
|
import net.minecraft.world.chunk.IChunkProvider;
|
||||||
import net.minecraft.world.gen.ChunkProviderGenerate;
|
import net.minecraft.world.gen.ChunkProviderGenerate;
|
||||||
|
|
||||||
public class PocketGenerator extends ChunkProviderGenerate
|
public class PocketGenerator extends ChunkProviderGenerate {
|
||||||
{
|
|
||||||
private World worldObj;
|
private World worldObj;
|
||||||
|
|
||||||
private CustomLimboPopulator spawner;
|
private CustomLimboPopulator spawner;
|
||||||
|
|
||||||
public PocketGenerator(World par1World, long par2, boolean par4, CustomLimboPopulator spawner)
|
public PocketGenerator(World par1World, long par2, boolean par4, CustomLimboPopulator spawner) {
|
||||||
{
|
super(par1World, par2, par4, null);
|
||||||
super(par1World, par2, par4);
|
|
||||||
this.worldObj = par1World;
|
this.worldObj = par1World;
|
||||||
|
|
||||||
this.spawner = spawner;
|
this.spawner = spawner;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void func_147424_a(int par1, int par2, Block[] blocks)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean unloadQueuedChunks()
|
public boolean unloadQueuedChunks() {
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Chunk provideChunk(int chunkX, int chunkZ)
|
public Chunk provideChunk(int chunkX, int chunkZ) {
|
||||||
{
|
Chunk chunk = new Chunk(worldObj, new ChunkPrimer(), chunkX, chunkZ);
|
||||||
Block[] var3 = new Block[32768];
|
|
||||||
Chunk chunk = new Chunk(worldObj, var3, chunkX, chunkZ);
|
|
||||||
|
|
||||||
if(!chunk.isTerrainPopulated)
|
if(!chunk.isTerrainPopulated()) {
|
||||||
{
|
chunk.setTerrainPopulated(true);
|
||||||
chunk.isTerrainPopulated = true;
|
spawner.registerChunkForPopulation(worldObj.provider.getDimensionId(), chunkX, chunkZ);
|
||||||
spawner.registerChunkForPopulation(worldObj.provider.dimensionId, chunkX, chunkZ);
|
|
||||||
}
|
}
|
||||||
return chunk;
|
return chunk;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Chunk loadChunk(int var1, int var2)
|
public void populate(IChunkProvider chunkProvider, int chunkX, int chunkZ) {
|
||||||
{
|
|
||||||
return this.provideChunk(var1, var2);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void populate(IChunkProvider chunkProvider, int chunkX, int chunkZ)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
@Override
|
@Override
|
||||||
public List getPossibleCreatures(EnumCreatureType var1, int var2, int var3, int var4)
|
public List getPossibleCreatures(EnumCreatureType type, BlockPos pos) {
|
||||||
{
|
|
||||||
NewDimData dimension = PocketManager.createDimensionData(this.worldObj);
|
NewDimData dimension = PocketManager.createDimensionData(this.worldObj);
|
||||||
if (dimension != null && dimension.dungeon() != null && !dimension.dungeon().isOpen())
|
if (dimension != null && dimension.dungeon() != null && !dimension.dungeon().isOpen()) {
|
||||||
{
|
return this.worldObj.getBiomeGenForCoords(pos).getSpawnableList(type);
|
||||||
return this.worldObj.getBiomeGenForCoords(var2, var3).getSpawnableList(var1);
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ChunkPosition func_147416_a(World var1, String var2, int var3, int var4, int var5)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -7,6 +7,7 @@ import com.zixiken.dimdoors.core.PocketManager;
|
||||||
import com.zixiken.dimdoors.ticking.CustomLimboPopulator;
|
import com.zixiken.dimdoors.ticking.CustomLimboPopulator;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.player.EntityPlayerMP;
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
|
import net.minecraft.util.BlockPos;
|
||||||
import net.minecraft.util.Vec3;
|
import net.minecraft.util.Vec3;
|
||||||
import net.minecraft.world.WorldProvider;
|
import net.minecraft.world.WorldProvider;
|
||||||
import net.minecraft.world.biome.WorldChunkManagerHell;
|
import net.minecraft.world.biome.WorldChunkManagerHell;
|
||||||
|
@ -14,17 +15,15 @@ import net.minecraft.world.chunk.IChunkProvider;
|
||||||
import net.minecraftforge.client.IRenderHandler;
|
import net.minecraftforge.client.IRenderHandler;
|
||||||
import com.zixiken.dimdoors.CloudRenderBlank;
|
import com.zixiken.dimdoors.CloudRenderBlank;
|
||||||
import com.zixiken.dimdoors.core.DimensionType;
|
import com.zixiken.dimdoors.core.DimensionType;
|
||||||
import cpw.mods.fml.relauncher.Side;
|
import net.minecraftforge.fml.relauncher.Side;
|
||||||
import cpw.mods.fml.relauncher.SideOnly;
|
import net.minecraftforge.fml.relauncher.SideOnly;;
|
||||||
|
|
||||||
public class PocketProvider extends WorldProvider
|
public class PocketProvider extends WorldProvider {
|
||||||
{
|
|
||||||
private DDProperties properties;
|
private DDProperties properties;
|
||||||
protected CustomLimboPopulator spawner;
|
protected CustomLimboPopulator spawner;
|
||||||
protected IRenderHandler skyRenderer;
|
protected IRenderHandler skyRenderer;
|
||||||
|
|
||||||
public PocketProvider()
|
public PocketProvider() {
|
||||||
{
|
|
||||||
this.hasNoSky = true;
|
this.hasNoSky = true;
|
||||||
this.skyRenderer = new PocketSkyProvider();
|
this.skyRenderer = new PocketSkyProvider();
|
||||||
|
|
||||||
|
@ -33,8 +32,7 @@ public class PocketProvider extends WorldProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void registerWorldChunkManager()
|
protected void registerWorldChunkManager() {
|
||||||
{
|
|
||||||
super.worldChunkMgr = new WorldChunkManagerHell(DimDoors.pocketBiome, 1);
|
super.worldChunkMgr = new WorldChunkManagerHell(DimDoors.pocketBiome, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,75 +43,65 @@ public class PocketProvider extends WorldProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Vec3 getSkyColor(Entity cameraEntity, float partialTicks)
|
public Vec3 getSkyColor(Entity cameraEntity, float partialTicks) {
|
||||||
{
|
|
||||||
setCloudRenderer( new CloudRenderBlank());
|
setCloudRenderer( new CloudRenderBlank());
|
||||||
return Vec3.createVectorHelper(0d, 0d, 0d);
|
return new Vec3(0d, 0d, 0d);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
@Override
|
@Override
|
||||||
public Vec3 getFogColor(float par1, float par2)
|
public Vec3 getFogColor(float par1, float par2) {
|
||||||
{
|
return new Vec3(0d, 0d, 0d);
|
||||||
return Vec3.createVectorHelper(0d, 0d, 0d);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getHorizon()
|
public double getHorizon() {
|
||||||
{
|
|
||||||
return worldObj.getHeight();
|
return worldObj.getHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IChunkProvider createChunkGenerator()
|
public IChunkProvider createChunkGenerator() {
|
||||||
{
|
|
||||||
return new PocketGenerator(worldObj, dimensionId, false, spawner);
|
return new PocketGenerator(worldObj, dimensionId, false, spawner);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canSnowAt(int x, int y, int z, boolean light)
|
public boolean canSnowAt(BlockPos pos, boolean light) {
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canBlockFreeze(int x, int y, int z, boolean byWater)
|
public boolean canBlockFreeze(BlockPos pos, boolean byWater) {
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public float calculateCelestialAngle(long par1, float par3)
|
public float calculateCelestialAngle(long par1, float par3) {
|
||||||
{
|
|
||||||
return .5F;
|
return .5F;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void generateLightBrightnessTable()
|
protected void generateLightBrightnessTable() {
|
||||||
{
|
if (!PocketManager.isLoaded()) {
|
||||||
if (!PocketManager.isLoaded())
|
|
||||||
{
|
|
||||||
super.generateLightBrightnessTable();
|
super.generateLightBrightnessTable();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
NewDimData data = PocketManager.getDimensionData(this.dimensionId);
|
NewDimData data = PocketManager.getDimensionData(this.dimensionId);
|
||||||
if(data == null || data.type() == DimensionType.POCKET)
|
if(data == null || data.type() == DimensionType.POCKET) {
|
||||||
{
|
|
||||||
super.generateLightBrightnessTable();
|
super.generateLightBrightnessTable();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
float modifier = 0.0F;
|
float modifier = 0.0F;
|
||||||
|
|
||||||
for (int steps = 0; steps <= 15; ++steps)
|
for (int steps = 0; steps <= 15; ++steps) {
|
||||||
{
|
|
||||||
float var3 = (float) (Math.pow(steps,1.5) / Math.pow(15.0F,1.5));
|
float var3 = (float) (Math.pow(steps,1.5) / Math.pow(15.0F,1.5));
|
||||||
this.lightBrightnessTable[15-steps] = var3;
|
this.lightBrightnessTable[15-steps] = var3;
|
||||||
System.out.println( this.lightBrightnessTable[steps]+"light");
|
System.out.println( this.lightBrightnessTable[steps]+"light");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDimensionName()
|
public String getDimensionName() {
|
||||||
{
|
|
||||||
//TODO: This should be a proper name. We need to show people proper names for things whenever possible.
|
//TODO: This should be a proper name. We need to show people proper names for things whenever possible.
|
||||||
//The question is whether this should be "Pocket Dimension" or "Pocket Dimension #" -- I'm not going to change
|
//The question is whether this should be "Pocket Dimension" or "Pocket Dimension #" -- I'm not going to change
|
||||||
//it out of concern that it could break something. ~SenseiKiwi
|
//it out of concern that it could break something. ~SenseiKiwi
|
||||||
|
@ -121,16 +109,17 @@ public class PocketProvider extends WorldProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getRespawnDimension(EntityPlayerMP player)
|
public String getInternalNameSuffix() {
|
||||||
{
|
return "_pocket";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getRespawnDimension(EntityPlayerMP player) {
|
||||||
int respawnDim;
|
int respawnDim;
|
||||||
|
|
||||||
if (properties.LimboEnabled)
|
if (properties.LimboEnabled) {
|
||||||
{
|
|
||||||
respawnDim = properties.LimboDimensionID;
|
respawnDim = properties.LimboDimensionID;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
respawnDim = PocketManager.getDimensionData(this.dimensionId).root().id();
|
respawnDim = PocketManager.getDimensionData(this.dimensionId).root().id();
|
||||||
}
|
}
|
||||||
// TODO: Are we sure we need to load the dimension as well? Why can't the game handle that?
|
// TODO: Are we sure we need to load the dimension as well? Why can't the game handle that?
|
||||||
|
@ -139,14 +128,12 @@ public class PocketProvider extends WorldProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canRespawnHere()
|
public boolean canRespawnHere() {
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getActualHeight()
|
public int getActualHeight() {
|
||||||
{
|
|
||||||
return 256;
|
return 256;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.zixiken.dimdoors.world.gateways;
|
package com.zixiken.dimdoors.world.gateways;
|
||||||
|
|
||||||
import com.zixiken.dimdoors.config.DDProperties;
|
import com.zixiken.dimdoors.config.DDProperties;
|
||||||
|
import net.minecraft.util.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.biome.BiomeGenBase;
|
import net.minecraft.world.biome.BiomeGenBase;
|
||||||
|
|
||||||
|
@ -16,27 +17,21 @@ public abstract class BaseGateway
|
||||||
/**
|
/**
|
||||||
* Generates the gateway centered on the given coordinates
|
* Generates the gateway centered on the given coordinates
|
||||||
* @param world - the world in which to generate the 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 pos - the 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);
|
public abstract boolean generate(World world, BlockPos pos);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines whether the specified biome is a valid biome in which to generate this gateway
|
* Determines whether the specified biome is a valid biome in which to generate this gateway
|
||||||
* @param biome - the biome to be checked
|
* @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>
|
* @return <code>true</code> true if the specified biome is a valid for generating this gateway, otherwise <code>false</code>
|
||||||
*/
|
*/
|
||||||
protected boolean isBiomeValid(BiomeGenBase biome)
|
protected boolean isBiomeValid(BiomeGenBase biome) {
|
||||||
{
|
|
||||||
String biomeName = biome.biomeName.toLowerCase();
|
String biomeName = biome.biomeName.toLowerCase();
|
||||||
String[] keywords = this.getBiomeKeywords();
|
String[] keywords = this.getBiomeKeywords();
|
||||||
if (keywords != null)
|
if (keywords != null) {
|
||||||
{
|
for (String keyword : keywords) {
|
||||||
for (String keyword : keywords)
|
if (biomeName.contains(keyword)) {
|
||||||
{
|
|
||||||
if (biomeName.contains(keyword))
|
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,14 +43,11 @@ public abstract class BaseGateway
|
||||||
/**
|
/**
|
||||||
* Determines whether the specified world and coordinates are a valid location for generating this gateway
|
* 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 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 pos - the 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>
|
* @return <code>true</code> if the location is valid, otherwise <code>false</code>
|
||||||
*/
|
*/
|
||||||
public boolean isLocationValid(World world, int x, int y, int z)
|
public boolean isLocationValid(World world, BlockPos pos) {
|
||||||
{
|
return isBiomeValid(world.getBiomeGenForCoords(pos));
|
||||||
return isBiomeValid(world.getBiomeGenForCoords(x, z));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -71,8 +63,7 @@ public abstract class BaseGateway
|
||||||
* Gets the lowercase keywords to be used in checking whether a given biome is a valid location for this gateway
|
* 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
|
* @return an array of biome keywords to match against
|
||||||
*/
|
*/
|
||||||
public String[] getBiomeKeywords()
|
public String[] getBiomeKeywords() {
|
||||||
{
|
|
||||||
return new String[] { "" };
|
return new String[] { "" };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,26 +6,23 @@ import com.zixiken.dimdoors.core.LinkType;
|
||||||
import com.zixiken.dimdoors.core.PocketManager;
|
import com.zixiken.dimdoors.core.PocketManager;
|
||||||
import com.zixiken.dimdoors.dungeon.DungeonSchematic;
|
import com.zixiken.dimdoors.dungeon.DungeonSchematic;
|
||||||
import com.zixiken.dimdoors.schematic.InvalidSchematicException;
|
import com.zixiken.dimdoors.schematic.InvalidSchematicException;
|
||||||
|
import net.minecraft.util.BlockPos;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
import net.minecraft.util.Vec3i;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
public abstract class BaseSchematicGateway extends BaseGateway
|
public abstract class BaseSchematicGateway extends BaseGateway {
|
||||||
{
|
public BaseSchematicGateway(DDProperties properties) {
|
||||||
public BaseSchematicGateway(DDProperties properties)
|
|
||||||
{
|
|
||||||
super(properties);
|
super(properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean generate(World world, int x, int y, int z)
|
public boolean generate(World world, BlockPos pos) {
|
||||||
{
|
|
||||||
DungeonSchematic schematic;
|
DungeonSchematic schematic;
|
||||||
|
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
schematic = DungeonSchematic.readFromResource(this.getSchematicPath());
|
schematic = DungeonSchematic.readFromResource(this.getSchematicPath());
|
||||||
}
|
} catch (InvalidSchematicException e) {
|
||||||
catch (InvalidSchematicException e)
|
|
||||||
{
|
|
||||||
System.err.println("Could not load the schematic for a gateway. The following exception occurred:");
|
System.err.println("Could not load the schematic for a gateway. The following exception occurred:");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return false;
|
return false;
|
||||||
|
@ -37,14 +34,14 @@ public abstract class BaseSchematicGateway extends BaseGateway
|
||||||
schematic.applyImportFilters(properties);
|
schematic.applyImportFilters(properties);
|
||||||
|
|
||||||
BlockPos doorLocation = gatewayFilter.getEntranceDoorLocation();
|
BlockPos doorLocation = gatewayFilter.getEntranceDoorLocation();
|
||||||
int orientation = gatewayFilter.getEntranceOrientation();
|
EnumFacing orientation = gatewayFilter.getEntranceOrientation();
|
||||||
|
|
||||||
// Build the gateway into the world
|
// Build the gateway into the world
|
||||||
schematic.copyToWorld(world, x - doorLocation.getX(), y, z - doorLocation.getZ(), true, true);
|
schematic.copyToWorld(world, pos.subtract(new Vec3i(doorLocation.getX(), 0, doorLocation.getZ())), true, true);
|
||||||
this.generateRandomBits(world, x, y, z);
|
this.generateRandomBits(world, pos);
|
||||||
|
|
||||||
// Generate a dungeon link in the door
|
// Generate a dungeon link in the door
|
||||||
PocketManager.getDimensionData(world).createLink(x, y + doorLocation.getY(), z, LinkType.DUNGEON, orientation);
|
PocketManager.getDimensionData(world).createLink(pos.add(0, doorLocation.getY(), 0), LinkType.DUNGEON, orientation);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -52,11 +49,10 @@ public abstract class BaseSchematicGateway extends BaseGateway
|
||||||
/**
|
/**
|
||||||
* Generates randomized portions of the gateway structure (e.g. rubble, foliage)
|
* Generates randomized portions of the gateway structure (e.g. rubble, foliage)
|
||||||
* @param world - the world in which to generate the 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 pos - the 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) { }
|
protected void generateRandomBits(World world, BlockPos pos) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the path for the schematic file to be used for this gateway. Subsequent calls to this method may return other schematic paths.
|
* Gets the path for the schematic file to be used for this gateway. Subsequent calls to this method may return other schematic paths.
|
||||||
|
|
|
@ -1,30 +1,29 @@
|
||||||
package com.zixiken.dimdoors.world.gateways;
|
package com.zixiken.dimdoors.world.gateways;
|
||||||
|
|
||||||
import com.zixiken.dimdoors.DimDoors;
|
import com.zixiken.dimdoors.DimDoors;
|
||||||
|
import com.zixiken.dimdoors.blocks.DimensionalDoor;
|
||||||
|
import com.zixiken.dimdoors.blocks.TransientDoor;
|
||||||
|
import com.zixiken.dimdoors.blocks.WarpDoor;
|
||||||
import com.zixiken.dimdoors.schematic.Schematic;
|
import com.zixiken.dimdoors.schematic.Schematic;
|
||||||
import com.zixiken.dimdoors.schematic.SchematicFilter;
|
import com.zixiken.dimdoors.schematic.SchematicFilter;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.util.BlockPos;
|
import net.minecraft.util.BlockPos;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
|
||||||
public class GatewayBlockFilter extends SchematicFilter {
|
public class GatewayBlockFilter extends SchematicFilter {
|
||||||
|
private EnumFacing entranceOrientation;
|
||||||
private static final short STANDARD_WARP_DOOR_ID = 1975;
|
|
||||||
private static final short STANDARD_DIMENSIONAL_DOOR_ID = 1970;
|
|
||||||
private static final short STANDARD_TRANSIENT_DOOR_ID = 1979;
|
|
||||||
|
|
||||||
private int entranceOrientation;
|
|
||||||
private Schematic schematic;
|
private Schematic schematic;
|
||||||
private BlockPos entranceDoorLocation;
|
private BlockPos entranceDoorLocation;
|
||||||
|
|
||||||
public GatewayBlockFilter()
|
public GatewayBlockFilter() {
|
||||||
{
|
|
||||||
super("GatewayEntranceFinder");
|
super("GatewayEntranceFinder");
|
||||||
this.entranceDoorLocation = null;
|
this.entranceDoorLocation = null;
|
||||||
this.entranceOrientation = 0;
|
this.entranceOrientation = EnumFacing.NORTH;
|
||||||
this.schematic = null;
|
this.schematic = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getEntranceOrientation() {
|
public EnumFacing getEntranceOrientation() {
|
||||||
return entranceOrientation;
|
return entranceOrientation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,44 +32,33 @@ public class GatewayBlockFilter extends SchematicFilter {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean initialize(Schematic schematic, Block[] blocks, byte[] metadata)
|
protected boolean initialize(Schematic schematic, IBlockState[] states) {
|
||||||
{
|
|
||||||
this.schematic = schematic;
|
this.schematic = schematic;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean applyToBlock(int index, Block[] blocks, byte[] metadata)
|
protected boolean applyToBlock(int index, IBlockState[] states) {
|
||||||
{
|
|
||||||
int indexBelow;
|
int indexBelow;
|
||||||
int indexDoubleBelow;
|
if (states[index] == DimDoors.dimensionalDoor) {
|
||||||
if (blocks[index] == DimDoors.dimensionalDoor)
|
|
||||||
{
|
|
||||||
indexBelow = schematic.calculateIndexBelow(index);
|
indexBelow = schematic.calculateIndexBelow(index);
|
||||||
if (indexBelow >= 0 && blocks[indexBelow] == DimDoors.dimensionalDoor)
|
if (indexBelow >= 0 && states[indexBelow] == DimDoors.dimensionalDoor) {
|
||||||
{
|
|
||||||
entranceDoorLocation = schematic.calculatePoint(index);
|
entranceDoorLocation = schematic.calculatePoint(index);
|
||||||
entranceOrientation = (metadata[indexBelow] & 3);
|
entranceOrientation = states[indexBelow].getValue(DimensionalDoor.FACING);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
} if (states[index] == DimDoors.transientDoor) {
|
||||||
if (blocks[index] == DimDoors.transientDoor)
|
|
||||||
{
|
|
||||||
indexBelow = schematic.calculateIndexBelow(index);
|
indexBelow = schematic.calculateIndexBelow(index);
|
||||||
if (indexBelow >= 0 && blocks[indexBelow] == DimDoors.transientDoor)
|
if (indexBelow >= 0 && states[indexBelow] == DimDoors.transientDoor) {
|
||||||
{
|
|
||||||
entranceDoorLocation = schematic.calculatePoint(index);
|
entranceDoorLocation = schematic.calculatePoint(index);
|
||||||
entranceOrientation = (metadata[indexBelow] & 3);
|
entranceOrientation = states[indexBelow].getValue(TransientDoor.FACING);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
} if (states[index] == DimDoors.warpDoor) {
|
||||||
if (blocks[index] == DimDoors.warpDoor)
|
|
||||||
{
|
|
||||||
indexBelow = schematic.calculateIndexBelow(index);
|
indexBelow = schematic.calculateIndexBelow(index);
|
||||||
if (indexBelow >= 0 && blocks[indexBelow] == DimDoors.warpDoor)
|
if (indexBelow >= 0 && states[indexBelow] == DimDoors.warpDoor) {
|
||||||
{
|
|
||||||
entranceDoorLocation = schematic.calculatePoint(index);
|
entranceDoorLocation = schematic.calculatePoint(index);
|
||||||
entranceOrientation = (metadata[indexBelow] & 3);
|
entranceOrientation = states[indexBelow].getValue(WarpDoor.FACING);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,8 +66,7 @@ public class GatewayBlockFilter extends SchematicFilter {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean terminates()
|
protected boolean terminates() {
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue