Improved DungeonSchematic to the point that it can replace SchematicLoader as our method of loading dungeons. Some of the code was copied over rather than refactored to save time. It's been subdivided so make it much more readable. Also, we can reimplement portions of it as WorldOperations later on further remove redudancy. Testing shows that there is one problem left to fix: door blocks are not being set up correctly at the moment. Rifts are being set up properly and attaching doors to rifts will show that dungeons continue to generate fine. Added classes to support DungeonSchematic and its additional filtering logic on import and export. SpecialBlockFinder handles listing the entrance, other doors in the dungeon, and end portal frames. FillContainersOperation is a WorldOperation that fills chests and dispensers. BlockRotator is a temporary class to hold transformMetadata() and transformPoint() until we rewrite that code later. Stripped out most of the code from SchematicLoader to ensure it's no longer used. The only remaining function sets up dungeon pockets. We can phase it out in a later version so as not to delay our release. Removed references to SchematicLoader in mod_pocketDim since it no longer needs to be instantiated.
146 lines
4.4 KiB
Java
146 lines
4.4 KiB
Java
package StevenDimDoors.mod_pocketDim.commands;
|
|
|
|
import java.io.File;
|
|
import java.util.Collection;
|
|
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import StevenDimDoors.mod_pocketDim.DungeonGenerator;
|
|
import StevenDimDoors.mod_pocketDim.LinkData;
|
|
import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper;
|
|
import StevenDimDoors.mod_pocketDim.helpers.dimHelper;
|
|
|
|
public class CommandCreateDungeonRift extends DDCommandBase
|
|
{
|
|
private static CommandCreateDungeonRift instance = null;
|
|
|
|
private CommandCreateDungeonRift()
|
|
{
|
|
super("dd-rift", "<dungeon name | 'list' | 'random'>");
|
|
}
|
|
|
|
public static CommandCreateDungeonRift instance()
|
|
{
|
|
if (instance == null)
|
|
instance = new CommandCreateDungeonRift();
|
|
|
|
return instance;
|
|
}
|
|
|
|
@Override
|
|
protected DDCommandResult processCommand(EntityPlayer sender, String[] command)
|
|
{
|
|
DungeonHelper dungeonHelper = DungeonHelper.instance();
|
|
|
|
if (sender.worldObj.isRemote)
|
|
{
|
|
return DDCommandResult.SUCCESS;
|
|
}
|
|
if (command.length == 0)
|
|
{
|
|
return DDCommandResult.TOO_FEW_ARGUMENTS;
|
|
}
|
|
if (command.length > 1)
|
|
{
|
|
return DDCommandResult.TOO_MANY_ARGUMENTS;
|
|
}
|
|
|
|
if (command[0].equals("list"))
|
|
{
|
|
Collection<String> dungeonNames = dungeonHelper.getDungeonNames();
|
|
for (String name : dungeonNames)
|
|
{
|
|
sender.sendChatToPlayer(name);
|
|
}
|
|
sender.sendChatToPlayer("");
|
|
}
|
|
else
|
|
{
|
|
DungeonGenerator result;
|
|
int x = (int) sender.posX;
|
|
int y = (int) sender.posY;
|
|
int z = (int) sender.posZ;
|
|
LinkData link = new LinkData(sender.worldObj.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 3);
|
|
|
|
if (command[0].equals("random"))
|
|
{
|
|
dimHelper.instance.createLink(link);
|
|
link = dimHelper.instance.createPocket(link, true, true);
|
|
sender.sendChatToPlayer("Created a rift to a random dungeon (Dimension ID = " + link.destDimID + ").");
|
|
}
|
|
else
|
|
{
|
|
result = findDungeonByPartialName(command[0], dungeonHelper.registeredDungeons);
|
|
if (result == null)
|
|
{
|
|
result = findDungeonByPartialName(command[0], dungeonHelper.customDungeons);
|
|
}
|
|
//Check if we found any matches
|
|
if (result != null)
|
|
{
|
|
//Create a rift to our selected dungeon and notify the player
|
|
link = dimHelper.instance.createPocket(link, true, true);
|
|
dimHelper.dimList.get(link.destDimID).dungeonGenerator = result;
|
|
sender.sendChatToPlayer("Created a rift to \"" + getSchematicName(result) + "\" dungeon (Dimension ID = " + link.destDimID + ").");
|
|
|
|
/*try {
|
|
DungeonSchematic dungeon;
|
|
if ((new File(result.schematicPath)).exists())
|
|
{
|
|
dungeon = DungeonSchematic.readFromFile(result.schematicPath);
|
|
}
|
|
else
|
|
{
|
|
dungeon = DungeonSchematic.readFromResource(result.schematicPath);
|
|
}
|
|
dungeon.applyImportFilters(DDProperties.instance());
|
|
dungeon.copyToWorld(sender.worldObj, x, y, z);
|
|
} catch (InvalidSchematicException e) {
|
|
e.printStackTrace();
|
|
} catch (FileNotFoundException e) {
|
|
e.printStackTrace();
|
|
}*/
|
|
|
|
}
|
|
else
|
|
{
|
|
//No matches!
|
|
return new DDCommandResult("Error: The specified dungeon was not found. Use 'list' to see a list of the available dungeons.");
|
|
}
|
|
}
|
|
}
|
|
return DDCommandResult.SUCCESS;
|
|
}
|
|
|
|
private DungeonGenerator findDungeonByPartialName(String query, Collection<DungeonGenerator> dungeons)
|
|
{
|
|
//Search for the shortest dungeon name that contains the lowercase query string.
|
|
String dungeonName;
|
|
String normalQuery = query.toLowerCase();
|
|
DungeonGenerator bestMatch = null;
|
|
int matchLength = Integer.MAX_VALUE;
|
|
|
|
for (DungeonGenerator dungeon : dungeons)
|
|
{
|
|
//We need to extract the file's name. Comparing against schematicPath could
|
|
//yield false matches if the query string is contained within the path.
|
|
|
|
dungeonName = getSchematicName(dungeon).toLowerCase();
|
|
if (dungeonName.length() < matchLength && dungeonName.contains(normalQuery))
|
|
{
|
|
matchLength = dungeonName.length();
|
|
bestMatch = dungeon;
|
|
}
|
|
}
|
|
return bestMatch;
|
|
}
|
|
|
|
private static String getSchematicName(DungeonGenerator dungeon)
|
|
{
|
|
//TODO: Move this to DungeonHelper and use it for all schematic name parsing.
|
|
//In the future, we really should include the schematic's name as part of DungeonGenerator
|
|
//to avoid redoing this work constantly.
|
|
File schematic = new File(dungeon.schematicPath);
|
|
String fileName = schematic.getName();
|
|
return fileName.substring(0, fileName.length() - DungeonHelper.SCHEMATIC_FILE_EXTENSION.length());
|
|
}
|
|
} |