diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java b/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java index 6c2f0ca..e537261 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java @@ -1,6 +1,11 @@ package StevenDimDoors.mod_pocketDim.commands; +import java.util.ArrayList; + import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.DimensionManager; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; @@ -10,7 +15,7 @@ public class CommandResetDungeons extends DDCommandBase private CommandResetDungeons() { - super("dd-rebuilddungeons", ""); + super("dd-resetdungeons", ""); } public static CommandResetDungeons instance() @@ -31,21 +36,39 @@ public class CommandResetDungeons extends DDCommandBase int dungeonCount = 0; int resetCount = 0; + ArrayList dimIdsToDelete= new ArrayList(); for (NewDimData data : PocketManager.getDimensions()) { - if (data.isDungeon()) + dungeonCount++; + if(DimensionManager.getWorld(data.id())==null) { - dungeonCount++; - if (PocketManager.resetDungeon(data)) + if (data.isDungeon()) { - resetCount++; + PocketManager.deleteDimensionFolder(data); + dimIdsToDelete.add(data.id()); + } + } + else + { + for(DimLink link : data.links()) + { + if(link.linkType()==LinkTypes.REVERSE) + { + data.createLink(link.source(), LinkTypes.DUNGEON_EXIT, link.orientation()); + } + if(link.linkType()==LinkTypes.DUNGEON) + { + data.createLink(link.source(), LinkTypes.DUNGEON, link.orientation()); + } } } } + resetCount = PocketManager.deleteDimensionData(dimIdsToDelete); + //TODO implement blackList //Notify the user of the results - sender.sendChatToPlayer("Reset complete. " + resetCount + " out of " + dungeonCount + " dungeons were rebuilt."); + sender.sendChatToPlayer("Reset complete. " + resetCount + " out of " + dungeonCount + " dungeons were reset."); return DDCommandResult.SUCCESS; } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index a2ed39d..2dbb3e2 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -470,26 +470,11 @@ public class DDTeleporter private static boolean initializeDestination(DimLink link, DDProperties properties, Block door) { + //TODO implement blackList + if (link.hasDestination()) { - //Need to check if the destination is a dungeon, not only the link because non-dungeon links could still link to a dungeon at this point. - if(PocketManager.getDimensionData(link.destination().getDimension()).isDungeon) - { - NewDimData dimData = PocketManager.getDimensionData(link.destination().getDimension()); - if(!dimData.isFilled()) - { - if(!PocketBuilder.regenerateDungeonPocket(dimData, link, properties)) - { - //If we fail to regenerate, send the player to the parent dimension. - return generateSafeExit(link, properties); - } - } - - } - return true; - - } // Check the destination type and respond accordingly diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index e53058f..100be9a 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -52,7 +52,7 @@ public abstract class NewDimData tail = new LinkTail(0, null); } - public boolean overwrite(InnerDimLink nextParent) + public boolean overwrite(InnerDimLink nextParent,int orientation) { if (nextParent == null) { @@ -86,10 +86,11 @@ public abstract class NewDimData parent = nextParent; tail = nextParent.tail; nextParent.children.add(this); + this.orientation=orientation; return true; } - public void overwrite(int linkType) + public void overwrite(int linkType, int orientation) { //Release children for (DimLink child : children) @@ -107,6 +108,8 @@ public abstract class NewDimData //Attach to new parent parent = null; tail = new LinkTail(linkType, null); + //Set new orientation + this.orientation=orientation; } } @@ -261,7 +264,7 @@ public abstract class NewDimData } else { - link.overwrite(linkType); + link.overwrite(linkType,orientation); } //Link created! linkWatcher.onCreated(link.source); @@ -295,7 +298,7 @@ public abstract class NewDimData } else { - if (link.overwrite(parent)) + if (link.overwrite(parent, parent.orientation)) { //Link created! linkWatcher.onCreated(link.source); diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 39061c2..bbe7822 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -185,25 +185,6 @@ public class PocketManager isLoaded = true; isLoading = false; } - - public static boolean resetDungeon(NewDimData target) - { - // We can't reset the dimension if it's currently loaded or if it's not a dungeon. - // We cast to InnerDimData so that if anyone tries to be a smartass and create their - // own version of NewDimData, this will throw an exception. - InnerDimData dimension = (InnerDimData) target; - if (dimension.isDungeon() && DimensionManager.getWorld(dimension.id()) == null) - { - File saveDirectory = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); - if (DeleteFolder.deleteFolder(saveDirectory)) - { - dimension.setFilled(false); - return true; - } - } - return false; - } - public static boolean deletePocket(NewDimData target, boolean deleteFolder) { // We can't delete the dimension if it's currently loaded or if it's not actually a pocket. @@ -214,10 +195,32 @@ public class PocketManager { if (deleteFolder) { - File saveDirectory = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); - DeleteFolder.deleteFolder(saveDirectory); + deleteDimensionFolder(target); } - dimensionData.remove(dimension.id()); + deleteDimensionData(dimension.id); + return true; + } + return false; + } + public static boolean deleteDimensionFolder(NewDimData target) + { + InnerDimData dimension = (InnerDimData) target; + if (dimension.isPocketDimension() && DimensionManager.getWorld(dimension.id()) == null) + { + File saveDirectory = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); + DeleteFolder.deleteFolder(saveDirectory); + return true; + } + return false; + } + public static boolean deleteDimensionData(int dimensionID) + { + if(dimensionData.containsKey(dimensionID)&& DimensionManager.getWorld(dimensionID) == null) + { + NewDimData target = PocketManager.getDimensionData(dimensionID); + InnerDimData dimension = (InnerDimData) target; + + dimensionData.remove(dimensionID); // Raise the dim deleted event dimWatcher.onDeleted(new ClientDimData(dimension)); dimension.clear(); @@ -226,6 +229,18 @@ public class PocketManager return false; } + public static int deleteDimensionData(ArrayList dimensions) + { + int deletedCount=0; + for(int dimID : dimensions) + { + if(deleteDimensionData(dimID)) + { + deletedCount++; + } + } + return deletedCount; + } private static void registerPockets(DDProperties properties) { for (NewDimData dimension : dimensionData.values())