From e96fc027478fe7f710fd387483c14b3a78d4c936 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 4 Aug 2013 19:27:34 -0400 Subject: [PATCH 001/544] Progress on Implementing Dungeon Packs Started implementing our support for dungeon packs. The code is not usable yet and the mod is not functional at this stage. A few additional changes should make it testable. A significant obstacle to implementing dungeon packs easily is that DungeonGenerator doesn't have some necessary information and shouldn't be modified. Even if it is modified, old serialized instances wouldn't have the new fields initialized. I'm having to create workarounds until we implement the new save format. DungeonPack handles all of the logic of selecting a dungeon and verifying whether its type is valid. It relies on DungeonChainRule and OptimizedRule to check which dungeons should be generated next given a list of the dungeons in a chain. DungeonType maps types in packs to ID numbers and provides a reference to the pack that owns the type. DungeonPackConfig will carry config information to be passed to the DungeonPack constructor. --- .../mod_pocketDim/DungeonGenerator.java | 5 +- .../mod_pocketDim/SchematicLoader.java | 28 +- .../dungeon/pack/DungeonChainRule.java | 13 + .../dungeon/pack/DungeonPack.java | 247 ++++++++++++++++++ .../dungeon/pack/DungeonPackConfig.java | 49 ++++ .../dungeon/pack/DungeonType.java | 45 ++++ .../dungeon/pack/OptimizedRule.java | 25 ++ .../mod_pocketDim/helpers/DungeonHelper.java | 206 ++------------- .../mod_pocketDim/helpers/dimHelper.java | 12 +- 9 files changed, 431 insertions(+), 199 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java create mode 100644 StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java create mode 100644 StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java create mode 100644 StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonType.java create mode 100644 StevenDimDoors/mod_pocketDim/dungeon/pack/OptimizedRule.java diff --git a/StevenDimDoors/mod_pocketDim/DungeonGenerator.java b/StevenDimDoors/mod_pocketDim/DungeonGenerator.java index a0eb9f9..ee575f2 100644 --- a/StevenDimDoors/mod_pocketDim/DungeonGenerator.java +++ b/StevenDimDoors/mod_pocketDim/DungeonGenerator.java @@ -12,16 +12,13 @@ public class DungeonGenerator implements Serializable public int weight; public String schematicPath; public ArrayList sideRifts = new ArrayList(); - public LinkData exitLink; - public static Random rand = new Random(); + public LinkData exitLink; public boolean isOpen; public int sideDoorsSoFar=0; public int exitDoorsSoFar=0; public int deadEndsSoFar=0; - - public DungeonGenerator(int weight, String schematicPath, Boolean isOpen) { this.weight=weight; diff --git a/StevenDimDoors/mod_pocketDim/SchematicLoader.java b/StevenDimDoors/mod_pocketDim/SchematicLoader.java index 279a297..22d46e1 100644 --- a/StevenDimDoors/mod_pocketDim/SchematicLoader.java +++ b/StevenDimDoors/mod_pocketDim/SchematicLoader.java @@ -2,6 +2,7 @@ package StevenDimDoors.mod_pocketDim; import java.io.File; import java.io.FileNotFoundException; import java.util.HashMap; +import java.util.Random; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; @@ -27,14 +28,32 @@ public class SchematicLoader int originDimID = link.locDimID; int destDimID = link.destDimID; HashMap dimList = dimHelper.dimList; + World world; if (dimList.containsKey(destDimID)) { + dimList.get(destDimID).hasBeenFilled = true; + if (dimHelper.getWorld(destDimID) == null) + { + dimHelper.initDimension(destDimID); + } + world = dimHelper.getWorld(destDimID); + if (dimList.get(destDimID).dungeonGenerator == null) { - DungeonHelper.instance().generateDungeonLink(link); + //The following initialization code is based on code from ChunkProviderGenerate. + //It makes our generation depend on the world seed. + + Random random = new Random(world.getSeed()); + long factorA = random.nextLong() / 2L * 2L + 1L; + long factorB = random.nextLong() / 2L * 2L + 1L; + random.setSeed((link.destXCoord >> 4) * factorA + (link.destZCoord >> 4) * factorB ^ world.getSeed()); + + //TODO: FIX THIS LINE OR SADNESS WILL FOLLOW. Add a reference to the dungeon pack. + //DungeonHelper.instance().generateDungeonLink(link, ???, random); } schematicPath = dimList.get(destDimID).dungeonGenerator.schematicPath; + } else { @@ -77,13 +96,6 @@ public class SchematicLoader dungeon.applyImportFilters(properties); } - dimList.get(destDimID).hasBeenFilled = true; - if (dimHelper.getWorld(destDimID) == null) - { - dimHelper.initDimension(destDimID); - } - World world = dimHelper.getWorld(destDimID); - //Adjust the height at which the dungeon is placed to prevent vertical clipping int fixedY = adjustDestinationY(world, link.destYCoord, dungeon); if (fixedY != link.destYCoord) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java new file mode 100644 index 0000000..5258561 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java @@ -0,0 +1,13 @@ +package StevenDimDoors.mod_pocketDim.dungeon.pack; + +import java.util.HashMap; + +public class DungeonChainRule +{ + + public OptimizedRule optimize(HashMap nameToTypeMapping) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java new file mode 100644 index 0000000..9bb714e --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java @@ -0,0 +1,247 @@ +package StevenDimDoors.mod_pocketDim.dungeon.pack; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Random; + +import net.minecraft.util.WeightedRandom; +import StevenDimDoors.mod_pocketDim.DungeonGenerator; +import StevenDimDoors.mod_pocketDim.LinkData; +import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; +import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.util.WeightedContainer; + +public class DungeonPack +{ + //Why final? I just felt like it, honestly. ~SenseiKiwi + + private static final DungeonType WILDCARD_TYPE = new DungeonType(null, "?", 0); + + private final String name; + private final HashMap nameToTypeMapping; + private final ArrayList> groupedDungeons; + private final ArrayList allDungeons; + private final DungeonPackConfig config; + private final int maxRuleLength; + private final ArrayList rules; + + public DungeonPack(DungeonPackConfig config) + { + config.validate(); + this.config = config.clone(); //Store a clone of the config so that the caller can't change it externally later + this.name = config.getName(); + + int index; + int maxLength = 0; + int typeCount = config.getTypeNames().size(); + this.allDungeons = new ArrayList(); + this.nameToTypeMapping = new HashMap(typeCount); + this.groupedDungeons = new ArrayList>(typeCount); + + this.groupedDungeons.add(allDungeons); //Make sure the list of all dungeons is placed at index 0 + this.nameToTypeMapping.put(WILDCARD_TYPE.Name, WILDCARD_TYPE); + + index = 1; + for (String typeName : config.getTypeNames()) + { + String standardName = typeName.toUpperCase(); + this.nameToTypeMapping.put(standardName, new DungeonType(this, standardName, index)); + this.groupedDungeons.add(new ArrayList()); + index++; + } + + //Construct optimized rules from config rules + ArrayList chainRules = config.getRules(); + this.rules = new ArrayList(chainRules.size()); + for (DungeonChainRule rule : chainRules) + { + OptimizedRule optimized = rule.optimize(nameToTypeMapping); + this.rules.add(optimized); + if (maxLength < optimized.length()) + { + maxLength = optimized.length(); + } + } + this.maxRuleLength = maxLength; + + //Remove the reference to the non-optimized rules to free up memory - we won't need them here + this.config.setRules(null); + } + + public String getName() + { + return name; + } + + public boolean isEmpty() + { + return allDungeons.isEmpty(); + } + + public DungeonType getType(String typeName) + { + DungeonType result = nameToTypeMapping.get(typeName.toUpperCase()); + if (result != WILDCARD_TYPE) + { + return result; + } + else + { + return null; + } + } + + public boolean isKnownType(String typeName) + { + return (this.getType(typeName) != null); + } + + public DungeonGenerator getNextDungeon(LinkData inbound, Random random) + { + if (allDungeons.isEmpty()) + { + return null; + } + + //Retrieve a list of the previous dungeons in this chain. Restrict the length of the + //search to the length of the longest rule. Getting more data is useless. + dimHelper helper = dimHelper.instance; + + //TODO: Add dungeon pack parameter! We can't use dungeon types from other packs. + ArrayList history = DungeonHelper.getDungeonChainHistory(helper.getDimData(inbound.locDimID), maxRuleLength); + return getNextDungeon(history, random); + } + + private DungeonGenerator getNextDungeon(ArrayList history, Random random) + { + //Extract the dungeon types that have been used from history and convert them into an array of IDs + int index; + int[] typeHistory = new int[history.size()]; + HashSet excludedDungeons = null; + for (index = 0; index < typeHistory.length; index++) + { + typeHistory[index] = getDungeonType(history.get(index)).ID; + } + + for (OptimizedRule rule : rules) + { + if (rule.evaluate(typeHistory)) + { + //Pick a random dungeon type to be generated next based on the rule's products + ArrayList> products = rule.products(); + DungeonType nextType; + do + { + nextType = getRandomDungeonType(random, products, groupedDungeons); + if (nextType != null) + { + //Initialize the set of excluded dungeons if needed + if (excludedDungeons == null && config.allowDuplicatesInChain()) + { + //TODO: Finish implementing this! + } + + //List which dungeons are allowed + ArrayList candidates; + ArrayList group = groupedDungeons.get(nextType.ID); + if (excludedDungeons != null) + { + candidates = new ArrayList(group.size()); + for (DungeonGenerator dungeon : group) + { + if (!excludedDungeons.contains(dungeon)) + { + candidates.add(dungeon); + } + } + } + else + { + candidates = group; + } + if (!candidates.isEmpty()) + { + return getRandomDungeon(random, candidates); + } + } + } + while (nextType != null); + } + } + + //None of the rules were applicable. Simply return a random dungeon. + return getRandomDungeon(random); + } + + private DungeonType getDungeonType(DungeonGenerator generator) + { + //This function is a workaround for DungeonGenerator not having a dungeon type or pack field. + //I really don't want to go messing around with that serializable type. + //TODO: Remove this function once we transition to using the new save format. ~SenseiKiwi + + //TODO: Finish implementing this! + return null; + } + + public DungeonGenerator getRandomDungeon(Random random) + { + if (!allDungeons.isEmpty()) + { + return getRandomDungeon(random, allDungeons); + } + else + { + return null; + } + } + + private static DungeonType getRandomDungeonType(Random random, Collection> types, + ArrayList> groupedDungeons) + { + //TODO: Make this faster? This algorithm runs in quadratic time in the worst case because of the random-selection + //process and the removal search. Should be okay for normal use, though. ~SenseiKiwi + + //Pick a random dungeon type based on weights. Repeat this process until a non-empty group is found or all groups are checked. + while (!types.isEmpty()) + { + //Pick a random dungeon type + @SuppressWarnings("unchecked") + WeightedContainer resultContainer = (WeightedContainer) WeightedRandom.getRandomItem(random, types); + + //Check if there are any dungeons of that type + DungeonType selectedType = resultContainer.getData(); + if (!groupedDungeons.get(selectedType.ID).isEmpty()) + { + //Choose this type + return selectedType; + } + else + { + //We can't use this type because there are no dungeons of this type + //Remove it from the list of types and try again + types.remove(resultContainer); + } + } + + //We have run out of types to try + return null; + } + + private static DungeonGenerator getRandomDungeon(Random random, Collection dungeons) + { + //Use Minecraft's WeightedRandom to select our dungeon. =D + ArrayList> weights = + new ArrayList>(dungeons.size()); + for (DungeonGenerator dungeon : dungeons) + { + weights.add(new WeightedContainer(dungeon, dungeon.weight)); + } + + @SuppressWarnings("unchecked") + WeightedContainer resultContainer = (WeightedContainer) WeightedRandom.getRandomItem(random, weights); + return (resultContainer != null) ? resultContainer.getData() : null; + } +} diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java new file mode 100644 index 0000000..8655d3c --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java @@ -0,0 +1,49 @@ +package StevenDimDoors.mod_pocketDim.dungeon.pack; + +import java.util.ArrayList; +import java.util.List; + +public class DungeonPackConfig +{ + public DungeonPackConfig() { } + + private DungeonPackConfig(DungeonPackConfig source) + { + + } + + public void validate() + { + + } + + public DungeonPackConfig clone() + { + return new DungeonPackConfig(this); + } + + public String getName() + { + return null; + } + + public List getTypeNames() + { + return null; + } + + public boolean allowDuplicatesInChain() + { + return false; + } + + public void setRules(Object object) { + // TODO Auto-generated method stub + + } + + public ArrayList getRules() { + // TODO Auto-generated method stub + return null; + } +} diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonType.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonType.java new file mode 100644 index 0000000..e15b683 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonType.java @@ -0,0 +1,45 @@ +package StevenDimDoors.mod_pocketDim.dungeon.pack; + +public class DungeonType implements Comparable +{ + public final DungeonPack Owner; + public final String Name; + public final int ID; + + public DungeonType(DungeonPack owner, String name, int id) + { + Owner = owner; + Name = name; + this.ID = id; + } + + @Override + public int compareTo(DungeonType other) + { + return this.ID - other.ID; + } + + @Override + public boolean equals(Object other) + { + return equals((DungeonType) other); + } + + public boolean equals(DungeonType other) + { + if (this == other) + return true; + + if (this == null || other == null) + return false; + + return (this.ID == other.ID); + } + + @Override + public int hashCode() + { + final int prime = 2039; + return prime * ID; + } +} diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/OptimizedRule.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/OptimizedRule.java new file mode 100644 index 0000000..c69ccd7 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/OptimizedRule.java @@ -0,0 +1,25 @@ +package StevenDimDoors.mod_pocketDim.dungeon.pack; + +import java.util.ArrayList; + +import StevenDimDoors.mod_pocketDim.util.WeightedContainer; + +public class OptimizedRule +{ + + public int length() { + // TODO Auto-generated method stub + return 0; + } + + public boolean evaluate(int[] typeHistory) { + // TODO Auto-generated method stub + return false; + } + + public ArrayList> products() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index a99d503..406ade1 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.Random; import java.util.regex.Pattern; -import net.minecraft.util.WeightedRandom; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.DimData; @@ -21,8 +20,8 @@ import StevenDimDoors.mod_pocketDim.DungeonGenerator; import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; +import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.items.itemDimDoor; -import StevenDimDoors.mod_pocketDim.util.WeightedContainer; public class DungeonHelper { @@ -65,8 +64,6 @@ public class DungeonHelper MAZE_DUNGEON_TYPE }; - private Random rand = new Random(); - private ArrayList untaggedDungeons = new ArrayList(); private ArrayList registeredDungeons = new ArrayList(); @@ -354,157 +351,29 @@ public class DungeonHelper } } - public void generateDungeonLink(LinkData incoming) + public void generateDungeonLink(LinkData inbound, DungeonPack pack, Random random) { - DungeonGenerator dungeon; - int depth = dimHelper.instance.getDimDepth(incoming.locDimID); - int depthWeight = rand.nextInt(depth + 2) + rand.nextInt(depth + 2) - 2; - - int count = 10; - boolean flag = true; + DungeonGenerator selection; + try - { - - if (incoming.destYCoord > 15) - { - do - { - count--; - flag = true; - //Select a dungeon at random, taking into account its weight - dungeon = getRandomDungeon(rand, registeredDungeons); - - if (depth <= 1) - { - if(rand.nextBoolean()) - { - dungeon = complexHalls.get(rand.nextInt(complexHalls.size())); - - } - else if(rand.nextBoolean()) - { - dungeon = hubs.get(rand.nextInt(hubs.size())); - - } - else if(rand.nextBoolean()) - { - dungeon = hubs.get(rand.nextInt(hubs.size())); - - } - else if(deadEnds.contains(dungeon)||exits.contains(dungeon)) - { - flag=false; - } - } - else if (depth <= 3 && (deadEnds.contains(dungeon) || exits.contains(dungeon) || rand.nextBoolean())) - { - if(rand.nextBoolean()) - { - dungeon = hubs.get(rand.nextInt(hubs.size())); - - } - else if(rand.nextBoolean()) - { - dungeon = mazes.get(rand.nextInt(mazes.size())); - } - else if(rand.nextBoolean()) - { - dungeon = pistonTraps.get(rand.nextInt(pistonTraps.size())); - - } - else - { - flag = false; - } - } - else if (rand.nextInt(3) == 0 && !complexHalls.contains(dungeon)) - { - if (rand.nextInt(3) == 0) - { - dungeon = simpleHalls.get(rand.nextInt(simpleHalls.size())); - } - else if(rand.nextBoolean()) - { - dungeon = pistonTraps.get(rand.nextInt(pistonTraps.size())); - } - else if (depth < 4) - { - dungeon = hubs.get(rand.nextInt(hubs.size())); - } - } - else if (depthWeight - depthWeight / 2 > depth -4 && (deadEnds.contains(dungeon) || exits.contains(dungeon))) - { - if(rand.nextBoolean()) - { - dungeon = simpleHalls.get(rand.nextInt(simpleHalls.size())); - } - else if(rand.nextBoolean()) - { - dungeon = complexHalls.get(rand.nextInt(complexHalls.size())); - } - else if(rand.nextBoolean()) - { - dungeon = pistonTraps.get(rand.nextInt(pistonTraps.size())); - } - else - { - flag = false; - } - } - else if (depthWeight > 7 && hubs.contains(dungeon)) - { - if(rand.nextInt(12)+5 10 && hubs.contains(dungeon)) - { - flag = false; - } - - if(getDungeonDataInChain(dimHelper.instance.getDimData(incoming.locDimID)).contains(dungeon)) - { - flag=false; - } - } - while (!flag && count > 0); - } - else - { - dungeon = defaultUp; - } + { + selection = pack.getNextDungeon(inbound, random); } catch (Exception e) { + System.err.println("An exception occurred while selecting a dungeon:"); e.printStackTrace(); - if (registeredDungeons.size() > 0) + + if (!pack.isEmpty()) { - //Select a random dungeon - dungeon = getRandomDungeon(rand, registeredDungeons); + selection = pack.getRandomDungeon(random); } else { - return; + selection = defaultError; } } - dimHelper.instance.getDimData(incoming.destDimID).dungeonGenerator = dungeon; - //dimHelper.instance.getDimData(incoming.destDimID).dungeonGenerator = defaultUp; + dimHelper.instance.getDimData(inbound.destDimID).dungeonGenerator = selection; } public Collection getDungeonNames() { @@ -539,50 +408,33 @@ public class DungeonHelper return names; } - private static DungeonGenerator getRandomDungeon(Random random, Collection dungeons) + public static ArrayList getDungeonChainHistory(DimData dimData, int maxSize) { - //Use Minecraft's WeightedRandom to select our dungeon. =D - ArrayList> weights = - new ArrayList>(dungeons.size()); - for (DungeonGenerator dungeon : dungeons) - { - weights.add(new WeightedContainer(dungeon, dungeon.weight)); - } + //TODO: I've improved this code for the time being. However, searching across links is a flawed approach. A player could + //manipulate the output of this function by setting up links to mislead our algorithm or by removing links. + //Dimensions MUST have built-in records of their parent dimensions in the future. ~SenseiKiwi - @SuppressWarnings("unchecked") - WeightedContainer resultContainer = (WeightedContainer) WeightedRandom.getRandomItem(random, weights); - return (resultContainer != null) ? resultContainer.getData() : null; - } - public static ArrayList getDungeonDataInChain(DimData dimData) - { - DimData startingDim = dimHelper.instance.getDimData(dimHelper.instance.getLinkDataFromCoords(dimData.exitDimLink.destXCoord, dimData.exitDimLink.destYCoord, dimData.exitDimLink.destZCoord, dimData.exitDimLink.destDimID).destDimID); - - return getDungeonDataBelow(startingDim); - } - private static ArrayList getDungeonDataBelow(DimData dimData) - { - ArrayList dungeonData = new ArrayList(); - if(dimData.dungeonGenerator!=null) + dimHelper helper = dimHelper.instance; + ArrayList history = new ArrayList(); + DimData tailDim = helper.getDimData(helper.getLinkDataFromCoords(dimData.exitDimLink.destXCoord, dimData.exitDimLink.destYCoord, dimData.exitDimLink.destZCoord, dimData.exitDimLink.destDimID).destDimID); + + for (int count = 0; count < maxSize && tailDim.dungeonGenerator != null; count++) { - dungeonData.add(dimData.dungeonGenerator); + history.add(tailDim.dungeonGenerator); - for(LinkData link : dimData.getLinksInDim()) + if (count + 1 < maxSize) { - if(dimHelper.dimList.containsKey(link.destDimID)) + for (LinkData link : tailDim.getLinksInDim()) { - if(dimHelper.instance.getDimData(link.destDimID).dungeonGenerator!=null&&dimHelper.instance.getDimDepth(link.destDimID)==dimData.depth+1) + DimData nextDim = dimHelper.instance.getDimData(link.destDimID); + if (helper.getDimDepth(link.destDimID) == tailDim.depth + 1) { - for(DungeonGenerator dungeonGen :getDungeonDataBelow(dimHelper.instance.getDimData(link.destDimID)) ) - { - if(!dungeonData.contains(dungeonGen)) - { - dungeonData.add(dungeonGen); - } - } + tailDim = nextDim; + break; } } } } - return dungeonData; + return history; } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java b/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java index 9f82048..7e2cf21 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java @@ -1320,17 +1320,9 @@ public class dimHelper extends DimensionManager { return dimHelper.instance.getDimData(world.provider.dimensionId); } + public DimData getDimData(int dimID) { - if(dimHelper.dimList.containsKey(dimID)) - { - return dimHelper.dimList.get(dimID); - } - else - { - return null; - } + return dimHelper.dimList.get(dimID); } - - } -- 2.39.5 From 101e9e4ce6c71689d5984b4cd9ca1582849b9b21 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 5 Aug 2013 09:48:49 -0400 Subject: [PATCH 002/544] Progress on Implementing Dungeon Packs Completed enough of the implementation and integration to compile DD. Some portions of the code are only for testing and will be removed later. The configuration for default dungeons is hardcoded - we can parse config files once we're certain that dungeon chains work. At the moment, dungeons generate but it doesn't seem like the rules we set are being followed properly. Renamed OptimizedRule to DungeonChainRule, and renamed the old DungeonChainRule to DungeonChainRuleDefinition, to match the role of each class better. Added some hax to DungeonGenerator to get packs integrated - the implementation will be much cleaner once the new save format is done. --- .../mod_pocketDim/DungeonGenerator.java | 60 ++++++- .../mod_pocketDim/SchematicLoader.java | 6 +- .../commands/CommandExportDungeon.java | 4 +- .../dungeon/pack/DungeonChainRule.java | 59 ++++++- .../dungeon/pack/DungeonPack.java | 83 ++++++---- .../dungeon/pack/DungeonPackConfig.java | 55 +++++-- .../dungeon/pack/DungeonType.java | 3 + .../dungeon/pack/OptimizedRule.java | 25 --- .../mod_pocketDim/helpers/DungeonHelper.java | 154 ++++++++++-------- .../mod_pocketDim/util/WeightedContainer.java | 6 +- 10 files changed, 298 insertions(+), 157 deletions(-) delete mode 100644 StevenDimDoors/mod_pocketDim/dungeon/pack/OptimizedRule.java diff --git a/StevenDimDoors/mod_pocketDim/DungeonGenerator.java b/StevenDimDoors/mod_pocketDim/DungeonGenerator.java index ee575f2..6c6ea16 100644 --- a/StevenDimDoors/mod_pocketDim/DungeonGenerator.java +++ b/StevenDimDoors/mod_pocketDim/DungeonGenerator.java @@ -1,14 +1,22 @@ package StevenDimDoors.mod_pocketDim; +import java.io.File; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.Random; +import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonType; +import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; + import net.minecraft.world.World; public class DungeonGenerator implements Serializable { + //This static field is hax so that I don't have to add an instance field to DungeonGenerator to support DungeonType. + //Otherwise it would have to be serializable and all sorts of problems would arise. + private static final HashMap dungeonTypes = new HashMap(); + public int weight; public String schematicPath; public ArrayList sideRifts = new ArrayList(); @@ -19,10 +27,54 @@ public class DungeonGenerator implements Serializable public int exitDoorsSoFar=0; public int deadEndsSoFar=0; - public DungeonGenerator(int weight, String schematicPath, Boolean isOpen) + public DungeonGenerator(int weight, String schematicPath, boolean isOpen, DungeonType dungeonType) { - this.weight=weight; - this.schematicPath=schematicPath; - this.isOpen=isOpen; + this.weight = weight; + this.schematicPath = schematicPath; + this.isOpen = isOpen; + + dungeonTypes.put(this, dungeonType); //Hax... + } + + public DungeonType getDungeonType() + { + DungeonType type = dungeonTypes.get(this); + if (type == null) + { + //Infer the dungeon's type from its file name + //There is minimal risk of us applying this to untagged dungeons and this'll be phased out + //when we get the new save format. + try + { + File file = new File(schematicPath); + String typeName = file.getName().split("_")[0]; + type = DungeonHelper.instance().RuinsPack.getType(typeName); + } + catch (Exception e) { } + if (type == null) + { + type = DungeonType.UNKNOWN_TYPE; + } + dungeonTypes.put(this, type); + } + return type; + } + + @Override + public int hashCode() + { + return (schematicPath != null) ? schematicPath.hashCode() : 0; + } + + @Override + public boolean equals(Object other) + { + return equals((DungeonGenerator) other); + } + + public boolean equals(DungeonGenerator other) + { + return ((this.schematicPath != null && this.schematicPath.equals(other.schematicPath)) || + (this.schematicPath == other.schematicPath)); } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/SchematicLoader.java b/StevenDimDoors/mod_pocketDim/SchematicLoader.java index 22d46e1..00d1b6a 100644 --- a/StevenDimDoors/mod_pocketDim/SchematicLoader.java +++ b/StevenDimDoors/mod_pocketDim/SchematicLoader.java @@ -28,6 +28,7 @@ public class SchematicLoader int originDimID = link.locDimID; int destDimID = link.destDimID; HashMap dimList = dimHelper.dimList; + DungeonHelper dungeonHelper = DungeonHelper.instance(); World world; if (dimList.containsKey(destDimID)) @@ -49,8 +50,7 @@ public class SchematicLoader long factorB = random.nextLong() / 2L * 2L + 1L; random.setSeed((link.destXCoord >> 4) * factorA + (link.destZCoord >> 4) * factorB ^ world.getSeed()); - //TODO: FIX THIS LINE OR SADNESS WILL FOLLOW. Add a reference to the dungeon pack. - //DungeonHelper.instance().generateDungeonLink(link, ???, random); + dungeonHelper.generateDungeonLink(link, dungeonHelper.RuinsPack, random); } schematicPath = dimList.get(destDimID).dungeonGenerator.schematicPath; @@ -90,7 +90,7 @@ public class SchematicLoader //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. System.err.println("The dungeon will not be loaded."); - DungeonGenerator defaultError = DungeonHelper.instance().getDefaultErrorDungeon(); + DungeonGenerator defaultError = dungeonHelper.getDefaultErrorDungeon(); dimList.get(destDimID).dungeonGenerator = defaultError; dungeon = checkSourceAndLoad(defaultError.schematicPath); dungeon.applyImportFilters(properties); diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java b/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java index ff833b3..194d5ce 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java @@ -54,7 +54,7 @@ public class CommandExportDungeon extends DDCommandBase if (command[1].equalsIgnoreCase("override")) { //Check that the schematic name is a legal name - if (DungeonHelper.SchematicNamePattern.matcher(command[0]).matches()) + if (DungeonHelper.SCHEMATIC_NAME_PATTERN.matcher(command[0]).matches()) { //Export the schematic return exportDungeon(sender, command[0]); @@ -85,7 +85,7 @@ public class CommandExportDungeon extends DDCommandBase { return new DDCommandResult("Error: Invalid dungeon type. Please use one of the existing types."); } - if (!DungeonHelper.DungeonNamePattern.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."); } diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java index 5258561..472f20b 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java @@ -1,13 +1,66 @@ package StevenDimDoors.mod_pocketDim.dungeon.pack; +import java.util.ArrayList; import java.util.HashMap; +import StevenDimDoors.mod_pocketDim.util.WeightedContainer; + public class DungeonChainRule { + private final int[] condition; + private final ArrayList> products; + + public DungeonChainRule(DungeonChainRuleDefinition source, HashMap nameToTypeMapping) + { + ArrayList conditionNames = source.getCondition(); + ArrayList> productNames = source.getProducts(); - public OptimizedRule optimize(HashMap nameToTypeMapping) { - // TODO Auto-generated method stub - return null; + condition = new int[conditionNames.size()]; + for (int k = 0; k < condition.length; k++) + { + condition[k] = nameToTypeMapping.get(conditionNames.get(k)).ID; + } + products = new ArrayList>(); + for (WeightedContainer product : productNames) + { + products.add(new WeightedContainer(nameToTypeMapping.get(product.getData()), product.itemWeight )); + } + } + + public int length() + { + return condition.length; } + public boolean evaluate(int[] typeHistory) + { + if (typeHistory.length >= condition.length) + { + for (int k = 0; k < condition.length; k++) + { + if (condition[k] != 0 && typeHistory[k] != condition[k]) + { + return false; + } + } + return true; + } + else + { + return false; + } + } + + public ArrayList> products() + { + //Create a deep copy of the internal list of products. That way, if the list is modified externally, + //it won't affect the reference copy inside this rule. + ArrayList> copy = new ArrayList>(products.size()); + for (WeightedContainer container : products) + { + copy.add(container.clone()); + } + + return copy; + } } diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java index 9bb714e..9db777d 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Random; import net.minecraft.util.WeightedRandom; @@ -16,9 +15,11 @@ import StevenDimDoors.mod_pocketDim.util.WeightedContainer; public class DungeonPack { - //Why final? I just felt like it, honestly. ~SenseiKiwi - - private static final DungeonType WILDCARD_TYPE = new DungeonType(null, "?", 0); + //There is no precaution against having a dungeon type removed from a config file after dungeons of that type + //have been generated. That would likely cause one or two problems. It's hard to guard against when I don't know + //what the save format will be like completely. How should this class behave if it finds a "disowned" type? + //The ID numbers would be a problem since it couldn't have a valid number, since it wasn't initialized by the pack instance. + //FIXME: Do not release this code as an update without dealing with disowned types! private final String name; private final HashMap nameToTypeMapping; @@ -26,7 +27,7 @@ public class DungeonPack private final ArrayList allDungeons; private final DungeonPackConfig config; private final int maxRuleLength; - private final ArrayList rules; + private final ArrayList rules; public DungeonPack(DungeonPackConfig config) { @@ -42,7 +43,7 @@ public class DungeonPack this.groupedDungeons = new ArrayList>(typeCount); this.groupedDungeons.add(allDungeons); //Make sure the list of all dungeons is placed at index 0 - this.nameToTypeMapping.put(WILDCARD_TYPE.Name, WILDCARD_TYPE); + this.nameToTypeMapping.put(DungeonType.WILDCARD_TYPE.Name, DungeonType.WILDCARD_TYPE); index = 1; for (String typeName : config.getTypeNames()) @@ -53,22 +54,23 @@ public class DungeonPack index++; } - //Construct optimized rules from config rules - ArrayList chainRules = config.getRules(); - this.rules = new ArrayList(chainRules.size()); - for (DungeonChainRule rule : chainRules) + //Construct optimized rules from definitions + ArrayList definitions = config.getRules(); + this.rules = new ArrayList(definitions.size()); + for (DungeonChainRuleDefinition definition : definitions) { - OptimizedRule optimized = rule.optimize(nameToTypeMapping); - this.rules.add(optimized); - if (maxLength < optimized.length()) + DungeonChainRule rule = new DungeonChainRule(definition, nameToTypeMapping); + this.rules.add(rule); + if (maxLength < rule.length()) { - maxLength = optimized.length(); + maxLength = rule.length(); } } this.maxRuleLength = maxLength; - //Remove the reference to the non-optimized rules to free up memory - we won't need them here + //Remove unnecessary references to save a little memory - we won't need them here this.config.setRules(null); + this.config.setTypeNames(null); } public String getName() @@ -84,7 +86,7 @@ public class DungeonPack public DungeonType getType(String typeName) { DungeonType result = nameToTypeMapping.get(typeName.toUpperCase()); - if (result != WILDCARD_TYPE) + if (result.Owner == this) //Filter out the wildcard dungeon type { return result; } @@ -99,6 +101,21 @@ public class DungeonPack return (this.getType(typeName) != null); } + public void addDungeon(DungeonGenerator generator) + { + //Make sure this dungeon really belongs in this pack + DungeonType type = generator.getDungeonType(); + if (type.Owner == this) + { + allDungeons.add(generator); + groupedDungeons.get(type.ID).add(generator); + } + else + { + throw new IllegalArgumentException("The dungeon type of generator must belong to this instance of DungeonPack."); + } + } + public DungeonGenerator getNextDungeon(LinkData inbound, Random random) { if (allDungeons.isEmpty()) @@ -106,12 +123,14 @@ public class DungeonPack return null; } - //Retrieve a list of the previous dungeons in this chain. Restrict the length of the - //search to the length of the longest rule. Getting more data is useless. - dimHelper helper = dimHelper.instance; + //Retrieve a list of the previous dungeons in this chain. + //If we're not going to check for duplicates in chains, restrict the length of the history to the length + //of the longest rule we have. Getting any more data would be useless. This optimization could be significant + //for dungeon packs that can extend arbitrarily deep. We should probably set a reasonable limit anyway. - //TODO: Add dungeon pack parameter! We can't use dungeon types from other packs. - ArrayList history = DungeonHelper.getDungeonChainHistory(helper.getDimData(inbound.locDimID), maxRuleLength); + int maxSearchLength = config.allowDuplicatesInChain() ? maxRuleLength : 1337; + ArrayList history = DungeonHelper.getDungeonChainHistory( + dimHelper.instance.getDimData(inbound.locDimID), this, maxSearchLength); return getNextDungeon(history, random); } @@ -123,10 +142,10 @@ public class DungeonPack HashSet excludedDungeons = null; for (index = 0; index < typeHistory.length; index++) { - typeHistory[index] = getDungeonType(history.get(index)).ID; + typeHistory[index] = history.get(index).getDungeonType().ID; } - for (OptimizedRule rule : rules) + for (DungeonChainRule rule : rules) { if (rule.evaluate(typeHistory)) { @@ -139,9 +158,9 @@ public class DungeonPack if (nextType != null) { //Initialize the set of excluded dungeons if needed - if (excludedDungeons == null && config.allowDuplicatesInChain()) + if (excludedDungeons == null && !config.allowDuplicatesInChain()) { - //TODO: Finish implementing this! + excludedDungeons = new HashSet(history); } //List which dungeons are allowed @@ -166,6 +185,8 @@ public class DungeonPack { return getRandomDungeon(random, candidates); } + //If we've reached this point, then a dungeon was not selected. Discard the type and try again. + products.remove(nextType); } } while (nextType != null); @@ -175,16 +196,6 @@ public class DungeonPack //None of the rules were applicable. Simply return a random dungeon. return getRandomDungeon(random); } - - private DungeonType getDungeonType(DungeonGenerator generator) - { - //This function is a workaround for DungeonGenerator not having a dungeon type or pack field. - //I really don't want to go messing around with that serializable type. - //TODO: Remove this function once we transition to using the new save format. ~SenseiKiwi - - //TODO: Finish implementing this! - return null; - } public DungeonGenerator getRandomDungeon(Random random) { @@ -202,7 +213,7 @@ public class DungeonPack ArrayList> groupedDungeons) { //TODO: Make this faster? This algorithm runs in quadratic time in the worst case because of the random-selection - //process and the removal search. Should be okay for normal use, though. ~SenseiKiwi + //process and the removal search. Might be okay for normal use, though. ~SenseiKiwi //Pick a random dungeon type based on weights. Repeat this process until a non-empty group is found or all groups are checked. while (!types.isEmpty()) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java index 8655d3c..c99dd91 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java @@ -1,22 +1,36 @@ package StevenDimDoors.mod_pocketDim.dungeon.pack; import java.util.ArrayList; -import java.util.List; public class DungeonPackConfig { + private String name; + private ArrayList typeNames; + private boolean allowDuplicatesInChain; + private ArrayList rules; + public DungeonPackConfig() { } + @SuppressWarnings("unchecked") private DungeonPackConfig(DungeonPackConfig source) { - + this.name = source.name; + this.typeNames = (ArrayList) source.typeNames.clone(); + this.allowDuplicatesInChain = source.allowDuplicatesInChain; + this.rules = (ArrayList) source.rules.clone(); } public void validate() { - + if (this.name == null) + throw new NullPointerException("name cannot be null"); + if (this.typeNames == null) + throw new NullPointerException("typeNames cannot be null"); + if (this.rules == null) + throw new NullPointerException("rules cannot be null"); } + @Override public DungeonPackConfig clone() { return new DungeonPackConfig(this); @@ -24,26 +38,41 @@ public class DungeonPackConfig public String getName() { - return null; + return name; + } + + public void setName(String name) + { + this.name = name; } - public List getTypeNames() + public ArrayList getTypeNames() { - return null; + return typeNames; + } + + public void setTypeNames(ArrayList typeNames) + { + this.typeNames = typeNames; } public boolean allowDuplicatesInChain() { - return false; + return allowDuplicatesInChain; + } + + public void setAllowDuplicatesInChain(boolean value) + { + allowDuplicatesInChain = value; } - public void setRules(Object object) { - // TODO Auto-generated method stub - + public void setRules(ArrayList rules) + { + this.rules = rules; } - public ArrayList getRules() { - // TODO Auto-generated method stub - return null; + public ArrayList getRules() + { + return rules; } } diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonType.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonType.java index e15b683..50e5921 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonType.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonType.java @@ -2,6 +2,9 @@ package StevenDimDoors.mod_pocketDim.dungeon.pack; public class DungeonType implements Comparable { + public static final DungeonType WILDCARD_TYPE = new DungeonType(null, "?", 0); + public static final DungeonType UNKNOWN_TYPE = new DungeonType(null, "!", -1); + public final DungeonPack Owner; public final String Name; public final int ID; diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/OptimizedRule.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/OptimizedRule.java deleted file mode 100644 index c69ccd7..0000000 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/OptimizedRule.java +++ /dev/null @@ -1,25 +0,0 @@ -package StevenDimDoors.mod_pocketDim.dungeon.pack; - -import java.util.ArrayList; - -import StevenDimDoors.mod_pocketDim.util.WeightedContainer; - -public class OptimizedRule -{ - - public int length() { - // TODO Auto-generated method stub - return 0; - } - - public boolean evaluate(int[] typeHistory) { - // TODO Auto-generated method stub - return false; - } - - public ArrayList> products() { - // TODO Auto-generated method stub - return null; - } - -} diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 406ade1..c364297 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -5,9 +5,9 @@ import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Random; @@ -20,15 +20,20 @@ import StevenDimDoors.mod_pocketDim.DungeonGenerator; import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; +import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonChainRuleDefinition; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; +import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; +import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonType; import StevenDimDoors.mod_pocketDim.items.itemDimDoor; +import StevenDimDoors.mod_pocketDim.util.WeightedContainer; public class DungeonHelper { private static DungeonHelper instance = null; private static DDProperties properties = null; - public static final Pattern SchematicNamePattern = Pattern.compile("[A-Za-z0-9_\\-]+"); - public static final Pattern DungeonNamePattern = Pattern.compile("[A-Za-z0-9\\-]+"); + + public static final Pattern SCHEMATIC_NAME_PATTERN = Pattern.compile("[A-Za-z0-9_\\-]+"); + public static final Pattern DUNGEON_NAME_PATTERN = Pattern.compile("[A-Za-z0-9\\-]+"); private static final String DEFAULT_UP_SCHEMATIC_PATH = "/schematics/core/simpleStairsUp.schematic"; private static final String DEFAULT_DOWN_SCHEMATIC_PATH = "/schematics/core/simpleStairsDown.schematic"; @@ -44,70 +49,22 @@ public class DungeonHelper public static final short MAX_DUNGEON_HEIGHT = MAX_DUNGEON_WIDTH; public static final short MAX_DUNGEON_LENGTH = MAX_DUNGEON_WIDTH; - private static final String HUB_DUNGEON_TYPE = "Hub"; - private static final String TRAP_DUNGEON_TYPE = "Trap"; - private static final String SIMPLE_HALL_DUNGEON_TYPE = "SimpleHall"; - private static final String COMPLEX_HALL_DUNGEON_TYPE = "ComplexHall"; - private static final String EXIT_DUNGEON_TYPE = "Exit"; - private static final String DEAD_END_DUNGEON_TYPE = "DeadEnd"; - private static final String MAZE_DUNGEON_TYPE = "Maze"; - - //The list of dungeon types will be kept as an array for now. If we allow new - //dungeon types in the future, then this can be changed to an ArrayList. - private static final String[] DUNGEON_TYPES = new String[] { - HUB_DUNGEON_TYPE, - TRAP_DUNGEON_TYPE, - SIMPLE_HALL_DUNGEON_TYPE, - COMPLEX_HALL_DUNGEON_TYPE, - EXIT_DUNGEON_TYPE, - DEAD_END_DUNGEON_TYPE, - MAZE_DUNGEON_TYPE - }; - private ArrayList untaggedDungeons = new ArrayList(); private ArrayList registeredDungeons = new ArrayList(); - - private ArrayList simpleHalls = new ArrayList(); - private ArrayList complexHalls = new ArrayList(); - private ArrayList deadEnds = new ArrayList(); - private ArrayList hubs = new ArrayList(); - private ArrayList mazes = new ArrayList(); - private ArrayList pistonTraps = new ArrayList(); - private ArrayList exits = new ArrayList(); + public DungeonPack RuinsPack; + private DungeonGenerator defaultUp; private DungeonGenerator defaultDown; private DungeonGenerator defaultError; - private HashSet dungeonTypeChecker; - private HashMap> dungeonTypeMapping; - private DungeonHelper() { - //Load the dungeon type checker with the list of all types in lowercase. - //Capitalization matters for matching in a hash set. - dungeonTypeChecker = new HashSet(); - for (String dungeonType : DUNGEON_TYPES) - { - dungeonTypeChecker.add(dungeonType.toLowerCase()); - } - - //Add all the basic dungeon types to dungeonTypeMapping - //Dungeon type names must be passed in lowercase to make matching easier. - dungeonTypeMapping = new HashMap>(); - dungeonTypeMapping.put(SIMPLE_HALL_DUNGEON_TYPE.toLowerCase(), simpleHalls); - dungeonTypeMapping.put(COMPLEX_HALL_DUNGEON_TYPE.toLowerCase(), complexHalls); - dungeonTypeMapping.put(HUB_DUNGEON_TYPE.toLowerCase(), hubs); - dungeonTypeMapping.put(EXIT_DUNGEON_TYPE.toLowerCase(), exits); - dungeonTypeMapping.put(DEAD_END_DUNGEON_TYPE.toLowerCase(), deadEnds); - dungeonTypeMapping.put(MAZE_DUNGEON_TYPE.toLowerCase(), mazes); - dungeonTypeMapping.put(TRAP_DUNGEON_TYPE.toLowerCase(), pistonTraps); - //Load our reference to the DDProperties singleton if (properties == null) properties = DDProperties.instance(); - registerCustomDungeons(); + registerDungeons(); } public static DungeonHelper initialize() @@ -135,15 +92,67 @@ public class DungeonHelper return instance; } - private void registerCustomDungeons() + private void registerDungeons() { File file = new File(properties.CustomSchematicDirectory); if (file.exists() || file.mkdir()) { copyfile.copyFile(DUNGEON_CREATION_GUIDE_SOURCE_PATH, file.getAbsolutePath() + "/How_to_add_dungeons.txt"); } + + RuinsPack = new DungeonPack(createRuinsConfig()); + registerBundledDungeons(); - importCustomDungeons(properties.CustomSchematicDirectory); + registerCustomDungeons(properties.CustomSchematicDirectory); + } + + private static DungeonPackConfig createRuinsConfig() + { + //This is a temporarily function for testing dungeon packs. + //It'll be removed later when we read dungeon configurations from files. + + ArrayList rules = new ArrayList(); + rules.add(parseDefinitionUnsafe("? ? ? -> DeadEnd Exit")); + rules.add(parseDefinitionUnsafe("Trap -> ?")); + rules.add(parseDefinitionUnsafe("Hub -> Trap")); + rules.add(parseDefinitionUnsafe("? -> Hub")); + rules.add(parseDefinitionUnsafe("-> ComplexHall#40 Hub#30 Trap#10 SimpleHall#10 Maze#10")); + + String[] typeNames = "Hub Trap Maze Exit DeadEnd SimpleHall ComplexHall".toUpperCase().split(" "); + + DungeonPackConfig config = new DungeonPackConfig(); + config.setName("ruins"); + config.setAllowDuplicatesInChain(false); + config.setRules(rules); + config.setTypeNames(new ArrayList(Arrays.asList(typeNames))); + return config; + } + + private static DungeonChainRuleDefinition parseDefinitionUnsafe(String definition) + { + //This is an improvised parsing function for rule definitions. Only for testing!!! + definition = definition.toUpperCase(); + String[] parts = definition.split("->"); + ArrayList condition = new ArrayList(); + ArrayList> products = new ArrayList>(); + + for (String conditionPart : parts[0].split(" ")) + { + if (!conditionPart.isEmpty()) + condition.add(conditionPart); + } + + for (String product : parts[1].split(" ")) + { + if (!product.isEmpty()) + { + String[] productParts = product.split("#"); + String productType = productParts[0]; + int weight = (productParts.length > 1) ? Integer.parseInt(productParts[1]) : 100; + products.add(new WeightedContainer(productType, weight)); + } + } + return new DungeonChainRuleDefinition(condition, products); } public List getRegisteredDungeons() @@ -186,7 +195,7 @@ public class DungeonHelper public boolean validateDungeonType(String type) { //Check if the dungeon type is valid - return dungeonTypeChecker.contains(type.toLowerCase()); + return RuinsPack.isKnownType(type); } public boolean validateSchematicName(String name) @@ -203,11 +212,11 @@ public class DungeonHelper return false; //Check if the dungeon type is valid - if (!dungeonTypeChecker.contains(dungeonData[0].toLowerCase())) + if (!validateDungeonType(dungeonData[0])) return false; //Check if the name is valid - if (!SchematicNamePattern.matcher(dungeonData[1]).matches()) + if (!SCHEMATIC_NAME_PATTERN.matcher(dungeonData[1]).matches()) return false; //Check if the open/closed flag is present @@ -246,14 +255,14 @@ public class DungeonHelper //Strip off the file extension while splitting the file name String[] dungeonData = name.substring(0, name.length() - SCHEMATIC_FILE_EXTENSION.length()).split("_"); - String dungeonType = dungeonData[0].toLowerCase(); + DungeonType dungeonType = RuinsPack.getType(dungeonData[0]); boolean isOpen = dungeonData[2].equalsIgnoreCase("open"); int weight = (dungeonData.length == 4) ? Integer.parseInt(dungeonData[3]) : DEFAULT_DUNGEON_WEIGHT; //Add this custom dungeon to the list corresponding to its type - DungeonGenerator generator = new DungeonGenerator(weight, path, isOpen); + DungeonGenerator generator = new DungeonGenerator(weight, path, isOpen, dungeonType); - dungeonTypeMapping.get(dungeonType).add(generator); + RuinsPack.addDungeon(generator); registeredDungeons.add(generator); if (verbose) { @@ -266,7 +275,7 @@ public class DungeonHelper { System.out.println("Could not parse dungeon filename, not adding dungeon to generation lists"); } - untaggedDungeons.add(new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, path, true)); + untaggedDungeons.add(new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, path, true, DungeonType.UNKNOWN_TYPE)); System.out.println("Registered untagged dungeon: " + name); } } @@ -277,7 +286,7 @@ public class DungeonHelper } } - private void importCustomDungeons(String path) + private void registerCustomDungeons(String path) { File directory = new File(path); File[] schematicNames = directory.listFiles(); @@ -298,9 +307,9 @@ public class DungeonHelper { //Register the core schematics //These are used for debugging and in case of unusual errors while loading dungeons - defaultUp = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, DEFAULT_UP_SCHEMATIC_PATH, true); - defaultDown = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, DEFAULT_DOWN_SCHEMATIC_PATH, true); - defaultError = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, DEFAULT_ERROR_SCHEMATIC_PATH, true); + defaultUp = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, DEFAULT_UP_SCHEMATIC_PATH, true, DungeonType.UNKNOWN_TYPE); + defaultDown = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, DEFAULT_DOWN_SCHEMATIC_PATH, true, DungeonType.UNKNOWN_TYPE); + defaultError = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, DEFAULT_ERROR_SCHEMATIC_PATH, true, DungeonType.UNKNOWN_TYPE); //Open the list of dungeons packaged with our mod and register their schematics InputStream listStream = this.getClass().getResourceAsStream(BUNDLED_DUNGEONS_LIST_PATH); @@ -408,7 +417,7 @@ public class DungeonHelper return names; } - public static ArrayList getDungeonChainHistory(DimData dimData, int maxSize) + public static ArrayList getDungeonChainHistory(DimData dimData, DungeonPack pack, int maxSize) { //TODO: I've improved this code for the time being. However, searching across links is a flawed approach. A player could //manipulate the output of this function by setting up links to mislead our algorithm or by removing links. @@ -418,10 +427,15 @@ public class DungeonHelper ArrayList history = new ArrayList(); DimData tailDim = helper.getDimData(helper.getLinkDataFromCoords(dimData.exitDimLink.destXCoord, dimData.exitDimLink.destYCoord, dimData.exitDimLink.destZCoord, dimData.exitDimLink.destDimID).destDimID); - for (int count = 0; count < maxSize && tailDim.dungeonGenerator != null; count++) + for (int count = 0; count < maxSize; count++) { - history.add(tailDim.dungeonGenerator); + if (tailDim.dungeonGenerator == null || tailDim.dungeonGenerator.getDungeonType().Owner != pack) + { + //We've reached a dimension that doesn't belong to our pack. Stop the search here. + break; + } + history.add(tailDim.dungeonGenerator); if (count + 1 < maxSize) { for (LinkData link : tailDim.getLinksInDim()) diff --git a/StevenDimDoors/mod_pocketDim/util/WeightedContainer.java b/StevenDimDoors/mod_pocketDim/util/WeightedContainer.java index e69e48b..71332f3 100644 --- a/StevenDimDoors/mod_pocketDim/util/WeightedContainer.java +++ b/StevenDimDoors/mod_pocketDim/util/WeightedContainer.java @@ -17,11 +17,15 @@ public class WeightedContainer extends WeightedRandomItem { { super(weight); this.data = data; - super.itemWeight = weight; } public T getData() { return data; } + + public WeightedContainer clone() + { + return new WeightedContainer(data, itemWeight); + } } -- 2.39.5 From 35329f9024a076174951797694e247670e27df38 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 5 Aug 2013 09:50:00 -0400 Subject: [PATCH 003/544] Adding DungeonChainRuleDefinition For some odd reason, git didn't commit DungeonChainRuleDefinition in my last commit. Adding it again now. --- .../pack/DungeonChainRuleDefinition.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRuleDefinition.java diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRuleDefinition.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRuleDefinition.java new file mode 100644 index 0000000..f06cded --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRuleDefinition.java @@ -0,0 +1,28 @@ +package StevenDimDoors.mod_pocketDim.dungeon.pack; + +import java.util.ArrayList; + +import StevenDimDoors.mod_pocketDim.util.WeightedContainer; + +public class DungeonChainRuleDefinition +{ + private ArrayList conditions; + private ArrayList> products; + + public DungeonChainRuleDefinition(ArrayList conditions, ArrayList> products) + { + this.conditions = conditions; + this.products = products; + } + + public ArrayList getCondition() + { + return conditions; + } + + public ArrayList> getProducts() + { + return products; + } + +} -- 2.39.5 From f372b9ccb59cb171da2bbd63186f72648f92e146 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 5 Aug 2013 20:16:45 -0400 Subject: [PATCH 004/544] Basic Configurable Dungeon Chains Completed a basic version of configurable dungeon chains. Almost all of the final funcionality is present. However, the configuration is hardcoded at the moment, not read from a file. This was done for testing purposes. I'll add reading from config files soon. Dungeon packs are partially implemented. Built-in and custom dungeons are currently thrown into the default pack, Ruins. The next step is to generalize the dungeon registration code in DungeonHelper so that we can detect dungeon packs, read their config files, and register dungeons with their corresponding pack. dd-export will need to support packs as well. dd-rift will have issues dealing with duplicate dungeon names across packs, but this isn't a major concern and can be dealt with in the long term. --- .../mod_pocketDim/SchematicLoader.java | 13 ++-- .../dungeon/pack/DungeonChainRule.java | 7 +- .../dungeon/pack/DungeonPack.java | 4 +- .../mod_pocketDim/helpers/DungeonHelper.java | 78 ++++++++++++++----- .../util/BaseConfigurationProcessor.java | 52 +++++++++++++ .../ConfigurationProcessingException.java | 21 +++++ schematics/ruins/rules.txt | 33 ++++++++ 7 files changed, 180 insertions(+), 28 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/util/BaseConfigurationProcessor.java create mode 100644 StevenDimDoors/mod_pocketDim/util/ConfigurationProcessingException.java create mode 100644 schematics/ruins/rules.txt diff --git a/StevenDimDoors/mod_pocketDim/SchematicLoader.java b/StevenDimDoors/mod_pocketDim/SchematicLoader.java index 00d1b6a..b1c796a 100644 --- a/StevenDimDoors/mod_pocketDim/SchematicLoader.java +++ b/StevenDimDoors/mod_pocketDim/SchematicLoader.java @@ -43,12 +43,15 @@ public class SchematicLoader if (dimList.get(destDimID).dungeonGenerator == null) { //The following initialization code is based on code from ChunkProviderGenerate. - //It makes our generation depend on the world seed. + //It makes our generation depend on the world seed. We have an additional seed here + //to prevent correlations between the selected dungeons and the locations of gateways. + //TODO: We should centralize RNG initialization and world-seed modifiers for each specific application. - Random random = new Random(world.getSeed()); - long factorA = random.nextLong() / 2L * 2L + 1L; - long factorB = random.nextLong() / 2L * 2L + 1L; - random.setSeed((link.destXCoord >> 4) * factorA + (link.destZCoord >> 4) * factorB ^ world.getSeed()); + final long localSeed = world.getSeed() ^ 0x2F50DB9B4A8057E4L; + final Random random = new Random(); + final long factorA = random.nextLong() / 2L * 2L + 1L; + final long factorB = random.nextLong() / 2L * 2L + 1L; + random.setSeed((link.destXCoord >> 4) * factorA + (link.destZCoord >> 4) * factorB ^ localSeed); dungeonHelper.generateDungeonLink(link, dungeonHelper.RuinsPack, random); } diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java index 472f20b..17554dc 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java @@ -15,12 +15,13 @@ public class DungeonChainRule ArrayList conditionNames = source.getCondition(); ArrayList> productNames = source.getProducts(); + //Obtain the IDs of dungeon types in reverse order. Reverse order makes comparing against chain histories easy. condition = new int[conditionNames.size()]; - for (int k = 0; k < condition.length; k++) + for (int src = 0, dst = condition.length - 1; src < condition.length; src++, dst--) { - condition[k] = nameToTypeMapping.get(conditionNames.get(k)).ID; + condition[dst] = nameToTypeMapping.get(conditionNames.get(src)).ID; } - products = new ArrayList>(); + products = new ArrayList>(productNames.size()); for (WeightedContainer product : productNames) { products.add(new WeightedContainer(nameToTypeMapping.get(product.getData()), product.itemWeight )); diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java index 9db777d..40bc2c7 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java @@ -162,11 +162,11 @@ public class DungeonPack { excludedDungeons = new HashSet(history); } - + //List which dungeons are allowed ArrayList candidates; ArrayList group = groupedDungeons.get(nextType.ID); - if (excludedDungeons != null) + if (excludedDungeons != null && !excludedDungeons.isEmpty()) { candidates = new ArrayList(group.size()); for (DungeonGenerator dungeon : group) diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index c364297..372979d 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -9,7 +9,9 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; +import java.util.Queue; import java.util.Random; import java.util.regex.Pattern; @@ -423,32 +425,72 @@ public class DungeonHelper //manipulate the output of this function by setting up links to mislead our algorithm or by removing links. //Dimensions MUST have built-in records of their parent dimensions in the future. ~SenseiKiwi - dimHelper helper = dimHelper.instance; ArrayList history = new ArrayList(); - DimData tailDim = helper.getDimData(helper.getLinkDataFromCoords(dimData.exitDimLink.destXCoord, dimData.exitDimLink.destYCoord, dimData.exitDimLink.destZCoord, dimData.exitDimLink.destDimID).destDimID); + DimData tailDim = dimData; + boolean found = true; - for (int count = 0; count < maxSize; count++) + if (dimData.dungeonGenerator == null || dimData.dungeonGenerator.getDungeonType().Owner != pack || maxSize < 1) { - if (tailDim.dungeonGenerator == null || tailDim.dungeonGenerator.getDungeonType().Owner != pack) + //The initial dimension is already outside our pack. Return an empty list. + return history; + } + history.add(dimData.dungeonGenerator); + + for (int count = 1; count < maxSize && found; count++) + { + found = false; + for (LinkData link : tailDim.getLinksInDim()) { - //We've reached a dimension that doesn't belong to our pack. Stop the search here. - break; - } - - history.add(tailDim.dungeonGenerator); - if (count + 1 < maxSize) - { - for (LinkData link : tailDim.getLinksInDim()) + DimData neighbor = dimHelper.instance.getDimData(link.destDimID); + if (neighbor.depth == tailDim.depth - 1 && neighbor.dungeonGenerator != null && + neighbor.dungeonGenerator.getDungeonType().Owner == pack) { - DimData nextDim = dimHelper.instance.getDimData(link.destDimID); - if (helper.getDimDepth(link.destDimID) == tailDim.depth + 1) - { - tailDim = nextDim; - break; - } + tailDim = neighbor; + history.add(tailDim.dungeonGenerator); + found = true; + break; } } } return history; } + + public static ArrayList getFlatDungeonTree(DimData dimData, int maxSize) + { + //TODO: I've improved this code for the time being. However, searching across links is a flawed approach. A player could + //manipulate the output of this function by setting up links to mislead our algorithm or by removing links. + //Dimensions MUST have built-in records of their parent dimensions in the future. ~SenseiKiwi + + dimHelper helper = dimHelper.instance; + ArrayList dungeons = new ArrayList(); + DimData root = helper.getDimData(helper.getLinkDataFromCoords(dimData.exitDimLink.destXCoord, dimData.exitDimLink.destYCoord, dimData.exitDimLink.destZCoord, dimData.exitDimLink.destDimID).destDimID); + HashSet checked = new HashSet(); + Queue pendingDimensions = new LinkedList(); + + if (root.dungeonGenerator == null) + { + return dungeons; + } + pendingDimensions.add(root); + checked.add(root); + + while (dungeons.size() < maxSize && !pendingDimensions.isEmpty()) + { + DimData current = pendingDimensions.remove(); + for (LinkData link : current.getLinksInDim()) + { + DimData child = helper.getDimData(link.destDimID); + if (child.depth == current.depth + 1 && child.dungeonGenerator != null && checked.add(child)) + { + dungeons.add(child.dungeonGenerator); + pendingDimensions.add(child); + } + if (dungeons.size() == maxSize) + { + break; + } + } + } + return dungeons; + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/util/BaseConfigurationProcessor.java b/StevenDimDoors/mod_pocketDim/util/BaseConfigurationProcessor.java new file mode 100644 index 0000000..8fe75a2 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/util/BaseConfigurationProcessor.java @@ -0,0 +1,52 @@ +package StevenDimDoors.mod_pocketDim.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; + +public abstract class BaseConfigurationProcessor +{ + public BaseConfigurationProcessor() { } + + public boolean canRead() + { + return true; + } + + public boolean canWrite() + { + return true; + } + + public T readFromFile(String path) throws FileNotFoundException, ConfigurationProcessingException + { + return readFromFile(new File(path)); + } + + public T readFromFile(File file) throws FileNotFoundException, ConfigurationProcessingException + { + return readFromStream(new FileInputStream(file)); + } + + public T readFromResource(String resourcePath) throws ConfigurationProcessingException + { + return readFromStream(this.getClass().getResourceAsStream(resourcePath)); + } + + public abstract T readFromStream(InputStream inputStream) throws ConfigurationProcessingException; + + public void writeToFile(File file, T data) throws FileNotFoundException, ConfigurationProcessingException + { + writeToStream(new FileOutputStream(file), data); + } + + public void writeToFile(String path, T data) throws FileNotFoundException, ConfigurationProcessingException + { + writeToFile(new File(path), data); + } + + public abstract void writeToStream(OutputStream outputStream, T data) throws ConfigurationProcessingException; +} diff --git a/StevenDimDoors/mod_pocketDim/util/ConfigurationProcessingException.java b/StevenDimDoors/mod_pocketDim/util/ConfigurationProcessingException.java new file mode 100644 index 0000000..1793f22 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/util/ConfigurationProcessingException.java @@ -0,0 +1,21 @@ +package StevenDimDoors.mod_pocketDim.util; + +public class ConfigurationProcessingException extends Exception +{ + private static final long serialVersionUID = -4525298050874891911L; + + public ConfigurationProcessingException() + { + super(); + } + + public ConfigurationProcessingException(String message) + { + super(message); + } + + public ConfigurationProcessingException(String message, Throwable cause) + { + super(message, cause); + } +} diff --git a/schematics/ruins/rules.txt b/schematics/ruins/rules.txt new file mode 100644 index 0000000..086036a --- /dev/null +++ b/schematics/ruins/rules.txt @@ -0,0 +1,33 @@ +Version 1 +Types: +Hub +Trap +SimpleHall +ComplexHall +Exit +DeadEnd +Maze + +Settings: +AllowRepetitionsInBranch = false +AllowPackChangeOut = true +AllowPackChangeIn = true +PackWeight = 100 + +Rules: + +Exit -> DeadEnd Exit + +DeadEnd -> DeadEnd Exit + +? ? ? ? ? ? ? ? -> Trap#20 SimpleHall#40 ComplexHall#10 Exit#20 DeadEnd#10 + +? ? ? ? -> Trap#18 SimpleHall#40 ComplexHall#10 Exit#18 DeadEnd#10 Hub#4 + +? ? ? -> ComplexHall Hub Trap SimpleHall Maze + +? ? -> ComplexHall Hub Trap SimpleHall Maze + +? -> ComplexHall#40 Hub#30 Trap#10 SimpleHall#10 Maze#10 + +-> ComplexHall#40 Hub#30 Trap#10 SimpleHall#10 Maze#10 \ No newline at end of file -- 2.39.5 From 6b69d3d1386435b78a2b3e0b944d4c63f3b2b797 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 7 Aug 2013 22:11:10 -0400 Subject: [PATCH 005/544] Added Nether Gateway Chance Correction Modified RiftGenerator to correct for the rarity of Rift Gateways in the Nether. Our config settings allow us to set the probability that we will attempt to generate a gateway in a given chunk. However, that doesn't guarantee that a gateway will generate. I collected a lot of data and determined that generation succeeds in the Nether only about 15% of the time. That's compared to 30% in the Overworld when counting oceans (which always fail) and about 75% (sometimes higher) when traveling mainly on land. RiftGenerator now corrects for this by multiplying the chance of attempting to generate gateways in the Nether by 4. Gateways in the Nether are still relatively rare and hard to find, but you'll occasionally come across them now. Also reorganized the code a little for clarify. --- .../mod_pocketDim/RiftGenerator.java | 125 +++++++++++------- 1 file changed, 79 insertions(+), 46 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/RiftGenerator.java b/StevenDimDoors/mod_pocketDim/RiftGenerator.java index 7b7f36e..1009b31 100644 --- a/StevenDimDoors/mod_pocketDim/RiftGenerator.java +++ b/StevenDimDoors/mod_pocketDim/RiftGenerator.java @@ -24,6 +24,9 @@ public class RiftGenerator implements IWorldGenerator private static final int CHUNK_LENGTH = 16; private static final int GATEWAY_RADIUS = 4; private static final int MAX_GATEWAY_GENERATION_ATTEMPTS = 10; + private static final int NETHER_CHANCE_CORRECTION = 4; + private static final int OVERWORLD_DIMENSION_ID = 0; + private static final int NETHER_DIMENSION_ID = -1; private static DDProperties properties = null; public RiftGenerator() @@ -43,16 +46,30 @@ public class RiftGenerator implements IWorldGenerator return; } //This check prevents a crash related to superflat worlds not loading World 0 - if (dimHelper.getWorld(0) == null) + if (dimHelper.getWorld(OVERWORLD_DIMENSION_ID) == null) { return; } int x, y, z; int attempts; - int blockID; + int correction; boolean valid; LinkData link; + + //Check if we're generating things in the Nether + if (world.provider.dimensionId == NETHER_DIMENSION_ID) + { + //The terrain in the Nether makes it much harder for our gateway spawning algorithm to find a spot to place a gateway. + //Tests show that only about 15% of attempts succeed. Compensate for this by multiplying the chance of generation + //by a correction factor. + correction = NETHER_CHANCE_CORRECTION; + } + else + { + //No correction + correction = 1; + } //Randomly decide whether to place a cluster of rifts here if (random.nextInt(MAX_CLUSTER_GENERATION_CHANCE) < properties.ClusterGenerationChance) @@ -91,7 +108,8 @@ public class RiftGenerator implements IWorldGenerator //Check if generating structures is enabled and randomly decide whether to place a Rift Gateway here. //This only happens if a rift cluster was NOT generated. - else if (random.nextInt(MAX_GATEWAY_GENERATION_CHANCE) < properties.GatewayGenerationChance && isStructureGenerationAllowed()) + else if (random.nextInt(MAX_GATEWAY_GENERATION_CHANCE) < properties.GatewayGenerationChance * correction && + isStructureGenerationAllowed()) { valid = false; x = y = z = 0; //Stop the compiler from freaking out @@ -117,59 +135,74 @@ public class RiftGenerator implements IWorldGenerator //If the current dimension isn't Limbo, build a Rift Gateway out of Stone Bricks if (world.provider.dimensionId != properties.LimboDimensionID) { - blockID = Block.stoneBrick.blockID; - - //Replace some of the ground around the gateway with bricks - for (int xc = -GATEWAY_RADIUS; xc <= GATEWAY_RADIUS; xc++) - { - for (int zc= -GATEWAY_RADIUS; zc <= GATEWAY_RADIUS; zc++) - { - //Check that the block is supported by an opaque block. - //This prevents us from building over a cliff, on the peak of a mountain, - //or the surface of the ocean or a frozen lake. - if (world.isBlockOpaqueCube(x + xc, y - 2, z + zc)) - { - //Randomly choose whether to place bricks or not. The math is designed so that the - //chances of placing a block decrease as we get farther from the gateway's center. - if (Math.abs(xc) + Math.abs(zc) < random.nextInt(2) + 3) - { - //Place Stone Bricks - world.setBlock(x + xc, y - 1, z + zc, blockID, 0, 3); - } - else if (Math.abs(xc) + Math.abs(zc) < random.nextInt(3) + 3) - { - //Place Cracked Stone Bricks - world.setBlock(x + xc, y - 1, z + zc, blockID, 2, 3); - } - } - } - } - - //Use Chiseled Stone Bricks to top off the pillars around the door - world.setBlock(x, y + 2, z + 1, blockID, 3, 3); - world.setBlock(x, y + 2, z - 1, blockID, 3, 3); + createStoneGateway(world, x, y, z, random); } else { - //Build the gateway out of Unraveled Fabric. Since nearly all the blocks in Limbo are of - //that type, there is no point replacing the ground. Just build the tops of the columns here. - blockID = properties.LimboBlockID; - world.setBlock(x, y + 2, z + 1, blockID, 0, 3); - world.setBlock(x, y + 2, z - 1, blockID, 0, 3); + createLimboGateway(world, x, y, z); } //Place the shiny transient door into a dungeon itemDimDoor.placeDoorBlock(world, x, y + 1, z, 0, mod_pocketDim.transientDoor); - - //Build the columns around the door - world.setBlock(x, y + 1, z - 1, blockID, 0, 3); - world.setBlock(x, y + 1, z + 1, blockID, 0, 3); - world.setBlock(x, y, z - 1, blockID, 0, 3); - world.setBlock(x, y, z + 1, blockID, 0, 3); } } } + private static void createStoneGateway(World world, int x, int y, int z, Random random) + { + final int blockID = Block.stoneBrick.blockID; + + //Replace some of the ground around the gateway with bricks + for (int xc = -GATEWAY_RADIUS; xc <= GATEWAY_RADIUS; xc++) + { + for (int zc= -GATEWAY_RADIUS; zc <= GATEWAY_RADIUS; zc++) + { + //Check that the block is supported by an opaque block. + //This prevents us from building over a cliff, on the peak of a mountain, + //or the surface of the ocean or a frozen lake. + if (world.isBlockOpaqueCube(x + xc, y - 2, z + zc)) + { + //Randomly choose whether to place bricks or not. The math is designed so that the + //chances of placing a block decrease as we get farther from the gateway's center. + if (Math.abs(xc) + Math.abs(zc) < random.nextInt(2) + 3) + { + //Place Stone Bricks + world.setBlock(x + xc, y - 1, z + zc, blockID, 0, 3); + } + else if (Math.abs(xc) + Math.abs(zc) < random.nextInt(3) + 3) + { + //Place Cracked Stone Bricks + world.setBlock(x + xc, y - 1, z + zc, blockID, 2, 3); + } + } + } + } + + //Use Chiseled Stone Bricks to top off the pillars around the door + world.setBlock(x, y + 2, z + 1, blockID, 3, 3); + world.setBlock(x, y + 2, z - 1, blockID, 3, 3); + //Build the columns around the door + world.setBlock(x, y + 1, z - 1, blockID, 0, 3); + world.setBlock(x, y + 1, z + 1, blockID, 0, 3); + world.setBlock(x, y, z - 1, blockID, 0, 3); + world.setBlock(x, y, z + 1, blockID, 0, 3); + } + + private static void createLimboGateway(World world, int x, int y, int z) + { + //Build the gateway out of Unraveled Fabric. Since nearly all the blocks in Limbo are of + //that type, there is no point replacing the ground. + final int blockID = properties.LimboBlockID; + world.setBlock(x, y + 2, z + 1, blockID, 0, 3); + world.setBlock(x, y + 2, z - 1, blockID, 0, 3); + + //Build the columns around the door + world.setBlock(x, y + 1, z - 1, blockID, 0, 3); + world.setBlock(x, y + 1, z + 1, blockID, 0, 3); + world.setBlock(x, y, z - 1, blockID, 0, 3); + world.setBlock(x, y, z + 1, blockID, 0, 3); + } + private static boolean checkGatewayLocation(World world, int x, int y, int z) { //Check if the point is within the acceptable altitude range, the block above that point is empty, @@ -195,6 +228,6 @@ public class RiftGenerator implements IWorldGenerator private static boolean isStructureGenerationAllowed() { - return DimensionManager.getWorld(0).getWorldInfo().isMapFeaturesEnabled(); + return DimensionManager.getWorld(OVERWORLD_DIMENSION_ID).getWorldInfo().isMapFeaturesEnabled(); } } -- 2.39.5 From 7537d6cd7a5c3efd40e2ab90da70715a15b28f78 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 15 Aug 2013 05:35:03 -0400 Subject: [PATCH 006/544] Decreased Default Gateway Generation Chance Decreased the default chance of a gateway generating. This won't affect users unless they clear their config files. The decision is based on user feedback and recent experiments on how common gateways could be. --- StevenDimDoors/mod_pocketDim/DDProperties.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/DDProperties.java b/StevenDimDoors/mod_pocketDim/DDProperties.java index 243be95..a10cb31 100644 --- a/StevenDimDoors/mod_pocketDim/DDProperties.java +++ b/StevenDimDoors/mod_pocketDim/DDProperties.java @@ -214,9 +214,9 @@ public class DDProperties "Sets the chance (out of " + RiftGenerator.MAX_CLUSTER_GENERATION_CHANCE + ") that a cluster of rifts will " + "generate in a given chunk. The default chance is 3.").getInt(); - GatewayGenerationChance = config.get(Configuration.CATEGORY_GENERAL, "Gateway Generation Chance", 40, + GatewayGenerationChance = config.get(Configuration.CATEGORY_GENERAL, "Gateway Generation Chance", 10, "Sets the chance (out of " + RiftGenerator.MAX_GATEWAY_GENERATION_CHANCE + ") that a Rift Gateway will " + - "generate in a given chunk. The default chance is 40.").getInt(); + "generate in a given chunk. The default chance is 10.").getInt(); RiftSpreadModifier = config.get(Configuration.CATEGORY_GENERAL, "Rift Spread Modifier", 3, "Sets the number of times a rift can spread. 0 prevents rifts from spreading at all. " + -- 2.39.5 From dc7289a04817a2f25160f193ab0308c2e1cc7234 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 15 Aug 2013 07:29:37 -0400 Subject: [PATCH 007/544] Dungeon Selection Fix and Chain Config Change Changed how Random is initialized in SchematicLoader to prevent issues with dim doors in the same chunks leading to the same dungeon. The selection seems much more varied now. Also changed the hardcoded config for the default dungeon chains to the one we'll be using later (from a file). For testing purposes. --- .../mod_pocketDim/SchematicLoader.java | 51 +++++++++++++++---- .../mod_pocketDim/helpers/DungeonHelper.java | 15 ++++-- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/SchematicLoader.java b/StevenDimDoors/mod_pocketDim/SchematicLoader.java index b1c796a..f5006f4 100644 --- a/StevenDimDoors/mod_pocketDim/SchematicLoader.java +++ b/StevenDimDoors/mod_pocketDim/SchematicLoader.java @@ -42,16 +42,9 @@ public class SchematicLoader if (dimList.get(destDimID).dungeonGenerator == null) { - //The following initialization code is based on code from ChunkProviderGenerate. - //It makes our generation depend on the world seed. We have an additional seed here - //to prevent correlations between the selected dungeons and the locations of gateways. //TODO: We should centralize RNG initialization and world-seed modifiers for each specific application. - - final long localSeed = world.getSeed() ^ 0x2F50DB9B4A8057E4L; - final Random random = new Random(); - final long factorA = random.nextLong() / 2L * 2L + 1L; - final long factorB = random.nextLong() / 2L * 2L + 1L; - random.setSeed((link.destXCoord >> 4) * factorA + (link.destZCoord >> 4) * factorB ^ localSeed); + final long localSeed = world.getSeed() ^ 0x2F50DB9B4A8057E4L ^ computeDestinationHash(link); + final Random random = new Random(localSeed); dungeonHelper.generateDungeonLink(link, dungeonHelper.RuinsPack, random); } @@ -160,4 +153,44 @@ public class SchematicLoader } return dungeon; } + + private static long computeDestinationHash(LinkData link) + { + //Time for some witchcraft. + //The code here is inspired by a discussion on Stack Overflow regarding hash codes for 3D. + //Source: http://stackoverflow.com/questions/9858376/hashcode-for-3d-integer-coordinates-with-high-spatial-coherence + + //Use 8 bits from Y and 24 bits from X and Z. Mix in 8 bits from the destination dim ID too - that means + //even if you aligned two doors perfectly between two pockets, it's unlikely they would lead to the same dungeon. + + int bit; + int index; + long hash; + int w = link.destDimID; + int x = link.destXCoord; + int y = link.destYCoord; + int z = link.destZCoord; + + hash = 0; + index = 0; + for (bit = 0; bit < 8; bit++) + { + hash |= ((w >> bit) & 1) << index; + index++; + hash |= ((x >> bit) & 1) << index; + index++; + hash |= ((y >> bit) & 1) << index; + index++; + hash |= ((z >> bit) & 1) << index; + index++; + } + for (; bit < 24; bit++) + { + hash |= ((x >> bit) & 1) << index; + index++; + hash |= ((z >> bit) & 1) << index; + index++; + } + return hash; + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 372979d..ae5e6c1 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -114,10 +114,17 @@ public class DungeonHelper //It'll be removed later when we read dungeon configurations from files. ArrayList rules = new ArrayList(); - rules.add(parseDefinitionUnsafe("? ? ? -> DeadEnd Exit")); - rules.add(parseDefinitionUnsafe("Trap -> ?")); - rules.add(parseDefinitionUnsafe("Hub -> Trap")); - rules.add(parseDefinitionUnsafe("? -> Hub")); + + rules.add(parseDefinitionUnsafe("? ? ? ? ? ? ? ? -> Trap#20 SimpleHall#40 ComplexHall#10 Exit#20 DeadEnd#10")); + + rules.add(parseDefinitionUnsafe("? ? ? ? -> Trap#18 SimpleHall#40 ComplexHall#10 Exit#18 DeadEnd#10 Hub#4")); + + rules.add(parseDefinitionUnsafe("? ? ? -> ComplexHall Hub Trap SimpleHall Maze")); + + rules.add(parseDefinitionUnsafe("? ? -> ComplexHall Hub Trap SimpleHall Maze")); + + rules.add(parseDefinitionUnsafe("? -> ComplexHall#40 Hub#30 Trap#10 SimpleHall#10 Maze#10")); + rules.add(parseDefinitionUnsafe("-> ComplexHall#40 Hub#30 Trap#10 SimpleHall#10 Maze#10")); String[] typeNames = "Hub Trap Maze Exit DeadEnd SimpleHall ComplexHall".toUpperCase().split(" "); -- 2.39.5 From ec17e1d238d9e5cb96678bcd9fa61b3d79404e3d Mon Sep 17 00:00:00 2001 From: skyboy Date: Fri, 16 Aug 2013 04:36:01 -0400 Subject: [PATCH 008/544] Avoid testing LinkData that does not belong to the same dimension --- StevenDimDoors/mod_pocketDim/EventHookContainer.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 95742f3..800c34a 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -58,6 +58,10 @@ public class EventHookContainer { for (LinkData link:dimHelper.instance.getDimData(world.provider.dimensionId).getLinksInDim()) { + if (world.provider.dimensionId != link.locDimID) + { + continue; + } if (!mod_pocketDim.blockRift.isBlockImmune(world, link.locXCoord, link.locYCoord, link.locZCoord)) { dimHelper.getWorld(link.locDimID).setBlock(link.locXCoord, link.locYCoord, link.locZCoord, properties.RiftBlockID); @@ -99,4 +103,4 @@ public class EventHookContainer dimHelper.instance.save(); } } -} \ No newline at end of file +} -- 2.39.5 From caf33bd866487882b70450bd9aeff5edb4103609 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 17 Aug 2013 20:32:30 -0400 Subject: [PATCH 009/544] Improved EventHookContainer Made some changes to EventHookContainer.onWorldLoad() to remove redundant code that encouraged bugs. Unfortunately, a lot of link-related code needs to be rewritten to get rid of bugs, so that'll come after dungeon packs are completed. --- .../mod_pocketDim/EventHookContainer.java | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 95742f3..d2e12b1 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -46,32 +46,26 @@ public class EventHookContainer dimHelper.instance.interDimLinkList.clear(); dimHelper.instance.initPockets(); } - for (Integer ids : dimHelper.getIDs()) - { - World world = dimHelper.getWorld(ids); + + //TODO: In the future, we should iterate over DimHelper's dimension list. We ignore other dimensions anyway. + for (int dimensionID : dimHelper.getIDs()) + { + World world = dimHelper.getWorld(dimensionID); int linkCount = 0; - if (dimHelper.dimList.containsKey(world.provider.dimensionId)) + if (dimHelper.dimList.containsKey(dimensionID)) { - //TODO added temporary Try/catch block to prevent a crash here, getLinksInDim needs to be looked at - try - { - for (LinkData link:dimHelper.instance.getDimData(world.provider.dimensionId).getLinksInDim()) - { - if (!mod_pocketDim.blockRift.isBlockImmune(world, link.locXCoord, link.locYCoord, link.locZCoord)) - { - dimHelper.getWorld(link.locDimID).setBlock(link.locXCoord, link.locYCoord, link.locZCoord, properties.RiftBlockID); - } - linkCount++; - if (linkCount >= 100) - { - break; - } - } - } - catch(Exception e) + for (LinkData link : dimHelper.instance.getDimData(dimensionID).getLinksInDim()) { - e.printStackTrace(); + if (!mod_pocketDim.blockRift.isBlockImmune(world, link.locXCoord, link.locYCoord, link.locZCoord)) + { + world.setBlock(link.locXCoord, link.locYCoord, link.locZCoord, properties.RiftBlockID); + } + linkCount++; + if (linkCount >= 100) + { + break; + } } } } -- 2.39.5 From 40ae8a06bdf3eb74830cab9c8f0157e467b6cab0 Mon Sep 17 00:00:00 2001 From: GreyMario Date: Sun, 18 Aug 2013 02:38:23 -0700 Subject: [PATCH 010/544] Fixed the NEI breaking bug (and an undiscovered bug involving sleeping and entering pocket dimensions) --- .../mod_pocketDim/helpers/dimHelper.java | 98 +++++++++++++------ 1 file changed, 69 insertions(+), 29 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java b/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java index 5e7bf63..7f0f8f9 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java @@ -102,28 +102,37 @@ public class dimHelper extends DimensionManager else return 1; } - private Entity teleportEntity(World oldWorld, Entity entity, LinkData link) //this beautiful teleport method is based off of xCompWiz's teleport function. - { - Entity cart=entity.ridingEntity; - if(entity.riddenByEntity!=null) + // GreyMaria: My god, what a mess. Here, let me clean it up a bit. + private Entity teleportEntity(World world, Entity entity, LinkData link) //this beautiful teleport method is based off of xCompWiz's teleport function. + { + // GreyMaria: Added to simplify some code further in. + WorldServer oldWorld = (WorldServer)world; + + // Is something riding? Handle it first. + if(entity.riddenByEntity != null) { return this.teleportEntity(oldWorld,entity.riddenByEntity, link); } - if (entity.ridingEntity != null) + // Are we riding something? Dismount and tell the mount to go first. + Entity cart = entity.ridingEntity; + if (cart != null) { entity.mountEntity(null); cart = teleportEntity(oldWorld, cart, link); + // We keep track of both so we can remount them on the other side. } WorldServer newWorld; + // Destination doesn't exist? We need to make it. if(DimensionManager.getWorld(link.destDimID)==null) { DimensionManager.initDimension(link.destDimID); } - boolean difDest = link.destDimID != link.locDimID; + // Determine if our destination's in another realm. + boolean difDest = link.destDimID != link.locDimID; if(difDest) { newWorld = DimensionManager.getWorld(link.destDimID); @@ -133,40 +142,53 @@ public class dimHelper extends DimensionManager newWorld=(WorldServer)oldWorld; } + // GreyMaria: What is this even accomplishing? We're doing the exact same thing at the end of this all. + // TODO Check to see if this is actually vital. mod_pocketDim.teleporter.placeInPortal(entity, newWorld, link); - if ((entity instanceof EntityPlayerMP)) - { - EntityPlayerMP player = (EntityPlayerMP)entity; - if (difDest) - { - GameRegistry.onPlayerChangedDimension((EntityPlayer)entity); - + // We'll need to know if we're teleporting a player entity. + // If this value is NULL, then we're not teleporting a player entity. + EntityPlayerMP player = null; + if (entity instanceof EntityPlayerMP) player = (EntityPlayerMP)entity; + + if (difDest) // Are we moving our target to a new dimension? + { + if(player != null) // Are we working with a player? + { + // We need to do all this special stuff to move a player between dimensions. + + // Set the new dimension and inform the client that it's moving to a new world. player.dimension = link.destDimID; player.playerNetServerHandler.sendPacketToPlayer(new Packet9Respawn(player.dimension, (byte)player.worldObj.difficultySetting, newWorld.getWorldInfo().getTerrainType(), newWorld.getHeight(), player.theItemInWorldManager.getGameType())); - WorldServer.class.cast(oldWorld).removeEntity(player); + // GreyMaria: Used the safe player entity remover. + // This should fix an apparently unreported bug where + // the last non-sleeping player leaves the Overworld + // for a pocket dimension, causing all sleeping players + // to remain asleep instead of progressing to day. + oldWorld.removePlayerEntityDangerously(player); player.isDead=false; - oldWorld.playerEntities.remove(player); - WorldServer.class.cast(oldWorld).getPlayerManager().removePlayer(player); + // Creates sanity by ensuring that we're only known to exist where we're supposed to be known to exist. + oldWorld.getPlayerManager().removePlayer(player); newWorld.getPlayerManager().addPlayer(player); player.theItemInWorldManager.setWorld((WorldServer)newWorld); + // Synchronize with the server so the client knows what time it is and what it's holding. player.mcServer.getConfigurationManager().updateTimeAndWeatherForPlayer(player, (WorldServer)newWorld); player.mcServer.getConfigurationManager().syncPlayerInventory(player); - for(Object potionEffect : player.getActivePotionEffects()) { PotionEffect effect = (PotionEffect)potionEffect; player.playerNetServerHandler.sendPacketToPlayer(new Packet41EntityEffect(player.entityId, effect)); } - player.playerNetServerHandler.sendPacketToPlayer(new Packet43Experience(player.experience, player.experienceTotal, player.experienceLevel)); - } - } - if(difDest) - { + + // GreyMaria: Can someone tell me why we need this? I'm commenting it out for now. We'll see if it causes problems. + //player.playerNetServerHandler.sendPacketToPlayer(new Packet43Experience(player.experience, player.experienceTotal, player.experienceLevel)); + } + + // Creates sanity by removing the entity from its old location's chunk entity list, if applicable. int entX = entity.chunkCoordX; int entZ = entity.chunkCoordZ; if ((entity.addedToChunk) && (oldWorld.getChunkProvider().chunkExists(entX, entZ))) @@ -174,8 +196,10 @@ public class dimHelper extends DimensionManager oldWorld.getChunkFromChunkCoords(entX, entZ).removeEntity(entity); oldWorld.getChunkFromChunkCoords(entX, entZ).isModified = true; } + // Memory concerns. oldWorld.releaseEntitySkin(entity); - if (!(entity instanceof EntityPlayer)) + + if (player == null) // Are we NOT working with a player? { NBTTagCompound entityNBT = new NBTTagCompound(); entity.isDead = false; @@ -183,26 +207,42 @@ public class dimHelper extends DimensionManager entity.isDead = true; entity = EntityList.createEntityFromNBT(entityNBT, newWorld); - if (entity == null) - { - + if (entity == null) + { // TODO FIXME IMPLEMENT NULL CHECKS THAT ACTUALLY DO SOMETHING. + /* + * shit ourselves in an organized fashion, preferably + * in a neat pile instead of all over our users' games + */ } + } + + // Finally, respawn the entity in its new home. newWorld.spawnEntityInWorld(entity); entity.setWorld(newWorld); } entity.worldObj.updateEntityWithOptionalForce(entity, false); - if ((entity != null) && (cart != null)) + + // Hey, remember me? It's time to remount. + if (cart != null) { - if ((entity instanceof EntityPlayerMP)) + // Was there a player teleported? If there was, it's important that we update shit. + if (player != null) { entity.worldObj.updateEntityWithOptionalForce(entity, true); } entity.mountEntity(cart); } - if(entity instanceof EntityPlayerMP) + + // Did we teleport a player? Load the chunk for them. + if(player != null) { WorldServer.class.cast(newWorld).getChunkProvider().loadChunk(MathHelper.floor_double(entity.posX) >> 4, MathHelper.floor_double(entity.posZ) >> 4); + + // Tell Forge we're moving its players so everyone else knows. + // Let's try doing this down here in case this is what's killing NEI. + GameRegistry.onPlayerChangedDimension((EntityPlayer)entity); + } mod_pocketDim.teleporter.placeInPortal(entity, newWorld, link); return entity; -- 2.39.5 From 2d6194d5999dd7c20f5b8d64ec6273b952e4f0ae Mon Sep 17 00:00:00 2001 From: GreyMario Date: Sun, 18 Aug 2013 02:42:07 -0700 Subject: [PATCH 011/544] Fixed the NEI breaking bug. Whoops. We needed that experience packet. --- StevenDimDoors/mod_pocketDim/helpers/dimHelper.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java b/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java index 7f0f8f9..5b55199 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java @@ -184,8 +184,7 @@ public class dimHelper extends DimensionManager player.playerNetServerHandler.sendPacketToPlayer(new Packet41EntityEffect(player.entityId, effect)); } - // GreyMaria: Can someone tell me why we need this? I'm commenting it out for now. We'll see if it causes problems. - //player.playerNetServerHandler.sendPacketToPlayer(new Packet43Experience(player.experience, player.experienceTotal, player.experienceLevel)); + player.playerNetServerHandler.sendPacketToPlayer(new Packet43Experience(player.experience, player.experienceTotal, player.experienceLevel)); } // Creates sanity by removing the entity from its old location's chunk entity list, if applicable. -- 2.39.5 From 40310688edd538a9457566e834e9eb607ab64dc2 Mon Sep 17 00:00:00 2001 From: GreyMario Date: Sun, 18 Aug 2013 14:11:51 -0700 Subject: [PATCH 012/544] yCoordhelper: added top-down search (may be redundant) This is used for the code that determines where to come out of Limbo in. It tries to search from the top down to find a solid block to stand on. Isn't complete, though. This code does need some considerations put in, though... I'm concerned about Natura's clouds, for instance. --- .../mod_pocketDim/helpers/yCoordHelper.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java index be3e878..dd14838 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java @@ -21,6 +21,9 @@ public class yCoordHelper } public static int getFirstUncovered(int worldID, int x, int yStart, int z) + { return getFirstUncovered(worldID, x, yStart, z, false); } + + public static int getFirstUncovered(int worldID, int x, int yStart, int z, boolean fromTop) { if (dimHelper.getWorld(worldID) == null || dimHelper.getWorld(worldID).provider == null) @@ -28,10 +31,13 @@ public class yCoordHelper dimHelper.initDimension(worldID); } - return yCoordHelper.getFirstUncovered(dimHelper.getWorld(worldID), x, yStart, z); + return yCoordHelper.getFirstUncovered(dimHelper.getWorld(worldID), x, yStart, z, fromTop); } public static int getFirstUncovered(World world, int x, int yStart, int z) + { return getFirstUncovered(world, x, yStart, z, false); } + + public static int getFirstUncovered(World world, int x, int yStart, int z, boolean fromTop) { Chunk chunk = world.getChunkProvider().loadChunk(x >> 4, z >> 4); @@ -40,10 +46,21 @@ public class yCoordHelper int height = MAXIMUM_UNCOVERED_Y; //world.getHeight(); int y; - boolean covered = true; - for (y = yStart; y < height && covered; y++) + if(!fromTop) { - covered = IsCoveredBlock(chunk, localX, y - 1, localZ) || IsCoveredBlock(chunk, localX, y, localZ); + boolean covered = true; + for (y = yStart; y < height && covered; y++) + { + covered = IsCoveredBlock(chunk, localX, y - 1, localZ) || IsCoveredBlock(chunk, localX, y, localZ); + } + } else { + boolean covered = false; + for (y = MAXIMUM_UNCOVERED_Y; y > 1 && !covered; y--) + { + covered = IsCoveredBlock(chunk, localX, y - 1, localZ); + } + if (!covered) y = 63; + y++; } return y; @@ -69,4 +86,4 @@ public class yCoordHelper material = block.blockMaterial; return (material.isLiquid() || !material.isReplaceable()); } -} \ No newline at end of file +} -- 2.39.5 From 740ba51a04859e8fa4adc4059cb06d0821f9f772 Mon Sep 17 00:00:00 2001 From: GreyMario Date: Sun, 18 Aug 2013 14:13:23 -0700 Subject: [PATCH 013/544] BlockDimWallPerm: Sped up transition from Limbo to Overworld Hijacking teleportEntity seems to make this faster. --- .../mod_pocketDim/blocks/BlockDimWallPerm.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java index 46b43ce..95289a9 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java @@ -56,6 +56,8 @@ public class BlockDimWallPerm extends Block { link =new LinkData(0,0,0,0); } + link.destDimID = 0; + link.locDimID = par1World.provider.dimensionId; if(dimHelper.getWorld(0)==null) @@ -74,22 +76,27 @@ public class BlockDimWallPerm extends Block x = x + (x >> 4); z = z + (z >> 4); - int y = yCoordHelper.getFirstUncovered(0, x, 63, z); + int y = yCoordHelper.getFirstUncovered(0, x, 63, z, true); EntityPlayer.class.cast(par5Entity).setPositionAndUpdate( x, y, z ); //this complicated chunk teleports the player back to the overworld at some random location. Looks funky becaue it has to load the chunk - - FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().transferPlayerToDimension((EntityPlayerMP) par5Entity, 0,new BlankTeleporter((WorldServer)par5Entity.worldObj)); + link.destXCoord = x; + link.destYCoord = y; + link.destZCoord = z; + dimHelper.instance.teleportEntity(par1World, par5Entity, link); + //FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().transferPlayerToDimension((EntityPlayerMP) par5Entity, 0,new BlankTeleporter((WorldServer)par5Entity.worldObj)); //dimHelper.instance.teleportToPocket(par1World, new LinkData(par1World.provider.dimensionId,0,x,y,z,link.locXCoord,link.locYCoord,link.locZCoord,link.isLocPocket,0), // EntityPlayer.class.cast(par5Entity)); EntityPlayer.class.cast(par5Entity).setPositionAndUpdate( x, y, z ); - //makes sure they can breath when they teleport + // Make absolutely sure the player doesn't spawn inside blocks, though to be honest this shouldn't ever have to be a problem... dimHelper.getWorld(0).setBlock(x, y, z, 0); + dimHelper.getWorld(0).setBlock(x, y+1, z, 0); + int i=x; - int j=y-1; + int j=y; int k=z; -- 2.39.5 From 0deb4b89174bebd6384c81e2cdc33cf700cfe672 Mon Sep 17 00:00:00 2001 From: GreyMario Date: Sun, 18 Aug 2013 14:14:36 -0700 Subject: [PATCH 014/544] dimHelper: changed teleportEntity to public This enables use in BlockDimWallPerm for escaping Limbo quickly. --- .../mod_pocketDim/helpers/dimHelper.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java b/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java index 5b55199..10a6151 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java @@ -103,17 +103,28 @@ public class dimHelper extends DimensionManager } // GreyMaria: My god, what a mess. Here, let me clean it up a bit. - private Entity teleportEntity(World world, Entity entity, LinkData link) //this beautiful teleport method is based off of xCompWiz's teleport function. - { - // GreyMaria: Added to simplify some code further in. + public Entity teleportEntity(World world, Entity entity, LinkData link) //this beautiful teleport method is based off of xCompWiz's teleport function. + { WorldServer oldWorld = (WorldServer)world; + WorldServer newWorld; + EntityPlayerMP player = (entity instanceof EntityPlayerMP) ? (EntityPlayerMP)entity : null; - // Is something riding? Handle it first. + /*// SPECIAL CASE: Is our link null? If so, we've likely come from Limbo. Ensure this is the case. + if(link == null) + { + if(world.provider.dimensionId == DDProperties.instance().LimboDimensionID) + { + link = new LinkData(0, 0, 0, 0); + // Find destination point. + } + }*/ + + + // Is something riding? Handle it first. if(entity.riddenByEntity != null) { return this.teleportEntity(oldWorld,entity.riddenByEntity, link); } - // Are we riding something? Dismount and tell the mount to go first. Entity cart = entity.ridingEntity; if (cart != null) @@ -123,8 +134,6 @@ public class dimHelper extends DimensionManager // We keep track of both so we can remount them on the other side. } - WorldServer newWorld; - // Destination doesn't exist? We need to make it. if(DimensionManager.getWorld(link.destDimID)==null) { @@ -146,12 +155,7 @@ public class dimHelper extends DimensionManager // TODO Check to see if this is actually vital. mod_pocketDim.teleporter.placeInPortal(entity, newWorld, link); - // We'll need to know if we're teleporting a player entity. - // If this value is NULL, then we're not teleporting a player entity. - EntityPlayerMP player = null; - if (entity instanceof EntityPlayerMP) player = (EntityPlayerMP)entity; - - if (difDest) // Are we moving our target to a new dimension? + if (difDest) // Are we moving our target to a new dimension? { if(player != null) // Are we working with a player? { -- 2.39.5 From acab06115abf45c7753b84dc99dbc51fab67a90d Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 20 Aug 2013 18:54:30 -0400 Subject: [PATCH 015/544] Progress on Implementing Dungeon Packs Added code for parsing dungeon pack config files. The settings for our built-in dungeons are now read from a file instead of being hardcoded. One or two settings aren't being accessed yet and we still don't search for other dungeon packs in the custom dungeon folder. That'll come in another commit. --- .../dungeon/pack/DungeonPackConfig.java | 48 +++ .../dungeon/pack/DungeonPackConfigReader.java | 386 ++++++++++++++++++ .../mod_pocketDim/helpers/DungeonHelper.java | 62 +-- schematics/ruins/rules.txt | 8 +- 4 files changed, 452 insertions(+), 52 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java index c99dd91..842c94c 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java @@ -7,6 +7,10 @@ public class DungeonPackConfig private String name; private ArrayList typeNames; private boolean allowDuplicatesInChain; + private boolean allowPackChangeIn; + private boolean allowPackChangeOut; + private boolean distortDoorCoordinates; + private int packWeight; private ArrayList rules; public DungeonPackConfig() { } @@ -17,6 +21,10 @@ public class DungeonPackConfig this.name = source.name; this.typeNames = (ArrayList) source.typeNames.clone(); this.allowDuplicatesInChain = source.allowDuplicatesInChain; + this.allowPackChangeIn = source.allowPackChangeIn; + this.allowPackChangeOut = source.allowPackChangeOut; + this.distortDoorCoordinates = source.distortDoorCoordinates; + this.packWeight = source.packWeight; this.rules = (ArrayList) source.rules.clone(); } @@ -75,4 +83,44 @@ public class DungeonPackConfig { return rules; } + + public boolean allowPackChangeIn() + { + return allowPackChangeIn; + } + + public void setAllowPackChangeIn(boolean value) + { + this.allowPackChangeIn = value; + } + + public boolean allowPackChangeOut() + { + return allowPackChangeOut; + } + + public void setAllowPackChangeOut(boolean value) + { + this.allowPackChangeOut = value; + } + + public int getPackWeight() + { + return packWeight; + } + + public void setPackWeight(int packWeight) + { + this.packWeight = packWeight; + } + + public boolean getDistortDoorCoordinates() + { + return distortDoorCoordinates; + } + + public void setDistortDoorCoordinates(boolean value) + { + this.distortDoorCoordinates = value; + } } diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java new file mode 100644 index 0000000..cf907ef --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java @@ -0,0 +1,386 @@ +package StevenDimDoors.mod_pocketDim.dungeon.pack; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +import StevenDimDoors.mod_pocketDim.util.BaseConfigurationProcessor; +import StevenDimDoors.mod_pocketDim.util.ConfigurationProcessingException; +import StevenDimDoors.mod_pocketDim.util.WeightedContainer; + +import com.google.common.base.CharMatcher; +import com.google.common.base.Splitter; +import com.google.common.primitives.Ints; + +public class DungeonPackConfigReader extends BaseConfigurationProcessor +{ + private interface ILineProcessor + { + public void process(String line, DungeonPackConfig config) throws ConfigurationProcessingException; + } + + //Note: These constants aren't static so that the memory will be released once + //we're done using it an instance. These aren't objects that we need to hold + //onto throughout the lifetime of MC, only at loading time. + + private final int CONFIG_VERSION = 1; + private final int LOOKAHEAD_LIMIT = 1024; + private final int MAX_PRODUCT_WEIGHT = 10000; + private final int DEFAULT_PRODUCT_WEIGHT = 100; + private final int MAX_DUNGEON_PACK_WEIGHT = 10000; + private final int DEFAULT_DUNGEON_PACK_WEIGHT = 100; + private final String COMMENT_MARKER = "##"; + + private final Pattern DUNGEON_TYPE_PATTERN = Pattern.compile("[A-Za-z0-9_\\-]{1,20}"); + + private final Splitter WHITESPACE_SPLITTER = Splitter.on(CharMatcher.WHITESPACE).omitEmptyStrings(); + private final String SETTING_SEPARATOR = "="; + private final String RULE_SEPARATOR = "->"; + private final String WEIGHT_SEPARATOR = "#"; + + public DungeonPackConfigReader() { } + + @Override + public DungeonPackConfig readFromStream(InputStream inputStream) throws ConfigurationProcessingException + { + BufferedReader reader = null; + try + { + DungeonPackConfig config = new DungeonPackConfig(); + reader = new BufferedReader(new InputStreamReader(inputStream)); + + //Check the config format version + int version = readVersion(reader); + if (version != CONFIG_VERSION) + { + throw new ConfigurationProcessingException("The dungeon pack config has an incompatible version."); + } + + config.setTypeNames(new ArrayList()); + config.setRules(new ArrayList()); + + //Read the dungeon types + if (findSection("Types", reader)) + { + processLines(reader, config, new DungeonTypeProcessor()); + } + + //Load default settings + config.setAllowDuplicatesInChain(true); + config.setAllowPackChangeIn(true); + config.setAllowPackChangeOut(true); + config.setDistortDoorCoordinates(false); + config.setPackWeight(DEFAULT_DUNGEON_PACK_WEIGHT); + + //Read the settings section + if (findSection("Settings", reader)) + { + processLines(reader, config, new DungeonSettingsParser()); + } + + //Read the rules section + if (findSection("Rules", reader)) + { + processLines(reader, config, new RuleDefinitionParser()); + } + + return config; + } + catch (ConfigurationProcessingException ex) + { + throw ex; + } + catch (Exception ex) + { + throw new ConfigurationProcessingException("An unexpected error occurred while trying to read the configuration file.", ex); + } + finally + { + if (reader != null) + { + try + { + reader.close(); + } + catch (IOException ex) { } + } + } + } + + private int readVersion(BufferedReader reader) throws ConfigurationProcessingException, IOException + { + String firstLine = reader.readLine(); + String[] parts = firstLine.split("\\s", 0); + Integer version = null; + + if (parts.length == 2 && parts[0].equalsIgnoreCase("version")) + { + version = Ints.tryParse(parts[1]); + } + + if (version == null) + { + throw new ConfigurationProcessingException("Could not parse the config format version."); + } + return version; + } + + private void processLines(BufferedReader reader, DungeonPackConfig config, ILineProcessor processor) throws IOException, ConfigurationProcessingException + { + String line; + + while (reader.ready()) + { + reader.mark(LOOKAHEAD_LIMIT); + line = reader.readLine(); + if (!line.startsWith(COMMENT_MARKER)) + { + line = line.trim(); + if (line.length() > 0) + { + if (line.endsWith(":")) + { + //Consider this line a section header, reset the reader to undo consuming it + reader.reset(); + break; + } + else + { + processor.process(line, config); + } + } + } + } + } + + private boolean findSection(String name, BufferedReader reader) throws IOException, ConfigurationProcessingException + { + boolean found = false; + boolean matched = false; + String line = null; + String label = name + ":"; + + //Find the next section header + //Ignore blank lines and comment lines, stop for headers, and throw an exception for anything else + while (!found && reader.ready()) + { + reader.mark(LOOKAHEAD_LIMIT); + line = reader.readLine(); + if (!line.startsWith(COMMENT_MARKER)) + { + line = line.trim(); + if (line.length() > 0) + { + if (line.endsWith(":")) + { + //Consider this line a section header + found = true; + matched = line.equalsIgnoreCase(label); + } + else + { + //This line is invalid + throw new ConfigurationProcessingException("The dungeon pack config has an incorrect line where a section was expected: " + line); + } + } + } + } + + //Check if the header matches the one we're looking for. + //If it doesn't match, undo consuming the line so it can be read later. + if (found && !matched) + { + reader.reset(); + } + return found; + } + + private class DungeonTypeProcessor implements ILineProcessor + { + public void process(String line, DungeonPackConfig config) throws ConfigurationProcessingException + { + List typeNames = config.getTypeNames(); + + //Check if the dungeon type has a name that meets our restrictions + if (DUNGEON_TYPE_PATTERN.matcher(line).matches()) + { + //Ignore duplicate dungeon types + line = line.toUpperCase(); + if (!typeNames.contains(line)) + { + typeNames.add(line); + } + } + else + { + throw new ConfigurationProcessingException("The dungeon pack config has a dungeon type with illegal characters in its name: " + line); + } + } + } + + private class DungeonSettingsParser implements ILineProcessor + { + public void process(String line, DungeonPackConfig config) throws ConfigurationProcessingException + { + //The various settings that we support will be hardcoded here. + //In the future, if we get more settings, then this should be + //refactored to use a more lookup-driven approach. + + boolean valid = true; + String[] settingParts = line.split(SETTING_SEPARATOR, 2); + if (settingParts.length == 2) + { + try + { + String name = settingParts[0]; + String value = settingParts[1]; + if (name.equalsIgnoreCase("AllowDuplicatesInChain")) + { + config.setAllowDuplicatesInChain(parseBoolean(value)); + } + else if (name.equalsIgnoreCase("AllowPackChangeOut")) + { + config.setAllowPackChangeOut(parseBoolean(value)); + } + else if (name.equalsIgnoreCase("AllowPackChangeIn")) + { + config.setAllowPackChangeIn(parseBoolean(value)); + } + else if (name.equalsIgnoreCase("DistortDoorCoordinates")) + { + config.setDistortDoorCoordinates(parseBoolean(value)); + } + else if (name.equalsIgnoreCase("PackWeight")) + { + int weight = Integer.parseInt(value); + if (weight >= 0 && weight <= MAX_DUNGEON_PACK_WEIGHT) + { + config.setPackWeight(weight); + } + else + { + valid = false; + } + } + } + catch (Exception e) + { + valid = false; + } + } + else + { + valid = false; + } + + if (!valid) + { + throw new ConfigurationProcessingException("The dungeon pack config has an invalid setting: " + line); + } + } + } + + private class RuleDefinitionParser implements ILineProcessor + { + public void process(String definition, DungeonPackConfig config) throws ConfigurationProcessingException + { + String[] ruleParts; + String[] productParts; + String ruleCondition; + String ruleProduct; + ArrayList condition; + ArrayList> products; + List typeNames = config.getTypeNames(); + + ruleParts = definition.toUpperCase().split(RULE_SEPARATOR, -1); + if (ruleParts.length != 2) + { + throw new ConfigurationProcessingException("The dungeon pack config has an invalid rule: " + definition); + } + + ruleCondition = ruleParts[0]; + ruleProduct = ruleParts[1]; + condition = new ArrayList(); + products = new ArrayList>(); + + for (String typeName : WHITESPACE_SPLITTER.split(ruleCondition)) + { + if (isKnownDungeonType(typeName, typeNames)) + { + condition.add(typeName); + } + else + { + throw new ConfigurationProcessingException("The dungeon pack config has a rule condition with an unknown dungeon type: " + typeName); + } + } + + for (String product : WHITESPACE_SPLITTER.split(ruleProduct)) + { + Integer weight; + String typeName; + + productParts = product.split(WEIGHT_SEPARATOR, -1); + if (productParts.length > 2 || productParts.length == 0) + { + throw new ConfigurationProcessingException("The dungeon pack config has a rule with an invalid product: " + product); + } + + typeName = productParts[0]; + if (isKnownDungeonType(typeName, typeNames)) + { + if (productParts.length > 1) + { + weight = Ints.tryParse(productParts[1]); + if (weight == null || (weight > MAX_PRODUCT_WEIGHT) || (weight < 0)) + { + throw new ConfigurationProcessingException("The dungeon pack config has a rule with an invalid product weight: " + product); + } + } + else + { + weight = DEFAULT_PRODUCT_WEIGHT; + } + products.add(new WeightedContainer(typeName, weight)); + } + else + { + throw new ConfigurationProcessingException("The dungeon pack config has an unknown dungeon type in a rule: " + typeName); + } + } + config.getRules().add( new DungeonChainRuleDefinition(condition, products) ); + } + } + + private static boolean isKnownDungeonType(String typeName, List typeNames) + { + return typeName.equals(DungeonType.WILDCARD_TYPE.Name) || typeNames.contains(typeName); + } + + private static boolean parseBoolean(String value) + { + if (value.equalsIgnoreCase("true")) + return true; + if (value.equalsIgnoreCase("false")) + return false; + throw new IllegalArgumentException("The boolean value must be either \"true\" or \"false\", ignoring case."); + } + + @Override + public boolean canWrite() + { + return false; + } + + @Override + public void writeToStream(OutputStream outputStream, DungeonPackConfig data) + throws ConfigurationProcessingException + { + throw new UnsupportedOperationException("DungeonPackConfigReader does not support writing."); + } +} diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index ae5e6c1..4a4b9a4 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -5,7 +5,6 @@ import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -22,12 +21,12 @@ import StevenDimDoors.mod_pocketDim.DungeonGenerator; import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; -import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonChainRuleDefinition; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; +import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfigReader; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonType; import StevenDimDoors.mod_pocketDim.items.itemDimDoor; -import StevenDimDoors.mod_pocketDim.util.WeightedContainer; +import StevenDimDoors.mod_pocketDim.util.ConfigurationProcessingException; public class DungeonHelper { @@ -112,56 +111,21 @@ public class DungeonHelper { //This is a temporarily function for testing dungeon packs. //It'll be removed later when we read dungeon configurations from files. - - ArrayList rules = new ArrayList(); - - rules.add(parseDefinitionUnsafe("? ? ? ? ? ? ? ? -> Trap#20 SimpleHall#40 ComplexHall#10 Exit#20 DeadEnd#10")); - - rules.add(parseDefinitionUnsafe("? ? ? ? -> Trap#18 SimpleHall#40 ComplexHall#10 Exit#18 DeadEnd#10 Hub#4")); - - rules.add(parseDefinitionUnsafe("? ? ? -> ComplexHall Hub Trap SimpleHall Maze")); - - rules.add(parseDefinitionUnsafe("? ? -> ComplexHall Hub Trap SimpleHall Maze")); - - rules.add(parseDefinitionUnsafe("? -> ComplexHall#40 Hub#30 Trap#10 SimpleHall#10 Maze#10")); - - rules.add(parseDefinitionUnsafe("-> ComplexHall#40 Hub#30 Trap#10 SimpleHall#10 Maze#10")); - - String[] typeNames = "Hub Trap Maze Exit DeadEnd SimpleHall ComplexHall".toUpperCase().split(" "); - - DungeonPackConfig config = new DungeonPackConfig(); - config.setName("ruins"); - config.setAllowDuplicatesInChain(false); - config.setRules(rules); - config.setTypeNames(new ArrayList(Arrays.asList(typeNames))); - return config; - } - - private static DungeonChainRuleDefinition parseDefinitionUnsafe(String definition) - { - //This is an improvised parsing function for rule definitions. Only for testing!!! - definition = definition.toUpperCase(); - String[] parts = definition.split("->"); - ArrayList condition = new ArrayList(); - ArrayList> products = new ArrayList>(); - - for (String conditionPart : parts[0].split(" ")) + + DungeonPackConfig config; + try { - if (!conditionPart.isEmpty()) - condition.add(conditionPart); + config = (new DungeonPackConfigReader()).readFromResource("/schematics/ruins/rules.txt"); + config.setName("ruins"); + return config; } - - for (String product : parts[1].split(" ")) + catch (ConfigurationProcessingException e) { - if (!product.isEmpty()) - { - String[] productParts = product.split("#"); - String productType = productParts[0]; - int weight = (productParts.length > 1) ? Integer.parseInt(productParts[1]) : 100; - products.add(new WeightedContainer(productType, weight)); - } + //FIXME TEMPORARY DEBUG PRINT, DO SOMETHING BETTER HERE + System.err.println("OH GOD SOMETHING WENT WRONG WITH THE DEFAULT DUNGEON PACK CONFIG"); + e.printStackTrace(); + return null; } - return new DungeonChainRuleDefinition(condition, products); } public List getRegisteredDungeons() diff --git a/schematics/ruins/rules.txt b/schematics/ruins/rules.txt index 086036a..ef838c1 100644 --- a/schematics/ruins/rules.txt +++ b/schematics/ruins/rules.txt @@ -9,10 +9,12 @@ DeadEnd Maze Settings: -AllowRepetitionsInBranch = false +AllowDuplicatesInChain = false AllowPackChangeOut = true -AllowPackChangeIn = true -PackWeight = 100 +DistortDoorCoordinates = true + +## Prevent this pack from being selected for transitioning in once we've transitioned out +AllowPackChangeIn = false Rules: -- 2.39.5 From 4d1503db3fff45028ae060e1d2ce7f17a1aadaaa Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 20 Aug 2013 18:55:26 -0400 Subject: [PATCH 016/544] Minor Change Minor change - fixing spacing that was messed up by Eclipse. --- .../dungeon/pack/DungeonPackConfigReader.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java index cf907ef..8aac967 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java @@ -378,9 +378,8 @@ public class DungeonPackConfigReader extends BaseConfigurationProcessor Date: Tue, 20 Aug 2013 21:43:33 -0400 Subject: [PATCH 017/544] changes to RiftRender --- .../mod_pocketDim/TileEntityRift.java | 290 ++++++++++-------- .../mod_pocketDim/blocks/BlockRift.java | 10 +- .../mod_pocketDim/helpers/DungeonHelper.java | 2 +- .../ticking/LimboGatewayGenerator.java | 26 ++ .../mod_pocketDimClient/ClientProxy.java | 2 + .../mod_pocketDimClient/RenderDimDoor.java | 71 +++-- .../mod_pocketDimClient/RenderRift.java | 224 ++++++++++++++ 7 files changed, 453 insertions(+), 172 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/ticking/LimboGatewayGenerator.java diff --git a/StevenDimDoors/mod_pocketDim/TileEntityRift.java b/StevenDimDoors/mod_pocketDim/TileEntityRift.java index 0c594b5..a66ac03 100644 --- a/StevenDimDoors/mod_pocketDim/TileEntityRift.java +++ b/StevenDimDoors/mod_pocketDim/TileEntityRift.java @@ -3,6 +3,7 @@ package StevenDimDoors.mod_pocketDim; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Random; @@ -31,9 +32,13 @@ public class TileEntityRift extends TileEntity public boolean isNearRift=false; private int count=200; private int count2 = 0; - private int soundCount = 0; + + public HashMap renderingCenters = new HashMap(); public LinkData nearestRiftData; - Random rand = new Random(); + Random rand = new Random(); + + + public float age = 0; @@ -41,38 +46,28 @@ public class TileEntityRift extends TileEntity { return true; } - - public void updateEntity() + public void clearBlocksOnRift() { - - if(count>200&&dimHelper.instance.getDimData(this.worldObj.provider.dimensionId)!=null) + for(double[] coord: this.renderingCenters.values()) { - /** - if(rand.nextBoolean()) - { - } - **/ + int x = MathHelper.floor_double(coord[0]+.5); + int y = MathHelper.floor_double(coord[1]+.5); + int z = MathHelper.floor_double(coord[2]+.5); + this.worldObj.setBlockToAir(this.xCoord+x, this.yCoord+y, this.zCoord+z); + + this.worldObj.setBlockToAir(this.xCoord-x, this.yCoord+y, this.zCoord-z); + + } + } + public void spawnEndermen() + { + if(count>200&&dimHelper.instance.getDimData(this.worldObj.provider.dimensionId)!=null) + { + + nearestRiftData = dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).findNearestRift(worldObj, 5, xCoord, yCoord, zCoord); if(nearestRiftData!=null) { - this.xOffset=this.xCoord-nearestRiftData.locXCoord; - this.yOffset=this.yCoord-nearestRiftData.locYCoord; - this.zOffset=this.zCoord-nearestRiftData.locZCoord; - this.distance=(int) (MathHelper.abs(xOffset)+MathHelper.abs(yOffset)+MathHelper.abs(zOffset)); - this.isNearRift=true; - - if(!this.worldObj.isRemote&&distance>1) - { - try - { - grow(distance); - } - catch(Exception e) - { - - } - - } if(rand.nextInt(30)==0&&!this.worldObj.isRemote) { @@ -82,29 +77,11 @@ public class TileEntityRift extends TileEntity { - EntityEnderman creeper = new EntityEnderman(worldObj); - creeper.setLocationAndAngles(this.xCoord+.5, this.yCoord-1, this.zCoord+.5, 5, 6); - worldObj.spawnEntityInWorld(creeper); - } - - /** - if(dimHelper.instance.getDimData(this.worldObj.provider.dimensionId)!=null) - { - ArrayList rifts = dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).findRiftsInRange(worldObj, 6, this.xCoord, this.yCoord, this.zCoord); - if(rifts.size()>15) - { - MobObelisk creeper = new MobObelisk(worldObj); - creeper.setLocationAndAngles(this.xCoord+.5, yCoordHelper.getFirstUncovered(this.worldObj, this.xCoord, this.yCoord, this.zCoord), this.zCoord+.5, 5, 6); - worldObj.spawnEntityInWorld(creeper); - } - - } - **/ + EntityEnderman enderman = new EntityEnderman(worldObj); + enderman.setLocationAndAngles(this.xCoord+.5, this.yCoord-1, this.zCoord+.5, 5, 6); + worldObj.spawnEntityInWorld(enderman); + } } - - - - } else { @@ -112,87 +89,124 @@ public class TileEntityRift extends TileEntity } count=0; } - else if(dimHelper.instance.getLinkDataFromCoords(xCoord, yCoord, zCoord, this.worldObj.provider.dimensionId)==null) - { - this.invalidate(); - this.worldObj.setBlockToAir(xCoord, yCoord, zCoord); - } + } + public void closeRift() + { + if(count2>20&&count2<22) + { + nearestRiftData = dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).findNearestRift(worldObj, 10, xCoord, yCoord, zCoord); + if(this.nearestRiftData!=null) + { + TileEntityRift rift = (TileEntityRift) this.worldObj.getBlockTileEntity(nearestRiftData.locXCoord, nearestRiftData.locYCoord, nearestRiftData.locZCoord); + if(rift!=null) + { + rift.shouldClose=true; + } + } + } + if(count2>40) + { + this.invalidate(); + this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord,0); + if(dimHelper.instance.getLinkDataFromCoords(this.xCoord, this.yCoord, this.zCoord, this.worldObj.provider.dimensionId)!=null) + { + dimHelper.instance.removeLink(this.worldObj.provider.dimensionId, this.xCoord, this.yCoord, this.zCoord); + this.worldObj.playSound(xCoord, yCoord, zCoord, "mods.DimDoors.sfx.riftClose", (float) .7, 1,true); + + } + + } + count2++; + } + public void updateEntity() + { + + if(rand.nextInt(10)==0) + { + age = age + 1; + this.calculateNextRenderQuad(age, rand); + + } + this.clearBlocksOnRift(); + this.spawnEndermen(); + + count++; if(this.shouldClose) { - // System.out.println(count2); - if(count2>20&&count2<22) - { - nearestRiftData = dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).findNearestRift(worldObj, 10, xCoord, yCoord, zCoord); - if(this.nearestRiftData!=null) - { - TileEntityRift rift = (TileEntityRift) this.worldObj.getBlockTileEntity(nearestRiftData.locXCoord, nearestRiftData.locYCoord, nearestRiftData.locZCoord); - if(rift!=null) - { - rift.shouldClose=true; - } - } - } - if(count2>40) - { - this.invalidate(); - this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord,0); - if(dimHelper.instance.getLinkDataFromCoords(this.xCoord, this.yCoord, this.zCoord, this.worldObj.provider.dimensionId)!=null) - { - dimHelper.instance.removeLink(this.worldObj.provider.dimensionId, this.xCoord, this.yCoord, this.zCoord); - this.worldObj.playSound(xCoord, yCoord, zCoord, "mods.DimDoors.sfx.riftClose", (float) .7, 1,true); - - } - - } - count2++; + closeRift(); } - + if(dimHelper.instance.getLinkDataFromCoords(xCoord, yCoord, zCoord, this.worldObj.provider.dimensionId)==null) + { + this.invalidate(); + this.worldObj.setBlockToAir(xCoord, yCoord, zCoord); + } } public void grow(int distance) { - int count=0; - if(rand.nextInt(distance*2)==0) - { - - int x=0,y=0,z=0; - while(count<100) - { - count++; - x=this.xCoord+(1-(rand.nextInt(2)*2)*rand.nextInt(6)); - y=this.yCoord+(1-(rand.nextInt(2)*2)*rand.nextInt(4)); - z=this.zCoord+(1-(rand.nextInt(2)*2)*rand.nextInt(6)); - if(this.worldObj.isAirBlock(x, y, z)) - { - break; - } - - } - - - if (count<100) - { - - LinkData link = dimHelper.instance.getLinkDataFromCoords(this.xCoord, this.yCoord, this.zCoord, worldObj); - if(link!=null) - { - if(!this.hasGrownRifts&&rand.nextInt(3)==0) - { - // System.out.println(link.numberofChildren); - link.numberofChildren++; - dimHelper.instance.createLink(this.worldObj.provider.dimensionId, link.destDimID, x, y, z, link.destXCoord, link.destYCoord, link.destZCoord).numberofChildren=link.numberofChildren+1; - this.hasGrownRifts=true; - - } - } - } - - } + } + public void calculateNextRenderQuad(float age, Random rand) + { + int iteration = MathHelper.floor_double((Math.log(Math.pow(age+1,1.5)))); + double fl =Math.log(iteration+1)/(iteration); + double[] coords= new double[4]; + double noise = ((rand.nextGaussian())/(10)*(iteration+1)); + + if(!this.renderingCenters.containsKey(iteration-1)) + { + if(rand.nextBoolean()) + { + coords[0] = fl*1.5; + coords[1] = rand.nextGaussian()/10; + coords[2] = 0; + coords[3] = 1; + } + else + { + coords[0] = 0; + coords[1] = rand.nextGaussian()/10; + coords[2] = fl*1.5; + coords[3] = 0; + + } + this.renderingCenters.put(iteration-1,coords); + + + } + else if(!this.renderingCenters.containsKey(iteration)) + { + if(this.renderingCenters.get(iteration-1)[3]==0) + { + coords[0]=noise/2+this.renderingCenters.get(iteration-1)[0]; + coords[1]=noise+this.renderingCenters.get(iteration-1)[1]; + coords[2]= this.renderingCenters.get(iteration-1)[2]+fl; + coords[3] = 0; + + } + else + { + coords[0]=this.renderingCenters.get(iteration-1)[0]+fl; + coords[1]=noise+this.renderingCenters.get(iteration-1)[1]; + coords[2]=noise/2+this.renderingCenters.get(iteration-1)[2]; + coords[3] = 1; + + } + + + this.renderingCenters.put(iteration,coords); + + } + } + @Override + public boolean shouldRenderInPass(int pass) + { + return pass == 1; + } @Override public void readFromNBT(NBTTagCompound nbt) { @@ -200,15 +214,22 @@ public class TileEntityRift extends TileEntity int i = nbt.getInteger(("Size")); try - { - this.xOffset = nbt.getInteger("xOffset"); - this.yOffset = nbt.getInteger("yOffset"); - this.zOffset = nbt.getInteger("zOffset"); - this.hasGrownRifts =nbt.getBoolean("grownRifts"); + { this.count=nbt.getInteger("count"); this.count2=nbt.getInteger("count2"); this.shouldClose=nbt.getBoolean("shouldClose"); - + this.age=nbt.getFloat("age"); + for(int key=0; key<=nbt.getInteger("hashMapSize");key++) + { + double[] coords = new double[4]; + + coords[0]= nbt.getDouble(key+"+0"); + coords[1]= nbt.getDouble(key+"+1"); + coords[2]= nbt.getDouble(key+"+2"); + coords[3]= nbt.getDouble(key+"+3"); + + this.renderingCenters.put(key, coords); + } @@ -216,7 +237,7 @@ public class TileEntityRift extends TileEntity } catch (Exception e) { - + e.printStackTrace(); } } @@ -225,12 +246,19 @@ public class TileEntityRift extends TileEntity { int i = 0; super.writeToNBT(nbt); - nbt.setInteger("xOffset", this.xOffset); - nbt.setInteger("yOffset", this.yOffset); - nbt.setInteger("zOffset", this.zOffset); - nbt.setBoolean("grownRifts",this.hasGrownRifts); + + for(Integer key:this.renderingCenters.keySet()) + { + nbt.setDouble(key+"+0", this.renderingCenters.get(key)[0]); + nbt.setDouble(key+"+1", this.renderingCenters.get(key)[1]); + nbt.setDouble(key+"+2", this.renderingCenters.get(key)[2]); + nbt.setDouble(key+"+3", this.renderingCenters.get(key)[3]); + } + nbt.setInteger("hashMapSize", this.renderingCenters.size()); nbt.setInteger("count", this.count); nbt.setInteger("count2", this.count2); + nbt.setFloat("age", this.age); + nbt.setBoolean("shouldClose", this.shouldClose); } diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java b/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java index 7b10a63..850acec 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java @@ -37,13 +37,12 @@ public class BlockRift extends BlockContainer private static final int BLOCK_DESTRUCTION_CHANCE = 50; private final DDProperties properties; - private final ArrayList blocksImmuneToRift; + private static ArrayList blocksImmuneToRift; public BlockRift(int i, int j, Material par2Material, DDProperties properties) { super(i, par2Material); this.setTickRandomly(true); - this.setLightOpacity(14); this.properties = properties; this.blocksImmuneToRift = new ArrayList(); this.blocksImmuneToRift.add(properties.FabricBlockID); @@ -223,11 +222,14 @@ public class BlockRift extends BlockContainer } } + /** * regulates the render effect, especially when multiple rifts start to link up. Has 3 main parts- Grows toward and away from nearest rft, bends toward it, and a randomization function */ + /** @Override @SideOnly(Side.CLIENT) + public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random rand) { @@ -334,8 +336,8 @@ public class BlockRift extends BlockContainer } } } - - public boolean isBlockImmune(World world, int x, int y, int z) + **/ + public static boolean isBlockImmune(World world, int x, int y, int z) { Block block = Block.blocksList[world.getBlockId(x, y, z)]; if (block != null) diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index a99d503..25b4156 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -309,7 +309,7 @@ public class DungeonHelper InputStream listStream = this.getClass().getResourceAsStream(BUNDLED_DUNGEONS_LIST_PATH); if (listStream == null) { - System.err.println("Unable to open list of bundled dungeon schematics."); + System.err.println("Unable to open list of bundled dungeon schematics."); return; } diff --git a/StevenDimDoors/mod_pocketDim/ticking/LimboGatewayGenerator.java b/StevenDimDoors/mod_pocketDim/ticking/LimboGatewayGenerator.java new file mode 100644 index 0000000..34536d4 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/ticking/LimboGatewayGenerator.java @@ -0,0 +1,26 @@ +package StevenDimDoors.mod_pocketDim.ticking; + +import java.util.ArrayList; +import java.util.Random; + +import net.minecraft.entity.Entity; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.GameRules; +import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.DimData; +import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; +import StevenDimDoors.mod_pocketDim.util.ChunkLocation; + +public class LimboGatewayGenerator implements IRegularTickReceiver +{ + + @Override + public void notifyTick() + { + + + } + +} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDimClient/ClientProxy.java b/StevenDimDoors/mod_pocketDimClient/ClientProxy.java index e169140..5c3bc4f 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClientProxy.java +++ b/StevenDimDoors/mod_pocketDimClient/ClientProxy.java @@ -10,6 +10,7 @@ import net.minecraftforge.client.MinecraftForgeClient; import StevenDimDoors.mod_pocketDim.CommonProxy; import StevenDimDoors.mod_pocketDim.Spells; import StevenDimDoors.mod_pocketDim.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.TileEntityRift; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler; import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; @@ -24,6 +25,7 @@ public class ClientProxy extends CommonProxy //MinecraftForgeClient.preloadTexture(BLOCK_PNG); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDimDoor.class, new RenderDimDoor()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRift.class, new RenderRift()); //MinecraftForgeClient.preloadTexture(RIFT2_PNG); diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index cdc012e..240f417 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -164,8 +164,7 @@ public class RenderDimDoor extends TileEntitySpecialRenderer GL11.glRotatef((float)(count * count * 4321 + count * 9) * 2.0F, 0.0F, 0.0F, 1.0F); GL11.glTranslatef(0.5F, 0.5F, 0.5F); - Tessellator var24 = Tessellator.instance; - var24.startDrawingQuads(); + GL11.glBegin(GL11.GL_QUADS); @@ -180,7 +179,7 @@ public class RenderDimDoor extends TileEntitySpecialRenderer var22 = 1.0F; yConverted = 1.0F; } - var24.setColorRGBA_F(var21 * var17, var22 * var17, var23 * var17, 1.0F); + GL11.glColor4d(var21 * var17, var22 * var17, var23 * var17, 1.0F); if(tile.openOrClosed) { @@ -188,60 +187,60 @@ public class RenderDimDoor extends TileEntitySpecialRenderer { case 0: - var24.addVertex(x+.01F, y-1 , z); - var24.addVertex(x+.01, y-1, z+1.0D); - var24.addVertex(x+.01 , y+1 , z + 1.0D); - var24.addVertex(x+.01 , y+1 , z); + GL11.glVertex3d(x+.01F, y-1 , z); + GL11.glVertex3d(x+.01, y-1, z+1.0D); + GL11.glVertex3d(x+.01 , y+1 , z + 1.0D); + GL11.glVertex3d(x+.01 , y+1 , z); break; case 1: - var24.addVertex(x , y+1 , z+.01); - var24.addVertex(x+1 , y+1 , z+.01); - var24.addVertex(x+1, y-1, z+.01); - var24.addVertex(x, y-1, z+.01); + GL11.glVertex3d(x , y+1 , z+.01); + GL11.glVertex3d(x+1 , y+1 , z+.01); + GL11.glVertex3d(x+1, y-1, z+.01); + GL11.glVertex3d(x, y-1, z+.01); break; case 2: // - var24.addVertex(x+.99 , y+1 , z); - var24.addVertex(x+.99 , y+1 , z + 1.0D); - var24.addVertex(x+.99, y-1, z+1.0D); - var24.addVertex(x+.99, y-1, z); + GL11.glVertex3d(x+.99 , y+1 , z); + GL11.glVertex3d(x+.99 , y+1 , z + 1.0D); + GL11.glVertex3d(x+.99, y-1, z+1.0D); + GL11.glVertex3d(x+.99, y-1, z); break; case 3: - var24.addVertex(x, y-1, z+.99); - var24.addVertex(x+1, y-1, z+.99); - var24.addVertex(x+1 , y+1 , z+.99); - var24.addVertex(x , y+1 , z+.99); + GL11.glVertex3d(x, y-1, z+.99); + GL11.glVertex3d(x+1, y-1, z+.99); + GL11.glVertex3d(x+1 , y+1 , z+.99); + GL11.glVertex3d(x , y+1 , z+.99); break; case 4:// // GL11.glTranslatef(); - var24.addVertex(x+.15F, y-1 , z); - var24.addVertex(x+.15, y-1, z+1.0D); - var24.addVertex(x+.15 , y+1 , z + 1.0D); - var24.addVertex(x+.15 , y+1 , z); + GL11.glVertex3d(x+.15F, y-1 , z); + GL11.glVertex3d(x+.15, y-1, z+1.0D); + GL11.glVertex3d(x+.15 , y+1 , z + 1.0D); + GL11.glVertex3d(x+.15 , y+1 , z); break; case 5: - var24.addVertex(x , y+1 , z+.15); - var24.addVertex(x+1 , y+1 , z+.15); - var24.addVertex(x+1, y-1, z+.15); - var24.addVertex(x, y-1, z+.15); + GL11.glVertex3d(x , y+1 , z+.15); + GL11.glVertex3d(x+1 , y+1 , z+.15); + GL11.glVertex3d(x+1, y-1, z+.15); + GL11.glVertex3d(x, y-1, z+.15); break; case 6: // - var24.addVertex(x+.85 , y+1 , z); - var24.addVertex(x+.85 , y+1 , z + 1.0D); - var24.addVertex(x+.85, y-1, z+1.0D); - var24.addVertex(x+.85, y-1, z); + GL11.glVertex3d(x+.85 , y+1 , z); + GL11.glVertex3d(x+.85 , y+1 , z + 1.0D); + GL11.glVertex3d(x+.85, y-1, z+1.0D); + GL11.glVertex3d(x+.85, y-1, z); break; case 7: - var24.addVertex(x, y-1, z+.85); - var24.addVertex(x+1, y-1, z+.85); - var24.addVertex(x+1 , y+1 , z+.85); - var24.addVertex(x , y+1 , z+.85); + GL11.glVertex3d(x, y-1, z+.85); + GL11.glVertex3d(x+1, y-1, z+.85); + GL11.glVertex3d(x+1 , y+1 , z+.85); + GL11.glVertex3d(x , y+1 , z+.85); break; default: break; @@ -253,7 +252,7 @@ public class RenderDimDoor extends TileEntitySpecialRenderer - var24.draw(); + GL11.glEnd(); GL11.glPopMatrix(); GL11.glMatrixMode(GL11.GL_MODELVIEW); diff --git a/StevenDimDoors/mod_pocketDimClient/RenderRift.java b/StevenDimDoors/mod_pocketDimClient/RenderRift.java index e69de29..d3bc985 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderRift.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderRift.java @@ -0,0 +1,224 @@ +package StevenDimDoors.mod_pocketDimClient; + +import java.nio.FloatBuffer; +import java.util.HashMap; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; + +import org.lwjgl.opengl.GL11; +import static org.lwjgl.opengl.GL11.*; + +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.TileEntityRift; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.dimDoor; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class RenderRift extends TileEntitySpecialRenderer +{ + + @Override + public void renderTileEntityAt(TileEntity te, double xWorld, double yWorld, + double zWorld, float f) + { + yWorld = yWorld+.75; + GL11.glPushMatrix(); + + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glDisable(GL_TEXTURE_2D); + GL11.glDisable(GL_LIGHTING); + + //GL11.glLogicOp(GL11.GL_INVERT); + // GL11.glEnable(GL11.GL_COLOR_LOGIC_OP); + + GL11.glColor4f(.3F, .3F, .3F, .2F); + + GL11.glEnable(GL_BLEND); + glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); + + /** + * just draws the verticies + */ + //testDraw(TileEntityRift.class.cast(te).renderingCenters, xWorld, yWorld, zWorld); + this.drawCrack(TileEntityRift.class.cast(te).renderingCenters, xWorld, yWorld, zWorld); + this.drawCrackRotated(TileEntityRift.class.cast(te).renderingCenters, xWorld, yWorld, zWorld); + + + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL_TEXTURE_2D); + + GL11.glDisable(GL11.GL_COLOR_LOGIC_OP); + GL11.glPopMatrix(); + + } + + public void drawCrack(HashMap quads,double xWorld,double yWorld,double zWorld) + { + GL11.glBegin(GL11.GL_QUAD_STRIP); + + drawVertex(xWorld+.5, yWorld-Math.log(quads.size()+1)/8, zWorld+.5); + drawVertex(xWorld+.5, yWorld+Math.log(quads.size()+1)/8, zWorld+.5); + for(int i = 0;;i++) + { + if(!quads.containsKey(i)) + { + break; + } + double[] coords = quads.get(i); + double width=Math.log(quads.size()-i+1)/8; + if(coords[3]==0) + { + + if(quads.containsKey(i+1)) + { + + drawVertex(xWorld+coords[0]+.5, yWorld+coords[1]-width/2 , zWorld+coords[2]); + drawVertex(xWorld+coords[0]+.5 , yWorld+coords[1]+width/2 , zWorld+coords[2]); + + + + } + else + { + drawVertex(xWorld+coords[0]+.5, yWorld+coords[1]-width/200 , zWorld+coords[2]); + drawVertex(xWorld+coords[0]+.5 , yWorld+coords[1]+width/200 , zWorld+coords[2]); + } + } + else + { + + + + if(quads.containsKey(i+1)) + { + drawVertex(xWorld+coords[0], yWorld+coords[1]-width/2 , zWorld+coords[2]+.5); + drawVertex(xWorld+coords[0], yWorld+coords[1]+width/2 , zWorld+coords[2]+.5); + + + } + else + { + drawVertex(xWorld+coords[0], yWorld+coords[1]+width/200 , zWorld+coords[2]+.5); + drawVertex(xWorld+coords[0], yWorld+coords[1]-width/200, zWorld+coords[2]+.5); + } + + + } + + } + + + GL11.glEnd(); + + + } + + public void drawCrackRotated(HashMap quads,double xWorld,double yWorld,double zWorld) + { + GL11.glBegin(GL11.GL_QUAD_STRIP); + + drawVertex(xWorld+.5, yWorld+Math.log(quads.size()+1)/8, zWorld+.5); + drawVertex(xWorld+.5, yWorld-Math.log(quads.size()+1)/8, zWorld+.5); + for(int i = 0;;i++) + { + if(!quads.containsKey(i)) + { + break; + } + double[] coords = quads.get(i); + double width=Math.log(quads.size()-i+1)/8; + if(coords[3]==0) + { + + + if(quads.containsKey(i+1)) + { + drawVertex(xWorld+coords[0]+.5, yWorld-(coords[1]-width/2) , zWorld-coords[2]+1); + drawVertex(xWorld+coords[0]+.5 , yWorld-(coords[1]+width/2) , zWorld-coords[2]+1); + + } + else + { + + drawVertex(xWorld+coords[0]+.5, yWorld-(coords[1]-width/200) , zWorld-coords[2]+1); + drawVertex(xWorld+coords[0]+.5 , yWorld-(coords[1]+width/200) , zWorld-coords[2]+1); + } + + } + else + { + + + if(quads.containsKey(i+1)) + { + + drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]-width/2) , zWorld+coords[2]+.5); + drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]+width/2) , zWorld+coords[2]+.5); + + } + else + { + drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]+width/200) , zWorld+coords[2]+.5); + drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]-width/200), zWorld+coords[2]+.5); + } + + } + } + + GL11.glEnd(); + } + + public void testDraw(HashMap quads,double xWorld,double yWorld,double zWorld) + { + GL11.glBegin(GL11.GL_QUADS); + for(int i = 0;;i++) + { + + if(!quads.containsKey(i)) + { + break; + } + double[] coords = quads.get(i); + drawVertex(xWorld-coords[0], yWorld , zWorld+.1); + drawVertex(xWorld-coords[0], yWorld+.1 , zWorld+.1); + drawVertex(xWorld-coords[0], yWorld +.1, zWorld); + drawVertex(xWorld-coords[0], yWorld , zWorld); + + + } + GL11.glEnd(); + + } + public void drawVertex(double x, double y, double z) + { + GL11.glVertex3f((float)x,(float)y,(float)z); + } + public double[] rotateCoords(int rotation, double[] coords) + { + double[] rotatedCoords = new double[4]; + if(rotation == 180) + { + + + rotatedCoords[0]=-coords[0]; + rotatedCoords[1]=-coords[1]; + + rotatedCoords[2]=-coords[2]; + rotatedCoords[3]=-coords[3]; + //return rotatedCoords; + } + return coords; + + } +} \ No newline at end of file -- 2.39.5 From 2e833b55c394a4d2e5eea71614c68c3e41903f5b Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Wed, 21 Aug 2013 01:10:28 -0400 Subject: [PATCH 018/544] rift rendering work Getting closer- still need to sync client and server --- .../mod_pocketDim/TileEntityRift.java | 35 ++++++++++++------- .../mod_pocketDimClient/RenderRift.java | 14 ++++---- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/TileEntityRift.java b/StevenDimDoors/mod_pocketDim/TileEntityRift.java index a66ac03..16c2e09 100644 --- a/StevenDimDoors/mod_pocketDim/TileEntityRift.java +++ b/StevenDimDoors/mod_pocketDim/TileEntityRift.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.List; import java.util.Random; +import StevenDimDoors.mod_pocketDim.blocks.BlockRift; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; @@ -53,9 +54,16 @@ public class TileEntityRift extends TileEntity int x = MathHelper.floor_double(coord[0]+.5); int y = MathHelper.floor_double(coord[1]+.5); int z = MathHelper.floor_double(coord[2]+.5); - this.worldObj.setBlockToAir(this.xCoord+x, this.yCoord+y, this.zCoord+z); + + if(!BlockRift.isBlockImmune(worldObj,this.xCoord+x, this.yCoord+y, this.zCoord+z)) + { + this.worldObj.setBlockToAir(this.xCoord+x, this.yCoord+y, this.zCoord+z); + } - this.worldObj.setBlockToAir(this.xCoord-x, this.yCoord+y, this.zCoord-z); + if(!BlockRift.isBlockImmune(worldObj,this.xCoord-x, this.yCoord-y, this.zCoord-z)) + { + this.worldObj.setBlockToAir(this.xCoord-x, this.yCoord-y, this.zCoord-z); + } } } @@ -77,9 +85,9 @@ public class TileEntityRift extends TileEntity { - EntityEnderman enderman = new EntityEnderman(worldObj); - enderman.setLocationAndAngles(this.xCoord+.5, this.yCoord-1, this.zCoord+.5, 5, 6); - worldObj.spawnEntityInWorld(enderman); + EntityEnderman creeper = new EntityEnderman(worldObj); + creeper.setLocationAndAngles(this.xCoord+.5, this.yCoord-1, this.zCoord+.5, 5, 6); + worldObj.spawnEntityInWorld(creeper); } } } @@ -153,21 +161,21 @@ public class TileEntityRift extends TileEntity int iteration = MathHelper.floor_double((Math.log(Math.pow(age+1,1.5)))); double fl =Math.log(iteration+1)/(iteration); double[] coords= new double[4]; - double noise = ((rand.nextGaussian())/(10)*(iteration+1)); + double noise = ((rand.nextGaussian())/(2+iteration/3+1)); if(!this.renderingCenters.containsKey(iteration-1)) { if(rand.nextBoolean()) { coords[0] = fl*1.5; - coords[1] = rand.nextGaussian()/10; + coords[1] = rand.nextGaussian()/5; coords[2] = 0; coords[3] = 1; } else { coords[0] = 0; - coords[1] = rand.nextGaussian()/10; + coords[1] = rand.nextGaussian()/5; coords[2] = fl*1.5; coords[3] = 0; @@ -181,7 +189,7 @@ public class TileEntityRift extends TileEntity if(this.renderingCenters.get(iteration-1)[3]==0) { coords[0]=noise/2+this.renderingCenters.get(iteration-1)[0]; - coords[1]=noise+this.renderingCenters.get(iteration-1)[1]; + coords[1]=noise/2+this.renderingCenters.get(iteration-1)[1]; coords[2]= this.renderingCenters.get(iteration-1)[2]+fl; coords[3] = 0; @@ -189,7 +197,7 @@ public class TileEntityRift extends TileEntity else { coords[0]=this.renderingCenters.get(iteration-1)[0]+fl; - coords[1]=noise+this.renderingCenters.get(iteration-1)[1]; + coords[1]=noise/2+this.renderingCenters.get(iteration-1)[1]; coords[2]=noise/2+this.renderingCenters.get(iteration-1)[2]; coords[3] = 1; @@ -210,7 +218,7 @@ public class TileEntityRift extends TileEntity @Override public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); + int i = nbt.getInteger(("Size")); try @@ -239,13 +247,14 @@ public class TileEntityRift extends TileEntity { e.printStackTrace(); } + super.readFromNBT(nbt); } @Override public void writeToNBT(NBTTagCompound nbt) { int i = 0; - super.writeToNBT(nbt); + for(Integer key:this.renderingCenters.keySet()) { @@ -260,6 +269,6 @@ public class TileEntityRift extends TileEntity nbt.setFloat("age", this.age); nbt.setBoolean("shouldClose", this.shouldClose); - + super.writeToNBT(nbt); } } diff --git a/StevenDimDoors/mod_pocketDimClient/RenderRift.java b/StevenDimDoors/mod_pocketDimClient/RenderRift.java index d3bc985..39ed2f9 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderRift.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderRift.java @@ -41,7 +41,7 @@ public class RenderRift extends TileEntitySpecialRenderer //GL11.glLogicOp(GL11.GL_INVERT); // GL11.glEnable(GL11.GL_COLOR_LOGIC_OP); - GL11.glColor4f(.3F, .3F, .3F, .2F); + GL11.glColor4f(.15F, .15F, .15F, 1F); GL11.glEnable(GL_BLEND); glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); @@ -67,8 +67,8 @@ public class RenderRift extends TileEntitySpecialRenderer { GL11.glBegin(GL11.GL_QUAD_STRIP); - drawVertex(xWorld+.5, yWorld-Math.log(quads.size()+1)/8, zWorld+.5); - drawVertex(xWorld+.5, yWorld+Math.log(quads.size()+1)/8, zWorld+.5); + drawVertex(xWorld+.5, yWorld-Math.log(Math.pow(quads.size(),2)+1)/14, zWorld+.5); + drawVertex(xWorld+.5, yWorld+Math.log(Math.pow(quads.size(),2)+1)/14, zWorld+.5); for(int i = 0;;i++) { if(!quads.containsKey(i)) @@ -76,7 +76,7 @@ public class RenderRift extends TileEntitySpecialRenderer break; } double[] coords = quads.get(i); - double width=Math.log(quads.size()-i+1)/8; + double width=Math.log(Math.pow(quads.size(),2-i/2)+1)/14; if(coords[3]==0) { @@ -128,8 +128,8 @@ public class RenderRift extends TileEntitySpecialRenderer { GL11.glBegin(GL11.GL_QUAD_STRIP); - drawVertex(xWorld+.5, yWorld+Math.log(quads.size()+1)/8, zWorld+.5); - drawVertex(xWorld+.5, yWorld-Math.log(quads.size()+1)/8, zWorld+.5); + drawVertex(xWorld+.5, yWorld+Math.log(Math.pow(quads.size(),2)+1)/14, zWorld+.5); + drawVertex(xWorld+.5, yWorld-Math.log(Math.pow(quads.size(),2)+1)/14, zWorld+.5); for(int i = 0;;i++) { if(!quads.containsKey(i)) @@ -137,7 +137,7 @@ public class RenderRift extends TileEntitySpecialRenderer break; } double[] coords = quads.get(i); - double width=Math.log(quads.size()-i+1)/8; + double width=Math.log(Math.pow(quads.size(),2-i/2)+1)/14; if(coords[3]==0) { -- 2.39.5 From 0e67596ca03acd302905ff9aefab4ba7e6b50415 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 21 Aug 2013 14:26:10 -0400 Subject: [PATCH 019/544] Progress on Implementing Dungeon Packs 1. Integrated support for dungeon pack config options into the code (i.e. we actually DO what the settings specify) 2. Added random transitions from one dungeon type to another. Dungeons might also begin with a non-default pack. 3. Fixed a config reading bug that caused settings to be ignored and some invalid settings wouldn't trigger exceptions. Also fixed other dungeon pack bugs. --- .../mod_pocketDim/SchematicLoader.java | 39 ++++- .../commands/CommandExportDungeon.java | 5 +- .../dungeon/DungeonSchematic.java | 27 +++- .../dungeon/pack/DungeonChainRule.java | 25 +++- .../pack/DungeonChainRuleDefinition.java | 19 +++ .../dungeon/pack/DungeonPack.java | 9 +- .../dungeon/pack/DungeonPackConfig.java | 8 +- .../dungeon/pack/DungeonPackConfigReader.java | 31 +++- .../mod_pocketDim/helpers/DungeonHelper.java | 141 ++++++++++++++++-- 9 files changed, 263 insertions(+), 41 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/SchematicLoader.java b/StevenDimDoors/mod_pocketDim/SchematicLoader.java index f5006f4..7f4101c 100644 --- a/StevenDimDoors/mod_pocketDim/SchematicLoader.java +++ b/StevenDimDoors/mod_pocketDim/SchematicLoader.java @@ -6,6 +6,8 @@ import java.util.Random; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; +import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; +import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.schematic.InvalidSchematicException; @@ -16,8 +18,6 @@ public class SchematicLoader public static boolean generateDungeonPocket(LinkData link, DDProperties properties) { - //TODO: Phase this function out in the next update. ~SenseiKiwi - if (link == null || properties == null) { return false; @@ -46,7 +46,7 @@ public class SchematicLoader final long localSeed = world.getSeed() ^ 0x2F50DB9B4A8057E4L ^ computeDestinationHash(link); final Random random = new Random(localSeed); - dungeonHelper.generateDungeonLink(link, dungeonHelper.RuinsPack, random); + dungeonHelper.generateDungeonLink(link, getDimDungeonPack(originDimID), random); } schematicPath = dimList.get(destDimID).dungeonGenerator.schematicPath; @@ -98,8 +98,11 @@ public class SchematicLoader { dimHelper helperInstance = dimHelper.instance; helperInstance.moveLinkDataDestination(link, link.destXCoord, fixedY, link.destZCoord, link.destDimID, true); - } - dungeon.copyToWorld(world, new Point3D(link.destXCoord, link.destYCoord, link.destZCoord), link.linkOrientation, originDimID, destDimID); + } + DungeonPackConfig packConfig = getDimDungeonPack(destDimID).getConfig(); + + dungeon.copyToWorld(world, new Point3D(link.destXCoord, link.destYCoord, link.destZCoord), + link.linkOrientation, originDimID, destDimID, packConfig.doDistortDoorCoordinates()); return true; } catch (Exception e) @@ -109,6 +112,30 @@ public class SchematicLoader } } + private static DungeonPack getDimDungeonPack(int dimensionID) + { + //FIXME: This function is a workaround to our current dungeon data limitations. Modify later. + //The upcoming save format change and code overhaul will make this obsolete. + + DungeonPack pack; + DungeonGenerator generator = dimHelper.dimList.get(dimensionID).dungeonGenerator; + if (generator != null) + { + pack = generator.getDungeonType().Owner; + + //Make sure the pack isn't null. This can happen for dungeons with the special UNKNOWN type. + if (pack == null) + { + pack = DungeonHelper.instance().RuinsPack; + } + } + else + { + pack = DungeonHelper.instance().RuinsPack; + } + return pack; + } + private static int adjustDestinationY(World world, int y, DungeonSchematic dungeon) { //The goal here is to guarantee that the dungeon fits within the vertical bounds @@ -141,7 +168,7 @@ public class SchematicLoader private static DungeonSchematic checkSourceAndLoad(String schematicPath) throws FileNotFoundException, InvalidSchematicException { - //TODO: Change this code once we introduce an isInternal flag in dungeon data + //FIXME: Change this code once we introduce an isInternal flag in dungeon data DungeonSchematic dungeon; if ((new File(schematicPath)).exists()) { diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java b/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java index 194d5ce..f2ee7da 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java @@ -105,7 +105,7 @@ public class CommandExportDungeon extends DDCommandBase try { int weight = Integer.parseInt(command[3]); - if (weight >= 0 && weight <= DungeonHelper.MAX_DUNGEON_WEIGHT) + if (weight >= DungeonHelper.MIN_DUNGEON_WEIGHT && weight <= DungeonHelper.MAX_DUNGEON_WEIGHT) { return exportDungeon(sender, join(command, "_", 0, 4)); } @@ -114,7 +114,8 @@ public class CommandExportDungeon extends DDCommandBase } //If we've reached this point, then we must have an invalid weight. - return new DDCommandResult("Invalid dungeon weight. Please specify a weight between 0 and " + DungeonHelper.MAX_DUNGEON_WEIGHT + ", inclusive."); + return new DDCommandResult("Invalid dungeon weight. Please specify a weight between " + + DungeonHelper.MIN_DUNGEON_WEIGHT + " and " + DungeonHelper.MAX_DUNGEON_WEIGHT + ", inclusive."); } return DDCommandResult.SUCCESS; diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 8792eae..cae2fb4 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -167,7 +167,7 @@ public class DungeonSchematic extends Schematic { return new DungeonSchematic(Schematic.copyFromWorld(world, x, y, z, width, height, length, doCompactBounds)); } - public void copyToWorld(World world, Point3D pocketCenter, int dungeonOrientation, int originDimID, int destDimID) + public void copyToWorld(World world, Point3D pocketCenter, int dungeonOrientation, int originDimID, int destDimID, boolean doDistortCoordinates) { //TODO: This function is an improvised solution so we can get the release moving. In the future, //we should generalize block tranformations and implement support for them at the level of Schematic, @@ -222,17 +222,17 @@ public class DungeonSchematic extends Schematic { world.setBlockTileEntity(pocketPoint.getX(), pocketPoint.getY(), pocketPoint.getZ(), TileEntity.createAndLoadEntity(tileTag)); } - setUpDungeon(world, pocketCenter, turnAngle, originDimID, destDimID); + setUpDungeon(world, pocketCenter, turnAngle, originDimID, destDimID, doDistortCoordinates); } - private void setUpDungeon(World world, Point3D pocketCenter, int turnAngle, int originDimID, int destDimID) + private void setUpDungeon(World world, Point3D pocketCenter, int turnAngle, int originDimID, int destDimID, boolean doDistortCoordinates) { //The following Random initialization code is based on code from ChunkProviderGenerate. //It makes our generation depend on the world seed. Random random = new Random(world.getSeed()); long factorA = random.nextLong() / 2L * 2L + 1L; long factorB = random.nextLong() / 2L * 2L + 1L; - random.setSeed((pocketCenter.getX() >> 4) * factorA + (pocketCenter.getZ() >> 4) * factorB ^ world.getSeed()); + random.setSeed(pocketCenter.getX() * factorB + pocketCenter.getZ() * factorA ^ world.getSeed()); //Transform dungeon corners Point3D minCorner = new Point3D(0, 0, 0); @@ -249,7 +249,7 @@ public class DungeonSchematic extends Schematic { //Set up link data for dimensional doors for (Point3D location : dimensionalDoorLocations) { - setUpDimensionalDoorLink(world, location, entranceDoorLocation, turnAngle, pocketCenter, originDimID, destDimID, random); + setUpDimensionalDoorLink(world, location, entranceDoorLocation, turnAngle, pocketCenter, originDimID, destDimID, doDistortCoordinates, random); } //Set up link data for exit door @@ -374,11 +374,22 @@ public class DungeonSchematic extends Schematic { } } - private static void setUpDimensionalDoorLink(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter, int originDimID, int destDimID, Random random) + private static void setUpDimensionalDoorLink(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter, int originDimID, int destDimID, boolean applyNoise, Random random) { int depth = dimHelper.instance.getDimDepth(originDimID) + 1; - int forwardNoise = MathHelper.getRandomIntegerInRange(random, -50 * depth, 150 * depth); - int sidewaysNoise = MathHelper.getRandomIntegerInRange(random, -10 * depth, 10 * depth); + int forwardNoise; + int sidewaysNoise; + + if (applyNoise) + { + forwardNoise = MathHelper.getRandomIntegerInRange(random, -50 * depth, 150 * depth); + sidewaysNoise = MathHelper.getRandomIntegerInRange(random, -10 * depth, 10 * depth); + } + else + { + forwardNoise = 0; + sidewaysNoise = 0; + } //Transform doorLocation to the pocket coordinate system Point3D location = point.clone(); diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java index 17554dc..eacfa9c 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRule.java @@ -11,9 +11,32 @@ public class DungeonChainRule private final ArrayList> products; public DungeonChainRule(DungeonChainRuleDefinition source, HashMap nameToTypeMapping) - { + { ArrayList conditionNames = source.getCondition(); ArrayList> productNames = source.getProducts(); + + //Validate the data, just in case + if (conditionNames == null) + { + throw new NullPointerException("source cannot have null conditions"); + } + if (productNames == null) + { + throw new NullPointerException("source cannot have null products"); + } + if (productNames.isEmpty()) + { + throw new IllegalArgumentException("products cannot be an empty list"); + } + for (WeightedContainer product : productNames) + { + //Check for weights less than 1. Those could cause Minecraft's random selection algorithm to throw an exception. + //At the very least, they're useless values. + if (product.itemWeight < 1) + { + throw new IllegalArgumentException("products cannot contain items with weights less than 1"); + } + } //Obtain the IDs of dungeon types in reverse order. Reverse order makes comparing against chain histories easy. condition = new int[conditionNames.size()]; diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRuleDefinition.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRuleDefinition.java index f06cded..17011e6 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRuleDefinition.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonChainRuleDefinition.java @@ -11,6 +11,25 @@ public class DungeonChainRuleDefinition public DungeonChainRuleDefinition(ArrayList conditions, ArrayList> products) { + //Validate the arguments, just in case + if (conditions == null) + { + throw new NullPointerException("conditions cannot be null"); + } + if (products.isEmpty()) + { + throw new IllegalArgumentException("products cannot be an empty list"); + } + for (WeightedContainer product : products) + { + //Check for weights less than 1. Those could cause Minecraft's random selection algorithm to throw an exception. + //At the very least, they're useless values. + if (product.itemWeight < 1) + { + throw new IllegalArgumentException("products cannot contain items with weights less than 1"); + } + } + this.conditions = conditions; this.products = products; } diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java index 40bc2c7..f9439f2 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java @@ -21,6 +21,8 @@ public class DungeonPack //The ID numbers would be a problem since it couldn't have a valid number, since it wasn't initialized by the pack instance. //FIXME: Do not release this code as an update without dealing with disowned types! + private static final int MAX_HISTORY_LENGTH = 1337; + private final String name; private final HashMap nameToTypeMapping; private final ArrayList> groupedDungeons; @@ -78,6 +80,11 @@ public class DungeonPack return name; } + public DungeonPackConfig getConfig() + { + return config.clone(); + } + public boolean isEmpty() { return allDungeons.isEmpty(); @@ -128,7 +135,7 @@ public class DungeonPack //of the longest rule we have. Getting any more data would be useless. This optimization could be significant //for dungeon packs that can extend arbitrarily deep. We should probably set a reasonable limit anyway. - int maxSearchLength = config.allowDuplicatesInChain() ? maxRuleLength : 1337; + int maxSearchLength = config.allowDuplicatesInChain() ? maxRuleLength : MAX_HISTORY_LENGTH; ArrayList history = DungeonHelper.getDungeonChainHistory( dimHelper.instance.getDimData(inbound.locDimID), this, maxSearchLength); return getNextDungeon(history, random); diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java index 842c94c..0074545 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfig.java @@ -18,14 +18,14 @@ public class DungeonPackConfig @SuppressWarnings("unchecked") private DungeonPackConfig(DungeonPackConfig source) { - this.name = source.name; - this.typeNames = (ArrayList) source.typeNames.clone(); + this.name = (source.name != null) ? source.name : null; + this.typeNames = (source.typeNames != null) ? (ArrayList) source.typeNames.clone() : null; this.allowDuplicatesInChain = source.allowDuplicatesInChain; this.allowPackChangeIn = source.allowPackChangeIn; this.allowPackChangeOut = source.allowPackChangeOut; this.distortDoorCoordinates = source.distortDoorCoordinates; this.packWeight = source.packWeight; - this.rules = (ArrayList) source.rules.clone(); + this.rules = (source.rules != null) ? (ArrayList) source.rules.clone() : null; } public void validate() @@ -114,7 +114,7 @@ public class DungeonPackConfig this.packWeight = packWeight; } - public boolean getDistortDoorCoordinates() + public boolean doDistortDoorCoordinates() { return distortDoorCoordinates; } diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java index 8aac967..a4aae61 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPackConfigReader.java @@ -31,9 +31,13 @@ public class DungeonPackConfigReader extends BaseConfigurationProcessor= 0 && weight <= MAX_DUNGEON_PACK_WEIGHT) + if (weight >= MIN_DUNGEON_PACK_WEIGHT && weight <= MAX_DUNGEON_PACK_WEIGHT) { config.setPackWeight(weight); } @@ -267,6 +271,10 @@ public class DungeonPackConfigReader extends BaseConfigurationProcessor MAX_CONDITION_LENGTH) + { + throw new ConfigurationProcessingException("The dungeon pack config has a rule condition that is too long: " + definition); + } } for (String product : WHITESPACE_SPLITTER.split(ruleProduct)) @@ -337,7 +350,7 @@ public class DungeonPackConfigReader extends BaseConfigurationProcessor 1) { weight = Ints.tryParse(productParts[1]); - if (weight == null || (weight > MAX_PRODUCT_WEIGHT) || (weight < 0)) + if (weight == null || (weight > MAX_PRODUCT_WEIGHT) || (weight < MIN_PRODUCT_WEIGHT)) { throw new ConfigurationProcessingException("The dungeon pack config has a rule with an invalid product weight: " + product); } @@ -352,7 +365,17 @@ public class DungeonPackConfigReader extends BaseConfigurationProcessor MAX_PRODUCT_COUNT) + { + throw new ConfigurationProcessingException("The dungeon pack config has a rule with too many products: " + definition); + } } + if (products.isEmpty()) + { + throw new ConfigurationProcessingException("The dungeon pack config has a rule with no products: " + definition); + } + config.getRules().add( new DungeonChainRuleDefinition(condition, products) ); } } diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 4a4b9a4..81e06e4 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -2,11 +2,13 @@ package StevenDimDoors.mod_pocketDim.helpers; import java.io.BufferedReader; import java.io.File; +import java.io.FileNotFoundException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -14,6 +16,7 @@ import java.util.Queue; import java.util.Random; import java.util.regex.Pattern; +import net.minecraft.util.WeightedRandom; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.DimData; @@ -27,6 +30,7 @@ import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfigReader; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonType; import StevenDimDoors.mod_pocketDim.items.itemDimDoor; import StevenDimDoors.mod_pocketDim.util.ConfigurationProcessingException; +import StevenDimDoors.mod_pocketDim.util.WeightedContainer; public class DungeonHelper { @@ -42,8 +46,18 @@ public class DungeonHelper private static final String BUNDLED_DUNGEONS_LIST_PATH = "/schematics/schematics.txt"; private static final String DUNGEON_CREATION_GUIDE_SOURCE_PATH = "/mods/DimDoors/text/How_to_add_dungeons.txt"; + private static final String RUINS_PACK_PATH = "/schematics/ruins/rules.txt"; + public static final String SCHEMATIC_FILE_EXTENSION = ".schematic"; + + + private static final int MIN_PACK_SWITCH_CHANCE = 0; + private static final int PACK_SWITCH_CHANCE_PER_LEVEL = 1; + private static final int MAX_PACK_SWITCH_CHANCE = 500; + private static final int START_PACK_SWITCH_CHANCE = MAX_PACK_SWITCH_CHANCE / 9; + private static final int DEFAULT_DUNGEON_WEIGHT = 100; + public static final int MIN_DUNGEON_WEIGHT = 1; //Prevents MC's random selection algorithm from throwing an exception public static final int MAX_DUNGEON_WEIGHT = 10000; //Used to prevent overflows and math breaking down private static final int MAX_EXPORT_RADIUS = 50; public static final short MAX_DUNGEON_WIDTH = 2 * MAX_EXPORT_RADIUS + 1; @@ -54,6 +68,8 @@ public class DungeonHelper private ArrayList registeredDungeons = new ArrayList(); public DungeonPack RuinsPack; + private HashMap dungeonPackMapping = new HashMap(); + private ArrayList dungeonPackList = new ArrayList(); private DungeonGenerator defaultUp; private DungeonGenerator defaultDown; @@ -101,31 +117,45 @@ public class DungeonHelper copyfile.copyFile(DUNGEON_CREATION_GUIDE_SOURCE_PATH, file.getAbsolutePath() + "/How_to_add_dungeons.txt"); } - RuinsPack = new DungeonPack(createRuinsConfig()); + //TODO: Write up a dungeon pack loading function that loads the whole pack and infers its name from the path + DungeonPackConfigReader reader = new DungeonPackConfigReader(); + RuinsPack = new DungeonPack(loadDungeonPackConfig(reader, RUINS_PACK_PATH, "ruins", true)); + dungeonPackMapping.put("ruins", RuinsPack); + dungeonPackList.add(RuinsPack); registerBundledDungeons(); registerCustomDungeons(properties.CustomSchematicDirectory); } - private static DungeonPackConfig createRuinsConfig() + private static DungeonPackConfig loadDungeonPackConfig(DungeonPackConfigReader reader, String configPath, String name, boolean isInternal) { - //This is a temporarily function for testing dungeon packs. - //It'll be removed later when we read dungeon configurations from files. - - DungeonPackConfig config; try { - config = (new DungeonPackConfigReader()).readFromResource("/schematics/ruins/rules.txt"); - config.setName("ruins"); + DungeonPackConfig config; + if (isInternal) + { + config = reader.readFromResource(configPath); + } + else + { + config = reader.readFromFile(configPath); + } + config.setName(name); return config; } catch (ConfigurationProcessingException e) { - //FIXME TEMPORARY DEBUG PRINT, DO SOMETHING BETTER HERE - System.err.println("OH GOD SOMETHING WENT WRONG WITH THE DEFAULT DUNGEON PACK CONFIG"); - e.printStackTrace(); - return null; + System.err.println(e.getMessage()); + if (e.getCause() != null) + { + System.err.println(e.getCause()); + } } + catch (FileNotFoundException e) + { + System.err.println("Could not find a dungeon pack config file: " + configPath); + } + return null; } public List getRegisteredDungeons() @@ -202,7 +232,7 @@ public class DungeonHelper try { int weight = Integer.parseInt(dungeonData[3]); - if (weight < 0 || weight > MAX_DUNGEON_WEIGHT) + if (weight < MIN_DUNGEON_WEIGHT || weight > MAX_DUNGEON_WEIGHT) return false; } catch (NumberFormatException e) @@ -336,10 +366,36 @@ public class DungeonHelper public void generateDungeonLink(LinkData inbound, DungeonPack pack, Random random) { DungeonGenerator selection; + DungeonPackConfig config; + DungeonPack selectedPack; try - { - selection = pack.getNextDungeon(inbound, random); + { + config = pack.getConfig(); + selectedPack = pack; + + //Do we want to switch to another dungeon pack? + if (config.allowPackChangeOut()) + { + //Calculate the chance of switching to a different pack type + int packSwitchChance; + if (dimHelper.dimList.get(inbound.locDimID).depth == 0) + { + packSwitchChance = START_PACK_SWITCH_CHANCE; + } + else + { + packSwitchChance = MIN_PACK_SWITCH_CHANCE + (getPackDepth(inbound, pack) - 1) * PACK_SWITCH_CHANCE_PER_LEVEL; + } + + //Decide randomly whether to switch packs or not + if (random.nextInt(MAX_PACK_SWITCH_CHANCE) < packSwitchChance) + { + //Find another pack + selectedPack = getRandomDungeonPack(pack, random); + } + } + selection = selectedPack.getNextDungeon(inbound, random); } catch (Exception e) { @@ -358,6 +414,29 @@ public class DungeonHelper dimHelper.instance.getDimData(inbound.destDimID).dungeonGenerator = selection; } + @SuppressWarnings("unchecked") + private DungeonPack getRandomDungeonPack(DungeonPack current, Random random) + { + DungeonPack selection = current; + ArrayList> packs = new ArrayList>(dungeonPackList.size()); + + //Load up a list of weighted items with any usable dungeon packs that is not the current pack + for (DungeonPack pack : dungeonPackList) + { + DungeonPackConfig config = pack.getConfig(); + if (pack != current && config.allowPackChangeIn() && !pack.isEmpty()) + { + packs.add(new WeightedContainer(pack, config.getPackWeight())); + } + } + if (!packs.isEmpty()) + { + //Pick a random dungeon pack + selection = ((WeightedContainer) WeightedRandom.getRandomItem(random, packs)).getData(); + } + return selection; + } + public Collection getDungeonNames() { //Use a HashSet to guarantee that all dungeon names will be distinct. @@ -426,6 +505,38 @@ public class DungeonHelper return history; } + private static int getPackDepth(LinkData inbound, DungeonPack pack) + { + //TODO: I've improved this code for the time being. However, searching across links is a flawed approach. A player could + //manipulate the output of this function by setting up links to mislead our algorithm or by removing links. + //Dimensions MUST have built-in records of their parent dimensions in the future. ~SenseiKiwi + //Dimensions should also just keep track of pack depth internally. + + int packDepth = 1; + DimData tailDim = dimHelper.dimList.get(inbound.destDimID); + boolean found; + + do + { + found = false; + for (LinkData link : tailDim.getLinksInDim()) + { + DimData neighbor = dimHelper.instance.getDimData(link.destDimID); + if (neighbor.depth == tailDim.depth - 1 && neighbor.dungeonGenerator != null && + neighbor.dungeonGenerator.getDungeonType().Owner == pack) + { + tailDim = neighbor; + found = true; + packDepth++; + break; + } + } + } + while (found); + + return packDepth; + } + public static ArrayList getFlatDungeonTree(DimData dimData, int maxSize) { //TODO: I've improved this code for the time being. However, searching across links is a flawed approach. A player could -- 2.39.5 From f1bfac3e161e42c18508fec4575fd2c92074d399 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 21 Aug 2013 14:49:41 -0400 Subject: [PATCH 020/544] Minor Change Moved the getDimDungeonPack() function from SchematicLoader to DungeonHelper so that DungeonHelper.RuinsPack could be a private variable. --- .../mod_pocketDim/SchematicLoader.java | 29 ++----------------- .../mod_pocketDim/helpers/DungeonHelper.java | 27 +++++++++++++++-- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/SchematicLoader.java b/StevenDimDoors/mod_pocketDim/SchematicLoader.java index 7f4101c..3fce739 100644 --- a/StevenDimDoors/mod_pocketDim/SchematicLoader.java +++ b/StevenDimDoors/mod_pocketDim/SchematicLoader.java @@ -6,7 +6,6 @@ import java.util.Random; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; -import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; @@ -46,7 +45,7 @@ public class SchematicLoader final long localSeed = world.getSeed() ^ 0x2F50DB9B4A8057E4L ^ computeDestinationHash(link); final Random random = new Random(localSeed); - dungeonHelper.generateDungeonLink(link, getDimDungeonPack(originDimID), random); + dungeonHelper.generateDungeonLink(link, dungeonHelper.getDimDungeonPack(originDimID), random); } schematicPath = dimList.get(destDimID).dungeonGenerator.schematicPath; @@ -99,7 +98,7 @@ public class SchematicLoader dimHelper helperInstance = dimHelper.instance; helperInstance.moveLinkDataDestination(link, link.destXCoord, fixedY, link.destZCoord, link.destDimID, true); } - DungeonPackConfig packConfig = getDimDungeonPack(destDimID).getConfig(); + DungeonPackConfig packConfig = dungeonHelper.getDimDungeonPack(destDimID).getConfig(); dungeon.copyToWorld(world, new Point3D(link.destXCoord, link.destYCoord, link.destZCoord), link.linkOrientation, originDimID, destDimID, packConfig.doDistortDoorCoordinates()); @@ -111,30 +110,6 @@ public class SchematicLoader return false; } } - - private static DungeonPack getDimDungeonPack(int dimensionID) - { - //FIXME: This function is a workaround to our current dungeon data limitations. Modify later. - //The upcoming save format change and code overhaul will make this obsolete. - - DungeonPack pack; - DungeonGenerator generator = dimHelper.dimList.get(dimensionID).dungeonGenerator; - if (generator != null) - { - pack = generator.getDungeonType().Owner; - - //Make sure the pack isn't null. This can happen for dungeons with the special UNKNOWN type. - if (pack == null) - { - pack = DungeonHelper.instance().RuinsPack; - } - } - else - { - pack = DungeonHelper.instance().RuinsPack; - } - return pack; - } private static int adjustDestinationY(World world, int y, DungeonSchematic dungeon) { diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 81e06e4..0f4f9f6 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -50,7 +50,6 @@ public class DungeonHelper public static final String SCHEMATIC_FILE_EXTENSION = ".schematic"; - private static final int MIN_PACK_SWITCH_CHANCE = 0; private static final int PACK_SWITCH_CHANCE_PER_LEVEL = 1; private static final int MAX_PACK_SWITCH_CHANCE = 500; @@ -67,7 +66,7 @@ public class DungeonHelper private ArrayList untaggedDungeons = new ArrayList(); private ArrayList registeredDungeons = new ArrayList(); - public DungeonPack RuinsPack; + private DungeonPack RuinsPack; private HashMap dungeonPackMapping = new HashMap(); private ArrayList dungeonPackList = new ArrayList(); @@ -183,6 +182,30 @@ public class DungeonHelper return defaultDown; } + public DungeonPack getDimDungeonPack(int dimensionID) + { + //FIXME: This function is a workaround to our current dungeon data limitations. Modify later. + //The upcoming save format change and code overhaul will make this obsolete. + + DungeonPack pack; + DungeonGenerator generator = dimHelper.dimList.get(dimensionID).dungeonGenerator; + if (generator != null) + { + pack = generator.getDungeonType().Owner; + + //Make sure the pack isn't null. This can happen for dungeons with the special UNKNOWN type. + if (pack == null) + { + pack = RuinsPack; + } + } + else + { + pack = RuinsPack; + } + return pack; + } + public LinkData createCustomDungeonDoor(World world, int x, int y, int z) { //Create a link above the specified position. Link to a new pocket dimension. -- 2.39.5 From c7ddff97b25934a3a7c1205b752c1dd37b29a674 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Wed, 21 Aug 2013 22:13:59 -0400 Subject: [PATCH 021/544] Rift rendering work Not sure if I want to keep working at this or not --- .../mod_pocketDim/TileEntityRift.java | 101 ++++++++++-------- .../mod_pocketDim/blocks/BlockRift.java | 2 +- .../mod_pocketDimClient/RenderRift.java | 6 +- 3 files changed, 60 insertions(+), 49 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/TileEntityRift.java b/StevenDimDoors/mod_pocketDim/TileEntityRift.java index 16c2e09..ddf5229 100644 --- a/StevenDimDoors/mod_pocketDim/TileEntityRift.java +++ b/StevenDimDoors/mod_pocketDim/TileEntityRift.java @@ -12,10 +12,15 @@ import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; +import net.minecraft.entity.DataWatcher; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.INetworkManager; +import net.minecraft.network.packet.Packet; +import net.minecraft.network.packet.Packet130UpdateSign; +import net.minecraft.network.packet.Packet132TileEntityData; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; @@ -36,10 +41,11 @@ public class TileEntityRift extends TileEntity public HashMap renderingCenters = new HashMap(); public LinkData nearestRiftData; - Random rand = new Random(); + Random rand; + DataWatcher watcher = new DataWatcher(); - public float age = 0; + public int age = 0; @@ -128,11 +134,18 @@ public class TileEntityRift extends TileEntity } public void updateEntity() { - - if(rand.nextInt(10)==0) + if(rand == null) { + rand = new Random(); + rand.setSeed(this.xCoord+this.yCoord+this.zCoord); + + } + if(rand.nextInt(15) == 1) + { + age = age + 1; this.calculateNextRenderQuad(age, rand); + } this.clearBlocksOnRift(); @@ -158,7 +171,13 @@ public class TileEntityRift extends TileEntity } public void calculateNextRenderQuad(float age, Random rand) { - int iteration = MathHelper.floor_double((Math.log(Math.pow(age+1,1.5)))); + int maxSize = MathHelper.floor_double((Math.log(Math.pow(age+1,2)))); + int iteration=0; + while(iteration< maxSize) + { + iteration++; + + double fl =Math.log(iteration+1)/(iteration); double[] coords= new double[4]; double noise = ((rand.nextGaussian())/(2+iteration/3+1)); @@ -181,7 +200,7 @@ public class TileEntityRift extends TileEntity } this.renderingCenters.put(iteration-1,coords); - + iteration--; } else if(!this.renderingCenters.containsKey(iteration)) @@ -205,8 +224,10 @@ public class TileEntityRift extends TileEntity this.renderingCenters.put(iteration,coords); - + + } } + } @@ -218,57 +239,47 @@ public class TileEntityRift extends TileEntity @Override public void readFromNBT(NBTTagCompound nbt) { - - int i = nbt.getInteger(("Size")); - - try - { + super.readFromNBT(nbt); + this.renderingCenters= new HashMap(); this.count=nbt.getInteger("count"); this.count2=nbt.getInteger("count2"); + this.age=nbt.getInteger("age"); this.shouldClose=nbt.getBoolean("shouldClose"); - this.age=nbt.getFloat("age"); - for(int key=0; key<=nbt.getInteger("hashMapSize");key++) - { - double[] coords = new double[4]; - - coords[0]= nbt.getDouble(key+"+0"); - coords[1]= nbt.getDouble(key+"+1"); - coords[2]= nbt.getDouble(key+"+2"); - coords[3]= nbt.getDouble(key+"+3"); - this.renderingCenters.put(key, coords); - } - - - - - } - catch (Exception e) - { - e.printStackTrace(); - } - super.readFromNBT(nbt); + } @Override public void writeToNBT(NBTTagCompound nbt) { - int i = 0; - - - for(Integer key:this.renderingCenters.keySet()) - { - nbt.setDouble(key+"+0", this.renderingCenters.get(key)[0]); - nbt.setDouble(key+"+1", this.renderingCenters.get(key)[1]); - nbt.setDouble(key+"+2", this.renderingCenters.get(key)[2]); - nbt.setDouble(key+"+3", this.renderingCenters.get(key)[3]); - } + super.writeToNBT(nbt); + nbt.setInteger("hashMapSize", this.renderingCenters.size()); + nbt.setInteger("age", this.age); nbt.setInteger("count", this.count); nbt.setInteger("count2", this.count2); - nbt.setFloat("age", this.age); nbt.setBoolean("shouldClose", this.shouldClose); - super.writeToNBT(nbt); + } + + @Override + public Packet getDescriptionPacket() { + Packet132TileEntityData packet = new Packet132TileEntityData(); + packet.actionType = 0; + packet.xPosition = xCoord; + packet.yPosition = yCoord; + packet.zPosition = zCoord; + + NBTTagCompound nbt = new NBTTagCompound(); + writeToNBT(nbt); + packet.customParam1 = nbt; + return packet; + } + + @Override + public void onDataPacket(INetworkManager net, Packet132TileEntityData pkt) { + readFromNBT(pkt.customParam1); + } + } diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java b/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java index 850acec..12dc289 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java @@ -161,7 +161,7 @@ public class BlockRift extends BlockContainer if (random.nextInt(MAX_BLOCK_SEARCH_CHANCE) < BLOCK_SEARCH_CHANCE && ((TileEntityRift) world.getBlockTileEntity(x, y, z)).isNearRift ) { - destroyNearbyBlocks(world, x, y, z, random); + // destroyNearbyBlocks(world, x, y, z, random); } } } diff --git a/StevenDimDoors/mod_pocketDimClient/RenderRift.java b/StevenDimDoors/mod_pocketDimClient/RenderRift.java index 39ed2f9..3d55fe1 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderRift.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderRift.java @@ -41,7 +41,7 @@ public class RenderRift extends TileEntitySpecialRenderer //GL11.glLogicOp(GL11.GL_INVERT); // GL11.glEnable(GL11.GL_COLOR_LOGIC_OP); - GL11.glColor4f(.15F, .15F, .15F, 1F); + GL11.glColor4f(.3F, .3F, .3F, 1F); GL11.glEnable(GL_BLEND); glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); @@ -76,7 +76,7 @@ public class RenderRift extends TileEntitySpecialRenderer break; } double[] coords = quads.get(i); - double width=Math.log(Math.pow(quads.size(),2-i/2)+1)/14; + double width=Math.log(Math.pow(quads.size(),2-Math.log(i+1))+1)/14; if(coords[3]==0) { @@ -137,7 +137,7 @@ public class RenderRift extends TileEntitySpecialRenderer break; } double[] coords = quads.get(i); - double width=Math.log(Math.pow(quads.size(),2-i/2)+1)/14; + double width=Math.log(Math.pow(quads.size(),2-Math.log(i+1))+1)/14; if(coords[3]==0) { -- 2.39.5 From 939ed771a8e90087ae9557c0ebc59ad3016b9626 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 22 Aug 2013 02:25:26 -0400 Subject: [PATCH 022/544] Completed Dungeon Pack Implementation Added code so that the mod loads dungeon packs stored in the custom dungeons folder. Changed the code for loading bundled dungeons so that they're loaded as dungeon packs. This means dungeon packs are now fully integrated into the mod. The changes were tested and seem to be working perfectly. --- .../mod_pocketDim/DungeonGenerator.java | 12 +- .../mod_pocketDim/SchematicLoader.java | 3 +- .../commands/CommandExportDungeon.java | 4 +- .../mod_pocketDim/helpers/DungeonHelper.java | 209 +++++++++++++++--- schematics/{schematics.txt => ruins.txt} | 0 5 files changed, 184 insertions(+), 44 deletions(-) rename schematics/{schematics.txt => ruins.txt} (100%) diff --git a/StevenDimDoors/mod_pocketDim/DungeonGenerator.java b/StevenDimDoors/mod_pocketDim/DungeonGenerator.java index 6c6ea16..0500e76 100644 --- a/StevenDimDoors/mod_pocketDim/DungeonGenerator.java +++ b/StevenDimDoors/mod_pocketDim/DungeonGenerator.java @@ -4,13 +4,11 @@ import java.io.File; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; -import java.util.Random; +import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonType; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; -import net.minecraft.world.World; - public class DungeonGenerator implements Serializable { //This static field is hax so that I don't have to add an instance field to DungeonGenerator to support DungeonType. @@ -48,7 +46,13 @@ public class DungeonGenerator implements Serializable { File file = new File(schematicPath); String typeName = file.getName().split("_")[0]; - type = DungeonHelper.instance().RuinsPack.getType(typeName); + String packName = file.getParentFile().getName(); + DungeonPack pack = DungeonHelper.instance().getDungeonPack(packName); + if (pack == null) + { + pack = DungeonHelper.instance().getDungeonPack("ruins"); + } + type = pack.getType(typeName); } catch (Exception e) { } if (type == null) diff --git a/StevenDimDoors/mod_pocketDim/SchematicLoader.java b/StevenDimDoors/mod_pocketDim/SchematicLoader.java index 3fce739..630b21f 100644 --- a/StevenDimDoors/mod_pocketDim/SchematicLoader.java +++ b/StevenDimDoors/mod_pocketDim/SchematicLoader.java @@ -47,8 +47,7 @@ public class SchematicLoader dungeonHelper.generateDungeonLink(link, dungeonHelper.getDimDungeonPack(originDimID), random); } - schematicPath = dimList.get(destDimID).dungeonGenerator.schematicPath; - + schematicPath = dimList.get(destDimID).dungeonGenerator.schematicPath; } else { diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java b/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java index f2ee7da..8968d11 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java @@ -81,7 +81,7 @@ public class CommandExportDungeon extends DDCommandBase //TODO: This validation should be in DungeonHelper or in another class. We should move it //during the save file format rewrite. ~SenseiKiwi - if (!dungeonHelper.validateDungeonType(command[0])) + if (!dungeonHelper.validateDungeonType(command[0], dungeonHelper.getDungeonPack("ruins"))) { return new DDCommandResult("Error: Invalid dungeon type. Please use one of the existing types."); } @@ -133,7 +133,7 @@ public class CommandExportDungeon extends DDCommandBase if (dungeonHelper.exportDungeon(player.worldObj, x, y, z, exportPath)) { player.sendChatToPlayer("Saved dungeon schematic in " + exportPath); - dungeonHelper.registerDungeon(exportPath, false, true); + dungeonHelper.registerDungeon(exportPath, dungeonHelper.getDungeonPack("ruins"), false, true); return DDCommandResult.SUCCESS; } else diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 0f4f9f6..7151624 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -2,6 +2,7 @@ package StevenDimDoors.mod_pocketDim.helpers; import java.io.BufferedReader; import java.io.File; +import java.io.FileFilter; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.InputStreamReader; @@ -34,21 +35,42 @@ import StevenDimDoors.mod_pocketDim.util.WeightedContainer; public class DungeonHelper { + //TODO: File-handling functionality should be spun off to a helper class later + private static class DirectoryFilter implements FileFilter + { + @Override + public boolean accept(File file) + { + return file.isDirectory(); + } + } + + private static class SchematicFileFilter implements FileFilter + { + @Override + public boolean accept(File file) + { + return file.isFile() && file.getName().endsWith(SCHEMATIC_FILE_EXTENSION); + } + } + private static DungeonHelper instance = null; private static DDProperties properties = null; public static final Pattern SCHEMATIC_NAME_PATTERN = Pattern.compile("[A-Za-z0-9_\\-]+"); public static final Pattern DUNGEON_NAME_PATTERN = Pattern.compile("[A-Za-z0-9\\-]+"); + public static final String SCHEMATIC_FILE_EXTENSION = ".schematic"; + private static final String DEFAULT_UP_SCHEMATIC_PATH = "/schematics/core/simpleStairsUp.schematic"; private static final String DEFAULT_DOWN_SCHEMATIC_PATH = "/schematics/core/simpleStairsDown.schematic"; private static final String DEFAULT_ERROR_SCHEMATIC_PATH = "/schematics/core/somethingBroke.schematic"; - private static final String BUNDLED_DUNGEONS_LIST_PATH = "/schematics/schematics.txt"; private static final String DUNGEON_CREATION_GUIDE_SOURCE_PATH = "/mods/DimDoors/text/How_to_add_dungeons.txt"; - - private static final String RUINS_PACK_PATH = "/schematics/ruins/rules.txt"; + private static final String RUINS_PACK_PATH = "/schematics/ruins"; + private static final String BUNDLED_RUINS_LIST_PATH = "/schematics/ruins.txt"; + private static final String STANDARD_CONFIG_FILE_NAME = "rules.txt"; - public static final String SCHEMATIC_FILE_EXTENSION = ".schematic"; + private static final int NETHER_DIMENSION_ID = -1; private static final int MIN_PACK_SWITCH_CHANCE = 0; private static final int PACK_SWITCH_CHANCE_PER_LEVEL = 1; @@ -58,6 +80,7 @@ public class DungeonHelper private static final int DEFAULT_DUNGEON_WEIGHT = 100; public static final int MIN_DUNGEON_WEIGHT = 1; //Prevents MC's random selection algorithm from throwing an exception public static final int MAX_DUNGEON_WEIGHT = 10000; //Used to prevent overflows and math breaking down + private static final int MAX_EXPORT_RADIUS = 50; public static final short MAX_DUNGEON_WIDTH = 2 * MAX_EXPORT_RADIUS + 1; public static final short MAX_DUNGEON_HEIGHT = MAX_DUNGEON_WIDTH; @@ -116,17 +139,12 @@ public class DungeonHelper copyfile.copyFile(DUNGEON_CREATION_GUIDE_SOURCE_PATH, file.getAbsolutePath() + "/How_to_add_dungeons.txt"); } - //TODO: Write up a dungeon pack loading function that loads the whole pack and infers its name from the path - DungeonPackConfigReader reader = new DungeonPackConfigReader(); - RuinsPack = new DungeonPack(loadDungeonPackConfig(reader, RUINS_PACK_PATH, "ruins", true)); - dungeonPackMapping.put("ruins", RuinsPack); - dungeonPackList.add(RuinsPack); - - registerBundledDungeons(); - registerCustomDungeons(properties.CustomSchematicDirectory); + DungeonPackConfigReader reader = new DungeonPackConfigReader(); + registerBundledDungeons(reader); + registerCustomDungeons(properties.CustomSchematicDirectory, reader); } - private static DungeonPackConfig loadDungeonPackConfig(DungeonPackConfigReader reader, String configPath, String name, boolean isInternal) + private static DungeonPackConfig loadDungeonPackConfig(String configPath, String name, boolean isInternal, DungeonPackConfigReader reader) { try { @@ -157,6 +175,49 @@ public class DungeonHelper return null; } + private void registerDungeonPack(String directory, Iterable schematics, boolean isInternal, boolean verbose, DungeonPackConfigReader reader) + { + //First determine the pack's name and validate it + File packDirectory = new File(directory); + String name = packDirectory.getName().toUpperCase(); + //TODO: ADD VALIDATION HERE? + + //Check for naming conflicts + //That could happen if a user has a custom pack with a name that conflicts with a bundled pack, + //or if a user is running Linux and has two directories with names differing only by capitalization. + + DungeonPack pack = dungeonPackMapping.get(name); + if (pack == null) + { + //Load the pack's configuration file + String configPath = directory + File.separator + STANDARD_CONFIG_FILE_NAME; + DungeonPackConfig config = loadDungeonPackConfig(configPath, name, isInternal, reader); + if (config == null) + { + System.err.println("Could not load config file: " + configPath); + return; + } + + //Register the pack + pack = new DungeonPack(config); + dungeonPackMapping.put(name, pack); + dungeonPackList.add(pack); + } + else + { + //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. + System.err.println("A dungeon pack has the same name as another pack that has already been loaded: " + directory); + System.err.println("We will try to load its schematics but will not check its config file."); + } + + //Register the dungeons! ^_^ + for (String schematicPath : schematics) + { + registerDungeon(schematicPath, pack, isInternal, verbose); + } + } + public List getRegisteredDungeons() { return Collections.unmodifiableList(this.registeredDungeons); @@ -182,6 +243,12 @@ public class DungeonHelper return defaultDown; } + public DungeonPack getDungeonPack(String name) + { + //TODO: This function might be obsolete after the new save format is implemented. + return dungeonPackMapping.get(name.toUpperCase()); + } + public DungeonPack getDimDungeonPack(int dimensionID) { //FIXME: This function is a workaround to our current dungeon data limitations. Modify later. @@ -201,7 +268,15 @@ public class DungeonHelper } else { - pack = RuinsPack; + if (dimensionID == NETHER_DIMENSION_ID) + { + //TODO: Change this to the nether-side pack later ^_^ + pack = RuinsPack; + } + else + { + pack = RuinsPack; + } } return pack; } @@ -218,13 +293,13 @@ public class DungeonHelper return link; } - public boolean validateDungeonType(String type) + public boolean validateDungeonType(String type, DungeonPack pack) { //Check if the dungeon type is valid - return RuinsPack.isKnownType(type); + return pack.isKnownType(type); } - public boolean validateSchematicName(String name) + public boolean validateSchematicName(String name, DungeonPack pack) { String[] dungeonData; @@ -238,7 +313,7 @@ public class DungeonHelper return false; //Check if the dungeon type is valid - if (!validateDungeonType(dungeonData[0])) + if (!validateDungeonType(dungeonData[0], pack)) return false; //Check if the name is valid @@ -267,7 +342,7 @@ public class DungeonHelper return true; } - public void registerDungeon(String schematicPath, 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 //that File tries to interpret it as a local drive path and mangles it. @@ -276,19 +351,19 @@ public class DungeonHelper String path = isInternal ? schematicPath : schematicFile.getAbsolutePath(); try { - if (validateSchematicName(name)) + if (validateSchematicName(name, pack)) { //Strip off the file extension while splitting the file name String[] dungeonData = name.substring(0, name.length() - SCHEMATIC_FILE_EXTENSION.length()).split("_"); - DungeonType dungeonType = RuinsPack.getType(dungeonData[0]); + DungeonType dungeonType = pack.getType(dungeonData[0]); boolean isOpen = dungeonData[2].equalsIgnoreCase("open"); int weight = (dungeonData.length == 4) ? Integer.parseInt(dungeonData[3]) : DEFAULT_DUNGEON_WEIGHT; //Add this custom dungeon to the list corresponding to its type DungeonGenerator generator = new DungeonGenerator(weight, path, isOpen, dungeonType); - RuinsPack.addDungeon(generator); + pack.addDungeon(generator); registeredDungeons.add(generator); if (verbose) { @@ -299,37 +374,82 @@ public class DungeonHelper { if (verbose) { - System.out.println("Could not parse dungeon filename, not adding dungeon to generation lists"); + System.out.println("The following dungeon name is invalid for its given pack. It will not be generated naturally: " + schematicPath); } untaggedDungeons.add(new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, path, true, DungeonType.UNKNOWN_TYPE)); System.out.println("Registered untagged dungeon: " + name); } } - catch(Exception e) + catch (Exception e) { System.err.println("Failed to register dungeon: " + name); e.printStackTrace(); } } - private void registerCustomDungeons(String path) + private void registerCustomDungeons(String path, DungeonPackConfigReader reader) { + File[] schematics; + File[] packDirectories; + File[] packFiles; + ArrayList packFilePaths; File directory = new File(path); - File[] schematicNames = directory.listFiles(); + SchematicFileFilter schematicFileFilter = new SchematicFileFilter(); - if (schematicNames != null) + //Check that the Ruins pack has been loaded + if (RuinsPack == null) { - for (File schematicFile: schematicNames) + throw new IllegalStateException("Cannot register custom dungeons without first loading the Ruins dungeon pack."); + } + + //Load stray dungeons directly in the custom dungeons folder + schematics = directory.listFiles(schematicFileFilter); + if (schematics != null) + { + for (File schematicFile : schematics) { - if (schematicFile.getName().endsWith(SCHEMATIC_FILE_EXTENSION)) + registerDungeon(schematicFile.getPath(), RuinsPack, false, true); + } + } + else + { + System.err.println("Could not retrieve the list of schematics stored in the custom dungeons directory!"); + } + schematics = null; //Release memory + + //Load the custom dungeon packs + packDirectories = directory.listFiles(new DirectoryFilter()); + if (packDirectories != null) + { + //Loop through each directory, which is assumed to be a dungeon pack + for (File packDirectory : packDirectories) + { + //List the schematics within the dungeon pack directory + packFiles = packDirectory.listFiles(schematicFileFilter); + if (packFiles != null) { - registerDungeon(schematicFile.getPath(), false, true); + //Copy the pack files' paths into an ArrayList for use with registerDungeonPack() + packFilePaths = new ArrayList(packFiles.length); + for (File packFile : packFiles) + { + packFilePaths.add(packFile.getPath()); + } + + registerDungeonPack(packDirectory.getAbsolutePath(), packFilePaths, false, true, reader); + } + else + { + System.err.println("Could not retrieve the list of schematics in a dungeon pack: " + packDirectory.getPath()); } } } + else + { + System.err.println("Could not retrieve the list of dungeon pack directories in the custom dungeons directory!"); + } } - private void registerBundledDungeons() + private void registerBundledDungeons(DungeonPackConfigReader reader) { //Register the core schematics //These are used for debugging and in case of unusual errors while loading dungeons @@ -338,31 +458,46 @@ public class DungeonHelper defaultError = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, DEFAULT_ERROR_SCHEMATIC_PATH, true, DungeonType.UNKNOWN_TYPE); //Open the list of dungeons packaged with our mod and register their schematics - InputStream listStream = this.getClass().getResourceAsStream(BUNDLED_DUNGEONS_LIST_PATH); + registerBundledPack(BUNDLED_RUINS_LIST_PATH, RUINS_PACK_PATH, "Ruins", reader); + RuinsPack = getDungeonPack("Ruins"); + + System.out.println("Finished registering bundled dungeon packs"); + } + + private void registerBundledPack(String listPath, String packPath, String name, DungeonPackConfigReader reader) + { + System.out.println("Registering bundled dungeon pack: " + name); + + InputStream listStream = this.getClass().getResourceAsStream(listPath); if (listStream == null) { - System.err.println("Unable to open list of bundled dungeon schematics."); + System.err.println("Unable to open list of bundled dungeon schematics for " + name); return; } try { + //Read the list of schematics that come with a bundled pack BufferedReader listReader = new BufferedReader(new InputStreamReader(listStream)); + ArrayList schematics = new ArrayList(); String schematicPath = listReader.readLine(); while (schematicPath != null) { schematicPath = schematicPath.trim(); if (!schematicPath.isEmpty()) { - registerDungeon(schematicPath, true, false); + schematics.add(schematicPath); } schematicPath = listReader.readLine(); } listReader.close(); + + //Register the pack + registerDungeonPack(packPath, schematics, true, false, reader); } catch (Exception e) { - System.err.println("An exception occurred while reading the list of bundled dungeon schematics."); + System.err.println("An exception occurred while reading the list of bundled dungeon schematics for " + name); e.printStackTrace(); } } @@ -397,7 +532,7 @@ public class DungeonHelper config = pack.getConfig(); selectedPack = pack; - //Do we want to switch to another dungeon pack? + //Are we allowed to switch to another dungeon pack? if (config.allowPackChangeOut()) { //Calculate the chance of switching to a different pack type @@ -418,6 +553,8 @@ public class DungeonHelper selectedPack = getRandomDungeonPack(pack, random); } } + + //Pick the next dungeon selection = selectedPack.getNextDungeon(inbound, random); } catch (Exception e) diff --git a/schematics/schematics.txt b/schematics/ruins.txt similarity index 100% rename from schematics/schematics.txt rename to schematics/ruins.txt -- 2.39.5 From 758f5e506270be3b52cf6571c57770f19c98776c Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Thu, 22 Aug 2013 16:04:08 -0400 Subject: [PATCH 023/544] Fixed a few bugs, more rendering changes --- .../mod_pocketDim/TileEntityRift.java | 7 +++ .../mod_pocketDim/blocks/ExitDoor.java | 2 +- .../mod_pocketDim/blocks/dimDoor.java | 2 + .../dungeon/pack/DungeonPack.java | 2 +- .../mod_pocketDim/helpers/dimHelper.java | 12 ++--- .../mod_pocketDimClient/RenderRift.java | 46 ++++++++++++------- 6 files changed, 44 insertions(+), 27 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/TileEntityRift.java b/StevenDimDoors/mod_pocketDim/TileEntityRift.java index ddf5229..dfa3477 100644 --- a/StevenDimDoors/mod_pocketDim/TileEntityRift.java +++ b/StevenDimDoors/mod_pocketDim/TileEntityRift.java @@ -55,6 +55,8 @@ public class TileEntityRift extends TileEntity } public void clearBlocksOnRift() { + System.out.println(this.worldObj.getBlockId(xCoord, yCoord,zCoord)); + for(double[] coord: this.renderingCenters.values()) { int x = MathHelper.floor_double(coord[0]+.5); @@ -164,6 +166,11 @@ public class TileEntityRift extends TileEntity this.invalidate(); this.worldObj.setBlockToAir(xCoord, yCoord, zCoord); } + if(this.worldObj.getBlockId(xCoord, yCoord, zCoord)!=mod_pocketDim.blockRift.blockID) + { + this.invalidate(); + } + } public void grow(int distance) { diff --git a/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java b/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java index 98149d2..1d48443 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java @@ -125,7 +125,7 @@ public class ExitDoor extends dimDoor } - //this.onPoweredBlockChange(par1World, par2, par3, par4, false); + par1World.setBlockTileEntity(par2, par3, par4, this.createNewTileEntity(par1World)); } @SideOnly(Side.CLIENT) diff --git a/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java index c172c67..5e94326 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java @@ -281,6 +281,8 @@ public class dimDoor extends BlockContainer } } + par1World.setBlockTileEntity(par2, par3, par4, this.createNewTileEntity(par1World)); + } diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java index 40bc2c7..181425e 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java @@ -50,7 +50,7 @@ public class DungeonPack { String standardName = typeName.toUpperCase(); this.nameToTypeMapping.put(standardName, new DungeonType(this, standardName, index)); - this.groupedDungeons.add(new ArrayList()); + this.groupedDungeons.add(new ArrayList()); index++; } diff --git a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java b/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java index 5e7bf63..54cec21 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java @@ -1125,17 +1125,13 @@ public class dimHelper extends DimensionManager } } } - linkToMove.locDimID=dimID; - linkToMove.locXCoord=x; - linkToMove.locYCoord=y; - linkToMove.locZCoord=z; + this.createLink(new LinkData(dimID,linkToMove.destDimID,x,y,z,linkToMove.destXCoord,linkToMove.destYCoord,linkToMove.destZCoord,linkToMove.isLocPocket,linkToMove.linkOrientation)); + if(this.getLinkDataFromCoords(oldX,oldY,oldZ,oldDimID)!=null) { - // this.removeLink(this.getLinkDataFromCoords(oldX,oldY,oldZ,oldDimID)); + this.removeLink(this.getLinkDataFromCoords(oldX,oldY,oldZ,oldDimID)); } - this.createLink(linkToMove); - LinkData linkTest = dimHelper.instance.getLinkDataFromCoords(x, y, z, dimID); - linkTest.printLinkData(); + return true; } return false; diff --git a/StevenDimDoors/mod_pocketDimClient/RenderRift.java b/StevenDimDoors/mod_pocketDimClient/RenderRift.java index 3d55fe1..42410a1 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderRift.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderRift.java @@ -26,6 +26,7 @@ import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class RenderRift extends TileEntitySpecialRenderer { + private Random rand = new Random(); @Override public void renderTileEntityAt(TileEntity te, double xWorld, double yWorld, @@ -41,7 +42,7 @@ public class RenderRift extends TileEntitySpecialRenderer //GL11.glLogicOp(GL11.GL_INVERT); // GL11.glEnable(GL11.GL_COLOR_LOGIC_OP); - GL11.glColor4f(.3F, .3F, .3F, 1F); + GL11.glColor4f(.2F, .2F, .2F, 1F); GL11.glEnable(GL_BLEND); glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); @@ -71,11 +72,16 @@ public class RenderRift extends TileEntitySpecialRenderer drawVertex(xWorld+.5, yWorld+Math.log(Math.pow(quads.size(),2)+1)/14, zWorld+.5); for(int i = 0;;i++) { + if(!quads.containsKey(i)) { break; } double[] coords = quads.get(i); + float driftX = (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F; + float driftY =(float)(Minecraft.getSystemTime() % 200000L) / 200000.0F; + float driftZ = (float) (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F; + double width=Math.log(Math.pow(quads.size(),2-Math.log(i+1))+1)/14; if(coords[3]==0) { @@ -83,16 +89,16 @@ public class RenderRift extends TileEntitySpecialRenderer if(quads.containsKey(i+1)) { - drawVertex(xWorld+coords[0]+.5, yWorld+coords[1]-width/2 , zWorld+coords[2]); - drawVertex(xWorld+coords[0]+.5 , yWorld+coords[1]+width/2 , zWorld+coords[2]); + drawVertex(xWorld+coords[0]+driftX+.5, yWorld+coords[1]+driftY-width/2 , zWorld+coords[2]+driftZ); + drawVertex(xWorld+coords[0]+driftX+.5 , yWorld+coords[1]+driftY+width/2 , zWorld+coords[2]+driftZ); } else { - drawVertex(xWorld+coords[0]+.5, yWorld+coords[1]-width/200 , zWorld+coords[2]); - drawVertex(xWorld+coords[0]+.5 , yWorld+coords[1]+width/200 , zWorld+coords[2]); + drawVertex(xWorld+coords[0]+driftX+.5, yWorld+coords[1]+driftY-width/200 , zWorld+coords[2]+driftZ); + drawVertex(xWorld+coords[0]+driftX+.5 , yWorld+coords[1]+driftY+width/200 , zWorld+coords[2]+driftZ); } } else @@ -102,15 +108,15 @@ public class RenderRift extends TileEntitySpecialRenderer if(quads.containsKey(i+1)) { - drawVertex(xWorld+coords[0], yWorld+coords[1]-width/2 , zWorld+coords[2]+.5); - drawVertex(xWorld+coords[0], yWorld+coords[1]+width/2 , zWorld+coords[2]+.5); + drawVertex(xWorld+coords[0]+driftX, yWorld+coords[1]+driftY-width/2 , zWorld+coords[2]+driftZ+.5); + drawVertex(xWorld+coords[0]+driftX, yWorld+coords[1]+driftY+width/2 , zWorld+coords[2]+driftZ+.5); } else { - drawVertex(xWorld+coords[0], yWorld+coords[1]+width/200 , zWorld+coords[2]+.5); - drawVertex(xWorld+coords[0], yWorld+coords[1]-width/200, zWorld+coords[2]+.5); + drawVertex(xWorld+coords[0]+driftX, yWorld+coords[1]+driftY+width/200 , zWorld+coords[2]+driftZ+.5); + drawVertex(xWorld+coords[0]+driftX, yWorld+coords[1]+driftY-width/200, zWorld+coords[2]+driftZ+.5); } @@ -137,6 +143,12 @@ public class RenderRift extends TileEntitySpecialRenderer break; } double[] coords = quads.get(i); + + float driftX = (float) (rand.nextGaussian()/100)*i; + float driftY = (float) (rand.nextGaussian()/100)*i; + float driftZ = (float) (rand.nextGaussian()/100)*i; + + double width=Math.log(Math.pow(quads.size(),2-Math.log(i+1))+1)/14; if(coords[3]==0) { @@ -144,15 +156,15 @@ public class RenderRift extends TileEntitySpecialRenderer if(quads.containsKey(i+1)) { - drawVertex(xWorld+coords[0]+.5, yWorld-(coords[1]-width/2) , zWorld-coords[2]+1); - drawVertex(xWorld+coords[0]+.5 , yWorld-(coords[1]+width/2) , zWorld-coords[2]+1); + drawVertex(xWorld+coords[0]+driftX+.5, yWorld-(coords[1]-width/2) , zWorld-coords[2]+1); + drawVertex(xWorld+coords[0]+driftX+.5 , yWorld-(coords[1]+width/2) , zWorld-coords[2]+1); } else { - drawVertex(xWorld+coords[0]+.5, yWorld-(coords[1]-width/200) , zWorld-coords[2]+1); - drawVertex(xWorld+coords[0]+.5 , yWorld-(coords[1]+width/200) , zWorld-coords[2]+1); + drawVertex(xWorld+coords[0]+driftX+.5, yWorld-(coords[1]-width/200) , zWorld-coords[2]+1); + drawVertex(xWorld+coords[0]+driftX+.5 , yWorld-(coords[1]+width/200) , zWorld-coords[2]+1); } } @@ -163,14 +175,14 @@ public class RenderRift extends TileEntitySpecialRenderer if(quads.containsKey(i+1)) { - drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]-width/2) , zWorld+coords[2]+.5); - drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]+width/2) , zWorld+coords[2]+.5); + drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]-width/2) , zWorld+coords[2]+driftZ+.5); + drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]+width/2) , zWorld+coords[2]+driftZ+.5); } else { - drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]+width/200) , zWorld+coords[2]+.5); - drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]-width/200), zWorld+coords[2]+.5); + drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]+width/200) , zWorld+coords[2]+driftZ+.5); + drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]-width/200), zWorld+coords[2]+driftZ+.5); } } -- 2.39.5 From 879f3a1eafddb959c4dfa7900aa41f29f0b719e1 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Thu, 22 Aug 2013 16:11:49 -0400 Subject: [PATCH 024/544] Render fix --- .../mod_pocketDim/TileEntityRift.java | 1 - .../mod_pocketDimClient/RenderRift.java | 44 +++++++------------ 2 files changed, 16 insertions(+), 29 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/TileEntityRift.java b/StevenDimDoors/mod_pocketDim/TileEntityRift.java index dfa3477..8aecb3c 100644 --- a/StevenDimDoors/mod_pocketDim/TileEntityRift.java +++ b/StevenDimDoors/mod_pocketDim/TileEntityRift.java @@ -55,7 +55,6 @@ public class TileEntityRift extends TileEntity } public void clearBlocksOnRift() { - System.out.println(this.worldObj.getBlockId(xCoord, yCoord,zCoord)); for(double[] coord: this.renderingCenters.values()) { diff --git a/StevenDimDoors/mod_pocketDimClient/RenderRift.java b/StevenDimDoors/mod_pocketDimClient/RenderRift.java index 42410a1..5372093 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderRift.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderRift.java @@ -26,7 +26,6 @@ import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class RenderRift extends TileEntitySpecialRenderer { - private Random rand = new Random(); @Override public void renderTileEntityAt(TileEntity te, double xWorld, double yWorld, @@ -72,16 +71,11 @@ public class RenderRift extends TileEntitySpecialRenderer drawVertex(xWorld+.5, yWorld+Math.log(Math.pow(quads.size(),2)+1)/14, zWorld+.5); for(int i = 0;;i++) { - if(!quads.containsKey(i)) { break; } double[] coords = quads.get(i); - float driftX = (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F; - float driftY =(float)(Minecraft.getSystemTime() % 200000L) / 200000.0F; - float driftZ = (float) (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F; - double width=Math.log(Math.pow(quads.size(),2-Math.log(i+1))+1)/14; if(coords[3]==0) { @@ -89,16 +83,16 @@ public class RenderRift extends TileEntitySpecialRenderer if(quads.containsKey(i+1)) { - drawVertex(xWorld+coords[0]+driftX+.5, yWorld+coords[1]+driftY-width/2 , zWorld+coords[2]+driftZ); - drawVertex(xWorld+coords[0]+driftX+.5 , yWorld+coords[1]+driftY+width/2 , zWorld+coords[2]+driftZ); + drawVertex(xWorld+coords[0]+.5, yWorld+coords[1]-width/2 , zWorld+coords[2]); + drawVertex(xWorld+coords[0]+.5 , yWorld+coords[1]+width/2 , zWorld+coords[2]); } else { - drawVertex(xWorld+coords[0]+driftX+.5, yWorld+coords[1]+driftY-width/200 , zWorld+coords[2]+driftZ); - drawVertex(xWorld+coords[0]+driftX+.5 , yWorld+coords[1]+driftY+width/200 , zWorld+coords[2]+driftZ); + drawVertex(xWorld+coords[0]+.5, yWorld+coords[1]-width/200 , zWorld+coords[2]); + drawVertex(xWorld+coords[0]+.5 , yWorld+coords[1]+width/200 , zWorld+coords[2]); } } else @@ -108,15 +102,15 @@ public class RenderRift extends TileEntitySpecialRenderer if(quads.containsKey(i+1)) { - drawVertex(xWorld+coords[0]+driftX, yWorld+coords[1]+driftY-width/2 , zWorld+coords[2]+driftZ+.5); - drawVertex(xWorld+coords[0]+driftX, yWorld+coords[1]+driftY+width/2 , zWorld+coords[2]+driftZ+.5); + drawVertex(xWorld+coords[0], yWorld+coords[1]-width/2 , zWorld+coords[2]+.5); + drawVertex(xWorld+coords[0], yWorld+coords[1]+width/2 , zWorld+coords[2]+.5); } else { - drawVertex(xWorld+coords[0]+driftX, yWorld+coords[1]+driftY+width/200 , zWorld+coords[2]+driftZ+.5); - drawVertex(xWorld+coords[0]+driftX, yWorld+coords[1]+driftY-width/200, zWorld+coords[2]+driftZ+.5); + drawVertex(xWorld+coords[0], yWorld+coords[1]+width/200 , zWorld+coords[2]+.5); + drawVertex(xWorld+coords[0], yWorld+coords[1]-width/200, zWorld+coords[2]+.5); } @@ -143,12 +137,6 @@ public class RenderRift extends TileEntitySpecialRenderer break; } double[] coords = quads.get(i); - - float driftX = (float) (rand.nextGaussian()/100)*i; - float driftY = (float) (rand.nextGaussian()/100)*i; - float driftZ = (float) (rand.nextGaussian()/100)*i; - - double width=Math.log(Math.pow(quads.size(),2-Math.log(i+1))+1)/14; if(coords[3]==0) { @@ -156,15 +144,15 @@ public class RenderRift extends TileEntitySpecialRenderer if(quads.containsKey(i+1)) { - drawVertex(xWorld+coords[0]+driftX+.5, yWorld-(coords[1]-width/2) , zWorld-coords[2]+1); - drawVertex(xWorld+coords[0]+driftX+.5 , yWorld-(coords[1]+width/2) , zWorld-coords[2]+1); + drawVertex(xWorld+coords[0]+.5, yWorld-(coords[1]-width/2) , zWorld-coords[2]+1); + drawVertex(xWorld+coords[0]+.5 , yWorld-(coords[1]+width/2) , zWorld-coords[2]+1); } else { - drawVertex(xWorld+coords[0]+driftX+.5, yWorld-(coords[1]-width/200) , zWorld-coords[2]+1); - drawVertex(xWorld+coords[0]+driftX+.5 , yWorld-(coords[1]+width/200) , zWorld-coords[2]+1); + drawVertex(xWorld+coords[0]+.5, yWorld-(coords[1]-width/200) , zWorld-coords[2]+1); + drawVertex(xWorld+coords[0]+.5 , yWorld-(coords[1]+width/200) , zWorld-coords[2]+1); } } @@ -175,14 +163,14 @@ public class RenderRift extends TileEntitySpecialRenderer if(quads.containsKey(i+1)) { - drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]-width/2) , zWorld+coords[2]+driftZ+.5); - drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]+width/2) , zWorld+coords[2]+driftZ+.5); + drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]-width/2) , zWorld+coords[2]+.5); + drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]+width/2) , zWorld+coords[2]+.5); } else { - drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]+width/200) , zWorld+coords[2]+driftZ+.5); - drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]-width/200), zWorld+coords[2]+driftZ+.5); + drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]+width/200) , zWorld+coords[2]+.5); + drawVertex(xWorld-coords[0]+1, yWorld-(coords[1]-width/200), zWorld+coords[2]+.5); } } -- 2.39.5 From 643785022a2fae494e210c015ff349617bec0825 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Thu, 22 Aug 2013 22:10:10 -0400 Subject: [PATCH 025/544] reverted rift rendering sadface --- .../mod_pocketDim/TileEntityRift.java | 342 +++++++++++------- .../mod_pocketDim/blocks/BlockRift.java | 4 +- .../mod_pocketDimClient/ClientProxy.java | 3 +- .../mod_pocketDimClient/RenderRift.java | 1 - 4 files changed, 213 insertions(+), 137 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/TileEntityRift.java b/StevenDimDoors/mod_pocketDim/TileEntityRift.java index 8aecb3c..e15ba5c 100644 --- a/StevenDimDoors/mod_pocketDim/TileEntityRift.java +++ b/StevenDimDoors/mod_pocketDim/TileEntityRift.java @@ -38,22 +38,74 @@ public class TileEntityRift extends TileEntity public boolean isNearRift=false; private int count=200; private int count2 = 0; - + public int age = 0; + public HashMap renderingCenters = new HashMap(); public LinkData nearestRiftData; + public int spawnedEndermenID=0; Random rand; DataWatcher watcher = new DataWatcher(); - public int age = 0; - + public void updateEntity() + { + if(rand == null) + { + rand = new Random(); + rand.setSeed(this.xCoord+this.yCoord+this.zCoord); + } + if(dimHelper.instance.getLinkDataFromCoords(xCoord, yCoord, zCoord, this.worldObj.provider.dimensionId)==null)//ensures that only rifts with TEs are active + { + this.invalidate(); + if(this.worldObj.getBlockId(xCoord, yCoord, zCoord)==mod_pocketDim.blockRift.blockID)//deletes rift TE if its behind something thats not a rift block + { + this.worldObj.setBlockToAir(xCoord, yCoord, zCoord); + this.invalidate(); + return; + } + } + if(this.worldObj.getBlockId(xCoord, yCoord, zCoord)!=mod_pocketDim.blockRift.blockID)//deletes rift TE if its behind something thats not a rift block + { + this.invalidate(); + return; + } + + //The code for the new rift rendering hooks in here, as well as in the ClientProxy to bind the TESR to the rift. + //It is inactive for now. + /** + if(rand.nextInt(15) == 1) + { + age = age + 1; + this.calculateNextRenderQuad(age, rand); + } + this.clearBlocksOnRift(); + **/ + + //This code should execute once every 10 seconds + count++; + if(count>200) + { + this.spawnEndermen(); + this.calculateOldParticleOffset(); //this also calculates the distance for the particle stuff. + if(distance>1)//only grow if rifts are nearby + { + this.grow(distance); + } + count=0; + } + + if(this.shouldClose)//Determines if rift should render white closing particles and spread closing effect to other rifts nearby + { + closeRift(); + } + } public boolean canUpdate() { return true; } - public void clearBlocksOnRift() + public void clearBlocksOnRift()//clears blocks for the new rending effect { for(double[] coord: this.renderingCenters.values()) @@ -62,12 +114,12 @@ public class TileEntityRift extends TileEntity int y = MathHelper.floor_double(coord[1]+.5); int z = MathHelper.floor_double(coord[2]+.5); - if(!BlockRift.isBlockImmune(worldObj,this.xCoord+x, this.yCoord+y, this.zCoord+z)) + if(!BlockRift.isBlockImmune(worldObj,this.xCoord+x, this.yCoord+y, this.zCoord+z))//right side { this.worldObj.setBlockToAir(this.xCoord+x, this.yCoord+y, this.zCoord+z); } - if(!BlockRift.isBlockImmune(worldObj,this.xCoord-x, this.yCoord-y, this.zCoord-z)) + if(!BlockRift.isBlockImmune(worldObj,this.xCoord-x, this.yCoord-y, this.zCoord-z))//left side { this.worldObj.setBlockToAir(this.xCoord-x, this.yCoord-y, this.zCoord-z); } @@ -76,11 +128,21 @@ public class TileEntityRift extends TileEntity } public void spawnEndermen() { - if(count>200&&dimHelper.instance.getDimData(this.worldObj.provider.dimensionId)!=null) + if(this.worldObj.isRemote) { + return; + } + if(dimHelper.instance.getDimData(this.worldObj.provider.dimensionId)!=null)//ensures that this rift is only spawning one enderman at a time, to prevent hordes of endermen + { + if(this.worldObj.getEntityByID(this.spawnedEndermenID)!=null) + { + if(this.worldObj.getEntityByID(this.spawnedEndermenID) instanceof EntityEnderman) + { + return; + } + } - - nearestRiftData = dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).findNearestRift(worldObj, 5, xCoord, yCoord, zCoord); + nearestRiftData = dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).findNearestRift(worldObj, 5, xCoord, yCoord, zCoord);//enderman will only spawn in groups of rifts if(nearestRiftData!=null) { if(rand.nextInt(30)==0&&!this.worldObj.isRemote) @@ -102,7 +164,7 @@ public class TileEntityRift extends TileEntity { this.isNearRift=false; } - count=0; + } } public void closeRift() @@ -112,68 +174,88 @@ public class TileEntityRift extends TileEntity nearestRiftData = dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).findNearestRift(worldObj, 10, xCoord, yCoord, zCoord); if(this.nearestRiftData!=null) { - TileEntityRift rift = (TileEntityRift) this.worldObj.getBlockTileEntity(nearestRiftData.locXCoord, nearestRiftData.locYCoord, nearestRiftData.locZCoord); - if(rift!=null) - { - rift.shouldClose=true; - } + TileEntityRift rift = (TileEntityRift) this.worldObj.getBlockTileEntity(nearestRiftData.locXCoord, nearestRiftData.locYCoord, nearestRiftData.locZCoord); + if(rift!=null) + { + rift.shouldClose=true; + } } } if(count2>40) { this.invalidate(); this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord,0); - if(dimHelper.instance.getLinkDataFromCoords(this.xCoord, this.yCoord, this.zCoord, this.worldObj.provider.dimensionId)!=null) - { - dimHelper.instance.removeLink(this.worldObj.provider.dimensionId, this.xCoord, this.yCoord, this.zCoord); - this.worldObj.playSound(xCoord, yCoord, zCoord, "mods.DimDoors.sfx.riftClose", (float) .7, 1,true); + if(dimHelper.instance.getLinkDataFromCoords(this.xCoord, this.yCoord, this.zCoord, this.worldObj.provider.dimensionId)!=null) + { + dimHelper.instance.removeLink(this.worldObj.provider.dimensionId, this.xCoord, this.yCoord, this.zCoord); + this.worldObj.playSound(xCoord, yCoord, zCoord, "mods.DimDoors.sfx.riftClose", (float) .7, 1,true); - } - + } } count2++; } - public void updateEntity() + public void calculateOldParticleOffset() { - if(rand == null) + nearestRiftData = dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).findNearestRift(worldObj, 5, xCoord, yCoord, zCoord); + if(nearestRiftData!=null) { - rand = new Random(); - rand.setSeed(this.xCoord+this.yCoord+this.zCoord); - + this.xOffset=this.xCoord-nearestRiftData.locXCoord; + this.yOffset=this.yCoord-nearestRiftData.locYCoord; + this.zOffset=this.zCoord-nearestRiftData.locZCoord; + this.distance=(int) (MathHelper.abs(xOffset)+MathHelper.abs(yOffset)+MathHelper.abs(zOffset)); + this.isNearRift=true; + + if(!this.worldObj.isRemote&&distance>1) + { + try + { + grow(distance); + } + catch(Exception e) + { + + } + } } - if(rand.nextInt(15) == 1) - { - - age = age + 1; - this.calculateNextRenderQuad(age, rand); - - - } - this.clearBlocksOnRift(); - this.spawnEndermen(); - - - count++; - - if(this.shouldClose) - { - closeRift(); - } - - if(dimHelper.instance.getLinkDataFromCoords(xCoord, yCoord, zCoord, this.worldObj.provider.dimensionId)==null) - { - this.invalidate(); - this.worldObj.setBlockToAir(xCoord, yCoord, zCoord); - } - if(this.worldObj.getBlockId(xCoord, yCoord, zCoord)!=mod_pocketDim.blockRift.blockID) - { - this.invalidate(); - } - } public void grow(int distance) { - + if(this.worldObj.isRemote) + { + return; + } + int growCount=0; + if(rand.nextInt(distance*2)==0) + { + int x=0,y=0,z=0; + while(growCount<100) + { + growCount++; + x=this.xCoord+(1-(rand.nextInt(2)*2)*rand.nextInt(6)); + y=this.yCoord+(1-(rand.nextInt(2)*2)*rand.nextInt(4)); + z=this.zCoord+(1-(rand.nextInt(2)*2)*rand.nextInt(6)); + if(this.worldObj.isAirBlock(x, y, z)) + { + break; + } + + } + if (growCount<100) + { + + LinkData link = dimHelper.instance.getLinkDataFromCoords(this.xCoord, this.yCoord, this.zCoord, worldObj); + if(link!=null) + { + if(!this.hasGrownRifts&&rand.nextInt(3)==0) + { + // System.out.println(link.numberofChildren); + link.numberofChildren++; + dimHelper.instance.createLink(this.worldObj.provider.dimensionId, link.destDimID, x, y, z, link.destXCoord, link.destYCoord, link.destZCoord).numberofChildren=link.numberofChildren+1; + this.hasGrownRifts=true; + } + } + } + } } public void calculateNextRenderQuad(float age, Random rand) { @@ -181,60 +263,49 @@ public class TileEntityRift extends TileEntity int iteration=0; while(iteration< maxSize) { - iteration++; - - - double fl =Math.log(iteration+1)/(iteration); - double[] coords= new double[4]; - double noise = ((rand.nextGaussian())/(2+iteration/3+1)); - - if(!this.renderingCenters.containsKey(iteration-1)) - { - if(rand.nextBoolean()) - { - coords[0] = fl*1.5; - coords[1] = rand.nextGaussian()/5; - coords[2] = 0; - coords[3] = 1; - } - else - { - coords[0] = 0; - coords[1] = rand.nextGaussian()/5; - coords[2] = fl*1.5; - coords[3] = 0; - - } - this.renderingCenters.put(iteration-1,coords); - iteration--; - - } - else if(!this.renderingCenters.containsKey(iteration)) - { - if(this.renderingCenters.get(iteration-1)[3]==0) - { - coords[0]=noise/2+this.renderingCenters.get(iteration-1)[0]; - coords[1]=noise/2+this.renderingCenters.get(iteration-1)[1]; - coords[2]= this.renderingCenters.get(iteration-1)[2]+fl; - coords[3] = 0; - - } - else - { - coords[0]=this.renderingCenters.get(iteration-1)[0]+fl; - coords[1]=noise/2+this.renderingCenters.get(iteration-1)[1]; - coords[2]=noise/2+this.renderingCenters.get(iteration-1)[2]; - coords[3] = 1; - - } - + iteration++; + double fl =Math.log(iteration+1)/(iteration); + double[] coords= new double[4]; + double noise = ((rand.nextGaussian())/(2+iteration/3+1)); - this.renderingCenters.put(iteration,coords); - - } + if(!this.renderingCenters.containsKey(iteration-1)) + { + if(rand.nextBoolean()) + { + coords[0] = fl*1.5; + coords[1] = rand.nextGaussian()/5; + coords[2] = 0; + coords[3] = 1; + } + else + { + coords[0] = 0; + coords[1] = rand.nextGaussian()/5; + coords[2] = fl*1.5; + coords[3] = 0; + } + this.renderingCenters.put(iteration-1,coords); + iteration--; + } + else if(!this.renderingCenters.containsKey(iteration)) + { + if(this.renderingCenters.get(iteration-1)[3]==0) + { + coords[0]=noise/2+this.renderingCenters.get(iteration-1)[0]; + coords[1]=noise/2+this.renderingCenters.get(iteration-1)[1]; + coords[2]= this.renderingCenters.get(iteration-1)[2]+fl; + coords[3] = 0; + } + else + { + coords[0]=this.renderingCenters.get(iteration-1)[0]+fl; + coords[1]=noise/2+this.renderingCenters.get(iteration-1)[1]; + coords[2]=noise/2+this.renderingCenters.get(iteration-1)[2]; + coords[3] = 1; + } + this.renderingCenters.put(iteration,coords); + } } - - } @Override @@ -245,47 +316,54 @@ public class TileEntityRift extends TileEntity @Override public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - this.renderingCenters= new HashMap(); - this.count=nbt.getInteger("count"); - this.count2=nbt.getInteger("count2"); - this.age=nbt.getInteger("age"); - this.shouldClose=nbt.getBoolean("shouldClose"); - - + super.readFromNBT(nbt); + this.renderingCenters= new HashMap(); + this.count=nbt.getInteger("count"); + this.count2=nbt.getInteger("count2"); + this.xOffset = nbt.getInteger("xOffset"); + this.yOffset = nbt.getInteger("yOffset"); + this.zOffset = nbt.getInteger("zOffset"); + this.hasGrownRifts =nbt.getBoolean("grownRifts"); + this.age=nbt.getInteger("age"); + this.shouldClose=nbt.getBoolean("shouldClose"); + this.spawnedEndermenID = nbt.getInteger("spawnedEndermenID"); } @Override public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - + super.writeToNBT(nbt); nbt.setInteger("hashMapSize", this.renderingCenters.size()); nbt.setInteger("age", this.age); nbt.setInteger("count", this.count); nbt.setInteger("count2", this.count2); - + nbt.setBoolean("grownRifts",this.hasGrownRifts); + nbt.setInteger("xOffset", this.xOffset); + nbt.setInteger("yOffset", this.yOffset); + nbt.setInteger("zOffset", this.zOffset); nbt.setBoolean("shouldClose", this.shouldClose); - + nbt.setInteger("spawnedEndermenID", this.spawnedEndermenID); } @Override - public Packet getDescriptionPacket() { - Packet132TileEntityData packet = new Packet132TileEntityData(); - packet.actionType = 0; - packet.xPosition = xCoord; - packet.yPosition = yCoord; - packet.zPosition = zCoord; + public Packet getDescriptionPacket() + { + Packet132TileEntityData packet = new Packet132TileEntityData(); + packet.actionType = 0; + packet.xPosition = xCoord; + packet.yPosition = yCoord; + packet.zPosition = zCoord; - NBTTagCompound nbt = new NBTTagCompound(); - writeToNBT(nbt); - packet.customParam1 = nbt; - return packet; + NBTTagCompound nbt = new NBTTagCompound(); + writeToNBT(nbt); + packet.customParam1 = nbt; + return packet; } @Override - public void onDataPacket(INetworkManager net, Packet132TileEntityData pkt) { - readFromNBT(pkt.customParam1); + public void onDataPacket(INetworkManager net, Packet132TileEntityData pkt) + { + readFromNBT(pkt.customParam1); } } diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java b/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java index 12dc289..0d6bf47 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java @@ -161,7 +161,7 @@ public class BlockRift extends BlockContainer if (random.nextInt(MAX_BLOCK_SEARCH_CHANCE) < BLOCK_SEARCH_CHANCE && ((TileEntityRift) world.getBlockTileEntity(x, y, z)).isNearRift ) { - // destroyNearbyBlocks(world, x, y, z, random); + destroyNearbyBlocks(world, x, y, z, random); } } } @@ -226,7 +226,6 @@ public class BlockRift extends BlockContainer /** * regulates the render effect, especially when multiple rifts start to link up. Has 3 main parts- Grows toward and away from nearest rft, bends toward it, and a randomization function */ - /** @Override @SideOnly(Side.CLIENT) @@ -336,7 +335,6 @@ public class BlockRift extends BlockContainer } } } - **/ public static boolean isBlockImmune(World world, int x, int y, int z) { Block block = Block.blocksList[world.getBlockId(x, y, z)]; diff --git a/StevenDimDoors/mod_pocketDimClient/ClientProxy.java b/StevenDimDoors/mod_pocketDimClient/ClientProxy.java index 5c3bc4f..f2a1bfb 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClientProxy.java +++ b/StevenDimDoors/mod_pocketDimClient/ClientProxy.java @@ -25,7 +25,8 @@ public class ClientProxy extends CommonProxy //MinecraftForgeClient.preloadTexture(BLOCK_PNG); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDimDoor.class, new RenderDimDoor()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRift.class, new RenderRift()); + //This code activates the new rift rendering, as well as a bit of code in TileEntityRift + //ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRift.class, new RenderRift()); //MinecraftForgeClient.preloadTexture(RIFT2_PNG); diff --git a/StevenDimDoors/mod_pocketDimClient/RenderRift.java b/StevenDimDoors/mod_pocketDimClient/RenderRift.java index 5372093..2e3f308 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderRift.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderRift.java @@ -49,7 +49,6 @@ public class RenderRift extends TileEntitySpecialRenderer /** * just draws the verticies */ - //testDraw(TileEntityRift.class.cast(te).renderingCenters, xWorld, yWorld, zWorld); this.drawCrack(TileEntityRift.class.cast(te).renderingCenters, xWorld, yWorld, zWorld); this.drawCrackRotated(TileEntityRift.class.cast(te).renderingCenters, xWorld, yWorld, zWorld); -- 2.39.5 From 2b1d80f9f92486b9ab1868a0f84917ab551cffae Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 22 Aug 2013 22:57:26 -0400 Subject: [PATCH 026/544] Fixed Config Loading Bug Fixed a problem that caused bundled configs to not load sometimes. --- .../mod_pocketDim/helpers/DungeonHelper.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 7151624..ac2fcfd 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -190,7 +190,16 @@ public class DungeonHelper if (pack == null) { //Load the pack's configuration file - String configPath = directory + File.separator + STANDARD_CONFIG_FILE_NAME; + + String configPath; + if (isInternal) + { + configPath = directory + "/" + STANDARD_CONFIG_FILE_NAME; + } + else + { + configPath = directory + File.separator + STANDARD_CONFIG_FILE_NAME; + } DungeonPackConfig config = loadDungeonPackConfig(configPath, name, isInternal, reader); if (config == null) { -- 2.39.5 From a1a9e39caa923ad7f2d7ac4bfc411aa9ef7ca648 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Fri, 23 Aug 2013 01:30:24 -0400 Subject: [PATCH 027/544] Minor fixes Rift placement with /dd-rift is fixed Signs rotate properly consistent behavior for wooden dim doors in pockets and dungeons --- .../commands/CommandCreateDungeonRift.java | 7 +- .../dungeon/DungeonSchematic.java | 5 +- .../mod_pocketDim/schematic/BlockRotator.java | 73 +++++++++++++++++++ 3 files changed, 80 insertions(+), 5 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java index 3259ca4..81c50f7 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java @@ -4,6 +4,7 @@ import java.io.File; import java.util.Collection; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.MathHelper; import StevenDimDoors.mod_pocketDim.DungeonGenerator; import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; @@ -56,9 +57,9 @@ public class CommandCreateDungeonRift extends DDCommandBase else { DungeonGenerator result; - int x = (int) sender.posX; - int y = (int) sender.posY; - int z = (int) sender.posZ; + int x = MathHelper.floor_double(sender.posX); + int y = MathHelper.floor_double(sender.posY); + int z = MathHelper.floor_double (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")) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index cae2fb4..23f0156 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -338,7 +338,7 @@ public class DungeonSchematic extends Schematic { { sideLink.destDimID = randomLink.locDimID; } - sideLink.destYCoord = yCoordHelper.getFirstUncovered(sideLink.destDimID, linkDestination.getX(), 10, linkDestination.getZ()); + sideLink.destYCoord = yCoordHelper.getFirstUncovered(sideLink.destDimID, linkDestination.getX(), linkDestination.getY(), linkDestination.getZ())-1; if (sideLink.destYCoord < 5) { @@ -347,7 +347,7 @@ public class DungeonSchematic extends Schematic { sideLink.linkOrientation = world.getBlockMetadata(linkDestination.getX(), linkDestination.getY() - 1, linkDestination.getZ()); dimHelper.instance.createLink(sideLink); - dimHelper.instance.createLink(sideLink.destDimID , + /**dimHelper.instance.createLink(sideLink.destDimID , sideLink.locDimID, sideLink.destXCoord, sideLink.destYCoord, @@ -356,6 +356,7 @@ public class DungeonSchematic extends Schematic { sideLink.locYCoord, sideLink.locZCoord, BlockRotator.transformMetadata(sideLink.linkOrientation, 2, Block.doorWood.blockID)); + **/ if (world.getBlockId(linkDestination.getX(), linkDestination.getY() - 3, linkDestination.getZ()) == properties.FabricBlockID) { diff --git a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java index ef160c2..d086d2d 100644 --- a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java +++ b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java @@ -246,6 +246,79 @@ public class BlockRotator break; } } + else if (blockID==Block.signWall.blockID) + { + switch (metadata) + { + + case 3: + metadata = 4; + break; + case 2: + metadata = 5; + break; + case 4: + metadata = 2; + break; + case 5: + metadata = 3; + break; + } + } + else if (blockID==Block.signPost.blockID) + { + 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(blockID== Block.lever.blockID||blockID== Block.stoneButton.blockID||blockID== Block.woodenButton.blockID||blockID== Block.torchWood.blockID||blockID== Block.torchRedstoneIdle.blockID||blockID== Block.torchRedstoneActive.blockID) { switch (metadata) -- 2.39.5 From dd9b1f0c65de7a3cfa5473e232e6e6cfe5b4866d Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Fri, 23 Aug 2013 04:12:56 -0400 Subject: [PATCH 028/544] Started Rewriting LinkData Created NewLinkData and replaced references to the original LinkData. Moved it to the mod_pocketDim.core package. Added Point4D, an immutable point type for 3D integer coordinates with an added dimension ID. --- StevenDimDoors/mod_pocketDim/DimData.java | 52 +++---- .../mod_pocketDim/DungeonGenerator.java | 3 +- .../mod_pocketDim/EventHookContainer.java | 3 +- StevenDimDoors/mod_pocketDim/LinkData.java | 68 --------- .../mod_pocketDim/PacketHandler.java | 21 +-- .../mod_pocketDim/RiftGenerator.java | 7 +- .../mod_pocketDim/SchematicLoader.java | 5 +- .../mod_pocketDim/TileEntityRift.java | 5 +- .../mod_pocketDim/TransientDoor.java | 3 +- .../blocks/BlockDimWallPerm.java | 6 +- .../mod_pocketDim/blocks/ChaosDoor.java | 8 +- .../mod_pocketDim/blocks/ExitDoor.java | 2 +- .../mod_pocketDim/blocks/dimDoor.java | 12 +- .../mod_pocketDim/blocks/dimHatch.java | 4 +- .../commands/CommandCreateDungeonRift.java | 4 +- .../commands/CommandCreatePocket.java | 4 +- .../commands/CommandDeleteAllLinks.java | 6 +- .../commands/CommandDeleteDimensionData.java | 6 +- .../commands/CommandDeleteRifts.java | 6 +- .../commands/CommandPrintDimensionData.java | 6 +- .../commands/CommandPruneDimensions.java | 6 +- .../mod_pocketDim/core/NewLinkData.java | 36 +++++ .../dungeon/DungeonSchematic.java | 10 +- .../dungeon/pack/DungeonPack.java | 4 +- .../mod_pocketDim/helpers/DungeonHelper.java | 16 +-- .../mod_pocketDim/helpers/dimHelper.java | 76 +++++----- .../mod_pocketDim/helpers/yCoordHelper.java | 4 +- .../mod_pocketDim/items/ItemRiftBlade.java | 6 +- .../items/ItemStabilizedRiftSignature.java | 4 +- .../mod_pocketDim/items/ItemStableFabric.java | 4 +- .../mod_pocketDim/items/itemDimDoor.java | 4 +- .../items/itemLinkSignature.java | 4 +- .../mod_pocketDim/mod_pocketDim.java | 3 +- .../mod_pocketDim/pocketTeleporter.java | 5 +- .../mod_pocketDim/ticking/MobMonolith.java | 4 +- .../ticking/RiftRegenerator.java | 6 +- .../mod_pocketDim/util/Point4D.java | 131 ++++++++++++++++++ 37 files changed, 332 insertions(+), 222 deletions(-) delete mode 100644 StevenDimDoors/mod_pocketDim/LinkData.java create mode 100644 StevenDimDoors/mod_pocketDim/core/NewLinkData.java create mode 100644 StevenDimDoors/mod_pocketDim/util/Point4D.java diff --git a/StevenDimDoors/mod_pocketDim/DimData.java b/StevenDimDoors/mod_pocketDim/DimData.java index 043856c..bd56b84 100644 --- a/StevenDimDoors/mod_pocketDim/DimData.java +++ b/StevenDimDoors/mod_pocketDim/DimData.java @@ -8,6 +8,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; + import net.minecraft.util.MathHelper; import net.minecraft.world.World; @@ -19,7 +21,7 @@ public class DimData implements Serializable public World world; - public LinkData exitDimLink; + public NewLinkData exitDimLink; public boolean isPocket; public boolean hasBeenFilled=false; @@ -27,13 +29,13 @@ public class DimData implements Serializable public boolean isDimRandomRift=false; public DungeonGenerator dungeonGenerator = null; //public boolean isPrivatePocket = false; - public HashMap>> linksInThisDim = new HashMap(); - HashMap dimX; - HashMap> dimY ; + public HashMap>> linksInThisDim = new HashMap(); + HashMap dimX; + HashMap> dimY ; static final long serialVersionUID = 454342L; - public DimData(int dimID, boolean isPocket, int depth, LinkData exitLinkData) + public DimData(int dimID, boolean isPocket, int depth, NewLinkData exitLinkData) { this.dimID=dimID; this.depth=depth; @@ -44,12 +46,12 @@ public class DimData implements Serializable public DimData(int dimID, boolean isPocket, int depth, int exitLinkDimID, int exitX, int exitY, int exitZ) { - this(dimID, isPocket, depth, new LinkData(exitLinkDimID, exitX, exitY, exitZ)); + this(dimID, isPocket, depth, new NewLinkData(exitLinkDimID, exitX, exitY, exitZ)); } - public LinkData findNearestRift(World world, int range, int x, int y, int z) + public NewLinkData findNearestRift(World world, int range, int x, int y, int z) { - LinkData nearest=null; + NewLinkData nearest=null; float distance=range+1; int i=-range; int j=-range; @@ -89,7 +91,7 @@ public class DimData implements Serializable public ArrayList findRiftsInRange(World world, int range, int x, int y, int z) { - LinkData nearest=null; + NewLinkData nearest=null; ArrayList rifts = new ArrayList(); int i=-range; int j=-range; @@ -132,7 +134,7 @@ public class DimData implements Serializable - public LinkData addLinkToDim(LinkData link) + public NewLinkData addLinkToDim(NewLinkData link) { if(this.linksInThisDim.containsKey(link.locZCoord)) { @@ -144,13 +146,13 @@ public class DimData implements Serializable } else { - this.dimX=new HashMap(); + this.dimX=new HashMap(); } } else { - this.dimX=new HashMap(); - this.dimY=new HashMap>(); + this.dimX=new HashMap(); + this.dimY=new HashMap>(); } this.dimX.put(link.locXCoord, link); @@ -162,9 +164,9 @@ public class DimData implements Serializable } - public LinkData addLinkToDim( int destinationDimID, int locationXCoord, int locationYCoord, int locationZCoord, int destinationXCoord, int destinationYCoord, int destinationZCoord, int linkOrientation) + public NewLinkData addLinkToDim( int destinationDimID, int locationXCoord, int locationYCoord, int locationZCoord, int destinationXCoord, int destinationYCoord, int destinationZCoord, int linkOrientation) { - LinkData linkData= new LinkData(this.dimID, destinationDimID, locationXCoord, locationYCoord, locationZCoord, destinationXCoord, destinationYCoord,destinationZCoord,this.isPocket,linkOrientation); + NewLinkData linkData= new NewLinkData(this.dimID, destinationDimID, locationXCoord, locationYCoord, locationZCoord, destinationXCoord, destinationYCoord,destinationZCoord,this.isPocket,linkOrientation); return this.addLinkToDim(linkData); } @@ -174,7 +176,7 @@ public class DimData implements Serializable return (this.dimID == DDProperties.instance().LimboDimensionID); } - public void removeLinkAtCoords(LinkData link) + public void removeLinkAtCoords(NewLinkData link) { this.removeLinkAtCoords(link.locDimID, link.locXCoord, link.locYCoord, link.locZCoord); } @@ -191,13 +193,13 @@ public class DimData implements Serializable } else { - this.dimX=new HashMap(); + this.dimX=new HashMap(); } } else { - this.dimX=new HashMap(); - this.dimY=new HashMap>(); + this.dimX=new HashMap(); + this.dimY=new HashMap>(); } this.dimX.remove(locationXCoord); @@ -205,7 +207,7 @@ public class DimData implements Serializable this.linksInThisDim.put(locationZCoord, dimY); } - public LinkData findLinkAtCoords(int locationXCoord, int locationYCoord, int locationZCoord) + public NewLinkData findLinkAtCoords(int locationXCoord, int locationYCoord, int locationZCoord) { try { @@ -232,21 +234,21 @@ public class DimData implements Serializable return null; } - public ArrayList getLinksInDim() + public ArrayList getLinksInDim() { //TODO: We might want to modify this function, but I'm afraid of breaking something right now. //To begin with, the name is wrong. This doesn't print anything! >_o ~SenseiKiwi - ArrayList links = new ArrayList(); + ArrayList links = new ArrayList(); if (this.linksInThisDim == null) { return links; } - for (HashMap> first : this.linksInThisDim.values()) + for (HashMap> first : this.linksInThisDim.values()) { - for (HashMap second : first.values()) + for (HashMap second : first.values()) { - for (LinkData linkData : second.values()) + for (NewLinkData linkData : second.values()) { links.add(linkData); } diff --git a/StevenDimDoors/mod_pocketDim/DungeonGenerator.java b/StevenDimDoors/mod_pocketDim/DungeonGenerator.java index 0500e76..861bed7 100644 --- a/StevenDimDoors/mod_pocketDim/DungeonGenerator.java +++ b/StevenDimDoors/mod_pocketDim/DungeonGenerator.java @@ -5,6 +5,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonType; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; @@ -18,7 +19,7 @@ public class DungeonGenerator implements Serializable public int weight; public String schematicPath; public ArrayList sideRifts = new ArrayList(); - public LinkData exitLink; + public NewLinkData exitLink; public boolean isOpen; public int sideDoorsSoFar=0; diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index d2e12b1..24f67b5 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -6,6 +6,7 @@ import net.minecraftforge.event.ForgeSubscribe; import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.entity.player.PlayerDropsEvent; import net.minecraftforge.event.world.WorldEvent; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -55,7 +56,7 @@ public class EventHookContainer if (dimHelper.dimList.containsKey(dimensionID)) { - for (LinkData link : dimHelper.instance.getDimData(dimensionID).getLinksInDim()) + for (NewLinkData link : dimHelper.instance.getDimData(dimensionID).getLinksInDim()) { if (!mod_pocketDim.blockRift.isBlockImmune(world, link.locXCoord, link.locYCoord, link.locZCoord)) { diff --git a/StevenDimDoors/mod_pocketDim/LinkData.java b/StevenDimDoors/mod_pocketDim/LinkData.java deleted file mode 100644 index eab4ec6..0000000 --- a/StevenDimDoors/mod_pocketDim/LinkData.java +++ /dev/null @@ -1,68 +0,0 @@ -package StevenDimDoors.mod_pocketDim; - -import java.io.Serializable; - -public class LinkData implements Serializable -{ - - public int locXCoord; - public int locYCoord; - public int locZCoord; - - public int destXCoord; - public int destYCoord; - public int destZCoord; - public int numberofChildren; - public boolean isLocPocket; - public int linkOrientation; - - public int destDimID; - public int locDimID; - - public boolean exists=false; - public boolean hasGennedDoor=false; - - static final long serialVersionUID = 45544342L; - - - public LinkData() - { - this.exists=false; - } - - public LinkData(int exitLinkDimID, int exitX, int exitY, int exitZ) - { - this.destDimID=exitLinkDimID; - this.destXCoord=exitX; - this.destYCoord=exitY; - this.destZCoord=exitZ; - } - - public LinkData(int locationDimID, int destinationDimID, int locationXCoord, int locationYCoord, int locationZCoord, int destinationXCoord, int destinationYCoord, int destinationZCoord, boolean isPocket,int orientation) - { - this.exists = true; - this.locXCoord=locationXCoord; - this.locYCoord=locationYCoord; - this.locZCoord=locationZCoord; - - this.destXCoord=destinationXCoord; - this.destYCoord=destinationYCoord; - this.destZCoord=destinationZCoord; - - this.destDimID=destinationDimID; - this.locDimID=locationDimID; - this.isLocPocket=isPocket; - this.linkOrientation=orientation; - } - - public String printLinkData() - { - //TODO: Rewrite this to make it prettier. @_@ I'm afraid of changing it to ToString() on the off - //chance it'll cause explosions and sadness. Damn serialization! ~SenseiKiwi - - String linkInfo; - linkInfo = String.valueOf(this.locDimID) + "locDimID "+String.valueOf(this.locXCoord)+":locXCoord "+String.valueOf(this.locYCoord)+":locYCoord "+String.valueOf(this.locZCoord)+":locZCoord "; - linkInfo.concat("\n"+ String.valueOf(this.destDimID)+"DestDimID "+String.valueOf(this.destXCoord)+":destXCoord "+String.valueOf(this.destYCoord)+":destYCoord "+String.valueOf(this.destZCoord)+":destZCoord "); - return linkInfo; - } -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/PacketHandler.java b/StevenDimDoors/mod_pocketDim/PacketHandler.java index 38a2d50..a12ef35 100644 --- a/StevenDimDoors/mod_pocketDim/PacketHandler.java +++ b/StevenDimDoors/mod_pocketDim/PacketHandler.java @@ -14,6 +14,7 @@ import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import com.google.common.io.ByteArrayDataInput; @@ -105,7 +106,7 @@ public class PacketHandler implements IPacketHandler { DimData dimDataToAddLink= dimHelper.instance.getDimData(dimId); - LinkData linkToAdd = new LinkData(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); + NewLinkData linkToAdd = new NewLinkData(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); linkToAdd.hasGennedDoor=data.readBoolean(); dimHelper.instance.createLink(linkToAdd); @@ -130,7 +131,7 @@ public class PacketHandler implements IPacketHandler { DimData dimDataToRemoveFrom= dimHelper.instance.getDimData(dimId); - LinkData linkToAdd = new LinkData(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); + NewLinkData linkToAdd = new NewLinkData(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); dimDataToRemoveFrom.removeLinkAtCoords(linkToAdd.locDimID, linkToAdd.locXCoord,linkToAdd.locYCoord, linkToAdd.locZCoord); } @@ -144,7 +145,7 @@ public class PacketHandler implements IPacketHandler } if(id==this.linkKeyPacketID) { - LinkData link = new LinkData(data.readInt(), data.readInt(), data.readInt(), data.readInt()); + NewLinkData link = new NewLinkData(data.readInt(), data.readInt(), data.readInt(), data.readInt()); dimHelper.instance.interDimLinkList.put(data.readInt(), link); } @@ -168,18 +169,18 @@ public class PacketHandler implements IPacketHandler manager.addToSendQueue(PacketHandler.onDimCreatedPacket(data)); - Collection >> linkList = data.linksInThisDim.values(); + Collection >> linkList = data.linksInThisDim.values(); for(HashMap map : linkList ) { - Collection > linkList2 = map.values(); + Collection > linkList2 = map.values(); for(HashMap map2 : linkList2) { - Collection linkList3 = map2.values(); + Collection linkList3 = map2.values(); - for(LinkData link : linkList3) + for(NewLinkData link : linkList3) { packetsToSend.add(( PacketHandler.onLinkCreatedPacket(link))); @@ -206,7 +207,7 @@ public class PacketHandler implements IPacketHandler } - public static Packet250CustomPayload onLinkCreatedPacket(LinkData link) + public static Packet250CustomPayload onLinkCreatedPacket(NewLinkData link) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dataOut = new DataOutputStream(bos); @@ -247,7 +248,7 @@ public class PacketHandler implements IPacketHandler } - public static Packet250CustomPayload linkKeyPacket(LinkData link, int key) + public static Packet250CustomPayload linkKeyPacket(NewLinkData link, int key) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dataOut = new DataOutputStream(bos); @@ -283,7 +284,7 @@ public class PacketHandler implements IPacketHandler } - public static void onLinkRemovedPacket(LinkData link) + public static void onLinkRemovedPacket(NewLinkData link) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dataOut = new DataOutputStream(bos); diff --git a/StevenDimDoors/mod_pocketDim/RiftGenerator.java b/StevenDimDoors/mod_pocketDim/RiftGenerator.java index 1009b31..5b02031 100644 --- a/StevenDimDoors/mod_pocketDim/RiftGenerator.java +++ b/StevenDimDoors/mod_pocketDim/RiftGenerator.java @@ -7,6 +7,7 @@ import net.minecraft.block.material.Material; import net.minecraft.world.World; import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.common.DimensionManager; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.items.itemDimDoor; import StevenDimDoors.mod_pocketDim.world.LimboProvider; @@ -55,7 +56,7 @@ public class RiftGenerator implements IWorldGenerator int attempts; int correction; boolean valid; - LinkData link; + NewLinkData link; //Check if we're generating things in the Nether if (world.provider.dimensionId == NETHER_DIMENSION_ID) @@ -93,7 +94,7 @@ public class RiftGenerator implements IWorldGenerator //Otherwise, create a one-way link and connect to the destination of the first link. if (link == null) { - link = new LinkData(world.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 0); + link = new NewLinkData(world.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 0); link = dimHelper.instance.createPocket(link, true, true); } else @@ -129,7 +130,7 @@ public class RiftGenerator implements IWorldGenerator { //Create a two-way link between the upper block of the gateway and a pocket dimension //That pocket dimension is where we'll start a dungeon! - link = new LinkData(world.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 0); + link = new NewLinkData(world.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 0); link = dimHelper.instance.createPocket(link, true, true); //If the current dimension isn't Limbo, build a Rift Gateway out of Stone Bricks diff --git a/StevenDimDoors/mod_pocketDim/SchematicLoader.java b/StevenDimDoors/mod_pocketDim/SchematicLoader.java index 630b21f..62e357e 100644 --- a/StevenDimDoors/mod_pocketDim/SchematicLoader.java +++ b/StevenDimDoors/mod_pocketDim/SchematicLoader.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.Random; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; @@ -15,7 +16,7 @@ public class SchematicLoader { private SchematicLoader() { } - public static boolean generateDungeonPocket(LinkData link, DDProperties properties) + public static boolean generateDungeonPocket(NewLinkData link, DDProperties properties) { if (link == null || properties == null) { @@ -155,7 +156,7 @@ public class SchematicLoader return dungeon; } - private static long computeDestinationHash(LinkData link) + private static long computeDestinationHash(NewLinkData link) { //Time for some witchcraft. //The code here is inspired by a discussion on Stack Overflow regarding hash codes for 3D. diff --git a/StevenDimDoors/mod_pocketDim/TileEntityRift.java b/StevenDimDoors/mod_pocketDim/TileEntityRift.java index e15ba5c..cfff50f 100644 --- a/StevenDimDoors/mod_pocketDim/TileEntityRift.java +++ b/StevenDimDoors/mod_pocketDim/TileEntityRift.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Random; import StevenDimDoors.mod_pocketDim.blocks.BlockRift; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; @@ -41,7 +42,7 @@ public class TileEntityRift extends TileEntity public int age = 0; public HashMap renderingCenters = new HashMap(); - public LinkData nearestRiftData; + public NewLinkData nearestRiftData; public int spawnedEndermenID=0; Random rand; DataWatcher watcher = new DataWatcher(); @@ -243,7 +244,7 @@ public class TileEntityRift extends TileEntity if (growCount<100) { - LinkData link = dimHelper.instance.getLinkDataFromCoords(this.xCoord, this.yCoord, this.zCoord, worldObj); + NewLinkData link = dimHelper.instance.getLinkDataFromCoords(this.xCoord, this.yCoord, this.zCoord, worldObj); if(link!=null) { if(!this.hasGrownRifts&&rand.nextInt(3)==0) diff --git a/StevenDimDoors/mod_pocketDim/TransientDoor.java b/StevenDimDoors/mod_pocketDim/TransientDoor.java index 3df173b..47a0445 100644 --- a/StevenDimDoors/mod_pocketDim/TransientDoor.java +++ b/StevenDimDoors/mod_pocketDim/TransientDoor.java @@ -3,6 +3,7 @@ package StevenDimDoors.mod_pocketDim; import java.util.Random; import StevenDimDoors.mod_pocketDim.blocks.ExitDoor; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import net.minecraft.block.Block; @@ -86,7 +87,7 @@ public class TransientDoor extends ExitDoor - LinkData linkData= dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World); + NewLinkData linkData= dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World); if(linkData!=null) { if(dimHelper.dimList.containsKey(linkData.destDimID)) diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java index 95289a9..0e047e5 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java @@ -12,8 +12,8 @@ import net.minecraft.world.World; import net.minecraft.world.WorldServer; import StevenDimDoors.mod_pocketDim.BlankTeleporter; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import cpw.mods.fml.common.FMLCommonHandler; @@ -51,10 +51,10 @@ public class BlockDimWallPerm extends Block { Random rand = new Random(); - LinkData link=dimHelper.instance.getRandomLinkData(false); + NewLinkData link=dimHelper.instance.getRandomLinkData(false); if(link==null) { - link =new LinkData(0,0,0,0); + link =new NewLinkData(0,0,0,0); } link.destDimID = 0; link.locDimID = par1World.provider.dimensionId; diff --git a/StevenDimDoors/mod_pocketDim/blocks/ChaosDoor.java b/StevenDimDoors/mod_pocketDim/blocks/ChaosDoor.java index 82447ee..bf621ee 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/ChaosDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/ChaosDoor.java @@ -3,8 +3,8 @@ package StevenDimDoors.mod_pocketDim.blocks; import java.util.Random; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import net.minecraft.block.Block; @@ -76,7 +76,7 @@ public class ChaosDoor extends dimDoor if(newDim) { - LinkData link = new LinkData(par1World.provider.dimensionId, properties.LimboDimensionID, par2, par3, par4, par2, par3+500, par4, false,0); + NewLinkData link = new NewLinkData(par1World.provider.dimensionId, properties.LimboDimensionID, par2, par3, par4, par2, par3+500, par4, false,0); link.linkOrientation= par1World.getBlockMetadata(par2, par3-1, par4); dimHelper.instance.createLink(link); // System.out.println(link.linkOrientation); @@ -118,7 +118,7 @@ public class ChaosDoor extends dimDoor { i++; - LinkData link = (LinkData) dimHelper.instance.getRandomLinkData(false); + NewLinkData link = (NewLinkData) dimHelper.instance.getRandomLinkData(false); if(link!=null) { @@ -127,7 +127,7 @@ public class ChaosDoor extends dimDoor { foundRandomDest=true; - dimHelper.instance.traverseDimDoor(par1World, new LinkData(link.destDimID,link.locDimID,link.destXCoord,link.destYCoord,link.destZCoord,link.locXCoord,link.locYCoord,link.locZCoord,link.isLocPocket,0), par5Entity); + dimHelper.instance.traverseDimDoor(par1World, new NewLinkData(link.destDimID,link.locDimID,link.destXCoord,link.destYCoord,link.destZCoord,link.locXCoord,link.locYCoord,link.locZCoord,link.isLocPocket,0), par5Entity); if(dimHelper.getWorld(link.locDimID)!=null) { diff --git a/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java b/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java index 1d48443..346b5cd 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java @@ -3,8 +3,8 @@ package StevenDimDoors.mod_pocketDim.blocks; import java.util.Random; import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; diff --git a/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java index 5e94326..86dc8c9 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java @@ -3,9 +3,9 @@ package StevenDimDoors.mod_pocketDim.blocks; import java.util.Random; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.TileEntityDimDoor; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; @@ -59,19 +59,19 @@ public class dimDoor extends BlockContainer { if(dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World)!=null) { - LinkData link= dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World); + NewLinkData link= dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World); par1World.setBlock(par2, par3, par4, properties.RiftBlockID); } if(dimHelper.instance.getLinkDataFromCoords(par2, par3-1, par4, par1World)!=null) { - LinkData link= dimHelper.instance.getLinkDataFromCoords(par2, par3-1, par4, par1World); + NewLinkData link= dimHelper.instance.getLinkDataFromCoords(par2, par3-1, par4, par1World); par1World.setBlock(par2, par3-1, par4, properties.RiftBlockID); } if(dimHelper.instance.getLinkDataFromCoords(par2, par3+1, par4, par1World)!=null) { - LinkData link= dimHelper.instance.getLinkDataFromCoords(par2, par3+1, par4, par1World); + NewLinkData link= dimHelper.instance.getLinkDataFromCoords(par2, par3+1, par4, par1World); par1World.setBlock(par2, par3+1, par4, properties.RiftBlockID); } @@ -89,7 +89,7 @@ public class dimDoor extends BlockContainer int var12 = (int) (MathHelper.floor_double((double)((par5Entity.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); int num=0; - LinkData linkData=null; + NewLinkData linkData=null; if(par1World.getBlockId(par2, par3-1, par4)==this.blockID) { @@ -264,7 +264,7 @@ public class dimDoor extends BlockContainer - LinkData link = new LinkData(par1World.provider.dimensionId, 0, par2, par3, par4, par2, par3, par4, true,par1World.getBlockMetadata(par2, par3-1, par4)); + NewLinkData link = new NewLinkData(par1World.provider.dimensionId, 0, par2, par3, par4, par2, par3, par4, true,par1World.getBlockMetadata(par2, par3-1, par4)); dimHelper.instance.createPocket(link,true, false); // System.out.println(link.linkOrientation); diff --git a/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java b/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java index cb27839..a7ad487 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java +++ b/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java @@ -1,8 +1,8 @@ package StevenDimDoors.mod_pocketDim.blocks; import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.world.PocketProvider; import net.minecraft.block.BlockTrapDoor; @@ -55,7 +55,7 @@ public class dimHatch extends BlockTrapDoor DimData dimData = (DimData) dimHelper.instance.dimList.get(par1World.provider.dimensionId); - LinkData exitLink=dimData.exitDimLink; + NewLinkData exitLink=dimData.exitDimLink; exitLink.locDimID=par1World.provider.dimensionId; diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java index 81c50f7..f444170 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java @@ -6,7 +6,7 @@ import java.util.Collection; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.MathHelper; import StevenDimDoors.mod_pocketDim.DungeonGenerator; -import StevenDimDoors.mod_pocketDim.LinkData; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; @@ -60,7 +60,7 @@ public class CommandCreateDungeonRift extends DDCommandBase int x = MathHelper.floor_double(sender.posX); int y = MathHelper.floor_double(sender.posY); int z = MathHelper.floor_double (sender.posZ); - LinkData link = new LinkData(sender.worldObj.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 3); + NewLinkData link = new NewLinkData(sender.worldObj.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 3); if (command[0].equals("random")) { diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandCreatePocket.java b/StevenDimDoors/mod_pocketDim/commands/CommandCreatePocket.java index 27a0d5f..7b685f3 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandCreatePocket.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandCreatePocket.java @@ -1,7 +1,7 @@ package StevenDimDoors.mod_pocketDim.commands; import net.minecraft.entity.player.EntityPlayer; -import StevenDimDoors.mod_pocketDim.LinkData; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; public class CommandCreatePocket extends DDCommandBase @@ -39,7 +39,7 @@ public class CommandCreatePocket extends DDCommandBase int x = (int) sender.posX; int y = (int) sender.posY; int z = (int) sender.posZ; - LinkData link = DungeonHelper.instance().createCustomDungeonDoor(sender.worldObj, x, y, z); + NewLinkData link = DungeonHelper.instance().createCustomDungeonDoor(sender.worldObj, x, y, z); //Notify the player sender.sendChatToPlayer("Created a door to a pocket dimension (Dimension ID = " + link.destDimID + "). Please build your dungeon there."); diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteAllLinks.java b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteAllLinks.java index f48b352..1133cb1 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteAllLinks.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteAllLinks.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.LinkData; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; public class CommandDeleteAllLinks extends DDCommandBase @@ -57,9 +57,9 @@ public class CommandDeleteAllLinks extends DDCommandBase if(dimHelper.dimList.containsKey(targetDim)) { DimData dim = dimHelper.instance.getDimData(targetDim); - ArrayList linksInDim = dim.getLinksInDim(); + ArrayList linksInDim = dim.getLinksInDim(); - for (LinkData link : linksInDim) + for (NewLinkData link : linksInDim) { World targetWorld = dimHelper.getWorld(targetDim); diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteDimensionData.java b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteDimensionData.java index 4c2242f..75b6513 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteDimensionData.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteDimensionData.java @@ -5,7 +5,7 @@ import java.util.Collection; import net.minecraft.entity.player.EntityPlayer; import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.LinkData; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; public class CommandDeleteDimensionData extends DDCommandBase @@ -60,10 +60,10 @@ public class CommandDeleteDimensionData extends DDCommandBase { for(DimData dimData :dimHelper.dimList.values()) { - Collection links= new ArrayList(); + Collection links= new ArrayList(); links.addAll( dimData.getLinksInDim()); - for(LinkData link : links) + for(NewLinkData link : links) { if(link.destDimID==targetDim) { diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteRifts.java b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteRifts.java index 1e22fea..d3c925d 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteRifts.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteRifts.java @@ -5,8 +5,8 @@ import java.util.ArrayList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; public class CommandDeleteRifts extends DDCommandBase @@ -58,9 +58,9 @@ public class CommandDeleteRifts extends DDCommandBase if(dimHelper.dimList.containsKey(targetDim)) { DimData dim = dimHelper.instance.getDimData(targetDim); - ArrayList linksInDim = dim.getLinksInDim(); + ArrayList linksInDim = dim.getLinksInDim(); - for(LinkData link : linksInDim) + for(NewLinkData link : linksInDim) { World targetWorld = dimHelper.getWorld(targetDim); diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandPrintDimensionData.java b/StevenDimDoors/mod_pocketDim/commands/CommandPrintDimensionData.java index 427a8bf..14105d5 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandPrintDimensionData.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandPrintDimensionData.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import net.minecraft.entity.player.EntityPlayer; import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.LinkData; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; public class CommandPrintDimensionData extends DDCommandBase @@ -56,11 +56,11 @@ public class CommandPrintDimensionData extends DDCommandBase return DDCommandResult.UNREGISTERED_DIMENSION; } - ArrayList links = dimData.getLinksInDim(); + ArrayList links = dimData.getLinksInDim(); sender.sendChatToPlayer("Dimension ID = " + dimData.dimID); sender.sendChatToPlayer("Dimension Depth = " + dimData.depth); - for (LinkData link : links) + for (NewLinkData link : links) { sender.sendChatToPlayer(link.printLinkData()); } diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandPruneDimensions.java b/StevenDimDoors/mod_pocketDim/commands/CommandPruneDimensions.java index dacb16e..5145b9a 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandPruneDimensions.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandPruneDimensions.java @@ -7,7 +7,7 @@ import java.util.Set; import net.minecraft.entity.player.EntityPlayer; import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.LinkData; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; public class CommandPruneDimensions extends DDCommandBase @@ -47,12 +47,12 @@ public class CommandPruneDimensions extends DDCommandBase for (DimData data : allDims) { - for (LinkData link : data.getLinksInDim()) + for (NewLinkData link : data.getLinksInDim()) { linkedDimensions.add(link.destDimID); } } - for (LinkData link : dimHelper.instance.interDimLinkList.values()) + for (NewLinkData link : dimHelper.instance.interDimLinkList.values()) { linkedDimensions.add(link.destDimID); } diff --git a/StevenDimDoors/mod_pocketDim/core/NewLinkData.java b/StevenDimDoors/mod_pocketDim/core/NewLinkData.java new file mode 100644 index 0000000..c2deee1 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/core/NewLinkData.java @@ -0,0 +1,36 @@ +package StevenDimDoors.mod_pocketDim.core; + +import java.io.Serializable; + +import StevenDimDoors.mod_pocketDim.util.Point4D; + +public class NewLinkData implements Serializable +{ + private static final long serialVersionUID = 1462177151401498444L; + + private Point4D source; + private Point4D destination; + + public NewLinkData(int srcX, int srcY, int srcZ, int srcDimension) + { + source = new Point4D(srcX, srcY, srcZ, srcDimension); + destination = null; + } + + public NewLinkData(int srcX, int srcY, int srcZ, int srcDimension, int dstX, int dstY, int dstZ, int dstDimension) + { + source = new Point4D(srcX, srcY, srcZ, srcDimension); + destination = new Point4D(dstX, dstY, dstZ, dstDimension); + } + + public NewLinkData(Point4D source, Point 4D destination) + { + + } + + @Override + public String toString() + { + return source + " -> " + destination; + } +} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 23f0156..60b0073 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -17,8 +17,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.Point3D; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; @@ -295,7 +295,7 @@ public class DungeonSchematic extends Schematic { //Set the orientation of the rift exit Point3D entranceRiftLocation = entrance.clone(); BlockRotator.transformPoint(entranceRiftLocation, entrance, rotation, pocketCenter); - LinkData sideLink = dimHelper.instance.getLinkDataFromCoords( + NewLinkData sideLink = dimHelper.instance.getLinkDataFromCoords( entranceRiftLocation.getX(), entranceRiftLocation.getY(), entranceRiftLocation.getZ(), @@ -319,8 +319,8 @@ public class DungeonSchematic extends Schematic { int blockDirection = world.getBlockMetadata(location.getX(), location.getY() - 1, location.getZ()); Point3D linkDestination = location.clone(); - LinkData randomLink = dimHelper.instance.getRandomLinkData(false); - LinkData sideLink = new LinkData(destDimID, + NewLinkData randomLink = dimHelper.instance.getRandomLinkData(false); + NewLinkData sideLink = new NewLinkData(destDimID, dimHelper.instance.getDimData(originDimID).exitDimLink.destDimID, location.getX(), location.getY(), @@ -405,7 +405,7 @@ public class DungeonSchematic extends Schematic { BlockRotator.transformPoint(linkDestination, zeroPoint, blockDirection - BlockRotator.EAST_DOOR_METADATA, location); //Create the link between our current door and its intended exit in destination pocket - LinkData sideLink = new LinkData(destDimID, 0, + NewLinkData sideLink = new NewLinkData(destDimID, 0, location.getX(), location.getY(), location.getZ(), diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java index 3e82c28..c2388bb 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java @@ -8,7 +8,7 @@ import java.util.Random; import net.minecraft.util.WeightedRandom; import StevenDimDoors.mod_pocketDim.DungeonGenerator; -import StevenDimDoors.mod_pocketDim.LinkData; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.util.WeightedContainer; @@ -123,7 +123,7 @@ public class DungeonPack } } - public DungeonGenerator getNextDungeon(LinkData inbound, Random random) + public DungeonGenerator getNextDungeon(NewLinkData inbound, Random random) { if (allDungeons.isEmpty()) { diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index ac2fcfd..fa44b8f 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -22,8 +22,8 @@ import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.DimData; import StevenDimDoors.mod_pocketDim.DungeonGenerator; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; @@ -290,10 +290,10 @@ public class DungeonHelper return pack; } - public LinkData createCustomDungeonDoor(World world, int x, int y, int z) + public NewLinkData createCustomDungeonDoor(World world, int x, int y, int z) { //Create a link above the specified position. Link to a new pocket dimension. - LinkData link = new LinkData(world.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 3); + NewLinkData link = new NewLinkData(world.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 3); link = dimHelper.instance.createPocket(link, true, false); //Place a Warp Door linked to that pocket @@ -530,7 +530,7 @@ public class DungeonHelper } } - public void generateDungeonLink(LinkData inbound, DungeonPack pack, Random random) + public void generateDungeonLink(NewLinkData inbound, DungeonPack pack, Random random) { DungeonGenerator selection; DungeonPackConfig config; @@ -658,7 +658,7 @@ public class DungeonHelper for (int count = 1; count < maxSize && found; count++) { found = false; - for (LinkData link : tailDim.getLinksInDim()) + for (NewLinkData link : tailDim.getLinksInDim()) { DimData neighbor = dimHelper.instance.getDimData(link.destDimID); if (neighbor.depth == tailDim.depth - 1 && neighbor.dungeonGenerator != null && @@ -674,7 +674,7 @@ public class DungeonHelper return history; } - private static int getPackDepth(LinkData inbound, DungeonPack pack) + private static int getPackDepth(NewLinkData inbound, DungeonPack pack) { //TODO: I've improved this code for the time being. However, searching across links is a flawed approach. A player could //manipulate the output of this function by setting up links to mislead our algorithm or by removing links. @@ -688,7 +688,7 @@ public class DungeonHelper do { found = false; - for (LinkData link : tailDim.getLinksInDim()) + for (NewLinkData link : tailDim.getLinksInDim()) { DimData neighbor = dimHelper.instance.getDimData(link.destDimID); if (neighbor.depth == tailDim.depth - 1 && neighbor.dungeonGenerator != null && @@ -728,7 +728,7 @@ public class DungeonHelper while (dungeons.size() < maxSize && !pendingDimensions.isEmpty()) { DimData current = pendingDimensions.remove(); - for (LinkData link : current.getLinksInDim()) + for (NewLinkData link : current.getLinksInDim()) { DimData child = helper.getDimData(link.destDimID); if (child.depth == current.depth + 1 && child.dungeonGenerator != null && checked.add(child)) diff --git a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java b/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java index 0324072..c07f9f5 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java @@ -35,13 +35,13 @@ import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.ObjectSaveInputStream; import StevenDimDoors.mod_pocketDim.PacketHandler; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.SchematicLoader; import StevenDimDoors.mod_pocketDim.TileEntityRift; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import StevenDimDoors.mod_pocketDim.world.LimboProvider; import StevenDimDoors.mod_pocketDim.world.PocketProvider; @@ -79,7 +79,7 @@ public class dimHelper extends DimensionManager * HashMap for temporary storage of Link Signature damage hash values. See itemLinkSignature for more details * @Return */ - public HashMap interDimLinkList= new HashMap(); + public HashMap interDimLinkList= new HashMap(); /** * ArrayList containing all link data not sorted for easy random access, used for random doors and for recreating rifts if they have a block placed over them. @@ -103,7 +103,7 @@ public class dimHelper extends DimensionManager } // GreyMaria: My god, what a mess. Here, let me clean it up a bit. - public Entity teleportEntity(World world, Entity entity, LinkData link) //this beautiful teleport method is based off of xCompWiz's teleport function. + public Entity teleportEntity(World world, Entity entity, NewLinkData link) //this beautiful teleport method is based off of xCompWiz's teleport function. { WorldServer oldWorld = (WorldServer)world; WorldServer newWorld; @@ -260,7 +260,7 @@ public class dimHelper extends DimensionManager * @param orientation- the orientation of the door used to teleport, determines player orientation and door placement on arrival * @Return */ - public void traverseDimDoor(World world,LinkData linkData, Entity entity) + public void traverseDimDoor(World world,NewLinkData linkData, Entity entity) { DDProperties properties = DDProperties.instance(); @@ -355,7 +355,7 @@ public class dimHelper extends DimensionManager * @return */ - public LinkData createLink( int locationDimID, int destinationDimID, int locationXCoord, int locationYCoord, int locationZCoord, int destinationXCoord, int destinationYCoord, int destinationZCoord) + public NewLinkData createLink( int locationDimID, int destinationDimID, int locationXCoord, int locationYCoord, int locationZCoord, int destinationXCoord, int destinationYCoord, int destinationZCoord) { if(this.getLinkDataFromCoords(locationXCoord, locationYCoord, locationZCoord, locationDimID)!=null) { @@ -381,13 +381,13 @@ public class dimHelper extends DimensionManager * @param linkOrientation * @return */ - public LinkData createLink( int locationDimID, int destinationDimID, int locationXCoord, int locationYCoord, int locationZCoord, int destinationXCoord, int destinationYCoord, int destinationZCoord,int linkOrientation) + public NewLinkData createLink( int locationDimID, int destinationDimID, int locationXCoord, int locationYCoord, int locationZCoord, int destinationXCoord, int destinationYCoord, int destinationZCoord,int linkOrientation) { - LinkData linkData =new LinkData( locationDimID, destinationDimID, locationXCoord, locationYCoord, locationZCoord, destinationXCoord, destinationYCoord ,destinationZCoord,false,linkOrientation); + NewLinkData linkData =new NewLinkData( locationDimID, destinationDimID, locationXCoord, locationYCoord, locationZCoord, destinationXCoord, destinationYCoord ,destinationZCoord,false,linkOrientation); return this.createLink(linkData); } - public LinkData createLink(LinkData link) + public NewLinkData createLink(NewLinkData link) { DDProperties properties = DDProperties.instance(); @@ -421,11 +421,11 @@ public class dimHelper extends DimensionManager return link; } - public int getDestOrientation(LinkData link) + public int getDestOrientation(NewLinkData link) { if(link !=null) { - LinkData destLink = this.getLinkDataFromCoords(link.destXCoord, link.destYCoord, link.destZCoord, link.destDimID); + NewLinkData destLink = this.getLinkDataFromCoords(link.destXCoord, link.destYCoord, link.destZCoord, link.destDimID); if(destLink!=null) { return destLink.linkOrientation; @@ -443,7 +443,7 @@ public class dimHelper extends DimensionManager } } - public void removeLink(LinkData link) + public void removeLink(NewLinkData link) { this.removeLink(link.locDimID, link.locXCoord, link.locYCoord, link.locZCoord); } @@ -462,7 +462,7 @@ public class dimHelper extends DimensionManager DimData locationDimData= new DimData(locationDimID, false, 0, locationDimID,locationXCoord,locationYCoord,locationZCoord); dimHelper.dimList.put(locationDimID, locationDimData); } - LinkData link = this.getLinkDataFromCoords(locationXCoord, locationYCoord, locationZCoord, locationDimID); + NewLinkData link = this.getLinkDataFromCoords(locationXCoord, locationYCoord, locationZCoord, locationDimID); dimHelper.instance.getDimData(locationDimID).removeLinkAtCoords(link); //updates clients that a rift has been removed if(FMLCommonHandler.instance().getEffectiveSide()==Side.SERVER) @@ -471,7 +471,7 @@ public class dimHelper extends DimensionManager this.save(); } } - public LinkData findNearestRift(World world, int x, int y, int z, int range) + public NewLinkData findNearestRift(World world, int x, int y, int z, int range) { return dimHelper.instance.getDimData(world).findNearestRift(world, range, x, y, z); } @@ -480,7 +480,7 @@ public class dimHelper extends DimensionManager * @param world- door * @param incLink */ - public void generateDoor(World world, LinkData incLink) + public void generateDoor(World world, NewLinkData incLink) { int locX = incLink.locXCoord; int locY = incLink.locYCoord; @@ -504,7 +504,7 @@ public class dimHelper extends DimensionManager { DimensionManager.initDimension(destinationID); } - LinkData destLink = this.getLinkDataFromCoords(destX, destY, destZ, destinationID); + NewLinkData destLink = this.getLinkDataFromCoords(destX, destY, destZ, destinationID); int destOrientation = 0; if(destLink!=null) { @@ -536,7 +536,7 @@ public class dimHelper extends DimensionManager * @param orientation * @return */ - public void generatePocket(LinkData incomingLink) + public void generatePocket(NewLinkData incomingLink) { DDProperties properties = DDProperties.instance(); try @@ -697,10 +697,10 @@ public class dimHelper extends DimensionManager DeleteFolder.deleteFolder(save); dimData.hasBeenFilled = false; dimData.hasDoor = false; - for(LinkData link : dimData.getLinksInDim()) + for(NewLinkData link : dimData.getLinksInDim()) { link.hasGennedDoor = false; - LinkData linkOut = this.getLinkDataFromCoords(link.destXCoord, link.destYCoord, link.destZCoord, link.destDimID); + NewLinkData linkOut = this.getLinkDataFromCoords(link.destXCoord, link.destYCoord, link.destZCoord, link.destDimID); if (linkOut != null) { linkOut.hasGennedDoor = false; @@ -788,7 +788,7 @@ public class dimHelper extends DimensionManager * @param orientation- determines the orientation of the entrance link to this dim. Should be the metaData of the door occupying the rift. -1 if no door. * @return */ - public LinkData createPocket(LinkData link , boolean isGoingDown, boolean isRandomRift) + public NewLinkData createPocket(NewLinkData link , boolean isGoingDown, boolean isRandomRift) { DDProperties properties = DDProperties.instance(); if(dimHelper.getWorld(0)==null) @@ -821,7 +821,7 @@ public class dimHelper extends DimensionManager } if(rand.nextInt(13-depth)==0) { - LinkData link1=getRandomLinkData(false); + NewLinkData link1=getRandomLinkData(false); } } if(locationDimData.isPocket) //determines the qualites of the pocket dim being created, based on parent dim. @@ -969,7 +969,7 @@ public class dimHelper extends DimensionManager try { - this.interDimLinkList = (HashMap) comboSave.get("interDimLinkList"); + this.interDimLinkList = (HashMap) comboSave.get("interDimLinkList"); } catch(Exception e) { @@ -1020,7 +1020,7 @@ public class dimHelper extends DimensionManager try { - this.interDimLinkList=(HashMap) comboSave.get("interDimLinkList"); + this.interDimLinkList=(HashMap) comboSave.get("interDimLinkList"); } catch(Exception e) { @@ -1073,7 +1073,7 @@ public class dimHelper extends DimensionManager - public LinkData getRandomLinkData(boolean allowInPocket) + public NewLinkData getRandomLinkData(boolean allowInPocket) { boolean foundRandomDest=false; int i=0; @@ -1083,7 +1083,7 @@ public class dimHelper extends DimensionManager { i++; DimData dimData; - ArrayList linksInDim = new ArrayList(); + ArrayList linksInDim = new ArrayList(); for(size--;size>0;) { dimData = dimHelper.instance.getDimData((Integer)dimList.keySet().toArray()[rand.nextInt(dimList.keySet().size())]); @@ -1103,7 +1103,7 @@ public class dimHelper extends DimensionManager break; } - LinkData link1 = (LinkData) linksInDim.get(rand.nextInt(linksInDim.size())); + NewLinkData link1 = (NewLinkData) linksInDim.get(rand.nextInt(linksInDim.size())); if(link1!=null) { @@ -1125,7 +1125,7 @@ public class dimHelper extends DimensionManager * @param link * @return */ - public LinkData getLinkDataAtDestination(LinkData link) + public NewLinkData getLinkDataAtDestination(NewLinkData link) { return this.getLinkDataFromCoords(link.destXCoord, link.destYCoord, link.destZCoord, link.destDimID); } @@ -1144,9 +1144,9 @@ public class dimHelper extends DimensionManager * @param updateLinksPointingHere * @return */ - public boolean moveLinkDataLocation(LinkData link, int x,int y, int z, int dimID, boolean updateLinksPointingHere) + public boolean moveLinkDataLocation(NewLinkData link, int x,int y, int z, int dimID, boolean updateLinksPointingHere) { - LinkData linkToMove = this.getLinkDataFromCoords(link.locXCoord, link.locYCoord, link.locZCoord, link.locDimID); + NewLinkData linkToMove = this.getLinkDataFromCoords(link.locXCoord, link.locYCoord, link.locZCoord, link.locDimID); if(linkToMove!=null) { int oldX = linkToMove.locXCoord; @@ -1156,10 +1156,10 @@ public class dimHelper extends DimensionManager if(updateLinksPointingHere) { - ArrayList incomingLinks = new ArrayList(); + ArrayList incomingLinks = new ArrayList(); for(DimData dimData : dimHelper.dimList.values()) { - for(LinkData allLink : dimData.getLinksInDim()) + for(NewLinkData allLink : dimData.getLinksInDim()) { if(this.getLinkDataAtDestination(allLink)==linkToMove) { @@ -1168,7 +1168,7 @@ public class dimHelper extends DimensionManager } } } - this.createLink(new LinkData(dimID,linkToMove.destDimID,x,y,z,linkToMove.destXCoord,linkToMove.destYCoord,linkToMove.destZCoord,linkToMove.isLocPocket,linkToMove.linkOrientation)); + this.createLink(new NewLinkData(dimID,linkToMove.destDimID,x,y,z,linkToMove.destXCoord,linkToMove.destYCoord,linkToMove.destZCoord,linkToMove.isLocPocket,linkToMove.linkOrientation)); if(this.getLinkDataFromCoords(oldX,oldY,oldZ,oldDimID)!=null) { @@ -1189,14 +1189,14 @@ public class dimHelper extends DimensionManager * @param updateLinksAtDestination * @return */ - public boolean moveLinkDataDestination(LinkData link, int x, int y, int z, int dimID, boolean updateLinksAtDestination) + public boolean moveLinkDataDestination(NewLinkData link, int x, int y, int z, int dimID, boolean updateLinksAtDestination) { - LinkData linkToMove = this.getLinkDataFromCoords(link.locXCoord, link.locYCoord, link.locZCoord, link.locDimID); + NewLinkData linkToMove = this.getLinkDataFromCoords(link.locXCoord, link.locYCoord, link.locZCoord, link.locDimID); if(linkToMove!=null) { if(updateLinksAtDestination) { - LinkData linkAtDestination = this.getLinkDataAtDestination(linkToMove); + NewLinkData linkAtDestination = this.getLinkDataAtDestination(linkToMove); if(linkAtDestination!=null) { this.moveLinkDataLocation(linkAtDestination, x, y, z, dimID, false); @@ -1207,7 +1207,7 @@ public class dimHelper extends DimensionManager linkToMove.destYCoord=y; linkToMove.destZCoord=z; this.createLink(linkToMove); - LinkData testLink = this.getLinkDataFromCoords(link.locXCoord, link.locYCoord, link.locZCoord, link.locDimID); + NewLinkData testLink = this.getLinkDataFromCoords(link.locXCoord, link.locYCoord, link.locZCoord, link.locDimID); return true; } @@ -1222,7 +1222,7 @@ public class dimHelper extends DimensionManager * @param par1World * @return */ - public LinkData getLinkDataFromCoords(int x, int y, int z, World par1World) + public NewLinkData getLinkDataFromCoords(int x, int y, int z, World par1World) { return this.getLinkDataFromCoords(x, y, z, par1World.provider.dimensionId); } @@ -1234,7 +1234,7 @@ public class dimHelper extends DimensionManager * @param worldID * @return */ - public LinkData getLinkDataFromCoords(int x, int y, int z, int worldID) + public NewLinkData getLinkDataFromCoords(int x, int y, int z, int worldID) { if(dimHelper.dimList.containsKey(worldID)) { @@ -1261,7 +1261,7 @@ public class dimHelper extends DimensionManager { DDProperties properties = DDProperties.instance(); - LinkData nearest=null; + NewLinkData nearest=null; float distance=range+1; int i=-range; int j=-range; diff --git a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java index dd14838..3f9a4f5 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java @@ -1,6 +1,6 @@ package StevenDimDoors.mod_pocketDim.helpers; -import StevenDimDoors.mod_pocketDim.LinkData; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.world.World; @@ -11,7 +11,7 @@ public class yCoordHelper { private static final int MAXIMUM_UNCOVERED_Y = 245; - public static int getFirstUncovered(LinkData pointerLink) + public static int getFirstUncovered(NewLinkData pointerLink) { return yCoordHelper.getFirstUncovered( pointerLink.destDimID, diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index 7737df4..2ca96a7 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -21,8 +21,8 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -183,7 +183,7 @@ public class ItemRiftBlade extends ItemSword int z = MathHelper.floor_double(var9); int rotation = (int) (MathHelper.floor_double((double)((par3EntityPlayer.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); - LinkData link = new LinkData(par2World.provider.dimensionId, 0, x, y, z, x, y, z, true,rotation); + NewLinkData link = new NewLinkData(par2World.provider.dimensionId, 0, x, y, z, x, y, z, true,rotation); if(this.getMaxItemUseDuration(par1ItemStack)-par4>12&&!par2World.isRemote&&itemDimDoor.canPlace(par2World, x, y, z, rotation)) { @@ -212,7 +212,7 @@ public class ItemRiftBlade extends ItemSword { if(par2World.getBlockId(hit.blockX, hit.blockY, hit.blockZ)==properties.RiftBlockID) { - LinkData link = dimHelper.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); + NewLinkData link = dimHelper.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); if(link!=null) { diff --git a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java index 3da5016..504f66c 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java @@ -3,8 +3,8 @@ package StevenDimDoors.mod_pocketDim.items; import java.util.List; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import net.minecraft.block.Block; @@ -58,7 +58,7 @@ public class ItemStabilizedRiftSignature extends itemLinkSignature public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { int key; - LinkData linkData; + NewLinkData linkData; int thisWorldID=par3World.provider.dimensionId; Integer[] linkCoords =this.readFromNBT(par1ItemStack); diff --git a/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java b/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java index a84d2d9..b5a741b 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java @@ -2,10 +2,10 @@ package StevenDimDoors.mod_pocketDim.items; import java.util.List; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.SchematicLoader; import StevenDimDoors.mod_pocketDim.Spells; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler; import StevenDimDoors.mod_pocketDimClient.ClientTickHandler; @@ -117,7 +117,7 @@ public class ItemStableFabric extends Item { //if(par2World.getBlockId(hit.blockX, hit.blockY, hit.blockZ)==properties.RiftBlockID) { - LinkData link = dimHelper.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); + NewLinkData link = dimHelper.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); if(link!=null) { Block var11; diff --git a/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java b/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java index c8f3c6c..c877d69 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java @@ -14,8 +14,8 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; public class itemDimDoor extends ItemDoor @@ -138,7 +138,7 @@ public class itemDimDoor extends ItemDoor { if(par2World.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) { - LinkData link = dimHelper.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); + NewLinkData link = dimHelper.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); if(link!=null) { Block var11; diff --git a/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java b/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java index 9de5a38..6136038 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java @@ -4,8 +4,8 @@ import java.util.List; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import net.minecraft.block.Block; @@ -69,7 +69,7 @@ public class itemLinkSignature extends Item public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { int key; - LinkData linkData; + NewLinkData linkData; int thisWorldID=par3World.provider.dimensionId; diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index b2ca95a..c8400b5 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -33,6 +33,7 @@ import StevenDimDoors.mod_pocketDim.commands.CommandPrintDimensionData; import StevenDimDoors.mod_pocketDim.commands.CommandPruneDimensions; import StevenDimDoors.mod_pocketDim.commands.CommandResetDungeons; import StevenDimDoors.mod_pocketDim.commands.CommandTeleportPlayer; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.items.ItemBlockDimWall; @@ -426,7 +427,7 @@ public class mod_pocketDim if(!dimHelper.dimList.containsKey(properties.LimboDimensionID)) { - dimHelper.dimList.put(properties.LimboDimensionID, new DimData( properties.LimboDimensionID, false, 0, new LinkData())); + dimHelper.dimList.put(properties.LimboDimensionID, new DimData( properties.LimboDimensionID, false, 0, new NewLinkData())); } } diff --git a/StevenDimDoors/mod_pocketDim/pocketTeleporter.java b/StevenDimDoors/mod_pocketDim/pocketTeleporter.java index 5513386..1f3e92f 100644 --- a/StevenDimDoors/mod_pocketDim/pocketTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/pocketTeleporter.java @@ -1,5 +1,6 @@ package StevenDimDoors.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityMinecart; @@ -12,7 +13,7 @@ public class pocketTeleporter { int x,y,z; - LinkData sendingLink; + NewLinkData sendingLink; public pocketTeleporter() @@ -28,7 +29,7 @@ public class pocketTeleporter * Create a new portal near an entity. */ - public void placeInPortal(Entity par1Entity, WorldServer world, LinkData link) + public void placeInPortal(Entity par1Entity, WorldServer world, NewLinkData link) { diff --git a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index 0297638..536c0b7 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -13,7 +13,7 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.LinkData; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.world.LimboProvider; import StevenDimDoors.mod_pocketDim.world.PocketProvider; @@ -171,7 +171,7 @@ public class MobMonolith extends EntityFlying implements IMob - LinkData link = new LinkData(this.worldObj.provider.dimensionId, properties.LimboDimensionID, (int)this.posX, (int)this.posY, (int)this.posZ, (int)this.posX+rand.nextInt(500)-250, (int)this.posY+500, (int)this.posZ+rand.nextInt(500)-250, false,0); + NewLinkData link = new NewLinkData(this.worldObj.provider.dimensionId, properties.LimboDimensionID, (int)this.posX, (int)this.posY, (int)this.posZ, (int)this.posX+rand.nextInt(500)-250, (int)this.posY+500, (int)this.posZ+rand.nextInt(500)-250, false,0); dimHelper.instance.traverseDimDoor(worldObj, link, entityPlayer); this.aggro=0; diff --git a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java index 386c73b..b840e48 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java +++ b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java @@ -2,9 +2,9 @@ package StevenDimDoors.mod_pocketDim.ticking; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.LinkData; import StevenDimDoors.mod_pocketDim.TileEntityRift; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; @@ -38,10 +38,10 @@ public class RiftRegenerator implements IRegularTickReceiver { while (i < 15 && FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { i++; - LinkData link; + NewLinkData link; //actually gets the random rift based on the size of the list - link = (LinkData) dimHelper.instance.getRandomLinkData(true); + link = (NewLinkData) dimHelper.instance.getRandomLinkData(true); if (link != null) { diff --git a/StevenDimDoors/mod_pocketDim/util/Point4D.java b/StevenDimDoors/mod_pocketDim/util/Point4D.java new file mode 100644 index 0000000..8d8c963 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/util/Point4D.java @@ -0,0 +1,131 @@ +package StevenDimDoors.mod_pocketDim.util; + +public final class Point4D +{ + private final int x; + private final int y; + private final int z; + private final int dimension; + + public Point4D(int x, int y, int z, int dimension) + { + this.x = x; + this.y = y; + this.z = z; + this.dimension = dimension; + } + + public int getX() + { + return x; + } + + public int getY() + { + return y; + } + + public int getZ() + { + return z; + } + + public int getDimension() + { + return dimension; + } + + @Override + public int hashCode() + { + //Time for some witchcraft. + //The code here is inspired by a discussion on Stack Overflow regarding hash codes for 3D. + //Source: http://stackoverflow.com/questions/9858376/hashcode-for-3d-integer-coordinates-with-high-spatial-coherence + + //I believe that most of the time, any points we might be hashing will be in close proximity to each other. + //For instance, points that are within the same chunk or within a few neighboring chunks. Only the low-order + //bits of each component would differ. I'll use 8 bits from Y and the 12 bits from X and Z. ~SenseiKiwi + + int bit; + int hash; + int index; + + hash = 0; + index = 0; + for (bit = 0; bit < 8; bit++) + { + hash |= ((y >> bit) & 1) << index; + index++; + hash |= ((x >> bit) & 1) << index; + index++; + hash |= ((z >> bit) & 1) << index; + index++; + } + for (; bit < 12; bit++) + { + hash |= ((x >> bit) & 1) << index; + index++; + hash |= ((z >> bit) & 1) << index; + index++; + } + return hash; + } + + public long longHashCode() + { + //Time for some witchcraft. + //The code here is inspired by a discussion on Stack Overflow regarding hash codes for 3D. + //Source: http://stackoverflow.com/questions/9858376/hashcode-for-3d-integer-coordinates-with-high-spatial-coherence + + //Use 8 bits from Y and 24 bits from X and Z. Mix in 8 bits from the destination dim ID too - that means + //even if you aligned two doors perfectly between two pockets, it's unlikely they would lead to the same dungeon. + + int bit; + int index; + long hash; + + hash = 0; + index = 0; + for (bit = 0; bit < 8; bit++) + { + hash |= ((dimension >> bit) & 1) << index; + index++; + hash |= ((x >> bit) & 1) << index; + index++; + hash |= ((y >> bit) & 1) << index; + index++; + hash |= ((z >> bit) & 1) << index; + index++; + } + for (; bit < 24; bit++) + { + hash |= ((x >> bit) & 1) << index; + index++; + hash |= ((z >> bit) & 1) << index; + index++; + } + return hash; + } + + @Override + public boolean equals(Object obj) + { + return equals((Point4D) obj); + } + + public boolean equals(Point4D other) + { + if (this == other) + return true; + if (other == null) + return false; + + return (x == other.x && y == other.y && z == other.z && dimension == other.dimension); + } + + @Override + public String toString() + { + return "(" + x + ", " + y + ", " + z + ", " + dimension + ")"; + } +} -- 2.39.5 From 02b96c0c05e139993dc106a00d7b56978c46be21 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 24 Aug 2013 07:52:35 -0400 Subject: [PATCH 029/544] Improved Dungeon Loot and Selection DDLoot: Implemented a custom version of MC's generateChestContents() for our own chests. It avoids two notable bugs that affect MC's version. FillContainersOperation: Changed code to use DDLoot.generateChestContents() SchematicLoader: Fixed a bug in the way we calculated a seed for selecting our dungeons that would cause certain seeds to dominate all the others. Under certain circumstances, the function would only return -1. That would make our dungeon selection severely biased. That was resolved and the code was specifically tuned for seeding Java's Random even for doors with nearly identical positions. The result was an apparent major improvement in the randomness of dungeons. ruins\rules.txt: Changed the dungeon generation rules to precisely match the complicated scheme we had before. We're still using simple rules to choose dungeons - I used a program to derive the effective distribution of dungeon types that the old code would produce and converted it into the current rule system. --- StevenDimDoors/mod_pocketDim/DDLoot.java | 49 +++++++++++++++++++ .../mod_pocketDim/SchematicLoader.java | 49 +++++++++++-------- .../dungeon/FillContainersOperation.java | 5 +- schematics/ruins/rules.txt | 20 +++++--- 4 files changed, 92 insertions(+), 31 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/DDLoot.java b/StevenDimDoors/mod_pocketDim/DDLoot.java index 4226697..41d80a9 100644 --- a/StevenDimDoors/mod_pocketDim/DDLoot.java +++ b/StevenDimDoors/mod_pocketDim/DDLoot.java @@ -4,7 +4,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Random; +import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.WeightedRandom; import net.minecraft.util.WeightedRandomChestContent; import net.minecraftforge.common.ChestGenHooks; @@ -33,6 +36,8 @@ public class DDLoot { private static final int RARE_LOOT_WEIGHT = 1; //Same weight as music discs, golden apple private static final int DUNGEON_CHEST_WEIGHT_INFLATION = 10; // (weight of iron ingots in dungeon) / (weight of iron ingots in other chests) + private DDLoot() { } + public static void registerInfo() { DDProperties properties = DDProperties.instance(); @@ -156,4 +161,48 @@ public class DDLoot { //System.out.println(item.theItemId.getDisplayName() + "\t" + item.itemWeight); } } + + public static void generateChestContents(ChestGenHooks chestInfo, IInventory inventory, Random random) + { + //This is a custom version of net.minecraft.util.WeightedRandomChestContent.generateChestContents() + //It's designed to avoid the following bugs in MC 1.5: + //1. The randomized filling algorithm will sometimes overwrite item stacks with other stacks + //2. If multiple enchanted books appear, then they will have the same enchantment + + //The prime number below is used for choosing chest slots in a seemingly-random pattern. Its value + //was selected specifically to achieve a spread-out distribution for chests with up to 104 slots. + //Choosing a prime number ensures that our increments are relatively-prime to the chest size, which + //means we'll cover all the slots before repeating any. This is mathematically guaranteed. + final int primeOffset = 239333; + + int count = chestInfo.getCount(random); + int size = inventory.getSizeInventory(); + WeightedRandomChestContent[] content = chestInfo.getItems(random); + + for (int k = 0; k < count; k++) + { + WeightedRandomChestContent selection = (WeightedRandomChestContent)WeightedRandom.getRandomItem(random, content); + + //Call getChestGenBase() to make sure we generate a different enchantment for books. + //Don't just use a condition to check if the item is an instance of ItemEnchantedBook because + //we don't know if other mods might add items that also need to be regenerated. + selection = selection.theItemId.getItem().getChestGenBase(chestInfo, random, selection); + + ItemStack[] stacks = ChestGenHooks.generateStacks(random, selection.theItemId, selection.theMinimumChanceToGenerateItem, selection.theMaximumChanceToGenerateItem); + + for (ItemStack item : stacks) + { + int limit = size; + int index = random.nextInt(size); + + while (limit > 0 && inventory.getStackInSlot(index) != null) + { + limit--; + index = (index + primeOffset) % size; + } + + inventory.setInventorySlotContents(index, item); + } + } + } } diff --git a/StevenDimDoors/mod_pocketDim/SchematicLoader.java b/StevenDimDoors/mod_pocketDim/SchematicLoader.java index 630b21f..0cc771c 100644 --- a/StevenDimDoors/mod_pocketDim/SchematicLoader.java +++ b/StevenDimDoors/mod_pocketDim/SchematicLoader.java @@ -42,7 +42,7 @@ public class SchematicLoader if (dimList.get(destDimID).dungeonGenerator == null) { //TODO: We should centralize RNG initialization and world-seed modifiers for each specific application. - final long localSeed = world.getSeed() ^ 0x2F50DB9B4A8057E4L ^ computeDestinationHash(link); + final long localSeed = world.getSeed() ^ 0x2F50DB9B4A8057E4L ^ calculateDestinationSeed(link); final Random random = new Random(localSeed); dungeonHelper.generateDungeonLink(link, dungeonHelper.getDimDungeonPack(originDimID), random); @@ -155,43 +155,50 @@ public class SchematicLoader return dungeon; } - private static long computeDestinationHash(LinkData link) + private static long calculateDestinationSeed(LinkData link) { //Time for some witchcraft. //The code here is inspired by a discussion on Stack Overflow regarding hash codes for 3D. //Source: http://stackoverflow.com/questions/9858376/hashcode-for-3d-integer-coordinates-with-high-spatial-coherence - //Use 8 bits from Y and 24 bits from X and Z. Mix in 8 bits from the destination dim ID too - that means + //Use 8 bits from Y and 16 bits from X and Z. Mix in 8 bits from the destination dim ID too - that means //even if you aligned two doors perfectly between two pockets, it's unlikely they would lead to the same dungeon. + //We map bits in reverse order to produce more varied RNG output for nearly-identical points. The reason is + //that Java's Random outputs the 32 MSBs of its internal state to produce its output. If the differences + //between two seeds are small (i.e. in the LSBs), then they will tend to produce similar random outputs anyway! + + //Only bother to assign the 48 least-significant bits since Random only takes those bits from its seed. + //NOTE: The casts to long are necessary to get the right results from the bit shifts!!! int bit; int index; long hash; - int w = link.destDimID; - int x = link.destXCoord; - int y = link.destYCoord; - int z = link.destZCoord; + final int w = link.destDimID; + final int x = link.destXCoord; + final int y = link.destYCoord; + final int z = link.destZCoord; hash = 0; - index = 0; + index = 48; for (bit = 0; bit < 8; bit++) { - hash |= ((w >> bit) & 1) << index; - index++; - hash |= ((x >> bit) & 1) << index; - index++; - hash |= ((y >> bit) & 1) << index; - index++; - hash |= ((z >> bit) & 1) << index; - index++; + hash |= (long) ((w >> bit) & 1) << index; + index--; + hash |= (long) ((x >> bit) & 1) << index; + index--; + hash |= (long) ((y >> bit) & 1) << index; + index--; + hash |= (long) ((z >> bit) & 1) << index; + index--; } - for (; bit < 24; bit++) + for (; bit < 16; bit++) { - hash |= ((x >> bit) & 1) << index; - index++; - hash |= ((z >> bit) & 1) << index; - index++; + hash |= (long) ((x >> bit) & 1) << index; + index--; + hash |= (long) ((z >> bit) & 1) << index; + index--; } + return hash; } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java b/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java index 7979eaf..c51df0e 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java @@ -10,9 +10,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityChest; import net.minecraft.tileentity.TileEntityDispenser; -import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.World; -import net.minecraftforge.common.ChestGenHooks; import StevenDimDoors.mod_pocketDim.DDLoot; import StevenDimDoors.mod_pocketDim.schematic.WorldOperation; @@ -42,8 +40,7 @@ public class FillContainersOperation extends WorldOperation TileEntityChest chest = (TileEntityChest) tileEntity; if (isInventoryEmpty(chest)) { - ChestGenHooks info = DDLoot.DungeonChestInfo; - WeightedRandomChestContent.generateChestContents(random, info.getItems(random), chest, info.getCount(random)); + DDLoot.generateChestContents(DDLoot.DungeonChestInfo, chest, random); } } diff --git a/schematics/ruins/rules.txt b/schematics/ruins/rules.txt index ef838c1..a14fe17 100644 --- a/schematics/ruins/rules.txt +++ b/schematics/ruins/rules.txt @@ -22,14 +22,22 @@ Exit -> DeadEnd Exit DeadEnd -> DeadEnd Exit -? ? ? ? ? ? ? ? -> Trap#20 SimpleHall#40 ComplexHall#10 Exit#20 DeadEnd#10 +? ? ? ? ? ? ? ? ? -> DeadEnd#10 Exit#11 SimpleHall#24 ComplexHall#16 Trap#23 Maze#11 -? ? ? ? -> Trap#18 SimpleHall#40 ComplexHall#10 Exit#18 DeadEnd#10 Hub#4 +? ? ? ? ? ? ? ? -> DeadEnd#9 Exit#10 SimpleHall#24 ComplexHall#16 Trap#23 Maze#11 Hub#6 -? ? ? -> ComplexHall Hub Trap SimpleHall Maze +? ? ? ? ? ? ? -> DeadEnd#8 Exit#9 SimpleHall#25 ComplexHall#17 Trap#23 Maze#11 Hub#7 -? ? -> ComplexHall Hub Trap SimpleHall Maze +? ? ? ? ? ? -> DeadEnd#7 Exit#8 SimpleHall#26 ComplexHall#17 Trap#23 Maze#11 Hub#8 -? -> ComplexHall#40 Hub#30 Trap#10 SimpleHall#10 Maze#10 +? ? ? ? ? -> DeadEnd#6 Exit#6 SimpleHall#27 ComplexHall#18 Trap#23 Maze#11 Hub#9 --> ComplexHall#40 Hub#30 Trap#10 SimpleHall#10 Maze#10 \ No newline at end of file +? ? ? ? -> DeadEnd#5 Exit#5 SimpleHall#28 ComplexHall#18 Trap#23 Maze#11 Hub#10 + +? ? ? -> DeadEnd#3 Exit#3 SimpleHall#29 ComplexHall#19 Trap#23 Maze#11 Hub#11 + +? ? -> SimpleHall#9 ComplexHall#8 Trap#17 Maze#23 Hub#44 + +? -> SimpleHall#9 ComplexHall#8 Trap#17 Maze#23 Hub#44 + +-> SimpleHall#2 ComplexHall#54 Trap#2 Maze#2 Hub#41 -- 2.39.5 From 30b8e98ad8e06b174cd687a696bd17f05ed30a51 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 26 Aug 2013 01:59:37 -0400 Subject: [PATCH 030/544] Minor Fixes to Old Dungeons Fixed the two blocks sticking out in the multilevel maze that made a staircase unusable. Put a floor in simpleDropHall so it's actually usable rather than killing the player. --- ...e_smallMultilevelMaze_closed_100.schematic | Bin 1764 -> 2024 bytes ...leHall_simpleDropHall_closed_100.schematic | Bin 1011 -> 1248 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/schematics/ruins/maze_smallMultilevelMaze_closed_100.schematic b/schematics/ruins/maze_smallMultilevelMaze_closed_100.schematic index 93fc931c9f963f162cc7ed175efe38d4f983fa5e..333eec84e7c6ad179b2626e419026c1858e5234c 100644 GIT binary patch literal 2024 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 diff --git a/schematics/ruins/simpleHall_simpleDropHall_closed_100.schematic b/schematics/ruins/simpleHall_simpleDropHall_closed_100.schematic index 48c71ab06f2101ba53c4aae42ec1492218fbe2af..d8071e235c9d56209021870aa13a5f6493fe2d6c 100644 GIT binary patch literal 1248 zcmb2|=3sz;w|CCwg``Rx__+OP@~t3~SEpK~&GI_5g|0amswKr_DBYe}c4$sOn%Z2$ zhUt$|XGr89>n`kSaJ4?0{k&$+^Ox_pYx4a6Rc<~<=j4aR-uJwHHSpJyzmM1RuM%h9eDmbilI*ge-sPtsZkpxmZ~q`n z%BQXS`1(~(UrnDM*4;dR`T1j;UoJkmVV2#>W#_~D-<^N<_~m!?{=W3?kAb_UZL5pi zd;j_B?d$#h3%-84`s!`^%Du_&wpN_6&hOuO|Da+1e*0%-yMCtF)NY%zWOwtH-w$5A zc=++nho4GIy0NLl~&81d?saM-^o>$#*upx zH!*>9sc9zw6(x|t2{^-lWU}cjc#M8Id|Irg;>gdL|LeaVj69L@KZW=A^+=Nit=$^W zCab;mAbfxij8%735O=k5qh`hi8q+XzDe1-&T?%nEJKQs@d{@ppxM{V~hNfC|j-G9E9rWi%uH?r=& zx2igQt!0moTDJ1$%^c^>O*+YxS|)bzW~5Q%f-~ooEUdlNxToBVWJymynbHVU|KN?z zOr3zVbip}uOC7iEvWa{?pY`VdlW%mIHgC?VIP_mv-|2V-sT2ElOrE+{Z|nD&TW7z~S;t_VU0e45pN6*g{b#9_?7o%k zvbA%+x6J=F|8HXY&Bzba=7u^?+nO47|I3x17rX8ml}($=dUnI+s##P27|p%Tw)-^L z4Jn%(X3ljjD4XUZra`KQR422Z!e+?2cXL%IpX@sSMyE=<92gFpw5P$N5Sl3+wqN_l zv0~oIJsvZC)NZT1-p;MRNq*P9)>5)W7`7~V-5T7yE?<#B_hr??D+^vnb2xbKinB0% k@k@;9!lZTLe!NEdTW8{yl-^Q=!S&;9lI;>kzXZ)R1RWcu%)w>E9<-u)R2 z46L$mezAhA5&52T<;|&khvPUHqQAZQnLhvf)cBk~SN{seaWnKEX#c;e_LZ<5)Ir2j zM`mwp&cC;A+Ulo|{!CuIp8wXD_M2HBe;1Wi-TM|dci!AH%ijLc@}a%lFIvExLE>XMFvJ+{xF@vB^nQz4?|eSCL_Kjk`H_*B%>LeqKAX z9Z#6+#T3px`S!_=ZQ7pSebztTggswAA$ophTYvR;+42uJSFZC{blzV3cl*}eo2zT0 znSAs9eXaR><81r6S80<2H$N%2DhhM>RIz>DRxl?I#3?WO5FJ15lbFmOb}za2eVaBv zxIS&7=meX4v8j{y>HO5qvD8+m+_UMznuaGIPX%pensi*7`z)7-+)$*0*gSss=BWR(FU`-LlODbM^Uilu z84IRY%l?@-FZb+0_8<9Y?|;4Xyz=$#C$-!E*~!#As9*DWMOoabd(HI~6*mN}elRG% zvRS2XHSgu6>7UQl&zOHcKL6jj>lbgZ-#XZCxYakM-+cEUpSm4}zn}NTPm|u<{dM~N zb*Ja0OMlco;gzc5aZli;+2(V?wY48^|2g_S*(UmvL(1*59uxK`ZpuxYt6p_Sr&3|l z+cc2ENS|*TEgo(?Dd+Ci^n`cf(G Date: Thu, 29 Aug 2013 02:14:24 -0400 Subject: [PATCH 031/544] Flipped a Table Replaced several core classes from DD with new classes to enforce integrity checks. Rewriting everything that depended on those classes is a massive undertaking but it should simplify our code and prevent the many bugs we've seen lately. The rewrite isn't done yet, just committing my progress so far. --- .../mod_pocketDim/BlankTeleporter.java | 2 +- .../mod_pocketDim/ConnectionHandler.java | 39 +- .../mod_pocketDim/DDProperties.java | 5 +- .../mod_pocketDim/DDTeleporter.java | 376 +++++ StevenDimDoors/mod_pocketDim/DimData.java | 259 ---- .../mod_pocketDim/DungeonGenerator.java | 85 - .../mod_pocketDim/EventHookContainer.java | 43 +- .../mod_pocketDim/PacketHandler.java | 292 ++-- .../mod_pocketDim/SchematicLoader.java | 205 --- .../mod_pocketDim/TileEntityRift.java | 554 ++++--- .../mod_pocketDim/TransientDoor.java | 188 +-- .../blocks/BlockDimWallPerm.java | 73 +- .../mod_pocketDim/blocks/BlockLimbo.java | 2 +- .../mod_pocketDim/blocks/BlockRift.java | 9 +- .../mod_pocketDim/blocks/ChaosDoor.java | 147 +- .../mod_pocketDim/blocks/ExitDoor.java | 194 +-- .../mod_pocketDim/blocks/dimDoor.java | 986 +++++------- .../mod_pocketDim/blocks/dimHatch.java | 100 +- .../commands/CommandCreateDungeonRift.java | 41 +- .../commands/CommandCreatePocket.java | 5 +- .../commands/CommandDeleteAllLinks.java | 24 +- .../commands/CommandDeleteDimensionData.java | 24 +- .../commands/CommandDeleteRifts.java | 24 +- .../commands/CommandPrintDimensionData.java | 20 +- .../commands/CommandPruneDimensions.java | 22 +- .../commands/CommandResetDungeons.java | 8 +- .../commands/CommandTeleportPlayer.java | 10 +- .../mod_pocketDim/core/IDimLink.java | 31 + .../mod_pocketDim/core/LinkTail.java | 31 + .../mod_pocketDim/core/NewDimData.java | 496 ++++++ .../mod_pocketDim/core/NewLinkData.java | 36 - .../mod_pocketDim/core/PocketManager.java | 623 ++++++++ .../mod_pocketDim/dungeon/DungeonData.java | 76 + .../dungeon/DungeonSchematic.java | 14 +- .../dungeon/pack/DungeonPack.java | 64 +- .../mod_pocketDim/helpers/DungeonHelper.java | 182 +-- .../mod_pocketDim/helpers/dimHelper.java | 1364 ----------------- .../mod_pocketDim/helpers/yCoordHelper.java | 62 +- .../mod_pocketDim/items/ItemRiftBlade.java | 16 +- .../items/ItemStabilizedRiftSignature.java | 12 +- .../mod_pocketDim/items/ItemStableFabric.java | 12 +- .../mod_pocketDim/items/itemDimDoor.java | 6 +- .../items/itemLinkSignature.java | 20 +- .../mod_pocketDim/items/itemRiftRemover.java | 4 +- .../mod_pocketDim/mod_pocketDim.java | 31 +- .../mod_pocketDim/pocketTeleporter.java | 226 --- .../{ => ticking}/LimboDecay.java | 9 +- .../ticking/LimboGatewayGenerator.java | 4 +- .../mod_pocketDim/ticking/MobMonolith.java | 4 +- .../ticking/MonolithSpawner.java | 32 +- .../ticking/RiftRegenerator.java | 76 +- .../mod_pocketDim/util/Point4D.java | 17 +- .../GatewayGenerator.java} | 39 +- .../mod_pocketDim/world/PocketBuilder.java | 422 +++++ .../mod_pocketDim/world/PocketGenerator.java | 16 +- .../mod_pocketDim/world/PocketProvider.java | 9 +- .../mod_pocketDimClient/ClosingRiftFX.java | 4 +- .../mod_pocketDimClient/GoggleRiftFX.java | 4 +- .../mod_pocketDimClient/RiftFX.java | 4 +- schematics/core/simpleStairsDown.schematic | Bin 1239 -> 0 bytes schematics/core/simpleStairsUp.schematic | Bin 1112 -> 0 bytes 61 files changed, 3450 insertions(+), 4233 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/DDTeleporter.java delete mode 100644 StevenDimDoors/mod_pocketDim/DimData.java delete mode 100644 StevenDimDoors/mod_pocketDim/DungeonGenerator.java delete mode 100644 StevenDimDoors/mod_pocketDim/SchematicLoader.java create mode 100644 StevenDimDoors/mod_pocketDim/core/IDimLink.java create mode 100644 StevenDimDoors/mod_pocketDim/core/LinkTail.java create mode 100644 StevenDimDoors/mod_pocketDim/core/NewDimData.java delete mode 100644 StevenDimDoors/mod_pocketDim/core/NewLinkData.java create mode 100644 StevenDimDoors/mod_pocketDim/core/PocketManager.java create mode 100644 StevenDimDoors/mod_pocketDim/dungeon/DungeonData.java delete mode 100644 StevenDimDoors/mod_pocketDim/helpers/dimHelper.java delete mode 100644 StevenDimDoors/mod_pocketDim/pocketTeleporter.java rename StevenDimDoors/mod_pocketDim/{ => ticking}/LimboDecay.java (94%) rename StevenDimDoors/mod_pocketDim/{RiftGenerator.java => world/GatewayGenerator.java} (86%) create mode 100644 StevenDimDoors/mod_pocketDim/world/PocketBuilder.java delete mode 100644 schematics/core/simpleStairsDown.schematic delete mode 100644 schematics/core/simpleStairsUp.schematic diff --git a/StevenDimDoors/mod_pocketDim/BlankTeleporter.java b/StevenDimDoors/mod_pocketDim/BlankTeleporter.java index 259ff0e..99aea03 100644 --- a/StevenDimDoors/mod_pocketDim/BlankTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/BlankTeleporter.java @@ -1,6 +1,6 @@ package StevenDimDoors.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.entity.player.EntityPlayer; diff --git a/StevenDimDoors/mod_pocketDim/ConnectionHandler.java b/StevenDimDoors/mod_pocketDim/ConnectionHandler.java index 6de4ad7..0d0c9fd 100644 --- a/StevenDimDoors/mod_pocketDim/ConnectionHandler.java +++ b/StevenDimDoors/mod_pocketDim/ConnectionHandler.java @@ -3,7 +3,8 @@ package StevenDimDoors.mod_pocketDim; import java.util.ArrayList; import java.util.Collection; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import net.minecraft.network.INetworkManager; import net.minecraft.network.NetLoginHandler; @@ -25,10 +26,8 @@ public class ConnectionHandler implements IConnectionHandler if (properties == null) properties = DDProperties.instance(); - Collection set = new ArrayList(); - set.addAll(dimHelper.dimList.keySet()); - PacketHandler.onClientJoinPacket(manager, dimHelper.dimList); - PacketHandler.onDimCreatedPacket(new DimData(properties.LimboDimensionID, false, 0, 0, 0, 0, 0)); + PacketHandler.onClientJoinPacket(manager, PocketManager.dimList); + PacketHandler.onDimCreatedPacket(new NewDimData(properties.LimboDimensionID, false, 0, 0, 0, 0, 0)); return null; } @@ -39,10 +38,7 @@ public class ConnectionHandler implements IConnectionHandler } @Override - public void connectionOpened(NetHandler netClientHandler,MinecraftServer server, INetworkManager manager) - { - - } + public void connectionOpened(NetHandler netClientHandler,MinecraftServer server, INetworkManager manager) { } @Override public void connectionClosed(INetworkManager manager) @@ -50,32 +46,17 @@ public class ConnectionHandler implements IConnectionHandler if (connected) { System.out.println("Clearing dim cache"); - dimHelper.instance.save(); - dimHelper.instance.unregsisterDims(); - dimHelper.dimList.clear(); + PocketManager.instance.save(); + PocketManager.instance.unregsisterDims(); + PocketManager.dimList.clear(); } connected = false; - } @Override - public void clientLoggedIn(NetHandler clientHandler, INetworkManager manager, - Packet1Login login) - { - - - - } + public void clientLoggedIn(NetHandler clientHandler, INetworkManager manager, Packet1Login login) { } @Override - public void playerLoggedIn(Player player, NetHandler netHandler, - INetworkManager manager) - { - - - - - - } + public void playerLoggedIn(Player player, NetHandler netHandler, INetworkManager manager) { } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/DDProperties.java b/StevenDimDoors/mod_pocketDim/DDProperties.java index a10cb31..2d21924 100644 --- a/StevenDimDoors/mod_pocketDim/DDProperties.java +++ b/StevenDimDoors/mod_pocketDim/DDProperties.java @@ -4,6 +4,7 @@ import java.io.File; import net.minecraftforge.common.Configuration; import StevenDimDoors.mod_pocketDim.ticking.MonolithSpawner; +import StevenDimDoors.mod_pocketDim.world.GatewayGenerator; public class DDProperties { @@ -211,11 +212,11 @@ public class DDProperties "spawn in a given Limbo chunk. The default chance is 28.").getInt(); ClusterGenerationChance = config.get(Configuration.CATEGORY_GENERAL, "Cluster Generation Chance", 3, - "Sets the chance (out of " + RiftGenerator.MAX_CLUSTER_GENERATION_CHANCE + ") that a cluster of rifts will " + + "Sets the chance (out of " + GatewayGenerator.MAX_CLUSTER_GENERATION_CHANCE + ") that a cluster of rifts will " + "generate in a given chunk. The default chance is 3.").getInt(); GatewayGenerationChance = config.get(Configuration.CATEGORY_GENERAL, "Gateway Generation Chance", 10, - "Sets the chance (out of " + RiftGenerator.MAX_GATEWAY_GENERATION_CHANCE + ") that a Rift Gateway will " + + "Sets the chance (out of " + GatewayGenerator.MAX_GATEWAY_GENERATION_CHANCE + ") that a Rift Gateway will " + "generate in a given chunk. The default chance is 10.").getInt(); RiftSpreadModifier = config.get(Configuration.CATEGORY_GENERAL, "Rift Spread Modifier", 3, diff --git a/StevenDimDoors/mod_pocketDim/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/DDTeleporter.java new file mode 100644 index 0000000..1203cd5 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/DDTeleporter.java @@ -0,0 +1,376 @@ +package StevenDimDoors.mod_pocketDim; + +import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.item.EntityMinecart; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.packet.Packet41EntityEffect; +import net.minecraft.network.packet.Packet43Experience; +import net.minecraft.network.packet.Packet9Respawn; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.DimensionManager; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.util.Point4D; + +public class DDTeleporter +{ + private DDTeleporter() { } + + /** + * Create a new portal near an entity. + */ + public static void placeInPortal(Entity par1Entity, WorldServer world, IDimLink link) + { + Point4D destination = link.destination(); + int x = destination.getX(); + int y = destination.getY(); + int z = destination.getZ(); + + //TODO Temporary workaround for mismatched door/rift metadata cases. Gives priority to the door. + int orientation = PocketManager.getDestinationOrientation(link); + int receivingDoorMeta = world.getBlockMetadata(x, y - 1, z); + int receivingDoorID = world.getBlockId(x, y, z); + if (receivingDoorMeta != orientation) + { + if (receivingDoorID == mod_pocketDim.dimDoor.blockID || receivingDoorID == mod_pocketDim.ExitDoor.blockID) + { + orientation = receivingDoorMeta; + } + } + + if (par1Entity instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) par1Entity; + player.rotationYaw=(orientation*90)+90; + if(orientation==2||orientation==6) + { + player.setPositionAndUpdate( x+1.5, y-1, z+.5 ); + } + else if(orientation==3||orientation==7) + { + player.setPositionAndUpdate( x+.5, y-1, z+1.5 ); + } + else if(orientation==0||orientation==4) + { + player.setPositionAndUpdate(x-.5, y-1, z+.5); + } + else if(orientation==1||orientation==5) + { + player.setPositionAndUpdate(x+.5, y-1, z-.5); + } + else + { + player.setPositionAndUpdate(x, y-1, z); + } + } + else if (par1Entity instanceof EntityMinecart) + { + par1Entity.motionX=0; + par1Entity.motionZ=0; + par1Entity.motionY=0; + par1Entity.rotationYaw=(orientation*90)+90; + + if(orientation==2||orientation==6) + { + DDTeleporter.setEntityPosition(par1Entity, x+1.5, y, z+.5 ); + par1Entity.motionX =.39; + par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); + } + else if(orientation==3||orientation==7) + { + DDTeleporter.setEntityPosition(par1Entity, x+.5, y, z+1.5 ); + par1Entity.motionZ =.39; + par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); + } + else if(orientation==0||orientation==4) + { + DDTeleporter.setEntityPosition(par1Entity,x-.5, y, z+.5); + par1Entity.motionX =-.39; + par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); + } + else if(orientation==1||orientation==5) + { + DDTeleporter.setEntityPosition(par1Entity,x+.5, y, z-.5); + par1Entity.motionZ =-.39; + par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); + } + else + { + DDTeleporter.setEntityPosition(par1Entity,x, y, z); + } + } + else if (par1Entity instanceof Entity) + { + par1Entity.rotationYaw=(orientation*90)+90; + if(orientation==2||orientation==6) + { + DDTeleporter.setEntityPosition(par1Entity, x+1.5, y, z+.5 ); + } + else if(orientation==3||orientation==7) + { + + DDTeleporter.setEntityPosition(par1Entity, x+.5, y, z+1.5 ); + } + else if(orientation==0||orientation==4) + { + DDTeleporter.setEntityPosition(par1Entity,x-.5, y, z+.5); + } + else if(orientation==1||orientation==5) + { + DDTeleporter.setEntityPosition(par1Entity,x+.5, y, z-.5); + } + else + { + DDTeleporter.setEntityPosition(par1Entity,x, y, z); + } + } + } + + private static void setEntityPosition(Entity entity, double x, double y, double z) + { + entity.lastTickPosX = entity.prevPosX = entity.posX = x; + entity.lastTickPosY = entity.prevPosY = entity.posY = y + (double)entity.yOffset; + entity.lastTickPosZ = entity.prevPosZ = entity.posZ = z; + entity.setPosition(x, y, z); + } + + public static Entity teleportEntity(World world, Entity entity, IDimLink link) + { + //This beautiful teleport method is based off of xCompWiz's teleport function. + + WorldServer oldWorld = (WorldServer)world; + WorldServer newWorld; + EntityPlayerMP player = (entity instanceof EntityPlayerMP) ? (EntityPlayerMP)entity : null; + + // Is something riding? Handle it first. + if(entity.riddenByEntity != null) + { + return teleportEntity(oldWorld, entity.riddenByEntity, link); + } + + // Are we riding something? Dismount and tell the mount to go first. + Entity cart = entity.ridingEntity; + if (cart != null) + { + entity.mountEntity(null); + cart = teleportEntity(oldWorld, cart, link); + // We keep track of both so we can remount them on the other side. + } + + // Destination doesn't exist? We need to make it. + if (DimensionManager.getWorld(link.destination().getDimension()) == null) + { + //FIXME: I think this is where I need to add initialization code for pockets!!! REALLY IMPORTANT!!! + DimensionManager.initDimension(link.destination().getDimension()); + } + + // Determine if our destination's in another realm. + boolean difDest = link.source().getDimension() != link.destination().getDimension(); + if (difDest) + { + newWorld = DimensionManager.getWorld(link.destination().getDimension()); + } + else + { + newWorld = (WorldServer) oldWorld; + } + + // GreyMaria: What is this even accomplishing? We're doing the exact same thing at the end of this all. + // TODO Check to see if this is actually vital. + DDTeleporter.placeInPortal(entity, newWorld, link); + + if (difDest) // Are we moving our target to a new dimension? + { + if(player != null) // Are we working with a player? + { + // We need to do all this special stuff to move a player between dimensions. + + // Set the new dimension and inform the client that it's moving to a new world. + player.dimension = link.destination().getDimension(); + player.playerNetServerHandler.sendPacketToPlayer(new Packet9Respawn(player.dimension, (byte)player.worldObj.difficultySetting, newWorld.getWorldInfo().getTerrainType(), newWorld.getHeight(), player.theItemInWorldManager.getGameType())); + + // GreyMaria: Used the safe player entity remover before. + // This should fix an apparently unreported bug where + // the last non-sleeping player leaves the Overworld + // for a pocket dimension, causing all sleeping players + // to remain asleep instead of progressing to day. + oldWorld.removePlayerEntityDangerously(player); + player.isDead=false; + + // Creates sanity by ensuring that we're only known to exist where we're supposed to be known to exist. + oldWorld.getPlayerManager().removePlayer(player); + newWorld.getPlayerManager().addPlayer(player); + + player.theItemInWorldManager.setWorld((WorldServer)newWorld); + + // Synchronize with the server so the client knows what time it is and what it's holding. + player.mcServer.getConfigurationManager().updateTimeAndWeatherForPlayer(player, (WorldServer)newWorld); + player.mcServer.getConfigurationManager().syncPlayerInventory(player); + for(Object potionEffect : player.getActivePotionEffects()) + { + PotionEffect effect = (PotionEffect)potionEffect; + player.playerNetServerHandler.sendPacketToPlayer(new Packet41EntityEffect(player.entityId, effect)); + } + + player.playerNetServerHandler.sendPacketToPlayer(new Packet43Experience(player.experience, player.experienceTotal, player.experienceLevel)); + } + + // Creates sanity by removing the entity from its old location's chunk entity list, if applicable. + int entX = entity.chunkCoordX; + int entZ = entity.chunkCoordZ; + if ((entity.addedToChunk) && (oldWorld.getChunkProvider().chunkExists(entX, entZ))) + { + oldWorld.getChunkFromChunkCoords(entX, entZ).removeEntity(entity); + oldWorld.getChunkFromChunkCoords(entX, entZ).isModified = true; + } + // Memory concerns. + oldWorld.releaseEntitySkin(entity); + + if (player == null) // Are we NOT working with a player? + { + NBTTagCompound entityNBT = new NBTTagCompound(); + entity.isDead = false; + entity.addEntityID(entityNBT); + entity.isDead = true; + entity = EntityList.createEntityFromNBT(entityNBT, newWorld); + + if (entity == null) + { // TODO FIXME IMPLEMENT NULL CHECKS THAT ACTUALLY DO SOMETHING. + /* + * shit ourselves in an organized fashion, preferably + * in a neat pile instead of all over our users' games + */ + } + + } + + // Finally, respawn the entity in its new home. + newWorld.spawnEntityInWorld(entity); + entity.setWorld(newWorld); + } + entity.worldObj.updateEntityWithOptionalForce(entity, false); + + // Hey, remember me? It's time to remount. + if (cart != null) + { + // Was there a player teleported? If there was, it's important that we update shit. + if (player != null) + { + entity.worldObj.updateEntityWithOptionalForce(entity, true); + } + entity.mountEntity(cart); + } + + // Did we teleport a player? Load the chunk for them. + if(player != null) + { + WorldServer.class.cast(newWorld).getChunkProvider().loadChunk(MathHelper.floor_double(entity.posX) >> 4, MathHelper.floor_double(entity.posZ) >> 4); + + // Tell Forge we're moving its players so everyone else knows. + // Let's try doing this down here in case this is what's killing NEI. + GameRegistry.onPlayerChangedDimension((EntityPlayer)entity); + + } + DDTeleporter.placeInPortal(entity, newWorld, link); + return entity; + } + + /** + * Primary function used to teleport the player using doors. Performs numerous null checks, and also generates the destination door/pocket if it has not done so already. + * Also ensures correct orientation relative to the door using DDTeleporter. + * @param world- world the player is currently in + * @param linkData- the link the player is using to teleport, sends the player to its dest information. + * @param player- the instance of the player to be teleported + * @param orientation- the orientation of the door used to teleport, determines player orientation and door placement on arrival + * @Return + */ + public static void traverseDimDoor(World world, IDimLink linkData, Entity entity) + { + DDProperties properties = DDProperties.instance(); + + if (world.isRemote) + { + return; + } + if (linkData != null) + { + int destinationID = link.destination().getDimension(); + + if(PocketManager.dimList.containsKey(destinationID) && PocketManager.dimList.containsKey(world.provider.dimensionId)) + { + this.generatePocket(linkData); + + if(mod_pocketDim.teleTimer==0||entity instanceof EntityPlayer) + { + mod_pocketDim.teleTimer=2+rand.nextInt(2); + } + else + { + return; + } + if(!world.isRemote) + { + entity = this.teleportEntity(world, entity, linkData); + } + entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); + + int playerXCoord=MathHelper.floor_double(entity.posX); + int playerYCoord=MathHelper.floor_double(entity.posY); + int playerZCoord=MathHelper.floor_double(entity.posZ); + + if(!entity.worldObj.isBlockOpaqueCube(playerXCoord, playerYCoord-1,playerZCoord )&&PocketManager.instance.getDimData(linkData.locDimID).isDimRandomRift&&!linkData.hasGennedDoor) + { + for(int count=0;count<20;count++) + { + if(!entity.worldObj.isAirBlock(playerXCoord, playerYCoord-2-count,playerZCoord)) + { + if(Block.blocksList[entity.worldObj.getBlockId(playerXCoord, playerYCoord-2-count,playerZCoord)].blockMaterial.isLiquid()) + { + entity.worldObj.setBlock(playerXCoord, playerYCoord-1, playerZCoord, properties.FabricBlockID); + break; + } + } + + if(entity.worldObj.isBlockOpaqueCube(playerXCoord, playerYCoord-1-count,playerZCoord)) + { + break; + } + if(count==19) + { + entity.worldObj.setBlock(playerXCoord, playerYCoord-1, playerZCoord, properties.FabricBlockID); + } + } + } + + this.generateDoor(world,linkData); + + + if(!entity.worldObj.isAirBlock(playerXCoord,playerYCoord+1,playerZCoord)) + { + if(Block.blocksList[entity.worldObj.getBlockId(playerXCoord,playerYCoord+1,playerZCoord)].isOpaqueCube() && + !mod_pocketDim.blockRift.isBlockImmune(entity.worldObj, playerXCoord+1,playerYCoord,playerZCoord)) + { + entity.worldObj.setBlock(playerXCoord,playerYCoord+1,playerZCoord,0); + } + } + if (!entity.worldObj.isAirBlock(playerXCoord,playerYCoord,playerZCoord)) + { + if(Block.blocksList[entity.worldObj.getBlockId(playerXCoord,playerYCoord,playerZCoord)].isOpaqueCube() && + !mod_pocketDim.blockRift.isBlockImmune(entity.worldObj, playerXCoord,playerYCoord,playerZCoord)) + { + entity.worldObj.setBlock(playerXCoord,playerYCoord,playerZCoord,0); + } + } + } + } + return; + } +} diff --git a/StevenDimDoors/mod_pocketDim/DimData.java b/StevenDimDoors/mod_pocketDim/DimData.java deleted file mode 100644 index bd56b84..0000000 --- a/StevenDimDoors/mod_pocketDim/DimData.java +++ /dev/null @@ -1,259 +0,0 @@ -package StevenDimDoors.mod_pocketDim; -/**Class that contains all the information about a specific dim that is pertienent to Dim Doors. Holds all the rifts present in the dim sorted by x,y,z and - * wether or not the dim is a pocket or not, along with its depth. - * @Return - */ -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; - -import StevenDimDoors.mod_pocketDim.core.NewLinkData; - -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class DimData implements Serializable -{ - public int dimID; - public int depth; - public int dimOrientation; - - public World world; - - public NewLinkData exitDimLink; - - public boolean isPocket; - public boolean hasBeenFilled=false; - public boolean hasDoor=false; - public boolean isDimRandomRift=false; - public DungeonGenerator dungeonGenerator = null; - //public boolean isPrivatePocket = false; - public HashMap>> linksInThisDim = new HashMap(); - HashMap dimX; - HashMap> dimY ; - - static final long serialVersionUID = 454342L; - - public DimData(int dimID, boolean isPocket, int depth, NewLinkData exitLinkData) - { - this.dimID=dimID; - this.depth=depth; - this.isPocket=isPocket; - - this.exitDimLink= exitLinkData; - } - - public DimData(int dimID, boolean isPocket, int depth, int exitLinkDimID, int exitX, int exitY, int exitZ) - { - this(dimID, isPocket, depth, new NewLinkData(exitLinkDimID, exitX, exitY, exitZ)); - } - - public NewLinkData findNearestRift(World world, int range, int x, int y, int z) - { - NewLinkData nearest=null; - float distance=range+1; - int i=-range; - int j=-range; - int k=-range; - DDProperties properties = DDProperties.instance(); - - while (i(); - } - } - else - { - this.dimX=new HashMap(); - this.dimY=new HashMap>(); - } - - this.dimX.put(link.locXCoord, link); - this.dimY.put(link.locYCoord, dimX); - this.linksInThisDim.put(link.locZCoord, dimY); - - //System.out.println("added link to dim "+this.dimID); - return link; - - } - - public NewLinkData addLinkToDim( int destinationDimID, int locationXCoord, int locationYCoord, int locationZCoord, int destinationXCoord, int destinationYCoord, int destinationZCoord, int linkOrientation) - { - NewLinkData linkData= new NewLinkData(this.dimID, destinationDimID, locationXCoord, locationYCoord, locationZCoord, destinationXCoord, destinationYCoord,destinationZCoord,this.isPocket,linkOrientation); - - return this.addLinkToDim(linkData); - } - - public boolean isLimbo() - { - return (this.dimID == DDProperties.instance().LimboDimensionID); - } - - public void removeLinkAtCoords(NewLinkData link) - { - this.removeLinkAtCoords(link.locDimID, link.locXCoord, link.locYCoord, link.locZCoord); - } - - public void removeLinkAtCoords(int locationID, int locationXCoord, int locationYCoord, int locationZCoord) - { - if (this.linksInThisDim.containsKey(locationZCoord)) - { - this.dimY=this.linksInThisDim.get(locationZCoord); - - if(this.dimY.containsKey(locationYCoord)) - { - this.dimX=this.dimY.get(locationYCoord); - } - else - { - this.dimX=new HashMap(); - } - } - else - { - this.dimX=new HashMap(); - this.dimY=new HashMap>(); - } - - this.dimX.remove(locationXCoord); - this.dimY.put(locationYCoord, dimX); - this.linksInThisDim.put(locationZCoord, dimY); - } - - public NewLinkData findLinkAtCoords(int locationXCoord, int locationYCoord, int locationZCoord) - { - try - { - if(this.linksInThisDim.containsKey(locationZCoord)) - { - this.dimY=this.linksInThisDim.get(locationZCoord); - - if(this.dimY.containsKey(locationYCoord)) - { - this.dimX=this.dimY.get(locationYCoord); - - if(this.dimX.containsKey(locationXCoord)) - { - return this.dimX.get(locationXCoord); - } - - } - } - } - catch(Exception E) - { - return null; - } - return null; - } - - public ArrayList getLinksInDim() - { - //TODO: We might want to modify this function, but I'm afraid of breaking something right now. - //To begin with, the name is wrong. This doesn't print anything! >_o ~SenseiKiwi - - ArrayList links = new ArrayList(); - if (this.linksInThisDim == null) - { - return links; - } - for (HashMap> first : this.linksInThisDim.values()) - { - for (HashMap second : first.values()) - { - for (NewLinkData linkData : second.values()) - { - links.add(linkData); - } - } - } - return links; - } -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/DungeonGenerator.java b/StevenDimDoors/mod_pocketDim/DungeonGenerator.java deleted file mode 100644 index 861bed7..0000000 --- a/StevenDimDoors/mod_pocketDim/DungeonGenerator.java +++ /dev/null @@ -1,85 +0,0 @@ -package StevenDimDoors.mod_pocketDim; - -import java.io.File; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; - -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; -import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonType; -import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; - -public class DungeonGenerator implements Serializable -{ - //This static field is hax so that I don't have to add an instance field to DungeonGenerator to support DungeonType. - //Otherwise it would have to be serializable and all sorts of problems would arise. - private static final HashMap dungeonTypes = new HashMap(); - - public int weight; - public String schematicPath; - public ArrayList sideRifts = new ArrayList(); - public NewLinkData exitLink; - public boolean isOpen; - - public int sideDoorsSoFar=0; - public int exitDoorsSoFar=0; - public int deadEndsSoFar=0; - - public DungeonGenerator(int weight, String schematicPath, boolean isOpen, DungeonType dungeonType) - { - this.weight = weight; - this.schematicPath = schematicPath; - this.isOpen = isOpen; - - dungeonTypes.put(this, dungeonType); //Hax... - } - - public DungeonType getDungeonType() - { - DungeonType type = dungeonTypes.get(this); - if (type == null) - { - //Infer the dungeon's type from its file name - //There is minimal risk of us applying this to untagged dungeons and this'll be phased out - //when we get the new save format. - try - { - File file = new File(schematicPath); - String typeName = file.getName().split("_")[0]; - String packName = file.getParentFile().getName(); - DungeonPack pack = DungeonHelper.instance().getDungeonPack(packName); - if (pack == null) - { - pack = DungeonHelper.instance().getDungeonPack("ruins"); - } - type = pack.getType(typeName); - } - catch (Exception e) { } - if (type == null) - { - type = DungeonType.UNKNOWN_TYPE; - } - dungeonTypes.put(this, type); - } - return type; - } - - @Override - public int hashCode() - { - return (schematicPath != null) ? schematicPath.hashCode() : 0; - } - - @Override - public boolean equals(Object other) - { - return equals((DungeonGenerator) other); - } - - public boolean equals(DungeonGenerator other) - { - return ((this.schematicPath != null && this.schematicPath.equals(other.schematicPath)) || - (this.schematicPath == other.schematicPath)); - } -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 24f67b5..4ed540e 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -1,13 +1,12 @@ package StevenDimDoors.mod_pocketDim; -import net.minecraft.world.World; import net.minecraftforge.client.event.sound.SoundLoadEvent; import net.minecraftforge.event.ForgeSubscribe; import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.entity.player.PlayerDropsEvent; import net.minecraftforge.event.world.WorldEvent; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -38,38 +37,7 @@ public class EventHookContainer @ForgeSubscribe public void onWorldLoad(WorldEvent.Load event) { - if (!mod_pocketDim.hasInitDims && event.world.provider.dimensionId == 0 && !event.world.isRemote) - { - System.out.println("Registering Pocket Dims"); - mod_pocketDim.hasInitDims = true; - dimHelper.instance.unregsisterDims(); - dimHelper.dimList.clear(); - dimHelper.instance.interDimLinkList.clear(); - dimHelper.instance.initPockets(); - } - - //TODO: In the future, we should iterate over DimHelper's dimension list. We ignore other dimensions anyway. - for (int dimensionID : dimHelper.getIDs()) - { - World world = dimHelper.getWorld(dimensionID); - int linkCount = 0; - - if (dimHelper.dimList.containsKey(dimensionID)) - { - for (NewLinkData link : dimHelper.instance.getDimData(dimensionID).getLinksInDim()) - { - if (!mod_pocketDim.blockRift.isBlockImmune(world, link.locXCoord, link.locYCoord, link.locZCoord)) - { - world.setBlock(link.locXCoord, link.locYCoord, link.locZCoord, properties.RiftBlockID); - } - linkCount++; - if (linkCount >= 100) - { - break; - } - } - } - } + RiftRegenerator.regenerateRiftsInAllWorlds(); } @ForgeSubscribe @@ -88,10 +56,9 @@ public class EventHookContainer @ForgeSubscribe public void onWorldsave(WorldEvent.Save event) { - - if (mod_pocketDim.hasInitDims && event.world.provider.dimensionId == 0) + if (PocketManager.isInitialized() && event.world.provider.dimensionId == 0) { - dimHelper.instance.save(); + PocketManager.save(); } } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/PacketHandler.java b/StevenDimDoors/mod_pocketDim/PacketHandler.java index a12ef35..2c5c18b 100644 --- a/StevenDimDoors/mod_pocketDim/PacketHandler.java +++ b/StevenDimDoors/mod_pocketDim/PacketHandler.java @@ -8,213 +8,164 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; -import net.minecraft.world.World; - -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteStreams; -import cpw.mods.fml.client.FMLClientHandler; -import cpw.mods.fml.common.network.FMLNetworkHandler; import cpw.mods.fml.common.network.IPacketHandler; import cpw.mods.fml.common.network.PacketDispatcher; import cpw.mods.fml.common.network.Player; public class PacketHandler implements IPacketHandler { - public static int regsiterDimPacketID = 3; - public static int registerLinkPacketID = 4; - public static int removeLinkPacketID = 5; - public static int linkKeyPacketID = 7; - public static int dimPacketID = 6; - public static int dimUpdatePacketID = 1; - private static DDProperties properties = null; + public static byte DIM_UPDATE_PACKET_ID = 1; + public static byte REGISTER_DIM_PACKET_ID = 3; + public static byte REGISTER_LINK_PACKET_ID = 4; + public static byte REMOVE_LINK_PACKET_ID = 5; + public static byte DIM_PACKET_ID = 6; + public static byte LINK_KEY_PACKET_ID = 7; @Override public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) { - if (packet.channel.equals("DimDoorPackets")) { - handleRandom(packet,player); + processPacket(packet, player); } - - } - private void handleRandom(Packet250CustomPayload packet, Player player) + private void processPacket(Packet250CustomPayload packet, Player player) { - ByteArrayDataInput data = ByteStreams.newDataInput(packet.data); - - int id=data.readByte(); - - - - - - if(id==regsiterDimPacketID) + ByteArrayDataInput data = ByteStreams.newDataInput(packet.data); + int id = data.readByte(); + if (id == REGISTER_DIM_PACKET_ID) { - - - - int dimId = data.readInt(); - // System.out.println("regsitered dim ID" + dimId); - try - { - DimData dimDataToAdd = new DimData(dimId, data.readBoolean(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt()); - - if(!dimHelper.dimList.containsKey(dimId)) - { - dimHelper.dimList.put(dimId, dimDataToAdd); - } - if(dimDataToAdd.isPocket) - { - if (properties == null) - properties = DDProperties.instance(); - - dimHelper.registerDimension(dimId, properties.PocketProviderID); - //System.out.println("regsitered dim ID" + dimId); - } - - } - catch (Exception e) - { - // e.printStackTrace(); - if(dimId!=0) - { - // System.out.println(String.valueOf(dimId)+"dimID already registered"); - } - } - - - } - - if(id==registerLinkPacketID) - { - - - - int dimId = data.readInt(); try { - DimData dimDataToAddLink= dimHelper.instance.getDimData(dimId); - - NewLinkData linkToAdd = new NewLinkData(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); - linkToAdd.hasGennedDoor=data.readBoolean(); - - dimHelper.instance.createLink(linkToAdd); + NewDimData dimDataToAdd = new NewDimData(dimId, data.readBoolean(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt()); + if(!PocketManager.dimList.containsKey(dimId)) + { + PocketManager.dimList.put(dimId, dimDataToAdd); + } + if (dimDataToAdd.isPocket) + { + DDProperties properties = DDProperties.instance(); + PocketManager.registerDimension(dimId, properties.PocketProviderID); + } } catch (Exception e) { e.printStackTrace(); - System.out.println("Tried to update client link data & failed!"); } - - } - if(id==removeLinkPacketID) + else if (id == REGISTER_LINK_PACKET_ID) { - - - - int dimId = data.readInt(); try { - DimData dimDataToRemoveFrom= dimHelper.instance.getDimData(dimId); + NewDimData dimDataToAddLink= PocketManager.instance.getDimData(dimId); - NewLinkData linkToAdd = new NewLinkData(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); - dimDataToRemoveFrom.removeLinkAtCoords(linkToAdd.locDimID, linkToAdd.locXCoord,linkToAdd.locYCoord, linkToAdd.locZCoord); + ILinkData linkToAdd = new ILinkData(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); + linkToAdd.hasGennedDoor=data.readBoolean(); + + PocketManager.instance.createLink(linkToAdd); } catch (Exception e) { - //e.printStackTrace(); - System.out.println("Tried to update client link data & failed!"); + System.err.println("Tried to update client link data and failed!"); + e.printStackTrace(); } - - } - if(id==this.linkKeyPacketID) + else if (id == REMOVE_LINK_PACKET_ID) { - NewLinkData link = new NewLinkData(data.readInt(), data.readInt(), data.readInt(), data.readInt()); - dimHelper.instance.interDimLinkList.put(data.readInt(), link); + int dimId = data.readInt(); + try + { + NewDimData dimDataToRemoveFrom= PocketManager.instance.getDimData(dimId); + + ILinkData linkToAdd = new ILinkData(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); + dimDataToRemoveFrom.removeLinkAtCoords(linkToAdd.locDimID, linkToAdd.locXCoord,linkToAdd.locYCoord, linkToAdd.locZCoord); + } + catch (Exception e) + { + System.out.println("Tried to update client link data & failed!"); + e.printStackTrace(); + } + } + else if (id == LINK_KEY_PACKET_ID) + { + ILinkData link = new ILinkData(data.readInt(), data.readInt(), data.readInt(), data.readInt()); + dimHelper.PocketManager.interDimLinkList.put(data.readInt(), link); } - - - - - } - - public static void onClientJoinPacket(INetworkManager manager, HashMap dimList) + + private static void processRegisterDimPacket() + { + + } + + private static void processUpdateDimPacket() + { + + } + + private static void processRegisterLinkPacket() + { + + } + + private static void processRemoveLinkPacket() + { + + } + + public static void onClientJoinPacket(INetworkManager manager, HashMap dimList) { - Collection dimIDs= dimList.keySet(); - Collection dimDataSet= dimList.values(); + Collection dimDataSet= dimList.values(); Collection packetsToSend = new HashSet(); - - - for(DimData data : dimDataSet) + for(NewDimData data : dimDataSet) { - manager.addToSendQueue(PacketHandler.onDimCreatedPacket(data)); - Collection >> linkList = data.linksInThisDim.values(); + Collection >> linkList = data.linksInThisDim.values(); for(HashMap map : linkList ) { - - Collection > linkList2 = map.values(); - + Collection > linkList2 = map.values(); for(HashMap map2 : linkList2) { - Collection linkList3 = map2.values(); + Collection linkList3 = map2.values(); - for(NewLinkData link : linkList3) + for(ILinkData link : linkList3) { - packetsToSend.add(( PacketHandler.onLinkCreatedPacket(link))); - - } - - - } - } - - - - - } + for (Packet250CustomPayload packet : packetsToSend) { manager.addToSendQueue(packet); } - } - - public static Packet250CustomPayload onLinkCreatedPacket(NewLinkData link) + public static void sendLinkCreatedPacket(ILinkData link) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dataOut = new DataOutputStream(bos); try { - dataOut.writeByte(PacketHandler.registerLinkPacketID); dataOut.writeInt(link.locDimID); dataOut.writeInt(link.destDimID); @@ -228,19 +179,14 @@ public class PacketHandler implements IPacketHandler dataOut.writeInt(link.linkOrientation); dataOut.writeBoolean(link.hasGennedDoor); - - } - - - catch (IOException e) { e.printStackTrace(); } Packet250CustomPayload packet= new Packet250CustomPayload(); - packet.channel="DimDoorPackets"; + packet.channel = "DimDoorPackets"; packet.data = bos.toByteArray(); packet.length = bos.size();; PacketDispatcher.sendPacketToAllPlayers(packet); @@ -248,14 +194,13 @@ public class PacketHandler implements IPacketHandler } - public static Packet250CustomPayload linkKeyPacket(NewLinkData link, int key) + public static void sendlinkKeyPacket(ILinkData link, int key) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dataOut = new DataOutputStream(bos); try { - dataOut.writeByte(PacketHandler.linkKeyPacketID); dataOut.writeInt(link.destDimID); @@ -263,36 +208,27 @@ public class PacketHandler implements IPacketHandler dataOut.writeInt(link.destYCoord); dataOut.writeInt(link.destZCoord); dataOut.writeInt(key); - - - } - - - catch (IOException e) { e.printStackTrace(); } - Packet250CustomPayload packet= new Packet250CustomPayload(); + Packet250CustomPayload packet = new Packet250CustomPayload(); packet.channel="DimDoorPackets"; packet.data = bos.toByteArray(); packet.length = bos.size();; PacketDispatcher.sendPacketToAllPlayers(packet); - return packet; } - public static void onLinkRemovedPacket(NewLinkData link) + public static void sendLinkRemovedPacket(ILinkData link) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dataOut = new DataOutputStream(bos); - try { - dataOut.writeByte(PacketHandler.removeLinkPacketID); dataOut.writeInt(link.locDimID); dataOut.writeInt(link.destDimID); @@ -303,13 +239,7 @@ public class PacketHandler implements IPacketHandler dataOut.writeInt(link.destYCoord); dataOut.writeInt(link.destZCoord); dataOut.writeBoolean(link.isLocPocket); - - - } - - - catch (IOException e) { e.printStackTrace(); @@ -323,17 +253,13 @@ public class PacketHandler implements IPacketHandler } - public static Packet250CustomPayload onDimCreatedPacket(DimData data) + public static void sendDimCreatedPacket(NewDimData data) { - - ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dataOut = new DataOutputStream(bos); - try { - dataOut.writeByte(PacketHandler.regsiterDimPacketID); dataOut.writeInt(data.dimID); dataOut.writeBoolean(data.isPocket); @@ -343,14 +269,7 @@ public class PacketHandler implements IPacketHandler dataOut.writeInt(data.exitDimLink.destXCoord); dataOut.writeInt(data.exitDimLink.destYCoord); dataOut.writeInt(data.exitDimLink.destZCoord); - - - - } - - - catch (IOException e) { e.printStackTrace(); @@ -363,40 +282,9 @@ public class PacketHandler implements IPacketHandler PacketDispatcher.sendPacketToAllPlayers(packet); return packet; - - } - /** - private void handleObjectPacket(Packet250CustomPayload packet, Player player) - { - ObjectInputStream data = new ObjectInputStream; - int length = data.readInt(); - int id=data.readByte(); - System.out.println(id); - if(id==dimPacketID) - { - - - - - try - { - DimData dimData = data.read - - dimHelper.dimList.put(key, value) - - } - catch (Exception e) - { - e.printStackTrace(); - } - - - } - } - **/ - public static void sendDimObject(DimData dim) + public static void sendDimObject(NewDimData dim) { try { @@ -410,15 +298,9 @@ public class PacketHandler implements IPacketHandler packet.length = bos.size();; PacketDispatcher.sendPacketToAllPlayers(packet); } - catch (IOException e) - - + catch (IOException e) { e.printStackTrace(); } } - - - - } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/SchematicLoader.java b/StevenDimDoors/mod_pocketDim/SchematicLoader.java deleted file mode 100644 index 7e76b94..0000000 --- a/StevenDimDoors/mod_pocketDim/SchematicLoader.java +++ /dev/null @@ -1,205 +0,0 @@ -package StevenDimDoors.mod_pocketDim; -import java.io.File; -import java.io.FileNotFoundException; -import java.util.HashMap; -import java.util.Random; - -import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; -import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; -import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; -import StevenDimDoors.mod_pocketDim.schematic.InvalidSchematicException; - -public class SchematicLoader -{ - private SchematicLoader() { } - - public static boolean generateDungeonPocket(NewLinkData link, DDProperties properties) - { - if (link == null || properties == null) - { - return false; - } - try - { - String schematicPath; - int originDimID = link.locDimID; - int destDimID = link.destDimID; - HashMap dimList = dimHelper.dimList; - DungeonHelper dungeonHelper = DungeonHelper.instance(); - World world; - - if (dimList.containsKey(destDimID)) - { - dimList.get(destDimID).hasBeenFilled = true; - if (dimHelper.getWorld(destDimID) == null) - { - dimHelper.initDimension(destDimID); - } - world = dimHelper.getWorld(destDimID); - - if (dimList.get(destDimID).dungeonGenerator == null) - { - //TODO: We should centralize RNG initialization and world-seed modifiers for each specific application. - final long localSeed = world.getSeed() ^ 0x2F50DB9B4A8057E4L ^ calculateDestinationSeed(link); - final Random random = new Random(localSeed); - - dungeonHelper.generateDungeonLink(link, dungeonHelper.getDimDungeonPack(originDimID), random); - } - schematicPath = dimList.get(destDimID).dungeonGenerator.schematicPath; - } - else - { - return false; - } - - DungeonSchematic dungeon = checkSourceAndLoad(schematicPath); - boolean valid; - - //Validate the dungeon's dimensions - if (hasValidDimensions(dungeon)) - { - dungeon.applyImportFilters(properties); - - //Check that the dungeon has an entrance or we'll have a crash - if (dungeon.getEntranceDoorLocation() != null) - { - valid = true; - } - else - { - System.err.println("The following schematic file does not have an entrance: " + schematicPath); - valid = false; - } - } - else - { - System.err.println("The following schematic file has dimensions that exceed the maximum permitted dimensions for dungeons: " + schematicPath); - valid = false; - } - - if (!valid) - { - //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. - System.err.println("The dungeon will not be loaded."); - DungeonGenerator defaultError = dungeonHelper.getDefaultErrorDungeon(); - dimList.get(destDimID).dungeonGenerator = defaultError; - dungeon = checkSourceAndLoad(defaultError.schematicPath); - dungeon.applyImportFilters(properties); - } - - //Adjust the height at which the dungeon is placed to prevent vertical clipping - int fixedY = adjustDestinationY(world, link.destYCoord, dungeon); - if (fixedY != link.destYCoord) - { - dimHelper helperInstance = dimHelper.instance; - helperInstance.moveLinkDataDestination(link, link.destXCoord, fixedY, link.destZCoord, link.destDimID, true); - } - DungeonPackConfig packConfig = dungeonHelper.getDimDungeonPack(destDimID).getConfig(); - - dungeon.copyToWorld(world, new Point3D(link.destXCoord, link.destYCoord, link.destZCoord), - link.linkOrientation, originDimID, destDimID, packConfig.doDistortDoorCoordinates()); - return true; - } - catch (Exception e) - { - e.printStackTrace(); - return false; - } - } - - private static int adjustDestinationY(World world, int y, DungeonSchematic dungeon) - { - //The goal here is to guarantee that the dungeon fits within the vertical bounds - //of the world while shifting it as little as possible. - int destY = y; - - //Is the top of the dungeon going to be at Y < worldHeight? - int entranceY = dungeon.getEntranceDoorLocation().getY(); - int pocketTop = (dungeon.getHeight() - 1) + destY - entranceY; - int worldHeight = world.getHeight(); - if (pocketTop >= worldHeight) - { - destY = (worldHeight - 1) - (dungeon.getHeight() - 1) + entranceY; - } - - //Is the bottom of the dungeon at Y >= 0? - if (destY < entranceY) - { - destY = entranceY; - } - return destY; - } - - private static boolean hasValidDimensions(DungeonSchematic dungeon) - { - return (dungeon.getWidth() <= DungeonHelper.MAX_DUNGEON_WIDTH && - dungeon.getHeight() <= DungeonHelper.MAX_DUNGEON_HEIGHT && - dungeon.getLength() <= DungeonHelper.MAX_DUNGEON_LENGTH); - } - - private static DungeonSchematic checkSourceAndLoad(String schematicPath) throws FileNotFoundException, InvalidSchematicException - { - //FIXME: Change this code once we introduce an isInternal flag in dungeon data - DungeonSchematic dungeon; - if ((new File(schematicPath)).exists()) - { - dungeon = DungeonSchematic.readFromFile(schematicPath); - } - else - { - dungeon = DungeonSchematic.readFromResource(schematicPath); - } - return dungeon; - } - - private static long calculateDestinationSeed(LinkData link) - { - //Time for some witchcraft. - //The code here is inspired by a discussion on Stack Overflow regarding hash codes for 3D. - //Source: http://stackoverflow.com/questions/9858376/hashcode-for-3d-integer-coordinates-with-high-spatial-coherence - - //Use 8 bits from Y and 16 bits from X and Z. Mix in 8 bits from the destination dim ID too - that means - //even if you aligned two doors perfectly between two pockets, it's unlikely they would lead to the same dungeon. - //We map bits in reverse order to produce more varied RNG output for nearly-identical points. The reason is - //that Java's Random outputs the 32 MSBs of its internal state to produce its output. If the differences - //between two seeds are small (i.e. in the LSBs), then they will tend to produce similar random outputs anyway! - - //Only bother to assign the 48 least-significant bits since Random only takes those bits from its seed. - //NOTE: The casts to long are necessary to get the right results from the bit shifts!!! - - int bit; - int index; - long hash; - final int w = link.destDimID; - final int x = link.destXCoord; - final int y = link.destYCoord; - final int z = link.destZCoord; - - hash = 0; - index = 48; - for (bit = 0; bit < 8; bit++) - { - hash |= (long) ((w >> bit) & 1) << index; - index--; - hash |= (long) ((x >> bit) & 1) << index; - index--; - hash |= (long) ((y >> bit) & 1) << index; - index--; - hash |= (long) ((z >> bit) & 1) << index; - index--; - } - for (; bit < 16; bit++) - { - hash |= (long) ((x >> bit) & 1) << index; - index--; - hash |= (long) ((z >> bit) & 1) << index; - index--; - } - - return hash; - } -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/TileEntityRift.java b/StevenDimDoors/mod_pocketDim/TileEntityRift.java index cfff50f..72565c4 100644 --- a/StevenDimDoors/mod_pocketDim/TileEntityRift.java +++ b/StevenDimDoors/mod_pocketDim/TileEntityRift.java @@ -2,80 +2,68 @@ package StevenDimDoors.mod_pocketDim; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Random; -import StevenDimDoors.mod_pocketDim.blocks.BlockRift; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; -import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; -import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; - import net.minecraft.entity.DataWatcher; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet; -import net.minecraft.network.packet.Packet130UpdateSign; import net.minecraft.network.packet.Packet132TileEntityData; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.util.Point4D; public class TileEntityRift extends TileEntity - { + private static Random random = new Random(); + public int xOffset=0; public int yOffset=0; public int zOffset=0; public int distance=0; public boolean hasGrownRifts=false; public boolean shouldClose=false; - //public boolean isClosing=false; public boolean isNearRift=false; private int count=200; private int count2 = 0; public int age = 0; public HashMap renderingCenters = new HashMap(); - public NewLinkData nearestRiftData; + public IDimLink nearestRiftData; public int spawnedEndermenID=0; - Random rand; DataWatcher watcher = new DataWatcher(); - - - - + public void updateEntity() - { - if(rand == null) - { - rand = new Random(); - rand.setSeed(this.xCoord+this.yCoord+this.zCoord); - } - if(dimHelper.instance.getLinkDataFromCoords(xCoord, yCoord, zCoord, this.worldObj.provider.dimensionId)==null)//ensures that only rifts with TEs are active - { - this.invalidate(); - if(this.worldObj.getBlockId(xCoord, yCoord, zCoord)==mod_pocketDim.blockRift.blockID)//deletes rift TE if its behind something thats not a rift block - { - this.worldObj.setBlockToAir(xCoord, yCoord, zCoord); - this.invalidate(); - return; - } - } - if(this.worldObj.getBlockId(xCoord, yCoord, zCoord)!=mod_pocketDim.blockRift.blockID)//deletes rift TE if its behind something thats not a rift block - { - this.invalidate(); - return; - } - - //The code for the new rift rendering hooks in here, as well as in the ClientProxy to bind the TESR to the rift. - //It is inactive for now. - /** + { + //Invalidate this tile entity if it shouldn't exist + if (PocketManager.getLink(xCoord, yCoord, zCoord, worldObj.provider.dimensionId) == null) + { + this.invalidate(); + if (worldObj.getBlockId(xCoord, yCoord, zCoord) == mod_pocketDim.blockRift.blockID) + { + worldObj.setBlockToAir(xCoord, yCoord, zCoord); + this.invalidate(); + return; + } + } + + if (worldObj.getBlockId(xCoord, yCoord, zCoord) != mod_pocketDim.blockRift.blockID) + { + this.invalidate(); + return; + } + + //The code for the new rift rendering hooks in here, as well as in the ClientProxy to bind the TESR to the rift. + //It is inactive for now. + /** if(rand.nextInt(15) == 1) { age = age + 1; @@ -83,213 +71,219 @@ public class TileEntityRift extends TileEntity } this.clearBlocksOnRift(); **/ - - //This code should execute once every 10 seconds - count++; - if(count>200) - { - this.spawnEndermen(); - this.calculateOldParticleOffset(); //this also calculates the distance for the particle stuff. - if(distance>1)//only grow if rifts are nearby - { - this.grow(distance); - } - count=0; - } - - if(this.shouldClose)//Determines if rift should render white closing particles and spread closing effect to other rifts nearby - { - closeRift(); - } - } - public boolean canUpdate() - { - return true; - } - public void clearBlocksOnRift()//clears blocks for the new rending effect - { - - for(double[] coord: this.renderingCenters.values()) - { - int x = MathHelper.floor_double(coord[0]+.5); - int y = MathHelper.floor_double(coord[1]+.5); - int z = MathHelper.floor_double(coord[2]+.5); - - if(!BlockRift.isBlockImmune(worldObj,this.xCoord+x, this.yCoord+y, this.zCoord+z))//right side - { - this.worldObj.setBlockToAir(this.xCoord+x, this.yCoord+y, this.zCoord+z); - } - - if(!BlockRift.isBlockImmune(worldObj,this.xCoord-x, this.yCoord-y, this.zCoord-z))//left side - { - this.worldObj.setBlockToAir(this.xCoord-x, this.yCoord-y, this.zCoord-z); - } - } - } - public void spawnEndermen() - { - if(this.worldObj.isRemote) - { - return; - } - if(dimHelper.instance.getDimData(this.worldObj.provider.dimensionId)!=null)//ensures that this rift is only spawning one enderman at a time, to prevent hordes of endermen - { - if(this.worldObj.getEntityByID(this.spawnedEndermenID)!=null) + //This code should execute once every 10 seconds + count++; + if (count > 200) + { + this.spawnEndermen(); + this.calculateOldParticleOffset(); //this also calculates the distance for the particle stuff. + if (distance > 1) //only grow if rifts are nearby { - if(this.worldObj.getEntityByID(this.spawnedEndermenID) instanceof EntityEnderman) + this.grow(distance); + } + count = 0; + } + + if (this.shouldClose) //Determines if rift should render white closing particles and spread closing effect to other rifts nearby + { + closeRift(); + } + } + + public boolean canUpdate() + { + return true; + } + + public void clearBlocksOnRift() + { + //clears blocks for the new rending effect + + for(double[] coord: this.renderingCenters.values()) + { + int x = MathHelper.floor_double(coord[0]+.5); + int y = MathHelper.floor_double(coord[1]+.5); + int z = MathHelper.floor_double(coord[2]+.5); + + if (!mod_pocketDim.blockRift.isBlockImmune(worldObj,this.xCoord+x, this.yCoord+y, this.zCoord+z))//right side + { + worldObj.setBlockToAir(this.xCoord+x, this.yCoord+y, this.zCoord+z); + } + + if (!mod_pocketDim.blockRift.isBlockImmune(worldObj,this.xCoord-x, this.yCoord-y, this.zCoord-z))//left side + { + worldObj.setBlockToAir(this.xCoord-x, this.yCoord-y, this.zCoord-z); + } + + } + } + + public void spawnEndermen() + { + if (worldObj.isRemote) + { + return; + } + + NewDimData dimension = PocketManager.getDimensionData(worldObj); + + //Ensure that this rift is only spawning one enderman at a time, to prevent hordes of endermen + Entity entity = worldObj.getEntityByID(this.spawnedEndermenID); + if (entity != null && entity instanceof EntityEnderman) + { + return; + } + + //enderman will only spawn in groups of rifts + nearestRiftData = dimension.findNearestRift(worldObj, 5, xCoord, yCoord, zCoord); + if (nearestRiftData != null) + { + if (random.nextInt(30) == 0) + { + @SuppressWarnings("unchecked") + List list = (List) worldObj.getEntitiesWithinAABB(EntityEnderman.class, + AxisAlignedBB.getBoundingBox(xCoord - 9, yCoord - 3, zCoord - 9, xCoord + 9, yCoord + 3, zCoord + 9)); + + if (list.isEmpty()) { - return; + EntityEnderman enderman = new EntityEnderman(worldObj); + enderman.setLocationAndAngles(xCoord + 0.5, yCoord - 1, zCoord + 0.5, 5, 6); + worldObj.spawnEntityInWorld(enderman); + } + } + } + else + { + this.isNearRift = false; + } + } + + public void closeRift() + { + NewDimData dimension = PocketManager.getDimensionData(worldObj); + if (count2 > 20 && count2 < 22) + { + nearestRiftData = dimension.findNearestRift(worldObj, 10, xCoord, yCoord, zCoord); + if (this.nearestRiftData != null) + { + Point4D location = nearestRiftData.source(); + TileEntityRift rift = (TileEntityRift) worldObj.getBlockTileEntity(location.getX(), location.getY(), location.getZ()); + if (rift != null) + { + rift.shouldClose = true; } } - - nearestRiftData = dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).findNearestRift(worldObj, 5, xCoord, yCoord, zCoord);//enderman will only spawn in groups of rifts - if(nearestRiftData!=null) - { - if(rand.nextInt(30)==0&&!this.worldObj.isRemote) - { - - List list = worldObj.getEntitiesWithinAABB(EntityEnderman.class, AxisAlignedBB.getBoundingBox( this.xCoord-9, this.yCoord-3, this.zCoord-9, this.xCoord+9, this.yCoord+3, this.zCoord+9)); - - if(list.size()<1) - { - - - EntityEnderman creeper = new EntityEnderman(worldObj); - creeper.setLocationAndAngles(this.xCoord+.5, this.yCoord-1, this.zCoord+.5, 5, 6); - worldObj.spawnEntityInWorld(creeper); - } - } - } - else - { - this.isNearRift=false; - } - - } - } - public void closeRift() - { - if(count2>20&&count2<22) - { - nearestRiftData = dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).findNearestRift(worldObj, 10, xCoord, yCoord, zCoord); - if(this.nearestRiftData!=null) - { - TileEntityRift rift = (TileEntityRift) this.worldObj.getBlockTileEntity(nearestRiftData.locXCoord, nearestRiftData.locYCoord, nearestRiftData.locZCoord); - if(rift!=null) - { - rift.shouldClose=true; - } - } - } - if(count2>40) - { - this.invalidate(); - this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord,0); - if(dimHelper.instance.getLinkDataFromCoords(this.xCoord, this.yCoord, this.zCoord, this.worldObj.provider.dimensionId)!=null) - { - dimHelper.instance.removeLink(this.worldObj.provider.dimensionId, this.xCoord, this.yCoord, this.zCoord); - this.worldObj.playSound(xCoord, yCoord, zCoord, "mods.DimDoors.sfx.riftClose", (float) .7, 1,true); + } + if (count2 > 40) + { + this.invalidate(); + worldObj.setBlockToAir(xCoord, yCoord, zCoord); + if (dimension.getLink(xCoord, yCoord, zCoord) != null) + { + dimension.deleteLink(xCoord, yCoord, zCoord); + worldObj.playSound(xCoord, yCoord, zCoord, "mods.DimDoors.sfx.riftClose", (float) .7, 1, true); + } + } + count2++; + } - } - } - count2++; - } - public void calculateOldParticleOffset() - { - nearestRiftData = dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).findNearestRift(worldObj, 5, xCoord, yCoord, zCoord); - if(nearestRiftData!=null) - { - this.xOffset=this.xCoord-nearestRiftData.locXCoord; - this.yOffset=this.yCoord-nearestRiftData.locYCoord; - this.zOffset=this.zCoord-nearestRiftData.locZCoord; - this.distance=(int) (MathHelper.abs(xOffset)+MathHelper.abs(yOffset)+MathHelper.abs(zOffset)); - this.isNearRift=true; - - if(!this.worldObj.isRemote&&distance>1) - { - try - { - grow(distance); - } - catch(Exception e) - { - - } - } - } - } - public void grow(int distance) - { - if(this.worldObj.isRemote) - { - return; - } - int growCount=0; - if(rand.nextInt(distance*2)==0) - { + public void calculateOldParticleOffset() + { + nearestRiftData = PocketManager.getDimensionData(worldObj).findNearestRift(worldObj, 5, xCoord, yCoord, zCoord); + if (nearestRiftData != null) + { + Point4D location = nearestRiftData.source(); + this.xOffset = this.xCoord - location.getX(); + this.yOffset = this.yCoord - location.getY(); + this.zOffset = this.zCoord - location.getZ(); + this.distance = Math.abs(xOffset) + Math.abs(yOffset) + Math.abs(zOffset); + this.isNearRift=true; + + if (!worldObj.isRemote && distance > 1) + { + try + { + grow(distance); + } + catch(Exception e) + { + + } + } + } + } + + public void grow(int distance) + { + if(worldObj.isRemote) + { + return; + } + int growCount=0; + if(random.nextInt(distance*2)==0) + { int x=0,y=0,z=0; while(growCount<100) { growCount++; - x=this.xCoord+(1-(rand.nextInt(2)*2)*rand.nextInt(6)); - y=this.yCoord+(1-(rand.nextInt(2)*2)*rand.nextInt(4)); - z=this.zCoord+(1-(rand.nextInt(2)*2)*rand.nextInt(6)); - if(this.worldObj.isAirBlock(x, y, z)) + x=this.xCoord+(1-(random.nextInt(2)*2)*random.nextInt(6)); + y=this.yCoord+(1-(random.nextInt(2)*2)*random.nextInt(4)); + z=this.zCoord+(1-(random.nextInt(2)*2)*random.nextInt(6)); + if(worldObj.isAirBlock(x, y, z)) { break; } } - if (growCount<100) + if (growCount < 100) { - - NewLinkData link = dimHelper.instance.getLinkDataFromCoords(this.xCoord, this.yCoord, this.zCoord, worldObj); - if(link!=null) + NewDimData dimension = PocketManager.getDimensionData(worldObj); + IDimLink link = dimension.getLink(xCoord, yCoord, zCoord); + if (link != null) { - if(!this.hasGrownRifts&&rand.nextInt(3)==0) + if (!this.hasGrownRifts && random.nextInt(3) == 0) { - // System.out.println(link.numberofChildren); - link.numberofChildren++; - dimHelper.instance.createLink(this.worldObj.provider.dimensionId, link.destDimID, x, y, z, link.destXCoord, link.destYCoord, link.destZCoord).numberofChildren=link.numberofChildren+1; - this.hasGrownRifts=true; + dimension.createChildLink(x, y, z, link); + this.hasGrownRifts = true; } } } - } - } - public void calculateNextRenderQuad(float age, Random rand) - { - int maxSize = MathHelper.floor_double((Math.log(Math.pow(age+1,2)))); - int iteration=0; - while(iteration< maxSize) - { - iteration++; - double fl =Math.log(iteration+1)/(iteration); - double[] coords= new double[4]; - double noise = ((rand.nextGaussian())/(2+iteration/3+1)); - - if(!this.renderingCenters.containsKey(iteration-1)) - { - if(rand.nextBoolean()) - { + } + } + + public void calculateNextRenderQuad(float age, Random rand) + { + int maxSize = MathHelper.floor_double((Math.log(Math.pow(age+1,2)))); + int iteration=0; + while(iteration< maxSize) + { + iteration++; + double fl =Math.log(iteration+1)/(iteration); + double[] coords= new double[4]; + double noise = ((rand.nextGaussian())/(2+iteration/3+1)); + + if(!this.renderingCenters.containsKey(iteration-1)) + { + if (rand.nextBoolean()) + { coords[0] = fl*1.5; coords[1] = rand.nextGaussian()/5; coords[2] = 0; coords[3] = 1; - } - else - { + } + else + { coords[0] = 0; coords[1] = rand.nextGaussian()/5; coords[2] = fl*1.5; coords[3] = 0; - } - this.renderingCenters.put(iteration-1,coords); - iteration--; - } - else if(!this.renderingCenters.containsKey(iteration)) - { + } + this.renderingCenters.put(iteration-1,coords); + iteration--; + } + else if(!this.renderingCenters.containsKey(iteration)) + { if(this.renderingCenters.get(iteration-1)[3]==0) { coords[0]=noise/2+this.renderingCenters.get(iteration-1)[0]; @@ -305,66 +299,66 @@ public class TileEntityRift extends TileEntity coords[3] = 1; } this.renderingCenters.put(iteration,coords); - } - } - } - - @Override - public boolean shouldRenderInPass(int pass) - { - return pass == 1; - } - @Override - public void readFromNBT(NBTTagCompound nbt) - { - super.readFromNBT(nbt); - this.renderingCenters= new HashMap(); - this.count=nbt.getInteger("count"); - this.count2=nbt.getInteger("count2"); - this.xOffset = nbt.getInteger("xOffset"); - this.yOffset = nbt.getInteger("yOffset"); - this.zOffset = nbt.getInteger("zOffset"); - this.hasGrownRifts =nbt.getBoolean("grownRifts"); - this.age=nbt.getInteger("age"); - this.shouldClose=nbt.getBoolean("shouldClose"); - this.spawnedEndermenID = nbt.getInteger("spawnedEndermenID"); - } - - @Override - public void writeToNBT(NBTTagCompound nbt) - { - super.writeToNBT(nbt); - nbt.setInteger("hashMapSize", this.renderingCenters.size()); - nbt.setInteger("age", this.age); - nbt.setInteger("count", this.count); - nbt.setInteger("count2", this.count2); - nbt.setBoolean("grownRifts",this.hasGrownRifts); - nbt.setInteger("xOffset", this.xOffset); - nbt.setInteger("yOffset", this.yOffset); - nbt.setInteger("zOffset", this.zOffset); - nbt.setBoolean("shouldClose", this.shouldClose); - nbt.setInteger("spawnedEndermenID", this.spawnedEndermenID); - } - - @Override - public Packet getDescriptionPacket() - { - Packet132TileEntityData packet = new Packet132TileEntityData(); - packet.actionType = 0; - packet.xPosition = xCoord; - packet.yPosition = yCoord; - packet.zPosition = zCoord; - - NBTTagCompound nbt = new NBTTagCompound(); - writeToNBT(nbt); - packet.customParam1 = nbt; - return packet; + } } + } - @Override - public void onDataPacket(INetworkManager net, Packet132TileEntityData pkt) - { - readFromNBT(pkt.customParam1); - } - + @Override + public boolean shouldRenderInPass(int pass) + { + return pass == 1; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) + { + super.readFromNBT(nbt); + this.renderingCenters= new HashMap(); + this.count=nbt.getInteger("count"); + this.count2=nbt.getInteger("count2"); + this.xOffset = nbt.getInteger("xOffset"); + this.yOffset = nbt.getInteger("yOffset"); + this.zOffset = nbt.getInteger("zOffset"); + this.hasGrownRifts =nbt.getBoolean("grownRifts"); + this.age=nbt.getInteger("age"); + this.shouldClose=nbt.getBoolean("shouldClose"); + this.spawnedEndermenID = nbt.getInteger("spawnedEndermenID"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) + { + super.writeToNBT(nbt); + nbt.setInteger("hashMapSize", this.renderingCenters.size()); + nbt.setInteger("age", this.age); + nbt.setInteger("count", this.count); + nbt.setInteger("count2", this.count2); + nbt.setBoolean("grownRifts",this.hasGrownRifts); + nbt.setInteger("xOffset", this.xOffset); + nbt.setInteger("yOffset", this.yOffset); + nbt.setInteger("zOffset", this.zOffset); + nbt.setBoolean("shouldClose", this.shouldClose); + nbt.setInteger("spawnedEndermenID", this.spawnedEndermenID); + } + + @Override + public Packet getDescriptionPacket() + { + Packet132TileEntityData packet = new Packet132TileEntityData(); + packet.actionType = 0; + packet.xPosition = xCoord; + packet.yPosition = yCoord; + packet.zPosition = zCoord; + + NBTTagCompound nbt = new NBTTagCompound(); + writeToNBT(nbt); + packet.customParam1 = nbt; + return packet; + } + + @Override + public void onDataPacket(INetworkManager net, Packet132TileEntityData pkt) + { + readFromNBT(pkt.customParam1); + } } diff --git a/StevenDimDoors/mod_pocketDim/TransientDoor.java b/StevenDimDoors/mod_pocketDim/TransientDoor.java index 47a0445..a0a8fcd 100644 --- a/StevenDimDoors/mod_pocketDim/TransientDoor.java +++ b/StevenDimDoors/mod_pocketDim/TransientDoor.java @@ -2,152 +2,102 @@ package StevenDimDoors.mod_pocketDim; import java.util.Random; -import StevenDimDoors.mod_pocketDim.blocks.ExitDoor; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.Item; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Icon; import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.blocks.ExitDoor; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class TransientDoor extends ExitDoor { - + protected TransientDoor(int par1, Material material) { super(par1, Material.grass); - // this.blockIndexInTexture = 18; + // this.blockIndexInTexture = 18; if (properties == null) properties = DDProperties.instance(); } - - private static DDProperties properties = null; - - public void registerIcons(IconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); - } + private static DDProperties properties = null; + + public void registerIcons(IconRegister par1IconRegister) + { + this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); + + } @SideOnly(Side.CLIENT) - /** - * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side - */ - public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) - { - - return this.blockIcon; - - - } - public boolean isCollidable() - { - return false; - } - - public void onBlockAdded(World par1World, int par2, int par3, int par4) - { - super.onBlockAdded(par1World, par2, par3, par4); - this.updateAttatchedTile(par1World, par2, par3, par4); - } - - public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) - { - return null; - } + /** + * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side + */ + public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) + { + + return this.blockIcon; + + + } + public boolean isCollidable() + { + return false; + } + + public void onBlockAdded(World par1World, int par2, int par3, int par4) + { + super.onBlockAdded(par1World, par2, par3, par4); + this.updateAttachedTile(par1World, par2, par3, par4); + } + + public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) + { + return null; + } @Override - public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity) - { - - int var12 = (int) (MathHelper.floor_double((double)((par5Entity.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); - int num = par1World.getBlockMetadata(par2, par3, par4); - // System.out.println("metadata "+num+" orientation "+var12); - - if(!par1World.isRemote&&(num)==var12||!par1World.isRemote&&!(par5Entity instanceof EntityPlayer)) + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) + { + //TODO: Would it kill us to use REASONABLE variable names? <_< ~SenseiKiwi + int var12 = (int) (MathHelper.floor_double((double) ((entity.rotationYaw + 90) * 4.0F / 360.0F) + 0.5D) & 3); + + int orientation = world.getBlockMetadata(x, y - 1, z); + if (!world.isRemote && (orientation >= 4 && orientation <= 7) && (orientation - 4) == var12 && + world.getBlockId(x, y - 1, z) == this.blockID) + { + this.onPoweredBlockChange(world, x, y, z, false); + + IDimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); + if (link != null) { - - - - - NewLinkData linkData= dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World); - if(linkData!=null) - { - if(dimHelper.dimList.containsKey(linkData.destDimID)) - { - par1World.setBlock(par2, par3-1, par4, 0); - par1World.setBlock(par2, par3, par4, properties.RiftBlockID); - dimHelper.instance.traverseDimDoor(par1World, linkData, par5Entity); - - - } - } - - else - { - linkData= dimHelper.instance.getLinkDataFromCoords(par2, par3+1, par4, par1World); - if(linkData!=null) - { - if(dimHelper.dimList.containsKey(linkData.destDimID)) - { - par1World.setBlock(par2, par3, par4, 0); - par1World.setBlock(par2, par3+1, par4, properties.RiftBlockID); - dimHelper.instance.traverseDimDoor(par1World, linkData, par5Entity); - - - } - } - } - - } - - - } - - - - + //Turn the transient door into a rift before teleporting the entity + world.setBlock(x, y, z, properties.RiftBlockID); + world.setBlockToAir(x, y - 1, z); + PocketManager.traverseDimDoor(world, link, entity); + } + } + } + public int idPicked(World par1World, int par2, int par3, int par4) + { + return 0; + } - - public int idPicked(World par1World, int par2, int par3, int par4) - { - return 0; - } - - public int idDropped(int par1, Random par2Random, int par3) - { - return 0; - } - - - - - /** - * A function to open a door. - */ - - public int getRenderType() - { - return 8; - } - + public int idDropped(int par1, Random par2Random, int par3) + { + return 0; + } + public int getRenderType() + { + return 8; + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java index 0e047e5..da81b74 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java @@ -9,14 +9,12 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import StevenDimDoors.mod_pocketDim.BlankTeleporter; +import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; -import cpw.mods.fml.common.FMLCommonHandler; public class BlockDimWallPerm extends Block { @@ -45,32 +43,33 @@ public class BlockDimWallPerm extends Block /** * Only matters if the player is in limbo, acts to teleport the player from limbo back to dim 0 */ - public void onEntityWalking(World par1World, int par2, int par3, int par4, Entity par5Entity) + public void onEntityWalking(World par1World, int par2, int par3, int par4, Entity entity) { - if(!par1World.isRemote&&par1World.provider.dimensionId==properties.LimboDimensionID) + if (!par1World.isRemote && par1World.provider.dimensionId == properties.LimboDimensionID) { Random rand = new Random(); - NewLinkData link=dimHelper.instance.getRandomLinkData(false); - if(link==null) + IDimLink link = PocketManager.getRandomLinkData(false); + if (link == null) { link =new NewLinkData(0,0,0,0); } link.destDimID = 0; link.locDimID = par1World.provider.dimensionId; + World overworld = DimensionManager.getWorld(0); - - if(dimHelper.getWorld(0)==null) + if (overworld == null) { - dimHelper.initDimension(0); + DimensionManager.initDimension(0); + overworld = DimensionManager.getWorld(0); } - - - if(dimHelper.getWorld(0)!=null&&par5Entity instanceof EntityPlayerMP) + + if (overworld != null && entity instanceof EntityPlayerMP) { - par5Entity.fallDistance=0; - int x = (link.destXCoord + rand.nextInt(properties.LimboReturnRange)-properties.LimboReturnRange/2); - int z = (link.destZCoord + rand.nextInt(properties.LimboReturnRange)-properties.LimboReturnRange/2); + EntityPlayer player = (EntityPlayer) entity; + player.fallDistance = 0; + int x = (link.destXCoord + rand.nextInt(properties.LimboReturnRange) - properties.LimboReturnRange/2); + int z = (link.destZCoord + rand.nextInt(properties.LimboReturnRange) - properties.LimboReturnRange/2); //make sure I am in the middle of a chunk, and not on a boundary, so it doesn't load the chunk next to me x = x + (x >> 4); @@ -78,46 +77,39 @@ public class BlockDimWallPerm extends Block int y = yCoordHelper.getFirstUncovered(0, x, 63, z, true); - EntityPlayer.class.cast(par5Entity).setPositionAndUpdate( x, y, z ); + player.setPositionAndUpdate( x, y, z ); //this complicated chunk teleports the player back to the overworld at some random location. Looks funky becaue it has to load the chunk link.destXCoord = x; link.destYCoord = y; link.destZCoord = z; - dimHelper.instance.teleportEntity(par1World, par5Entity, link); - //FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().transferPlayerToDimension((EntityPlayerMP) par5Entity, 0,new BlankTeleporter((WorldServer)par5Entity.worldObj)); - //dimHelper.instance.teleportToPocket(par1World, new LinkData(par1World.provider.dimensionId,0,x,y,z,link.locXCoord,link.locYCoord,link.locZCoord,link.isLocPocket,0), - // EntityPlayer.class.cast(par5Entity)); - - - EntityPlayer.class.cast(par5Entity).setPositionAndUpdate( x, y, z ); + PocketManager.teleportEntity(par1World, player, link); + + player.setPositionAndUpdate( x, y, z ); // Make absolutely sure the player doesn't spawn inside blocks, though to be honest this shouldn't ever have to be a problem... - dimHelper.getWorld(0).setBlock(x, y, z, 0); - dimHelper.getWorld(0).setBlock(x, y+1, z, 0); + overworld.setBlockToAir(x, y, z); + overworld.setBlockToAir(x, y + 1, z); int i=x; int j=y; int k=z; - for(int xc=-3;xc<4;xc++) { for(int zc=-3;zc<4;zc++) { for(int yc=0;yc<200;yc++) { - if(yc==0) + if (yc==0) { - if(Math.abs(xc)+Math.abs(zc) blocksImmuneToRift; + private final ArrayList blocksImmuneToRift; public BlockRift(int i, int j, Material par2Material, DDProperties properties) { @@ -154,7 +154,7 @@ public class BlockRift extends BlockContainer public void updateTick(World world, int x, int y, int z, Random random) { if (properties.RiftGriefingEnabled && !world.isRemote && - dimHelper.instance.getLinkDataFromCoords(x, y, z, world.provider.dimensionId) != null) + PocketManager.getLink(x, y, z, world.provider.dimensionId) != null) { //Randomly decide whether to search for blocks to destroy. This reduces the frequency of search operations, //moderates performance impact, and controls the apparent speed of block destruction. @@ -335,7 +335,8 @@ public class BlockRift extends BlockContainer } } } - public static boolean isBlockImmune(World world, int x, int y, int z) + + public boolean isBlockImmune(World world, int x, int y, int z) { Block block = Block.blocksList[world.getBlockId(x, y, z)]; if (block != null) diff --git a/StevenDimDoors/mod_pocketDim/blocks/ChaosDoor.java b/StevenDimDoors/mod_pocketDim/blocks/ChaosDoor.java index bf621ee..f4c01e5 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/ChaosDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/ChaosDoor.java @@ -2,27 +2,18 @@ package StevenDimDoors.mod_pocketDim.blocks; import java.util.Random; -import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Icon; import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -30,117 +21,45 @@ public class ChaosDoor extends dimDoor { private Icon blockIconBottom; private static DDProperties properties = null; - + public ChaosDoor(int par1, Material material) { - super(par1, Material.iron); + super(par1, material); if (properties == null) properties = DDProperties.instance(); } - - public void registerIcons(IconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); - this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); - } + public void registerIcons(IconRegister par1IconRegister) + { + this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); + this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); + + } @SideOnly(Side.CLIENT) - /** - * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side - */ - public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) - { - if(par1IBlockAccess.getBlockId(par2, par3-1, par4)==this.blockID) - { - return this.blockIcon; - } - else - { - return this.blockIconBottom; - } - } - - @Override - public void onBlockAdded(World par1World, int par2, int par3, int par4) + /** + * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side + */ + public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) { - if(!par1World.isRemote&&par1World.getBlockId(par2, par3-1, par4)==this.blockID) - { - boolean newDim=false; - - if(dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World)==null) - { - newDim=true; - } - - if(newDim) - { - NewLinkData link = new NewLinkData(par1World.provider.dimensionId, properties.LimboDimensionID, par2, par3, par4, par2, par3+500, par4, false,0); - link.linkOrientation= par1World.getBlockMetadata(par2, par3-1, par4); - dimHelper.instance.createLink(link); - // System.out.println(link.linkOrientation); - - - } - - - if(dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World)!=null) - { - dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World).linkOrientation=par1World.getBlockMetadata(par2, par3-1, par4); - - - } + if (par1IBlockAccess.getBlockId(par2, par3 - 1, par4) == this.blockID) + { + return this.blockIcon; + } + else + { + return this.blockIconBottom; } - } - - - //uses the rift rendering list to find a random destination for the player - public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity) - { - - int var12 = (int) (MathHelper.floor_double((double)((par5Entity.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); - - int num = par1World.getBlockMetadata(par2, par3-1, par4); - if(!par1World.isRemote&&(num==5||num==4||num==6||num==7)&&(num-4)==var12&&par1World.getBlockId(par2, par3-1, par4)==properties.UnstableDoorID) - { - this.onPoweredBlockChange(par1World, par2, par3, par4, false); - - boolean foundRandomDest=false; - - int i=0; - - - Random rand= new Random(); - - while (!foundRandomDest&&i<100) - { - i++; - - NewLinkData link = (NewLinkData) dimHelper.instance.getRandomLinkData(false); - - if(link!=null) - { - - if(!link.isLocPocket&&link.linkOrientation!=-10&&link.destDimID!=properties.LimboDimensionID) - { - foundRandomDest=true; - - dimHelper.instance.traverseDimDoor(par1World, new NewLinkData(link.destDimID,link.locDimID,link.destXCoord,link.destYCoord,link.destZCoord,link.locXCoord,link.locYCoord,link.locZCoord,link.isLocPocket,0), par5Entity); - - if(dimHelper.getWorld(link.locDimID)!=null) - { - if(dimHelper.getWorld(link.locDimID).isAirBlock(link.locXCoord,link.locYCoord,link.locZCoord)) - { - dimHelper.getWorld(link.locDimID).setBlock(link.locXCoord,link.locYCoord,link.locZCoord, properties.RiftBlockID); - } - } - } - } - } - } - } - + @Override + public void onBlockAdded(World world, int x, int y, int z) + { + if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) + { + NewDimData dimension = PocketManager.getDimensionData(world); + dimension.createLink(x, y, z).setLinkType(IDimLink.TYPE_RANDOM); + } + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java b/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java index 346b5cd..1e4feb9 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java @@ -2,160 +2,74 @@ package StevenDimDoors.mod_pocketDim.blocks; import java.util.Random; -import StevenDimDoors.mod_pocketDim.DimData; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.item.Item; +import net.minecraft.util.Icon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; -import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; -import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; - +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; - - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.Item; -import net.minecraft.util.Icon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - public class ExitDoor extends dimDoor { - private Icon blockIconBottom; - public ExitDoor(int par1, Material par2Material) - { - - super(par1, Material.wood); - - // TODO Auto-generated constructor stub + public ExitDoor(int blockID, Material material) + { + super(blockID, material); } - public void registerIcons(IconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); - this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); - - } - - @Override - public void onBlockAdded(World par1World, int par2, int par3, int par4) { - - - if(!par1World.isRemote&&par1World.getBlockId(par2, par3-1, par4)==this.blockID) - { - - - int locDimID=par1World.provider.dimensionId; - - if(dimHelper.instance.dimList.containsKey(locDimID)&&dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World)==null) - { - DimData dimData = dimHelper.instance.getDimData(locDimID); - int ExitDimID = dimData.exitDimLink.destDimID; - if(dimHelper.instance.getDimData(par1World.provider.dimensionId).isPocket) - { - int yCoord=yCoordHelper.getFirstUncovered(ExitDimID, par2, par3, par4)-1; - - - dimHelper.instance.createLink(locDimID, ExitDimID, par2, par3, par4, par2, yCoord, par4,par1World.getBlockMetadata(par2, par3-1, par4)); - dimHelper.instance.createLink(ExitDimID, locDimID, par2, yCoord, par4, par2, par3, par4, - BlockRotator.transformMetadata(par1World.getBlockMetadata(par2, par3 - 1, par4), 2, Block.doorWood.blockID)); - } - - - - /** - - if(dimHelper.instance.getDimDepth(locDimID)==1) - { - //System.out.println("exitToOverowrld from "+String.valueOf(locDimID)); - - int yCoord=yCoordHelper.getFirstUncovered(ExitDimID, par2, par3, par4); - - - dimHelper.instance.createLink(locDimID, ExitDimID, par2, par3, par4, par2, yCoord, par4,par1World.getBlockMetadata(par2, par3-1, par4)); - dimHelper.instance.createLink(ExitDimID, locDimID, par2, yCoord, par4, par2, par3, par4,dimHelper.instance.flipDoorMetadata(par1World.getBlockMetadata(par2, par3-1, par4))); - - - - - } - else if(dimHelper.instance.getDimData(par1World.provider.dimensionId).isPocket) - { - //System.out.println("Created new dim from "+String.valueOf(par1World.provider.dimensionId)); - - LinkData link = new LinkData(par1World.provider.dimensionId, 0, par2, par3, par4, par2, par3, par4, true, par1World.getBlockMetadata(par2, par3-1, par4)); - dimHelper.instance.createPocket(link,false, false); - - - - // dimHelper.instance.generatePocket(dimHelper.getWorld(destDimID), par2, par3, par4,par1World.getBlockMetadata(par2, par3-1, par4)); - - - } - **/ - - } - else if (dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World)!=null) - { - - //System.out.println("RiftPresent at "+String.valueOf(par1World.provider.dimensionId)); - dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World).linkOrientation=par1World.getBlockMetadata(par2, par3-1, par4); - dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World).hasGennedDoor=false; - - - - - - - } - - - - } - - par1World.setBlockTileEntity(par2, par3, par4, this.createNewTileEntity(par1World)); - + this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); + this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); } + + @Override + public void onBlockAdded(World world, int x, int y, int z) + { + //FIXME: We need to set door generation flags on the tile entities. Ignoring that for now. ~SenseiKiwi + + if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) + { + NewDimData dimension = PocketManager.getDimensionData(world); + IDimLink link = dimension.getLink(x, y, z); + if (link == null) + { + dimension.createLink(x, y, z).setLinkType(IDimLink.TYPE_SAFE_EXIT); + } + } + world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); + } + @SideOnly(Side.CLIENT) + /** + * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side + */ + public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) + { + if(par1IBlockAccess.getBlockId(par2, par3-1, par4)==this.blockID) + { + return this.blockIcon; + } + else + { + return this.blockIconBottom; + } + } - /** - * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side - */ - public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) - { - if(par1IBlockAccess.getBlockId(par2, par3-1, par4)==this.blockID) - { - return this.blockIcon; - } - else - { - return this.blockIconBottom; - } - } - - public int idPicked(World par1World, int par2, int par3, int par4) - { - return Item.doorWood.itemID; - } - - public int idDropped(int par1, Random par2Random, int par3) - { - return (par1 & 8) != 0 ? 0 : (Item.doorWood.itemID); - } - - - + public int idPicked(World par1World, int par2, int par3, int par4) + { + return Item.doorWood.itemID; + } + public int idDropped(int par1, Random par2Random, int par3) + { + return (par1 & 8) != 0 ? 0 : (Item.doorWood.itemID); + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java index 86dc8c9..24dc5e0 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java @@ -2,19 +2,11 @@ package StevenDimDoors.mod_pocketDim.blocks; import java.util.Random; -import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.TileEntityDimDoor; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; -import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; - import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; @@ -25,517 +17,386 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class dimDoor extends BlockContainer { - private static Icon blockIconBottom; + private static DDProperties properties = null; + private Icon blockIconBottom; + public dimDoor(int par1, Material material) { - super(par1, Material.iron); - // this.blockIndexInTexture = 18; + super(par1, material); if (properties == null) properties = DDProperties.instance(); } - - private static DDProperties properties = null; - public void registerIcons(IconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); - this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); + { + this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); + this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); + } - } - - - //spawns the rift attatched to the block. Doesnt work in creative mode for some reason - //TODO make work in creative - public void onBlockDestroyedByPlayer(World par1World, int par2, int par3, int par4, int par5) - { - if(!par1World.isRemote) - { - if(dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World)!=null) - { - NewLinkData link= dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World); - par1World.setBlock(par2, par3, par4, properties.RiftBlockID); - - } - if(dimHelper.instance.getLinkDataFromCoords(par2, par3-1, par4, par1World)!=null) - { - NewLinkData link= dimHelper.instance.getLinkDataFromCoords(par2, par3-1, par4, par1World); - par1World.setBlock(par2, par3-1, par4, properties.RiftBlockID); - - } - if(dimHelper.instance.getLinkDataFromCoords(par2, par3+1, par4, par1World)!=null) - { - NewLinkData link= dimHelper.instance.getLinkDataFromCoords(par2, par3+1, par4, par1World); - par1World.setBlock(par2, par3+1, par4, properties.RiftBlockID); - - } - - } - - } + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) + { + //TODO: Would it kill us to use REASONABLE variable names? <_< ~SenseiKiwi + int var12 = (int) (MathHelper.floor_double((double) ((entity.rotationYaw + 90) * 4.0F / 360.0F) + 0.5D) & 3); - //finds the rift data and teleports the player to it. - public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity) - { - - if(!par1World.isRemote) - { - int var12 = (int) (MathHelper.floor_double((double)((par5Entity.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); - - int num=0; - NewLinkData linkData=null; - - if(par1World.getBlockId(par2, par3-1, par4)==this.blockID) - { - num=par1World.getBlockMetadata(par2, par3-1, par4); - linkData= dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World); - } - - if(par1World.getBlockId(par2, par3+1, par4)==this.blockID) - { - num=par1World.getBlockMetadata(par2, par3, par4); - linkData= dimHelper.instance.getLinkDataFromCoords(par2, par3+1, par4, par1World); - } - - if(!(par5Entity instanceof EntityPlayer)&&num>3) - { - this.onPoweredBlockChange(par1World, par2, par3, par4, false); - dimHelper.instance.traverseDimDoor(par1World, linkData, par5Entity); - } - - else if(!par1World.isRemote&&(num==5||num==4||num==6||num==7)&&(num-4)==var12) - { - - //int destinationID= dimHelper.instance.getDestIDFromCoords(par2, par3, par4, par1World); - - - this.onPoweredBlockChange(par1World, par2, par3, par4, false); - - dimHelper.instance.traverseDimDoor(par1World, linkData, par5Entity); + int orientation = world.getBlockMetadata(x, y - 1, z); + if (!world.isRemote && (orientation >= 4 && orientation <= 7) && (orientation - 4) == var12 && + world.getBlockId(x, y - 1, z) == this.blockID) + { + this.onPoweredBlockChange(world, x, y, z, false); - - - - - - - - - - - - } - } - } + IDimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); + if (link != null) + { + PocketManager.traverseDimDoor(world, link, entity); + } + } + } public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) - { - - boolean shouldOpen=true; - - //System.out.println(String.valueOf(par1World.getBlockMetadata(par2, par3, par4))); + { + + boolean shouldOpen=true; + + //System.out.println(String.valueOf(par1World.getBlockMetadata(par2, par3, par4))); if(par5EntityPlayer.inventory.getCurrentItem()!=null) { if(par5EntityPlayer.inventory.getCurrentItem().getItem() == mod_pocketDim.itemRiftBlade) { - shouldOpen=false; - if(!par1World.isRemote&&par1World.getBlockId(par2, par3-1, par4)==this.blockID) + shouldOpen = false; + if (!par1World.isRemote && par1World.getBlockId(par2, par3-1, par4) == this.blockID) { int var12 = (int) (MathHelper.floor_double((double)((par5EntityPlayer.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); - - if(par1World.getBlockMetadata(par2, par3-1, par4)==var12) + + if (par1World.getBlockMetadata(par2, par3-1, par4) == var12) { - var12 = BlockRotator.transformMetadata(var12, 2, Block.doorWood.blockID); - } - par1World.setBlockMetadataWithNotify(par2, par3-1, par4, var12,2); - - if( dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World)!=null) - { - dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World).linkOrientation= par1World.getBlockMetadata(par2, par3-1, par4); - + var12 = BlockRotator.transformMetadata(var12, 1, this.blockID); } + par1World.setBlockMetadataWithNotify(par2, par3-1, par4, var12, 2); } - if(!par1World.isRemote&&par1World.getBlockId(par2, par3+1, par4)==this.blockID) + if (!par1World.isRemote && par1World.getBlockId(par2, par3+1, par4) == this.blockID) { int var12 = (int) (MathHelper.floor_double((double)((par5EntityPlayer.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); if(par1World.getBlockMetadata(par2, par3, par4)==var12) { - var12 = BlockRotator.transformMetadata(var12, 2, Block.doorWood.blockID); + var12 = BlockRotator.transformMetadata(var12, 1, this.blockID); } - par1World.setBlockMetadataWithNotify(par2, par3, par4, var12,2); - - if( dimHelper.instance.getLinkDataFromCoords(par2, par3+1, par4, par1World)!=null) - { - dimHelper.instance.getLinkDataFromCoords(par2, par3+1, par4, par1World).linkOrientation= par1World.getBlockMetadata(par2, par3, par4); - } - + par1World.setBlockMetadataWithNotify(par2, par3, par4, var12, 2); } - par1World.playAuxSFXAtEntity(par5EntityPlayer, 1001, par2, par3, par4, 0); - - if(!shouldOpen&&!par1World.isRemote) - { - - par5EntityPlayer.inventory.getCurrentItem().damageItem(5, par5EntityPlayer); - - // par5EntityPlayer.sendChatToPlayer("You wedge the stick into a cranny in the door attempt to rotate the it"); - // par5EntityPlayer.sendChatToPlayer("The door rotates, but the stick breaks in half and is lost"); - } - - - - } - } - - if(shouldOpen) - { - - int var10 = this.getFullMetadata(par1World, par2, par3, par4); - int var11 = var10 & 7; - var11 ^= 4; - - if ((var10 & 8) == 0) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, var11,2); - par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4); - } - else - { - par1World.setBlockMetadataWithNotify(par2, par3 - 1, par4, var11,2); - par1World.markBlockRangeForRenderUpdate(par2, par3 - 1, par4, par2, par3, par4); - } - - par1World.playAuxSFXAtEntity(par5EntityPlayer, 1003, par2, par3, par4, 0); - if(dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World)!=null) - { - // System.out.println("Link orient is- " +dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World).linkOrientation); - } - return true; - } - else - { - return false; - } - - } - - /** - * A function to open a door. - */ - public void onPoweredBlockChange(World par1World, int par2, int par3, int par4, boolean par5) - { - int var6 = this.getFullMetadata(par1World, par2, par3, par4); - boolean var7 = (var6 & 4) != 0; - - if (var7 != par5) - { - int var8 = var6 & 7; - var8 ^= 4; - - if ((var6 & 8) == 0) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, var8,2); - par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4); - } - else - { - par1World.setBlockMetadataWithNotify(par2, par3 - 1, par4, var8,2); - par1World.markBlockRangeForRenderUpdate(par2, par3 - 1, par4, par2, par3, par4); - } - - par1World.playAuxSFXAtEntity((EntityPlayer)null, 1003, par2, par3, par4, 0); - } - } -//TODO simplify this - @Override - public void onBlockAdded(World par1World, int par2, int par3, int par4) - { - if(!par1World.isRemote&&par1World.getBlockId(par2, par3-1, par4)==this.blockID) - { - - - if(dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World)==null) - { - - - - NewLinkData link = new NewLinkData(par1World.provider.dimensionId, 0, par2, par3, par4, par2, par3, par4, true,par1World.getBlockMetadata(par2, par3-1, par4)); - dimHelper.instance.createPocket(link,true, false); - // System.out.println(link.linkOrientation); - - - - } - - - - if(dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World)!=null) - { - dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World).linkOrientation=par1World.getBlockMetadata(par2, par3-1, par4); - dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, par1World).hasGennedDoor=false; + par1World.playAuxSFXAtEntity(par5EntityPlayer, 1001, par2, par3, par4, 0); + if (!shouldOpen && !par1World.isRemote) + { + par5EntityPlayer.inventory.getCurrentItem().damageItem(5, par5EntityPlayer); + } } } - par1World.setBlockTileEntity(par2, par3, par4, this.createNewTileEntity(par1World)); - - } - - @SideOnly(Side.CLIENT) - - /** - * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side - */ - public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) - { - if(par1IBlockAccess.getBlockId(par2, par3-1, par4)==this.blockID) - { - return this.blockIcon; - } - else - { - return this.blockIconBottom; - } - } - - //Called to update the render information on the tile entity. Could probably implement a data watcher, but this works fine and is more versatile I think. - public dimDoor updateAttatchedTile(IBlockAccess par1World, int par2, int par3, int par4) - { - TileEntity tile = (TileEntity) par1World.getBlockTileEntity(par2, par3, par4); - if(tile instanceof TileEntityDimDoor ) + if(shouldOpen) { - TileEntityDimDoor dimTile=(TileEntityDimDoor)tile; - - if(par1World.getBlockId( par2, par3+1, par4 )==par1World.getBlockId( par2, par3, par4 )) + int var10 = this.getFullMetadata(par1World, par2, par3, par4); + int var11 = var10 & 7; + var11 ^= 4; + + if ((var10 & 8) == 0) { - //dimTile.openOrClosed=false; - } - if(dimHelper.instance.getLinkDataFromCoords(par2, par3, par4, (World)par1World)==null) - { - dimTile.openOrClosed=false; + par1World.setBlockMetadataWithNotify(par2, par3, par4, var11,2); + par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4); } else { - dimTile.openOrClosed=true; + par1World.setBlockMetadataWithNotify(par2, par3 - 1, par4, var11,2); + par1World.markBlockRangeForRenderUpdate(par2, par3 - 1, par4, par2, par3, par4); } - - int metaData = this.getFullMetadata(par1World, par2, par3, par4)%8; - dimTile.orientation=metaData; + + par1World.playAuxSFXAtEntity(par5EntityPlayer, 1003, par2, par3, par4, 0); + return true; + } + else + { + return false; + } + + } + + /** + * A function to open a door. + */ + public void onPoweredBlockChange(World par1World, int par2, int par3, int par4, boolean par5) + { + int var6 = this.getFullMetadata(par1World, par2, par3, par4); + boolean var7 = (var6 & 4) != 0; + + if (var7 != par5) + { + int var8 = var6 & 7; + var8 ^= 4; + + if ((var6 & 8) == 0) + { + par1World.setBlockMetadataWithNotify(par2, par3, par4, var8,2); + par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4); + } + else + { + par1World.setBlockMetadataWithNotify(par2, par3 - 1, par4, var8,2); + par1World.markBlockRangeForRenderUpdate(par2, par3 - 1, par4, par2, par3, par4); + } + + par1World.playAuxSFXAtEntity((EntityPlayer)null, 1003, par2, par3, par4, 0); } - return this; - } - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) - { - - TileEntityDimDoor tile = (TileEntityDimDoor) par1World.getBlockTileEntity(par2, par3, par4); - tile.openOrClosed=this.isDoorOpen( par1World, par2, par3, par4); - int metaData = this.getFullMetadata(par1World, par2, par3, par4); - tile.orientation=metaData%8 ; - - + @Override + public void onBlockAdded(World world, int x, int y, int z) + { + //FIXME: We need to set door generation flags on the tile entities. Ignoring that for now. ~SenseiKiwi + + if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) + { + NewDimData dimension = PocketManager.getDimensionData(world); + IDimLink link = dimension.getLink(x, y, z); + if (link == null) + { + dimension.createLink(x, y, z).setLinkType(IDimLink.TYPE_POCKET); + } + } + world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); + } - - - - } - public boolean isOpaqueCube() - { - return false; - } + @SideOnly(Side.CLIENT) - public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - int var5 = this.getFullMetadata(par1IBlockAccess, par2, par3, par4); - return (var5 & 4) != 0; - } + /** + * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side + */ + public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) + { + if(par1IBlockAccess.getBlockId(par2, par3-1, par4) == this.blockID) + { + return this.blockIcon; + } + else + { + return blockIconBottom; + } + } - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - public boolean renderAsNormalBlock() - { - return false; - } + //Called to update the render information on the tile entity. Could probably implement a data watcher, + //but this works fine and is more versatile I think. + public dimDoor updateAttachedTile(World world, int x, int y, int z) + { + TileEntity tile = world.getBlockTileEntity(x, y, z); + if (tile instanceof TileEntityDimDoor ) + { + TileEntityDimDoor dimTile = (TileEntityDimDoor) tile; + dimTile.openOrClosed = PocketManager.getLink(x, y, z, world.provider.dimensionId) != null; + dimTile.orientation = this.getFullMetadata(world, x, y, z) & 7; + } + return this; + } - /** - * The type of render function that is called for this block - */ - public int getRenderType() - { - return 7; - } + /** + * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two + * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. + */ + public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) + { + TileEntityDimDoor tile = (TileEntityDimDoor) par1World.getBlockTileEntity(par2, par3, par4); + tile.openOrClosed = this.isDoorOpen( par1World, par2, par3, par4); + tile.orientation = this.getFullMetadata(par1World, par2, par3, par4) & 7; + } + + public boolean isOpaqueCube() + { + return false; + } - @SideOnly(Side.CLIENT) + public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) + { + int var5 = this.getFullMetadata(par1IBlockAccess, par2, par3, par4); + return (var5 & 4) != 0; + } - /** - * Returns the bounding box of the wired rectangular prism to render. - */ - public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4) - { - this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); - return super.getSelectedBoundingBoxFromPool(par1World, par2, par3, par4); - } + /** + * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) + */ + public boolean renderAsNormalBlock() + { + return false; + } - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) - { - this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); - return super.getCollisionBoundingBoxFromPool(par1World, par2, par3, par4); - } + /** + * The type of render function that is called for this block + */ + public int getRenderType() + { + return 7; + } - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - this.setDoorRotation(this.getFullMetadata(par1IBlockAccess, par2, par3, par4)); - } + @SideOnly(Side.CLIENT) - /** - * Returns 0, 1, 2 or 3 depending on where the hinge is. - */ - public int getDoorOrientation(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - return this.getFullMetadata(par1IBlockAccess, par2, par3, par4) & 3; - } + /** + * Returns the bounding box of the wired rectangular prism to render. + */ + public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4) + { + this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); + return super.getSelectedBoundingBoxFromPool(par1World, par2, par3, par4); + } - public boolean isDoorOpen(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - return (this.getFullMetadata(par1IBlockAccess, par2, par3, par4) & 4) != 0; - } + /** + * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been + * cleared to be reused) + */ + public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) + { + this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); + return super.getCollisionBoundingBoxFromPool(par1World, par2, par3, par4); + } - private void setDoorRotation(int par1) - { - float var2 = 0.1875F; - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F); - int var3 = par1 & 3; - boolean var4 = (par1 & 4) != 0; - boolean var5 = (par1 & 16) != 0; + /** + * Updates the blocks bounds based on its current state. Args: world, x, y, z + */ + public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) + { + this.setDoorRotation(this.getFullMetadata(par1IBlockAccess, par2, par3, par4)); + } - if (var3 == 0) - { - if (var4) - { - if (!var5) - { - this.setBlockBounds(0.001F, 0.0F, 0.0F, 1.0F, 1.0F, var2); - } - else - { - this.setBlockBounds(0.001F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F); - } - } - else - { - this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 1.0F); - } - } - else if (var3 == 1) - { - if (var4) - { - if (!var5) - { - this.setBlockBounds(1.0F - var2, 0.0F, 0.001F, 1.0F, 1.0F, 1.0F); - } - else - { - this.setBlockBounds(0.0F, 0.0F, 0.001F, var2, 1.0F, 1.0F); - } - } - else - { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var2); - } - } - else if (var3 == 2) - { - if (var4) - { - if (!var5) - { - this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, .99F, 1.0F, 1.0F); - } - else - { - this.setBlockBounds(0.0F, 0.0F, 0.0F, .99F, 1.0F, var2); - } - } - else - { - this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - } - else if (var3 == 3) - { - if (var4) - { - if (!var5) - { - this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 0.99F); - } - else - { - this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 0.99F); - } - } - else - { - this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F); - } - } - } + /** + * Returns 0, 1, 2 or 3 depending on where the hinge is. + */ + public int getDoorOrientation(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) + { + return this.getFullMetadata(par1IBlockAccess, par2, par3, par4) & 3; + } - /** - * Called when the block is clicked by a player. Args: x, y, z, entityPlayer - */ - public void onBlockClicked(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer) - { - // System.out.println(this.getFullMetadata(par1World, par2, par3, par4)%4); - } + public boolean isDoorOpen(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) + { + return (this.getFullMetadata(par1IBlockAccess, par2, par3, par4) & 4) != 0; + } - /** - * Called upon block activation (right click on the block.) - */ - + private void setDoorRotation(int par1) + { + float var2 = 0.1875F; + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F); + int var3 = par1 & 3; + boolean var4 = (par1 & 4) != 0; + boolean var5 = (par1 & 16) != 0; - /** - * A function to open a door. - */ - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor blockID - */ - public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) - { - int var6 = par1World.getBlockMetadata(par2, par3, par4); + if (var3 == 0) + { + if (var4) + { + if (!var5) + { + this.setBlockBounds(0.001F, 0.0F, 0.0F, 1.0F, 1.0F, var2); + } + else + { + this.setBlockBounds(0.001F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F); + } + } + else + { + this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 1.0F); + } + } + else if (var3 == 1) + { + if (var4) + { + if (!var5) + { + this.setBlockBounds(1.0F - var2, 0.0F, 0.001F, 1.0F, 1.0F, 1.0F); + } + else + { + this.setBlockBounds(0.0F, 0.0F, 0.001F, var2, 1.0F, 1.0F); + } + } + else + { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var2); + } + } + else if (var3 == 2) + { + if (var4) + { + if (!var5) + { + this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, .99F, 1.0F, 1.0F); + } + else + { + this.setBlockBounds(0.0F, 0.0F, 0.0F, .99F, 1.0F, var2); + } + } + else + { + this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + } + else if (var3 == 3) + { + if (var4) + { + if (!var5) + { + this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 0.99F); + } + else + { + this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 0.99F); + } + } + else + { + this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F); + } + } + } - if ((var6 & 8) == 0) - { - boolean var7 = false; + /** + * Called when the block is clicked by a player. Args: x, y, z, entityPlayer + */ + public void onBlockClicked(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer) + { + // System.out.println(this.getFullMetadata(par1World, par2, par3, par4)%4); + } - if (par1World.getBlockId(par2, par3 + 1, par4) != this.blockID) - { - par1World.setBlock(par2, par3, par4, 0); - var7 = true; - } + /** + * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are + * their own) Args: x, y, z, neighbor blockID + */ + public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) + { + int var6 = par1World.getBlockMetadata(par2, par3, par4); - /** + if ((var6 & 8) == 0) + { + boolean var7 = false; + + if (par1World.getBlockId(par2, par3 + 1, par4) != this.blockID) + { + par1World.setBlock(par2, par3, par4, 0); + var7 = true; + } + + /** if (!par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4)) { par1World.setBlockWithNotify(par2, par3, par4, 0); @@ -546,129 +407,120 @@ public class dimDoor extends BlockContainer par1World.setBlockWithNotify(par2, par3 + 1, par4, 0); } } - **/ + **/ - if (var7) - { - if (!par1World.isRemote) - { - this.dropBlockAsItem(par1World, par2, par3, par4, properties.DimensionalDoorID, 0); - } - } - else - { - boolean var8 = par1World.isBlockIndirectlyGettingPowered(par2, par3, par4) || par1World.isBlockIndirectlyGettingPowered(par2, par3 + 1, par4); + if (var7) + { + if (!par1World.isRemote) + { + this.dropBlockAsItem(par1World, par2, par3, par4, properties.DimensionalDoorID, 0); + } + } + else + { + boolean var8 = par1World.isBlockIndirectlyGettingPowered(par2, par3, par4) || par1World.isBlockIndirectlyGettingPowered(par2, par3 + 1, par4); - if ((var8 || par5 > 0 && Block.blocksList[par5].canProvidePower()) && par5 != this.blockID) - { - this.onPoweredBlockChange(par1World, par2, par3, par4, var8); - } - } - } - else - { - if (par1World.getBlockId(par2, par3 - 1, par4) != this.blockID) - { - par1World.setBlock(par2, par3, par4, 0); - } + if ((var8 || par5 > 0 && Block.blocksList[par5].canProvidePower()) && par5 != this.blockID) + { + this.onPoweredBlockChange(par1World, par2, par3, par4, var8); + } + } + } + else + { + if (par1World.getBlockId(par2, par3 - 1, par4) != this.blockID) + { + par1World.setBlock(par2, par3, par4, 0); + } - if (par5 > 0 && par5 != this.blockID) - { - this.onNeighborBlockChange(par1World, par2, par3 - 1, par4, par5); - } - } - } + if (par5 > 0 && par5 != this.blockID) + { + this.onNeighborBlockChange(par1World, par2, par3 - 1, par4, par5); + } + } + } - /** - * Returns the ID of the items to drop on destruction. - */ - + /** + * Ray traces through the blocks collision from start vector to end vector returning a ray trace hit. Args: world, + * x, y, z, startVec, endVec + */ + public MovingObjectPosition collisionRayTrace(World par1World, int par2, int par3, int par4, Vec3 par5Vec3, Vec3 par6Vec3) + { + this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); + return super.collisionRayTrace(par1World, par2, par3, par4, par5Vec3, par6Vec3); + } - /** - * Ray traces through the blocks collision from start vector to end vector returning a ray trace hit. Args: world, - * x, y, z, startVec, endVec - */ - public MovingObjectPosition collisionRayTrace(World par1World, int par2, int par3, int par4, Vec3 par5Vec3, Vec3 par6Vec3) - { - this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); - return super.collisionRayTrace(par1World, par2, par3, par4, par5Vec3, par6Vec3); - } + /** + * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z + */ + public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) + { + return par3 >= 255 ? false : par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) && super.canPlaceBlockAt(par1World, par2, par3, par4) && super.canPlaceBlockAt(par1World, par2, par3 + 1, par4); + } - /** - * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { - return par3 >= 255 ? false : par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) && super.canPlaceBlockAt(par1World, par2, par3, par4) && super.canPlaceBlockAt(par1World, par2, par3 + 1, par4); - } + /** + * Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility + * and stop pistons + */ + public int getMobilityFlag() + { + return 2; + } - /** - * Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility - * and stop pistons - */ - public int getMobilityFlag() - { - return 2; - } + /** + * Returns the full metadata value created by combining the metadata of both blocks the door takes up. + */ + public int getFullMetadata(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) + { + int var5 = par1IBlockAccess.getBlockMetadata(par2, par3, par4); + boolean var6 = (var5 & 8) != 0; + int var7; + int var8; - /** - * Returns the full metadata value created by combining the metadata of both blocks the door takes up. - */ - public int getFullMetadata(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - int var5 = par1IBlockAccess.getBlockMetadata(par2, par3, par4); - boolean var6 = (var5 & 8) != 0; - int var7; - int var8; + if (var6) + { + var7 = par1IBlockAccess.getBlockMetadata(par2, par3 - 1, par4); + var8 = var5; + } + else + { + var7 = var5; + var8 = par1IBlockAccess.getBlockMetadata(par2, par3 + 1, par4); + } - if (var6) - { - var7 = par1IBlockAccess.getBlockMetadata(par2, par3 - 1, par4); - var8 = var5; - } - else - { - var7 = var5; - var8 = par1IBlockAccess.getBlockMetadata(par2, par3 + 1, par4); - } + boolean var9 = (var8 & 1) != 0; + return var7 & 7 | (var6 ? 8 : 0) | (var9 ? 16 : 0); + } - boolean var9 = (var8 & 1) != 0; - return var7 & 7 | (var6 ? 8 : 0) | (var9 ? 16 : 0); - } + @SideOnly(Side.CLIENT) + /** + * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative) + */ + public int idPicked(World par1World, int par2, int par3, int par4) + { + return Item.doorIron.itemID; + } - @SideOnly(Side.CLIENT) + public int idDropped(int par1, Random par2Random, int par3) + { + return (par1 & 8) != 0 ? 0 : (Item.doorIron.itemID); + } - /** - * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative) - */ - public int idPicked(World par1World, int par2, int par3, int par4) - { - return Item.doorIron.itemID; - } - - public int idDropped(int par1, Random par2Random, int par3) - { - return (par1 & 8) != 0 ? 0 : (Item.doorIron.itemID); - } + /** + * Called when the block is attempted to be harvested + */ + public void onBlockHarvested(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer) + { + if (par6EntityPlayer.capabilities.isCreativeMode && (par5 & 8) != 0 && par1World.getBlockId(par2, par3 - 1, par4) == this.blockID) + { + par1World.setBlock(par2, par3 - 1, par4, 0); + } + } - /** - * Called when the block is attempted to be harvested - */ - public void onBlockHarvested(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer) - { - if (par6EntityPlayer.capabilities.isCreativeMode && (par5 & 8) != 0 && par1World.getBlockId(par2, par3 - 1, par4) == this.blockID) - { - par1World.setBlock(par2, par3 - 1, par4, 0); - } - } - - - - public TileEntity createNewTileEntity(World par1World) - { - - TileEntity tile= new TileEntityDimDoor(); - - return tile; - } + @Override + public TileEntity createNewTileEntity(World world) + { + TileEntity tile = new TileEntityDimDoor(); + return tile; + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java b/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java index a7ad487..c4b528b 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java +++ b/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java @@ -1,19 +1,13 @@ package StevenDimDoors.mod_pocketDim.blocks; -import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; -import StevenDimDoors.mod_pocketDim.world.PocketProvider; import net.minecraft.block.BlockTrapDoor; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.world.PocketProvider; public class dimHatch extends BlockTrapDoor { @@ -21,59 +15,55 @@ public class dimHatch extends BlockTrapDoor public dimHatch(int par1,int par2, Material par2Material) { super(par1, Material.iron); - this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - // this.setTextureFile("/PocketBlockTextures.png"); - // this.blockIndexInTexture = 16; + this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); + // this.setTextureFile("/PocketBlockTextures.png"); + // this.blockIndexInTexture = 16; } public void registerIcons(IconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()); + { + this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()); + + } + + public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) + { - } - - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) - { - - { - int var10 = par1World.getBlockMetadata(par2, par3, par4); - par1World.setBlockMetadataWithNotify(par2, par3, par4, var10 ^ 4,2); - par1World.playAuxSFXAtEntity(par5EntityPlayer, 1003, par2, par3, par4, 0); - return true; - } - } - //Teleports the player to the exit link of that dimension, assuming it is a pocket - public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity) - { - - int num = par1World.getBlockMetadata(par2, par3, par4); - - if(!par1World.isRemote&&(num>3&&num<8||num>11)&&par1World.provider instanceof PocketProvider) { - - this.onPoweredBlockChange(par1World, par2, par3, par4, false); - - DimData dimData = (DimData) dimHelper.instance.dimList.get(par1World.provider.dimensionId); - - NewLinkData exitLink=dimData.exitDimLink; - exitLink.locDimID=par1World.provider.dimensionId; - - - dimHelper.instance.traverseDimDoor(par1World, exitLink, par5Entity); - - + int var10 = par1World.getBlockMetadata(par2, par3, par4); + par1World.setBlockMetadataWithNotify(par2, par3, par4, var10 ^ 4,2); + par1World.playAuxSFXAtEntity(par5EntityPlayer, 1003, par2, par3, par4, 0); + return true; } - } + } - public void onPoweredBlockChange(World par1World, int par2, int par3, int par4, boolean par5) - { - int var6 = par1World.getBlockMetadata(par2, par3, par4); - boolean var7 = (var6 & 4) > 0; + //Teleports the player to the exit link of that dimension, assuming it is a pocket + public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity) + { + int num = par1World.getBlockMetadata(par2, par3, par4); - if (var7 != par5) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, var6 ^ 4,2); - par1World.playAuxSFXAtEntity((EntityPlayer)null, 1003, par2, par3, par4, 0); - } - } + if (!par1World.isRemote&&(num>3&&num<8||num>11)&&par1World.provider instanceof PocketProvider) + { + this.onPoweredBlockChange(par1World, par2, par3, par4, false); + + /* FIXME: No point in fixing the following code when it's going to be rewritten later anyway. ~SenseiKiwi + + NewDimData newDimData = (NewDimData) dimHelper.PocketManager.dimList.get(par1World.provider.dimensionId); + ILinkData exitLink=newDimData.exitDimLink; + exitLink.locDimID=par1World.provider.dimensionId; + PocketManager.instance.traverseDimDoor(par1World, exitLink, par5Entity);*/ + } + } + + public void onPoweredBlockChange(World par1World, int par2, int par3, int par4, boolean par5) + { + int var6 = par1World.getBlockMetadata(par2, par3, par4); + boolean var7 = (var6 & 4) > 0; + + if (var7 != par5) + { + par1World.setBlockMetadataWithNotify(par2, par3, par4, var6 ^ 4,2); + par1World.playAuxSFXAtEntity((EntityPlayer)null, 1003, par2, par3, par4, 0); + } + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java index f444170..8a055f8 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java @@ -1,14 +1,13 @@ package StevenDimDoors.mod_pocketDim.commands; -import java.io.File; import java.util.Collection; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.MathHelper; -import StevenDimDoors.mod_pocketDim.DungeonGenerator; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; public class CommandCreateDungeonRift extends DDCommandBase { @@ -56,16 +55,17 @@ public class CommandCreateDungeonRift extends DDCommandBase } else { - DungeonGenerator result; + IDimLink link; + DungeonData result; int x = MathHelper.floor_double(sender.posX); int y = MathHelper.floor_double(sender.posY); int z = MathHelper.floor_double (sender.posZ); - NewLinkData link = new NewLinkData(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); + link = new NewLinkData(sender.worldObj.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 3); + PocketManager.createLink(link); + link = PocketManager.createPocket(link, true, true); sender.sendChatToPlayer("Created a rift to a random dungeon (Dimension ID = " + link.destDimID + ")."); } else @@ -79,9 +79,10 @@ public class CommandCreateDungeonRift extends DDCommandBase if (result != null) { //Create a rift to our selected dungeon and notify the player - link = dimHelper.instance.createPocket(link, true, true); - dimHelper.instance.getDimData(link.destDimID).dungeonGenerator = result; - sender.sendChatToPlayer("Created a rift to \"" + getSchematicName(result) + "\" dungeon (Dimension ID = " + link.destDimID + ")."); + link = new NewLinkData(sender.worldObj.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 3); + link = PocketManager.instance.createPocket(link, true, true); + PocketManager.instance.getDimData(link.destDimID).dungeonGenerator = result; + sender.sendChatToPlayer("Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination.getDimensionID() + ")."); } else { @@ -93,20 +94,20 @@ public class CommandCreateDungeonRift extends DDCommandBase return DDCommandResult.SUCCESS; } - private DungeonGenerator findDungeonByPartialName(String query, Collection dungeons) + private DungeonData findDungeonByPartialName(String query, Collection dungeons) { //Search for the shortest dungeon name that contains the lowercase query string. String dungeonName; String normalQuery = query.toLowerCase(); - DungeonGenerator bestMatch = null; + DungeonData bestMatch = null; int matchLength = Integer.MAX_VALUE; - for (DungeonGenerator dungeon : dungeons) + for (DungeonData 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(); + dungeonName = dungeon.schematicName().toLowerCase(); if (dungeonName.length() < matchLength && dungeonName.contains(normalQuery)) { matchLength = dungeonName.length(); @@ -115,14 +116,4 @@ public class CommandCreateDungeonRift extends DDCommandBase } 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()); - } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandCreatePocket.java b/StevenDimDoors/mod_pocketDim/commands/CommandCreatePocket.java index 7b685f3..6365d74 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandCreatePocket.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandCreatePocket.java @@ -1,7 +1,6 @@ package StevenDimDoors.mod_pocketDim.commands; import net.minecraft.entity.player.EntityPlayer; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; public class CommandCreatePocket extends DDCommandBase @@ -39,10 +38,10 @@ public class CommandCreatePocket extends DDCommandBase int x = (int) sender.posX; int y = (int) sender.posY; int z = (int) sender.posZ; - NewLinkData link = DungeonHelper.instance().createCustomDungeonDoor(sender.worldObj, x, y, z); + DungeonHelper.instance().createCustomDungeonDoor(sender.worldObj, x, y, z); //Notify the player - sender.sendChatToPlayer("Created a door to a pocket dimension (Dimension ID = " + link.destDimID + "). Please build your dungeon there."); + sender.sendChatToPlayer("Created a door to a pocket dimension. Please build your dungeon there."); } return DDCommandResult.SUCCESS; } diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteAllLinks.java b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteAllLinks.java index 1133cb1..55b307b 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteAllLinks.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteAllLinks.java @@ -4,9 +4,9 @@ import java.util.ArrayList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.ILinkData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; public class CommandDeleteAllLinks extends DDCommandBase { @@ -39,7 +39,7 @@ public class CommandDeleteAllLinks extends DDCommandBase else if(command.length==1) { targetDim = parseInt(sender, command[0]); - if(!dimHelper.dimList.containsKey(targetDim)) + if (!PocketManager.dimList.containsKey(targetDim)) { sender.sendChatToPlayer("Error- dim "+targetDim+" not registered"); shouldGo=false; @@ -54,24 +54,24 @@ public class CommandDeleteAllLinks extends DDCommandBase if(shouldGo) { - if(dimHelper.dimList.containsKey(targetDim)) + if(PocketManager.dimList.containsKey(targetDim)) { - DimData dim = dimHelper.instance.getDimData(targetDim); - ArrayList linksInDim = dim.getLinksInDim(); + NewDimData dim = PocketManager.instance.getDimData(targetDim); + ArrayList linksInDim = dim.getLinksInDim(); - for (NewLinkData link : linksInDim) + for (ILinkData link : linksInDim) { - World targetWorld = dimHelper.getWorld(targetDim); + World targetWorld = PocketManager.getWorld(targetDim); if(targetWorld==null) { - dimHelper.initDimension(targetDim); + PocketManager.initDimension(targetDim); } else if(targetWorld.provider==null) { - dimHelper.initDimension(targetDim); + PocketManager.initDimension(targetDim); } - targetWorld = dimHelper.getWorld(targetDim); + targetWorld = PocketManager.getWorld(targetDim); dim.removeLinkAtCoords(link); targetWorld.setBlock(link.locXCoord, link.locYCoord, link.locZCoord, 0); linksRemoved++; diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteDimensionData.java b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteDimensionData.java index 75b6513..7d65435 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteDimensionData.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteDimensionData.java @@ -4,9 +4,9 @@ import java.util.ArrayList; import java.util.Collection; import net.minecraft.entity.player.EntityPlayer; -import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.ILinkData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; public class CommandDeleteDimensionData extends DDCommandBase { @@ -39,7 +39,7 @@ public class CommandDeleteDimensionData extends DDCommandBase else if (command.length==1) { targetDim = parseInt(sender, command[0]); - if(!dimHelper.dimList.containsKey(targetDim)) + if(!PocketManager.dimList.containsKey(targetDim)) { sender.sendChatToPlayer("Error- dim "+targetDim+" not registered"); shouldGo=false; @@ -54,23 +54,23 @@ public class CommandDeleteDimensionData extends DDCommandBase if(shouldGo) { - if(dimHelper.dimList.containsKey(targetDim)) + if(PocketManager.dimList.containsKey(targetDim)) { try { - for(DimData dimData :dimHelper.dimList.values()) + for(NewDimData newDimData :PocketManager.dimList.values()) { - Collection links= new ArrayList(); - links.addAll( dimData.getLinksInDim()); + Collection links= new ArrayList(); + links.addAll( newDimData.getLinksInDim()); - for(NewLinkData link : links) + for(ILinkData link : links) { if(link.destDimID==targetDim) { - dimHelper.instance.getDimData(link.locDimID).removeLinkAtCoords(link); + PocketManager.instance.getDimData(link.locDimID).removeLinkAtCoords(link); linksRemoved++; } - if(dimData.dimID==targetDim) + if(newDimData.dimID==targetDim) { linksRemoved++; } @@ -82,7 +82,7 @@ public class CommandDeleteDimensionData extends DDCommandBase e.printStackTrace(); } - dimHelper.dimList.remove(targetDim); + PocketManager.dimList.remove(targetDim); sender.sendChatToPlayer("Removed dimension " + targetDim + " from DimDoors and deleted " + linksRemoved + " links"); } else diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteRifts.java b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteRifts.java index d3c925d..529cf20 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteRifts.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteRifts.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DimData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.ILinkData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; public class CommandDeleteRifts extends DDCommandBase { @@ -40,7 +40,7 @@ public class CommandDeleteRifts extends DDCommandBase else if(command.length==1) { targetDim = parseInt(sender, command[0]); - if(!dimHelper.dimList.containsKey(targetDim)) + if(!PocketManager.dimList.containsKey(targetDim)) { sender.sendChatToPlayer("Error- dim "+targetDim+" not registered"); shouldGo=false; @@ -55,24 +55,24 @@ public class CommandDeleteRifts extends DDCommandBase if(shouldGo) { - if(dimHelper.dimList.containsKey(targetDim)) + if(PocketManager.dimList.containsKey(targetDim)) { - DimData dim = dimHelper.instance.getDimData(targetDim); - ArrayList linksInDim = dim.getLinksInDim(); + NewDimData dim = PocketManager.instance.getDimData(targetDim); + ArrayList linksInDim = dim.getLinksInDim(); - for(NewLinkData link : linksInDim) + for(ILinkData link : linksInDim) { - World targetWorld = dimHelper.getWorld(targetDim); + World targetWorld = PocketManager.getWorld(targetDim); if(targetWorld==null) { - dimHelper.initDimension(targetDim); + PocketManager.initDimension(targetDim); } else if(targetWorld.provider==null) { - dimHelper.initDimension(targetDim); + PocketManager.initDimension(targetDim); } - targetWorld = dimHelper.getWorld(targetDim); + targetWorld = PocketManager.getWorld(targetDim); if (targetWorld.getBlockId(link.locXCoord, link.locYCoord, link.locZCoord) == mod_pocketDim.blockRift.blockID) { diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandPrintDimensionData.java b/StevenDimDoors/mod_pocketDim/commands/CommandPrintDimensionData.java index 14105d5..e4a99c6 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandPrintDimensionData.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandPrintDimensionData.java @@ -3,9 +3,9 @@ package StevenDimDoors.mod_pocketDim.commands; import java.util.ArrayList; import net.minecraft.entity.player.EntityPlayer; -import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.ILinkData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; public class CommandPrintDimensionData extends DDCommandBase { @@ -28,7 +28,7 @@ public class CommandPrintDimensionData extends DDCommandBase protected DDCommandResult processCommand(EntityPlayer sender, String[] command) { int targetDim; - DimData dimData; + NewDimData newDimData; if (command.length == 0) { @@ -50,17 +50,17 @@ public class CommandPrintDimensionData extends DDCommandBase return DDCommandResult.TOO_MANY_ARGUMENTS; } - dimData = dimHelper.instance.getDimData(targetDim); - if (dimData == null) + newDimData = PocketManager.instance.getDimData(targetDim); + if (newDimData == null) { return DDCommandResult.UNREGISTERED_DIMENSION; } - ArrayList links = dimData.getLinksInDim(); + ArrayList links = newDimData.getLinksInDim(); - sender.sendChatToPlayer("Dimension ID = " + dimData.dimID); - sender.sendChatToPlayer("Dimension Depth = " + dimData.depth); - for (NewLinkData link : links) + sender.sendChatToPlayer("Dimension ID = " + newDimData.dimID); + sender.sendChatToPlayer("Dimension Depth = " + newDimData.depth); + for (ILinkData link : links) { sender.sendChatToPlayer(link.printLinkData()); } diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandPruneDimensions.java b/StevenDimDoors/mod_pocketDim/commands/CommandPruneDimensions.java index 5145b9a..faee05f 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandPruneDimensions.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandPruneDimensions.java @@ -6,9 +6,9 @@ import java.util.HashSet; import java.util.Set; import net.minecraft.entity.player.EntityPlayer; -import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.ILinkData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; public class CommandPruneDimensions extends DDCommandBase { @@ -42,31 +42,31 @@ public class CommandPruneDimensions extends DDCommandBase int removedCount = 0; boolean deleteFolders = (command.length == 1); Set linkedDimensions = new HashSet(); - Collection allDims = new ArrayList(); - allDims.addAll(dimHelper.dimList.values()); + Collection allDims = new ArrayList(); + allDims.addAll(PocketManager.dimList.values()); - for (DimData data : allDims) + for (NewDimData data : allDims) { - for (NewLinkData link : data.getLinksInDim()) + for (ILinkData link : data.getLinksInDim()) { linkedDimensions.add(link.destDimID); } } - for (NewLinkData link : dimHelper.instance.interDimLinkList.values()) + for (ILinkData link : dimHelper.PocketManager.interDimLinkList.values()) { linkedDimensions.add(link.destDimID); } - for (DimData data : allDims) + for (NewDimData data : allDims) { if (!linkedDimensions.contains(data.dimID)) { - if (dimHelper.instance.pruneDimension(data, deleteFolders)) + if (PocketManager.instance.pruneDimension(data, deleteFolders)) { removedCount++; } } } - dimHelper.instance.save(); + PocketManager.instance.save(); sender.sendChatToPlayer("Removed " + removedCount + " unreachable pocket dims."); return DDCommandResult.SUCCESS; } diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java b/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java index 11c875a..73e808e 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java @@ -1,8 +1,8 @@ package StevenDimDoors.mod_pocketDim.commands; import net.minecraft.entity.player.EntityPlayer; -import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; public class CommandResetDungeons extends DDCommandBase { @@ -32,12 +32,12 @@ public class CommandResetDungeons extends DDCommandBase int dungeonCount = 0; int resetCount = 0; - for (DimData data : dimHelper.dimList.values()) + for (NewDimData data : PocketManager.dimList.values()) { if (data.isDimRandomRift) { dungeonCount++; - if (dimHelper.instance.resetPocket(data)) + if (PocketManager.instance.resetPocket(data)) { resetCount++; } diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandTeleportPlayer.java b/StevenDimDoors/mod_pocketDim/commands/CommandTeleportPlayer.java index 27c08f6..1892b22 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandTeleportPlayer.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandTeleportPlayer.java @@ -6,7 +6,7 @@ import java.util.List; import cpw.mods.fml.common.FMLCommonHandler; import StevenDimDoors.mod_pocketDim.BlankTeleporter; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import net.minecraft.entity.player.EntityPlayer; @@ -39,7 +39,7 @@ public class CommandTeleportPlayer extends DDCommandBase @Override protected DDCommandResult processCommand(EntityPlayer sender, String[] command) { - List dimensionIDs = Arrays.asList(dimHelper.getStaticDimensionIDs()); //Gets list of all registered dimensions, regardless if loaded or not + List dimensionIDs = Arrays.asList(PocketManager.getStaticDimensionIDs()); //Gets list of all registered dimensions, regardless if loaded or not EntityPlayer targetPlayer = sender; int dimDestinationID = sender.worldObj.provider.dimensionId; @@ -66,12 +66,12 @@ public class CommandTeleportPlayer extends DDCommandBase { return DDCommandResult.INVALID_DIMENSION_ID; } - if(dimHelper.getWorld(dimDestinationID)==null) + if(PocketManager.getWorld(dimDestinationID)==null) { - dimHelper.initDimension(dimDestinationID); + PocketManager.initDimension(dimDestinationID); } - FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().transferPlayerToDimension((EntityPlayerMP) targetPlayer, dimDestinationID, new BlankTeleporter(dimHelper.getWorld(dimDestinationID))); + FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().transferPlayerToDimension((EntityPlayerMP) targetPlayer, dimDestinationID, new BlankTeleporter(PocketManager.getWorld(dimDestinationID))); targetPlayer.setPositionAndUpdate(Integer.parseInt(command[2]),Integer.parseInt(command[3]),Integer.parseInt(command[4])); } else diff --git a/StevenDimDoors/mod_pocketDim/core/IDimLink.java b/StevenDimDoors/mod_pocketDim/core/IDimLink.java new file mode 100644 index 0000000..34d2f9b --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/core/IDimLink.java @@ -0,0 +1,31 @@ +package StevenDimDoors.mod_pocketDim.core; + +import java.io.Serializable; + +import StevenDimDoors.mod_pocketDim.util.Point4D; + +public interface IDimLink extends Serializable +{ + public final int TYPE_ENUM_MIN = 0; + public final int TYPE_ENUM_MAX = 8; + + public final int TYPE_NORMAL = 0; + public final int TYPE_LIMBO = 1; + public final int TYPE_POCKET = 2; + public final int TYPE_DUNGEON = 3; + public final int TYPE_RANDOM = 4; + public final int TYPE_DUNGEON_EXIT = 5; + public final int TYPE_SAFE_EXIT = 6; + public final int TYPE_UNSAFE_EXIT = 7; + public final int TYPE_RANDOM_DUNGEON = 8; + + public Point4D source(); + public Point4D destination(); + public boolean hasDestination(); + public Iterable children(); + public int childCount(); + public IDimLink parent(); + public int linkType(); + public IDimLink setDestination(int x, int y, int z, NewDimData dimension); + public IDimLink setLinkType(int linkType); +} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/core/LinkTail.java b/StevenDimDoors/mod_pocketDim/core/LinkTail.java new file mode 100644 index 0000000..5513600 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/core/LinkTail.java @@ -0,0 +1,31 @@ +package StevenDimDoors.mod_pocketDim.core; + +import StevenDimDoors.mod_pocketDim.util.Point4D; + +class LinkTail +{ + private Point4D destination; + private int linkType; + + public LinkTail(int linkType, Point4D destination) + { + this.linkType = linkType; + this.destination = destination; + } + + public Point4D getDestination() { + return destination; + } + + public void setDestination(Point4D destination) { + this.destination = destination; + } + + public int getLinkType() { + return linkType; + } + + public void setLinkType(int linkType) { + this.linkType = linkType; + } +} diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java new file mode 100644 index 0000000..543ffba --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -0,0 +1,496 @@ +package StevenDimDoors.mod_pocketDim.core; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.TreeMap; + +import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; +import StevenDimDoors.mod_pocketDim.util.Point4D; + +public abstract class NewDimData implements Serializable +{ + private static class DimLink implements IDimLink + { + //DimLink is an inner class here to make it immutable to code outside NewDimData + + private static final long serialVersionUID = 1462177151401498444L; + private static final int EXPECTED_CHILDREN = 2; + + private Point4D source; + private DimLink parent; + private LinkTail tail; + private ArrayList children; + + public DimLink(Point4D source, DimLink parent) + { + this.parent = parent; + this.source = source; + this.tail = parent.tail; + this.children = new ArrayList(EXPECTED_CHILDREN); + parent.children.add(this); + } + + public DimLink(Point4D source) + { + this.parent = null; + this.source = source; + this.tail = new LinkTail(0, null); + this.children = new ArrayList(EXPECTED_CHILDREN); + } + + @Override + public Point4D source() + { + return source; + } + + @Override + public Point4D destination() + { + return tail.getDestination(); + } + + @Override + public boolean hasDestination() + { + return (tail.getDestination() != null); + } + + @Override + public IDimLink setDestination(int x, int y, int z, NewDimData dimension) + { + if (dimension == null) + { + throw new IllegalArgumentException("dimension cannot be null."); + } + + tail.setDestination(new Point4D(x, y, z, dimension.id())); + return this; + } + + @Override + public IDimLink setLinkType(int linkType) + { + if (linkType < IDimLink.TYPE_ENUM_MIN || linkType > IDimLink.TYPE_ENUM_MAX) + { + throw new IllegalArgumentException("The specified link type is invalid."); + } + + tail.setLinkType(linkType); + return this; + } + + @Override + public Iterable children() + { + return children; + } + + @Override + public int childCount() + { + return children.size(); + } + + @Override + public IDimLink parent() + { + return parent; + } + + @Override + public int linkType() + { + return tail.getLinkType(); + } + + public void clear() + { + //Release children + for (IDimLink child : children) + { + ((DimLink) child).parent = null; + } + children.clear(); + + //Release parent + if (parent != null) + { + parent.children.remove(this); + } + + parent = null; + source = null; + tail = new LinkTail(0, null); + } + + public void overwrite(DimLink nextParent) + { + if (this == nextParent) + { + //Ignore this request silently + return; + } + + //Release children + for (IDimLink child : children) + { + ((DimLink) child).parent = null; + } + children.clear(); + + //Release parent + if (parent != null) + { + parent.children.remove(this); + } + + //Attach to new parent + parent = nextParent; + if (parent != null) + { + tail = parent.tail; + parent.children.add(this); + } + else + { + tail = new LinkTail(0, null); + } + } + + @Override + public String toString() + { + return source + " -> " + (hasDestination() ? destination() : ""); + } + } + + private static final long serialVersionUID = 89361974746997260L; + private static Random random = new Random(); + + private final int id; + private final Map linkMapping; + private final List linkList; + private final boolean isDungeon; + private boolean isFilled; + private final int depth; + private int packDepth; + private final NewDimData parent; + private final NewDimData root; + private final List children; + private Point4D origin; + private int orientation; + private DungeonData dungeon; + + protected NewDimData(int id, NewDimData parent, boolean isPocket, boolean isDungeon) + { + //The isPocket flag is redundant. It's meant as an integrity safeguard. + if (isPocket == (parent != null)) + { + throw new NullPointerException("Dimensions can be pocket dimensions if and only if they have a parent dimension."); + } + if (isDungeon && !isPocket) + { + throw new IllegalArgumentException("A dimensional dungeon must also be a pocket dimension."); + } + + this.id = id; + this.linkMapping = new TreeMap(); //Should be stored in oct tree -- temporary solution + this.linkList = new ArrayList(); //Should be stored in oct tree -- temporary solution + this.children = new ArrayList(); + this.parent = parent; + this.root = (parent != null ? parent.root : this); + this.depth = (parent != null ? parent.depth + 1 : 0); + this.packDepth = 0; + this.isDungeon = isDungeon; + this.isFilled = false; + this.orientation = 0; + this.origin = null; + this.dungeon = null; + + //Register with parent + addChildDimension(this); + } + + private void addChildDimension(NewDimData child) + { + children.add(child); + } + + public IDimLink findNearestRift(World world, int range, int x, int y, int z) + { + //TODO: Rewrite this later to use an octtree, remove World parameter + + //Sanity check... + if (world.provider.dimensionId != id) + { + throw new IllegalArgumentException("Attempted to search for links in a World instance for a different dimension!"); + } + + //Note: Only detect rifts at a distance > 1, so we ignore the rift + //that called this function and any adjacent rifts. + + IDimLink nearest = null; + IDimLink link; + + int distance; + int minDistance = Integer.MAX_VALUE; + int i, j, k; + DDProperties properties = DDProperties.instance(); + + for (i = -range; i <= range; i++) + { + for (j = -range; j <= range; j++) + { + for (k = -range; k <= range; k++) + { + distance = getAbsoluteSum(i, j, k); + if (distance > 1 && distance < minDistance && world.getBlockId(x + i, y + j, z + k) == properties.RiftBlockID) + { + link = getLink(x+i, y+j, z+k); + if (link != null) + { + nearest = link; + minDistance = distance; + } + } + } + } + } + + return nearest; + } + + private static int getAbsoluteSum(int i, int j, int k) + { + return Math.abs(i) + Math.abs(j) + Math.abs(k); + } + + public IDimLink createLink(int x, int y, int z) + { + return createLink(new Point4D(x, y, z, id)); + } + + private IDimLink createLink(Point4D source) + { + //Return an existing link if there is one to avoid creating multiple links starting at the same point. + DimLink link = linkMapping.get(source); + if (link == null) + { + link = new DimLink(source); + linkMapping.put(source, link); + linkList.add(link); + } + else + { + link.overwrite(null); + } + return link; + } + + public IDimLink createChildLink(int x, int y, int z, IDimLink parent) + { + if (parent == null) + { + throw new IllegalArgumentException("parent cannot be null."); + } + + return createChildLink(new Point4D(x, y, z, id), (DimLink) parent); + } + + private IDimLink createChildLink(Point4D source, DimLink parent) + { + //To avoid having multiple links at a single point, if we find an existing link then we overwrite + //its destination data instead of creating a new instance. + + DimLink link = linkMapping.get(source); + if (link == null) + { + link = new DimLink(source, parent); + linkMapping.put(source, link); + linkList.add(link); + } + else + { + link.overwrite(parent); + } + + return link; + } + + public boolean deleteLink(IDimLink link) + { + if (link.source().getDimension() != id) + { + throw new IllegalArgumentException("Attempted to delete a link from another dimension."); + } + DimLink target = linkMapping.remove(link.source()); + if (target != null) + { + linkList.remove(target); + target.clear(); + } + return (target != null); + } + + public boolean deleteLink(int x, int y, int z) + { + Point4D location = new Point4D(x, y, z, id); + DimLink target = linkMapping.remove(location); + if (target != null) + { + linkList.remove(target); + target.clear(); + } + return (target != null); + } + + public IDimLink getLink(int x, int y, int z) + { + Point4D location = new Point4D(x, y, z, id); + return linkMapping.get(location); + } + + public IDimLink getLink(Point4D location) + { + if (location.getDimension() != id) + return null; + + return linkMapping.get(location); + } + + public ArrayList getAllLinks() + { + ArrayList results = new ArrayList(linkMapping.size()); + results.addAll(linkMapping.values()); + return results; + } + + public boolean isPocketDimension() + { + return (parent != null); + } + + public boolean isDungeon() + { + return isDungeon; + } + + public boolean isFilled() + { + return isFilled; + } + + public void setFilled(boolean isFilled) + { + this.isFilled = isFilled; + } + + public int id() + { + return id; + } + + public int depth() + { + return depth; + } + + public int packDepth() + { + return packDepth; + } + + public Point4D origin() + { + return origin; + } + + public NewDimData parent() + { + return parent; + } + + public NewDimData root() + { + return root; + } + + public int orientation() + { + return orientation; + } + + public DungeonData dungeon() + { + return dungeon; + } + + public boolean isInitialized() + { + return (origin != null); + } + + public int linkCount() + { + return linkMapping.size(); + } + + public Iterable children() + { + return children; + } + + public void initializeDungeon(int originX, int originY, int originZ, int orientation, IDimLink link, DungeonData dungeon) + { + if (!isDungeon) + { + throw new IllegalStateException("Cannot invoke initializeDungeon() on a non-dungeon dimension."); + } + if (isInitialized()) + { + throw new IllegalStateException("The dimension has already been initialized."); + } + + link.setDestination(originX, originY, originZ, this); + this.origin = link.destination(); + this.orientation = orientation; + this.dungeon = dungeon; + } + + public void initializePocket(int originX, int originY, int originZ, int orientation, IDimLink link) + { + if (!isPocketDimension()) + { + throw new IllegalStateException("Cannot invoke initializePocket() on a non-pocket dimension."); + } + if (isInitialized()) + { + throw new IllegalStateException("The dimension has already been initialized."); + } + + link.setDestination(originX, originY, originZ, this); + this.origin = link.destination(); + this.orientation = orientation; + } + + public IDimLink getRandomLink() + { + if (linkMapping.isEmpty()) + { + throw new IllegalStateException("There are no links to select from in this dimension."); + } + if (linkList.size() > 1) + { + return linkList.get(random.nextInt(linkList.size())); + } + else + { + return linkList.get(0); + } + } +} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/core/NewLinkData.java b/StevenDimDoors/mod_pocketDim/core/NewLinkData.java deleted file mode 100644 index c2deee1..0000000 --- a/StevenDimDoors/mod_pocketDim/core/NewLinkData.java +++ /dev/null @@ -1,36 +0,0 @@ -package StevenDimDoors.mod_pocketDim.core; - -import java.io.Serializable; - -import StevenDimDoors.mod_pocketDim.util.Point4D; - -public class NewLinkData implements Serializable -{ - private static final long serialVersionUID = 1462177151401498444L; - - private Point4D source; - private Point4D destination; - - public NewLinkData(int srcX, int srcY, int srcZ, int srcDimension) - { - source = new Point4D(srcX, srcY, srcZ, srcDimension); - destination = null; - } - - public NewLinkData(int srcX, int srcY, int srcZ, int srcDimension, int dstX, int dstY, int dstZ, int dstDimension) - { - source = new Point4D(srcX, srcY, srcZ, srcDimension); - destination = new Point4D(dstX, dstY, dstZ, dstDimension); - } - - public NewLinkData(Point4D source, Point 4D destination) - { - - } - - @Override - public String toString() - { - return source + " -> " + destination; - } -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java new file mode 100644 index 0000000..e373107 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -0,0 +1,623 @@ +package StevenDimDoors.mod_pocketDim.core; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.ObjectOutputStream; +import java.util.HashMap; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.packet.Packet41EntityEffect; +import net.minecraft.network.packet.Packet43Experience; +import net.minecraft.network.packet.Packet9Respawn; +import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.common.DimensionManager; +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.DDTeleporter; +import StevenDimDoors.mod_pocketDim.ObjectSaveInputStream; +import StevenDimDoors.mod_pocketDim.PacketHandler; +import StevenDimDoors.mod_pocketDim.TileEntityRift; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; +import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; +import StevenDimDoors.mod_pocketDim.util.Point4D; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; + +/** + * This class regulates all the operations involving the storage and manipulation of dimensions. It handles saving dim data, teleporting the player, and + * creating/registering new dimensions as well as loading old dimensions on startup + */ +public class PocketManager +{ + private static class InnerDimData extends NewDimData + { + //This inner class allows us to instantiate NewDimData indirectly without exposing + //a public constructor from NewDimData. It's meant to stop us from constructing instances + //of NewDimData without using PocketManager's functions. In turn, that enforces that any + //link destinations must be real dimensions controlled by PocketManager. + + private static final long serialVersionUID = -3497038894870586232L; + + public InnerDimData(int id, NewDimData parent, boolean isPocket, boolean isDungeon) + { + super(id, parent, isPocket, isDungeon); + } + } + + private static int OVERWORLD_DIMENSION_ID = 0; + + private static boolean isInitialized = false; + private static boolean isSaving = false; + private static Random random = new Random(); + + //HashMap containing all the dims registered with DimDoors, sorted by dim ID. loaded on startup + private static HashMap dimensionData = new HashMap(); + + //HashMap for temporary storage of Link Signature damage hash values. See itemLinkSignature for more details + private static HashMap keyLinkMapping = new HashMap(); + + public static boolean isInitialized() + { + return isInitialized; + } + + public ILinkData createLink(ILinkData link) + { + DDProperties properties = DDProperties.instance(); + + if(!PocketManager.dimList.containsKey(link.locDimID)) + { + NewDimData locationDimData= new NewDimData(link.locDimID, false, 0, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord); + PocketManager.dimList.put(link.locDimID, locationDimData); + link.isLocPocket=false; + } + if(!dimList.containsKey(link.destDimID)) + { + PocketManager.dimList.put(link.destDimID, new NewDimData(link.destDimID, false, 0, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord)); + } + NewDimData locationDimData= PocketManager.instance.getDimData(link.locDimID); + link.isLocPocket=locationDimData.isPocket; + locationDimData.addLinkToDim(link); + + World world = PocketManager.getWorld(link.locDimID); + if (world != null) + { + if (!mod_pocketDim.blockRift.isBlockImmune(world, link.locXCoord, link.locYCoord, link.locZCoord)) + { + world.setBlock(link.locXCoord, link.locYCoord, link.locZCoord, properties.RiftBlockID); + } + } + //Notifies other players that a link has been created. + //TODO: Couldn't we use the serverside/clientside annotations to achieve this instead? Seems safer. ~SenseiKiwi + if(FMLCommonHandler.instance().getEffectiveSide()==Side.SERVER) + { + PacketHandler.onLinkCreatedPacket(link); + } + return link; + } + + /** + * properly deletes a link at the given coordinates. used by the rift remover. Also notifies clients of change. + * @param locationDimID + * @param locationXCoord + * @param locationYCoord + * @param locationZCoord + */ + public void removeLink( int locationDimID, int locationXCoord, int locationYCoord, int locationZCoord) + { + if(!PocketManager.dimList.containsKey(locationDimID)) + { + NewDimData locationDimData= new NewDimData(locationDimID, false, 0, locationDimID,locationXCoord,locationYCoord,locationZCoord); + PocketManager.dimList.put(locationDimID, locationDimData); + } + ILinkData link = this.getLinkDataFromCoords(locationXCoord, locationYCoord, locationZCoord, locationDimID); + PocketManager.instance.getDimData(locationDimID).removeLinkAtCoords(link); + //updates clients that a rift has been removed + if(FMLCommonHandler.instance().getEffectiveSide()==Side.SERVER) + { + PacketHandler.onLinkRemovedPacket(link); + this.save(); + } + } + + /** + * generates a door based on what door was used to teleport. Only functions once per linking. + * @param world- door + * @param incLink + */ + public void generateDoor(World world, ILinkData incLink) + { + int locX = incLink.locXCoord; + int locY = incLink.locYCoord; + int locZ = incLink.locZCoord; + + int destX = incLink.destXCoord; + int destY = incLink.destYCoord; + int destZ = incLink.destZCoord; + + DDProperties properties = DDProperties.instance(); + + if(!incLink.hasGennedDoor) + { + int destinationID = incLink.destDimID; + + int id =world.getBlockId(locX, locY, locZ); + if(id==properties.WarpDoorID||id==properties.DimensionalDoorID||id==properties.TransientDoorID) + { + int doorTypeToPlace=id; + if(DimensionManager.getWorld(destinationID)==null) + { + DimensionManager.initDimension(destinationID); + } + ILinkData destLink = this.getLinkDataFromCoords(destX, destY, destZ, destinationID); + int destOrientation = 0; + if(destLink!=null) + { + destOrientation = destLink.linkOrientation; + destLink.hasGennedDoor=true; + } + int blockToReplace= DimensionManager.getWorld(destinationID).getBlockId(destX, destY, destZ); + if(blockToReplace!=properties.DimensionalDoorID&&blockToReplace!=properties.WarpDoorID&&blockToReplace != properties.TransientDoorID) + { + DimensionManager.getWorld(destinationID).setBlock(destX, destY-1, destZ, doorTypeToPlace,destOrientation,2); + DimensionManager.getWorld(destinationID).setBlock(destX, destY, destZ, doorTypeToPlace,8,2); + } + incLink.hasGennedDoor=true; + } + } + } + + /** + * simple method called on startup to register all dims saved in the dim list. Only tries to register pocket dims, though. Also calls load() + * @return + */ + public static void initPockets() + { + if (isInitialized) + { + throw new IllegalStateException("Pocket dimensions have already been initialized!"); + } + + DDProperties properties = DDProperties.instance(); + + isInitialized = true; + load(); + for (NewDimData dimension : dimensionData.values()) + { + if (dimension.isPocketDimension()) + { + try + { + DimensionManager.registerDimension(dimension.id(), properties.PocketProviderID); + } + catch (Exception e) + { + System.err.println("Could not register pocket dimension #" + dimension.id() + ". Probably caused by a version update/save data corruption/other mods."); + e.printStackTrace(); + } + } + } + } + + public boolean resetPocket(NewDimData dimension) + { + if (!dimension.isPocketDimension() || DimensionManager.getWorld(dimension.id()) != null) + { + return false; + } + + File save = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); + DeleteFolder.deleteFolder(save); + dimension.setFilled(false); + //FIXME: Reset door information? + return true; + } + + public static boolean pruneDimension(NewDimData dimension, boolean deleteFolder) + { + //FIXME: Shouldn't the links in and out of this dimension be altered somehow? Otherwise we have links pointing + //into a deleted dimension! + + //Checks to see if the pocket is loaded or isn't actually a pocket. + if (dimension.isPocketDimension() && DimensionManager.getWorld(dimension.id()) == null) + { + dimensionData.remove(dimension.id()); + //FIXME: I added the following line. Seems like a good idea. Is it? + DimensionManager.unregisterDimension(dimension.id()); + if (deleteFolder) + { + File save = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); + DeleteFolder.deleteFolder(save); + } + return true; + } + else + { + return false; + } + } + + private static void unregisterDimensions() + { + for (NewDimData dimension : dimensionData.values()) + { + if (dimension.isPocketDimension()) + { + try + { + DimensionManager.unregisterDimension(dimension.id()); + } + catch (Exception e) + { + System.err.println("An unexpected error occurred while unregistering pocket dimension #" + dimension.id() + ":"); + e.printStackTrace(); + } + } + } + } + + /** + * Used to associate a damage value on a Rift Signature with a link pair. See LinkSignature for details. + * @return + */ + public static int createUniqueLinkKey() + { + int linkKey; + do + { + linkKey = random.nextInt(30000); + } + while (keyLinkMapping.containsKey(linkKey)); + return linkKey; + } + + /** + * Method used to create and register a new pocket dimension. Creates a reverse link if necessary. + * Populates the destination as well. + */ + private NewDimData createDestinationPocket(IDimLink link) + { + //First check the destination type + if (link.linkType() != IDimLink.TYPE_DUNGEON && link.linkType() != IDimLink.TYPE_POCKET) + { + throw new IllegalArgumentException("The link must lead to a dimensional dungeon or a pocket dimension."); + } + + DDProperties properties = DDProperties.instance(); + + //FIXME: This code had a check for whether dimension 0 was null. Why? Removed it for the time being. ~SenseiKiwi + + + if (PocketManager.getWorld(link.locDimID) == null) + { + PocketManager.initDimension(link.locDimID); + } + + int dimensionID; + int depth = this.getDimDepth(link.locDimID); + dimensionID = getNextFreeDimId(); + registerDimension(dimensionID, properties.PocketProviderID); + NewDimData locationDimData; + NewDimData destDimData; + + + + if(PocketManager.dimList.containsKey(link.locDimID)&&!DimensionManager.getWorld(link.locDimID).isRemote) //checks to see if dim is already registered. If not, it creates a DimData entry for it later + { + //randomizes exit if deep enough + locationDimData= dimList.get(DimensionManager.getWorld(link.locDimID).provider.dimensionId); + + if(depth>5) + { + if(depth>=12) + { + depth=11; + } + if(rand.nextInt(13-depth)==0) + { + ILinkData link1=getRandomLinkData(false); + } + } + if(locationDimData.isPocket) //determines the qualites of the pocket dim being created, based on parent dim. + { + if(isGoingDown) + { + destDimData= new NewDimData(dimensionID, true, locationDimData.depth+1, locationDimData.exitDimLink); + } + else + { + destDimData= new NewDimData(dimensionID, true, locationDimData.depth-1, locationDimData.exitDimLink); + } + } + else + { + destDimData= new NewDimData(dimensionID, true, 1, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord); + } + + } + else + { + locationDimData= new NewDimData(link.locDimID, false, 0, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord); + destDimData= new NewDimData(dimensionID, true, 1, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord); + } + destDimData.isDimRandomRift=isRandomRift; + PocketManager.dimList.put(DimensionManager.getWorld(link.locDimID).provider.dimensionId, locationDimData); + PocketManager.dimList.put(dimensionID, destDimData); + + if(FMLCommonHandler.instance().getEffectiveSide()==Side.SERVER)//sends packet to clients notifying them that a new dim has been created. + { + PacketHandler.onDimCreatedPacket(destDimData); + } + link = this.createLink(DimensionManager.getWorld(link.locDimID).provider.dimensionId,dimensionID,link.locXCoord,link.locYCoord,link.locZCoord, link.destXCoord,constrainPocketY(link.destYCoord),link.destZCoord,link.linkOrientation); //creates and registers the two rifts that link the parent and pocket dim. + this.createLink(dimensionID,DimensionManager.getWorld(link.locDimID).provider.dimensionId, link.destXCoord,constrainPocketY(link.destYCoord),link.destZCoord, link.locXCoord,link.locYCoord,link.locZCoord, BlockRotator.transformMetadata(link.linkOrientation, 2, Block.doorWood.blockID)); + return link; + } + + /** + * Function that saves all dim data in a hashMap. Calling too often can cause Concurrent modification exceptions, so be careful. + * @return + */ + public static void save() + { + //TODO change from saving serialized objects to just saving data for compatabilies sake. + //TODO If saving is multithreaded as the concurrent modification exception implies, you should be synchronizing access. ~SenseiKiwi + + if (isSaving) + { + return; + } + World world = DimensionManager.getWorld(OVERWORLD_DIMENSION_ID); + if (world == null || world.isRemote) + { + return; + } + if (DimensionManager.getCurrentSaveRootDirectory() != null) + { + isSaving = true; + HashMap comboSave = new HashMap(); + comboSave.put("dimensionData", dimensionData); + comboSave.put("keyLinkMapping", keyLinkMapping); + + FileOutputStream saveFile = null; + try + { + String saveFileName=DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataTEMP"; + saveFile = new FileOutputStream(saveFileName); + + ObjectOutputStream save = new ObjectOutputStream(saveFile); + save.writeObject(comboSave); + save.close(); + saveFile.close(); + + if (new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataOLD").exists()) + { + new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataOLD").delete(); + } + new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsData").renameTo(new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataOLD")); + + new File(saveFileName).renameTo( new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsData")); + } + catch(Exception e) + { + e.printStackTrace(); + System.err.println("Could not save data-- SEVERE"); + } + isSaving = false; + } + } + + /** + * loads the dim data from the saved hashMap. Also handles compatibility with old saves, see OldSaveHandler + * @return + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static void load() + { + //FIXME: There are a lot of things to fix here... First, we shouldn't be created so many File instances + //when we could just hold references and reuse them. Second, duplicate code is BAD. Loading stuff should + //be a function so that you can apply it to the save file first, then the "backup", instead of duplicating + //so much code. >_< + + boolean firstRun = false; + System.out.println("Loading DimDoors data"); + FileInputStream saveFile = null; + + if (!DimensionManager.getWorld(OVERWORLD_DIMENSION_ID).isRemote && DimensionManager.getCurrentSaveRootDirectory()!=null) + { + try + { + File dataStore = new File( DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsData"); + if (!dataStore.exists()) + { + if (!new File( DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataOLD").exists()) + { + firstRun=true; + } + } + saveFile = new FileInputStream(dataStore); + ObjectSaveInputStream save = new ObjectSaveInputStream(saveFile); + HashMap comboSave = ((HashMap) save.readObject()); + + try + { + keyLinkMapping = (HashMap) comboSave.get("keyLinkMapping"); + } + catch (Exception e) + { + System.out.println("Could not load Link Signature list. Link Sig items will lose their stored locations."); + } + + try + { + dimensionData = (HashMap) comboSave.get("dimensionData"); + } + catch(Exception e) + { + System.out.println("Could not load pocket dimension list. Saves are probably lost, but repairable. Move the files from individual pocket dim files to active ones. See MC thread for details."); + } + + save.close(); + saveFile.close(); + } + catch (Exception e) + { + try + { + if (!firstRun) + { + System.out.println("Save data damaged, trying backup..."); + } + World world=FMLCommonHandler.instance().getMinecraftServerInstance().worldServers[0]; + File dataStore =new File( world.getSaveHandler().getMapFileFromName("idcounts").getParentFile().getParent()+"/DimensionalDoorsDataOLD"); + + + saveFile = new FileInputStream(dataStore); + ObjectSaveInputStream save = new ObjectSaveInputStream(saveFile); + HashMap comboSave =((HashMap)save.readObject()); + + try + { + keyLinkMapping = (HashMap) comboSave.get("keyLinkMapping"); + } + catch (Exception e2) + { + System.out.println("Could not load Link Signature list. Link Sig items will loose restored locations."); + } + + try + { + dimensionData = (HashMap) comboSave.get("dimensionData"); + } + catch (Exception e2) + { + System.out.println("Could not load pocket dim list. Saves probably lost, but repairable. Move the files from indivual pocket dim files to active ones. See MC thread for details."); + } + + save.close(); + saveFile.close(); + } + catch (Exception e2) + { + if (!firstRun) + { + System.err.println("Could not read data-- SEVERE"); + e2.printStackTrace(); + } + } + } + } + } + + public static boolean removeRift(World world, int x, int y, int z, int range, EntityPlayer player, ItemStack item) + { + //Function called by rift tile entities and the rift remover to find and spread between rifts. + //Does not actually unregister the rift data, see deleteRift for that. + + NewDimData dimension = getDimensionData(world); + IDimLink nearest = dimension.findNearestRift(world, range, x, y, z); + + if (nearest != null) + { + Point4D location = nearest.source(); + TileEntity tileEntity = world.getBlockTileEntity(location.getX(), location.getY(), location.getZ()); + if (tileEntity != null) + { + TileEntityRift riftEntity = (TileEntityRift) tileEntity; + riftEntity.shouldClose = true; + item.damageItem(1, player); + return true; + } + } + return false; + } + + public static NewDimData registerDimension(World world) + { + return registerDimension(world.provider.dimensionId, null, false, false); + } + + public static NewDimData registerPocket(NewDimData parent, boolean isDungeon) + { + if (parent == null) + { + throw new IllegalArgumentException("parent cannot be null. A pocket dimension must always have a parent dimension."); + } + + DDProperties properties = DDProperties.instance(); + int dimensionID = DimensionManager.getNextFreeDimId(); + DimensionManager.registerDimension(dimensionID, properties.PocketProviderID); + return registerDimension(dimensionID, parent, true, isDungeon); + } + + private static NewDimData registerDimension(int dimensionID, NewDimData parent, boolean isPocket, boolean isDungeon) + { + if (dimensionData.containsKey(dimensionID)) + { + throw new IllegalArgumentException("Cannot register a dimension with ID = " + dimensionID + " because it has already been registered."); + } + + NewDimData dimension = new InnerDimData(dimensionID, parent, isPocket, isDungeon); + dimensionData.put(dimensionID, dimension); + return dimension; + } + + public static NewDimData getDimensionData(World world) + { + return getDimensionData(world.provider.dimensionId); + } + + public static NewDimData getDimensionData(int dimensionID) + { + //Retrieve the data for a dimension. If we don't have a record for that dimension, + //assume it's a non-pocket dimension that hasn't been initialized with us before + //and create a NewDimData instance for it. + //Any pocket dimension must be listed with PocketManager to have a dimension ID + //assigned, so it's safe to assume that any unknown dimensions don't belong to us. + + NewDimData dimension = PocketManager.dimensionData.get(dimensionID); + if (dimension == null) + { + dimension = registerDimension(dimensionID, null, false, false); + } + return dimension; + } + + public static void unload() + { + save(); + unregisterDimensions(); + dimensionData.clear(); + keyLinkMapping.clear(); + } + + public static Iterable getDimensions() + { + return dimensionData.values(); + } + + public static IDimLink getLink(int x, int y, int z, int dimensionID) + { + NewDimData dimension = dimensionData.get(dimensionID); + if (dimension != null) + { + return dimension.getLink(x, y, z); + } + else + { + return null; + } + } +} diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonData.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonData.java new file mode 100644 index 0000000..6d57e7d --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonData.java @@ -0,0 +1,76 @@ +package StevenDimDoors.mod_pocketDim.dungeon; + +import java.io.FileNotFoundException; +import java.io.Serializable; + +import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonType; +import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; +import StevenDimDoors.mod_pocketDim.schematic.InvalidSchematicException; + +public class DungeonData implements Serializable +{ + private static final long serialVersionUID = -5624866366474710161L; + + private final int weight; + private final boolean isOpen; + private final boolean isInternal; + private final String schematicPath; + private final String schematicName; + private final DungeonType dungeonType; + + public DungeonData(String schematicPath, boolean isInternal, DungeonType dungeonType, boolean isOpen, int weight) + { + this.schematicPath = schematicPath; + this.schematicName = getSchematicName(schematicPath); + this.dungeonType = dungeonType; + this.isInternal = isInternal; + this.isOpen = isOpen; + this.weight = weight; + } + + private static String getSchematicName(String schematicPath) + { + int indexA = schematicPath.lastIndexOf('\\'); + int indexB = schematicPath.lastIndexOf('/'); + indexA = Math.max(indexA, indexB) + 1; + + return schematicPath.substring(indexA, schematicPath.length() - DungeonHelper.SCHEMATIC_FILE_EXTENSION.length() - indexA); + } + + public int weight() + { + return weight; + } + + public boolean isOpen() + { + return isOpen; + } + + public String schematicPath() + { + return schematicPath; + } + + public DungeonType dungeonType() + { + return dungeonType; + } + + public String schematicName() + { + return schematicName; + } + + public DungeonSchematic loadSchematic() throws InvalidSchematicException, FileNotFoundException + { + if (isInternal) + { + return DungeonSchematic.readFromResource(schematicPath); + } + else + { + return DungeonSchematic.readFromFile(schematicPath); + } + } +} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 60b0073..4c0eb59 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -19,7 +19,7 @@ import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import StevenDimDoors.mod_pocketDim.schematic.CompoundFilter; @@ -295,7 +295,7 @@ public class DungeonSchematic extends Schematic { //Set the orientation of the rift exit Point3D entranceRiftLocation = entrance.clone(); BlockRotator.transformPoint(entranceRiftLocation, entrance, rotation, pocketCenter); - NewLinkData sideLink = dimHelper.instance.getLinkDataFromCoords( + NewLinkData sideLink = PocketManager.instance.getLinkDataFromCoords( entranceRiftLocation.getX(), entranceRiftLocation.getY(), entranceRiftLocation.getZ(), @@ -319,9 +319,9 @@ public class DungeonSchematic extends Schematic { int blockDirection = world.getBlockMetadata(location.getX(), location.getY() - 1, location.getZ()); Point3D linkDestination = location.clone(); - NewLinkData randomLink = dimHelper.instance.getRandomLinkData(false); + NewLinkData randomLink = PocketManager.instance.getRandomLinkData(false); NewLinkData sideLink = new NewLinkData(destDimID, - dimHelper.instance.getDimData(originDimID).exitDimLink.destDimID, + PocketManager.instance.getDimData(originDimID).exitDimLink.destDimID, location.getX(), location.getY(), location.getZ(), @@ -346,7 +346,7 @@ public class DungeonSchematic extends Schematic { } sideLink.linkOrientation = world.getBlockMetadata(linkDestination.getX(), linkDestination.getY() - 1, linkDestination.getZ()); - dimHelper.instance.createLink(sideLink); + PocketManager.instance.createLink(sideLink); /**dimHelper.instance.createLink(sideLink.destDimID , sideLink.locDimID, sideLink.destXCoord, @@ -377,7 +377,7 @@ public class DungeonSchematic extends Schematic { private static void setUpDimensionalDoorLink(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter, int originDimID, int destDimID, boolean applyNoise, Random random) { - int depth = dimHelper.instance.getDimDepth(originDimID) + 1; + int depth = PocketManager.instance.getDimDepth(originDimID) + 1; int forwardNoise; int sidewaysNoise; @@ -413,7 +413,7 @@ public class DungeonSchematic extends Schematic { linkDestination.getY() + 1, linkDestination.getZ(), true, blockDirection); - dimHelper.instance.createPocket(sideLink, true, true); + PocketManager.instance.createPocket(sideLink, true, true); } private static void spawnMonolith(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java index c2388bb..61f182c 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/pack/DungeonPack.java @@ -7,10 +7,9 @@ import java.util.HashSet; import java.util.Random; import net.minecraft.util.WeightedRandom; -import StevenDimDoors.mod_pocketDim.DungeonGenerator; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.util.WeightedContainer; public class DungeonPack @@ -21,12 +20,12 @@ public class DungeonPack //The ID numbers would be a problem since it couldn't have a valid number, since it wasn't initialized by the pack instance. //FIXME: Do not release this code as an update without dealing with disowned types! - private static final int MAX_HISTORY_LENGTH = 1337; + private static final int MAX_HISTORY_LENGTH = 30; private final String name; private final HashMap nameToTypeMapping; - private final ArrayList> groupedDungeons; - private final ArrayList allDungeons; + private final ArrayList> groupedDungeons; + private final ArrayList allDungeons; private final DungeonPackConfig config; private final int maxRuleLength; private final ArrayList rules; @@ -40,9 +39,9 @@ public class DungeonPack int index; int maxLength = 0; int typeCount = config.getTypeNames().size(); - this.allDungeons = new ArrayList(); + this.allDungeons = new ArrayList(); this.nameToTypeMapping = new HashMap(typeCount); - this.groupedDungeons = new ArrayList>(typeCount); + this.groupedDungeons = new ArrayList>(typeCount); this.groupedDungeons.add(allDungeons); //Make sure the list of all dungeons is placed at index 0 this.nameToTypeMapping.put(DungeonType.WILDCARD_TYPE.Name, DungeonType.WILDCARD_TYPE); @@ -52,7 +51,7 @@ public class DungeonPack { String standardName = typeName.toUpperCase(); this.nameToTypeMapping.put(standardName, new DungeonType(this, standardName, index)); - this.groupedDungeons.add(new ArrayList()); + this.groupedDungeons.add(new ArrayList()); index++; } @@ -108,14 +107,14 @@ public class DungeonPack return (this.getType(typeName) != null); } - public void addDungeon(DungeonGenerator generator) + public void addDungeon(DungeonData dungeon) { //Make sure this dungeon really belongs in this pack - DungeonType type = generator.getDungeonType(); + DungeonType type = dungeon.dungeonType(); if (type.Owner == this) { - allDungeons.add(generator); - groupedDungeons.get(type.ID).add(generator); + allDungeons.add(dungeon); + groupedDungeons.get(type.ID).add(dungeon); } else { @@ -123,7 +122,7 @@ public class DungeonPack } } - public DungeonGenerator getNextDungeon(NewLinkData inbound, Random random) + public DungeonData getNextDungeon(NewDimData dimension, Random random) { if (allDungeons.isEmpty()) { @@ -136,27 +135,26 @@ public class DungeonPack //for dungeon packs that can extend arbitrarily deep. We should probably set a reasonable limit anyway. int maxSearchLength = config.allowDuplicatesInChain() ? maxRuleLength : MAX_HISTORY_LENGTH; - ArrayList history = DungeonHelper.getDungeonChainHistory( - dimHelper.instance.getDimData(inbound.locDimID), this, maxSearchLength); + ArrayList history = DungeonHelper.getDungeonChainHistory(dimension.parent(), this, maxSearchLength); return getNextDungeon(history, random); } - private DungeonGenerator getNextDungeon(ArrayList history, Random random) + private DungeonData getNextDungeon(ArrayList history, Random random) { //Extract the dungeon types that have been used from history and convert them into an array of IDs int index; int[] typeHistory = new int[history.size()]; - HashSet excludedDungeons = null; + HashSet excludedDungeons = null; for (index = 0; index < typeHistory.length; index++) { - typeHistory[index] = history.get(index).getDungeonType().ID; + typeHistory[index] = history.get(index).dungeonType().ID; } for (DungeonChainRule rule : rules) { if (rule.evaluate(typeHistory)) { - //Pick a random dungeon type to be generated next based on the rule's products + //Pick a random dungeon type to be generated next based on the rule's products ArrayList> products = rule.products(); DungeonType nextType; do @@ -167,16 +165,16 @@ public class DungeonPack //Initialize the set of excluded dungeons if needed if (excludedDungeons == null && !config.allowDuplicatesInChain()) { - excludedDungeons = new HashSet(history); + excludedDungeons = new HashSet(history); } //List which dungeons are allowed - ArrayList candidates; - ArrayList group = groupedDungeons.get(nextType.ID); + ArrayList candidates; + ArrayList group = groupedDungeons.get(nextType.ID); if (excludedDungeons != null && !excludedDungeons.isEmpty()) { - candidates = new ArrayList(group.size()); - for (DungeonGenerator dungeon : group) + candidates = new ArrayList(group.size()); + for (DungeonData dungeon : group) { if (!excludedDungeons.contains(dungeon)) { @@ -204,7 +202,7 @@ public class DungeonPack return getRandomDungeon(random); } - public DungeonGenerator getRandomDungeon(Random random) + public DungeonData getRandomDungeon(Random random) { if (!allDungeons.isEmpty()) { @@ -217,7 +215,7 @@ public class DungeonPack } private static DungeonType getRandomDungeonType(Random random, Collection> types, - ArrayList> groupedDungeons) + ArrayList> groupedDungeons) { //TODO: Make this faster? This algorithm runs in quadratic time in the worst case because of the random-selection //process and the removal search. Might be okay for normal use, though. ~SenseiKiwi @@ -248,18 +246,18 @@ public class DungeonPack return null; } - private static DungeonGenerator getRandomDungeon(Random random, Collection dungeons) + private static DungeonData getRandomDungeon(Random random, Collection dungeons) { //Use Minecraft's WeightedRandom to select our dungeon. =D - ArrayList> weights = - new ArrayList>(dungeons.size()); - for (DungeonGenerator dungeon : dungeons) + ArrayList> weights = + new ArrayList>(dungeons.size()); + for (DungeonData dungeon : dungeons) { - weights.add(new WeightedContainer(dungeon, dungeon.weight)); + weights.add(new WeightedContainer(dungeon, dungeon.weight())); } @SuppressWarnings("unchecked") - WeightedContainer resultContainer = (WeightedContainer) WeightedRandom.getRandomItem(random, weights); + WeightedContainer resultContainer = (WeightedContainer) WeightedRandom.getRandomItem(random, weights); return (resultContainer != null) ? resultContainer.getData() : null; } } diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index fa44b8f..ba65103 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -20,10 +20,11 @@ import java.util.regex.Pattern; import net.minecraft.util.WeightedRandom; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.DungeonGenerator; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; @@ -62,8 +63,6 @@ public class DungeonHelper public static final String SCHEMATIC_FILE_EXTENSION = ".schematic"; - private static final String DEFAULT_UP_SCHEMATIC_PATH = "/schematics/core/simpleStairsUp.schematic"; - private static final String DEFAULT_DOWN_SCHEMATIC_PATH = "/schematics/core/simpleStairsDown.schematic"; private static final String DEFAULT_ERROR_SCHEMATIC_PATH = "/schematics/core/somethingBroke.schematic"; private static final String DUNGEON_CREATION_GUIDE_SOURCE_PATH = "/mods/DimDoors/text/How_to_add_dungeons.txt"; private static final String RUINS_PACK_PATH = "/schematics/ruins"; @@ -86,16 +85,14 @@ public class DungeonHelper public static final short MAX_DUNGEON_HEIGHT = MAX_DUNGEON_WIDTH; public static final short MAX_DUNGEON_LENGTH = MAX_DUNGEON_WIDTH; - private ArrayList untaggedDungeons = new ArrayList(); - private ArrayList registeredDungeons = new ArrayList(); + private ArrayList untaggedDungeons = new ArrayList(); + private ArrayList registeredDungeons = new ArrayList(); private DungeonPack RuinsPack; private HashMap dungeonPackMapping = new HashMap(); private ArrayList dungeonPackList = new ArrayList(); - private DungeonGenerator defaultUp; - private DungeonGenerator defaultDown; - private DungeonGenerator defaultError; + private DungeonData defaultError; private DungeonHelper() { @@ -227,47 +224,34 @@ public class DungeonHelper } } - public List getRegisteredDungeons() + public List getRegisteredDungeons() { return Collections.unmodifiableList(this.registeredDungeons); } - public List getUntaggedDungeons() + public List getUntaggedDungeons() { return Collections.unmodifiableList(this.untaggedDungeons); } - public DungeonGenerator getDefaultErrorDungeon() + public DungeonData getDefaultErrorDungeon() { return defaultError; } - public DungeonGenerator getDefaultUpDungeon() - { - return defaultUp; - } - - public DungeonGenerator getDefaultDownDungeon() - { - return defaultDown; - } - public DungeonPack getDungeonPack(String name) { //TODO: This function might be obsolete after the new save format is implemented. return dungeonPackMapping.get(name.toUpperCase()); } - public DungeonPack getDimDungeonPack(int dimensionID) + private DungeonPack getDimDungeonPack(NewDimData data) { - //FIXME: This function is a workaround to our current dungeon data limitations. Modify later. - //The upcoming save format change and code overhaul will make this obsolete. - DungeonPack pack; - DungeonGenerator generator = dimHelper.dimList.get(dimensionID).dungeonGenerator; - if (generator != null) + DungeonData dungeon = data.dungeon(); + if (dungeon != null) { - pack = generator.getDungeonType().Owner; + pack = dungeon.dungeonType().Owner; //Make sure the pack isn't null. This can happen for dungeons with the special UNKNOWN type. if (pack == null) @@ -277,7 +261,7 @@ public class DungeonHelper } else { - if (dimensionID == NETHER_DIMENSION_ID) + if (data.id() == NETHER_DIMENSION_ID) { //TODO: Change this to the nether-side pack later ^_^ pack = RuinsPack; @@ -290,11 +274,11 @@ public class DungeonHelper return pack; } - public NewLinkData createCustomDungeonDoor(World world, int x, int y, int z) + public IDimLink createCustomDungeonDoor(World world, int x, int y, int z) { //Create a link above the specified position. Link to a new pocket dimension. - NewLinkData link = new NewLinkData(world.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 3); - link = dimHelper.instance.createPocket(link, true, false); + NewDimData dimension = PocketManager.getDimensionData(world); + IDimLink link = dimension.createLink(x, y + 1, z).setLinkType(IDimLink.TYPE_POCKET); //Place a Warp Door linked to that pocket itemDimDoor.placeDoorBlock(world, x, y, z, 3, mod_pocketDim.ExitDoor); @@ -304,7 +288,6 @@ public class DungeonHelper public boolean validateDungeonType(String type, DungeonPack pack) { - //Check if the dungeon type is valid return pack.isKnownType(type); } @@ -370,10 +353,10 @@ public class DungeonHelper int weight = (dungeonData.length == 4) ? Integer.parseInt(dungeonData[3]) : DEFAULT_DUNGEON_WEIGHT; //Add this custom dungeon to the list corresponding to its type - DungeonGenerator generator = new DungeonGenerator(weight, path, isOpen, dungeonType); + DungeonData dungeon = new DungeonData(path, isInternal, dungeonType, isOpen, weight); - pack.addDungeon(generator); - registeredDungeons.add(generator); + pack.addDungeon(dungeon); + registeredDungeons.add(dungeon); if (verbose) { System.out.println("Registered dungeon: " + name); @@ -385,7 +368,7 @@ public class DungeonHelper { System.out.println("The following dungeon name is invalid for its given pack. It will not be generated naturally: " + schematicPath); } - untaggedDungeons.add(new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, path, true, DungeonType.UNKNOWN_TYPE)); + untaggedDungeons.add(new DungeonData(path, isInternal, DungeonType.UNKNOWN_TYPE, true, DEFAULT_DUNGEON_WEIGHT)); System.out.println("Registered untagged dungeon: " + name); } } @@ -462,9 +445,7 @@ public class DungeonHelper { //Register the core schematics //These are used for debugging and in case of unusual errors while loading dungeons - defaultUp = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, DEFAULT_UP_SCHEMATIC_PATH, true, DungeonType.UNKNOWN_TYPE); - defaultDown = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, DEFAULT_DOWN_SCHEMATIC_PATH, true, DungeonType.UNKNOWN_TYPE); - defaultError = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, DEFAULT_ERROR_SCHEMATIC_PATH, true, DungeonType.UNKNOWN_TYPE); + defaultError = new DungeonData(DEFAULT_ERROR_SCHEMATIC_PATH, true, DungeonType.UNKNOWN_TYPE, true, DEFAULT_DUNGEON_WEIGHT); //Open the list of dungeons packaged with our mod and register their schematics registerBundledPack(BUNDLED_RUINS_LIST_PATH, RUINS_PACK_PATH, "Ruins", reader); @@ -530,9 +511,10 @@ public class DungeonHelper } } - public void generateDungeonLink(NewLinkData inbound, DungeonPack pack, Random random) + public DungeonData selectDungeon(NewDimData dimension, Random random) { - DungeonGenerator selection; + DungeonPack pack = getDimDungeonPack(dimension); + DungeonData selection; DungeonPackConfig config; DungeonPack selectedPack; @@ -546,13 +528,13 @@ public class DungeonHelper { //Calculate the chance of switching to a different pack type int packSwitchChance; - if (dimHelper.dimList.get(inbound.locDimID).depth == 0) + if (dimension.depth() == 1) { packSwitchChance = START_PACK_SWITCH_CHANCE; } else { - packSwitchChance = MIN_PACK_SWITCH_CHANCE + (getPackDepth(inbound, pack) - 1) * PACK_SWITCH_CHANCE_PER_LEVEL; + packSwitchChance = MIN_PACK_SWITCH_CHANCE + dimension.parent().packDepth() * PACK_SWITCH_CHANCE_PER_LEVEL; } //Decide randomly whether to switch packs or not @@ -564,7 +546,7 @@ public class DungeonHelper } //Pick the next dungeon - selection = selectedPack.getNextDungeon(inbound, random); + selection = selectedPack.getNextDungeon(dimension, random); } catch (Exception e) { @@ -580,7 +562,7 @@ public class DungeonHelper selection = defaultError; } } - dimHelper.instance.getDimData(inbound.destDimID).dungeonGenerator = selection; + return selection; } @SuppressWarnings("unchecked") @@ -621,16 +603,16 @@ public class DungeonHelper return sortedNames; } - private static ArrayList parseDungeonNames(ArrayList dungeons) + private static ArrayList parseDungeonNames(ArrayList dungeons) { String name; File schematic; ArrayList names = new ArrayList(dungeons.size()); - for (DungeonGenerator dungeon : dungeons) + for (DungeonData dungeon : dungeons) { //Retrieve the file name and strip off the file extension - schematic = new File(dungeon.schematicPath); + schematic = new File(dungeon.schematicPath()); name = schematic.getName(); name = name.substring(0, name.length() - SCHEMATIC_FILE_EXTENSION.length()); names.add(name); @@ -638,102 +620,48 @@ public class DungeonHelper return names; } - public static ArrayList getDungeonChainHistory(DimData dimData, DungeonPack pack, int maxSize) + public static ArrayList getDungeonChainHistory(NewDimData dimension, DungeonPack pack, int maxSize) { - //TODO: I've improved this code for the time being. However, searching across links is a flawed approach. A player could - //manipulate the output of this function by setting up links to mislead our algorithm or by removing links. - //Dimensions MUST have built-in records of their parent dimensions in the future. ~SenseiKiwi - - ArrayList history = new ArrayList(); - DimData tailDim = dimData; - boolean found = true; - - if (dimData.dungeonGenerator == null || dimData.dungeonGenerator.getDungeonType().Owner != pack || maxSize < 1) + if (dimension == null) { - //The initial dimension is already outside our pack. Return an empty list. - return history; + throw new IllegalArgumentException("dimension cannot be null."); } - history.add(dimData.dungeonGenerator); - for (int count = 1; count < maxSize && found; count++) + int count = 0; + NewDimData tail = dimension; + DungeonData dungeon = tail.dungeon(); + ArrayList history = new ArrayList(); + + while (count < maxSize && dungeon != null && dungeon.dungeonType().Owner == pack) { - found = false; - for (NewLinkData link : tailDim.getLinksInDim()) - { - DimData neighbor = dimHelper.instance.getDimData(link.destDimID); - if (neighbor.depth == tailDim.depth - 1 && neighbor.dungeonGenerator != null && - neighbor.dungeonGenerator.getDungeonType().Owner == pack) - { - tailDim = neighbor; - history.add(tailDim.dungeonGenerator); - found = true; - break; - } - } + history.add(dungeon); + tail = tail.parent(); + dungeon = tail.dungeon(); + count++; } return history; } - private static int getPackDepth(NewLinkData inbound, DungeonPack pack) + public static ArrayList getFlatDungeonTree(NewDimData dimension, int maxSize) { - //TODO: I've improved this code for the time being. However, searching across links is a flawed approach. A player could - //manipulate the output of this function by setting up links to mislead our algorithm or by removing links. - //Dimensions MUST have built-in records of their parent dimensions in the future. ~SenseiKiwi - //Dimensions should also just keep track of pack depth internally. + NewDimData root = dimension; + ArrayList dungeons = new ArrayList(); + Queue pendingDimensions = new LinkedList(); - int packDepth = 1; - DimData tailDim = dimHelper.dimList.get(inbound.destDimID); - boolean found; - - do - { - found = false; - for (NewLinkData link : tailDim.getLinksInDim()) - { - DimData neighbor = dimHelper.instance.getDimData(link.destDimID); - if (neighbor.depth == tailDim.depth - 1 && neighbor.dungeonGenerator != null && - neighbor.dungeonGenerator.getDungeonType().Owner == pack) - { - tailDim = neighbor; - found = true; - packDepth++; - break; - } - } - } - while (found); - - return packDepth; - } - - public static ArrayList getFlatDungeonTree(DimData dimData, int maxSize) - { - //TODO: I've improved this code for the time being. However, searching across links is a flawed approach. A player could - //manipulate the output of this function by setting up links to mislead our algorithm or by removing links. - //Dimensions MUST have built-in records of their parent dimensions in the future. ~SenseiKiwi - - dimHelper helper = dimHelper.instance; - ArrayList dungeons = new ArrayList(); - DimData root = helper.getDimData(helper.getLinkDataFromCoords(dimData.exitDimLink.destXCoord, dimData.exitDimLink.destYCoord, dimData.exitDimLink.destZCoord, dimData.exitDimLink.destDimID).destDimID); - HashSet checked = new HashSet(); - Queue pendingDimensions = new LinkedList(); - - if (root.dungeonGenerator == null) + if (root.dungeon() == null) { return dungeons; } pendingDimensions.add(root); - checked.add(root); while (dungeons.size() < maxSize && !pendingDimensions.isEmpty()) { - DimData current = pendingDimensions.remove(); - for (NewLinkData link : current.getLinksInDim()) + NewDimData current = pendingDimensions.remove(); + for (NewDimData child : current.children()) { - DimData child = helper.getDimData(link.destDimID); - if (child.depth == current.depth + 1 && child.dungeonGenerator != null && checked.add(child)) + if (child.dungeon() != null) { - dungeons.add(child.dungeonGenerator); + dungeons.add(child.dungeon()); pendingDimensions.add(child); } if (dungeons.size() == maxSize) diff --git a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java b/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java deleted file mode 100644 index c07f9f5..0000000 --- a/StevenDimDoors/mod_pocketDim/helpers/dimHelper.java +++ /dev/null @@ -1,1364 +0,0 @@ -package StevenDimDoors.mod_pocketDim.helpers; -/** - * This class regulates all the operations involving the storage and manipulation of dimensions. It handles saving dim data, teleporting the player, and - * creating/registering new dimensions as well as loading old dimensions on startup - * @Return - */ - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.ObjectOutputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; -import java.util.Set; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.packet.Packet41EntityEffect; -import net.minecraft.network.packet.Packet43Experience; -import net.minecraft.network.packet.Packet9Respawn; -import net.minecraft.potion.PotionEffect; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.storage.ExtendedBlockStorage; -import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.ObjectSaveInputStream; -import StevenDimDoors.mod_pocketDim.PacketHandler; -import StevenDimDoors.mod_pocketDim.Point3D; -import StevenDimDoors.mod_pocketDim.SchematicLoader; -import StevenDimDoors.mod_pocketDim.TileEntityRift; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; -import StevenDimDoors.mod_pocketDim.world.LimboProvider; -import StevenDimDoors.mod_pocketDim.world.PocketProvider; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; - -public class dimHelper extends DimensionManager -{ - /** - * hashMap for the private pocket dimensions - */ - - public static HashMap privatePockets = new HashMap(); - /** - * HashMap containing all the dims registered with DimDoors, sorted by dim ID. loaded on startup - * @Return - */ - public static HashMap dimList=new HashMap(); - public static boolean isSaving=false; - - /** - * ArrayList containing any blocks in limbo that have been placed by the player. Cycled through in the common tick manager - * @Return - */ - public static ArrayList blocksToDecay = new ArrayList(); - - /** - * instance of the dimHelper - * @Return - */ - public static dimHelper instance = new dimHelper(); - - /** - * HashMap for temporary storage of Link Signature damage hash values. See itemLinkSignature for more details - * @Return - */ - public HashMap interDimLinkList= new HashMap(); - - /** - * ArrayList containing all link data not sorted for easy random access, used for random doors and for recreating rifts if they have a block placed over them. - * See the common tick manager and the Chaos door for details on usage - * @Return - */ - //public ArrayList linksForRendering =new ArrayList(); - Random rand= new Random(); - - public static final int DEFAULT_POCKET_SIZE = 39; - public static final int DEFAULT_POCKET_WALL_THICKNESS = 5; - public static final int MAX_WORLD_HEIGHT = 254; - - public int getDimDepth(int DimID) - { - if (dimList.containsKey(DimID)) - { - return dimList.get(DimID).depth; - } - else return 1; - } - - // GreyMaria: My god, what a mess. Here, let me clean it up a bit. - public Entity teleportEntity(World world, Entity entity, NewLinkData link) //this beautiful teleport method is based off of xCompWiz's teleport function. - { - WorldServer oldWorld = (WorldServer)world; - WorldServer newWorld; - EntityPlayerMP player = (entity instanceof EntityPlayerMP) ? (EntityPlayerMP)entity : null; - - /*// SPECIAL CASE: Is our link null? If so, we've likely come from Limbo. Ensure this is the case. - if(link == null) - { - if(world.provider.dimensionId == DDProperties.instance().LimboDimensionID) - { - link = new LinkData(0, 0, 0, 0); - // Find destination point. - } - }*/ - - - // Is something riding? Handle it first. - if(entity.riddenByEntity != null) - { - return this.teleportEntity(oldWorld,entity.riddenByEntity, link); - } - // Are we riding something? Dismount and tell the mount to go first. - Entity cart = entity.ridingEntity; - if (cart != null) - { - entity.mountEntity(null); - cart = teleportEntity(oldWorld, cart, link); - // We keep track of both so we can remount them on the other side. - } - - // Destination doesn't exist? We need to make it. - if(DimensionManager.getWorld(link.destDimID)==null) - { - DimensionManager.initDimension(link.destDimID); - } - - // Determine if our destination's in another realm. - boolean difDest = link.destDimID != link.locDimID; - if(difDest) - { - newWorld = DimensionManager.getWorld(link.destDimID); - } - else - { - newWorld=(WorldServer)oldWorld; - } - - // GreyMaria: What is this even accomplishing? We're doing the exact same thing at the end of this all. - // TODO Check to see if this is actually vital. - mod_pocketDim.teleporter.placeInPortal(entity, newWorld, link); - - if (difDest) // Are we moving our target to a new dimension? - { - if(player != null) // Are we working with a player? - { - // We need to do all this special stuff to move a player between dimensions. - - // Set the new dimension and inform the client that it's moving to a new world. - player.dimension = link.destDimID; - player.playerNetServerHandler.sendPacketToPlayer(new Packet9Respawn(player.dimension, (byte)player.worldObj.difficultySetting, newWorld.getWorldInfo().getTerrainType(), newWorld.getHeight(), player.theItemInWorldManager.getGameType())); - - // GreyMaria: Used the safe player entity remover. - // This should fix an apparently unreported bug where - // the last non-sleeping player leaves the Overworld - // for a pocket dimension, causing all sleeping players - // to remain asleep instead of progressing to day. - oldWorld.removePlayerEntityDangerously(player); - player.isDead=false; - - // Creates sanity by ensuring that we're only known to exist where we're supposed to be known to exist. - oldWorld.getPlayerManager().removePlayer(player); - newWorld.getPlayerManager().addPlayer(player); - - player.theItemInWorldManager.setWorld((WorldServer)newWorld); - - // Synchronize with the server so the client knows what time it is and what it's holding. - player.mcServer.getConfigurationManager().updateTimeAndWeatherForPlayer(player, (WorldServer)newWorld); - player.mcServer.getConfigurationManager().syncPlayerInventory(player); - for(Object potionEffect : player.getActivePotionEffects()) - { - PotionEffect effect = (PotionEffect)potionEffect; - player.playerNetServerHandler.sendPacketToPlayer(new Packet41EntityEffect(player.entityId, effect)); - } - - player.playerNetServerHandler.sendPacketToPlayer(new Packet43Experience(player.experience, player.experienceTotal, player.experienceLevel)); - } - - // Creates sanity by removing the entity from its old location's chunk entity list, if applicable. - int entX = entity.chunkCoordX; - int entZ = entity.chunkCoordZ; - if ((entity.addedToChunk) && (oldWorld.getChunkProvider().chunkExists(entX, entZ))) - { - oldWorld.getChunkFromChunkCoords(entX, entZ).removeEntity(entity); - oldWorld.getChunkFromChunkCoords(entX, entZ).isModified = true; - } - // Memory concerns. - oldWorld.releaseEntitySkin(entity); - - if (player == null) // Are we NOT working with a player? - { - NBTTagCompound entityNBT = new NBTTagCompound(); - entity.isDead = false; - entity.addEntityID(entityNBT); - entity.isDead = true; - entity = EntityList.createEntityFromNBT(entityNBT, newWorld); - - if (entity == null) - { // TODO FIXME IMPLEMENT NULL CHECKS THAT ACTUALLY DO SOMETHING. - /* - * shit ourselves in an organized fashion, preferably - * in a neat pile instead of all over our users' games - */ - } - - } - - // Finally, respawn the entity in its new home. - newWorld.spawnEntityInWorld(entity); - entity.setWorld(newWorld); - } - entity.worldObj.updateEntityWithOptionalForce(entity, false); - - // Hey, remember me? It's time to remount. - if (cart != null) - { - // Was there a player teleported? If there was, it's important that we update shit. - if (player != null) - { - entity.worldObj.updateEntityWithOptionalForce(entity, true); - } - entity.mountEntity(cart); - } - - // Did we teleport a player? Load the chunk for them. - if(player != null) - { - WorldServer.class.cast(newWorld).getChunkProvider().loadChunk(MathHelper.floor_double(entity.posX) >> 4, MathHelper.floor_double(entity.posZ) >> 4); - - // Tell Forge we're moving its players so everyone else knows. - // Let's try doing this down here in case this is what's killing NEI. - GameRegistry.onPlayerChangedDimension((EntityPlayer)entity); - - } - mod_pocketDim.teleporter.placeInPortal(entity, newWorld, link); - return entity; - } - - /** - * Primary function used to teleport the player using doors. Performs numerous null checks, and also generates the destination door/pocket if it has not done so already. - * Also ensures correct orientation relative to the door using the pocketTeleporter. - * @param world- world the player is currently in - * @param linkData- the link the player is using to teleport, sends the player to its dest information. - * @param player- the instance of the player to be teleported - * @param orientation- the orientation of the door used to teleport, determines player orientation and door placement on arrival - * @Return - */ - public void traverseDimDoor(World world,NewLinkData linkData, Entity entity) - { - DDProperties properties = DDProperties.instance(); - - if (world.isRemote) - { - return; - } - if (linkData != null) - { - int destinationID=linkData.destDimID; - - if(dimHelper.dimList.containsKey(destinationID) && dimHelper.dimList.containsKey(world.provider.dimensionId)) - { - this.generatePocket(linkData); - - if(mod_pocketDim.teleTimer==0||entity instanceof EntityPlayer) - { - mod_pocketDim.teleTimer=2+rand.nextInt(2); - } - else - { - return; - } - if(!world.isRemote) - { - entity = this.teleportEntity(world, entity, linkData); - } - entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); - - int playerXCoord=MathHelper.floor_double(entity.posX); - int playerYCoord=MathHelper.floor_double(entity.posY); - int playerZCoord=MathHelper.floor_double(entity.posZ); - - if(!entity.worldObj.isBlockOpaqueCube(playerXCoord, playerYCoord-1,playerZCoord )&&dimHelper.instance.getDimData(linkData.locDimID).isDimRandomRift&&!linkData.hasGennedDoor) - { - for(int count=0;count<20;count++) - { - if(!entity.worldObj.isAirBlock(playerXCoord, playerYCoord-2-count,playerZCoord)) - { - if(Block.blocksList[entity.worldObj.getBlockId(playerXCoord, playerYCoord-2-count,playerZCoord)].blockMaterial.isLiquid()) - { - entity.worldObj.setBlock(playerXCoord, playerYCoord-1, playerZCoord, properties.FabricBlockID); - break; - } - } - - if(entity.worldObj.isBlockOpaqueCube(playerXCoord, playerYCoord-1-count,playerZCoord)) - { - break; - } - if(count==19) - { - entity.worldObj.setBlock(playerXCoord, playerYCoord-1, playerZCoord, properties.FabricBlockID); - } - } - } - - this.generateDoor(world,linkData); - - - if(!entity.worldObj.isAirBlock(playerXCoord,playerYCoord+1,playerZCoord)) - { - if(Block.blocksList[entity.worldObj.getBlockId(playerXCoord,playerYCoord+1,playerZCoord)].isOpaqueCube() && - !mod_pocketDim.blockRift.isBlockImmune(entity.worldObj, playerXCoord+1,playerYCoord,playerZCoord)) - { - entity.worldObj.setBlock(playerXCoord,playerYCoord+1,playerZCoord,0); - } - } - if (!entity.worldObj.isAirBlock(playerXCoord,playerYCoord,playerZCoord)) - { - if(Block.blocksList[entity.worldObj.getBlockId(playerXCoord,playerYCoord,playerZCoord)].isOpaqueCube() && - !mod_pocketDim.blockRift.isBlockImmune(entity.worldObj, playerXCoord,playerYCoord,playerZCoord)) - { - entity.worldObj.setBlock(playerXCoord,playerYCoord,playerZCoord,0); - } - } - } - } - return; - } - - /** - * Creates a link at the location, pointing to the destination. Does NOT create a pair, so must be called twice. - * @param locationDimID - * @param destinationDimID - * @param locationXCoord - * @param locationYCoord - * @param locationZCoord - * @param destinationXCoord - * @param destinationYCoord - * @param destinationZCoord - - * @return - */ - public NewLinkData createLink( int locationDimID, int destinationDimID, int locationXCoord, int locationYCoord, int locationZCoord, int destinationXCoord, int destinationYCoord, int destinationZCoord) - { - if(this.getLinkDataFromCoords(locationXCoord, locationYCoord, locationZCoord, locationDimID)!=null) - { - return this.createLink(locationDimID, destinationDimID, locationXCoord, locationYCoord, locationZCoord, destinationXCoord, destinationYCoord, destinationZCoord, this.getLinkDataFromCoords(locationXCoord, locationYCoord, locationZCoord, locationDimID).linkOrientation); - } - else - { - return this.createLink(locationDimID, destinationDimID, locationXCoord, locationYCoord, locationZCoord, destinationXCoord, destinationYCoord, destinationZCoord, -10); - } - } - - - /** - * Creates a link at the location, pointing to the destination. Does NOT create a pair, so must be called twice. - * @param locationDimID - * @param destinationDimID - * @param locationXCoord - * @param locationYCoord - * @param locationZCoord - * @param destinationXCoord - * @param destinationYCoord - * @param destinationZCoord - * @param linkOrientation - * @return - */ - public NewLinkData createLink( int locationDimID, int destinationDimID, int locationXCoord, int locationYCoord, int locationZCoord, int destinationXCoord, int destinationYCoord, int destinationZCoord,int linkOrientation) - { - NewLinkData linkData =new NewLinkData( locationDimID, destinationDimID, locationXCoord, locationYCoord, locationZCoord, destinationXCoord, destinationYCoord ,destinationZCoord,false,linkOrientation); - return this.createLink(linkData); - } - - public NewLinkData createLink(NewLinkData link) - { - DDProperties properties = DDProperties.instance(); - - if(!dimHelper.dimList.containsKey(link.locDimID)) - { - DimData locationDimData= new DimData(link.locDimID, false, 0, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord); - dimHelper.dimList.put(link.locDimID, locationDimData); - link.isLocPocket=false; - } - if(!dimList.containsKey(link.destDimID)) - { - dimHelper.dimList.put(link.destDimID, new DimData(link.destDimID, false, 0, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord)); - } - DimData locationDimData= dimHelper.instance.getDimData(link.locDimID); - link.isLocPocket=locationDimData.isPocket; - locationDimData.addLinkToDim(link); - - World world = dimHelper.getWorld(link.locDimID); - if (world != null) - { - if (!mod_pocketDim.blockRift.isBlockImmune(world, link.locXCoord, link.locYCoord, link.locZCoord)) - { - world.setBlock(link.locXCoord, link.locYCoord, link.locZCoord, properties.RiftBlockID); - } - } - //Notifies other players that a link has been created. - if(FMLCommonHandler.instance().getEffectiveSide()==Side.SERVER) - { - PacketHandler.onLinkCreatedPacket(link); - } - return link; - } - - public int getDestOrientation(NewLinkData link) - { - if(link !=null) - { - NewLinkData destLink = this.getLinkDataFromCoords(link.destXCoord, link.destYCoord, link.destZCoord, link.destDimID); - if(destLink!=null) - { - return destLink.linkOrientation; - } - else - { - //System.out.println("Cant find destination link"); - return 0; - } - } - else - { - // System.out.println("sending link is null"); - return 0; - } - } - - public void removeLink(NewLinkData link) - { - this.removeLink(link.locDimID, link.locXCoord, link.locYCoord, link.locZCoord); - } - - /** - * properly deletes a link at the given coordinates. used by the rift remover. Also notifies clients of change. - * @param locationDimID - * @param locationXCoord - * @param locationYCoord - * @param locationZCoord - */ - public void removeLink( int locationDimID, int locationXCoord, int locationYCoord, int locationZCoord) - { - if(!dimHelper.dimList.containsKey(locationDimID)) - { - DimData locationDimData= new DimData(locationDimID, false, 0, locationDimID,locationXCoord,locationYCoord,locationZCoord); - dimHelper.dimList.put(locationDimID, locationDimData); - } - NewLinkData link = this.getLinkDataFromCoords(locationXCoord, locationYCoord, locationZCoord, locationDimID); - dimHelper.instance.getDimData(locationDimID).removeLinkAtCoords(link); - //updates clients that a rift has been removed - if(FMLCommonHandler.instance().getEffectiveSide()==Side.SERVER) - { - PacketHandler.onLinkRemovedPacket(link); - this.save(); - } - } - public NewLinkData findNearestRift(World world, int x, int y, int z, int range) - { - return dimHelper.instance.getDimData(world).findNearestRift(world, range, x, y, z); - } - /** - * generates a door based on what door was used to teleport. Only funtions once per linking. - * @param world- door - * @param incLink - */ - public void generateDoor(World world, NewLinkData incLink) - { - int locX = incLink.locXCoord; - int locY = incLink.locYCoord; - int locZ = incLink.locZCoord; - - int destX = incLink.destXCoord; - int destY = incLink.destYCoord; - int destZ = incLink.destZCoord; - - DDProperties properties = DDProperties.instance(); - - if(!incLink.hasGennedDoor) - { - int destinationID = incLink.destDimID; - - int id =world.getBlockId(locX, locY, locZ); - if(id==properties.WarpDoorID||id==properties.DimensionalDoorID||id==properties.TransientDoorID) - { - int doorTypeToPlace=id; - if(DimensionManager.getWorld(destinationID)==null) - { - DimensionManager.initDimension(destinationID); - } - NewLinkData destLink = this.getLinkDataFromCoords(destX, destY, destZ, destinationID); - int destOrientation = 0; - if(destLink!=null) - { - destOrientation = destLink.linkOrientation; - destLink.hasGennedDoor=true; - } - int blockToReplace= DimensionManager.getWorld(destinationID).getBlockId(destX, destY, destZ); - if(blockToReplace!=properties.DimensionalDoorID&&blockToReplace!=properties.WarpDoorID&&blockToReplace != properties.TransientDoorID) - { - DimensionManager.getWorld(destinationID).setBlock(destX, destY-1, destZ, doorTypeToPlace,destOrientation,2); - DimensionManager.getWorld(destinationID).setBlock(destX, destY, destZ, doorTypeToPlace,8,2); - } - incLink.hasGennedDoor=true; - } - } - } - - - - - /** - * Generates the black pocket out of fabric of reality blocks. Placement of the pocket is based off of the orignial doors orientation. Kind of a clunky method, - * but is necessary to maintain a one to one relationship with the overworld. Is called every teleport, but checks if the dim has been filled first and is a pocket . - * Also responsible for generation the random dungeons. - * @param world- id of the world TO BE FILLED - * @param x - * @param y - * @param z - * @param orientation - * @return - */ - public void generatePocket(NewLinkData incomingLink) - { - DDProperties properties = DDProperties.instance(); - try - { - if (DimensionManager.getWorld(incomingLink.destDimID) == null) - { - DimensionManager.initDimension(incomingLink.destDimID); - } - if (DimensionManager.getWorld(incomingLink.destDimID).provider == null) - { - DimensionManager.initDimension(incomingLink.destDimID); - } - } - catch(Exception E) - { - E.printStackTrace(); - return; - } - // World world = this.getWorld(incomingLink.destDimID); - DimData data = dimHelper.instance.getDimData(incomingLink.destDimID); - - if(!data.hasBeenFilled&&data.isPocket&&!data.isDimRandomRift) - { - data.hasBeenFilled=true; - //System.out.println("genning pocket"); - int x = incomingLink.destXCoord; - int y = incomingLink.destYCoord; - int z = incomingLink.destZCoord; - int orientation= (incomingLink.linkOrientation); - - int depth= this.getDimDepth(incomingLink.locDimID); - //x=x*depth; - //y=y*depth; - //z=z*depth; - y=y+13; - - - if(orientation==0) - { - x=x+15; - //this.getWorld(incomingLink.destDimID).provider.setSpawnPoint(x-1, y, z); - - } - else if(orientation==1) - { - z=z+15; - //this.getWorld(incomingLink.destDimID).provider.setSpawnPoint(x, y, z-1); - - } - else if(orientation==2) - { - x=x-15; - //this.getWorld(incomingLink.destDimID).provider.setSpawnPoint(x+1, y, z); - - } - else if(orientation==3) - { - z=z-15; - //this.getWorld(incomingLink.destDimID).provider.setSpawnPoint(x, y, z+1); - - } - int searchRadius=19; - - if(!DimensionManager.getWorld(incomingLink.destDimID).isRemote) - { - int xCount=-searchRadius; - int yCount=-searchRadius; - int zCount=-searchRadius; - - while (xCount<=searchRadius) - { - while(yCount<=searchRadius) - { - while(zCount<=searchRadius) - { - if((Math.abs(xCount)>=15||Math.abs(yCount)>=15||Math.abs(zCount)>=15)&&DimensionManager.getWorld(incomingLink.destDimID).isAirBlock( x+xCount, y+yCount, z+zCount)&&((yCount+y)>0)) - { - if(Math.abs(xCount)>=19||Math.abs(yCount)>=19||Math.abs(zCount)>=19) - { - dimHelper.setBlockDirectly(DimensionManager.getWorld(incomingLink.destDimID), x+xCount, y+yCount, z+zCount,properties.PermaFabricBlockID,0); - } - else - { - dimHelper.setBlockDirectly(DimensionManager.getWorld(incomingLink.destDimID), x+xCount, y+yCount, z+zCount,properties.FabricBlockID,0); - if(properties.TNFREAKINGT_Enabled) - { - if((Math.abs(xCount)>=16||Math.abs(yCount)>=16||Math.abs(zCount)>=16) && rand.nextInt(properties.NonTntWeight + 1) == 0) - { - DimensionManager.getWorld(incomingLink.destDimID).setBlock( x+xCount, y+yCount, z+zCount,Block.tnt.blockID); - } - } - } - } - zCount++; - } - zCount=-searchRadius; - yCount++; - } - yCount=-searchRadius; - xCount++; - } - } - } - else if (!data.hasBeenFilled && data.isPocket && data.isDimRandomRift) - { - SchematicLoader.generateDungeonPocket(incomingLink, properties); - data.hasBeenFilled=true; - } - } - - /** - * simple method called on startup to register all dims saved in the dim list. Only tries to register pocket dims, though. Also calls load() - * @return - */ - public void initPockets() - { - DDProperties properties = DDProperties.instance(); - mod_pocketDim.hasInitDims=true; - this.load(); - if(!dimHelper.dimList.isEmpty()) - { - Set allDimIds=dimList.keySet(); - //FIXME: ...Wat. Why aren't we using a foreach loop here instead of manipulating an explicit iterator? ;-; ~SenseiKiwi - Iterator itr = allDimIds.iterator(); - while(itr.hasNext()) - { - DimData dimData = (DimData) dimList.get(itr.next()); - if(dimData.isPocket) - { - try - { - DimensionManager.getNextFreeDimId(); - registerDimension(dimData.dimID,properties.PocketProviderID); - } - catch (Exception e) - { - if(dimData.isPocket) - { - System.out.println("Warning- could not register dim "+dimData.depth+" . Probably caused by a version update/save data corruption/other mods. "); - } - else - { - e.printStackTrace(); - } - } - } - } - } - } - - public boolean resetPocket(DimData dimData) - { - if (!dimData.isPocket || getWorld(dimData.dimID) != null) - { - return false; - } - File save = new File(getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimData.dimID); - DeleteFolder.deleteFolder(save); - dimData.hasBeenFilled = false; - dimData.hasDoor = false; - for(NewLinkData link : dimData.getLinksInDim()) - { - link.hasGennedDoor = false; - NewLinkData linkOut = this.getLinkDataFromCoords(link.destXCoord, link.destYCoord, link.destZCoord, link.destDimID); - if (linkOut != null) - { - linkOut.hasGennedDoor = false; - } - } - return true; - } - - public boolean pruneDimension(DimData dimData, boolean deleteFolder) - { - - //TODO: All the logic for checking that this is an isolated pocket should be moved in here. - if (!dimData.isPocket || getWorld(dimData.dimID) != null)//Checks to see if the pocket is loaded or isnt actually a pocket. - { - return false; - } - dimList.remove(dimData.dimID); - if (deleteFolder) - { - File save = new File(getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimData.dimID); - DeleteFolder.deleteFolder(save); - } - return true; - } - - /** - * method called when the client disconnects/server stops to unregister dims. - * @Return - */ - public void unregsisterDims() - { - - if(!dimHelper.dimList.isEmpty()) - { - Set allDimIds=dimList.keySet(); - Iterator itr =allDimIds.iterator(); - while(itr.hasNext()) - { - DimData dimData = (DimData) dimList.get(itr.next()); - if(dimData.isPocket) - { - try - { - DimensionManager.unregisterDimension(dimData.dimID); - } - catch(Exception e) - { - System.out.println("Dim-"+String.valueOf(dimData.dimID)+"is already unregistered, ok? Enough with it already."); - } - // initDimension(dimData.dimID); - } - } - } - } - - /** - * Used to associate a damage value on a Rift Signature with a link pair. See LinkSignature for details. - * @return - */ - public int createUniqueInterDimLinkKey() - { - int linkKey; - Random rand= new Random(); - do - { - linkKey=rand.nextInt(30000); - } - while(this.interDimLinkList.containsKey(linkKey)); - return linkKey; - } - - /** - * Method used to create and register a new pocket dimension. Called on door placement and rift generation. It does NOT actually generate the structure of the dim, just - * registers it with the dimension manager and adds the necessary links and dim info to the dimlist/linklists. - * Also registers existing dims with the dimList, so link data can be stored for them. - * - * Handles the randomization associated with depth as well, going far enough causes the next dims exit link to be randomized. - * - * @param world- World currently occupied, the parent of the pocket dim to be created. - * @param x - * @param y - * @param z - * @param isGoingDown - * @param isRandomRift - * @param orientation- determines the orientation of the entrance link to this dim. Should be the metaData of the door occupying the rift. -1 if no door. - * @return - */ - public NewLinkData createPocket(NewLinkData link , boolean isGoingDown, boolean isRandomRift) - { - DDProperties properties = DDProperties.instance(); - if(dimHelper.getWorld(0)==null) - { - return link; - } - if (dimHelper.getWorld(link.locDimID) == null) - { - dimHelper.initDimension(link.locDimID); - } - int dimensionID; - int depth = this.getDimDepth(link.locDimID); - dimensionID = getNextFreeDimId(); - registerDimension(dimensionID, properties.PocketProviderID); - DimData locationDimData; - DimData destDimData; - - - - if(dimHelper.dimList.containsKey(link.locDimID)&&!DimensionManager.getWorld(link.locDimID).isRemote) //checks to see if dim is already registered. If not, it creates a DimData entry for it later - { - //randomizes exit if deep enough - locationDimData= dimList.get(DimensionManager.getWorld(link.locDimID).provider.dimensionId); - - if(depth>5) - { - if(depth>=12) - { - depth=11; - } - if(rand.nextInt(13-depth)==0) - { - NewLinkData link1=getRandomLinkData(false); - } - } - if(locationDimData.isPocket) //determines the qualites of the pocket dim being created, based on parent dim. - { - if(isGoingDown) - { - destDimData= new DimData(dimensionID, true, locationDimData.depth+1, locationDimData.exitDimLink); - } - else - { - destDimData= new DimData(dimensionID, true, locationDimData.depth-1, locationDimData.exitDimLink); - } - } - else - { - destDimData= new DimData(dimensionID, true, 1, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord); - } - - } - else - { - locationDimData= new DimData(link.locDimID, false, 0, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord); - destDimData= new DimData(dimensionID, true, 1, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord); - } - destDimData.isDimRandomRift=isRandomRift; - dimHelper.dimList.put(DimensionManager.getWorld(link.locDimID).provider.dimensionId, locationDimData); - dimHelper.dimList.put(dimensionID, destDimData); - - if(FMLCommonHandler.instance().getEffectiveSide()==Side.SERVER)//sends packet to clients notifying them that a new dim has been created. - { - PacketHandler.onDimCreatedPacket(destDimData); - } - link = this.createLink(DimensionManager.getWorld(link.locDimID).provider.dimensionId,dimensionID,link.locXCoord,link.locYCoord,link.locZCoord, link.destXCoord,constrainPocketY(link.destYCoord),link.destZCoord,link.linkOrientation); //creates and registers the two rifts that link the parent and pocket dim. - this.createLink(dimensionID,DimensionManager.getWorld(link.locDimID).provider.dimensionId, link.destXCoord,constrainPocketY(link.destYCoord),link.destZCoord, link.locXCoord,link.locYCoord,link.locZCoord, BlockRotator.transformMetadata(link.linkOrientation, 2, Block.doorWood.blockID)); - return link; - } - - public static int constrainPocketY(int entranceDoorYPos) - { - - if(entranceDoorYPos+DEFAULT_POCKET_SIZE-DEFAULT_POCKET_WALL_THICKNESS>= MAX_WORLD_HEIGHT) - { - return entranceDoorYPos-DEFAULT_POCKET_SIZE+DEFAULT_POCKET_WALL_THICKNESS; - } - if(entranceDoorYPos-1-DEFAULT_POCKET_WALL_THICKNESS<=0) - { - return entranceDoorYPos+DEFAULT_POCKET_WALL_THICKNESS; - - } - else return entranceDoorYPos; - - } - /** - * function that saves all dim data in a hashMap. Calling too often can cause Concurrent modification exceptions, so be careful. - * @return - */ - //TODO change from saving serialized objects to just saving data for compatabilies sake. - //TODO If saving is multithreaded as the concurrent modification exception implies, you should be synchronizing access. ~SenseiKiwi - public void save() - { - if(dimHelper.isSaving) return; - World world = DimensionManager.getWorld(0); - if(world==null || world.isRemote) return; - if(DimensionManager.getCurrentSaveRootDirectory()!=null) - { - //System.out.println("saving"); - - dimHelper.isSaving=true; - HashMap comboSave=new HashMap(); - comboSave.put("dimList", dimHelper.dimList); - comboSave.put("interDimLinkList", this.interDimLinkList); - comboSave.put("blocksToDecay", dimHelper.blocksToDecay); - - - - FileOutputStream saveFile = null; - try - { - //World world=FMLCommonHandler.instance().getMinecraftServerInstance().worldServers[0]; - String saveFileName=DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataTEMP"; - saveFile = new FileOutputStream(saveFileName); - - ObjectOutputStream save = new ObjectOutputStream(saveFile); - save.writeObject(comboSave); - save.close(); - saveFile.close(); - - if(new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataOLD").exists()) - { - new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataOLD").delete(); - } - new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsData").renameTo(new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataOLD")); - - new File(saveFileName).renameTo( new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsData")); - } - catch(Exception e) - { - e.printStackTrace(); - System.out.println("Could not save data-- SEVERE"); - } - - - - - dimHelper.isSaving=false; - } - } - - /** - * loads the dim data from the saved hashMap. Also handles compatabilty with old saves, see OldSaveHandler - * @return - */ - //TODO change to loading vars instead of objects - @SuppressWarnings("unchecked") - public void load() - { - boolean firstRun=false; - System.out.println("Loading DimDoors data"); - FileInputStream saveFile = null; - - if(!DimensionManager.getWorld(0).isRemote&&DimensionManager.getCurrentSaveRootDirectory()!=null) - { - - try - { - File dataStore = new File( DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsData"); - - if(!dataStore.exists()) - { - - - if(!new File( DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataOLD").exists()) - { - firstRun=true; - } - } - - - - - - saveFile = new FileInputStream(dataStore); - ObjectSaveInputStream save = new ObjectSaveInputStream(saveFile); - HashMap comboSave =((HashMap) save.readObject()); - - try - { - this.interDimLinkList = (HashMap) comboSave.get("interDimLinkList"); - } - catch(Exception e) - { - System.out.println("Could not load Link Signature list. Link Sig items will loose restored locations."); - } - - try - { - dimHelper.dimList = (HashMap) comboSave.get("dimList"); - } - catch(Exception e) - { - System.out.println("Could not load pocket dim list. Saves probably lost, but repairable. Move the files from indivual pocket dim files to active ones. See MC thread for details."); - } - - - - try - { - dimHelper.blocksToDecay= (ArrayList) comboSave.get("blocksToDecay"); - } - catch(Exception e) - { - System.out.println("Could not load list of blocks to decay in Limbo. Probably because you updated versions, in which case this is normal. "); - - } - save.close(); - saveFile.close(); - - - - } - catch(Exception e4) - { - try - { - if(!firstRun) - { - System.out.println("Save data damaged, trying backup..."); - } - World world=FMLCommonHandler.instance().getMinecraftServerInstance().worldServers[0]; - File dataStore =new File( world.getSaveHandler().getMapFileFromName("idcounts").getParentFile().getParent()+"/DimensionalDoorsDataOLD"); - - - saveFile = new FileInputStream(dataStore); - ObjectSaveInputStream save = new ObjectSaveInputStream(saveFile); - HashMap comboSave =((HashMap)save.readObject()); - - try - { - this.interDimLinkList=(HashMap) comboSave.get("interDimLinkList"); - } - catch(Exception e) - { - System.out.println("Could not load Link Signature list. Link Sig items will loose restored locations."); - } - - try - { - dimHelper.dimList=(HashMap) comboSave.get("dimList"); - } - catch(Exception e) - { - System.out.println("Could not load pocket dim list. Saves probably lost, but repairable. Move the files from indivual pocket dim files to active ones. See MC thread for details."); - } - - - - try - { - dimHelper.blocksToDecay=(ArrayList) comboSave.get("blocksToDecay"); - } - catch(Exception e) - { - System.out.println("Could not load list of blocks to decay in Limbo. Probably because you updated versions, in which case this is normal. "); - - } - save.close(); - saveFile.close(); - - } - catch(Exception e2) - { - if(!firstRun) - { - e2.printStackTrace(); - System.out.println("Could not read data-- SEVERE"); - } - - - - - } - - - - } - } - - } - - - - public NewLinkData getRandomLinkData(boolean allowInPocket) - { - boolean foundRandomDest=false; - int i=0; - int size = dimHelper.dimList.size(); - - while (!foundRandomDest&&size>0&&i<100) - { - i++; - DimData dimData; - ArrayList linksInDim = new ArrayList(); - for(size--;size>0;) - { - dimData = dimHelper.instance.getDimData((Integer)dimList.keySet().toArray()[rand.nextInt(dimList.keySet().size())]); - if(dimData==null) - { - break; - } - linksInDim = dimData.getLinksInDim(); - if(!linksInDim.isEmpty()) - { - break; - } - } - - if(linksInDim.isEmpty()) - { - break; - } - - NewLinkData link1 = (NewLinkData) linksInDim.get(rand.nextInt(linksInDim.size())); - - if(link1!=null) - { - - if(!link1.isLocPocket||allowInPocket) - { - foundRandomDest=true; - return link1; - } - } - } - - return null; - - } - - /** - * Gets a link at the destination of the link provided. Returns null if none exists. - * @param link - * @return - */ - public NewLinkData getLinkDataAtDestination(NewLinkData link) - { - return this.getLinkDataFromCoords(link.destXCoord, link.destYCoord, link.destZCoord, link.destDimID); - } - /** - * Moves the location of the link passed in to the provided coords. Does not change the links destination coords. - * The boolean flag determines whether or not to update other links that point to this link- true causes all links that pointed to this link to be updated - * to point to the new link location. - * - * Return true if there was an actual link to be moved. - * - * @param link - * @param x - * @param y - * @param z - * @param dimID - * @param updateLinksPointingHere - * @return - */ - public boolean moveLinkDataLocation(NewLinkData link, int x,int y, int z, int dimID, boolean updateLinksPointingHere) - { - NewLinkData linkToMove = this.getLinkDataFromCoords(link.locXCoord, link.locYCoord, link.locZCoord, link.locDimID); - if(linkToMove!=null) - { - int oldX = linkToMove.locXCoord; - int oldY = linkToMove.locYCoord; - int oldZ = linkToMove.locZCoord; - int oldDimID = linkToMove.locDimID; - - if(updateLinksPointingHere) - { - ArrayList incomingLinks = new ArrayList(); - for(DimData dimData : dimHelper.dimList.values()) - { - for(NewLinkData allLink : dimData.getLinksInDim()) - { - if(this.getLinkDataAtDestination(allLink)==linkToMove) - { - this.moveLinkDataDestination(allLink, x, y, z, dimID, false); - } - } - } - } - this.createLink(new NewLinkData(dimID,linkToMove.destDimID,x,y,z,linkToMove.destXCoord,linkToMove.destYCoord,linkToMove.destZCoord,linkToMove.isLocPocket,linkToMove.linkOrientation)); - - if(this.getLinkDataFromCoords(oldX,oldY,oldZ,oldDimID)!=null) - { - this.removeLink(this.getLinkDataFromCoords(oldX,oldY,oldZ,oldDimID)); - } - - return true; - } - return false; - } - /** - * Changes the destination coords of the link passed in if it exists to the provided coords. - * @param link - * @param x - * @param y - * @param z - * @param dimID - * @param updateLinksAtDestination - * @return - */ - public boolean moveLinkDataDestination(NewLinkData link, int x, int y, int z, int dimID, boolean updateLinksAtDestination) - { - NewLinkData linkToMove = this.getLinkDataFromCoords(link.locXCoord, link.locYCoord, link.locZCoord, link.locDimID); - if(linkToMove!=null) - { - if(updateLinksAtDestination) - { - NewLinkData linkAtDestination = this.getLinkDataAtDestination(linkToMove); - if(linkAtDestination!=null) - { - this.moveLinkDataLocation(linkAtDestination, x, y, z, dimID, false); - } - } - linkToMove.destDimID=dimID; - linkToMove.destXCoord=x; - linkToMove.destYCoord=y; - linkToMove.destZCoord=z; - this.createLink(linkToMove); - NewLinkData testLink = this.getLinkDataFromCoords(link.locXCoord, link.locYCoord, link.locZCoord, link.locDimID); - - return true; - } - return false; - } - - /** - * gets a link based on coords and a world object - * @param x - * @param y - * @param z - * @param par1World - * @return - */ - public NewLinkData getLinkDataFromCoords(int x, int y, int z, World par1World) - { - return this.getLinkDataFromCoords(x, y, z, par1World.provider.dimensionId); - } - /** - * gets a link based on coords and a world ID - * @param x - * @param y - * @param z - * @param worldID - * @return - */ - public NewLinkData getLinkDataFromCoords(int x, int y, int z, int worldID) - { - if(dimHelper.dimList.containsKey(worldID)) - { - DimData dimData=dimHelper.instance.getDimData(worldID); - - return dimData.findLinkAtCoords(x, y, z); - - } - - return null; - } - /** - * function called by rift tile entities and the rift remover to find and spread between rifts. Does not actually de-register the rift data, see deleteRift for that. - * @param world - * @param x - * @param y - * @param z - * @param range - * @param player - * @param item - * @return - */ - public static boolean removeRift(World world, int x, int y, int z, int range, EntityPlayer player, ItemStack item) - { - DDProperties properties = DDProperties.instance(); - - NewLinkData nearest=null; - float distance=range+1; - int i=-range; - int j=-range; - int k=-range; - - while (i>4; - int cZ=z >>4; - int cY=y >>4; - Chunk chunk; - int chunkX=(x % 16)< 0 ? ((x) % 16)+16 : ((x) % 16); - int chunkY=y; - int chunkZ=((z) % 16)< 0 ? ((z) % 16)+16 : ((z) % 16); - - - // this.chunk=new EmptyChunk(world,cX, cZ); - try - { - chunk=world.getChunkFromChunkCoords(cX, cZ); - if (chunk.getBlockStorageArray()[cY] == null) { - chunk.getBlockStorageArray()[cY] = new ExtendedBlockStorage(cY << 4, !world.provider.hasNoSky); - } - - - chunk.getBlockStorageArray()[cY].setExtBlockID(chunkX, (y) & 15, chunkZ, id); - chunk.getBlockStorageArray()[cY].setExtBlockMetadata(chunkX, (y) & 15, chunkZ, metadata); - } - catch(Exception e) - { - e.printStackTrace(); - } - - } - - public void addDimData(DimData dimData) - { - dimHelper.dimList.put(dimData.dimID, dimData); - } - - public void createDimData(World world) - { - dimHelper.dimList.put(world.provider.dimensionId, new DimData(world.provider.dimensionId, false, 0,0,world.provider.getSpawnPoint().posX,world.provider.getSpawnPoint().posY,world.provider.getSpawnPoint().posZ)); - } - - public DimData getDimData(World world) - { - return dimHelper.instance.getDimData(world.provider.dimensionId); - } - - public DimData getDimData(int dimID) - { - return dimHelper.dimList.get(dimID); - } -} diff --git a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java index 3f9a4f5..a083c03 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java @@ -1,41 +1,20 @@ package StevenDimDoors.mod_pocketDim.helpers; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; - public class yCoordHelper { private static final int MAXIMUM_UNCOVERED_Y = 245; - public static int getFirstUncovered(NewLinkData pointerLink) - { - return yCoordHelper.getFirstUncovered( - pointerLink.destDimID, - pointerLink.destXCoord, - pointerLink.destYCoord, - pointerLink.destZCoord); - } - - public static int getFirstUncovered(int worldID, int x, int yStart, int z) - { return getFirstUncovered(worldID, x, yStart, z, false); } - - public static int getFirstUncovered(int worldID, int x, int yStart, int z, boolean fromTop) - { - if (dimHelper.getWorld(worldID) == null || - dimHelper.getWorld(worldID).provider == null) - { - dimHelper.initDimension(worldID); - } - - return yCoordHelper.getFirstUncovered(dimHelper.getWorld(worldID), x, yStart, z, fromTop); - } + private yCoordHelper() { } public static int getFirstUncovered(World world, int x, int yStart, int z) - { return getFirstUncovered(world, x, yStart, z, false); } + { + return getFirstUncovered(world, x, yStart, z, false); + } public static int getFirstUncovered(World world, int x, int yStart, int z, boolean fromTop) { @@ -46,18 +25,20 @@ public class yCoordHelper int height = MAXIMUM_UNCOVERED_Y; //world.getHeight(); int y; - if(!fromTop) + if (!fromTop) { boolean covered = true; for (y = yStart; y < height && covered; y++) { - covered = IsCoveredBlock(chunk, localX, y - 1, localZ) || IsCoveredBlock(chunk, localX, y, localZ); + covered = isCoveredBlock(chunk, localX, y - 1, localZ) || isCoveredBlock(chunk, localX, y, localZ); } - } else { + } + else + { boolean covered = false; for (y = MAXIMUM_UNCOVERED_Y; y > 1 && !covered; y--) { - covered = IsCoveredBlock(chunk, localX, y - 1, localZ); + covered = isCoveredBlock(chunk, localX, y - 1, localZ); } if (!covered) y = 63; y++; @@ -66,7 +47,7 @@ public class yCoordHelper return y; } - public static boolean IsCoveredBlock(Chunk chunk, int localX, int y, int localZ) + public static boolean isCoveredBlock(Chunk chunk, int localX, int y, int localZ) { int blockID; Block block; @@ -86,4 +67,25 @@ public class yCoordHelper material = block.blockMaterial; return (material.isLiquid() || !material.isReplaceable()); } + + public static int adjustDestinationY(int y, int worldHeight, int entranceY, int dungeonHeight) + { + //The goal here is to guarantee that the dungeon fits within the vertical bounds + //of the world while shifting it as little as possible. + int destY = y; + + //Is the top of the dungeon going to be at Y < worldHeight? + int pocketTop = (dungeonHeight - 1) + destY - entranceY; + if (pocketTop >= worldHeight) + { + destY = (worldHeight - 1) - (dungeonHeight - 1) + entranceY; + } + + //Is the bottom of the dungeon at Y >= 0? + if (destY < entranceY) + { + destY = entranceY; + } + return destY; + } } diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index 2ca96a7..f8340f5 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -23,7 +23,7 @@ import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -188,16 +188,16 @@ public class ItemRiftBlade extends ItemSword if(this.getMaxItemUseDuration(par1ItemStack)-par4>12&&!par2World.isRemote&&itemDimDoor.canPlace(par2World, x, y, z, rotation)) { - if(dimHelper.instance.getDimData(par2World.provider.dimensionId)!=null) + if(PocketManager.instance.getDimData(par2World.provider.dimensionId)!=null) { - if(dimHelper.instance.getDimData(par2World.provider.dimensionId).depth==0) + if(PocketManager.instance.getDimData(par2World.provider.dimensionId).depth==0) { - dimHelper.instance.createPocket(link,true, false); + PocketManager.instance.createPocket(link,true, false); } } else { - dimHelper.instance.createPocket(link,true, false); + PocketManager.instance.createPocket(link,true, false); } par3EntityPlayer.worldObj.playSoundAtEntity(par3EntityPlayer,"mods.DimDoors.sfx.riftDoor", (float) .6, 1); itemDimDoor.placeDoorBlock(par2World, x, y-1, z, rotation, mod_pocketDim.transientDoor); @@ -212,7 +212,7 @@ public class ItemRiftBlade extends ItemSword { if(par2World.getBlockId(hit.blockX, hit.blockY, hit.blockZ)==properties.RiftBlockID) { - NewLinkData link = dimHelper.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); + NewLinkData link = PocketManager.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); if(link!=null) { @@ -229,7 +229,7 @@ public class ItemRiftBlade extends ItemSword { int var12 = MathHelper.floor_double((double)((par3EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; - if (!itemDimDoor.canPlace(par2World, par4, par5, par6, var12)||!itemDimDoor.canPlace(par2World, par4, par5-1, par6, var12)||dimHelper.instance.getLinkDataFromCoords(par4, par5, par6, par2World)==null) + if (!itemDimDoor.canPlace(par2World, par4, par5, par6, var12)||!itemDimDoor.canPlace(par2World, par4, par5-1, par6, var12)||PocketManager.instance.getLinkDataFromCoords(par4, par5, par6, par2World)==null) { return par1ItemStack; } @@ -342,7 +342,7 @@ public class ItemRiftBlade extends ItemSword { int var12 = MathHelper.floor_double((double)((par2EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; - if (!itemDimDoor.canPlace(par3World, par4, par5, par6, var12)||dimHelper.instance.getLinkDataFromCoords(par4, par5+1, par6, par3World)==null) + if (!itemDimDoor.canPlace(par3World, par4, par5, par6, var12)||PocketManager.instance.getLinkDataFromCoords(par4, par5+1, par6, par3World)==null) { return false; } diff --git a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java index 504f66c..5933e56 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java @@ -5,7 +5,7 @@ import java.util.List; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -83,11 +83,11 @@ public class ItemStabilizedRiftSignature extends itemLinkSignature } if(hasEnder&&!par3World.isRemote) { - if(dimHelper.instance.getLinkDataFromCoords(linkCoords[0], linkCoords[1], linkCoords[2], par3World)==null) + if(PocketManager.instance.getLinkDataFromCoords(linkCoords[0], linkCoords[1], linkCoords[2], par3World)==null) { - dimHelper.instance.createLink(linkCoords[3], par3World.provider.dimensionId, linkCoords[0], linkCoords[1], linkCoords[2],par4, par5+offset, par6); + PocketManager.instance.createLink(linkCoords[3], par3World.provider.dimensionId, linkCoords[0], linkCoords[1], linkCoords[2],par4, par5+offset, par6); } - dimHelper.instance.createLink(par3World.provider.dimensionId, linkCoords[3], par4, par5+offset, par6, linkCoords[0], linkCoords[1], linkCoords[2]); + PocketManager.instance.createLink(par3World.provider.dimensionId, linkCoords[3], par4, par5+offset, par6, linkCoords[0], linkCoords[1], linkCoords[2]); par2EntityPlayer.worldObj.playSoundAtEntity(par2EntityPlayer,"mods.DimDoors.sfx.riftEnd", (float) .6, 1); par2EntityPlayer.sendChatToPlayer("Rift Created"); @@ -105,7 +105,7 @@ public class ItemStabilizedRiftSignature extends itemLinkSignature offset = 1; } //otherwise, it creates the first half of the link. Next click will complete it. - key= dimHelper.instance.createUniqueInterDimLinkKey(); + key= PocketManager.instance.createUniqueInterDimLinkKey(); this.writeToNBT(par1ItemStack, par4, par5+offset, par6,par3World.provider.dimensionId); par2EntityPlayer.worldObj.playSoundAtEntity(par2EntityPlayer,"mods.DimDoors.sfx.riftStart", (float) .6, 1); @@ -126,7 +126,7 @@ public class ItemStabilizedRiftSignature extends itemLinkSignature if(par1ItemStack.stackTagCompound.getBoolean("isCreated")) { Integer[] coords = this.readFromNBT(par1ItemStack); - par3List.add(String.valueOf("Leads to dim "+coords[3] +" with depth "+dimHelper.instance.getDimDepth(dimHelper.instance.getDimDepth(coords[3])))); + par3List.add(String.valueOf("Leads to dim "+coords[3] +" with depth "+PocketManager.instance.getDimDepth(PocketManager.instance.getDimDepth(coords[3])))); par3List.add("at x="+coords[0]+" y="+coords[1]+" z="+coords[2]); } } diff --git a/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java b/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java index b5a741b..3eb39d9 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java @@ -6,7 +6,7 @@ import StevenDimDoors.mod_pocketDim.SchematicLoader; import StevenDimDoors.mod_pocketDim.Spells; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler; import StevenDimDoors.mod_pocketDimClient.ClientTickHandler; @@ -55,13 +55,13 @@ public class ItemStableFabric extends Item Block block = Block.blocksList[par3World.getBlockId(par4, par5, par6)]; - if(dimHelper.dimList.containsKey(par3World.provider.dimensionId)) + if(PocketManager.dimList.containsKey(par3World.provider.dimensionId)) { - if(dimHelper.instance.getDimData(par3World.provider.dimensionId).isPocket) + if(PocketManager.instance.getDimData(par3World.provider.dimensionId).isPocket) { - if(dimHelper.instance.getDimData(par3World.provider.dimensionId).dungeonGenerator!=null) + if(PocketManager.instance.getDimData(par3World.provider.dimensionId).dungeonGenerator!=null) { - System.out.println("Dungeon name "+dimHelper.instance.getDimData(par3World.provider.dimensionId).dungeonGenerator.schematicPath); + System.out.println("Dungeon name "+PocketManager.instance.getDimData(par3World.provider.dimensionId).dungeonGenerator.schematicPath); } } @@ -117,7 +117,7 @@ public class ItemStableFabric extends Item { //if(par2World.getBlockId(hit.blockX, hit.blockY, hit.blockZ)==properties.RiftBlockID) { - NewLinkData link = dimHelper.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); + NewLinkData link = PocketManager.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); if(link!=null) { Block var11; diff --git a/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java b/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java index c877d69..f5668e3 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java @@ -16,7 +16,7 @@ import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; public class itemDimDoor extends ItemDoor { @@ -138,7 +138,7 @@ public class itemDimDoor extends ItemDoor { if(par2World.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) { - NewLinkData link = dimHelper.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); + NewLinkData link = PocketManager.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); if(link!=null) { Block var11; @@ -169,7 +169,7 @@ public class itemDimDoor extends ItemDoor int var12 = MathHelper.floor_double((double)((par3EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; if (!canPlace(par2World, par4, par5, par6, var12) || !canPlace(par2World, par4, par5-1, par6, var12) || - dimHelper.instance.getLinkDataFromCoords(par4, par5, par6, par2World) == null) + PocketManager.instance.getLinkDataFromCoords(par4, par5, par6, par2World) == null) { return par1ItemStack; } diff --git a/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java b/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java index 6136038..0c19ba8 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java @@ -3,10 +3,10 @@ package StevenDimDoors.mod_pocketDim.items; import java.util.List; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.DimData; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.ILinkData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -69,7 +69,7 @@ public class itemLinkSignature extends Item public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { int key; - NewLinkData linkData; + ILinkData linkData; int thisWorldID=par3World.provider.dimensionId; @@ -118,13 +118,13 @@ public class itemLinkSignature extends Item for(int count = 0;count<3;count++) { - if(dimHelper.instance.getLinkDataFromCoords(par4, par5+count, par6,par3World)!=null) + if(PocketManager.instance.getLinkDataFromCoords(par4, par5+count, par6,par3World)!=null) { int id= (par3World.getBlockId(par4, par5+count, par6)); if(id == properties.DimensionalDoorID||id==properties.WarpDoorID||id== properties.UnstableDoorID) { - orientation = dimHelper.instance.getLinkDataFromCoords(par4, par5+count, par6,par3World).linkOrientation; + orientation = PocketManager.instance.getLinkDataFromCoords(par4, par5+count, par6,par3World).linkOrientation; } } @@ -139,8 +139,8 @@ public class itemLinkSignature extends Item - dimHelper.instance.createLink(par3World.provider.dimensionId, linkCoords[3], par4, par5+offset, par6, linkCoords[0], linkCoords[1], linkCoords[2],orientation); - dimHelper.instance.createLink(linkCoords[3], par3World.provider.dimensionId, linkCoords[0], linkCoords[1], linkCoords[2],par4, par5+offset, par6,linkCoords[4]); + PocketManager.instance.createLink(par3World.provider.dimensionId, linkCoords[3], par4, par5+offset, par6, linkCoords[0], linkCoords[1], linkCoords[2],orientation); + PocketManager.instance.createLink(linkCoords[3], par3World.provider.dimensionId, linkCoords[0], linkCoords[1], linkCoords[2],par4, par5+offset, par6,linkCoords[4]); @@ -155,7 +155,7 @@ public class itemLinkSignature extends Item //otherwise, it creates the first half of the link. Next click will complete it. - key= dimHelper.instance.createUniqueInterDimLinkKey(); + key= PocketManager.instance.createUniqueInterDimLinkKey(); this.writeToNBT(par1ItemStack, par4, par5+offset, par6,par3World.provider.dimensionId,orientation); par2EntityPlayer.sendChatToPlayer("Rift Signature Stored"); par2EntityPlayer.worldObj.playSoundAtEntity(par2EntityPlayer,"mods.DimDoors.sfx.riftStart", (float) .6, 1); @@ -183,7 +183,7 @@ public class itemLinkSignature extends Item { Integer[] coords = this.readFromNBT(par1ItemStack); - par3List.add(String.valueOf("Leads to dim "+coords[3] +" with depth "+(dimHelper.instance.getDimDepth(coords[3])))); + par3List.add(String.valueOf("Leads to dim "+coords[3] +" with depth "+(PocketManager.instance.getDimDepth(coords[3])))); par3List.add("at x="+coords[0]+" y="+coords[1]+" z="+coords[2]); } diff --git a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java index 8d15172..4058789 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java +++ b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java @@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.items; import java.util.List; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; @@ -83,7 +83,7 @@ public class itemRiftRemover extends Item if(hit!=null) { //System.out.println(hit.hitVec); - if(dimHelper.instance.removeRift(par2World, hit.blockX, hit.blockY, hit.blockZ, 1, par3EntityPlayer, par1ItemStack)) + if(PocketManager.instance.removeRift(par2World, hit.blockX, hit.blockY, hit.blockZ, 1, par3EntityPlayer, par1ItemStack)) { par3EntityPlayer.worldObj.playSoundAtEntity(par3EntityPlayer,"mods.DimDoors.sfx.riftClose", (float) .8, 1); diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index c8400b5..0ac2b10 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -33,9 +33,8 @@ import StevenDimDoors.mod_pocketDim.commands.CommandPrintDimensionData; import StevenDimDoors.mod_pocketDim.commands.CommandPruneDimensions; import StevenDimDoors.mod_pocketDim.commands.CommandResetDungeons; import StevenDimDoors.mod_pocketDim.commands.CommandTeleportPlayer; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; import StevenDimDoors.mod_pocketDim.items.ItemBlockDimWall; import StevenDimDoors.mod_pocketDim.items.ItemChaosDoor; import StevenDimDoors.mod_pocketDim.items.ItemRiftBlade; @@ -46,11 +45,13 @@ import StevenDimDoors.mod_pocketDim.items.itemExitDoor; import StevenDimDoors.mod_pocketDim.items.itemLinkSignature; import StevenDimDoors.mod_pocketDim.items.itemRiftRemover; import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler; +import StevenDimDoors.mod_pocketDim.ticking.LimboDecay; import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; import StevenDimDoors.mod_pocketDim.ticking.MonolithSpawner; import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator; import StevenDimDoors.mod_pocketDim.world.BiomeGenLimbo; import StevenDimDoors.mod_pocketDim.world.BiomeGenPocket; +import StevenDimDoors.mod_pocketDim.world.GatewayGenerator; import StevenDimDoors.mod_pocketDim.world.LimboProvider; import StevenDimDoors.mod_pocketDim.world.PocketProvider; import StevenDimDoors.mod_pocketDimClient.ClientPacketHandler; @@ -99,8 +100,6 @@ public class mod_pocketDim @Instance("PocketDimensions") public static mod_pocketDim instance = new mod_pocketDim(); - public static pocketTeleporter teleporter; - public static Block transientDoor; public static Block ExitDoor; public static Block chaosDoor; @@ -127,12 +126,11 @@ public class mod_pocketDim public static HashMap> limboSpawnInventory = new HashMap>(); - public static boolean hasInitDims = false; public static boolean isPlayerWearingGoogles = false; public static DDProperties properties; public static MonolithSpawner spawner; //Added this field temporarily. Will be refactored out later. - public static RiftGenerator riftGen; + public static GatewayGenerator riftGen; public static long genTime; public static int teleTimer = 0; @@ -165,10 +163,8 @@ public class mod_pocketDim //These fields MUST be initialized after properties are loaded to prevent //instances from holding onto null references to the properties. - - teleporter = new pocketTeleporter(); tracker = new PlayerRespawnTracker(); - riftGen = new RiftGenerator(); + riftGen = new GatewayGenerator(); } @Init @@ -396,12 +392,7 @@ public class mod_pocketDim { try { - dimHelper.instance.save(); - dimHelper.instance.unregsisterDims(); - dimHelper.dimList.clear(); - dimHelper.blocksToDecay.clear(); - dimHelper.instance.interDimLinkList.clear(); - mod_pocketDim.hasInitDims=false; + PocketManager.unload(); } catch(Exception e) { @@ -409,7 +400,6 @@ public class mod_pocketDim } } - @ServerStarting public void serverStarting(FMLServerStartingEvent event) { @@ -423,13 +413,6 @@ public class mod_pocketDim CommandPruneDimensions.instance().register(event); CommandCreatePocket.instance().register(event); CommandTeleportPlayer.instance().register(event); - dimHelper.instance.load(); - - if(!dimHelper.dimList.containsKey(properties.LimboDimensionID)) - { - dimHelper.dimList.put(properties.LimboDimensionID, new DimData( properties.LimboDimensionID, false, 0, new NewLinkData())); - } + PocketManager.load(); } - - } diff --git a/StevenDimDoors/mod_pocketDim/pocketTeleporter.java b/StevenDimDoors/mod_pocketDim/pocketTeleporter.java deleted file mode 100644 index 1f3e92f..0000000 --- a/StevenDimDoors/mod_pocketDim/pocketTeleporter.java +++ /dev/null @@ -1,226 +0,0 @@ -package StevenDimDoors.mod_pocketDim; - -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.EntityMinecart; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.world.Teleporter; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; - -public class pocketTeleporter -{ - int x,y,z; - - NewLinkData sendingLink; - - - public pocketTeleporter() - - { - - - - } - - - /** - * Create a new portal near an entity. - */ - - public void placeInPortal(Entity par1Entity, WorldServer world, NewLinkData link) - { - - - this.x=link.destXCoord; - this.y=link.destYCoord; - this.z=link.destZCoord; - - this.sendingLink=link; - - int id; - - //TODO Temporary workaround for mismatched door/rift metadata cases. Gives priority to the door. - id=dimHelper.instance.getDestOrientation(sendingLink); - int receivingDoorMeta=world.getBlockMetadata(link.destXCoord, link.destYCoord-1, link.destZCoord); - int recevingDoorID=world.getBlockId(link.destXCoord, link.destYCoord, link.destZCoord); - if(receivingDoorMeta!=id) - { - if(recevingDoorID==mod_pocketDim.dimDoor.blockID||recevingDoorID==mod_pocketDim.ExitDoor.blockID) - { - dimHelper.instance.getLinkDataFromCoords(link.destXCoord, link.destYCoord, link.destZCoord, world).linkOrientation=receivingDoorMeta; - id=receivingDoorMeta; - - } - } - - - - if(par1Entity instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) par1Entity; - - - - - //System.out.println("Teleporting with link oreintation "+id); - - - player.rotationYaw=(id*90)+90; - if(id==2||id==6) - { - player.setPositionAndUpdate( x+1.5, y-1, z+.5 ); - - - } - else if(id==3||id==7) - { - - player.setPositionAndUpdate( x+.5, y-1, z+1.5 ); - - - } - else if(id==0||id==4) - { - - player.setPositionAndUpdate(x-.5, y-1, z+.5); - - } - else if(id==1||id==5) - { - player.setPositionAndUpdate(x+.5, y-1, z-.5); - - - } - else - { - player.setPositionAndUpdate(x, y-1, z); - - } - - - - } - - else if(par1Entity instanceof EntityMinecart) - { - par1Entity.motionX=0; - par1Entity.motionZ=0; - par1Entity.motionY=0; - - - - par1Entity.rotationYaw=(id*90)+90; - - if(id==2||id==6) - { - - - this.setEntityPosition(par1Entity, x+1.5, y, z+.5 ); - par1Entity.motionX =.39; - par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); - - } - else if(id==3||id==7) - { - - - this.setEntityPosition(par1Entity, x+.5, y, z+1.5 ); - par1Entity.motionZ =.39; - par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); - - - - } - else if(id==0||id==4) - { - - - this.setEntityPosition(par1Entity,x-.5, y, z+.5); - par1Entity.motionX =-.39; - par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); - - - } - else if(id==1||id==5) - { - - this.setEntityPosition(par1Entity,x+.5, y, z-.5); - par1Entity.motionZ =-.39; - par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); - - - } - else - { - this.setEntityPosition(par1Entity,x, y, z); - - } - - - - - } - - - else if(par1Entity instanceof Entity) - { - - //System.out.println("Teleporting with link oreintation "+id); - - - par1Entity.rotationYaw=(id*90)+90; - - // EntityMinecart.class.cast(par1Entity).isinreverse=false; - if(id==2||id==6) - { - this.setEntityPosition(par1Entity, x+1.5, y, z+.5 ); - - - } - else if(id==3||id==7) - { - - this.setEntityPosition(par1Entity, x+.5, y, z+1.5 ); - - - } - else if(id==0||id==4) - { - - this.setEntityPosition(par1Entity,x-.5, y, z+.5); - - } - else if(id==1||id==5) - { - this.setEntityPosition(par1Entity,x+.5, y, z-.5); - - - } - else - { - this.setEntityPosition(par1Entity,x, y, z); - - } - - - - - } - - } - - public void setEntityPosition(Entity entity, double x, double y, double z) - { - entity.lastTickPosX = entity.prevPosX = entity.posX = x; - entity.lastTickPosY = entity.prevPosY = entity.posY = y + (double)entity.yOffset; - entity.lastTickPosZ = entity.prevPosZ = entity.posZ = z; - entity.setPosition(x, y, z); - } - - - - - -} diff --git a/StevenDimDoors/mod_pocketDim/LimboDecay.java b/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java similarity index 94% rename from StevenDimDoors/mod_pocketDim/LimboDecay.java rename to StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java index 8038541..999c813 100644 --- a/StevenDimDoors/mod_pocketDim/LimboDecay.java +++ b/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java @@ -1,4 +1,4 @@ -package StevenDimDoors.mod_pocketDim; +package StevenDimDoors.mod_pocketDim.ticking; import java.util.Random; @@ -6,9 +6,8 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; -import StevenDimDoors.mod_pocketDim.ticking.IRegularTickReceiver; -import StevenDimDoors.mod_pocketDim.ticking.IRegularTickSender; +import net.minecraftforge.common.DimensionManager; +import StevenDimDoors.mod_pocketDim.DDProperties; /** * Provides methods for applying Limbo decay. Limbo decay refers to the effect that most blocks placed in Limbo @@ -81,7 +80,7 @@ public class LimboDecay implements IRegularTickReceiver { int x, y, z; int sectionY; int limboHeight; - World limbo = dimHelper.getWorld(properties.LimboDimensionID); + World limbo = DimensionManager.getWorld(properties.LimboDimensionID); if (limbo != null) { diff --git a/StevenDimDoors/mod_pocketDim/ticking/LimboGatewayGenerator.java b/StevenDimDoors/mod_pocketDim/ticking/LimboGatewayGenerator.java index 34536d4..3908bc9 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/LimboGatewayGenerator.java +++ b/StevenDimDoors/mod_pocketDim/ticking/LimboGatewayGenerator.java @@ -8,8 +8,8 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.world.GameRules; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.util.ChunkLocation; diff --git a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index 536c0b7..d102596 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -14,7 +14,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.world.LimboProvider; import StevenDimDoors.mod_pocketDim.world.PocketProvider; @@ -173,7 +173,7 @@ public class MobMonolith extends EntityFlying implements IMob NewLinkData link = new NewLinkData(this.worldObj.provider.dimensionId, properties.LimboDimensionID, (int)this.posX, (int)this.posY, (int)this.posZ, (int)this.posX+rand.nextInt(500)-250, (int)this.posY+500, (int)this.posZ+rand.nextInt(500)-250, false,0); - dimHelper.instance.traverseDimDoor(worldObj, link, entityPlayer); + PocketManager.instance.traverseDimDoor(worldObj, link, entityPlayer); this.aggro=0; entityPlayer.worldObj.playSoundAtEntity(entityPlayer,"mods.DimDoors.sfx.crack",13, 1); diff --git a/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java b/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java index 49c6292..59f8fb5 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java +++ b/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java @@ -7,9 +7,10 @@ import net.minecraft.entity.Entity; import net.minecraft.server.MinecraftServer; import net.minecraft.world.GameRules; import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.util.ChunkLocation; @@ -69,23 +70,24 @@ public class MonolithSpawner implements IRegularTickReceiver { private void placeMonolithsInPocket(int dimensionID, int chunkX, int chunkZ) { - World pocket = dimHelper.getWorld(dimensionID); - DimData dimData = dimHelper.instance.getDimData(dimensionID); + NewDimData dimension = PocketManager.getDimensionData(dimensionID); + World pocket = DimensionManager.getWorld(dimensionID); + + if (pocket == null || + dimension == null || + dimension.dungeon() == null || + dimension.dungeon().isOpen()) + { + return; + } + int sanity = 0; int blockID = 0; boolean didSpawn = false; - if (pocket == null || - dimData == null || - dimData.dungeonGenerator == null || - dimData.dungeonGenerator.isOpen) - { - return; - } - //The following initialization code is based on code from ChunkProviderGenerate. //It makes our generation depend on the world seed. - Random random = new Random(pocket.getSeed()); + Random random = new Random(pocket.getSeed() ^ 0xA210FE65F20017D6L); long factorA = random.nextLong() / 2L * 2L + 1L; long factorB = random.nextLong() / 2L * 2L + 1L; random.setSeed(chunkX * factorA + chunkZ * factorB ^ pocket.getSeed()); @@ -139,7 +141,7 @@ public class MonolithSpawner implements IRegularTickReceiver { private void placeMonolithsInLimbo(int dimensionID, int chunkX, int chunkZ) { - World limbo = dimHelper.getWorld(dimensionID); + World limbo = DimensionManager.getWorld(dimensionID); if (limbo == null) { @@ -148,7 +150,7 @@ public class MonolithSpawner implements IRegularTickReceiver { //The following initialization code is based on code from ChunkProviderGenerate. //It makes our generation depend on the world seed. - Random random = new Random(limbo.getSeed()); + Random random = new Random(limbo.getSeed() ^ 0xB5130C4ACC71A822L); long factorA = random.nextLong() / 2L * 2L + 1L; long factorB = random.nextLong() / 2L * 2L + 1L; random.setSeed(chunkX * factorA + chunkZ * factorB ^ limbo.getSeed()); diff --git a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java index b840e48..6fb2ff1 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java +++ b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java @@ -1,18 +1,22 @@ package StevenDimDoors.mod_pocketDim.ticking; import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.TileEntityRift; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.util.Point4D; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; public class RiftRegenerator implements IRegularTickReceiver { - private static final int RIFT_REGENERATION_INTERVAL = 100; //Regenerate random rifts every 100 ticks - + private static final int RIFT_REGENERATION_INTERVAL = 200; //Regenerate random rifts every 200 ticks + private static final int RIFTS_REGENERATED_PER_DIMENSION = 5; + private DDProperties properties; public RiftRegenerator(IRegularTickSender sender, DDProperties properties) @@ -24,49 +28,33 @@ public class RiftRegenerator implements IRegularTickReceiver { @Override public void notifyTick() { - regenerate(); + regenerateRiftsInAllWorlds(); } - - private void regenerate() + + public static void regenerateRiftsInAllWorlds() { - try - { - //Regenerate rifts that have been replaced (not permanently removed) by players - - int i = 0; - - while (i < 15 && FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) + //Regenerate rifts that have been replaced (not permanently removed) by players + DDProperties properties = DDProperties.instance(); + + for (NewDimData dimension : PocketManager.getDimensions()) + { + if (dimension.linkCount() > 0) { - i++; - NewLinkData link; - - //actually gets the random rift based on the size of the list - link = (NewLinkData) dimHelper.instance.getRandomLinkData(true); - - if (link != null) - { - World world = dimHelper.getWorld(link.locDimID); - - if (world != null && !mod_pocketDim.blockRift.isBlockImmune(world, link.locXCoord, link.locYCoord, link.locZCoord)) - { - if (dimHelper.instance.getLinkDataFromCoords(link.locXCoord, link.locYCoord, link.locZCoord, link.locDimID) != null) - { - world.setBlock(link.locXCoord, link.locYCoord, link.locZCoord, properties.RiftBlockID); - TileEntityRift rift = (TileEntityRift) world.getBlockTileEntity(link.locXCoord, link.locYCoord, link.locZCoord); - if (rift == null) - { - dimHelper.getWorld(link.locDimID).setBlockTileEntity(link.locXCoord, link.locYCoord, link.locZCoord, new TileEntityRift()); - } - rift.hasGrownRifts = true; - } - } - } + World world = DimensionManager.getWorld(dimension.id()); + + if (world != null) + { + for (int count = 0; count < RIFTS_REGENERATED_PER_DIMENSION; count++) + { + IDimLink link = dimension.getRandomLink(); + Point4D source = link.source(); + if (!mod_pocketDim.blockRift.isBlockImmune(world, source.getX(), source.getY(), source.getZ())) + { + world.setBlock(source.getX(), source.getY(), source.getZ(), properties.RiftBlockID); + } + } + } } - } - catch (Exception e) - { - System.err.println("An exception occurred in RiftRegenerator.regenerate():"); - e.printStackTrace(); - } + } } } diff --git a/StevenDimDoors/mod_pocketDim/util/Point4D.java b/StevenDimDoors/mod_pocketDim/util/Point4D.java index ca4dd89..e8c6214 100644 --- a/StevenDimDoors/mod_pocketDim/util/Point4D.java +++ b/StevenDimDoors/mod_pocketDim/util/Point4D.java @@ -1,7 +1,7 @@ package StevenDimDoors.mod_pocketDim.util; -public final class Point4D +public final class Point4D implements Comparable { private final int x; private final int y; @@ -135,6 +135,21 @@ public final class Point4D return (x == other.x && y == other.y && z == other.z && dimension == other.dimension); } + @Override + public int compareTo(Point4D other) + { + int diff = x - other.x; + if (diff != 0) + return diff; + diff = y - other.y; + if (diff != 0) + return diff; + diff = z - other.z; + if (diff != 0) + return diff; + return dimension - other.dimension; + } + @Override public String toString() { diff --git a/StevenDimDoors/mod_pocketDim/RiftGenerator.java b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java similarity index 86% rename from StevenDimDoors/mod_pocketDim/RiftGenerator.java rename to StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java index 5b02031..db56e71 100644 --- a/StevenDimDoors/mod_pocketDim/RiftGenerator.java +++ b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java @@ -1,4 +1,4 @@ -package StevenDimDoors.mod_pocketDim; +package StevenDimDoors.mod_pocketDim.world; import java.util.Random; @@ -7,14 +7,15 @@ import net.minecraft.block.material.Material; import net.minecraft.world.World; import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.items.itemDimDoor; -import StevenDimDoors.mod_pocketDim.world.LimboProvider; -import StevenDimDoors.mod_pocketDim.world.PocketProvider; import cpw.mods.fml.common.IWorldGenerator; -public class RiftGenerator implements IWorldGenerator +public class GatewayGenerator implements IWorldGenerator { public static final int MAX_GATEWAY_GENERATION_CHANCE = 10000; public static final int MAX_CLUSTER_GENERATION_CHANCE = 10000; @@ -30,7 +31,7 @@ public class RiftGenerator implements IWorldGenerator private static final int NETHER_DIMENSION_ID = -1; private static DDProperties properties = null; - public RiftGenerator() + public GatewayGenerator() { if (properties == null) properties = DDProperties.instance(); @@ -47,7 +48,7 @@ public class RiftGenerator implements IWorldGenerator return; } //This check prevents a crash related to superflat worlds not loading World 0 - if (dimHelper.getWorld(OVERWORLD_DIMENSION_ID) == null) + if (DimensionManager.getWorld(OVERWORLD_DIMENSION_ID) == null) { return; } @@ -56,7 +57,8 @@ public class RiftGenerator implements IWorldGenerator int attempts; int correction; boolean valid; - NewLinkData link; + IDimLink link; + NewDimData dimension; //Check if we're generating things in the Nether if (world.provider.dimensionId == NETHER_DIMENSION_ID) @@ -76,6 +78,7 @@ public class RiftGenerator implements IWorldGenerator if (random.nextInt(MAX_CLUSTER_GENERATION_CHANCE) < properties.ClusterGenerationChance) { link = null; + dimension = null; do { //Pick a random point on the surface of the chunk @@ -90,16 +93,15 @@ public class RiftGenerator implements IWorldGenerator world.getBlockId(x, y - 1, z) != Block.bedrock.blockID && world.getBlockId(x, y - 2, z) != Block.bedrock.blockID) { - //Create a link. If this is the first time, create a dungeon pocket and create a two-way link. - //Otherwise, create a one-way link and connect to the destination of the first link. + //Create a link. If this is not the first time, create a child link and connect it to the first link. if (link == null) { - link = new NewLinkData(world.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 0); - link = dimHelper.instance.createPocket(link, true, true); + dimension = PocketManager.getDimensionData(world); + link = dimension.createLink(x, y + 1, z).setLinkType(IDimLink.TYPE_POCKET); } else { - link = dimHelper.instance.createLink(link.locDimID, link.destDimID, x, y + 1, z, link.destXCoord, link.destYCoord, link.destZCoord); + dimension.createChildLink(x, y + 1, z, link); } } } @@ -128,13 +130,12 @@ public class RiftGenerator implements IWorldGenerator //Build the gateway if we found a valid location if (valid) { - //Create a two-way link between the upper block of the gateway and a pocket dimension - //That pocket dimension is where we'll start a dungeon! - link = new NewLinkData(world.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 0); - link = dimHelper.instance.createPocket(link, true, true); + //Create a partial link to a dungeon. + dimension = PocketManager.getDimensionData(world); + link = dimension.createLink(x, y + 1, z).setLinkType(IDimLink.TYPE_DUNGEON); //If the current dimension isn't Limbo, build a Rift Gateway out of Stone Bricks - if (world.provider.dimensionId != properties.LimboDimensionID) + if (dimension.id() != properties.LimboDimensionID) { createStoneGateway(world, x, y, z, random); } diff --git a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java new file mode 100644 index 0000000..e880ce6 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -0,0 +1,422 @@ +package StevenDimDoors.mod_pocketDim.world; + +import java.util.HashMap; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.storage.ExtendedBlockStorage; +import net.minecraftforge.common.DimensionManager; +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.Point3D; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; +import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; +import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; +import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; +import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; +import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; +import StevenDimDoors.mod_pocketDim.util.Point4D; + +public class PocketBuilder +{ + public static final int MIN_POCKET_SIZE = 5; + public static final int MAX_POCKET_SIZE = 51; + public static final int DEFAULT_POCKET_SIZE = 39; + + public static final int MIN_POCKET_WALL_THICKNESS = 1; + public static final int MAX_POCKET_WALL_THICKNESS = 10; + public static final int DEFAULT_POCKET_WALL_THICKNESS = 5; + + private static final Random random = new Random(); + + private PocketBuilder() { } + + public static boolean initializeDestination(IDimLink link, DDProperties properties) + { + if (link.hasDestination()) + { + return true; + } + + //Check the destination type and respond accordingly + switch (link.linkType()) + { + case IDimLink.TYPE_DUNGEON: + return generateNewDungeonPocket(link, properties); + case IDimLink.TYPE_POCKET: + return generateNewPocket(link, properties); + default: + throw new IllegalArgumentException("link has an unrecognized link type."); + } + } + + public static boolean generateNewDungeonPocket(IDimLink link, DDProperties properties) + { + if (link == null) + { + throw new IllegalArgumentException("link cannot be null."); + } + if (properties == null) + { + throw new IllegalArgumentException("properties cannot be null."); + } + if (link.hasDestination()) + { + throw new IllegalArgumentException("link cannot have a destination assigned already."); + } + + try + { + //Register a new dimension + NewDimData parent = PocketManager.getDimensionData(link.source().getDimension()); + NewDimData dimension = PocketManager.registerPocket(parent, false); + + //Load a world + World world = DimensionManager.getWorld(dimension.id()); + + if (world == null) + { + DimensionManager.initDimension(dimension.id()); + world = DimensionManager.getWorld(dimension.id()); + } + if (world != null && world.provider == null) + { + DimensionManager.initDimension(dimension.id()); + } + if (world == null || world.provider == null) + { + System.err.println("Could not initialize dimension for a dungeon!"); + return false; + } + + /* This code is currently wrong. It's missing the following things: + * 1. Calculate the destination point for real. That includes adding door noise if needed. + * 2. Receive the DungeonData from selectDungeon() + * 3. The function signature for DungeonSchematic.copyToWorld() has to be rewritten. + */ + + //Choose a dungeon to generate + DungeonSchematic schematic = selectDungeon(dimension, random, properties); + + if (schematic == null) + { + System.err.println("Could not select a dungeon for generation!"); + return false; + } + + //Calculate the destination point + Point4D source = link.source(); + int destinationY = yCoordHelper.adjustDestinationY(destination, world.getHeight(), schematic.getEntranceDoorLocation().getY(), schematic.getHeight()); + int orientation = getDestinationOrientation(source); + destination.setY(destinationY); + + //Generate the dungeon + DungeonPackConfig packConfig = dungeon.dungeonType().Owner != null ? dungeon.dungeonType().Owner.getConfig() : null; + + schematic.copyToWorld(world, link, packConfig.doDistortDoorCoordinates()); + + //Finish up destination initialization + dimension.initializePocket(destination.getX(), destination.getY(), destination.getZ(), orientation, link); + dimension.setFilled(true); + return true; + } + catch (Exception e) + { + e.printStackTrace(); + return false; + } + } + + private static DungeonSchematic selectDungeon(NewDimData dimension, Random random, DDProperties properties) + { + //We assume the dimension doesn't have a dungeon assigned + if (dimension.dungeon() != null) + { + throw new IllegalArgumentException("dimension cannot have a dungeon assigned already."); + } + + DungeonData dungeon = null; + DungeonSchematic schematic = null; + + dungeon = DungeonHelper.instance().selectDungeon(dimension, random); + + if (dungeon != null) + { + schematic = loadAndValidateDungeon(dungeon, properties); + } + else + { + System.err.println("Could not select a dungeon at all!"); + } + + if (schematic == null) + { + //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. + + try + { + System.err.println("Loading the default error dungeon instead..."); + dungeon = DungeonHelper.instance().getDefaultErrorDungeon(); + schematic = loadAndValidateDungeon(dungeon, properties); + } + catch (Exception e) + { + e.printStackTrace(); + return null; + } + } + return schematic; + } + + private static DungeonSchematic loadAndValidateDungeon(DungeonData dungeon, DDProperties properties) + { + try + { + DungeonSchematic schematic = dungeon.loadSchematic(); + + //Validate the dungeon's dimensions + if (hasValidDimensions(schematic)) + { + schematic.applyImportFilters(properties); + + //Check that the dungeon has an entrance or we'll have a crash + if (schematic.getEntranceDoorLocation() == null) + { + System.err.println("The following schematic file does not have an entrance: " + dungeon.schematicPath()); + return null; + } + } + else + { + System.err.println("The following schematic file has dimensions that exceed the maximum permitted dimensions for dungeons: " + dungeon.schematicPath()); + return null; + } + return schematic; + } + catch (Exception e) + { + System.err.println("An error occurred while loading the following schematic: " + dungeon.schematicPath()); + System.err.println(e.getMessage()); + return null; + } + } + + private static boolean hasValidDimensions(DungeonSchematic schematic) + { + return (schematic.getWidth() <= DungeonHelper.MAX_DUNGEON_WIDTH && + schematic.getHeight() <= DungeonHelper.MAX_DUNGEON_HEIGHT && + schematic.getLength() <= DungeonHelper.MAX_DUNGEON_LENGTH); + } + + public static boolean generateNewPocket(IDimLink link, DDProperties properties) + { + return generateNewPocket(link, DEFAULT_POCKET_SIZE, DEFAULT_POCKET_WALL_THICKNESS, properties); + } + + private static int getDestinationOrientation(Point4D source) + { + // TODO Auto-generated method stub + return 0; + } + + public static boolean generateNewPocket(IDimLink link, int size, int wallThickness, DDProperties properties) + { + if (link == null) + { + throw new IllegalArgumentException(); + } + if (properties == null) + { + throw new IllegalArgumentException("properties cannot be null."); + } + if (link.hasDestination()) + { + throw new IllegalArgumentException("link cannot have a destination assigned already."); + } + + if (size < MIN_POCKET_SIZE || size > MAX_POCKET_SIZE) + { + throw new IllegalArgumentException("size must be between " + MIN_POCKET_SIZE + " and " + MAX_POCKET_SIZE + ", inclusive."); + } + if (wallThickness < MIN_POCKET_WALL_THICKNESS || wallThickness > MAX_POCKET_WALL_THICKNESS) + { + throw new IllegalArgumentException("wallThickness must be between " + MIN_POCKET_WALL_THICKNESS + " and " + MAX_POCKET_WALL_THICKNESS + ", inclusive."); + } + if (size % 2 == 0) + { + throw new IllegalArgumentException("size must be an odd number."); + } + if (size < 2 * wallThickness + 3) + { + throw new IllegalArgumentException("size must be large enough to fit the specified wall thickness and some air space."); + } + + try + { + //Register a new dimension + NewDimData parent = PocketManager.getDimensionData(link.source().getDimension()); + NewDimData dimension = PocketManager.registerPocket(parent, false); + + //Load a world + World world = DimensionManager.getWorld(dimension.id()); + + if (world == null) + { + DimensionManager.initDimension(dimension.id()); + world = DimensionManager.getWorld(dimension.id()); + } + if (world != null && world.provider == null) + { + DimensionManager.initDimension(dimension.id()); + } + if (world == null || world.provider == null) + { + System.err.println("Could not initialize dimension for a pocket!"); + return false; + } + + //Calculate the destination point + Point4D source = link.source(); + int destinationY = yCoordHelper.adjustDestinationY(source.getY(), world.getHeight(), wallThickness + 1, size); + int orientation = getDestinationOrientation(source); + + //Build the actual pocket area + buildPocket(world, source.getX(), destinationY, source.getZ(), orientation, size, wallThickness, properties); + + //Finish up destination initialization + dimension.initializePocket(source.getX(), destinationY, source.getZ(), orientation, link); + dimension.setFilled(true); + return true; + } + catch (Exception e) + { + e.printStackTrace(); + return false; + } + } + + private static void buildPocket(World world, int x, int y, int z, int orientation, int size, int wallThickness, DDProperties properties) + { + if (properties == null) + { + throw new IllegalArgumentException("properties cannot be null."); + } + if (size < MIN_POCKET_SIZE || size > MAX_POCKET_SIZE) + { + throw new IllegalArgumentException("size must be between " + MIN_POCKET_SIZE + " and " + MAX_POCKET_SIZE + ", inclusive."); + } + if (wallThickness < MIN_POCKET_WALL_THICKNESS || wallThickness > MAX_POCKET_WALL_THICKNESS) + { + throw new IllegalArgumentException("wallThickness must be between " + MIN_POCKET_WALL_THICKNESS + " and " + MAX_POCKET_WALL_THICKNESS + ", inclusive."); + } + if (size % 2 == 0) + { + throw new IllegalArgumentException("size must be an odd number."); + } + if (size < 2 * wallThickness + 3) + { + throw new IllegalArgumentException("size must be large enough to fit the specified wall thickness and some air space."); + } + + Point3D center = new Point3D(x - wallThickness + 1 + (size / 2), y - wallThickness - 1 + (size / 2), z); + Point3D door = new Point3D(x, y, z); + BlockRotator.transformPoint(center, door, orientation - BlockRotator.EAST_DOOR_METADATA, door); + + //Build the outer layer of Eternal Fabric + buildBox(world, center.getX(), center.getY(), center.getZ(), (size / 2), properties.PermaFabricBlockID, false, 0); + + //Build the (wallThickness - 1) layers of Fabric of Reality + for (int layer = 1; layer < wallThickness; layer++) + { + buildBox(world, center.getX(), center.getY(), center.getZ(), (size / 2) - layer, properties.FabricBlockID, + layer < (wallThickness - 1) && properties.TNFREAKINGT_Enabled, properties.NonTntWeight); + } + + //Build the door + int metadata = BlockRotator.transformMetadata(BlockRotator.EAST_DOOR_METADATA, orientation - BlockRotator.EAST_DOOR_METADATA, properties.DimensionalDoorID); + setBlockDirectly(world, x, y, z, properties.DimensionalDoorID, metadata); + setBlockDirectly(world, x, y - 1, z, properties.DimensionalDoorID, metadata); + } + + private static void buildBox(World world, int centerX, int centerY, int centerZ, int radius, int blockID, boolean placeTnt, int nonTntWeight) + { + int x, y, z; + + final int startX = centerX - radius; + final int startY = centerY - radius; + final int startZ = centerZ - radius; + + final int endX = centerX + radius; + final int endY = centerY + radius; + final int endZ = centerZ + radius; + + //Build faces of the box + for (x = startX; x <= endX; x++) + { + for (z = startZ; z <= endZ; z++) + { + setBlockDirectlySpecial(world, x, startY, z, blockID, 0, placeTnt, nonTntWeight); + setBlockDirectlySpecial(world, x, endY, z, blockID, 0, placeTnt, nonTntWeight); + } + + for (y = startY; y <= endY; y++) + { + setBlockDirectlySpecial(world, x, y, startZ, blockID, 0, placeTnt, nonTntWeight); + setBlockDirectlySpecial(world, x, y, endZ, blockID, 0, placeTnt, nonTntWeight); + } + } + + for (y = startY; y <= endY; y++) + { + for (z = startZ; z <= endZ; z++) + { + setBlockDirectlySpecial(world, startX, y, z, blockID, 0, placeTnt, nonTntWeight); + setBlockDirectlySpecial(world, endX, y, z, blockID, 0, placeTnt, nonTntWeight); + } + } + } + + private static void setBlockDirectlySpecial(World world, int x, int y, int z, int blockID, int metadata, boolean placeTnt, int nonTntWeight) + { + if (placeTnt && random.nextInt(nonTntWeight + 1) == 0) + { + setBlockDirectly(world, x, y, z, Block.tnt.blockID, 1); + } + else + { + setBlockDirectly(world, x, y, z, blockID, metadata); + } + } + + private static void setBlockDirectly(World world, int x, int y, int z, int blockID, int metadata) + { + if (blockID != 0 && Block.blocksList[blockID] == null) + { + return; + } + + int cX = x >> 4; + int cZ = z >> 4; + int cY = y >> 4; + Chunk chunk; + + int localX = (x % 16) < 0 ? (x % 16) + 16 : (x % 16); + int localZ = (z % 16) < 0 ? (z % 16) + 16 : (z % 16); + ExtendedBlockStorage extBlockStorage; + + chunk = world.getChunkFromChunkCoords(cX, cZ); + extBlockStorage = chunk.getBlockStorageArray()[cY]; + if (extBlockStorage == null) + { + extBlockStorage = new ExtendedBlockStorage(cY << 4, !world.provider.hasNoSky); + chunk.getBlockStorageArray()[cY] = extBlockStorage; + } + extBlockStorage.setExtBlockID(localX, y & 15, localZ, blockID); + extBlockStorage.setExtBlockMetadata(localX, y & 15, localZ, metadata); + } +} diff --git a/StevenDimDoors/mod_pocketDim/world/PocketGenerator.java b/StevenDimDoors/mod_pocketDim/world/PocketGenerator.java index bdf9b72..fd34184 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketGenerator.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketGenerator.java @@ -8,8 +8,8 @@ import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.ChunkProviderGenerate; -import StevenDimDoors.mod_pocketDim.DimData; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.ticking.MonolithSpawner; public class PocketGenerator extends ChunkProviderGenerate implements IChunkProvider @@ -69,16 +69,10 @@ public class PocketGenerator extends ChunkProviderGenerate implements IChunkProv @Override public List getPossibleCreatures(EnumCreatureType var1, int var2, int var3, int var4) { - DimData data = dimHelper.instance.getDimData(this.worldObj.provider.dimensionId); - if (data != null) + NewDimData dimension = PocketManager.getDimensionData(this.worldObj); + if (dimension != null && dimension.dungeon() != null && !dimension.dungeon().isOpen()) { - if (data.dungeonGenerator != null) - { - if (data.isDimRandomRift && data.isPocket && !data.dungeonGenerator.isOpen) - { - return this.worldObj.getBiomeGenForCoords(var2, var3).getSpawnableList(var1); - } - } + return this.worldObj.getBiomeGenForCoords(var2, var3).getSpawnableList(var1); } return null; } diff --git a/StevenDimDoors/mod_pocketDim/world/PocketProvider.java b/StevenDimDoors/mod_pocketDim/world/PocketProvider.java index 3d82d09..fa2087c 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketProvider.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketProvider.java @@ -6,10 +6,11 @@ import net.minecraft.util.Vec3; import net.minecraft.world.WorldProvider; import net.minecraft.world.biome.WorldChunkManagerHell; import net.minecraft.world.chunk.IChunkProvider; +import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.CloudRenderBlank; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.ticking.MonolithSpawner; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -113,12 +114,12 @@ public class PocketProvider extends WorldProvider } else { - respawnDim = dimHelper.instance.getDimData(this.dimensionId).exitDimLink.destDimID; + respawnDim = PocketManager.getDimensionData(this.dimensionId).root().id(); } - if (dimHelper.getWorld(respawnDim) == null) + if (DimensionManager.getWorld(respawnDim) == null) { - dimHelper.initDimension(respawnDim); + DimensionManager.initDimension(respawnDim); } return respawnDim; } diff --git a/StevenDimDoors/mod_pocketDimClient/ClosingRiftFX.java b/StevenDimDoors/mod_pocketDimClient/ClosingRiftFX.java index 93f535d..416b3fe 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClosingRiftFX.java +++ b/StevenDimDoors/mod_pocketDimClient/ClosingRiftFX.java @@ -1,6 +1,6 @@ package StevenDimDoors.mod_pocketDimClient; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.particle.EntityFX; import net.minecraft.client.renderer.Tessellator; @@ -98,7 +98,7 @@ public class ClosingRiftFX extends EntityFX float var16 = .8F; try { - if(dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).isPocket) + if(PocketManager.instance.getDimData(this.worldObj.provider.dimensionId).isPocket) { var16=.4F; } diff --git a/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java b/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java index b242abd..0a8eb72 100644 --- a/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java +++ b/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java @@ -1,6 +1,6 @@ package StevenDimDoors.mod_pocketDimClient; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.particle.EntityFX; import net.minecraft.client.particle.EntityFireworkSparkFX; @@ -55,7 +55,7 @@ public class GoggleRiftFX extends EntityFireworkSparkFX float var16 = .0F; try { - if(dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).isPocket) + if(PocketManager.instance.getDimData(this.worldObj.provider.dimensionId).isPocket) { var16=.7F; } diff --git a/StevenDimDoors/mod_pocketDimClient/RiftFX.java b/StevenDimDoors/mod_pocketDimClient/RiftFX.java index ee3b97a..0157b91 100644 --- a/StevenDimDoors/mod_pocketDimClient/RiftFX.java +++ b/StevenDimDoors/mod_pocketDimClient/RiftFX.java @@ -1,6 +1,6 @@ package StevenDimDoors.mod_pocketDimClient; -import StevenDimDoors.mod_pocketDim.helpers.dimHelper; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.particle.EntityFX; import net.minecraft.client.particle.EntityFireworkSparkFX; @@ -112,7 +112,7 @@ public class RiftFX extends EntityFX try { - if(dimHelper.instance.getDimData(this.worldObj.provider.dimensionId).isPocket) + if(PocketManager.instance.getDimData(this.worldObj.provider.dimensionId).isPocket) { f14=.7F; } diff --git a/schematics/core/simpleStairsDown.schematic b/schematics/core/simpleStairsDown.schematic deleted file mode 100644 index 5dd2153231f8d0d1cff881a211757470eaef7f5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1239 zcmb2|=3sz;w|D*Xg2N?_J#^NvSm^UB|AOcSKCcN@3tlalYPC(cJ7(gIz&EQdq=q`> zEGym?$jrG(_;K7!??1nORH|j(l|N|pugES+^=os{huarVepq9l+gJ5;_2GY8;!oW+ zXJueWSbpd37vUc@)wAoE7@`yFFZ(~Zc7vPY%w}w?w9#!{o zc)YAxdi&##NAG_6`eTt~-?G1%#&Uaqx0HLmUt(YRYtzhg|32MLEBf*L#m@qps-jEz zZs%uR?7q2}|M>I67uSpX`yHSBuyAMeyFa$SOYP6u?VDBmC-K|Ir*9sYKmAsB{=NOb zdDTzY=5%xv;N$JZC|JLWbL$EwRFp= zs<%e*+;>)`D&NSes(#I1d3!zU3#XlyF?&_7Z}SQ3y!WWSt>XWUN6ycUZf;$}bn>`1 z_gSq8HG4K)A(Hdv(j@(+wUHcPonbeowSqOj$tue`H<>#=EWgau+C2Yz(6*FMll#M` z&5AvD?(BQN_fvBv|2%m-wKZ+}t=jUcXY+qSB%_Qjc<&Q4Qk8#yE_LsN=VtTQZg{iY zLm13|e(-#*;%bLaA5S@L=2DSguVYFvhZz{}VHMxE&9~>D{apR>r;PP?elNEC_knG} z_x1PwettXqI>Q0>=D8;s%5FcHA9nref-NV#cCUGwo;`Q&*4-c9vMvZ)8X9`I_5Ry9 z29J;bcK_dXnyuL}FU)M>+^wf})rzKU+SB8!xwLg+Hlo-d4RZHckIT%Kym|6)K&WjH(qMhEBLT0mRv+ zzFAx-jy1Bxt?3EpNgH>X3Z6?QMXtG2;l*EFDf^qDuUU-_1th)T;Yd|0jnR8tvwd+!Eq`|H;}@;6+c zqdOyY{ttETKb-rsQ$=UK@&4D{uy=#^&89N(f2aHpTAk7|iaZjRG1c`w>&-<6XMYpl zC%xYpsPIhOgwn~n8RZZ6|NEl8LvGt?jnyYoqNn60)t-n-@4mIS*`;uD`IIhHP1XC;!971u)xX0>ZM7OGY)+(X$}$pCp@9H2w@3JE{%1U} L|B2*27bXS(91v(y diff --git a/schematics/core/simpleStairsUp.schematic b/schematics/core/simpleStairsUp.schematic deleted file mode 100644 index 6c9ef12f0105c90974d0acac8a5ade06811bc8f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1112 zcmb2|=3sz;w|D*XqC+K)J)GQf>goUjk>Wd#0A5MiPTivh~JEtJTUxq%UsLQMq!~ z;JsOa!^(oFGrlSD`@jFFRLi>?KkJ3H`}`>F`gv0p%ln@@KK*cIv5`i+4FB`PL3Vre zp;j>5Iel=OJ;SZrx4*G7q-;9*x_HN1euft_eEBYvn^`*CzxjlrHhnVlm$`%l)=XT= zwL!UNxi!pSEOgm{K+77_ndYCSDl4?y!qko$jUE|9=)om2$}cqN=#4w zX7%o@{~O+zFMqna|NMUIJiY$qmtQx3dirITr2n(SmBw@L{AsODEwG!jx9av8@%=T| z&h*vKoYT8}^7QA2(?0E*xhK-*cS)7$ygvnhKP6d7&!5)3>HFoAdWGF*v;EIko)!)YbRW zKj_booAu)M?+RQ#6@P5RhR$aj^7p>$vWw{HuqVr2|&TDu*N4JPdRPoQt1z$HY-%2 za?hp!TWlL@_I%6ZW3cGP>y&{^ecHr-?b8(@VB3S)(-h=9AT% z*DReiM|b0g?LhwRxjE%=v6VOjP*U_CPljctxBX6(g*>o~>lb*3q&ZigG|D^uN{#)fRJ4WrbiSj|V z{<<&KAA+_5<^7DUHYdH3w)rI+^}}qZ&o_HXPP2+Hx%->1g~eTp%r2YmqqckY#Dr$| z`tQ9~mCKE0>KK9a-#aw@WQvOCK1HLMYi5CLbWxieIvM1s6DgarjD%F~3(WKh^L1-_ zBCRy} GCI$fh`Wkrv -- 2.39.5 From 8e8346864ef7297235195379a1f891f22f773dc2 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Fri, 30 Aug 2013 10:57:08 -0400 Subject: [PATCH 032/544] Fixed DungeonSchematic Modified DungeonSchematic to use the new link and dimension classes. --- .../dungeon/DungeonSchematic.java | 154 +++--------------- 1 file changed, 26 insertions(+), 128 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 4c0eb59..ecfb71a 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -14,19 +14,19 @@ import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import StevenDimDoors.mod_pocketDim.schematic.CompoundFilter; import StevenDimDoors.mod_pocketDim.schematic.InvalidSchematicException; import StevenDimDoors.mod_pocketDim.schematic.ReplacementFilter; import StevenDimDoors.mod_pocketDim.schematic.Schematic; import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; +import StevenDimDoors.mod_pocketDim.util.Point4D; public class DungeonSchematic extends Schematic { @@ -167,10 +167,10 @@ public class DungeonSchematic extends Schematic { return new DungeonSchematic(Schematic.copyFromWorld(world, x, y, z, width, height, length, doCompactBounds)); } - public void copyToWorld(World world, Point3D pocketCenter, int dungeonOrientation, int originDimID, int destDimID, boolean doDistortCoordinates) + public void copyToWorld(World world, Point3D pocketCenter, int dungeonOrientation, IDimLink entryLink) { //TODO: This function is an improvised solution so we can get the release moving. In the future, - //we should generalize block tranformations 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. //It might be easiest to support transformations using a WorldOperation @@ -222,10 +222,10 @@ public class DungeonSchematic extends Schematic { world.setBlockTileEntity(pocketPoint.getX(), pocketPoint.getY(), pocketPoint.getZ(), TileEntity.createAndLoadEntity(tileTag)); } - setUpDungeon(world, pocketCenter, turnAngle, originDimID, destDimID, doDistortCoordinates); + setUpDungeon(PocketManager.getDimensionData(world), world, pocketCenter, turnAngle, entryLink); } - private void setUpDungeon(World world, Point3D pocketCenter, int turnAngle, int originDimID, int destDimID, boolean doDistortCoordinates) + private void setUpDungeon(NewDimData dimension, World world, Point3D pocketCenter, int turnAngle, IDimLink entryLink) { //The following Random initialization code is based on code from ChunkProviderGenerate. //It makes our generation depend on the world seed. @@ -244,18 +244,18 @@ public class DungeonSchematic extends Schematic { filler.apply(world, minCorner, maxCorner); //Set up entrance door rift - setUpEntranceDoorLink(world, entranceDoorLocation, turnAngle, pocketCenter); + createEntranceReverseLink(dimension, pocketCenter, entryLink); //Set up link data for dimensional doors for (Point3D location : dimensionalDoorLocations) { - setUpDimensionalDoorLink(world, location, entranceDoorLocation, turnAngle, pocketCenter, originDimID, destDimID, doDistortCoordinates, random); + createDimensionalDoorLink(dimension, location, entranceDoorLocation, turnAngle, pocketCenter); } //Set up link data for exit door for (Point3D location : exitDoorLocations) { - setUpExitDoorLink(world, location, entranceDoorLocation, turnAngle, pocketCenter, originDimID, destDimID, random); + createExitDoorLink(dimension, location, entranceDoorLocation, turnAngle, pocketCenter); } //Remove end portal frames and spawn Monoliths @@ -290,130 +290,28 @@ public class DungeonSchematic extends Schematic { } } - private static void setUpEntranceDoorLink(World world, Point3D entrance, int rotation, Point3D pocketCenter) + private static void createEntranceReverseLink(NewDimData dimension, Point3D pocketCenter, IDimLink entryLink) { - //Set the orientation of the rift exit - Point3D entranceRiftLocation = entrance.clone(); - BlockRotator.transformPoint(entranceRiftLocation, entrance, rotation, pocketCenter); - NewLinkData sideLink = PocketManager.instance.getLinkDataFromCoords( - entranceRiftLocation.getX(), - entranceRiftLocation.getY(), - entranceRiftLocation.getZ(), - world); - sideLink.linkOrientation = world.getBlockMetadata( - entranceRiftLocation.getX(), - entranceRiftLocation.getY() - 1, - entranceRiftLocation.getZ()); + IDimLink link = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ()); + Point4D destination = link.source(); + link.setDestination(destination.getX(), destination.getY(), destination.getZ(), + PocketManager.getDimensionData(destination.getDimension())); } - private static void setUpExitDoorLink(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter, int originDimID, int destDimID, Random random) + private static void createExitDoorLink(NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) { - try - { - //TODO: Hax, remove this later - DDProperties properties = DDProperties.instance(); - - //Transform doorLocation to the pocket coordinate system. - Point3D location = point.clone(); - BlockRotator.transformPoint(location, entrance, rotation, pocketCenter); - int blockDirection = world.getBlockMetadata(location.getX(), location.getY() - 1, location.getZ()); - Point3D linkDestination = location.clone(); - - NewLinkData randomLink = PocketManager.instance.getRandomLinkData(false); - NewLinkData sideLink = new NewLinkData(destDimID, - PocketManager.instance.getDimData(originDimID).exitDimLink.destDimID, - location.getX(), - location.getY(), - location.getZ(), - linkDestination.getX(), - linkDestination.getY() + 1, - linkDestination.getZ(), - true, blockDirection); - - if (sideLink.destDimID == properties.LimboDimensionID) - { - sideLink.destDimID = 0; - } - else if ((random.nextBoolean() && randomLink != null)) - { - sideLink.destDimID = randomLink.locDimID; - } - sideLink.destYCoord = yCoordHelper.getFirstUncovered(sideLink.destDimID, linkDestination.getX(), linkDestination.getY(), linkDestination.getZ())-1; - - if (sideLink.destYCoord < 5) - { - sideLink.destYCoord = 70; - } - sideLink.linkOrientation = world.getBlockMetadata(linkDestination.getX(), linkDestination.getY() - 1, linkDestination.getZ()); - - PocketManager.instance.createLink(sideLink); - /**dimHelper.instance.createLink(sideLink.destDimID , - sideLink.locDimID, - sideLink.destXCoord, - sideLink.destYCoord, - sideLink.destZCoord, - sideLink.locXCoord, - sideLink.locYCoord, - sideLink.locZCoord, - BlockRotator.transformMetadata(sideLink.linkOrientation, 2, Block.doorWood.blockID)); - **/ - - if (world.getBlockId(linkDestination.getX(), linkDestination.getY() - 3, linkDestination.getZ()) == properties.FabricBlockID) - { - setBlockDirectly(world, linkDestination.getX(), linkDestination.getY() - 2, linkDestination.getZ(), Block.stoneBrick.blockID, 0); - } - else - { - setBlockDirectly(world,linkDestination.getX(), linkDestination.getY() - 2, linkDestination.getZ(), - world.getBlockId(linkDestination.getX(), linkDestination.getY() - 3, linkDestination.getZ()), - world.getBlockMetadata(linkDestination.getX(), linkDestination.getY() - 3, linkDestination.getZ())); - } - } - catch (Exception e) - { - e.printStackTrace(); - } - } - - private static void setUpDimensionalDoorLink(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter, int originDimID, int destDimID, boolean applyNoise, Random random) - { - int depth = PocketManager.instance.getDimDepth(originDimID) + 1; - int forwardNoise; - int sidewaysNoise; - - if (applyNoise) - { - forwardNoise = MathHelper.getRandomIntegerInRange(random, -50 * depth, 150 * depth); - sidewaysNoise = MathHelper.getRandomIntegerInRange(random, -10 * depth, 10 * depth); - } - else - { - forwardNoise = 0; - sidewaysNoise = 0; - } - - //Transform doorLocation to the pocket coordinate system + //Transform the door's location to the pocket coordinate system Point3D location = point.clone(); BlockRotator.transformPoint(location, entrance, rotation, pocketCenter); - int blockDirection = world.getBlockMetadata(location.getX(), location.getY() - 1, location.getZ()); - - //Rotate the link destination noise to point in the same direction as the door exit - //and add it to the door's location. Use EAST as the reference orientation since linkDestination - //is constructed as if pointing East. - Point3D linkDestination = new Point3D(forwardNoise, 0, sidewaysNoise); - Point3D zeroPoint = new Point3D(0, 0, 0); - BlockRotator.transformPoint(linkDestination, zeroPoint, blockDirection - BlockRotator.EAST_DOOR_METADATA, location); - - //Create the link between our current door and its intended exit in destination pocket - NewLinkData sideLink = new NewLinkData(destDimID, 0, - location.getX(), - location.getY(), - location.getZ(), - linkDestination.getX(), - linkDestination.getY() + 1, - linkDestination.getZ(), - true, blockDirection); - PocketManager.instance.createPocket(sideLink, true, true); + dimension.createLink(location.getX(), location.getY(), location.getZ()).setLinkType(IDimLink.TYPE_DUNGEON_EXIT); + } + + private static void createDimensionalDoorLink(NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) + { + //Transform the door's location to the pocket coordinate system + Point3D location = point.clone(); + BlockRotator.transformPoint(location, entrance, rotation, pocketCenter); + dimension.createLink(location.getX(), location.getY(), location.getZ()).setLinkType(IDimLink.TYPE_DUNGEON); } private static void spawnMonolith(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) -- 2.39.5 From 993006877554a20a6d7599486311c0eb4cf983f5 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Fri, 30 Aug 2013 16:27:27 -0400 Subject: [PATCH 033/544] Fixed PocketBuilder and More 1. Changed DungeonSchematic to use an external instance of Random rather than initializing its own. 2. Created the Pair class, a strongly-typed tuple that was needed in PocketBuilder. 3. Added a missing calculation in NewDimData for setting the packDepth field during dungeon initialization. 4. Finished code missing in PocketBuilder. Changes listed above were needed for this. --- .../mod_pocketDim/core/NewDimData.java | 34 ++++++ .../dungeon/DungeonSchematic.java | 16 +-- StevenDimDoors/mod_pocketDim/util/Pair.java | 26 +++++ .../mod_pocketDim/world/PocketBuilder.java | 100 ++++++++++-------- 4 files changed, 122 insertions(+), 54 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/util/Pair.java diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index 543ffba..f8c9941 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -9,6 +9,7 @@ import java.util.TreeMap; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; +import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.util.Point4D; public abstract class NewDimData implements Serializable @@ -460,6 +461,39 @@ public abstract class NewDimData implements Serializable this.origin = link.destination(); this.orientation = orientation; this.dungeon = dungeon; + this.packDepth = calculatePackDepth(parent, dungeon); + } + + private static int calculatePackDepth(NewDimData parent, DungeonData current) + { + DungeonData predecessor = parent.dungeon(); + if (current == null) + { + throw new IllegalArgumentException("current cannot be null."); + } + if (predecessor == null) + { + return 1; + } + + DungeonPack predOwner = predecessor.dungeonType().Owner; + DungeonPack currentOwner = current.dungeonType().Owner; + if (currentOwner == null) + { + return 1; + } + if (predOwner == null) + { + return 1; + } + if (predOwner == currentOwner) + { + return parent.packDepth + 1; + } + else + { + return 1; + } } public void initializePocket(int originX, int originY, int originZ, int orientation, IDimLink link) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index ecfb71a..ab6013a 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -167,15 +167,14 @@ public class DungeonSchematic extends Schematic { return new DungeonSchematic(Schematic.copyFromWorld(world, x, y, z, width, height, length, doCompactBounds)); } - public void copyToWorld(World world, Point3D pocketCenter, int dungeonOrientation, IDimLink entryLink) + public void copyToWorld(World world, Point3D pocketCenter, int dungeonOrientation, IDimLink entryLink, Random random) { //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, //then just use that support from DungeonSchematic instead of making this local fix. //It might be easiest to support transformations using a WorldOperation - final int turnAngle = dungeonOrientation - orientation; - + final int turnAngle = dungeonOrientation - orientation; int index; int count; @@ -222,18 +221,11 @@ public class DungeonSchematic extends Schematic { world.setBlockTileEntity(pocketPoint.getX(), pocketPoint.getY(), pocketPoint.getZ(), TileEntity.createAndLoadEntity(tileTag)); } - setUpDungeon(PocketManager.getDimensionData(world), world, pocketCenter, turnAngle, entryLink); + setUpDungeon(PocketManager.getDimensionData(world), world, pocketCenter, turnAngle, entryLink, random); } - private void setUpDungeon(NewDimData dimension, World world, Point3D pocketCenter, int turnAngle, IDimLink entryLink) + private void setUpDungeon(NewDimData dimension, World world, Point3D pocketCenter, int turnAngle, IDimLink entryLink, Random random) { - //The following Random initialization code is based on code from ChunkProviderGenerate. - //It makes our generation depend on the world seed. - Random random = new Random(world.getSeed()); - long factorA = random.nextLong() / 2L * 2L + 1L; - long factorB = random.nextLong() / 2L * 2L + 1L; - random.setSeed(pocketCenter.getX() * factorB + pocketCenter.getZ() * factorA ^ world.getSeed()); - //Transform dungeon corners Point3D minCorner = new Point3D(0, 0, 0); Point3D maxCorner = new Point3D(width - 1, height - 1, length - 1); diff --git a/StevenDimDoors/mod_pocketDim/util/Pair.java b/StevenDimDoors/mod_pocketDim/util/Pair.java new file mode 100644 index 0000000..7e5f341 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/util/Pair.java @@ -0,0 +1,26 @@ +package StevenDimDoors.mod_pocketDim.util; + +public class Pair +{ + //Pair is an implementation of a 2-tuple with generic parameters for strongly-typed elements. + //It's used instead of Minecraft's Tuple type because Tuple doesn't have strongly-typed elements. + + private P first; + private Q second; + + public Pair(P first, Q second) + { + this.first = first; + this.second = second; + } + + public P getFirst() + { + return first; + } + + public Q getSecond() + { + return second; + } +} diff --git a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index e880ce6..cc524fd 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -1,9 +1,9 @@ package StevenDimDoors.mod_pocketDim.world; -import java.util.HashMap; import java.util.Random; import net.minecraft.block.Block; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; @@ -19,6 +19,7 @@ import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; +import StevenDimDoors.mod_pocketDim.util.Pair; import StevenDimDoors.mod_pocketDim.util.Point4D; public class PocketBuilder @@ -35,25 +36,6 @@ public class PocketBuilder private PocketBuilder() { } - public static boolean initializeDestination(IDimLink link, DDProperties properties) - { - if (link.hasDestination()) - { - return true; - } - - //Check the destination type and respond accordingly - switch (link.linkType()) - { - case IDimLink.TYPE_DUNGEON: - return generateNewDungeonPocket(link, properties); - case IDimLink.TYPE_POCKET: - return generateNewPocket(link, properties); - default: - throw new IllegalArgumentException("link has an unrecognized link type."); - } - } - public static boolean generateNewDungeonPocket(IDimLink link, DDProperties properties) { if (link == null) @@ -93,31 +75,35 @@ public class PocketBuilder return false; } - /* This code is currently wrong. It's missing the following things: - * 1. Calculate the destination point for real. That includes adding door noise if needed. - * 2. Receive the DungeonData from selectDungeon() - * 3. The function signature for DungeonSchematic.copyToWorld() has to be rewritten. - */ - //Choose a dungeon to generate - DungeonSchematic schematic = selectDungeon(dimension, random, properties); - - if (schematic == null) + Pair pair = selectDungeon(dimension, random, properties); + if (pair == null) { System.err.println("Could not select a dungeon for generation!"); return false; } + DungeonData dungeon = pair.getFirst(); + DungeonSchematic schematic = pair.getSecond(); //Calculate the destination point + DungeonPackConfig packConfig = dungeon.dungeonType().Owner != null ? dungeon.dungeonType().Owner.getConfig() : null; Point4D source = link.source(); - int destinationY = yCoordHelper.adjustDestinationY(destination, world.getHeight(), schematic.getEntranceDoorLocation().getY(), schematic.getHeight()); - int orientation = getDestinationOrientation(source); - destination.setY(destinationY); + int orientation = getDoorOrientation(source, properties); + Point3D destination; + + if (packConfig != null && packConfig.doDistortDoorCoordinates()) + { + destination = calculateNoisyDestination(source, dimension, orientation); + } + else + { + destination = new Point3D(source.getX(), source.getY(), source.getZ()); + } + + destination.setY( yCoordHelper.adjustDestinationY(destination.getY(), world.getHeight(), schematic.getEntranceDoorLocation().getY(), schematic.getHeight()) ); //Generate the dungeon - DungeonPackConfig packConfig = dungeon.dungeonType().Owner != null ? dungeon.dungeonType().Owner.getConfig() : null; - - schematic.copyToWorld(world, link, packConfig.doDistortDoorCoordinates()); + schematic.copyToWorld(world, destination, orientation, link, random); //Finish up destination initialization dimension.initializePocket(destination.getX(), destination.getY(), destination.getZ(), orientation, link); @@ -131,7 +117,23 @@ public class PocketBuilder } } - private static DungeonSchematic selectDungeon(NewDimData dimension, Random random, DDProperties properties) + private static Point3D calculateNoisyDestination(Point4D source, NewDimData dimension, int orientation) + { + int depth = dimension.packDepth(); + int forwardNoise = MathHelper.getRandomIntegerInRange(random, -50 * depth, 150 * depth); + int sidewaysNoise = MathHelper.getRandomIntegerInRange(random, -10 * depth, 10 * depth); + + //Rotate the link destination noise to point in the same direction as the door exit + //and add it to the door's location. Use EAST as the reference orientation since linkDestination + //is constructed as if pointing East. + Point3D linkDestination = new Point3D(forwardNoise, 0, sidewaysNoise); + Point3D sourcePoint = new Point3D(source.getX(), source.getY(), source.getZ()); + Point3D zeroPoint = new Point3D(0, 0, 0); + BlockRotator.transformPoint(linkDestination, zeroPoint, orientation - BlockRotator.EAST_DOOR_METADATA, sourcePoint); + return linkDestination; + } + + private static Pair selectDungeon(NewDimData dimension, Random random, DDProperties properties) { //We assume the dimension doesn't have a dungeon assigned if (dimension.dungeon() != null) @@ -157,7 +159,6 @@ public class PocketBuilder { //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. - try { System.err.println("Loading the default error dungeon instead..."); @@ -170,7 +171,7 @@ public class PocketBuilder return null; } } - return schematic; + return new Pair(dungeon, schematic); } private static DungeonSchematic loadAndValidateDungeon(DungeonData dungeon, DDProperties properties) @@ -218,10 +219,25 @@ public class PocketBuilder return generateNewPocket(link, DEFAULT_POCKET_SIZE, DEFAULT_POCKET_WALL_THICKNESS, properties); } - private static int getDestinationOrientation(Point4D source) + private static int getDoorOrientation(Point4D source, DDProperties properties) { - // TODO Auto-generated method stub - return 0; + World world = DimensionManager.getWorld(source.getDimension()); + if (world == null) + { + throw new IllegalStateException("The link's source world should be loaded!"); + } + + //Check if the block at that point is actually a door + int blockID = world.getBlockId(source.getX(), source.getY(), source.getZ()); + if (blockID != properties.DimensionalDoorID && blockID != properties.WarpDoorID && + blockID != properties.TransientDoorID) + { + throw new IllegalStateException("The link's source is not a door block. It should be impossible to traverse a rift without a door!"); + } + + //Return the orientation portion of its metadata + int orientation = world.getBlockMetadata(source.getX(), source.getY(), source.getZ()) & 3; + return orientation; } public static boolean generateNewPocket(IDimLink link, int size, int wallThickness, DDProperties properties) @@ -283,7 +299,7 @@ public class PocketBuilder //Calculate the destination point Point4D source = link.source(); int destinationY = yCoordHelper.adjustDestinationY(source.getY(), world.getHeight(), wallThickness + 1, size); - int orientation = getDestinationOrientation(source); + int orientation = getDoorOrientation(source, properties); //Build the actual pocket area buildPocket(world, source.getX(), destinationY, source.getZ(), orientation, size, wallThickness, properties); -- 2.39.5 From 5cabd3762eb0e9da191b4dee010c9045d8384704 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 31 Aug 2013 07:39:52 -0400 Subject: [PATCH 034/544] More Progress on Rewrite Continued fixing things across various classes to make them work with our new core classes. --- .../mod_pocketDim/BlankTeleporter.java | 4 - .../mod_pocketDim/TransientDoor.java | 5 +- .../blocks/BlockDimWallPerm.java | 81 ++-- .../mod_pocketDim/blocks/dimDoor.java | 3 +- .../mod_pocketDim/core/PocketManager.java | 10 +- .../mod_pocketDim/helpers/DungeonHelper.java | 2 +- .../mod_pocketDim/helpers/yCoordHelper.java | 2 +- .../mod_pocketDim/items/ItemStableFabric.java | 173 +-------- .../mod_pocketDim/items/itemDimDoor.java | 347 +++++++++--------- .../mod_pocketDim/mod_pocketDim.java | 24 +- .../mod_pocketDim/schematic/BlockRotator.java | 4 +- .../mod_pocketDim/ticking/MobMonolith.java | 156 +++----- 12 files changed, 274 insertions(+), 537 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/BlankTeleporter.java b/StevenDimDoors/mod_pocketDim/BlankTeleporter.java index 99aea03..a066837 100644 --- a/StevenDimDoors/mod_pocketDim/BlankTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/BlankTeleporter.java @@ -1,11 +1,7 @@ package StevenDimDoors.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.PocketManager; import net.minecraft.entity.Entity; -import net.minecraft.entity.item.EntityMinecart; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.Teleporter; -import net.minecraft.world.World; import net.minecraft.world.WorldServer; public class BlankTeleporter extends Teleporter diff --git a/StevenDimDoors/mod_pocketDim/TransientDoor.java b/StevenDimDoors/mod_pocketDim/TransientDoor.java index a0a8fcd..7e02a31 100644 --- a/StevenDimDoors/mod_pocketDim/TransientDoor.java +++ b/StevenDimDoors/mod_pocketDim/TransientDoor.java @@ -78,10 +78,11 @@ public class TransientDoor extends ExitDoor IDimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); if (link != null) { - //Turn the transient door into a rift before teleporting the entity + DDTeleporter.traverseDimDoor(world, link, entity); + //Turn the transient door into a rift AFTER teleporting the entity. + //The door's orientation may be needed for generating a room at the link's destination. world.setBlock(x, y, z, properties.RiftBlockID); world.setBlockToAir(x, y - 1, z); - PocketManager.traverseDimDoor(world, link, entity); } } } diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java index da81b74..bdf14a9 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java @@ -8,16 +8,18 @@ import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.DDTeleporter; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.IDimLink; -import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; +import StevenDimDoors.mod_pocketDim.util.Point4D; public class BlockDimWallPerm extends Block { + private static final Random random = new Random(); private static DDProperties properties = null; public BlockDimWallPerm(int i, int j, Material par2Material) @@ -43,83 +45,50 @@ public class BlockDimWallPerm extends Block /** * Only matters if the player is in limbo, acts to teleport the player from limbo back to dim 0 */ - public void onEntityWalking(World par1World, int par2, int par3, int par4, Entity entity) + public void onEntityWalking(World world, int x, int y, int z, Entity entity) { - if (!par1World.isRemote && par1World.provider.dimensionId == properties.LimboDimensionID) + if (!world.isRemote && world.provider.dimensionId == properties.LimboDimensionID) { - Random rand = new Random(); - - IDimLink link = PocketManager.getRandomLinkData(false); - if (link == null) - { - link =new NewLinkData(0,0,0,0); - } - link.destDimID = 0; - link.locDimID = par1World.provider.dimensionId; World overworld = DimensionManager.getWorld(0); - - if (overworld == null) - { - DimensionManager.initDimension(0); - overworld = DimensionManager.getWorld(0); - } - if (overworld != null && entity instanceof EntityPlayerMP) { EntityPlayer player = (EntityPlayer) entity; player.fallDistance = 0; - int x = (link.destXCoord + rand.nextInt(properties.LimboReturnRange) - properties.LimboReturnRange/2); - int z = (link.destZCoord + rand.nextInt(properties.LimboReturnRange) - properties.LimboReturnRange/2); + int rangeLimit = properties.LimboReturnRange / 2; + int destinationX = x + MathHelper.getRandomIntegerInRange(random, -rangeLimit, rangeLimit); + int destinationZ = z + MathHelper.getRandomIntegerInRange(random, -rangeLimit, rangeLimit); //make sure I am in the middle of a chunk, and not on a boundary, so it doesn't load the chunk next to me - x = x + (x >> 4); - z = z + (z >> 4); + destinationX = destinationX + (destinationX >> 4); + destinationZ = destinationZ + (destinationZ >> 4); - int y = yCoordHelper.getFirstUncovered(0, x, 63, z, true); + int destinationY = yCoordHelper.getFirstUncovered(overworld, destinationX, 63, destinationZ, true); - player.setPositionAndUpdate( x, y, z ); - //this complicated chunk teleports the player back to the overworld at some random location. Looks funky becaue it has to load the chunk - link.destXCoord = x; - link.destYCoord = y; - link.destZCoord = z; - PocketManager.teleportEntity(par1World, player, link); + //FIXME: Shouldn't we make the player's destination safe BEFORE teleporting him?! + //player.setPositionAndUpdate( x, y, z ); + Point4D destination = new Point4D(destinationX, destinationY, destinationZ, 0); + DDTeleporter.teleport(player, destination); - player.setPositionAndUpdate( x, y, z ); + //player.setPositionAndUpdate( x, y, z ); // Make absolutely sure the player doesn't spawn inside blocks, though to be honest this shouldn't ever have to be a problem... - overworld.setBlockToAir(x, y, z); - overworld.setBlockToAir(x, y + 1, z); + overworld.setBlockToAir(destinationX, destinationY, destinationZ); + overworld.setBlockToAir(destinationX, destinationY + 1, destinationZ); - int i=x; - int j=y; - int k=z; - - for(int xc=-3;xc<4;xc++) + for (int xc = -3; xc < 4; xc++) { - for(int zc=-3;zc<4;zc++) + for (int zc = -3; zc < 4; zc++) { - for(int yc=0;yc<200;yc++) + if (Math.abs(xc) + Math.abs(zc) < random.nextInt(3) + 2 || + Math.abs(xc) + Math.abs(zc) < random.nextInt(3) + 3) { - if (yc==0) - { - if(Math.abs(xc)+Math.abs(zc) comboSave = new HashMap(); comboSave.put("dimensionData", dimensionData); comboSave.put("keyLinkMapping", keyLinkMapping); @@ -423,7 +421,7 @@ public class PocketManager * loads the dim data from the saved hashMap. Also handles compatibility with old saves, see OldSaveHandler * @return */ - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings("unchecked") public static void load() { //FIXME: There are a lot of things to fix here... First, we shouldn't be created so many File instances @@ -449,7 +447,7 @@ public class PocketManager } saveFile = new FileInputStream(dataStore); ObjectSaveInputStream save = new ObjectSaveInputStream(saveFile); - HashMap comboSave = ((HashMap) save.readObject()); + HashMap comboSave = (HashMap) save.readObject(); try { @@ -486,7 +484,7 @@ public class PocketManager saveFile = new FileInputStream(dataStore); ObjectSaveInputStream save = new ObjectSaveInputStream(saveFile); - HashMap comboSave =((HashMap)save.readObject()); + HashMap comboSave = (HashMap) save.readObject(); try { diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index ba65103..f7741ab 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -281,7 +281,7 @@ public class DungeonHelper IDimLink link = dimension.createLink(x, y + 1, z).setLinkType(IDimLink.TYPE_POCKET); //Place a Warp Door linked to that pocket - itemDimDoor.placeDoorBlock(world, x, y, z, 3, mod_pocketDim.ExitDoor); + itemDimDoor.placeDoorBlock(world, x, y, z, 3, mod_pocketDim.exitDoor); return link; } diff --git a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java index a083c03..1574634 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java @@ -22,7 +22,7 @@ public class yCoordHelper int localX = x < 0 ? (x % 16) + 16 : (x % 16); int localZ = z < 0 ? (z % 16) + 16 : (z % 16); - int height = MAXIMUM_UNCOVERED_Y; //world.getHeight(); + int height = MAXIMUM_UNCOVERED_Y; int y; if (!fromTop) diff --git a/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java b/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java index 3eb39d9..b12d8df 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java @@ -1,184 +1,19 @@ package StevenDimDoors.mod_pocketDim.items; -import java.util.List; - -import StevenDimDoors.mod_pocketDim.SchematicLoader; -import StevenDimDoors.mod_pocketDim.Spells; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler; -import StevenDimDoors.mod_pocketDimClient.ClientTickHandler; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import net.minecraftforge.common.ForgeDirection; -import net.minecraftforge.common.RotationHelper; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; public class ItemStableFabric extends Item { - private Material doorMaterial; - - public ItemStableFabric(int par1, int par2) + public ItemStableFabric(int itemID, int par2) { - super(par1); - // this.setitemIcon(Item.doorWood.getIconFromDamage(0)); + super(itemID); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - } + public void registerIcons(IconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); - - } - - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) - { - - if(!par3World.isRemote) - { - System.out.println("Block metadata is "+par3World.getBlockMetadata(par4, par5, par6)); - System.out.println(par3World.getBiomeGenForCoords(par4, par6).biomeName); - - - this.onItemRightClick(par1ItemStack, par3World, par2EntityPlayer); - - Block block = Block.blocksList[par3World.getBlockId(par4, par5, par6)]; - - if(PocketManager.dimList.containsKey(par3World.provider.dimensionId)) - { - if(PocketManager.instance.getDimData(par3World.provider.dimensionId).isPocket) - { - if(PocketManager.instance.getDimData(par3World.provider.dimensionId).dungeonGenerator!=null) - { - System.out.println("Dungeon name "+PocketManager.instance.getDimData(par3World.provider.dimensionId).dungeonGenerator.schematicPath); - - } - } - - } - - - - - } - //System.out.println("Block texture data is "+Block.blocksList[par3World.getBlockId(par4, par5, par6)].getBlockTexture(par3World,par4, par5, par6,par7).getIconName()); - //System.out.println("Block name is is "+Block.blocksList[par3World.getBlockId(par4, par5, par6)].getUnlocalizedName2()); - - return true; - } - - - public MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean par3) - { - float var4 = 1.0F; - float var5 = par2EntityPlayer.prevRotationPitch + (par2EntityPlayer.rotationPitch - par2EntityPlayer.prevRotationPitch) * var4; - float var6 = par2EntityPlayer.prevRotationYaw + (par2EntityPlayer.rotationYaw - par2EntityPlayer.prevRotationYaw) * var4; - double var7 = par2EntityPlayer.prevPosX + (par2EntityPlayer.posX - par2EntityPlayer.prevPosX) * (double)var4; - double var9 = par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * (double)var4 + 1.62D - (double)par2EntityPlayer.yOffset; - double var11 = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * (double)var4; - Vec3 var13 = par1World.getWorldVec3Pool().getVecFromPool(var7, var9, var11); - float var14 = MathHelper.cos(-var6 * 0.017453292F - (float)Math.PI); - float var15 = MathHelper.sin(-var6 * 0.017453292F - (float)Math.PI); - float var16 = -MathHelper.cos(-var5 * 0.017453292F); - float var17 = MathHelper.sin(-var5 * 0.017453292F); - float var18 = var15 * var16; - float var20 = var14 * var16; - double var21 = 5.0D; - if (par2EntityPlayer instanceof EntityPlayerMP) - { - var21 = 4; - } - Vec3 var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21); - return par1World.rayTraceBlocks_do_do(var13, var23, true, false); - } - - public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - if (this.isSteven(par3EntityPlayer)) - { - new Spells(par3EntityPlayer, par1ItemStack.stackSize).cast(); - //mod_pocketDim.proxy.startCasting(par3EntityPlayer, par1ItemStack.stackSize); - } - - Boolean didFindThing=false; - MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(par3EntityPlayer.worldObj, par3EntityPlayer, false ); - if(hit!=null&&!par2World.isRemote) - { - //if(par2World.getBlockId(hit.blockX, hit.blockY, hit.blockZ)==properties.RiftBlockID) - { - NewLinkData link = PocketManager.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); - if(link!=null) - { - Block var11; - if(par1ItemStack.getItem() instanceof itemExitDoor ) - { - var11 = mod_pocketDim.ExitDoor; - } - - else if(par1ItemStack.getItem() instanceof ItemChaosDoor ) - { - var11 = mod_pocketDim.chaosDoor; - } - else - { - var11 = mod_pocketDim.dimDoor; - } - - int par4 = hit.blockX; - int par5 = hit.blockY-1; - int par6 = hit.blockZ; - int par7 = 0 ; - - - - - if (par3EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack) && par3EntityPlayer.canPlayerEdit(par4, par5 + 1, par6, par7, par1ItemStack)&&!par2World.isRemote) - { - int var12 = MathHelper.floor_double((double)((par3EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; - String cardinal= "default"; - - switch(link.linkOrientation) - { - case 0: - cardinal = "East"; - break; - case 1: - cardinal = "South"; - break; - case 2: - cardinal = "West"; - break; - case 3: - cardinal = "North"; - break; - } - System.out.println("Link orientation is " + link.linkOrientation + " - " + cardinal); - } - } - } - } - return par1ItemStack; - } - - - public boolean isSteven(EntityPlayer player) - { - return (player.username.equalsIgnoreCase("stevenrs11")); - } - - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) - { - } } diff --git a/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java b/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java index f5668e3..6b9edce 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java @@ -15,194 +15,193 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; +import StevenDimDoors.mod_pocketDim.core.IDimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; public class itemDimDoor extends ItemDoor { private static DDProperties properties = null; - - public itemDimDoor(int par1, Material par2Material) - { - super(par1, par2Material); - this.setMaxStackSize(64); - this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - if (properties == null) - properties = DDProperties.instance(); - } - - public void registerIcons(IconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) + + public itemDimDoor(int par1, Material par2Material) + { + super(par1, par2Material); + this.setMaxStackSize(64); + this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); + if (properties == null) + properties = DDProperties.instance(); + } + + public void registerIcons(IconRegister par1IconRegister) + { + this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) @Override - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) - { - par3List.add("Place on the block under a rift"); - par3List.add("to activate that rift or place"); - par3List.add("anywhere else to create a"); - par3List.add("pocket dimension."); - } - - @Override - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) - { - if (par7 != 1) - { - return false; - } - else - { - ++par5; - Block var11; + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Place on the block under a rift"); + par3List.add("to activate that rift or place"); + par3List.add("anywhere else to create a"); + par3List.add("pocket dimension."); + } - - if(par1ItemStack.getItem() instanceof itemExitDoor ) - { - var11 = mod_pocketDim.ExitDoor; - } - - else if(par1ItemStack.getItem() instanceof ItemChaosDoor ) - { - var11 = mod_pocketDim.chaosDoor; - } - else - { - var11 = mod_pocketDim.dimDoor; - } - - if (par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack) && par2EntityPlayer.canPlayerEdit(par4, par5 + 1, par6, par7, par1ItemStack)&&!par3World.isRemote) - { - int var12 = MathHelper.floor_double((double)((par2EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; - - if (!canPlace(par3World, par4, par5, par6, var12) || !canPlace(par3World, par4, par5+1, par6, var12)) - { - return false; - } - else - { - int offset = 0; - int idBlock = par3World.getBlockId(par4, par5-1, par6); - - if(Block.blocksList.length>idBlock&&idBlock!=0) - { - if(Block.blocksList[idBlock].isBlockReplaceable(par3World, par4, par5-1, par6)) - { - offset = 1; - } - } - - placeDoorBlock(par3World, par4, par5-offset, par6, var12, var11); - - --par1ItemStack.stackSize; - return true; - } - } - else - { - return false; - } - } - } - - public MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean par3) - { - float var4 = 1.0F; - float var5 = par2EntityPlayer.prevRotationPitch + (par2EntityPlayer.rotationPitch - par2EntityPlayer.prevRotationPitch) * var4; - float var6 = par2EntityPlayer.prevRotationYaw + (par2EntityPlayer.rotationYaw - par2EntityPlayer.prevRotationYaw) * var4; - double var7 = par2EntityPlayer.prevPosX + (par2EntityPlayer.posX - par2EntityPlayer.prevPosX) * (double)var4; - double var9 = par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * (double)var4 + 1.62D - (double)par2EntityPlayer.yOffset; - double var11 = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * (double)var4; - Vec3 var13 = par1World.getWorldVec3Pool().getVecFromPool(var7, var9, var11); - float var14 = MathHelper.cos(-var6 * 0.017453292F - (float)Math.PI); - float var15 = MathHelper.sin(-var6 * 0.017453292F - (float)Math.PI); - float var16 = -MathHelper.cos(-var5 * 0.017453292F); - float var17 = MathHelper.sin(-var5 * 0.017453292F); - float var18 = var15 * var16; - float var20 = var14 * var16; - double var21 = 5.0D; - if (par2EntityPlayer instanceof EntityPlayerMP) - { - var21 = 4; - } - Vec3 var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21); - return par1World.rayTraceBlocks_do_do(var13, var23, true, false); - } - - public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(par3EntityPlayer.worldObj, par3EntityPlayer, false ); - if(hit!=null&&!par2World.isRemote) + @Override + public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) + { + if (par7 != 1) { - if(par2World.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) + return false; + } + else + { + ++par5; + Block var11; + + + if(par1ItemStack.getItem() instanceof itemExitDoor) { - NewLinkData link = PocketManager.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); - if(link!=null) + var11 = mod_pocketDim.exitDoor; + } + + else if (par1ItemStack.getItem() instanceof ItemChaosDoor) + { + var11 = mod_pocketDim.unstableDoor; + } + else if (par1ItemStack.getItem() instanceof itemDimDoor) + { + var11 = mod_pocketDim.dimensionalDoor; + } + else + { + //Do nothing + return false; + } + + if (par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack) && par2EntityPlayer.canPlayerEdit(par4, par5 + 1, par6, par7, par1ItemStack)&&!par3World.isRemote) + { + int var12 = MathHelper.floor_double((double)((par2EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; + + if (!canPlace(par3World, par4, par5, par6) || !canPlace(par3World, par4, par5+1, par6)) { - Block var11; - if(par1ItemStack.getItem() instanceof itemExitDoor ) - { - var11 = mod_pocketDim.ExitDoor; - } - - else if(par1ItemStack.getItem() instanceof ItemChaosDoor ) - { - var11 = mod_pocketDim.chaosDoor; - } - else - { - var11 = mod_pocketDim.dimDoor; - } - - int par4 = hit.blockX; - int par5 = hit.blockY; - int par6 = hit.blockZ; - int par7 = 0 ; - - - + return false; + } + else + { + int offset = 0; + int idBlock = par3World.getBlockId(par4, par5-1, par6); - if (par3EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack) && par3EntityPlayer.canPlayerEdit(par4, par5 + 1, par6, par7, par1ItemStack)&&!par2World.isRemote) - { - int var12 = MathHelper.floor_double((double)((par3EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; + if(Block.blocksList.length>idBlock&&idBlock!=0) + { + if(Block.blocksList[idBlock].isBlockReplaceable(par3World, par4, par5-1, par6)) + { + offset = 1; + } + } - if (!canPlace(par2World, par4, par5, par6, var12) || !canPlace(par2World, par4, par5-1, par6, var12) || - PocketManager.instance.getLinkDataFromCoords(par4, par5, par6, par2World) == null) - { - return par1ItemStack; - } - else - { - placeDoorBlock(par2World, par4, par5-1, par6, var12, var11); - - --par1ItemStack.stackSize; - - } - } + placeDoorBlock(par3World, par4, par5-offset, par6, var12, var11); + + --par1ItemStack.stackSize; + return true; + } + } + else + { + return false; + } + } + } + + public MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean par3) + { + float var4 = 1.0F; + float var5 = par2EntityPlayer.prevRotationPitch + (par2EntityPlayer.rotationPitch - par2EntityPlayer.prevRotationPitch) * var4; + float var6 = par2EntityPlayer.prevRotationYaw + (par2EntityPlayer.rotationYaw - par2EntityPlayer.prevRotationYaw) * var4; + double var7 = par2EntityPlayer.prevPosX + (par2EntityPlayer.posX - par2EntityPlayer.prevPosX) * (double)var4; + double var9 = par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * (double)var4 + 1.62D - (double)par2EntityPlayer.yOffset; + double var11 = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * (double)var4; + Vec3 var13 = par1World.getWorldVec3Pool().getVecFromPool(var7, var9, var11); + float var14 = MathHelper.cos(-var6 * 0.017453292F - (float)Math.PI); + float var15 = MathHelper.sin(-var6 * 0.017453292F - (float)Math.PI); + float var16 = -MathHelper.cos(-var5 * 0.017453292F); + float var17 = MathHelper.sin(-var5 * 0.017453292F); + float var18 = var15 * var16; + float var20 = var14 * var16; + double var21 = 5.0D; + if (par2EntityPlayer instanceof EntityPlayerMP) + { + var21 = 4; + } + Vec3 var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21); + return par1World.rayTraceBlocks_do_do(var13, var23, true, false); + } + + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + { + if (world.isRemote) + { + return stack; + } + + MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(player.worldObj, player, false ); + if (hit != null) + { + if (world.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) + { + IDimLink link = PocketManager.getLink(hit.blockX, hit.blockY, hit.blockZ, world.provider.dimensionId); + if (link != null) + { + Block block; + if (stack.getItem() instanceof itemExitDoor) + { + block = mod_pocketDim.exitDoor; + } + else if (stack.getItem() instanceof ItemChaosDoor) + { + block = mod_pocketDim.unstableDoor; + } + else if (stack.getItem() instanceof itemDimDoor) + { + block = mod_pocketDim.dimensionalDoor; + } + else + { + //Do nothing + return stack; + } + + int x = hit.blockX; + int y = hit.blockY; + int z = hit.blockZ; + int par7 = 0; + + if (player.canPlayerEdit(x, y, z, par7, stack) && player.canPlayerEdit(x, y - 1, z, par7, stack)) + { + int orientation = MathHelper.floor_double((double) ((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; + + if (!canPlace(world, x, y, z) || !canPlace(world, x, y - 1, z)) + { + return stack; + } + else + { + placeDoorBlock(world, x, y - 1, z, orientation, block); + if (!player.capabilities.isCreativeMode) + { + stack.stackSize--; + } + } + } } } } - - return par1ItemStack; - - } - - public static boolean canPlace(World world,int i, int j, int k, int p) - { - int id = world.getBlockId(i, j, k); - - boolean flag = true; - if (id==properties.FabricBlockID || id==properties.RiftBlockID || id==properties.PermaFabricBlockID || id == 0) - { - return true; - } + return stack; + } - if (id != 0 && !Block.blocksList[id].blockMaterial.isReplaceable()) - { - flag = false; - } - return flag; - } + private static boolean canPlace(World world, int x, int y, int z) + { + int id = world.getBlockId(x, y, z); + + return (id == properties.RiftBlockID || id == 0 || Block.blocksList[id].blockMaterial.isReplaceable()); + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 0ac2b10..7ef8f78 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -101,10 +101,10 @@ public class mod_pocketDim public static mod_pocketDim instance = new mod_pocketDim(); public static Block transientDoor; - public static Block ExitDoor; - public static Block chaosDoor; + public static Block exitDoor; + public static Block unstableDoor; public static Block blockLimbo; - public static Block dimDoor; + public static Block dimensionalDoor; public static Block blockDimWall; public static Block dimHatch; public static Block blockDimWallPerm; @@ -184,11 +184,11 @@ public class mod_pocketDim blockDimWall = (new BlockDimWall(properties.FabricBlockID, 0, Material.iron)).setLightValue(1.0F).setHardness(0.1F).setUnlocalizedName("blockDimWall"); blockDimWallPerm = (new BlockDimWallPerm(properties.PermaFabricBlockID, 0, Material.iron)).setLightValue(1.0F).setBlockUnbreakable().setResistance(6000000.0F).setUnlocalizedName("blockDimWallPerm"); - ExitDoor = (new ExitDoor(properties.WarpDoorID, Material.wood)).setHardness(1.0F) .setUnlocalizedName("dimDoorWarp"); + exitDoor = (new ExitDoor(properties.WarpDoorID, Material.wood)).setHardness(1.0F) .setUnlocalizedName("dimDoorWarp"); blockRift = (BlockRift) (new BlockRift(properties.RiftBlockID, 0, Material.air, properties).setHardness(1.0F) .setUnlocalizedName("rift")); blockLimbo = (new BlockLimbo(properties.LimboBlockID, 15, Material.iron, properties.LimboDimensionID, decay).setHardness(.2F).setUnlocalizedName("BlockLimbo").setLightValue(.0F)); - chaosDoor = (new ChaosDoor(properties.UnstableDoorID, Material.iron).setHardness(.2F).setUnlocalizedName("chaosDoor").setLightValue(.0F) ); - dimDoor = (new dimDoor(properties.DimensionalDoorID, Material.iron)).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor"); + unstableDoor = (new ChaosDoor(properties.UnstableDoorID, Material.iron).setHardness(.2F).setUnlocalizedName("chaosDoor").setLightValue(.0F) ); + dimensionalDoor = (new dimDoor(properties.DimensionalDoorID, Material.iron)).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor"); dimHatch = (new dimHatch(properties.TransTrapdoorID, 84, Material.iron)).setHardness(1.0F) .setUnlocalizedName("dimHatch"); // dimRail = (new DimRail(dimRailID, 88, false)).setHardness(.5F) .setUnlocalizedName("dimRail"); @@ -206,11 +206,11 @@ public class mod_pocketDim GameRegistry.registerWorldGenerator(mod_pocketDim.riftGen); - GameRegistry.registerBlock(chaosDoor, "Unstable Door"); - GameRegistry.registerBlock(ExitDoor, "Warp Door"); + GameRegistry.registerBlock(unstableDoor, "Unstable Door"); + GameRegistry.registerBlock(exitDoor, "Warp Door"); GameRegistry.registerBlock(blockRift, "Rift"); GameRegistry.registerBlock(blockLimbo, "Unraveled Fabric"); - GameRegistry.registerBlock(dimDoor, "Dimensional Door"); + GameRegistry.registerBlock(dimensionalDoor, "Dimensional Door"); GameRegistry.registerBlock(dimHatch,"Transdimensional Trapdoor"); GameRegistry.registerBlock(blockDimWallPerm, "Fabric of RealityPerm"); GameRegistry.registerBlock(transientDoor, "transientDoor"); @@ -226,11 +226,11 @@ public class mod_pocketDim LanguageRegistry.addName(transientDoor , "transientDoor"); LanguageRegistry.addName(blockRift , "Rift"); LanguageRegistry.addName(blockLimbo , "Unraveled Fabric"); - LanguageRegistry.addName(ExitDoor , "Warp Door"); - LanguageRegistry.addName(chaosDoor , "Unstable Door"); + LanguageRegistry.addName(exitDoor , "Warp Door"); + LanguageRegistry.addName(unstableDoor , "Unstable Door"); LanguageRegistry.addName(blockDimWall , "Fabric of Reality"); LanguageRegistry.addName(blockDimWallPerm , "Eternal Fabric"); - LanguageRegistry.addName(dimDoor, "Dimensional Door"); + LanguageRegistry.addName(dimensionalDoor, "Dimensional Door"); LanguageRegistry.addName(dimHatch, "Transdimensional Trapdoor"); LanguageRegistry.addName(itemExitDoor, "Warp Door"); diff --git a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java index d086d2d..dfc4a21 100644 --- a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java +++ b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java @@ -64,8 +64,8 @@ public class BlockRotator hasOrientations[Block.railActivator.blockID] = true; hasOrientations[Block.rail.blockID] = true; - hasOrientations[mod_pocketDim.dimDoor.blockID] = true; - hasOrientations[mod_pocketDim.ExitDoor.blockID] = true; + hasOrientations[mod_pocketDim.dimensionalDoor.blockID] = true; + hasOrientations[mod_pocketDim.exitDoor.blockID] = true; } diff --git a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index d102596..f2e8ab3 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -13,8 +13,8 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.DDTeleporter; +import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.world.LimboProvider; import StevenDimDoors.mod_pocketDim.world.PocketProvider; @@ -24,7 +24,7 @@ public class MobMonolith extends EntityFlying implements IMob float soundTime = 0; int aggro = 0; byte textureState = 0; - + float scaleFactor = 0; int aggroMax; int destX=0; @@ -86,16 +86,14 @@ public class MobMonolith extends EntityFlying implements IMob @Override public void onEntityUpdate() { - if(!(this.worldObj.provider instanceof LimboProvider ||this.worldObj.provider instanceof PocketProvider)) + if (!(this.worldObj.provider instanceof LimboProvider || this.worldObj.provider instanceof PocketProvider)) { this.setDead(); } - + byte b0 = this.dataWatcher.getWatchableObjectByte(16); this.texture="/mods/DimDoors/textures/mobs/Monolith"+b0+".png"; - - super.onEntityUpdate(); if (this.isEntityAlive() && this.isEntityInsideOpaqueBlock()) @@ -103,12 +101,9 @@ public class MobMonolith extends EntityFlying implements IMob this.setDead(); } - - - EntityPlayer entityPlayer = this.worldObj.getClosestPlayerToEntity(this, 30); - if(entityPlayer != null) + if (entityPlayer != null) { if(this.soundTime<=0) { @@ -116,83 +111,57 @@ public class MobMonolith extends EntityFlying implements IMob this.soundTime=100; } - - this.faceEntity(entityPlayer, 1, 1); - if(shouldAttackPlayer(entityPlayer)) + if (shouldAttackPlayer(entityPlayer)) { - { - - } - if(aggro<470) + if (aggro<470) { - if(rand.nextInt(11)>this.textureState||this.aggro>=300||rand.nextInt(13)>this.textureState&&this.aggroMax>this.aggro) + if (rand.nextInt(11)>this.textureState||this.aggro>=300||rand.nextInt(13)>this.textureState&&this.aggroMax>this.aggro) { aggro++; } - - - if(this.worldObj.provider instanceof PocketProvider||this.worldObj.getClosestPlayerToEntity(this, 5)!=null) + if (this.worldObj.provider instanceof PocketProvider||this.worldObj.getClosestPlayerToEntity(this, 5)!=null) { - aggro++; aggro++; - if(rand.nextBoolean()) + if (rand.nextBoolean()) { aggro++; } } - if(aggro>430&&this.soundTime<100) + if (aggro>430&&this.soundTime<100) { - //this.worldObj.playSoundAtEntity(entityPlayer,"mods.DimDoors.sfx.tearing",2, 1); this.worldObj.playSoundEffect(entityPlayer.posX, entityPlayer.posY, entityPlayer.posZ,"mods.DimDoors.sfx.tearing",2F, 1F); - this.soundTime=100; - } - if(aggro>445&&this.soundTime<200) + if (aggro>445&&this.soundTime<200) { - //this.worldObj.playSoundAtEntity(entityPlayer,"mods.DimDoors.sfx.tearing",5, 1); this.worldObj.playSoundEffect(entityPlayer.posX, entityPlayer.posY, entityPlayer.posZ,"mods.DimDoors.sfx.tearing",5F, 1F); - this.soundTime=200; } - - - } - else if(!this.worldObj.isRemote&&!entityPlayer.capabilities.isCreativeMode) + else if (!this.worldObj.isRemote && !entityPlayer.capabilities.isCreativeMode) { - - - - - - NewLinkData link = new NewLinkData(this.worldObj.provider.dimensionId, properties.LimboDimensionID, (int)this.posX, (int)this.posY, (int)this.posZ, (int)this.posX+rand.nextInt(500)-250, (int)this.posY+500, (int)this.posZ+rand.nextInt(500)-250, false,0); - - PocketManager.instance.traverseDimDoor(worldObj, link, entityPlayer); - this.aggro=0; + Point4D destination = new Point4D( + (int) this.posX + MathHelper.getRandomIntegerInRange(rand, -250, 250), + (int) this.posY + 500, + (int) this.posZ + MathHelper.getRandomIntegerInRange(rand, -250, 250), + properties.LimboDimensionID); + DDTeleporter.teleport(worldObj, destination, entityPlayer); + this.aggro = 0; entityPlayer.worldObj.playSoundAtEntity(entityPlayer,"mods.DimDoors.sfx.crack",13, 1); - - - - } - if(!(this.worldObj.provider instanceof LimboProvider || this.worldObj.getClosestPlayerToEntity(this, 5)!=null)||this.aggro>300) + if (!(this.worldObj.provider instanceof LimboProvider || this.worldObj.getClosestPlayerToEntity(this, 5) != null) || this.aggro > 300) { - for (int i = 0; i < -1+this.textureState/2; ++i) { entityPlayer.worldObj.spawnParticle("portal", entityPlayer.posX + (this.rand.nextDouble() - 0.5D) * (double)this.width, entityPlayer.posY + this.rand.nextDouble() * (double)entityPlayer.height - 0.75D, entityPlayer.posZ + (this.rand.nextDouble() - 0.5D) * (double)entityPlayer.width, (this.rand.nextDouble() - 0.5D) * 2.0D, -this.rand.nextDouble(), (this.rand.nextDouble() - 0.5D) * 2.0D); } } - - - } else { @@ -205,12 +174,9 @@ public class MobMonolith extends EntityFlying implements IMob } } - - } else { - if(aggro>0) { aggro--; @@ -221,44 +187,23 @@ public class MobMonolith extends EntityFlying implements IMob } } } - if(soundTime>=0) + if (soundTime>=0) { soundTime--; } - - - - { - - - - - } - - this.textureState= (byte) (this.aggro/25); - if(!this.worldObj.isRemote) + if (!this.worldObj.isRemote) { - this.dataWatcher.updateObject(16, Byte.valueOf(this.textureState)); } - - - - - - } - + private boolean shouldAttackPlayer(EntityPlayer par1EntityPlayer) { return par1EntityPlayer.canEntityBeSeen(this); - } - - private boolean isCourseTraversable(double par1, double par3, double par5, double par7) { double d4 = (par1 - this.posX) / par7; @@ -275,9 +220,9 @@ public class MobMonolith extends EntityFlying implements IMob return false; } } - return true; } + public boolean attackEntityFrom(DamageSource par1DamageSource, int par2) { if(!(par1DamageSource==DamageSource.inWall)) @@ -286,6 +231,7 @@ public class MobMonolith extends EntityFlying implements IMob } return false; } + public void faceEntity(Entity par1Entity, float par2, float par3) { double d0 = par1Entity.posX - this.posX; @@ -311,7 +257,6 @@ public class MobMonolith extends EntityFlying implements IMob this.rotationYaw = f2; this.rotationYawHead=f2; this.renderYawOffset=this.rotationYaw; - } private float updateRotation(float par1, float par2, float par3) @@ -336,8 +281,6 @@ public class MobMonolith extends EntityFlying implements IMob return 0.0F; } - - public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) { super.writeEntityToNBT(par1NBTTagCompound); @@ -346,9 +289,8 @@ public class MobMonolith extends EntityFlying implements IMob par1NBTTagCompound.setInteger("aggroMax", this.aggroMax); par1NBTTagCompound.setByte("textureState", this.textureState); par1NBTTagCompound.setFloat("scaleFactor", this.scaleFactor); - } - + @Override public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) { @@ -358,31 +300,27 @@ public class MobMonolith extends EntityFlying implements IMob this.aggroMax = par1NBTTagCompound.getInteger("aggroMax"); this.textureState = par1NBTTagCompound.getByte("textureState"); this.scaleFactor = par1NBTTagCompound.getFloat("scaleFactor"); - } - public boolean getCanSpawnHere() - { - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this,AxisAlignedBB.getBoundingBox( this.posX-15, posY-4, this.posZ-15, this.posX+15, this.posY+15, this.posZ+15)); - - if(this.worldObj.provider.dimensionId==DDProperties.instance().LimboDimensionID) - { - if(list.size()>0) - { - return false; - } - - } - else if(this.worldObj.provider instanceof PocketProvider) - { - if(list.size()>5||this.worldObj.canBlockSeeTheSky((int)this.posX, (int)this.posY, (int)this.posZ)) - { - return false; - } - } - return this.worldObj.checkNoEntityCollision(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() && !this.worldObj.isAnyLiquid(this.boundingBox); - } + public boolean getCanSpawnHere() + { + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, AxisAlignedBB.getBoundingBox( this.posX-15, posY-4, this.posZ-15, this.posX+15, this.posY+15, this.posZ+15)); + if(this.worldObj.provider.dimensionId==DDProperties.instance().LimboDimensionID) + { + if(list.size()>0) + { + return false; + } - + } + else if(this.worldObj.provider instanceof PocketProvider) + { + if(list.size()>5||this.worldObj.canBlockSeeTheSky((int)this.posX, (int)this.posY, (int)this.posZ)) + { + return false; + } + } + return this.worldObj.checkNoEntityCollision(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() && !this.worldObj.isAnyLiquid(this.boundingBox); + } } \ No newline at end of file -- 2.39.5 From d9056e551fdc6f185f773936e923d0dea9f15c28 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 31 Aug 2013 12:58:35 -0400 Subject: [PATCH 035/544] More Progress on Rewrite Continued fixing things across various classes to make them work with our new core classes. I've also cleaned up indentation and random code snippets along the way. --- .../mod_pocketDim/ConnectionHandler.java | 40 +-- .../mod_pocketDim/PacketHandler.java | 2 +- .../mod_pocketDim/blocks/dimDoor.java | 2 +- .../mod_pocketDim/items/ItemRiftBlade.java | 3 - .../items/ItemStabilizedRiftSignature.java | 46 ++- .../items/itemLinkSignature.java | 11 +- .../mod_pocketDim/items/itemRiftRemover.java | 85 +---- .../mod_pocketDim/mod_pocketDim.java | 4 +- .../ticking/LimboGatewayGenerator.java | 26 -- .../mod_pocketDim/ticking/MobMonolith.java | 2 +- .../mod_pocketDim/world/LimboGenerator.java | 31 +- .../mod_pocketDimClient/ClosingRiftFX.java | 305 +++++++++-------- .../mod_pocketDimClient/GoggleRiftFX.java | 312 +++++++++--------- .../mod_pocketDimClient/RenderDimDoor.java | 4 +- 14 files changed, 357 insertions(+), 516 deletions(-) delete mode 100644 StevenDimDoors/mod_pocketDim/ticking/LimboGatewayGenerator.java diff --git a/StevenDimDoors/mod_pocketDim/ConnectionHandler.java b/StevenDimDoors/mod_pocketDim/ConnectionHandler.java index 0d0c9fd..7b855a5 100644 --- a/StevenDimDoors/mod_pocketDim/ConnectionHandler.java +++ b/StevenDimDoors/mod_pocketDim/ConnectionHandler.java @@ -1,11 +1,5 @@ package StevenDimDoors.mod_pocketDim; -import java.util.ArrayList; -import java.util.Collection; - -import StevenDimDoors.mod_pocketDim.core.NewDimData; -import StevenDimDoors.mod_pocketDim.core.PocketManager; - import net.minecraft.network.INetworkManager; import net.minecraft.network.NetLoginHandler; import net.minecraft.network.packet.NetHandler; @@ -14,45 +8,25 @@ import net.minecraft.server.MinecraftServer; import cpw.mods.fml.common.network.IConnectionHandler; import cpw.mods.fml.common.network.Player; -public class ConnectionHandler implements IConnectionHandler +public class ConnectionHandler implements IConnectionHandler { - private static boolean connected = false; - private static DDProperties properties = null; - - //sends a packet to clients containing all the information about the dims and links. Lots of packets, actually. @Override public String connectionReceived(NetLoginHandler netHandler, INetworkManager manager) { - if (properties == null) - properties = DDProperties.instance(); - - PacketHandler.onClientJoinPacket(manager, PocketManager.dimList); - PacketHandler.onDimCreatedPacket(new NewDimData(properties.LimboDimensionID, false, 0, 0, 0, 0, 0)); + //Sends a packet to the client containing all the information about the dimensions and links. + //Lots of packets, actually. + PacketHandler.sendClientJoinPacket(manager); return null; } @Override - public void connectionOpened(NetHandler netClientHandler, String server,int port, INetworkManager manager) - { - connected = true; - } - + public void connectionOpened(NetHandler netClientHandler, String server, int port, INetworkManager manager) { } + @Override public void connectionOpened(NetHandler netClientHandler,MinecraftServer server, INetworkManager manager) { } @Override - public void connectionClosed(INetworkManager manager) - { - if (connected) - { - System.out.println("Clearing dim cache"); - PocketManager.instance.save(); - PocketManager.instance.unregsisterDims(); - PocketManager.dimList.clear(); - - } - connected = false; - } + public void connectionClosed(INetworkManager manager) { } @Override public void clientLoggedIn(NetHandler clientHandler, INetworkManager manager, Packet1Login login) { } diff --git a/StevenDimDoors/mod_pocketDim/PacketHandler.java b/StevenDimDoors/mod_pocketDim/PacketHandler.java index 2c5c18b..192b4a6 100644 --- a/StevenDimDoors/mod_pocketDim/PacketHandler.java +++ b/StevenDimDoors/mod_pocketDim/PacketHandler.java @@ -126,7 +126,7 @@ public class PacketHandler implements IPacketHandler } - public static void onClientJoinPacket(INetworkManager manager, HashMap dimList) + public static void sendClientJoinPacket(INetworkManager manager) { Collection dimIDs= dimList.keySet(); Collection dimDataSet= dimList.values(); diff --git a/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java index 9344b59..e8a6319 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java @@ -200,7 +200,7 @@ public class dimDoor extends BlockContainer public dimDoor updateAttachedTile(World world, int x, int y, int z) { TileEntity tile = world.getBlockTileEntity(x, y, z); - if (tile instanceof TileEntityDimDoor ) + if (tile instanceof TileEntityDimDoor) { TileEntityDimDoor dimTile = (TileEntityDimDoor) tile; dimTile.openOrClosed = PocketManager.getLink(x, y, z, world.provider.dimensionId) != null; diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index f8340f5..25847dd 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -5,14 +5,12 @@ import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.EnumAction; import net.minecraft.item.EnumToolMaterial; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraft.util.AxisAlignedBB; @@ -22,7 +20,6 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java index 5933e56..01113d0 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java @@ -2,20 +2,16 @@ package StevenDimDoors.mod_pocketDim.items; import java.util.List; -import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewLinkData; -import StevenDimDoors.mod_pocketDim.core.PocketManager; - import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -29,7 +25,7 @@ public class ItemStabilizedRiftSignature extends itemLinkSignature this.setMaxStackSize(1); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); this.setMaxDamage(0); - this.hasSubtypes=true; + this.hasSubtypes = true; if (properties == null) properties = DDProperties.instance(); } @@ -69,19 +65,19 @@ public class ItemStabilizedRiftSignature extends itemLinkSignature { boolean hasEnder = false; // checks to see if the item has a link stored, if so, it creates it - if(par2EntityPlayer.inventory.hasItem(Item.enderPearl.itemID)||par2EntityPlayer.inventory.hasItem(properties.StableFabricItemID)) + if (par2EntityPlayer.inventory.hasItem(Item.enderPearl.itemID)||par2EntityPlayer.inventory.hasItem(properties.StableFabricItemID)) { - if(!par2EntityPlayer.inventory.consumeInventoryItem(properties.StableFabricItemID)) + if (!par2EntityPlayer.inventory.consumeInventoryItem(properties.StableFabricItemID)) { par2EntityPlayer.inventory.consumeInventoryItem(Item.enderPearl.itemID); } hasEnder=true; } - if(par3World.getBlockId(par4, par5, par6)==Block.snow.blockID) + if (par3World.getBlockId(par4, par5, par6)==Block.snow.blockID) { offset = 1; } - if(hasEnder&&!par3World.isRemote) + if (hasEnder&&!par3World.isRemote) { if(PocketManager.instance.getLinkDataFromCoords(linkCoords[0], linkCoords[1], linkCoords[2], par3World)==null) { @@ -92,20 +88,20 @@ public class ItemStabilizedRiftSignature extends itemLinkSignature par2EntityPlayer.sendChatToPlayer("Rift Created"); } - else if(!par3World.isRemote) + else if (!par3World.isRemote) { par2EntityPlayer.sendChatToPlayer("No Ender Pearls!"); } } } - else if(!par3World.isRemote) + else if (!par3World.isRemote) { if(par3World.getBlockId(par4, par5, par6)==Block.snow.blockID) { offset = 1; } //otherwise, it creates the first half of the link. Next click will complete it. - key= PocketManager.instance.createUniqueInterDimLinkKey(); + key = PocketManager.instance.createUniqueInterDimLinkKey(); this.writeToNBT(par1ItemStack, par4, par5+offset, par6,par3World.provider.dimensionId); par2EntityPlayer.worldObj.playSoundAtEntity(par2EntityPlayer,"mods.DimDoors.sfx.riftStart", (float) .6, 1); @@ -114,28 +110,28 @@ public class ItemStabilizedRiftSignature extends itemLinkSignature return true; } - @SideOnly(Side.CLIENT) - + /** * allows items to add custom lines of information to the mouseover description */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @SideOnly(Side.CLIENT) + @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - if(par1ItemStack.hasTagCompound()) + if (par1ItemStack.hasTagCompound()) { - if(par1ItemStack.stackTagCompound.getBoolean("isCreated")) + if (par1ItemStack.stackTagCompound.getBoolean("isCreated")) { Integer[] coords = this.readFromNBT(par1ItemStack); - par3List.add(String.valueOf("Leads to dim "+coords[3] +" with depth "+PocketManager.instance.getDimDepth(PocketManager.instance.getDimDepth(coords[3])))); - par3List.add("at x="+coords[0]+" y="+coords[1]+" z="+coords[2]); + par3List.add("Leads to (" + coords[0] + ", " + coords[1] + ", " + coords[2] + ") at dimension #" + coords[3]); } } else { - par3List.add("First click stores location,"); - par3List.add ("second click creates two rifts,"); - par3List.add("that link the first location"); - par3List.add("with the second location"); + par3List.add("First click stores a location,"); + par3List.add("second click creates two rifts"); + par3List.add("that link the locations together."); } } diff --git a/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java b/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java index 0c19ba8..4a0538a 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java @@ -2,22 +2,17 @@ package StevenDimDoors.mod_pocketDim.items; import java.util.List; -import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.NewDimData; -import StevenDimDoors.mod_pocketDim.core.ILinkData; -import StevenDimDoors.mod_pocketDim.core.PocketManager; - import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java index 4058789..02e8ed3 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java +++ b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java @@ -2,12 +2,8 @@ package StevenDimDoors.mod_pocketDim.items; import java.util.List; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.PocketManager; - import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; @@ -16,40 +12,25 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class itemRiftRemover extends Item { - private Material doorMaterial; - public itemRiftRemover(int par1, Material par2Material) { super(par1); this.setMaxStackSize(1); - // this.setTextureFile("/PocketBlockTextures.png"); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - - // this.itemIcon=6; this.setMaxDamage(5); - this.hasSubtypes=true; - //TODO move to proxy + this.hasSubtypes = true; } - public void registerIcons(IconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()); - - } - - @SideOnly(Side.CLIENT) - @Override - public boolean hasEffect(ItemStack par1ItemStack) - { - // adds effect if item has a link stored - - return false; } public static MovingObjectPosition getBlockTarget(World par1World, EntityPlayer par2EntityPlayer, boolean par3) @@ -78,59 +59,27 @@ public class itemRiftRemover extends Item public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { - { - MovingObjectPosition hit = this.getBlockTarget(par3EntityPlayer.worldObj, par3EntityPlayer, false ); - if(hit!=null) - { - //System.out.println(hit.hitVec); - if(PocketManager.instance.removeRift(par2World, hit.blockX, hit.blockY, hit.blockZ, 1, par3EntityPlayer, par1ItemStack)) - { - par3EntityPlayer.worldObj.playSoundAtEntity(par3EntityPlayer,"mods.DimDoors.sfx.riftClose", (float) .8, 1); - - } - - } - // dimHelper.removeRift( par3World, par4, par5, par6, range, par2EntityPlayer, par1ItemStack); - - - } + MovingObjectPosition hit = getBlockTarget(par3EntityPlayer.worldObj, par3EntityPlayer, false); + if (hit != null) + { + if (PocketManager.removeRift(par2World, hit.blockX, hit.blockY, hit.blockZ, 1, par3EntityPlayer, par1ItemStack)) + { + par3EntityPlayer.worldObj.playSoundAtEntity(par3EntityPlayer,"mods.DimDoors.sfx.riftClose", 0.8f, 1); + } + } return par1ItemStack; } - - - @SideOnly(Side.CLIENT) - /** * allows items to add custom lines of information to the mouseover description */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + @SideOnly(Side.CLIENT) @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - - - par3List.add("Use near exposed rift"); - par3List.add ("to remove it and"); - par3List.add("any nearby rifts"); - - - - - } - @Override - public void onCreated(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - if(!par2World.isRemote) - { - /** - //creates the first half of the link on item creation - int key= dimHelper.instance.createUniqueInterDimLinkKey(); - LinkData linkData= new LinkData(par2World.provider.dimensionId,MathHelper.floor_double(par3EntityPlayer.posX),MathHelper.floor_double(par3EntityPlayer.posY),MathHelper.floor_double(par3EntityPlayer.posZ)); - System.out.println(key); - - dimHelper.instance.interDimLinkList.put(key, linkData); - par1ItemStack.setItemDamage(key); - **/ - } - } + par3List.add("Use near exposed rift"); + par3List.add("to remove it and"); + par3List.add("any nearby rifts."); + } } diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 7ef8f78..390bb86 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -104,7 +104,7 @@ public class mod_pocketDim public static Block exitDoor; public static Block unstableDoor; public static Block blockLimbo; - public static Block dimensionalDoor; + public static dimDoor dimensionalDoor; public static Block blockDimWall; public static Block dimHatch; public static Block blockDimWallPerm; @@ -188,7 +188,7 @@ public class mod_pocketDim blockRift = (BlockRift) (new BlockRift(properties.RiftBlockID, 0, Material.air, properties).setHardness(1.0F) .setUnlocalizedName("rift")); blockLimbo = (new BlockLimbo(properties.LimboBlockID, 15, Material.iron, properties.LimboDimensionID, decay).setHardness(.2F).setUnlocalizedName("BlockLimbo").setLightValue(.0F)); unstableDoor = (new ChaosDoor(properties.UnstableDoorID, Material.iron).setHardness(.2F).setUnlocalizedName("chaosDoor").setLightValue(.0F) ); - dimensionalDoor = (new dimDoor(properties.DimensionalDoorID, Material.iron)).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor"); + dimensionalDoor = (dimDoor) (new dimDoor(properties.DimensionalDoorID, Material.iron)).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor"); dimHatch = (new dimHatch(properties.TransTrapdoorID, 84, Material.iron)).setHardness(1.0F) .setUnlocalizedName("dimHatch"); // dimRail = (new DimRail(dimRailID, 88, false)).setHardness(.5F) .setUnlocalizedName("dimRail"); diff --git a/StevenDimDoors/mod_pocketDim/ticking/LimboGatewayGenerator.java b/StevenDimDoors/mod_pocketDim/ticking/LimboGatewayGenerator.java deleted file mode 100644 index 3908bc9..0000000 --- a/StevenDimDoors/mod_pocketDim/ticking/LimboGatewayGenerator.java +++ /dev/null @@ -1,26 +0,0 @@ -package StevenDimDoors.mod_pocketDim.ticking; - -import java.util.ArrayList; -import java.util.Random; - -import net.minecraft.entity.Entity; -import net.minecraft.server.MinecraftServer; -import net.minecraft.world.GameRules; -import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.core.NewDimData; -import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; -import StevenDimDoors.mod_pocketDim.util.ChunkLocation; - -public class LimboGatewayGenerator implements IRegularTickReceiver -{ - - @Override - public void notifyTick() - { - - - } - -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index f2e8ab3..e983edf 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -150,7 +150,7 @@ public class MobMonolith extends EntityFlying implements IMob (int) this.posY + 500, (int) this.posZ + MathHelper.getRandomIntegerInRange(rand, -250, 250), properties.LimboDimensionID); - DDTeleporter.teleport(worldObj, destination, entityPlayer); + DDTeleporter.teleport(entityPlayer, destination); this.aggro = 0; entityPlayer.worldObj.playSoundAtEntity(entityPlayer,"mods.DimDoors.sfx.crack",13, 1); diff --git a/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java b/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java index 9ea9aa3..33a754f 100644 --- a/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java +++ b/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java @@ -12,18 +12,12 @@ import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.ChunkProviderGenerate; -import net.minecraft.world.gen.MapGenBase; -import net.minecraft.world.gen.MapGenRavine; import net.minecraft.world.gen.NoiseGeneratorOctaves; import net.minecraft.world.gen.feature.MapGenScatteredFeature; -import net.minecraft.world.gen.structure.MapGenMineshaft; -import net.minecraft.world.gen.structure.MapGenStronghold; -import net.minecraft.world.gen.structure.MapGenVillage; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.Event.Result; import net.minecraftforge.event.terraingen.ChunkProviderEvent; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler; import StevenDimDoors.mod_pocketDim.ticking.MonolithSpawner; public class LimboGenerator extends ChunkProviderGenerate implements IChunkProvider @@ -46,8 +40,6 @@ public class LimboGenerator extends ChunkProviderGenerate implements IChunkProvi public NoiseGeneratorOctaves noiseGen5; public World world; - private final byte[] field_82700_c = new byte[256]; - private final byte[] field_82698_d = new byte[256]; /** A NoiseGeneratorOctaves used in generating terrain */ public NoiseGeneratorOctaves noiseGen6; @@ -56,27 +48,11 @@ public class LimboGenerator extends ChunkProviderGenerate implements IChunkProvi /** Reference to the World object. */ private World worldObj; - /** are map structures going to be generated (e.g. strongholds) */ - private final boolean mapFeaturesEnabled = false; - /** Holds the overall noise array used in chunk generation */ private double[] noiseArray; - private double[] stoneNoise = new double[256]; - private MapGenBase caveGenerator = new CustomCaveGen(); - - /** Holds Stronghold Generator */ - private MapGenStronghold strongholdGenerator = new MapGenStronghold(); - - /** Holds Village Generator */ - private MapGenVillage villageGenerator = new MapGenVillage(); - - /** Holds Mineshaft Generator */ - private MapGenMineshaft mineshaftGenerator = new MapGenMineshaft(); + private MapGenScatteredFeature scatteredFeatureGenerator = new MapGenScatteredFeature(); - /** Holds ravine generator */ - private MapGenBase ravineGenerator = new MapGenRavine(); - /** The biomes that are used to generate the chunk */ private BiomeGenBase[] biomesForGeneration = new BiomeGenBase[1]; @@ -137,10 +113,11 @@ public class LimboGenerator extends ChunkProviderGenerate implements IChunkProvi } @Override - public boolean chunkExists(int var1, int var2) { - // TODO Auto-generated method stub + public boolean chunkExists(int var1, int var2) + { return super.chunkExists(var1, var2); } + @Override public void replaceBlocksForBiome(int par1, int par2, byte[] par3ArrayOfByte, BiomeGenBase[] par4ArrayOfBiomeGenBase) { diff --git a/StevenDimDoors/mod_pocketDimClient/ClosingRiftFX.java b/StevenDimDoors/mod_pocketDimClient/ClosingRiftFX.java index 416b3fe..d252ba8 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClosingRiftFX.java +++ b/StevenDimDoors/mod_pocketDimClient/ClosingRiftFX.java @@ -12,181 +12,172 @@ import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class ClosingRiftFX extends EntityFX { - private int field_92049_a = 160; - private boolean field_92054_ax; - private boolean field_92048_ay; - private final EffectRenderer field_92047_az; - private float field_92050_aA; - private float field_92051_aB; - private float field_92052_aC; - private boolean field_92053_aD; + private int field_92049_a = 160; + private boolean field_92054_ax; + private boolean field_92048_ay; + private final EffectRenderer field_92047_az; + private float field_92050_aA; + private float field_92051_aB; + private float field_92052_aC; + private boolean field_92053_aD; - public ClosingRiftFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12, EffectRenderer par14EffectRenderer) - { - - super(par1World, par2, par4, par6); - this.motionX = par8; - this.motionY = par10; - this.motionZ = par12; - this.field_92047_az = par14EffectRenderer; - this.particleScale *= .55F; - this.particleMaxAge = 30 + this.rand.nextInt(16); - this.noClip = false; - } + public ClosingRiftFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12, EffectRenderer par14EffectRenderer) + { - public void func_92045_e(boolean par1) - { - this.field_92054_ax = par1; - } + super(par1World, par2, par4, par6); + this.motionX = par8; + this.motionY = par10; + this.motionZ = par12; + this.field_92047_az = par14EffectRenderer; + this.particleScale *= .55F; + this.particleMaxAge = 30 + this.rand.nextInt(16); + this.noClip = false; + } - public void func_92043_f(boolean par1) - { - this.field_92048_ay = par1; - } + public void func_92045_e(boolean par1) + { + this.field_92054_ax = par1; + } - public void func_92044_a(int par1) - { - float var2 = (float)((par1 & 16711680) >> 16) / 255.0F; - float var3 = (float)((par1 & 65280) >> 8) / 255.0F; - float var4 = (float)((par1 & 255) >> 0) / 255.0F; - float var5 = 1.0F; - this.setRBGColorF(var2 * var5, var3 * var5, var4 * var5); - } + public void func_92043_f(boolean par1) + { + this.field_92048_ay = par1; + } - public void func_92046_g(int par1) - { - this.field_92050_aA = (float)((par1 & 16711680) >> 16) / 255.0F; - this.field_92051_aB = (float)((par1 & 65280) >> 8) / 255.0F; - this.field_92052_aC = (float)((par1 & 255) >> 0) / 255.0F; - this.field_92053_aD = true; - } + public void func_92044_a(int par1) + { + float var2 = (float)((par1 & 16711680) >> 16) / 255.0F; + float var3 = (float)((par1 & 65280) >> 8) / 255.0F; + float var4 = (float)((par1 & 255) >> 0) / 255.0F; + float var5 = 1.0F; + this.setRBGColorF(var2 * var5, var3 * var5, var4 * var5); + } - /** -* returns the bounding box for this entity -*/ - public AxisAlignedBB getBoundingBox() - { - return null; - } + public void func_92046_g(int par1) + { + this.field_92050_aA = (float)((par1 & 16711680) >> 16) / 255.0F; + this.field_92051_aB = (float)((par1 & 65280) >> 8) / 255.0F; + this.field_92052_aC = (float)((par1 & 255) >> 0) / 255.0F; + this.field_92053_aD = true; + } - /** -* Returns true if this entity should push and be pushed by other entities when colliding. -*/ - public boolean canBePushed() - { - return false; - } + /** + * returns the bounding box for this entity + */ + public AxisAlignedBB getBoundingBox() + { + return null; + } - public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) - { - if (!this.field_92048_ay || this.particleAge < this.particleMaxAge / 3 || (this.particleAge + this.particleMaxAge) / 3 % 2 == 0) - { - this.doRenderParticle(par1Tessellator, par2, par3, par4, par5, par6, par7); - } - } - - public void doRenderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) - { - float var8 = (float)(super.particleTextureIndexX % 16) / 16.0F; - float var9 = var8 + 0.0624375F; - float var10 = (float)(this.particleTextureIndexX / 16) / 16.0F; - float var11 = var10 + 0.0624375F; - float var12 = 0.1F * this.particleScale; - float var13 = (float)(this.prevPosX + (this.posX - this.prevPosX) * (double)par2 - interpPosX); - float var14 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)par2 - interpPosY); - float var15 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)par2 - interpPosZ); - float var16 = .8F; - try - { - if(PocketManager.instance.getDimData(this.worldObj.provider.dimensionId).isPocket) - { - var16=.4F; - } - else - { - - } - } - catch(Exception E) - { - - } - par1Tessellator.setColorRGBA_F(this.particleRed * var16, this.particleGreen * var16, this.particleBlue * var16, (float) .7); + /** + * Returns true if this entity should push and be pushed by other entities when colliding. + */ + public boolean canBePushed() + { + return false; + } - par1Tessellator.addVertexWithUV((double)(var13 - par3 * var12 - par6 * var12), (double)(var14 - par4 * var12), (double)(var15 - par5 * var12 - par7 * var12), (double)var9, (double)var11); - par1Tessellator.addVertexWithUV((double)(var13 - par3 * var12 + par6 * var12), (double)(var14 + par4 * var12), (double)(var15 - par5 * var12 + par7 * var12), (double)var9, (double)var10); - par1Tessellator.addVertexWithUV((double)(var13 + par3 * var12 + par6 * var12), (double)(var14 + par4 * var12), (double)(var15 + par5 * var12 + par7 * var12), (double)var8, (double)var10); - par1Tessellator.addVertexWithUV((double)(var13 + par3 * var12 - par6 * var12), (double)(var14 - par4 * var12), (double)(var15 + par5 * var12 - par7 * var12), (double)var8, (double)var11); - } + public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) + { + if (!this.field_92048_ay || this.particleAge < this.particleMaxAge / 3 || (this.particleAge + this.particleMaxAge) / 3 % 2 == 0) + { + this.doRenderParticle(par1Tessellator, par2, par3, par4, par5, par6, par7); + } + } - /** -* Called to update the entity's position/logic. -*/ - public void onUpdate() - { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; + public void doRenderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) + { + float var8 = (float)(super.particleTextureIndexX % 16) / 16.0F; + float var9 = var8 + 0.0624375F; + float var10 = (float)(this.particleTextureIndexX / 16) / 16.0F; + float var11 = var10 + 0.0624375F; + float var12 = 0.1F * this.particleScale; + float var13 = (float)(this.prevPosX + (this.posX - this.prevPosX) * (double)par2 - interpPosX); + float var14 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)par2 - interpPosY); + float var15 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)par2 - interpPosZ); + float var16 = 0.8F; - if (this.particleAge++ >= this.particleMaxAge) - { - this.setDead(); - } + if (PocketManager.getDimensionData(worldObj).isPocketDimension()) + { + var16 = 0.4F; + } + + par1Tessellator.setColorRGBA_F(this.particleRed * var16, this.particleGreen * var16, this.particleBlue * var16, (float) .7); - if (this.particleAge > this.particleMaxAge / 2) - { - this.setAlphaF(1.0F - ((float)this.particleAge - (float)(this.particleMaxAge / 2)) / (float)this.particleMaxAge); + par1Tessellator.addVertexWithUV((double)(var13 - par3 * var12 - par6 * var12), (double)(var14 - par4 * var12), (double)(var15 - par5 * var12 - par7 * var12), (double)var9, (double)var11); + par1Tessellator.addVertexWithUV((double)(var13 - par3 * var12 + par6 * var12), (double)(var14 + par4 * var12), (double)(var15 - par5 * var12 + par7 * var12), (double)var9, (double)var10); + par1Tessellator.addVertexWithUV((double)(var13 + par3 * var12 + par6 * var12), (double)(var14 + par4 * var12), (double)(var15 + par5 * var12 + par7 * var12), (double)var8, (double)var10); + par1Tessellator.addVertexWithUV((double)(var13 + par3 * var12 - par6 * var12), (double)(var14 - par4 * var12), (double)(var15 + par5 * var12 - par7 * var12), (double)var8, (double)var11); + } - if (this.field_92053_aD) - { - this.particleRed += (this.field_92050_aA - this.particleRed) * 0.2F; - this.particleGreen += (this.field_92051_aB - this.particleGreen) * 0.2F; - this.particleBlue += (this.field_92052_aC - this.particleBlue) * 0.2F; - } - } + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() + { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; - this.setParticleTextureIndex(this.field_92049_a + (7 - this.particleAge * 8 / this.particleMaxAge)); - // this.motionY -= 0.004D; - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.9100000262260437D; - this.motionY *= 0.9100000262260437D; - this.motionZ *= 0.9100000262260437D; + if (this.particleAge++ >= this.particleMaxAge) + { + this.setDead(); + } - if (this.onGround) - { - this.motionX *= 0.699999988079071D; - this.motionZ *= 0.699999988079071D; - } + if (this.particleAge > this.particleMaxAge / 2) + { + this.setAlphaF(1.0F - ((float)this.particleAge - (float)(this.particleMaxAge / 2)) / (float)this.particleMaxAge); - if (this.field_92054_ax && this.particleAge < this.particleMaxAge / 2 && (this.particleAge + this.particleMaxAge) % 2 == 0) - { - ClosingRiftFX var1 = new ClosingRiftFX(this.worldObj, this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D, this.field_92047_az); - var1.setRBGColorF(this.particleRed, this.particleGreen, this.particleBlue); - var1.particleAge = var1.particleMaxAge / 2; + if (this.field_92053_aD) + { + this.particleRed += (this.field_92050_aA - this.particleRed) * 0.2F; + this.particleGreen += (this.field_92051_aB - this.particleGreen) * 0.2F; + this.particleBlue += (this.field_92052_aC - this.particleBlue) * 0.2F; + } + } - if (this.field_92053_aD) - { - var1.field_92053_aD = true; - var1.field_92050_aA = this.field_92050_aA; - var1.field_92051_aB = this.field_92051_aB; - var1.field_92052_aC = this.field_92052_aC; - } + this.setParticleTextureIndex(this.field_92049_a + (7 - this.particleAge * 8 / this.particleMaxAge)); + // this.motionY -= 0.004D; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.9100000262260437D; + this.motionY *= 0.9100000262260437D; + this.motionZ *= 0.9100000262260437D; - var1.field_92048_ay = this.field_92048_ay; - this.field_92047_az.addEffect(var1); - } - } + if (this.onGround) + { + this.motionX *= 0.699999988079071D; + this.motionZ *= 0.699999988079071D; + } - public int getBrightnessForRender(float par1) - { - return 15728880; - } + if (this.field_92054_ax && this.particleAge < this.particleMaxAge / 2 && (this.particleAge + this.particleMaxAge) % 2 == 0) + { + ClosingRiftFX var1 = new ClosingRiftFX(this.worldObj, this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D, this.field_92047_az); + var1.setRBGColorF(this.particleRed, this.particleGreen, this.particleBlue); + var1.particleAge = var1.particleMaxAge / 2; - /** -* Gets how bright this entity is. -*/ - public float getBrightness(float par1) - { - return 1.0F; - } + if (this.field_92053_aD) + { + var1.field_92053_aD = true; + var1.field_92050_aA = this.field_92050_aA; + var1.field_92051_aB = this.field_92051_aB; + var1.field_92052_aC = this.field_92052_aC; + } + + var1.field_92048_ay = this.field_92048_ay; + this.field_92047_az.addEffect(var1); + } + } + + public int getBrightnessForRender(float par1) + { + return 15728880; + } + + /** + * Gets how bright this entity is. + */ + public float getBrightness(float par1) + { + return 1.0F; + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java b/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java index 0a8eb72..2f8999f 100644 --- a/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java +++ b/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java @@ -1,195 +1,185 @@ package StevenDimDoors.mod_pocketDimClient; -import StevenDimDoors.mod_pocketDim.core.PocketManager; import net.minecraft.client.particle.EffectRenderer; -import net.minecraft.client.particle.EntityFX; import net.minecraft.client.particle.EntityFireworkSparkFX; import net.minecraft.client.renderer.Tessellator; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class GoggleRiftFX extends EntityFireworkSparkFX { - private int field_92049_a = 160; - private boolean field_92054_ax; - private boolean field_92048_ay; - private final EffectRenderer field_92047_az; - private float field_92050_aA; - private float field_92051_aB; - private float field_92052_aC; - private boolean field_92053_aD; + private int field_92049_a = 160; + private boolean field_92054_ax; + private boolean field_92048_ay; + private final EffectRenderer field_92047_az; + private float field_92050_aA; + private float field_92051_aB; + private float field_92052_aC; + private boolean field_92053_aD; - public GoggleRiftFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12, EffectRenderer par14EffectRenderer) - { - - super(par1World, par2, par4, par6, par12, par12, par12, par14EffectRenderer); - this.motionX = par8; - this.motionY = par10; - this.motionZ = par12; - this.field_92047_az = par14EffectRenderer; - this.particleScale *= .55F; - this.particleMaxAge = 30 + this.rand.nextInt(16); - this.noClip = false; - } - public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) - { - if (!this.field_92048_ay || this.particleAge < this.particleMaxAge / 3 || (this.particleAge + this.particleMaxAge) / 3 % 2 == 0) - { - this.doRenderParticle(par1Tessellator, par2, par3, par4, par5, par6, par7); - } - } - - public void doRenderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) - { - float var8 = (float)(super.particleTextureIndexX % 16) / 16.0F; - float var9 = var8 + 0.0624375F; - float var10 = (float)(this.particleTextureIndexX / 16) / 16.0F; - float var11 = var10 + 0.0624375F; - float var12 = 0.1F * this.particleScale; - float var13 = (float)(this.prevPosX + (this.posX - this.prevPosX) * (double)par2 - interpPosX); - float var14 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)par2 - interpPosY); - float var15 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)par2 - interpPosZ); - float var16 = .0F; - try - { - if(PocketManager.instance.getDimData(this.worldObj.provider.dimensionId).isPocket) - { - var16=.7F; - } - else - { - - } - } - catch(Exception E) - { - - } - par1Tessellator.setColorRGBA_F(this.particleRed * var16, this.particleGreen * var16, this.particleBlue * var16, (float) .7); + public GoggleRiftFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12, EffectRenderer par14EffectRenderer) + { - par1Tessellator.addVertexWithUV((double)(var13 - par3 * var12 - par6 * var12), (double)(var14 - par4 * var12), (double)(var15 - par5 * var12 - par7 * var12), (double)var9, (double)var11); - par1Tessellator.addVertexWithUV((double)(var13 - par3 * var12 + par6 * var12), (double)(var14 + par4 * var12), (double)(var15 - par5 * var12 + par7 * var12), (double)var9, (double)var10); - par1Tessellator.addVertexWithUV((double)(var13 + par3 * var12 + par6 * var12), (double)(var14 + par4 * var12), (double)(var15 + par5 * var12 + par7 * var12), (double)var8, (double)var10); - par1Tessellator.addVertexWithUV((double)(var13 + par3 * var12 - par6 * var12), (double)(var14 - par4 * var12), (double)(var15 + par5 * var12 - par7 * var12), (double)var8, (double)var11); - } + super(par1World, par2, par4, par6, par12, par12, par12, par14EffectRenderer); + this.motionX = par8; + this.motionY = par10; + this.motionZ = par12; + this.field_92047_az = par14EffectRenderer; + this.particleScale *= .55F; + this.particleMaxAge = 30 + this.rand.nextInt(16); + this.noClip = false; + } + public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) + { + if (!this.field_92048_ay || this.particleAge < this.particleMaxAge / 3 || (this.particleAge + this.particleMaxAge) / 3 % 2 == 0) + { + this.doRenderParticle(par1Tessellator, par2, par3, par4, par5, par6, par7); + } + } + + public void doRenderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) + { + float var8 = (float)(super.particleTextureIndexX % 16) / 16.0F; + float var9 = var8 + 0.0624375F; + float var10 = (float)(this.particleTextureIndexX / 16) / 16.0F; + float var11 = var10 + 0.0624375F; + float var12 = 0.1F * this.particleScale; + float var13 = (float)(this.prevPosX + (this.posX - this.prevPosX) * (double)par2 - interpPosX); + float var14 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)par2 - interpPosY); + float var15 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)par2 - interpPosZ); + float var16 = .0F; + + if (PocketManager.getDimensionData(worldObj).isPocketDimension()) + { + var16 = .7F; + } + + par1Tessellator.setColorRGBA_F(this.particleRed * var16, this.particleGreen * var16, this.particleBlue * var16, (float) .7); + + par1Tessellator.addVertexWithUV((double)(var13 - par3 * var12 - par6 * var12), (double)(var14 - par4 * var12), (double)(var15 - par5 * var12 - par7 * var12), (double)var9, (double)var11); + par1Tessellator.addVertexWithUV((double)(var13 - par3 * var12 + par6 * var12), (double)(var14 + par4 * var12), (double)(var15 - par5 * var12 + par7 * var12), (double)var9, (double)var10); + par1Tessellator.addVertexWithUV((double)(var13 + par3 * var12 + par6 * var12), (double)(var14 + par4 * var12), (double)(var15 + par5 * var12 + par7 * var12), (double)var8, (double)var10); + par1Tessellator.addVertexWithUV((double)(var13 + par3 * var12 - par6 * var12), (double)(var14 - par4 * var12), (double)(var15 + par5 * var12 - par7 * var12), (double)var8, (double)var11); + } - public void func_92045_e(boolean par1) - { - this.field_92054_ax = par1; - } + public void func_92045_e(boolean par1) + { + this.field_92054_ax = par1; + } - public void func_92043_f(boolean par1) - { - this.field_92048_ay = par1; - } + public void func_92043_f(boolean par1) + { + this.field_92048_ay = par1; + } - public void func_92044_a(int par1) - { - float var2 = (float)((par1 & 16711680) >> 16) / 255.0F; - float var3 = (float)((par1 & 65280) >> 8) / 255.0F; - float var4 = (float)((par1 & 255) >> 0) / 255.0F; - float var5 = 1.0F; - this.setRBGColorF(var2 * var5, var3 * var5, var4 * var5); - } + public void func_92044_a(int par1) + { + float var2 = (float)((par1 & 16711680) >> 16) / 255.0F; + float var3 = (float)((par1 & 65280) >> 8) / 255.0F; + float var4 = (float)((par1 & 255) >> 0) / 255.0F; + float var5 = 1.0F; + this.setRBGColorF(var2 * var5, var3 * var5, var4 * var5); + } - public void func_92046_g(int par1) - { - this.field_92050_aA = (float)((par1 & 16711680) >> 16) / 255.0F; - this.field_92051_aB = (float)((par1 & 65280) >> 8) / 255.0F; - this.field_92052_aC = (float)((par1 & 255) >> 0) / 255.0F; - this.field_92053_aD = true; - } + public void func_92046_g(int par1) + { + this.field_92050_aA = (float)((par1 & 16711680) >> 16) / 255.0F; + this.field_92051_aB = (float)((par1 & 65280) >> 8) / 255.0F; + this.field_92052_aC = (float)((par1 & 255) >> 0) / 255.0F; + this.field_92053_aD = true; + } - /** - * returns the bounding box for this entity - */ - public AxisAlignedBB getBoundingBox() - { - return null; - } + /** + * returns the bounding box for this entity + */ + public AxisAlignedBB getBoundingBox() + { + return null; + } - /** - * Returns true if this entity should push and be pushed by other entities when colliding. - */ - public boolean canBePushed() - { - return false; - } + /** + * Returns true if this entity should push and be pushed by other entities when colliding. + */ + public boolean canBePushed() + { + return false; + } - - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - if (this.particleAge++ >= this.particleMaxAge) - { - this.setDead(); - } - if (this.particleAge > this.particleMaxAge / 2) - { - this.setAlphaF(1.0F - ((float)this.particleAge - (float)(this.particleMaxAge / 2)) / (float)this.particleMaxAge); + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() + { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; - if (this.field_92053_aD) - { - this.particleRed += (this.field_92050_aA - this.particleRed) * 0.2F; - this.particleGreen += (this.field_92051_aB - this.particleGreen) * 0.2F; - this.particleBlue += (this.field_92052_aC - this.particleBlue) * 0.2F; - } - } + if (this.particleAge++ >= this.particleMaxAge) + { + this.setDead(); + } - this.setParticleTextureIndex(this.field_92049_a + (7 - this.particleAge * 8 / this.particleMaxAge)); - // this.motionY -= 0.004D; - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.9100000262260437D; - this.motionY *= 0.9100000262260437D; - this.motionZ *= 0.9100000262260437D; + if (this.particleAge > this.particleMaxAge / 2) + { + this.setAlphaF(1.0F - ((float)this.particleAge - (float)(this.particleMaxAge / 2)) / (float)this.particleMaxAge); - if (this.onGround) - { - this.motionX *= 0.699999988079071D; - this.motionZ *= 0.699999988079071D; - } + if (this.field_92053_aD) + { + this.particleRed += (this.field_92050_aA - this.particleRed) * 0.2F; + this.particleGreen += (this.field_92051_aB - this.particleGreen) * 0.2F; + this.particleBlue += (this.field_92052_aC - this.particleBlue) * 0.2F; + } + } - if (this.field_92054_ax && this.particleAge < this.particleMaxAge / 2 && (this.particleAge + this.particleMaxAge) % 2 == 0) - { - GoggleRiftFX var1 = new GoggleRiftFX(this.worldObj, this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D, this.field_92047_az); - var1.setRBGColorF(this.particleRed, this.particleGreen, this.particleBlue); - var1.particleAge = var1.particleMaxAge / 2; + this.setParticleTextureIndex(this.field_92049_a + (7 - this.particleAge * 8 / this.particleMaxAge)); + // this.motionY -= 0.004D; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.9100000262260437D; + this.motionY *= 0.9100000262260437D; + this.motionZ *= 0.9100000262260437D; - if (this.field_92053_aD) - { - var1.field_92053_aD = true; - var1.field_92050_aA = this.field_92050_aA; - var1.field_92051_aB = this.field_92051_aB; - var1.field_92052_aC = this.field_92052_aC; - } + if (this.onGround) + { + this.motionX *= 0.699999988079071D; + this.motionZ *= 0.699999988079071D; + } - var1.field_92048_ay = this.field_92048_ay; - this.field_92047_az.addEffect(var1); - } - } + if (this.field_92054_ax && this.particleAge < this.particleMaxAge / 2 && (this.particleAge + this.particleMaxAge) % 2 == 0) + { + GoggleRiftFX var1 = new GoggleRiftFX(this.worldObj, this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D, this.field_92047_az); + var1.setRBGColorF(this.particleRed, this.particleGreen, this.particleBlue); + var1.particleAge = var1.particleMaxAge / 2; - public int getBrightnessForRender(float par1) - { - return 15728880; - } + if (this.field_92053_aD) + { + var1.field_92053_aD = true; + var1.field_92050_aA = this.field_92050_aA; + var1.field_92051_aB = this.field_92051_aB; + var1.field_92052_aC = this.field_92052_aC; + } - /** - * Gets how bright this entity is. - */ - public float getBrightness(float par1) - { - return 1.0F; - } + var1.field_92048_ay = this.field_92048_ay; + this.field_92047_az.addEffect(var1); + } + } + + public int getBrightnessForRender(float par1) + { + return 15728880; + } + + /** + * Gets how bright this entity is. + */ + public float getBrightness(float par1) + { + return 1.0F; + } } diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index 240f417..f0ea38a 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -40,12 +40,10 @@ public class RenderDimDoor extends TileEntitySpecialRenderer { try { - dimDoor.class.cast(Block.blocksList[properties.DimensionalDoorID]).updateAttatchedTile(tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord).getFullMetadata(tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord); - + mod_pocketDim.dimensionalDoor.updateAttachedTile(tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord); } catch(Exception e) { - e.printStackTrace(); } -- 2.39.5 From f34b06b834ef30a8b93d585467fc3e601751724c Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 31 Aug 2013 16:00:18 -0400 Subject: [PATCH 036/544] More Progress on Rewrite More cleaning up errors and code. There were a lot of things that needed simplifying. Rather than fix the 3 or 5 copies of the same function throughout the code, I made an effort to use the same function and delete its copies. Created the BaseItemDoor class to hold all the basic door item methods that don't vary between types. That helped cut down on fixing things. Also renamed the door item classes to match their in-game names. There is still a ton of duplicate code out there. --- .../mod_pocketDim/core/PocketManager.java | 5 + .../mod_pocketDim/helpers/DungeonHelper.java | 4 +- .../mod_pocketDim/items/BaseItemDoor.java | 146 +++++++ .../mod_pocketDim/items/ItemChaosDoor.java | 32 -- .../items/ItemDimensionalDoor.java | 48 +++ .../mod_pocketDim/items/ItemRiftBlade.java | 314 +++++--------- .../mod_pocketDim/items/ItemRiftGoggles.java | 3 - .../mod_pocketDim/items/ItemUnstableDoor.java | 45 ++ .../items/ItemUnstableRiftSignature.java | 1 - .../mod_pocketDim/items/ItemWarpDoor.java | 48 +++ .../mod_pocketDim/items/itemDimDoor.java | 207 --------- .../mod_pocketDim/items/itemExitDoor.java | 51 --- .../items/itemLinkSignature.java | 394 +++++++++--------- .../mod_pocketDim/mod_pocketDim.java | 23 +- .../mod_pocketDim/schematic/BlockRotator.java | 2 +- .../mod_pocketDim/world/GatewayGenerator.java | 4 +- .../mod_pocketDimClient/RiftFX.java | 24 +- 17 files changed, 620 insertions(+), 731 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java delete mode 100644 StevenDimDoors/mod_pocketDim/items/ItemChaosDoor.java create mode 100644 StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java create mode 100644 StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java delete mode 100644 StevenDimDoors/mod_pocketDim/items/ItemUnstableRiftSignature.java create mode 100644 StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java delete mode 100644 StevenDimDoors/mod_pocketDim/items/itemDimDoor.java delete mode 100644 StevenDimDoors/mod_pocketDim/items/itemExitDoor.java diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 862332a..a905e7e 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -605,6 +605,11 @@ public class PocketManager { return dimensionData.values(); } + + public static IDimLink getLink(int x, int y, int z, World world) + { + return getLink(x, y, z, world.provider.dimensionId); + } public static IDimLink getLink(int x, int y, int z, int dimensionID) { diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index f7741ab..3913932 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -30,7 +30,7 @@ import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfigReader; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonType; -import StevenDimDoors.mod_pocketDim.items.itemDimDoor; +import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; import StevenDimDoors.mod_pocketDim.util.ConfigurationProcessingException; import StevenDimDoors.mod_pocketDim.util.WeightedContainer; @@ -281,7 +281,7 @@ public class DungeonHelper IDimLink link = dimension.createLink(x, y + 1, z).setLinkType(IDimLink.TYPE_POCKET); //Place a Warp Door linked to that pocket - itemDimDoor.placeDoorBlock(world, x, y, z, 3, mod_pocketDim.exitDoor); + ItemDimensionalDoor.placeDoorBlock(world, x, y, z, 3, mod_pocketDim.warpDoor); return link; } diff --git a/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java b/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java new file mode 100644 index 0000000..88600bc --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java @@ -0,0 +1,146 @@ +package StevenDimDoors.mod_pocketDim.items; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemDoor; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.PocketManager; + +public abstract class BaseItemDoor extends ItemDoor +{ + private static DDProperties properties = null; + + public BaseItemDoor(int itemID, Material material) + { + super(itemID, material); + this.setMaxStackSize(64); + this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); + if (properties == null) + properties = DDProperties.instance(); + } + + public void registerIcons(IconRegister par1IconRegister) + { + this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); + } + + @SuppressWarnings({ "rawtypes" }) + @Override + public abstract void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4); + + @Override + public abstract boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int par7, float par8, float par9, float par10); + + public static boolean tryItemUse(Block doorBlock, ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int par7, boolean requireLink, boolean reduceStack) + { + //FIXME: Without any sort of this documentation, this condition is like magic -_- ~SenseiKiwi + if (par7 == 1 && !world.isRemote) + { + int blockID = world.getBlockId(x, y, z); + if (blockID != 0) + { + if (!Block.blocksList[blockID].isBlockReplaceable(world, x, y, z)) + { + y++; + } + } + + if (canPlace(world, x, y, z) && canPlace(world, x, y + 1, z) && + player.canPlayerEdit(x, y, z, par7, stack) && player.canPlayerEdit(x, y + 1, z, par7, stack) && + (!requireLink || PocketManager.getLink(x, y + 1, z, world) != null)) + { + int orientation = MathHelper.floor_double((double) ((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; + placeDoorBlock(world, x, y, z, orientation, doorBlock); + + if (!player.capabilities.isCreativeMode && reduceStack) + { + stack.stackSize--; + } + return true; + } + } + return false; + } + + @Override + public final MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean par3) + { + float var4 = 1.0F; + float var5 = par2EntityPlayer.prevRotationPitch + (par2EntityPlayer.rotationPitch - par2EntityPlayer.prevRotationPitch) * var4; + float var6 = par2EntityPlayer.prevRotationYaw + (par2EntityPlayer.rotationYaw - par2EntityPlayer.prevRotationYaw) * var4; + double var7 = par2EntityPlayer.prevPosX + (par2EntityPlayer.posX - par2EntityPlayer.prevPosX) * (double)var4; + double var9 = par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * (double)var4 + 1.62D - (double)par2EntityPlayer.yOffset; + double var11 = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * (double)var4; + Vec3 var13 = par1World.getWorldVec3Pool().getVecFromPool(var7, var9, var11); + float var14 = MathHelper.cos(-var6 * 0.017453292F - (float)Math.PI); + float var15 = MathHelper.sin(-var6 * 0.017453292F - (float)Math.PI); + float var16 = -MathHelper.cos(-var5 * 0.017453292F); + float var17 = MathHelper.sin(-var5 * 0.017453292F); + float var18 = var15 * var16; + float var20 = var14 * var16; + double var21 = 5.0D; + if (par2EntityPlayer instanceof EntityPlayerMP) + { + var21 = 4; + } + Vec3 var23 = var13.addVector((double) var18 * var21, (double)var17 * var21, (double)var20 * var21); + return par1World.rayTraceBlocks_do_do(var13, var23, true, false); + } + + @Override + public abstract ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player); + + public boolean tryPlacingDoor(Block doorBlock, World world, EntityPlayer player, ItemStack item) + { + if (world.isRemote) + { + return false; + } + + MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(player.worldObj, player, false); + if (hit != null) + { + if (world.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) + { + IDimLink link = PocketManager.getLink(hit.blockX, hit.blockY, hit.blockZ, world.provider.dimensionId); + if (link != null) + { + int x = hit.blockX; + int y = hit.blockY; + int z = hit.blockZ; + int par7 = 0; + + if (player.canPlayerEdit(x, y, z, par7, item) && player.canPlayerEdit(x, y - 1, z, par7, item)) + { + if (canPlace(world, x, y, z) && canPlace(world, x, y - 1, z)) + { + int orientation = MathHelper.floor_double(((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; + placeDoorBlock(world, x, y - 1, z, orientation, doorBlock); + return true; + } + } + } + } + } + return false; + } + + public static boolean canPlace(World world, int x, int y, int z) + { + int id = world.getBlockId(x, y, z); + + return (id == properties.RiftBlockID || id == 0 || Block.blocksList[id].blockMaterial.isReplaceable()); + } +} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/items/ItemChaosDoor.java b/StevenDimDoors/mod_pocketDim/items/ItemChaosDoor.java deleted file mode 100644 index c218cd2..0000000 --- a/StevenDimDoors/mod_pocketDim/items/ItemChaosDoor.java +++ /dev/null @@ -1,32 +0,0 @@ -package StevenDimDoors.mod_pocketDim.items; - -import java.util.List; - -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; - -public class ItemChaosDoor extends itemDimDoor -{ - public ItemChaosDoor(int par1, Material par2Material) - { - super(par1, par2Material); - this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - } - - public void registerIcons(IconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()); - - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) - { - par3List.add("Caution: Leads to random destination"); - } - -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java b/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java new file mode 100644 index 0000000..6804e28 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java @@ -0,0 +1,48 @@ +package StevenDimDoors.mod_pocketDim.items; + +import java.util.List; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; + +public class ItemDimensionalDoor extends BaseItemDoor +{ + public ItemDimensionalDoor(int itemID, Material material) + { + super(itemID, material); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Place on the block under a rift"); + par3List.add("to activate that rift or place"); + par3List.add("anywhere else to create a"); + par3List.add("pocket dimension."); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + { + if (!world.isRemote) + { + if (tryPlacingDoor(mod_pocketDim.dimensionalDoor, world, player, stack) && + !player.capabilities.isCreativeMode) + { + stack.stackSize--; + } + } + return stack; + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, + int z, int par7, float par8, float par9, float par10) + { + return tryItemUse(mod_pocketDim.dimensionalDoor, stack, player, world, x, y, z, par7, false, true); + } +} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index 25847dd..727fc24 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -20,36 +20,35 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class ItemRiftBlade extends ItemSword { - public ItemRiftBlade(int par1) + private static DDProperties properties = null; + + public ItemRiftBlade(int itemID, EnumToolMaterial material) { - super(par1, EnumToolMaterial.GOLD); + super(itemID, material); - // this.setTextureFile("/PocketBlockTextures.png"); - this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); + this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); this.setMaxStackSize(1); - - // this.itemIcon=5; this.setMaxDamage(500); - this.hasSubtypes=false; - //TODO move to proxy + this.hasSubtypes = false; if (properties == null) properties = DDProperties.instance(); } - private static DDProperties properties = null; - @SideOnly(Side.CLIENT) public boolean isFull3D() { return true; } + @Override public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block) { if (par2Block.blockID == Block.web.blockID) @@ -68,20 +67,22 @@ public class ItemRiftBlade extends ItemSword public boolean hasEffect(ItemStack par1ItemStack) { return true; - } + @Override public boolean hitEntity(ItemStack par1ItemStack, EntityLiving par2EntityLiving, EntityLiving par3EntityLiving) { par1ItemStack.damageItem(1, par3EntityLiving); return true; } + @Override public int getDamageVsEntity(Entity par1Entity) { return 7; } + @Override public MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean par3) { float var4 = 1.0F; @@ -106,11 +107,10 @@ public class ItemRiftBlade extends ItemSword return par1World.rayTraceBlocks_do_do(var13, var23, true, false); } - protected boolean teleportToEntity(ItemStack item, Entity par1Entity, EntityPlayer holder) + private boolean teleportToEntity(ItemStack item, Entity par1Entity, EntityPlayer holder) { Vec3 var2 = holder.worldObj.getWorldVec3Pool().getVecFromPool(holder.posX - par1Entity.posX, holder.boundingBox.minY + (double)(holder.height / 2.0F) - par1Entity.posY + (double)par1Entity.getEyeHeight(), holder.posZ - par1Entity.posZ); - double cooef =( var2.lengthVector()-2.5)/var2.lengthVector(); var2.xCoord*=cooef; var2.yCoord*=cooef; @@ -120,7 +120,6 @@ public class ItemRiftBlade extends ItemSword double var7 =holder.worldObj.getHeightValue(MathHelper.floor_double(var5), MathHelper.floor_double(var9)); if((Math.abs((holder.posY - var2.yCoord)-var7)>2)) { - var7 = MathHelper.floor_double(holder.posY - var2.yCoord) ; int var14 = MathHelper.floor_double(var5); @@ -133,262 +132,169 @@ public class ItemRiftBlade extends ItemSword var7=var15; } - holder.setPositionAndUpdate(var5, var7, var9); holder.playSound("mob.endermen.portal", 1.0F, 1.0F); holder.worldObj.playSoundEffect(holder.posX, holder.posY, holder.posZ, "mob.endermen.portal", 1.0F, 1.0F); - - + return true; } - public ItemStack onFoodEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - return par1ItemStack; - } /** * How long it takes to use or consume an item */ - public int getMaxItemUseDuration(ItemStack par1ItemStack) + @Override + public int getMaxItemUseDuration(ItemStack par1ItemStack) { return 72000; } - public EnumAction getItemUseAction(ItemStack par1ItemStack) + @Override + public EnumAction getItemUseAction(ItemStack stack) { return properties.RiftBladeRiftCreationEnabled ? EnumAction.bow : EnumAction.block; } - public void onPlayerStoppedUsing(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer, int par4) + @Override + public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int itemInUseCount) { //Condition for disabling rift creation if (!properties.RiftBladeRiftCreationEnabled) return; - Vec3 var2 = par3EntityPlayer.getLook(1.0F); + if (world.isRemote) + return; + + Vec3 var2 = player.getLook(1.0F); double cooef = -2; - var2.xCoord*=cooef; - var2.yCoord*=cooef; - var2.zCoord*=cooef; - double var5 = par3EntityPlayer.posX - var2.xCoord; - double var9 = par3EntityPlayer.posZ - var2.zCoord; - double var7 = par3EntityPlayer.posY - var2.yCoord+2; + var2.xCoord *= cooef; + var2.yCoord *= cooef; + var2.zCoord *= cooef; + double var5 = player.posX - var2.xCoord; + double var9 = player.posZ - var2.zCoord; + double var7 = player.posY - var2.yCoord + 2; int x = MathHelper.floor_double(var5); int y = MathHelper.floor_double(var7); int z = MathHelper.floor_double(var9); - int rotation = (int) (MathHelper.floor_double((double)((par3EntityPlayer.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); - NewLinkData link = new NewLinkData(par2World.provider.dimensionId, 0, x, y, z, x, y, z, true,rotation); + int orientation = (int) (MathHelper.floor_double((double) ((player.rotationYaw + 90) * 4.0F / 360.0F) + 0.5D) & 3); - if(this.getMaxItemUseDuration(par1ItemStack)-par4>12&&!par2World.isRemote&&itemDimDoor.canPlace(par2World, x, y, z, rotation)) + //TODO: This looks weird. Shouldn't we aim to only create rifts on maxed-out usage time? i.e. "<= 0" + if (this.getMaxItemUseDuration(stack) - itemInUseCount > 12 && + ItemDimensionalDoor.canPlace(world, x, y, z) && ItemDimensionalDoor.canPlace(world, x, y + 1, z)) { - - if(PocketManager.instance.getDimData(par2World.provider.dimensionId)!=null) + NewDimData dimension = PocketManager.getDimensionData(world); + if (!dimension.isPocketDimension() && dimension.getLink(x, y + 1, z) == null) { - if(PocketManager.instance.getDimData(par2World.provider.dimensionId).depth==0) - { - PocketManager.instance.createPocket(link,true, false); - } - } - else - { - PocketManager.instance.createPocket(link,true, false); - } - par3EntityPlayer.worldObj.playSoundAtEntity(par3EntityPlayer,"mods.DimDoors.sfx.riftDoor", (float) .6, 1); - itemDimDoor.placeDoorBlock(par2World, x, y-1, z, rotation, mod_pocketDim.transientDoor); + dimension.createLink(x, y + 1, z).setLinkType(IDimLink.TYPE_POCKET); + player.worldObj.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1); + ItemDimensionalDoor.placeDoorBlock(world, x, y, z, orientation, mod_pocketDim.transientDoor); + } } } - public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - Boolean didFindThing=false; - MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(par3EntityPlayer.worldObj, par3EntityPlayer, false ); - if(hit!=null&&!par2World.isRemote) + if (!world.isRemote) { - if(par2World.getBlockId(hit.blockX, hit.blockY, hit.blockZ)==properties.RiftBlockID) + @SuppressWarnings("unchecked") + List list = (List) world.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getBoundingBox(player.posX-8,player.posY-8, player.posZ-8, player.posX+8,player.posY+8, player.posZ+8)); + list.remove(player); + + for (EntityLiving ent : list) { - NewLinkData link = PocketManager.instance.getLinkDataFromCoords(hit.blockX, hit.blockY, hit.blockZ, par2World); - if(link!=null) - { - - Block var11 = mod_pocketDim.transientDoor; - int par4 = hit.blockX; - int par5 = hit.blockY; - int par6 = hit.blockZ; - int par7 = 0 ; - - - - - if (par3EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack) && par3EntityPlayer.canPlayerEdit(par4, par5 + 1, par6, par7, par1ItemStack)&&!par2World.isRemote) - { - int var12 = MathHelper.floor_double((double)((par3EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; - - if (!itemDimDoor.canPlace(par2World, par4, par5, par6, var12)||!itemDimDoor.canPlace(par2World, par4, par5-1, par6, var12)||PocketManager.instance.getLinkDataFromCoords(par4, par5, par6, par2World)==null) - { - return par1ItemStack; - } - else - { - - itemDimDoor.placeDoorBlock(par2World, par4, par5-1, par6, var12, var11); - par3EntityPlayer.worldObj.playSoundAtEntity(par3EntityPlayer,"mods.DimDoors.sfx.riftDoor", (float) .6, 1); - - didFindThing=true; - - - par1ItemStack.damageItem(10, par3EntityPlayer); - - } - } - } - } - else if(par2World.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.TransientDoorID) - { - didFindThing=true; - } - - } - - - - - if(!par3EntityPlayer.worldObj.isRemote) - { - List list = par3EntityPlayer.worldObj.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getBoundingBox( par3EntityPlayer.posX-8,par3EntityPlayer.posY-8, par3EntityPlayer.posZ-8, par3EntityPlayer.posX+8,par3EntityPlayer.posY+8, par3EntityPlayer.posZ+8)); - list.remove(par3EntityPlayer); - - - for(EntityLiving ent : list) - { - - Vec3 var3 = par3EntityPlayer.getLook(1.0F).normalize(); - Vec3 var4 = par3EntityPlayer.worldObj.getWorldVec3Pool().getVecFromPool(ent.posX - par3EntityPlayer.posX, ent.boundingBox.minY + (double)((ent.height) / 2.0F) - ( par3EntityPlayer.posY + (double) par3EntityPlayer.getEyeHeight()), ent.posZ - par3EntityPlayer.posZ); + Vec3 var3 = player.getLook(1.0F).normalize(); + Vec3 var4 = player.worldObj.getWorldVec3Pool().getVecFromPool(ent.posX - player.posX, ent.boundingBox.minY + (double)((ent.height) / 2.0F) - ( player.posY + (double) player.getEyeHeight()), ent.posZ - player.posZ); double var5 = var4.lengthVector(); var4 = var4.normalize(); double var7 = var3.dotProduct(var4); - if( (var7+.1) > 1.0D - 0.025D / var5 ? par3EntityPlayer.canEntityBeSeen(ent) : false) + if( (var7+.1) > 1.0D - 0.025D / var5 ? player.canEntityBeSeen(ent) : false) { - System.out.println(list.size()); - ItemRiftBlade.class.cast(par1ItemStack.getItem()).teleportToEntity(par1ItemStack,ent, par3EntityPlayer); - didFindThing=true; - break; - - //ItemRiftBlade.class.cast(item.getItem()).teleportTo(event.entityPlayer, ent.posX, ent.posY, ent.posZ); + ((ItemRiftBlade) stack.getItem()).teleportToEntity(stack, ent, player); + return stack; } } + MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(world, player, false); + if (hit != null) + { + if (world.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) + { + if (PocketManager.getLink(hit.blockX, hit.blockY, hit.blockZ, world) != null) + { + Block var11 = mod_pocketDim.transientDoor; + int par4 = hit.blockX; + int par5 = hit.blockY; + int par6 = hit.blockZ; + int par7 = 0; - } - // if(dimHelper.instance.getDimData(par2World.provider.dimensionId)!=null&&!par2World.isRemote&&!didFindThing) - { - - par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); + if (player.canPlayerEdit(par4, par5, par6, par7, stack) && player.canPlayerEdit(par4, par5 + 1, par6, par7, stack)&&!world.isRemote) + { + int var12 = MathHelper.floor_double((double)((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; + if (BaseItemDoor.canPlace(world, par4, par5, par6) && + BaseItemDoor.canPlace(world, par4, par5 - 1, par6)) + { + ItemDimensionalDoor.placeDoorBlock(world, par4, par5 - 1, par6, var12, var11); + player.worldObj.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1); + stack.damageItem(10, player); + } + } + } + return stack; + } + } + + //FIXME: Should this be inside or after this IF? + player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); } - - - - return par1ItemStack; - + return stack; } + + @Override public void registerIcons(IconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()); - } - public int getItemEnchantability() - { - return EnumToolMaterial.GOLD.getEnchantability(); - } - /** - * Return the name for this tool's material. - */ - public String getToolMaterialName() - { - return EnumToolMaterial.GOLD.toString(); - } - - /** - * Return whether this item is repairable in an anvil. - */ - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - return mod_pocketDim.itemStableFabric.itemID == par2ItemStack.itemID ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) + /** + * Return whether this item is repairable in an anvil. + */ + @Override + public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) { - if (par7 != 1) + //Don't include a call to super.getIsRepairable()! + //That would cause this sword to accept gold as a repair material (since we set material = Gold). + return mod_pocketDim.itemStableFabric.itemID == par2ItemStack.itemID ? true : false; + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, + int z, int par7, float par8, float par9, float par10) + { + if (BaseItemDoor.tryItemUse(mod_pocketDim.transientDoor, stack, player, world, x, y, z, par7, true, false)) { - return false; + world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1); + return true; } else { - ++par5; - Block var11; - - - - var11 = mod_pocketDim.transientDoor; - if (par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack) && par2EntityPlayer.canPlayerEdit(par4, par5 + 1, par6, par7, par1ItemStack)&&!par3World.isRemote) - { - int var12 = MathHelper.floor_double((double)((par2EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; - - if (!itemDimDoor.canPlace(par3World, par4, par5, par6, var12)||PocketManager.instance.getLinkDataFromCoords(par4, par5+1, par6, par3World)==null) - { - return false; - } - else - { - - itemDimDoor.placeDoorBlock(par3World, par4, par5, par6, var12, var11); - par2EntityPlayer.worldObj.playSoundAtEntity(par2EntityPlayer,"mods.DimDoors.sfx.rift", (float) .6, 1); - - - par1ItemStack.damageItem(10, par2EntityPlayer); - return true; - } - } - else - { - return false; - } + return false; } } - - - @SideOnly(Side.CLIENT) - /** * allows items to add custom lines of information to the mouseover description */ - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + @SuppressWarnings({ "unchecked", "rawtypes" }) + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Opens a temporary doors,"); - par3List.add ("special teleport attack,"); - par3List.add ("and rotates existing doors"); - } - - @Override - public void onCreated(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - if(!par2World.isRemote) - { - /** - //creates the first half of the link on item creation - int key= dimHelper.instance.createUniqueInterDimLinkKey(); - LinkData linkData= new LinkData(par2World.provider.dimensionId,MathHelper.floor_double(par3EntityPlayer.posX),MathHelper.floor_double(par3EntityPlayer.posY),MathHelper.floor_double(par3EntityPlayer.posZ)); - System.out.println(key); - - dimHelper.instance.interDimLinkList.put(key, linkData); - par1ItemStack.setItemDamage(key); - **/ - } + par3List.add("Opens a temporary door, has"); + par3List.add("a special teleport attack,"); + par3List.add("and rotates existing doors."); } } diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftGoggles.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftGoggles.java index 815f4b9..dfaedeb 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftGoggles.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftGoggles.java @@ -1,14 +1,11 @@ package StevenDimDoors.mod_pocketDim.items; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.EnumArmorMaterial; import net.minecraft.item.ItemArmor; public class ItemRiftGoggles extends ItemArmor { - private Material doorMaterial; public ItemRiftGoggles(int par1, int par2, int par3) { diff --git a/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java b/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java new file mode 100644 index 0000000..a7d63ec --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java @@ -0,0 +1,45 @@ +package StevenDimDoors.mod_pocketDim.items; + +import java.util.List; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; + +public class ItemUnstableDoor extends BaseItemDoor +{ + public ItemUnstableDoor(int itemID, Material material) + { + super(itemID, material); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Caution: Leads to random destination"); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + { + if (!world.isRemote) + { + if (tryPlacingDoor(mod_pocketDim.unstableDoor, world, player, stack) && + !player.capabilities.isCreativeMode) + { + stack.stackSize--; + } + } + return stack; + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, + int z, int par7, float par8, float par9, float par10) + { + return tryItemUse(mod_pocketDim.unstableDoor, stack, player, world, x, y, z, par7, false, true); + } +} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/items/ItemUnstableRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemUnstableRiftSignature.java deleted file mode 100644 index bb245f5..0000000 --- a/StevenDimDoors/mod_pocketDim/items/ItemUnstableRiftSignature.java +++ /dev/null @@ -1 +0,0 @@ -package StevenDimDoors.mod_pocketDim.items; diff --git a/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java b/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java new file mode 100644 index 0000000..0309a3f --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java @@ -0,0 +1,48 @@ +package StevenDimDoors.mod_pocketDim.items; + +import java.util.List; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; + +public class ItemWarpDoor extends BaseItemDoor +{ + public ItemWarpDoor(int itemID, Material material) + { + super(itemID, material); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Place on the block under"); + par3List.add("a rift to create a portal,"); + par3List.add("or place anywhere in a"); + par3List.add("pocket dimension to exit."); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + { + if (!world.isRemote) + { + if (tryPlacingDoor(mod_pocketDim.warpDoor, world, player, stack) && + !player.capabilities.isCreativeMode) + { + stack.stackSize--; + } + } + return stack; + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, + int z, int par7, float par8, float par9, float par10) + { + return tryItemUse(mod_pocketDim.warpDoor, stack, player, world, x, y, z, par7, false, true); + } +} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java b/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java deleted file mode 100644 index 6b9edce..0000000 --- a/StevenDimDoors/mod_pocketDim/items/itemDimDoor.java +++ /dev/null @@ -1,207 +0,0 @@ -package StevenDimDoors.mod_pocketDim.items; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemDoor; -import net.minecraft.item.ItemStack; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.IDimLink; -import StevenDimDoors.mod_pocketDim.core.PocketManager; - -public class itemDimDoor extends ItemDoor -{ - private static DDProperties properties = null; - - public itemDimDoor(int par1, Material par2Material) - { - super(par1, par2Material); - this.setMaxStackSize(64); - this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - if (properties == null) - properties = DDProperties.instance(); - } - - public void registerIcons(IconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) - { - par3List.add("Place on the block under a rift"); - par3List.add("to activate that rift or place"); - par3List.add("anywhere else to create a"); - par3List.add("pocket dimension."); - } - - @Override - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) - { - if (par7 != 1) - { - return false; - } - else - { - ++par5; - Block var11; - - - if(par1ItemStack.getItem() instanceof itemExitDoor) - { - var11 = mod_pocketDim.exitDoor; - } - - else if (par1ItemStack.getItem() instanceof ItemChaosDoor) - { - var11 = mod_pocketDim.unstableDoor; - } - else if (par1ItemStack.getItem() instanceof itemDimDoor) - { - var11 = mod_pocketDim.dimensionalDoor; - } - else - { - //Do nothing - return false; - } - - if (par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack) && par2EntityPlayer.canPlayerEdit(par4, par5 + 1, par6, par7, par1ItemStack)&&!par3World.isRemote) - { - int var12 = MathHelper.floor_double((double)((par2EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; - - if (!canPlace(par3World, par4, par5, par6) || !canPlace(par3World, par4, par5+1, par6)) - { - return false; - } - else - { - int offset = 0; - int idBlock = par3World.getBlockId(par4, par5-1, par6); - - if(Block.blocksList.length>idBlock&&idBlock!=0) - { - if(Block.blocksList[idBlock].isBlockReplaceable(par3World, par4, par5-1, par6)) - { - offset = 1; - } - } - - placeDoorBlock(par3World, par4, par5-offset, par6, var12, var11); - - --par1ItemStack.stackSize; - return true; - } - } - else - { - return false; - } - } - } - - public MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean par3) - { - float var4 = 1.0F; - float var5 = par2EntityPlayer.prevRotationPitch + (par2EntityPlayer.rotationPitch - par2EntityPlayer.prevRotationPitch) * var4; - float var6 = par2EntityPlayer.prevRotationYaw + (par2EntityPlayer.rotationYaw - par2EntityPlayer.prevRotationYaw) * var4; - double var7 = par2EntityPlayer.prevPosX + (par2EntityPlayer.posX - par2EntityPlayer.prevPosX) * (double)var4; - double var9 = par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * (double)var4 + 1.62D - (double)par2EntityPlayer.yOffset; - double var11 = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * (double)var4; - Vec3 var13 = par1World.getWorldVec3Pool().getVecFromPool(var7, var9, var11); - float var14 = MathHelper.cos(-var6 * 0.017453292F - (float)Math.PI); - float var15 = MathHelper.sin(-var6 * 0.017453292F - (float)Math.PI); - float var16 = -MathHelper.cos(-var5 * 0.017453292F); - float var17 = MathHelper.sin(-var5 * 0.017453292F); - float var18 = var15 * var16; - float var20 = var14 * var16; - double var21 = 5.0D; - if (par2EntityPlayer instanceof EntityPlayerMP) - { - var21 = 4; - } - Vec3 var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21); - return par1World.rayTraceBlocks_do_do(var13, var23, true, false); - } - - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) - { - if (world.isRemote) - { - return stack; - } - - MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(player.worldObj, player, false ); - if (hit != null) - { - if (world.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) - { - IDimLink link = PocketManager.getLink(hit.blockX, hit.blockY, hit.blockZ, world.provider.dimensionId); - if (link != null) - { - Block block; - if (stack.getItem() instanceof itemExitDoor) - { - block = mod_pocketDim.exitDoor; - } - else if (stack.getItem() instanceof ItemChaosDoor) - { - block = mod_pocketDim.unstableDoor; - } - else if (stack.getItem() instanceof itemDimDoor) - { - block = mod_pocketDim.dimensionalDoor; - } - else - { - //Do nothing - return stack; - } - - int x = hit.blockX; - int y = hit.blockY; - int z = hit.blockZ; - int par7 = 0; - - if (player.canPlayerEdit(x, y, z, par7, stack) && player.canPlayerEdit(x, y - 1, z, par7, stack)) - { - int orientation = MathHelper.floor_double((double) ((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; - - if (!canPlace(world, x, y, z) || !canPlace(world, x, y - 1, z)) - { - return stack; - } - else - { - placeDoorBlock(world, x, y - 1, z, orientation, block); - if (!player.capabilities.isCreativeMode) - { - stack.stackSize--; - } - } - } - } - } - } - return stack; - } - - private static boolean canPlace(World world, int x, int y, int z) - { - int id = world.getBlockId(x, y, z); - - return (id == properties.RiftBlockID || id == 0 || Block.blocksList[id].blockMaterial.isReplaceable()); - } -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/items/itemExitDoor.java b/StevenDimDoors/mod_pocketDim/items/itemExitDoor.java deleted file mode 100644 index 50312ba..0000000 --- a/StevenDimDoors/mod_pocketDim/items/itemExitDoor.java +++ /dev/null @@ -1,51 +0,0 @@ -package StevenDimDoors.mod_pocketDim.items; - -import java.util.List; - -import StevenDimDoors.mod_pocketDim.mod_pocketDim; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemDoor; -import net.minecraft.item.ItemStack; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class itemExitDoor extends itemDimDoor -{ - private Material doorMaterial; - - public itemExitDoor(int par1, Material par2Material) - { - super(par1, par2Material); - this.doorMaterial = par2Material; - this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - - } - - public void registerIcons(IconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); - - } - - - @Override - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) - { - - - par3List.add("Place on the block under a rift"); - par3List.add ("in any dimension,"); - par3List.add("or place anywhere in pocket dim"); - par3List.add("to approach surface"); - - - - } - - -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java b/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java index 4a0538a..2d9ce99 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java @@ -19,243 +19,239 @@ import cpw.mods.fml.relauncher.SideOnly; public class itemLinkSignature extends Item { - public itemLinkSignature(int par1) - { - super(par1); - this.setMaxStackSize(1); - // this.setTextureFile("/PocketBlockTextures.png"); - this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - - // this.itemIcon=5; - this.setMaxDamage(0); - this.hasSubtypes=true; - //TODO move to proxy + public itemLinkSignature(int itemID) + { + super(itemID); + this.setMaxStackSize(1); + this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); + this.setMaxDamage(0); + this.hasSubtypes = true; if (properties == null) properties = DDProperties.instance(); } - + private static DDProperties properties = null; - - @SideOnly(Side.CLIENT) - @Override - public boolean hasEffect(ItemStack par1ItemStack) - { - // adds effect if item has a link stored - - - if(par1ItemStack.hasTagCompound()) - { - if(par1ItemStack.stackTagCompound.getBoolean("isCreated")) - { - return true; - } - } - return false; - } - - - public void registerIcons(IconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()); - } + @SideOnly(Side.CLIENT) + @Override + public boolean hasEffect(ItemStack par1ItemStack) + { + // adds effect if item has a link stored - @Override - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) - { - int key; - ILinkData linkData; + + if(par1ItemStack.hasTagCompound()) + { + if(par1ItemStack.stackTagCompound.getBoolean("isCreated")) + { + return true; + } + } + return false; + } + + + public void registerIcons(IconRegister par1IconRegister) + { + this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()); + + } + + @Override + public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) + { + int key; + ILinkData linkData; int thisWorldID=par3World.provider.dimensionId; - - - - if(!par3World.isRemote) - { - + + + + if(!par3World.isRemote) + { + //par1ItemStack= par2EntityPlayer.getCurrentEquippedItem(); Integer[] linkCoords =this.readFromNBT(par1ItemStack); - - - - //System.out.println(key); - int offset = 2; - int idBlock = par3World.getBlockId(par4, par5, par6); - - if(Block.blocksList.length>idBlock&&idBlock!=0) - { - if(Block.blocksList[idBlock].isBlockReplaceable(par3World, par4, par5, par6)) - { - offset = 1; - } - } + + + + //System.out.println(key); + int offset = 2; + int idBlock = par3World.getBlockId(par4, par5, par6); + + if(Block.blocksList.length>idBlock&&idBlock!=0) + { + if(Block.blocksList[idBlock].isBlockReplaceable(par3World, par4, par5, par6)) + { + offset = 1; + } + } if(par3World.getBlockId(par4, par5, par6) == properties.DimensionalDoorID && par3World.getBlockId(par4, par5 + 1, par6) == properties.DimensionalDoorID) { offset = 1; } else - if(par3World.getBlockId(par4, par5, par6)==properties.WarpDoorID&&par3World.getBlockId(par4, par5+1, par6)==properties.WarpDoorID) - { - offset = 1; - } - else - if (par3World.getBlockId(par4, par5, par6)==properties.DimensionalDoorID&&par3World.getBlockId(par4, par5-1, par6)==properties.DimensionalDoorID) - { - offset = 0; - } - else - if (par3World.getBlockId(par4, par5, par6) == properties.WarpDoorID && par3World.getBlockId(par4, par5-1, par6)==properties.WarpDoorID) - { - offset = 0; - } - + if(par3World.getBlockId(par4, par5, par6)==properties.WarpDoorID&&par3World.getBlockId(par4, par5+1, par6)==properties.WarpDoorID) + { + offset = 1; + } + else + if (par3World.getBlockId(par4, par5, par6)==properties.DimensionalDoorID&&par3World.getBlockId(par4, par5-1, par6)==properties.DimensionalDoorID) + { + offset = 0; + } + else + if (par3World.getBlockId(par4, par5, par6) == properties.WarpDoorID && par3World.getBlockId(par4, par5-1, par6)==properties.WarpDoorID) + { + offset = 0; + } + int orientation = MathHelper.floor_double((double)((par2EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; - + for(int count = 0;count<3;count++) { if(PocketManager.instance.getLinkDataFromCoords(par4, par5+count, par6,par3World)!=null) { int id= (par3World.getBlockId(par4, par5+count, par6)); - + if(id == properties.DimensionalDoorID||id==properties.WarpDoorID||id== properties.UnstableDoorID) { orientation = PocketManager.instance.getLinkDataFromCoords(par4, par5+count, par6,par3World).linkOrientation; } } - + } - - if(par1ItemStack.getTagCompound()!=null) - { - if(par1ItemStack.getTagCompound().getBoolean("isCreated")) - { - // checks to see if the item has a link stored, if so, it creates it - - - PocketManager.instance.createLink(par3World.provider.dimensionId, linkCoords[3], par4, par5+offset, par6, linkCoords[0], linkCoords[1], linkCoords[2],orientation); - PocketManager.instance.createLink(linkCoords[3], par3World.provider.dimensionId, linkCoords[0], linkCoords[1], linkCoords[2],par4, par5+offset, par6,linkCoords[4]); - - + if(par1ItemStack.getTagCompound()!=null) + { + if(par1ItemStack.getTagCompound().getBoolean("isCreated")) + { + // checks to see if the item has a link stored, if so, it creates it - --par1ItemStack.stackSize; - par2EntityPlayer.sendChatToPlayer("Rift Created"); - par1ItemStack.stackTagCompound=null; + + + PocketManager.instance.createLink(par3World.provider.dimensionId, linkCoords[3], par4, par5+offset, par6, linkCoords[0], linkCoords[1], linkCoords[2],orientation); + PocketManager.instance.createLink(linkCoords[3], par3World.provider.dimensionId, linkCoords[0], linkCoords[1], linkCoords[2],par4, par5+offset, par6,linkCoords[4]); + + + + --par1ItemStack.stackSize; + par2EntityPlayer.sendChatToPlayer("Rift Created"); + par1ItemStack.stackTagCompound=null; par2EntityPlayer.worldObj.playSoundAtEntity(par2EntityPlayer,"mods.DimDoors.sfx.riftEnd", (float) .6, 1); - } - } - else - { + } + } + else + { - - //otherwise, it creates the first half of the link. Next click will complete it. - key= PocketManager.instance.createUniqueInterDimLinkKey(); - this.writeToNBT(par1ItemStack, par4, par5+offset, par6,par3World.provider.dimensionId,orientation); - par2EntityPlayer.sendChatToPlayer("Rift Signature Stored"); + + //otherwise, it creates the first half of the link. Next click will complete it. + key= PocketManager.instance.createUniqueInterDimLinkKey(); + this.writeToNBT(par1ItemStack, par4, par5+offset, par6,par3World.provider.dimensionId,orientation); + par2EntityPlayer.sendChatToPlayer("Rift Signature Stored"); par2EntityPlayer.worldObj.playSoundAtEntity(par2EntityPlayer,"mods.DimDoors.sfx.riftStart", (float) .6, 1); - } - //dimHelper.instance.save(); - } - - - return true; - - - } - - @SideOnly(Side.CLIENT) - - /** - * allows items to add custom lines of information to the mouseover description - */ - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) - { - - if(par1ItemStack.hasTagCompound()) - { - if(par1ItemStack.stackTagCompound.getBoolean("isCreated")) - { - Integer[] coords = this.readFromNBT(par1ItemStack); - - par3List.add(String.valueOf("Leads to dim "+coords[3] +" with depth "+(PocketManager.instance.getDimDepth(coords[3])))); - par3List.add("at x="+coords[0]+" y="+coords[1]+" z="+coords[2]); - - } - - } - else - { - par3List.add("First click stores location,"); - par3List.add ("second click creates two rifts,"); - par3List.add("that link the first location"); - par3List.add("with the second location"); + } + //dimHelper.instance.save(); + } - } - } - - public void writeToNBT(ItemStack itemStack,int x, int y, int z, int dimID,int orientation) - { - NBTTagCompound tag; + return true; - if(itemStack.hasTagCompound()) - { - tag = itemStack.getTagCompound(); - - } - else - { - tag= new NBTTagCompound(); - } - - tag.setInteger("linkX", x); - tag.setInteger("linkY", y); - tag.setInteger("linkZ", z); - tag.setInteger("linkDimID", dimID); - tag.setBoolean("isCreated", true); - tag.setInteger("orientation", orientation); - itemStack.setTagCompound(tag); + } - } + @SideOnly(Side.CLIENT) - /** - * Read the stack fields from a NBT object. - */ - public Integer[] readFromNBT(ItemStack itemStack) - { - - NBTTagCompound tag; - Integer[] linkCoords = new Integer[5]; - if(itemStack.hasTagCompound()) - { - tag = itemStack.getTagCompound(); + /** + * allows items to add custom lines of information to the mouseover description + */ + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { - if(!tag.getBoolean("isCreated")) - { - return null; - } - linkCoords[0]=tag.getInteger("linkX"); - linkCoords[1]=tag.getInteger("linkY"); - linkCoords[2]=tag.getInteger("linkZ"); - linkCoords[3]=tag.getInteger("linkDimID"); - linkCoords[4]=tag.getInteger("orientation"); + if(par1ItemStack.hasTagCompound()) + { + if(par1ItemStack.stackTagCompound.getBoolean("isCreated")) + { + Integer[] coords = this.readFromNBT(par1ItemStack); - - - } - return linkCoords; - - } - - - @Override - public void onCreated(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - if(!par2World.isRemote) - { - /** + par3List.add(String.valueOf("Leads to dim "+coords[3] +" with depth "+(PocketManager.instance.getDimDepth(coords[3])))); + par3List.add("at x="+coords[0]+" y="+coords[1]+" z="+coords[2]); + + } + + } + else + { + par3List.add("First click stores location,"); + par3List.add ("second click creates two rifts,"); + par3List.add("that link the first location"); + par3List.add("with the second location"); + + + } + } + + public void writeToNBT(ItemStack itemStack,int x, int y, int z, int dimID,int orientation) + { + NBTTagCompound tag; + + if(itemStack.hasTagCompound()) + { + tag = itemStack.getTagCompound(); + + } + else + { + tag= new NBTTagCompound(); + } + + tag.setInteger("linkX", x); + tag.setInteger("linkY", y); + tag.setInteger("linkZ", z); + tag.setInteger("linkDimID", dimID); + tag.setBoolean("isCreated", true); + tag.setInteger("orientation", orientation); + + itemStack.setTagCompound(tag); + + } + + /** + * Read the stack fields from a NBT object. + */ + public Integer[] readFromNBT(ItemStack itemStack) + { + + NBTTagCompound tag; + Integer[] linkCoords = new Integer[5]; + if(itemStack.hasTagCompound()) + { + tag = itemStack.getTagCompound(); + + if(!tag.getBoolean("isCreated")) + { + return null; + } + linkCoords[0]=tag.getInteger("linkX"); + linkCoords[1]=tag.getInteger("linkY"); + linkCoords[2]=tag.getInteger("linkZ"); + linkCoords[3]=tag.getInteger("linkDimID"); + linkCoords[4]=tag.getInteger("orientation"); + + + + } + return linkCoords; + + } + + + @Override + public void onCreated(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + if(!par2World.isRemote) + { + /** //creates the first half of the link on item creation int key= dimHelper.instance.createUniqueInterDimLinkKey(); LinkData linkData= new LinkData(par2World.provider.dimensionId,MathHelper.floor_double(par3EntityPlayer.posX),MathHelper.floor_double(par3EntityPlayer.posY),MathHelper.floor_double(par3EntityPlayer.posZ)); @@ -263,7 +259,7 @@ public class itemLinkSignature extends Item dimHelper.instance.interDimLinkList.put(key, linkData); par1ItemStack.setItemDamage(key); - **/ - } - } + **/ + } + } } diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 390bb86..07fa2a0 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -10,6 +10,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityEggInfo; import net.minecraft.entity.EntityList; import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.EnumToolMaterial; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.biome.BiomeGenBase; @@ -36,12 +37,12 @@ import StevenDimDoors.mod_pocketDim.commands.CommandTeleportPlayer; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.items.ItemBlockDimWall; -import StevenDimDoors.mod_pocketDim.items.ItemChaosDoor; +import StevenDimDoors.mod_pocketDim.items.ItemUnstableDoor; import StevenDimDoors.mod_pocketDim.items.ItemRiftBlade; import StevenDimDoors.mod_pocketDim.items.ItemStabilizedRiftSignature; import StevenDimDoors.mod_pocketDim.items.ItemStableFabric; -import StevenDimDoors.mod_pocketDim.items.itemDimDoor; -import StevenDimDoors.mod_pocketDim.items.itemExitDoor; +import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; +import StevenDimDoors.mod_pocketDim.items.ItemWarpDoor; import StevenDimDoors.mod_pocketDim.items.itemLinkSignature; import StevenDimDoors.mod_pocketDim.items.itemRiftRemover; import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler; @@ -101,7 +102,7 @@ public class mod_pocketDim public static mod_pocketDim instance = new mod_pocketDim(); public static Block transientDoor; - public static Block exitDoor; + public static Block warpDoor; public static Block unstableDoor; public static Block blockLimbo; public static dimDoor dimensionalDoor; @@ -184,7 +185,7 @@ public class mod_pocketDim blockDimWall = (new BlockDimWall(properties.FabricBlockID, 0, Material.iron)).setLightValue(1.0F).setHardness(0.1F).setUnlocalizedName("blockDimWall"); blockDimWallPerm = (new BlockDimWallPerm(properties.PermaFabricBlockID, 0, Material.iron)).setLightValue(1.0F).setBlockUnbreakable().setResistance(6000000.0F).setUnlocalizedName("blockDimWallPerm"); - exitDoor = (new ExitDoor(properties.WarpDoorID, Material.wood)).setHardness(1.0F) .setUnlocalizedName("dimDoorWarp"); + warpDoor = (new ExitDoor(properties.WarpDoorID, Material.wood)).setHardness(1.0F) .setUnlocalizedName("dimDoorWarp"); blockRift = (BlockRift) (new BlockRift(properties.RiftBlockID, 0, Material.air, properties).setHardness(1.0F) .setUnlocalizedName("rift")); blockLimbo = (new BlockLimbo(properties.LimboBlockID, 15, Material.iron, properties.LimboDimensionID, decay).setHardness(.2F).setUnlocalizedName("BlockLimbo").setLightValue(.0F)); unstableDoor = (new ChaosDoor(properties.UnstableDoorID, Material.iron).setHardness(.2F).setUnlocalizedName("chaosDoor").setLightValue(.0F) ); @@ -192,13 +193,13 @@ public class mod_pocketDim dimHatch = (new dimHatch(properties.TransTrapdoorID, 84, Material.iron)).setHardness(1.0F) .setUnlocalizedName("dimHatch"); // dimRail = (new DimRail(dimRailID, 88, false)).setHardness(.5F) .setUnlocalizedName("dimRail"); - itemDimDoor = (new itemDimDoor(properties.DimensionalDoorItemID, Material.iron)).setUnlocalizedName("itemDimDoor"); - itemExitDoor = (new itemExitDoor(properties.WarpDoorItemID, Material.wood)).setUnlocalizedName("itemDimDoorWarp"); + itemDimDoor = (new ItemDimensionalDoor(properties.DimensionalDoorItemID, Material.iron)).setUnlocalizedName("itemDimDoor"); + itemExitDoor = (new ItemWarpDoor(properties.WarpDoorItemID, Material.wood)).setUnlocalizedName("itemDimDoorWarp"); itemLinkSignature = (new itemLinkSignature(properties.RiftSignatureItemID)).setUnlocalizedName("itemLinkSignature"); itemRiftRemover = (new itemRiftRemover(properties.RiftRemoverItemID, Material.wood)).setUnlocalizedName("itemRiftRemover"); itemStableFabric = (new ItemStableFabric(properties.StableFabricItemID, 0)).setUnlocalizedName("itemStableFabric"); - itemChaosDoor = (new ItemChaosDoor(properties.UnstableDoorItemID, Material.iron)).setUnlocalizedName("itemChaosDoor"); - itemRiftBlade = (new ItemRiftBlade(properties.RiftBladeItemID)).setUnlocalizedName("ItemRiftBlade"); + itemChaosDoor = (new ItemUnstableDoor(properties.UnstableDoorItemID, Material.iron)).setUnlocalizedName("itemChaosDoor"); + itemRiftBlade = (new ItemRiftBlade(properties.RiftBladeItemID, EnumToolMaterial.GOLD)).setUnlocalizedName("ItemRiftBlade"); itemStabilizedLinkSignature = (new ItemStabilizedRiftSignature(properties.StabilizedRiftSignatureItemID)).setUnlocalizedName("itemStabilizedRiftSig"); mod_pocketDim.limboBiome= (new BiomeGenLimbo(properties.LimboBiomeID)); @@ -207,7 +208,7 @@ public class mod_pocketDim GameRegistry.registerWorldGenerator(mod_pocketDim.riftGen); GameRegistry.registerBlock(unstableDoor, "Unstable Door"); - GameRegistry.registerBlock(exitDoor, "Warp Door"); + GameRegistry.registerBlock(warpDoor, "Warp Door"); GameRegistry.registerBlock(blockRift, "Rift"); GameRegistry.registerBlock(blockLimbo, "Unraveled Fabric"); GameRegistry.registerBlock(dimensionalDoor, "Dimensional Door"); @@ -226,7 +227,7 @@ public class mod_pocketDim LanguageRegistry.addName(transientDoor , "transientDoor"); LanguageRegistry.addName(blockRift , "Rift"); LanguageRegistry.addName(blockLimbo , "Unraveled Fabric"); - LanguageRegistry.addName(exitDoor , "Warp Door"); + LanguageRegistry.addName(warpDoor , "Warp Door"); LanguageRegistry.addName(unstableDoor , "Unstable Door"); LanguageRegistry.addName(blockDimWall , "Fabric of Reality"); LanguageRegistry.addName(blockDimWallPerm , "Eternal Fabric"); diff --git a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java index dfc4a21..9fa5a04 100644 --- a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java +++ b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java @@ -65,7 +65,7 @@ public class BlockRotator hasOrientations[Block.rail.blockID] = true; hasOrientations[mod_pocketDim.dimensionalDoor.blockID] = true; - hasOrientations[mod_pocketDim.exitDoor.blockID] = true; + hasOrientations[mod_pocketDim.warpDoor.blockID] = true; } diff --git a/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java index db56e71..abbc7ea 100644 --- a/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java +++ b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java @@ -12,7 +12,7 @@ import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.IDimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.items.itemDimDoor; +import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; import cpw.mods.fml.common.IWorldGenerator; public class GatewayGenerator implements IWorldGenerator @@ -145,7 +145,7 @@ public class GatewayGenerator implements IWorldGenerator } //Place the shiny transient door into a dungeon - itemDimDoor.placeDoorBlock(world, x, y + 1, z, 0, mod_pocketDim.transientDoor); + ItemDimensionalDoor.placeDoorBlock(world, x, y + 1, z, 0, mod_pocketDim.transientDoor); } } } diff --git a/StevenDimDoors/mod_pocketDimClient/RiftFX.java b/StevenDimDoors/mod_pocketDimClient/RiftFX.java index 0157b91..69310f0 100644 --- a/StevenDimDoors/mod_pocketDimClient/RiftFX.java +++ b/StevenDimDoors/mod_pocketDimClient/RiftFX.java @@ -1,12 +1,11 @@ package StevenDimDoors.mod_pocketDimClient; -import StevenDimDoors.mod_pocketDim.core.PocketManager; import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.particle.EntityFX; -import net.minecraft.client.particle.EntityFireworkSparkFX; import net.minecraft.client.renderer.Tessellator; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -108,23 +107,12 @@ public class RiftFX extends EntityFX float f12 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)par2 - interpPosY); float f13 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)par2 - interpPosZ); float f14 = 0F; - - try - { - if(PocketManager.instance.getDimData(this.worldObj.provider.dimensionId).isPocket) - { - f14=.7F; - } - else - { - - } - } - catch(Exception E) - { - - } + if (PocketManager.getDimensionData(worldObj).isPocketDimension()) + { + f14 = 0.7F; + } + par1Tessellator.setColorRGBA_F(this.particleRed * f14, this.particleGreen * f14, this.particleBlue * f14, (float) .7); par1Tessellator.addVertexWithUV((double)(f11 - par3 * f10 - par6 * f10), (double)(f12 - par4 * f10), (double)(f13 - par5 * f10 - par7 * f10), (double)f7, (double)f9); par1Tessellator.addVertexWithUV((double)(f11 - par3 * f10 + par6 * f10), (double)(f12 + par4 * f10), (double)(f13 - par5 * f10 + par7 * f10), (double)f7, (double)f8); -- 2.39.5 From 4b5870339b93b58d2af4acea177ad52cd44dcbf8 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 31 Aug 2013 16:30:41 -0400 Subject: [PATCH 037/544] Removed Obsolete Code from PocketManager Removed obsolete code from PocketManager. Much of that functionality has already been reimplemented in other classes. --- .../mod_pocketDim/core/PocketManager.java | 203 ------------------ 1 file changed, 203 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index a905e7e..2769ebe 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -7,34 +7,17 @@ import java.io.ObjectOutputStream; import java.util.HashMap; import java.util.Random; -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.packet.Packet41EntityEffect; -import net.minecraft.network.packet.Packet43Experience; -import net.minecraft.network.packet.Packet9Respawn; -import net.minecraft.potion.PotionEffect; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; -import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.DDTeleporter; import StevenDimDoors.mod_pocketDim.ObjectSaveInputStream; -import StevenDimDoors.mod_pocketDim.PacketHandler; import StevenDimDoors.mod_pocketDim.TileEntityRift; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; -import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import StevenDimDoors.mod_pocketDim.util.Point4D; import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; /** * This class regulates all the operations involving the storage and manipulation of dimensions. It handles saving dim data, teleporting the player, and @@ -74,112 +57,6 @@ public class PocketManager return isInitialized; } - public ILinkData createLink(ILinkData link) - { - DDProperties properties = DDProperties.instance(); - - if(!PocketManager.dimList.containsKey(link.locDimID)) - { - NewDimData locationDimData= new NewDimData(link.locDimID, false, 0, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord); - PocketManager.dimList.put(link.locDimID, locationDimData); - link.isLocPocket=false; - } - if(!dimList.containsKey(link.destDimID)) - { - PocketManager.dimList.put(link.destDimID, new NewDimData(link.destDimID, false, 0, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord)); - } - NewDimData locationDimData= PocketManager.instance.getDimData(link.locDimID); - link.isLocPocket=locationDimData.isPocket; - locationDimData.addLinkToDim(link); - - World world = PocketManager.getWorld(link.locDimID); - if (world != null) - { - if (!mod_pocketDim.blockRift.isBlockImmune(world, link.locXCoord, link.locYCoord, link.locZCoord)) - { - world.setBlock(link.locXCoord, link.locYCoord, link.locZCoord, properties.RiftBlockID); - } - } - //Notifies other players that a link has been created. - //TODO: Couldn't we use the serverside/clientside annotations to achieve this instead? Seems safer. ~SenseiKiwi - if(FMLCommonHandler.instance().getEffectiveSide()==Side.SERVER) - { - PacketHandler.onLinkCreatedPacket(link); - } - return link; - } - - /** - * properly deletes a link at the given coordinates. used by the rift remover. Also notifies clients of change. - * @param locationDimID - * @param locationXCoord - * @param locationYCoord - * @param locationZCoord - */ - public void removeLink( int locationDimID, int locationXCoord, int locationYCoord, int locationZCoord) - { - if(!PocketManager.dimList.containsKey(locationDimID)) - { - NewDimData locationDimData= new NewDimData(locationDimID, false, 0, locationDimID,locationXCoord,locationYCoord,locationZCoord); - PocketManager.dimList.put(locationDimID, locationDimData); - } - ILinkData link = this.getLinkDataFromCoords(locationXCoord, locationYCoord, locationZCoord, locationDimID); - PocketManager.instance.getDimData(locationDimID).removeLinkAtCoords(link); - //updates clients that a rift has been removed - if(FMLCommonHandler.instance().getEffectiveSide()==Side.SERVER) - { - PacketHandler.onLinkRemovedPacket(link); - this.save(); - } - } - - /** - * generates a door based on what door was used to teleport. Only functions once per linking. - * @param world- door - * @param incLink - */ - public void generateDoor(World world, ILinkData incLink) - { - int locX = incLink.locXCoord; - int locY = incLink.locYCoord; - int locZ = incLink.locZCoord; - - int destX = incLink.destXCoord; - int destY = incLink.destYCoord; - int destZ = incLink.destZCoord; - - DDProperties properties = DDProperties.instance(); - - if(!incLink.hasGennedDoor) - { - int destinationID = incLink.destDimID; - - int id =world.getBlockId(locX, locY, locZ); - if(id==properties.WarpDoorID||id==properties.DimensionalDoorID||id==properties.TransientDoorID) - { - int doorTypeToPlace=id; - if(DimensionManager.getWorld(destinationID)==null) - { - DimensionManager.initDimension(destinationID); - } - ILinkData destLink = this.getLinkDataFromCoords(destX, destY, destZ, destinationID); - int destOrientation = 0; - if(destLink!=null) - { - destOrientation = destLink.linkOrientation; - destLink.hasGennedDoor=true; - } - int blockToReplace= DimensionManager.getWorld(destinationID).getBlockId(destX, destY, destZ); - if(blockToReplace!=properties.DimensionalDoorID&&blockToReplace!=properties.WarpDoorID&&blockToReplace != properties.TransientDoorID) - { - DimensionManager.getWorld(destinationID).setBlock(destX, destY-1, destZ, doorTypeToPlace,destOrientation,2); - DimensionManager.getWorld(destinationID).setBlock(destX, destY, destZ, doorTypeToPlace,8,2); - } - incLink.hasGennedDoor=true; - } - } - } - /** * simple method called on startup to register all dims saved in the dim list. Only tries to register pocket dims, though. Also calls load() * @return @@ -283,86 +160,6 @@ public class PocketManager while (keyLinkMapping.containsKey(linkKey)); return linkKey; } - - /** - * Method used to create and register a new pocket dimension. Creates a reverse link if necessary. - * Populates the destination as well. - */ - private NewDimData createDestinationPocket(IDimLink link) - { - //First check the destination type - if (link.linkType() != IDimLink.TYPE_DUNGEON && link.linkType() != IDimLink.TYPE_POCKET) - { - throw new IllegalArgumentException("The link must lead to a dimensional dungeon or a pocket dimension."); - } - - DDProperties properties = DDProperties.instance(); - - //FIXME: This code had a check for whether dimension 0 was null. Why? Removed it for the time being. ~SenseiKiwi - - - if (PocketManager.getWorld(link.locDimID) == null) - { - PocketManager.initDimension(link.locDimID); - } - - int dimensionID; - int depth = this.getDimDepth(link.locDimID); - dimensionID = getNextFreeDimId(); - registerDimension(dimensionID, properties.PocketProviderID); - NewDimData locationDimData; - NewDimData destDimData; - - if(PocketManager.dimList.containsKey(link.locDimID)&&!DimensionManager.getWorld(link.locDimID).isRemote) //checks to see if dim is already registered. If not, it creates a DimData entry for it later - { - //randomizes exit if deep enough - locationDimData= dimList.get(DimensionManager.getWorld(link.locDimID).provider.dimensionId); - - if(depth>5) - { - if(depth>=12) - { - depth=11; - } - if(rand.nextInt(13-depth)==0) - { - ILinkData link1=getRandomLinkData(false); - } - } - if(locationDimData.isPocket) //determines the qualites of the pocket dim being created, based on parent dim. - { - if(isGoingDown) - { - destDimData= new NewDimData(dimensionID, true, locationDimData.depth+1, locationDimData.exitDimLink); - } - else - { - destDimData= new NewDimData(dimensionID, true, locationDimData.depth-1, locationDimData.exitDimLink); - } - } - else - { - destDimData= new NewDimData(dimensionID, true, 1, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord); - } - - } - else - { - locationDimData= new NewDimData(link.locDimID, false, 0, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord); - destDimData= new NewDimData(dimensionID, true, 1, link.locDimID,link.locXCoord,link.locYCoord,link.locZCoord); - } - destDimData.isDimRandomRift=isRandomRift; - PocketManager.dimList.put(DimensionManager.getWorld(link.locDimID).provider.dimensionId, locationDimData); - PocketManager.dimList.put(dimensionID, destDimData); - - if(FMLCommonHandler.instance().getEffectiveSide()==Side.SERVER)//sends packet to clients notifying them that a new dim has been created. - { - PacketHandler.onDimCreatedPacket(destDimData); - } - link = this.createLink(DimensionManager.getWorld(link.locDimID).provider.dimensionId,dimensionID,link.locXCoord,link.locYCoord,link.locZCoord, link.destXCoord,constrainPocketY(link.destYCoord),link.destZCoord,link.linkOrientation); //creates and registers the two rifts that link the parent and pocket dim. - this.createLink(dimensionID,DimensionManager.getWorld(link.locDimID).provider.dimensionId, link.destXCoord,constrainPocketY(link.destYCoord),link.destZCoord, link.locXCoord,link.locYCoord,link.locZCoord, BlockRotator.transformMetadata(link.linkOrientation, 2, Block.doorWood.blockID)); - return link; - } /** * Function that saves all dim data in a hashMap. Calling too often can cause Concurrent modification exceptions, so be careful. -- 2.39.5 From ea1fc5f4c0828a4041048f67a64afaf2b50ca4c2 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 31 Aug 2013 16:43:18 -0400 Subject: [PATCH 038/544] Reorganized and Renamed Classes Moved tile entity classes to a separate package. Renamed some block classes to match their in-game names (e.g. ChaosDoor -> UnstableDoor). Moved TransientDoor to the blocks package. Cleaned up a little bit of the code and automatically updated references to the classes that were modified. --- .../mod_pocketDim/blocks/BlockRift.java | 2 +- .../{dimDoor.java => DimensionalDoor.java} | 10 ++-- .../{ => blocks}/TransientDoor.java | 25 +++----- .../{ChaosDoor.java => UnstableDoor.java} | 9 +-- .../blocks/{ExitDoor.java => WarpDoor.java} | 4 +- .../mod_pocketDim/blocks/linkDimDoor.java | 56 ------------------ .../mod_pocketDim/blocks/linkExitDoor.java | 57 ------------------- .../mod_pocketDim/core/PocketManager.java | 2 +- .../mod_pocketDim/mod_pocketDim.java | 21 ++++--- .../mod_pocketDim/schematic/BlockRotator.java | 4 +- .../ticking/RiftRegenerator.java | 2 +- .../{ => tileentities}/TileEntityDimDoor.java | 2 +- .../{ => tileentities}/TileEntityDimRail.java | 2 +- .../{ => tileentities}/TileEntityRift.java | 3 +- .../mod_pocketDimClient/ClientProxy.java | 4 +- .../mod_pocketDimClient/RenderDimDoor.java | 4 +- .../mod_pocketDimClient/RenderDimRail.java | 6 +- .../mod_pocketDimClient/RenderRift.java | 6 +- 18 files changed, 48 insertions(+), 171 deletions(-) rename StevenDimDoors/mod_pocketDim/blocks/{dimDoor.java => DimensionalDoor.java} (98%) rename StevenDimDoors/mod_pocketDim/{ => blocks}/TransientDoor.java (87%) rename StevenDimDoors/mod_pocketDim/blocks/{ChaosDoor.java => UnstableDoor.java} (90%) rename StevenDimDoors/mod_pocketDim/blocks/{ExitDoor.java => WarpDoor.java} (95%) delete mode 100644 StevenDimDoors/mod_pocketDim/blocks/linkDimDoor.java delete mode 100644 StevenDimDoors/mod_pocketDim/blocks/linkExitDoor.java rename StevenDimDoors/mod_pocketDim/{ => tileentities}/TileEntityDimDoor.java (96%) rename StevenDimDoors/mod_pocketDim/{ => tileentities}/TileEntityDimRail.java (95%) rename StevenDimDoors/mod_pocketDim/{ => tileentities}/TileEntityRift.java (98%) diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java b/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java index 869bb8e..bca54b5 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java @@ -16,9 +16,9 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; -import StevenDimDoors.mod_pocketDim.TileEntityRift; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDimClient.ClosingRiftFX; import StevenDimDoors.mod_pocketDimClient.GoggleRiftFX; import StevenDimDoors.mod_pocketDimClient.RiftFX; diff --git a/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java similarity index 98% rename from StevenDimDoors/mod_pocketDim/blocks/dimDoor.java rename to StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java index e8a6319..1d0cd0d 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/dimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java @@ -19,21 +19,21 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.DDTeleporter; -import StevenDimDoors.mod_pocketDim.TileEntityDimDoor; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.IDimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class dimDoor extends BlockContainer +public class DimensionalDoor extends BlockContainer { - private static DDProperties properties = null; + protected static DDProperties properties = null; private Icon blockIconBottom; - public dimDoor(int par1, Material material) + public DimensionalDoor(int par1, Material material) { super(par1, material); @@ -197,7 +197,7 @@ public class dimDoor extends BlockContainer //Called to update the render information on the tile entity. Could probably implement a data watcher, //but this works fine and is more versatile I think. - public dimDoor updateAttachedTile(World world, int x, int y, int z) + public DimensionalDoor updateAttachedTile(World world, int x, int y, int z) { TileEntity tile = world.getBlockTileEntity(x, y, z); if (tile instanceof TileEntityDimDoor) diff --git a/StevenDimDoors/mod_pocketDim/TransientDoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java similarity index 87% rename from StevenDimDoors/mod_pocketDim/TransientDoor.java rename to StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java index 7e02a31..6fbbc93 100644 --- a/StevenDimDoors/mod_pocketDim/TransientDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java @@ -1,4 +1,4 @@ -package StevenDimDoors.mod_pocketDim; +package StevenDimDoors.mod_pocketDim.blocks; import java.util.Random; @@ -10,43 +10,34 @@ import net.minecraft.util.Icon; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.blocks.ExitDoor; +import StevenDimDoors.mod_pocketDim.DDTeleporter; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.IDimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class TransientDoor extends ExitDoor +public class TransientDoor extends WarpDoor { - - protected TransientDoor(int par1, Material material) + public TransientDoor(int blockID, Material material) { - super(par1, Material.grass); - // this.blockIndexInTexture = 18; - - if (properties == null) - properties = DDProperties.instance(); + super(blockID, material); } - private static DDProperties properties = null; - public void registerIcons(IconRegister par1IconRegister) { this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); - } - @SideOnly(Side.CLIENT) /** * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side */ + @SideOnly(Side.CLIENT) public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) { - return this.blockIcon; - - } + public boolean isCollidable() { return false; diff --git a/StevenDimDoors/mod_pocketDim/blocks/ChaosDoor.java b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java similarity index 90% rename from StevenDimDoors/mod_pocketDim/blocks/ChaosDoor.java rename to StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java index f4c01e5..74a0f73 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/ChaosDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java @@ -1,12 +1,8 @@ package StevenDimDoors.mod_pocketDim.blocks; -import java.util.Random; - import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.Entity; import net.minecraft.util.Icon; -import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; @@ -17,12 +13,12 @@ import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class ChaosDoor extends dimDoor +public class UnstableDoor extends DimensionalDoor { private Icon blockIconBottom; private static DDProperties properties = null; - public ChaosDoor(int par1, Material material) + public UnstableDoor(int par1, Material material) { super(par1, material); if (properties == null) @@ -33,7 +29,6 @@ public class ChaosDoor extends dimDoor { this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); - } @SideOnly(Side.CLIENT) diff --git a/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java similarity index 95% rename from StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java rename to StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java index 1e4feb9..cbe5159 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/ExitDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java @@ -15,11 +15,11 @@ import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class ExitDoor extends dimDoor +public class WarpDoor extends DimensionalDoor { private Icon blockIconBottom; - public ExitDoor(int blockID, Material material) + public WarpDoor(int blockID, Material material) { super(blockID, material); } diff --git a/StevenDimDoors/mod_pocketDim/blocks/linkDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/linkDimDoor.java deleted file mode 100644 index 1f97f82..0000000 --- a/StevenDimDoors/mod_pocketDim/blocks/linkDimDoor.java +++ /dev/null @@ -1,56 +0,0 @@ -package StevenDimDoors.mod_pocketDim.blocks; - -import java.util.Random; - -import StevenDimDoors.mod_pocketDim.mod_pocketDim; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.Item; -import net.minecraft.util.Icon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -public class linkDimDoor extends dimDoor -{ - private Icon blockIconBottom; - public linkDimDoor(int par1, Material material) { - - super(par1, material); - // TODO Auto-generated constructor stub - - } - - - @SideOnly(Side.CLIENT) - - /** - * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side - */ - public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) - { - if(par1IBlockAccess.getBlockId(par2, par3-1, par4)==this.blockID) - { - return this.blockIcon; - } - else - { - return this.blockIconBottom; - } - } - public void registerIcons(IconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); - this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); - - } - -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/linkExitDoor.java b/StevenDimDoors/mod_pocketDim/blocks/linkExitDoor.java deleted file mode 100644 index ac8211e..0000000 --- a/StevenDimDoors/mod_pocketDim/blocks/linkExitDoor.java +++ /dev/null @@ -1,57 +0,0 @@ -package StevenDimDoors.mod_pocketDim.blocks; - -import java.util.Random; - -import StevenDimDoors.mod_pocketDim.mod_pocketDim; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.util.Icon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -public class linkExitDoor extends ExitDoor -{ - private Icon blockIconBottom; - public linkExitDoor(int par1,Material par2Material) - { - - super(par1, Material.wood); - //this.blockIndexInTexture = 20; - - - - // TODO Auto-generated constructor stub - } - @SideOnly(Side.CLIENT) - - /** - * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side - */ - public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) - { - if(par1IBlockAccess.getBlockId(par2, par3-1, par4)==this.blockID) - { - return this.blockIcon; - } - else - { - return this.blockIconBottom; - } - } - - public void registerIcons(IconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); - this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); - - } -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 2769ebe..99e5548 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -14,8 +14,8 @@ import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.ObjectSaveInputStream; -import StevenDimDoors.mod_pocketDim.TileEntityRift; import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDim.util.Point4D; import cpw.mods.fml.common.FMLCommonHandler; diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 07fa2a0..1720449 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -20,9 +20,10 @@ import StevenDimDoors.mod_pocketDim.blocks.BlockDimWall; import StevenDimDoors.mod_pocketDim.blocks.BlockDimWallPerm; import StevenDimDoors.mod_pocketDim.blocks.BlockLimbo; import StevenDimDoors.mod_pocketDim.blocks.BlockRift; -import StevenDimDoors.mod_pocketDim.blocks.ChaosDoor; -import StevenDimDoors.mod_pocketDim.blocks.ExitDoor; -import StevenDimDoors.mod_pocketDim.blocks.dimDoor; +import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; +import StevenDimDoors.mod_pocketDim.blocks.TransientDoor; +import StevenDimDoors.mod_pocketDim.blocks.UnstableDoor; +import StevenDimDoors.mod_pocketDim.blocks.WarpDoor; import StevenDimDoors.mod_pocketDim.blocks.dimHatch; import StevenDimDoors.mod_pocketDim.commands.CommandCreateDungeonRift; import StevenDimDoors.mod_pocketDim.commands.CommandCreatePocket; @@ -37,11 +38,11 @@ import StevenDimDoors.mod_pocketDim.commands.CommandTeleportPlayer; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.items.ItemBlockDimWall; -import StevenDimDoors.mod_pocketDim.items.ItemUnstableDoor; +import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; import StevenDimDoors.mod_pocketDim.items.ItemRiftBlade; import StevenDimDoors.mod_pocketDim.items.ItemStabilizedRiftSignature; import StevenDimDoors.mod_pocketDim.items.ItemStableFabric; -import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; +import StevenDimDoors.mod_pocketDim.items.ItemUnstableDoor; import StevenDimDoors.mod_pocketDim.items.ItemWarpDoor; import StevenDimDoors.mod_pocketDim.items.itemLinkSignature; import StevenDimDoors.mod_pocketDim.items.itemRiftRemover; @@ -50,6 +51,8 @@ import StevenDimDoors.mod_pocketDim.ticking.LimboDecay; import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; import StevenDimDoors.mod_pocketDim.ticking.MonolithSpawner; import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDim.world.BiomeGenLimbo; import StevenDimDoors.mod_pocketDim.world.BiomeGenPocket; import StevenDimDoors.mod_pocketDim.world.GatewayGenerator; @@ -105,7 +108,7 @@ public class mod_pocketDim public static Block warpDoor; public static Block unstableDoor; public static Block blockLimbo; - public static dimDoor dimensionalDoor; + public static DimensionalDoor dimensionalDoor; public static Block blockDimWall; public static Block dimHatch; public static Block blockDimWallPerm; @@ -185,11 +188,11 @@ public class mod_pocketDim blockDimWall = (new BlockDimWall(properties.FabricBlockID, 0, Material.iron)).setLightValue(1.0F).setHardness(0.1F).setUnlocalizedName("blockDimWall"); blockDimWallPerm = (new BlockDimWallPerm(properties.PermaFabricBlockID, 0, Material.iron)).setLightValue(1.0F).setBlockUnbreakable().setResistance(6000000.0F).setUnlocalizedName("blockDimWallPerm"); - warpDoor = (new ExitDoor(properties.WarpDoorID, Material.wood)).setHardness(1.0F) .setUnlocalizedName("dimDoorWarp"); + warpDoor = (new WarpDoor(properties.WarpDoorID, Material.wood)).setHardness(1.0F) .setUnlocalizedName("dimDoorWarp"); blockRift = (BlockRift) (new BlockRift(properties.RiftBlockID, 0, Material.air, properties).setHardness(1.0F) .setUnlocalizedName("rift")); blockLimbo = (new BlockLimbo(properties.LimboBlockID, 15, Material.iron, properties.LimboDimensionID, decay).setHardness(.2F).setUnlocalizedName("BlockLimbo").setLightValue(.0F)); - unstableDoor = (new ChaosDoor(properties.UnstableDoorID, Material.iron).setHardness(.2F).setUnlocalizedName("chaosDoor").setLightValue(.0F) ); - dimensionalDoor = (dimDoor) (new dimDoor(properties.DimensionalDoorID, Material.iron)).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor"); + unstableDoor = (new UnstableDoor(properties.UnstableDoorID, Material.iron).setHardness(.2F).setUnlocalizedName("chaosDoor").setLightValue(.0F) ); + dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(properties.DimensionalDoorID, Material.iron)).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor"); dimHatch = (new dimHatch(properties.TransTrapdoorID, 84, Material.iron)).setHardness(1.0F) .setUnlocalizedName("dimHatch"); // dimRail = (new DimRail(dimRailID, 88, false)).setHardness(.5F) .setUnlocalizedName("dimRail"); diff --git a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java index 9fa5a04..06f14c8 100644 --- a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java +++ b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java @@ -7,7 +7,7 @@ import net.minecraft.block.BlockRedstoneRepeater; import net.minecraft.block.BlockStairs; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.blocks.dimDoor; +import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; public class BlockRotator { @@ -379,7 +379,7 @@ public class BlockRotator break; } } - else if(Block.blocksList[blockID] instanceof BlockRedstoneRepeater || Block.blocksList[blockID] instanceof BlockDoor || Block.blocksList[blockID] instanceof dimDoor || blockID== Block.tripWireSource.blockID || Block.blocksList[blockID] instanceof BlockComparator) + else if(Block.blocksList[blockID] instanceof BlockRedstoneRepeater || Block.blocksList[blockID] instanceof BlockDoor || Block.blocksList[blockID] instanceof DimensionalDoor || blockID== Block.tripWireSource.blockID || Block.blocksList[blockID] instanceof BlockComparator) { switch (metadata) { diff --git a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java index 6fb2ff1..950c505 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java +++ b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java @@ -3,11 +3,11 @@ package StevenDimDoors.mod_pocketDim.ticking; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.TileEntityRift; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.IDimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDim.util.Point4D; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; diff --git a/StevenDimDoors/mod_pocketDim/TileEntityDimDoor.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java similarity index 96% rename from StevenDimDoors/mod_pocketDim/TileEntityDimDoor.java rename to StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java index b96aad6..9f27d4e 100644 --- a/StevenDimDoors/mod_pocketDim/TileEntityDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java @@ -1,4 +1,4 @@ -package StevenDimDoors.mod_pocketDim; +package StevenDimDoors.mod_pocketDim.tileentities; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; diff --git a/StevenDimDoors/mod_pocketDim/TileEntityDimRail.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimRail.java similarity index 95% rename from StevenDimDoors/mod_pocketDim/TileEntityDimRail.java rename to StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimRail.java index 4ae98cb..2e1098b 100644 --- a/StevenDimDoors/mod_pocketDim/TileEntityDimRail.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimRail.java @@ -1,4 +1,4 @@ -package StevenDimDoors.mod_pocketDim; +package StevenDimDoors.mod_pocketDim.tileentities; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; diff --git a/StevenDimDoors/mod_pocketDim/TileEntityRift.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java similarity index 98% rename from StevenDimDoors/mod_pocketDim/TileEntityRift.java rename to StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index 72565c4..dfa27b5 100644 --- a/StevenDimDoors/mod_pocketDim/TileEntityRift.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -1,4 +1,4 @@ -package StevenDimDoors.mod_pocketDim; +package StevenDimDoors.mod_pocketDim.tileentities; @@ -16,6 +16,7 @@ import net.minecraft.network.packet.Packet132TileEntityData; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.IDimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; diff --git a/StevenDimDoors/mod_pocketDimClient/ClientProxy.java b/StevenDimDoors/mod_pocketDimClient/ClientProxy.java index f2a1bfb..b1428c3 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClientProxy.java +++ b/StevenDimDoors/mod_pocketDimClient/ClientProxy.java @@ -9,11 +9,11 @@ import net.minecraft.src.ModLoader; import net.minecraftforge.client.MinecraftForgeClient; import StevenDimDoors.mod_pocketDim.CommonProxy; import StevenDimDoors.mod_pocketDim.Spells; -import StevenDimDoors.mod_pocketDim.TileEntityDimDoor; -import StevenDimDoors.mod_pocketDim.TileEntityRift; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler; import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; public class ClientProxy extends CommonProxy diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index f0ea38a..6239fc8 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -14,9 +14,9 @@ import net.minecraft.tileentity.TileEntity; import org.lwjgl.opengl.GL11; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.TileEntityDimDoor; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.blocks.dimDoor; +import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimRail.java b/StevenDimDoors/mod_pocketDimClient/RenderDimRail.java index 886b5cd..e3e39b2 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimRail.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderDimRail.java @@ -14,9 +14,9 @@ import net.minecraft.tileentity.TileEntity; import org.lwjgl.opengl.GL11; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.TileEntityDimDoor; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.blocks.dimDoor; +import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -40,7 +40,7 @@ public class RenderDimRail extends TileEntitySpecialRenderer { try { - dimDoor.class.cast(Block.blocksList[properties.DimensionalDoorID]).updateAttatchedTile(tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord).getFullMetadata(tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord); + DimensionalDoor.class.cast(Block.blocksList[properties.DimensionalDoorID]).updateAttatchedTile(tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord).getFullMetadata(tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord); } catch(Exception e) diff --git a/StevenDimDoors/mod_pocketDimClient/RenderRift.java b/StevenDimDoors/mod_pocketDimClient/RenderRift.java index 2e3f308..adb4f13 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderRift.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderRift.java @@ -16,10 +16,10 @@ import org.lwjgl.opengl.GL11; import static org.lwjgl.opengl.GL11.*; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.TileEntityDimDoor; -import StevenDimDoors.mod_pocketDim.TileEntityRift; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.blocks.dimDoor; +import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -- 2.39.5 From 1cc1c374f6d7a205e808f5151d9a216d35dcf764 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 31 Aug 2013 16:46:40 -0400 Subject: [PATCH 039/544] Removed DimRail Files Removed files related to DimRail since they seem to be left over from a scrapped idea. We can revert this commit later to restore them. --- .../tileentities/TileEntityDimRail.java | 68 ----- .../mod_pocketDimClient/RenderDimRail.java | 283 ------------------ 2 files changed, 351 deletions(-) delete mode 100644 StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimRail.java delete mode 100644 StevenDimDoors/mod_pocketDimClient/RenderDimRail.java diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimRail.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimRail.java deleted file mode 100644 index 2e1098b..0000000 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimRail.java +++ /dev/null @@ -1,68 +0,0 @@ -package StevenDimDoors.mod_pocketDim.tileentities; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; - -public class TileEntityDimRail extends TileEntity - -{ - - public int orientation; - public boolean hasExit; - - - - - - public boolean canUpdate() - { - return false; - } - - public void updateEntity() - { - - - } - - @Override - public void readFromNBT(NBTTagCompound nbt) - { - super.readFromNBT(nbt); - int i = nbt.getInteger(("Size")); - - try - { - - this.orientation = nbt.getInteger("orientation"); - - this.hasExit = nbt.getBoolean("hasExit"); - - - - - - - } - catch (Exception e) - { - - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) - { - int i = 0; - super.writeToNBT(nbt); - - - nbt.setBoolean("hasExit", this.hasExit); - - nbt.setInteger("orientation", this.orientation); - - - - - } -} diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimRail.java b/StevenDimDoors/mod_pocketDimClient/RenderDimRail.java deleted file mode 100644 index e3e39b2..0000000 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimRail.java +++ /dev/null @@ -1,283 +0,0 @@ -package StevenDimDoors.mod_pocketDimClient; - -import java.nio.FloatBuffer; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ActiveRenderInfo; -import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.tileentity.TileEntity; - -import org.lwjgl.opengl.GL11; - -import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; -import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class RenderDimRail extends TileEntitySpecialRenderer -{ - FloatBuffer field_76908_a = GLAllocation.createDirectFloatBuffer(16); - - public RenderDimRail() - { - if (properties == null) - properties = DDProperties.instance(); - } - - private static DDProperties properties = null; - - /** - * Renders the dimdoor. - */ - public void renderDimDoorTileEntity(TileEntityDimDoor tile, double x, double y, double z, float par8) - { - try - { - DimensionalDoor.class.cast(Block.blocksList[properties.DimensionalDoorID]).updateAttatchedTile(tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord).getFullMetadata(tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord); - - } - catch(Exception e) - { - e.printStackTrace(); - } - - - float playerX = (float)this.tileEntityRenderer.playerX; - float playerY = (float)this.tileEntityRenderer.playerY; - float playerZ = (float)this.tileEntityRenderer.playerZ; - - float distance = (float) tile.getDistanceFrom(playerX, playerY, playerZ); - GL11.glDisable(GL11.GL_LIGHTING); - Random rand = new Random(31100L); - float var13 = 0.75F; - - for (int count = 0; count < 16; ++count) - { - GL11.glPushMatrix(); - float var15 = (float)(16 - count); - float var16 = 0.2625F; - float var17 = 1.0F / (var15 + 1.0F); - - if (count == 0) - { - this.bindTextureByName("/RIFT.png"); - var17 = 0.1F; - var15 = 25.0F; - var16 = 0.125F; - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - } - - if (count == 1) - { - this.bindTextureByName("/WARP.png"); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); - var16 = .5F; - } - - float startY = (float)(+(y + (double)var13)); - float ratioY = startY + ActiveRenderInfo.objectY; - float ratioY2 = startY + var15 + ActiveRenderInfo.objectY; - float yConverted = ratioY / ratioY2; - - float startZ = (float)(+(z + (double)var13)); - float ratioZ = startZ + ActiveRenderInfo.objectZ; - float ratioZ2 = startZ + var15 + ActiveRenderInfo.objectZ; - float zConverted = ratioZ / ratioZ2; - - float startX = (float)(+(x + (double)var13)); - float ratioX = startX + ActiveRenderInfo.objectX; - float ratioX2 = startX + var15 + ActiveRenderInfo.objectX; - float xConverted = ratioX / ratioX2; - - - - - yConverted += (float)(y + (double)var13); - xConverted += (float)(x + (double)var13); - zConverted += (float)(z + (double)var13); - - GL11.glTranslatef( (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F,0, 0.0F); - GL11.glTranslatef(0, (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F, 0.0F); - - GL11.glTranslatef(0,0, (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F); - - GL11.glTexGeni(GL11.GL_S, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); - GL11.glTexGeni(GL11.GL_T, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); - GL11.glTexGeni(GL11.GL_R, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); - GL11.glTexGeni(GL11.GL_Q, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); - switch ((tile.orientation%4)+4) - { - case 4: - GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); - GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); - GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); - - break; - case 5: - - GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); - GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); - GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); - break; - case 6: - GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); - GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); - GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); - - break; - case 7: - GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); - GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); - GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); - break; - - - - } - - - GL11.glEnable(GL11.GL_TEXTURE_GEN_S); - GL11.glEnable(GL11.GL_TEXTURE_GEN_T); - GL11.glEnable(GL11.GL_TEXTURE_GEN_R); - GL11.glEnable(GL11.GL_TEXTURE_GEN_Q); - GL11.glPopMatrix(); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glPushMatrix(); - GL11.glLoadIdentity(); - GL11.glTranslatef(0.0F, (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F*var15, 0.0F); - GL11.glScalef(var16, var16, var16); - GL11.glTranslatef(0.5F, 0.5F, 0.5F); - GL11.glRotatef((float)(count * count * 4321 + count * 9) * 2.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(0.5F, 0.5F, 0.5F); - - Tessellator var24 = Tessellator.instance; - var24.startDrawingQuads(); - - - - float var21 = rand.nextFloat() * 0.5F + 0.1F; - float var22 = rand.nextFloat() * 0.4F + 0.4F; - float var23 = rand.nextFloat() * 0.6F + 0.5F; - - if (count == 0) - { - var23 = 1.0F; - var22 = 1.0F; - yConverted = 1.0F; - } - var24.setColorRGBA_F(var21 * var17, var22 * var17, var23 * var17, 1.0F); - if(tile.openOrClosed) - { - - switch (tile.orientation) - { - case 0: - - var24.addVertex(x+.01F, y-1 , z); - var24.addVertex(x+.01, y-1, z+1.0D); - var24.addVertex(x+.01 , y+1 , z + 1.0D); - var24.addVertex(x+.01 , y+1 , z); - break; - case 1: - var24.addVertex(x , y+1 , z+.01); - var24.addVertex(x+1 , y+1 , z+.01); - var24.addVertex(x+1, y-1, z+.01); - var24.addVertex(x, y-1, z+.01); - - - - break; - case 2: // - var24.addVertex(x+.99 , y+1 , z); - var24.addVertex(x+.99 , y+1 , z + 1.0D); - var24.addVertex(x+.99, y-1, z+1.0D); - var24.addVertex(x+.99, y-1, z); - break; - case 3: - var24.addVertex(x, y-1, z+.99); - var24.addVertex(x+1, y-1, z+.99); - var24.addVertex(x+1 , y+1 , z+.99); - var24.addVertex(x , y+1 , z+.99); - break; - case 4:// - // GL11.glTranslatef(); - - var24.addVertex(x+.15F, y-1 , z); - var24.addVertex(x+.15, y-1, z+1.0D); - var24.addVertex(x+.15 , y+1 , z + 1.0D); - var24.addVertex(x+.15 , y+1 , z); - break; - case 5: - var24.addVertex(x , y+1 , z+.15); - var24.addVertex(x+1 , y+1 , z+.15); - var24.addVertex(x+1, y-1, z+.15); - var24.addVertex(x, y-1, z+.15); - - - - break; - case 6: // - var24.addVertex(x+.85 , y+1 , z); - var24.addVertex(x+.85 , y+1 , z + 1.0D); - var24.addVertex(x+.85, y-1, z+1.0D); - var24.addVertex(x+.85, y-1, z); - break; - case 7: - var24.addVertex(x, y-1, z+.85); - var24.addVertex(x+1, y-1, z+.85); - var24.addVertex(x+1 , y+1 , z+.85); - var24.addVertex(x , y+1 , z+.85); - break; - default: - break; - } - } - - - - - - - var24.draw(); - - GL11.glPopMatrix(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - } - - GL11.glDisable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_TEXTURE_GEN_S); - GL11.glDisable(GL11.GL_TEXTURE_GEN_T); - GL11.glDisable(GL11.GL_TEXTURE_GEN_R); - GL11.glDisable(GL11.GL_TEXTURE_GEN_Q); - GL11.glEnable(GL11.GL_LIGHTING); - } - - private FloatBuffer getFloatBuffer(float par1, float par2, float par3, float par4) - { - this.field_76908_a.clear(); - this.field_76908_a.put(par1).put(par2).put(par3).put(par4); - this.field_76908_a.flip(); - return this.field_76908_a; - } - - public void renderTileEntityAt(TileEntity par1TileEntity, double par2, double par4, double par6, float par8) - { - if (properties.DoorRenderingEnabled) - { - this.renderDimDoorTileEntity((TileEntityDimDoor)par1TileEntity, par2, par4, par6, par8); - } - } -} -- 2.39.5 From 4f3ab403d3d3e6b1552e578d96c9abe414de4ff6 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 31 Aug 2013 20:44:31 -0400 Subject: [PATCH 040/544] More Progress on Rewrite Fixed the code in ItemLinkSignature and ItemStabilizedRiftSignature. Removed obsolete code from PocketManager - we don't need to worry about storing link keys anymore. All the data is stored in NBT, which means no more generating unique keys or worrying about saving and loading them. --- .../mod_pocketDim/core/PocketManager.java | 45 +-- .../items/ItemStabilizedRiftSignature.java | 177 ++--------- .../items/itemLinkSignature.java | 279 ++++++------------ 3 files changed, 121 insertions(+), 380 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 99e5548..39519bd 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -5,7 +5,6 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.util.HashMap; -import java.util.Random; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -44,14 +43,10 @@ public class PocketManager private static boolean isInitialized = false; private static boolean isSaving = false; - private static Random random = new Random(); //HashMap containing all the dims registered with DimDoors, sorted by dim ID. loaded on startup private static HashMap dimensionData = new HashMap(); - //HashMap for temporary storage of Link Signature damage hash values. See itemLinkSignature for more details - private static HashMap keyLinkMapping = new HashMap(); - public static boolean isInitialized() { return isInitialized; @@ -89,7 +84,7 @@ public class PocketManager } } - public boolean resetPocket(NewDimData dimension) + public boolean clearPocket(NewDimData dimension) { if (!dimension.isPocketDimension() || DimensionManager.getWorld(dimension.id()) != null) { @@ -103,7 +98,7 @@ public class PocketManager return true; } - public static boolean pruneDimension(NewDimData dimension, boolean deleteFolder) + public static boolean deletePocket(NewDimData dimension, boolean deleteFolder) { //FIXME: Shouldn't the links in and out of this dimension be altered somehow? Otherwise we have links pointing //into a deleted dimension! @@ -112,7 +107,6 @@ public class PocketManager if (dimension.isPocketDimension() && DimensionManager.getWorld(dimension.id()) == null) { dimensionData.remove(dimension.id()); - //FIXME: I added the following line. Seems like a good idea. Is it? DimensionManager.unregisterDimension(dimension.id()); if (deleteFolder) { @@ -146,21 +140,6 @@ public class PocketManager } } - /** - * Used to associate a damage value on a Rift Signature with a link pair. See LinkSignature for details. - * @return - */ - public static int createUniqueLinkKey() - { - int linkKey; - do - { - linkKey = random.nextInt(30000); - } - while (keyLinkMapping.containsKey(linkKey)); - return linkKey; - } - /** * Function that saves all dim data in a hashMap. Calling too often can cause Concurrent modification exceptions, so be careful. * @return @@ -184,7 +163,6 @@ public class PocketManager isSaving = true; HashMap comboSave = new HashMap(); comboSave.put("dimensionData", dimensionData); - comboSave.put("keyLinkMapping", keyLinkMapping); FileOutputStream saveFile = null; try @@ -246,15 +224,6 @@ public class PocketManager ObjectSaveInputStream save = new ObjectSaveInputStream(saveFile); HashMap comboSave = (HashMap) save.readObject(); - try - { - keyLinkMapping = (HashMap) comboSave.get("keyLinkMapping"); - } - catch (Exception e) - { - System.out.println("Could not load Link Signature list. Link Sig items will lose their stored locations."); - } - try { dimensionData = (HashMap) comboSave.get("dimensionData"); @@ -283,15 +252,6 @@ public class PocketManager ObjectSaveInputStream save = new ObjectSaveInputStream(saveFile); HashMap comboSave = (HashMap) save.readObject(); - try - { - keyLinkMapping = (HashMap) comboSave.get("keyLinkMapping"); - } - catch (Exception e2) - { - System.out.println("Could not load Link Signature list. Link Sig items will loose restored locations."); - } - try { dimensionData = (HashMap) comboSave.get("dimensionData"); @@ -395,7 +355,6 @@ public class PocketManager save(); unregisterDimensions(); dimensionData.clear(); - keyLinkMapping.clear(); } public static Iterable getDimensions() diff --git a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java index 01113d0..cf61d4f 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java @@ -2,47 +2,21 @@ package StevenDimDoors.mod_pocketDim.items; import java.util.List; -import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.util.Point4D; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class ItemStabilizedRiftSignature extends itemLinkSignature { - private static DDProperties properties = null; - - public ItemStabilizedRiftSignature(int par) + public ItemStabilizedRiftSignature(int itemID) { - super(par); - this.setMaxStackSize(1); - this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - this.setMaxDamage(0); - this.hasSubtypes = true; - if (properties == null) - properties = DDProperties.instance(); - } - - @SideOnly(Side.CLIENT) - @Override - public boolean hasEffect(ItemStack par1ItemStack) - { - // adds effect if item has a link stored - if(par1ItemStack.hasTagCompound()) - { - if(par1ItemStack.stackTagCompound.getBoolean("isCreated")) - { - return true; - } - } - return false; + super(itemID); } public void registerIcons(IconRegister par1IconRegister) @@ -51,66 +25,29 @@ public class ItemStabilizedRiftSignature extends itemLinkSignature } @Override - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int par7, float par8, float par9, float par10) { - int key; - NewLinkData linkData; - int thisWorldID=par3World.provider.dimensionId; - Integer[] linkCoords =this.readFromNBT(par1ItemStack); - - int offset = 2; - if(par1ItemStack.getTagCompound()!=null) + //Check if the Stabilized Rift Signature has been initialized + Point4D source = getSource(stack); + if (source != null) { - if(par1ItemStack.getTagCompound().getBoolean("isCreated")) + //Yes, it's initialized. Check if the player can pay an Ender Pearl to create a rift. + if (player.inventory.hasItem(Item.enderPearl.itemID)) { - boolean hasEnder = false; - // checks to see if the item has a link stored, if so, it creates it - if (par2EntityPlayer.inventory.hasItem(Item.enderPearl.itemID)||par2EntityPlayer.inventory.hasItem(properties.StableFabricItemID)) - { - if (!par2EntityPlayer.inventory.consumeInventoryItem(properties.StableFabricItemID)) - { - par2EntityPlayer.inventory.consumeInventoryItem(Item.enderPearl.itemID); - } - hasEnder=true; - } - if (par3World.getBlockId(par4, par5, par6)==Block.snow.blockID) - { - offset = 1; - } - if (hasEnder&&!par3World.isRemote) - { - if(PocketManager.instance.getLinkDataFromCoords(linkCoords[0], linkCoords[1], linkCoords[2], par3World)==null) - { - PocketManager.instance.createLink(linkCoords[3], par3World.provider.dimensionId, linkCoords[0], linkCoords[1], linkCoords[2],par4, par5+offset, par6); - } - PocketManager.instance.createLink(par3World.provider.dimensionId, linkCoords[3], par4, par5+offset, par6, linkCoords[0], linkCoords[1], linkCoords[2]); - par2EntityPlayer.worldObj.playSoundAtEntity(par2EntityPlayer,"mods.DimDoors.sfx.riftEnd", (float) .6, 1); - - par2EntityPlayer.sendChatToPlayer("Rift Created"); - } - else if (!par3World.isRemote) - { - par2EntityPlayer.sendChatToPlayer("No Ender Pearls!"); - } + if (tryItemUse(stack, player, world, x, y, z) && !player.capabilities.isCreativeMode) + { + player.inventory.consumeInventoryItem(Item.enderPearl.itemID); + } } } - else if (!par3World.isRemote) - { - if(par3World.getBlockId(par4, par5, par6)==Block.snow.blockID) - { - offset = 1; - } - //otherwise, it creates the first half of the link. Next click will complete it. - key = PocketManager.instance.createUniqueInterDimLinkKey(); - this.writeToNBT(par1ItemStack, par4, par5+offset, par6,par3World.provider.dimensionId); - par2EntityPlayer.worldObj.playSoundAtEntity(par2EntityPlayer,"mods.DimDoors.sfx.riftStart", (float) .6, 1); - - par2EntityPlayer.sendChatToPlayer("Rift Signature Stored"); - } - return true; + else + { + //Initialization doesn't cost any materials + tryItemUse(stack, player, world, x, y, z); + } + return true; } - /** * allows items to add custom lines of information to the mouseover description */ @@ -119,80 +56,16 @@ public class ItemStabilizedRiftSignature extends itemLinkSignature @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - if (par1ItemStack.hasTagCompound()) - { - if (par1ItemStack.stackTagCompound.getBoolean("isCreated")) - { - Integer[] coords = this.readFromNBT(par1ItemStack); - par3List.add("Leads to (" + coords[0] + ", " + coords[1] + ", " + coords[2] + ") at dimension #" + coords[3]); - } - } - else + Point4D source = getSource(par1ItemStack); + if (source != null) + { + par3List.add("Leads to (" + source.getX() + ", " + source.getY() + ", " + source.getZ() + ") at dimension #" + source.getDimension()); + } + else { par3List.add("First click stores a location,"); par3List.add("second click creates two rifts"); par3List.add("that link the locations together."); } } - - public void writeToNBT(ItemStack itemStack,int x, int y, int z, int dimID) - { - NBTTagCompound tag; - - if(itemStack.hasTagCompound()) - { - tag = itemStack.getTagCompound(); - } - else - { - tag= new NBTTagCompound(); - } - tag.setInteger("linkX", x); - tag.setInteger("linkY", y); - tag.setInteger("linkZ", z); - tag.setInteger("linkDimID", dimID); - tag.setBoolean("isCreated", true); - itemStack.setTagCompound(tag); - } - - /** - * Read the stack fields from a NBT object. - */ - public Integer[] readFromNBT(ItemStack itemStack) - { - NBTTagCompound tag; - Integer[] linkCoords = new Integer[5]; - if(itemStack.hasTagCompound()) - { - tag = itemStack.getTagCompound(); - - if(!tag.getBoolean("isCreated")) - { - return null; - } - linkCoords[0]=tag.getInteger("linkX"); - linkCoords[1]=tag.getInteger("linkY"); - linkCoords[2]=tag.getInteger("linkZ"); - linkCoords[3]=tag.getInteger("linkDimID"); - } - return linkCoords; - } - - - @Override - public void onCreated(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - if(!par2World.isRemote) - { - /** - //creates the first half of the link on item creation - int key= dimHelper.instance.createUniqueInterDimLinkKey(); - LinkData linkData= new LinkData(par2World.provider.dimensionId,MathHelper.floor_double(par3EntityPlayer.posX),MathHelper.floor_double(par3EntityPlayer.posY),MathHelper.floor_double(par3EntityPlayer.posZ)); - System.out.println(key); - - dimHelper.instance.interDimLinkList.put(key, linkData); - par1ItemStack.setItemDamage(key); - **/ - } - } } diff --git a/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java b/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java index 2d9ce99..14e539d 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java @@ -2,23 +2,23 @@ package StevenDimDoors.mod_pocketDim.items; import java.util.List; -import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; +import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.util.Point4D; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class itemLinkSignature extends Item { - public itemLinkSignature(int itemID) { super(itemID); @@ -26,240 +26,149 @@ public class itemLinkSignature extends Item this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); this.setMaxDamage(0); this.hasSubtypes = true; - if (properties == null) - properties = DDProperties.instance(); } - private static DDProperties properties = null; - @SideOnly(Side.CLIENT) @Override - public boolean hasEffect(ItemStack par1ItemStack) + public boolean hasEffect(ItemStack stack) { - // adds effect if item has a link stored - - - if(par1ItemStack.hasTagCompound()) - { - if(par1ItemStack.stackTagCompound.getBoolean("isCreated")) - { - return true; - } - } - return false; + //Make the item glow if it has one endpoint stored + return (stack.getItemDamage() != 0); } - public void registerIcons(IconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()); - } @Override - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int par7, float par8, float par9, float par10) { - int key; - ILinkData linkData; - int thisWorldID=par3World.provider.dimensionId; - - - - - if(!par3World.isRemote) - { - - //par1ItemStack= par2EntityPlayer.getCurrentEquippedItem(); - Integer[] linkCoords =this.readFromNBT(par1ItemStack); - - - - //System.out.println(key); - int offset = 2; - int idBlock = par3World.getBlockId(par4, par5, par6); - - if(Block.blocksList.length>idBlock&&idBlock!=0) + tryItemUse(stack, player, world, x, y, z); + return true; + } + + protected boolean tryItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z) + { + if (!world.isRemote) + { + //We don't check for replaceable blocks. The user can deal with that. <_< + + y += 2; //Increase y by 2 to place the rift at head level + if (!player.canPlayerEdit(x, y, z, 0, stack)) { - if(Block.blocksList[idBlock].isBlockReplaceable(par3World, par4, par5, par6)) - { - offset = 1; - } + return false; } - if(par3World.getBlockId(par4, par5, par6) == properties.DimensionalDoorID && par3World.getBlockId(par4, par5 + 1, par6) == properties.DimensionalDoorID) + + Point4D source = getSource(stack); + if (source != null) { - offset = 1; - } - else - if(par3World.getBlockId(par4, par5, par6)==properties.WarpDoorID&&par3World.getBlockId(par4, par5+1, par6)==properties.WarpDoorID) + //The link was used before and already has an endpoint stored. Create links connecting the two endpoints. + NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension()); + NewDimData destinationDimension = PocketManager.getDimensionData(world); + IDimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ()).setLinkType(IDimLink.TYPE_NORMAL); + IDimLink reverse = destinationDimension.createLink(x, y, z).setLinkType(IDimLink.TYPE_NORMAL); + link.setDestination(x, y, z, destinationDimension); + reverse.setDestination(source.getX(), source.getY(), source.getZ(), sourceDimension); + + //Try placing a rift at the destination point + if (!mod_pocketDim.blockRift.isBlockImmune(world, x, y, z)) { - offset = 1; + world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); } - else - if (par3World.getBlockId(par4, par5, par6)==properties.DimensionalDoorID&&par3World.getBlockId(par4, par5-1, par6)==properties.DimensionalDoorID) - { - offset = 0; - } - else - if (par3World.getBlockId(par4, par5, par6) == properties.WarpDoorID && par3World.getBlockId(par4, par5-1, par6)==properties.WarpDoorID) - { - offset = 0; - } - - int orientation = MathHelper.floor_double((double)((par2EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; - - for(int count = 0;count<3;count++) - { - if(PocketManager.instance.getLinkDataFromCoords(par4, par5+count, par6,par3World)!=null) + + //Try placing a rift at the source point, but check if its world is loaded first + World sourceWorld = DimensionManager.getWorld(sourceDimension.id()); + if (sourceWorld != null && + !mod_pocketDim.blockRift.isBlockImmune(sourceWorld, source.getX(), source.getY(), source.getZ())) { - int id= (par3World.getBlockId(par4, par5+count, par6)); - - if(id == properties.DimensionalDoorID||id==properties.WarpDoorID||id== properties.UnstableDoorID) - { - orientation = PocketManager.instance.getLinkDataFromCoords(par4, par5+count, par6,par3World).linkOrientation; - } + sourceWorld.setBlock(source.getX(), source.getY(), source.getY(), mod_pocketDim.blockRift.blockID); } - - - } - - if(par1ItemStack.getTagCompound()!=null) - { - if(par1ItemStack.getTagCompound().getBoolean("isCreated")) + + if (!player.capabilities.isCreativeMode) { - // checks to see if the item has a link stored, if so, it creates it - - - - PocketManager.instance.createLink(par3World.provider.dimensionId, linkCoords[3], par4, par5+offset, par6, linkCoords[0], linkCoords[1], linkCoords[2],orientation); - PocketManager.instance.createLink(linkCoords[3], par3World.provider.dimensionId, linkCoords[0], linkCoords[1], linkCoords[2],par4, par5+offset, par6,linkCoords[4]); - - - - --par1ItemStack.stackSize; - par2EntityPlayer.sendChatToPlayer("Rift Created"); - par1ItemStack.stackTagCompound=null; - par2EntityPlayer.worldObj.playSoundAtEntity(par2EntityPlayer,"mods.DimDoors.sfx.riftEnd", (float) .6, 1); + stack.stackSize--; } + clearSource(stack); + player.sendChatToPlayer("Rift Created"); + world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftEnd", 0.6f, 1); } else { - - - //otherwise, it creates the first half of the link. Next click will complete it. - key= PocketManager.instance.createUniqueInterDimLinkKey(); - this.writeToNBT(par1ItemStack, par4, par5+offset, par6,par3World.provider.dimensionId,orientation); - par2EntityPlayer.sendChatToPlayer("Rift Signature Stored"); - par2EntityPlayer.worldObj.playSoundAtEntity(par2EntityPlayer,"mods.DimDoors.sfx.riftStart", (float) .6, 1); - } - //dimHelper.instance.save(); + //The link signature has not been used. Store its current target as the first location. + setSource(stack, x, y, z, PocketManager.getDimensionData(world)); + player.sendChatToPlayer("Location Stored in Rift Signature"); + world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftStart", 0.6f, 1); + } + return true; } - - - return true; - - + return false; } - @SideOnly(Side.CLIENT) - /** * allows items to add custom lines of information to the mouseover description */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + @SideOnly(Side.CLIENT) public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - - if(par1ItemStack.hasTagCompound()) + Point4D source = getSource(par1ItemStack); + if (source != null) { - if(par1ItemStack.stackTagCompound.getBoolean("isCreated")) - { - Integer[] coords = this.readFromNBT(par1ItemStack); - - par3List.add(String.valueOf("Leads to dim "+coords[3] +" with depth "+(PocketManager.instance.getDimDepth(coords[3])))); - par3List.add("at x="+coords[0]+" y="+coords[1]+" z="+coords[2]); - - } - + par3List.add("Leads to (" + source.getX() + ", " + source.getY() + ", " + source.getZ() + ") at dimension #" + source.getDimension()); } else { - par3List.add("First click stores location,"); - par3List.add ("second click creates two rifts,"); - par3List.add("that link the first location"); - par3List.add("with the second location"); - - + par3List.add("First click stores a location;"); + par3List.add("second click creates a pair of"); + par3List.add("rifts linking the two locations."); } } - public void writeToNBT(ItemStack itemStack,int x, int y, int z, int dimID,int orientation) + public static void setSource(ItemStack itemStack, int x, int y, int z, NewDimData dimension) { - NBTTagCompound tag; - - if(itemStack.hasTagCompound()) - { - tag = itemStack.getTagCompound(); - - } - else - { - tag= new NBTTagCompound(); - } + NBTTagCompound tag = new NBTTagCompound(); tag.setInteger("linkX", x); tag.setInteger("linkY", y); tag.setInteger("linkZ", z); - tag.setInteger("linkDimID", dimID); - tag.setBoolean("isCreated", true); - tag.setInteger("orientation", orientation); + tag.setInteger("linkDimID", dimension.id()); itemStack.setTagCompound(tag); - + itemStack.setItemDamage(1); } - - /** - * Read the stack fields from a NBT object. - */ - public Integer[] readFromNBT(ItemStack itemStack) + + public static void clearSource(ItemStack itemStack) { - - NBTTagCompound tag; - Integer[] linkCoords = new Integer[5]; - if(itemStack.hasTagCompound()) + //Don't just set the tag to null since there may be other data there (e.g. for renamed items) + NBTTagCompound tag = itemStack.getTagCompound(); + tag.removeTag("linkX"); + tag.removeTag("linkY"); + tag.removeTag("linkZ"); + tag.removeTag("linkDimID"); + itemStack.setItemDamage(0); + } + + public static Point4D getSource(ItemStack itemStack) + { + if (itemStack.getItemDamage() != 0) { - tag = itemStack.getTagCompound(); - - if(!tag.getBoolean("isCreated")) + if (itemStack.hasTagCompound()) { - return null; + NBTTagCompound tag = itemStack.getTagCompound(); + + Integer x = tag.getInteger("linkX"); + Integer y = tag.getInteger("linkY"); + Integer z = tag.getInteger("linkZ"); + Integer dimID = tag.getInteger("linkDimID"); + + if (x != null && y != null && z != null && dimID != null) + { + return new Point4D(x, y, z, dimID); + } } - linkCoords[0]=tag.getInteger("linkX"); - linkCoords[1]=tag.getInteger("linkY"); - linkCoords[2]=tag.getInteger("linkZ"); - linkCoords[3]=tag.getInteger("linkDimID"); - linkCoords[4]=tag.getInteger("orientation"); - - - - } - return linkCoords; - - } - - - @Override - public void onCreated(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - if(!par2World.isRemote) - { - /** - //creates the first half of the link on item creation - int key= dimHelper.instance.createUniqueInterDimLinkKey(); - LinkData linkData= new LinkData(par2World.provider.dimensionId,MathHelper.floor_double(par3EntityPlayer.posX),MathHelper.floor_double(par3EntityPlayer.posY),MathHelper.floor_double(par3EntityPlayer.posZ)); - System.out.println(key); - - dimHelper.instance.interDimLinkList.put(key, linkData); - par1ItemStack.setItemDamage(key); - **/ + itemStack.setItemDamage(0); } + return null; } } -- 2.39.5 From b795885f1c937879b6319baed41f90d3e97e3fbb Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 31 Aug 2013 20:46:20 -0400 Subject: [PATCH 041/544] Renamed ItemLinkSignature to ItemRiftSignature Renamed ItemLinkSignature to ItemRiftSignature to match its in-game name. Automatically updated references to the old class name. --- .../items/{itemLinkSignature.java => ItemRiftSignature.java} | 4 ++-- .../mod_pocketDim/items/ItemStabilizedRiftSignature.java | 2 +- StevenDimDoors/mod_pocketDim/mod_pocketDim.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename StevenDimDoors/mod_pocketDim/items/{itemLinkSignature.java => ItemRiftSignature.java} (98%) diff --git a/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java similarity index 98% rename from StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java rename to StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java index 14e539d..bd3c74b 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemLinkSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java @@ -17,9 +17,9 @@ import StevenDimDoors.mod_pocketDim.util.Point4D; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class itemLinkSignature extends Item +public class ItemRiftSignature extends Item { - public itemLinkSignature(int itemID) + public ItemRiftSignature(int itemID) { super(itemID); this.setMaxStackSize(1); diff --git a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java index cf61d4f..5ea3f9e 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java @@ -12,7 +12,7 @@ import StevenDimDoors.mod_pocketDim.util.Point4D; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class ItemStabilizedRiftSignature extends itemLinkSignature +public class ItemStabilizedRiftSignature extends ItemRiftSignature { public ItemStabilizedRiftSignature(int itemID) { diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 1720449..756fe57 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -44,7 +44,7 @@ import StevenDimDoors.mod_pocketDim.items.ItemStabilizedRiftSignature; import StevenDimDoors.mod_pocketDim.items.ItemStableFabric; import StevenDimDoors.mod_pocketDim.items.ItemUnstableDoor; import StevenDimDoors.mod_pocketDim.items.ItemWarpDoor; -import StevenDimDoors.mod_pocketDim.items.itemLinkSignature; +import StevenDimDoors.mod_pocketDim.items.ItemRiftSignature; import StevenDimDoors.mod_pocketDim.items.itemRiftRemover; import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler; import StevenDimDoors.mod_pocketDim.ticking.LimboDecay; @@ -198,7 +198,7 @@ public class mod_pocketDim itemDimDoor = (new ItemDimensionalDoor(properties.DimensionalDoorItemID, Material.iron)).setUnlocalizedName("itemDimDoor"); itemExitDoor = (new ItemWarpDoor(properties.WarpDoorItemID, Material.wood)).setUnlocalizedName("itemDimDoorWarp"); - itemLinkSignature = (new itemLinkSignature(properties.RiftSignatureItemID)).setUnlocalizedName("itemLinkSignature"); + itemLinkSignature = (new ItemRiftSignature(properties.RiftSignatureItemID)).setUnlocalizedName("itemLinkSignature"); itemRiftRemover = (new itemRiftRemover(properties.RiftRemoverItemID, Material.wood)).setUnlocalizedName("itemRiftRemover"); itemStableFabric = (new ItemStableFabric(properties.StableFabricItemID, 0)).setUnlocalizedName("itemStableFabric"); itemChaosDoor = (new ItemUnstableDoor(properties.UnstableDoorItemID, Material.iron)).setUnlocalizedName("itemChaosDoor"); -- 2.39.5 From 4086e75ead4abc973545fddda4d1f54e37f307d2 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 1 Sep 2013 09:21:27 -0400 Subject: [PATCH 042/544] More Progress on Rewrite Fixed the code in DDTeleporter and made minor changes to other classes that depended on those fixes. Ensured that PocketManager's load, save, and unload methods are called appropriately and rewrote some of their code. Made various changes in other classes (e.g. EventHookContainer, PlayerRespawnTracker) to pass them references to DDProperties through their constructors instead of having them rely on DDProperties.instance() - this is a better programming practice in the long run. Renamed initialization methods in mod_pocketDim to make it clear that they're called on events. Commented out command registration in mod_pocketDim so that we can test DD as soon as PacketHandler is fixed, without worrying about fixing the command classes. --- .../mod_pocketDim/DDProperties.java | 4 +- .../mod_pocketDim/DDTeleporter.java | 297 +++++++++--------- .../mod_pocketDim/EventHookContainer.java | 9 +- .../mod_pocketDim/PacketHandler.java | 59 +--- .../mod_pocketDim/PlayerRespawnTracker.java | 9 +- .../blocks/BlockDimWallPerm.java | 2 +- .../commands/CommandCreatePocket.java | 2 +- .../mod_pocketDim/core/PocketManager.java | 72 +++-- .../mod_pocketDim/mod_pocketDim.java | 57 +--- .../ticking/CommonTickHandler.java | 6 +- .../mod_pocketDim/ticking/MobMonolith.java | 2 +- .../mod_pocketDim/world/GatewayGenerator.java | 13 +- 12 files changed, 239 insertions(+), 293 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/DDProperties.java b/StevenDimDoors/mod_pocketDim/DDProperties.java index 2d21924..a18218d 100644 --- a/StevenDimDoors/mod_pocketDim/DDProperties.java +++ b/StevenDimDoors/mod_pocketDim/DDProperties.java @@ -56,7 +56,7 @@ public class DDProperties * Crafting Flags */ - public final boolean CraftingDimensionaDoorAllowed; + public final boolean CraftingDimensionalDoorAllowed; public final boolean CraftingWarpDoorAllowed; public final boolean CraftingRiftSignatureAllowed; public final boolean CraftingRiftRemoverAllowed; @@ -129,7 +129,7 @@ public class DDProperties Configuration config = new Configuration(configFile); config.load(); - CraftingDimensionaDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Dimensional Door", true).getBoolean(true); + CraftingDimensionalDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Dimensional Door", true).getBoolean(true); CraftingWarpDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Warp Door", true).getBoolean(true); CraftingUnstableDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Unstable Door", true).getBoolean(true); CraftingTransTrapdoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Transdimensional Trapdoor", true).getBoolean(true); diff --git a/StevenDimDoors/mod_pocketDim/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/DDTeleporter.java index 1203cd5..e390ca7 100644 --- a/StevenDimDoors/mod_pocketDim/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/DDTeleporter.java @@ -1,7 +1,7 @@ package StevenDimDoors.mod_pocketDim; -import cpw.mods.fml.common.registry.GameRegistry; -import net.minecraft.block.Block; +import java.util.Random; + import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.item.EntityMinecart; @@ -19,36 +19,27 @@ import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.core.IDimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.util.Point4D; +import StevenDimDoors.mod_pocketDim.world.PocketBuilder; +import cpw.mods.fml.common.registry.GameRegistry; public class DDTeleporter { + private static final Random random = new Random(); + public static int cooldown = 0; + private DDTeleporter() { } - - /** - * Create a new portal near an entity. - */ - public static void placeInPortal(Entity par1Entity, WorldServer world, IDimLink link) + + private static void placeInPortal(Entity entity, WorldServer world, Point4D destination, DDProperties properties) { - Point4D destination = link.destination(); int x = destination.getX(); int y = destination.getY(); int z = destination.getZ(); - //TODO Temporary workaround for mismatched door/rift metadata cases. Gives priority to the door. - int orientation = PocketManager.getDestinationOrientation(link); - int receivingDoorMeta = world.getBlockMetadata(x, y - 1, z); - int receivingDoorID = world.getBlockId(x, y, z); - if (receivingDoorMeta != orientation) - { - if (receivingDoorID == mod_pocketDim.dimDoor.blockID || receivingDoorID == mod_pocketDim.ExitDoor.blockID) - { - orientation = receivingDoorMeta; - } - } + int orientation = getDestinationOrientation(destination, properties); - if (par1Entity instanceof EntityPlayer) + if (entity instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) par1Entity; + EntityPlayer player = (EntityPlayer) entity; player.rotationYaw=(orientation*90)+90; if(orientation==2||orientation==6) { @@ -71,65 +62,65 @@ public class DDTeleporter player.setPositionAndUpdate(x, y-1, z); } } - else if (par1Entity instanceof EntityMinecart) + else if (entity instanceof EntityMinecart) { - par1Entity.motionX=0; - par1Entity.motionZ=0; - par1Entity.motionY=0; - par1Entity.rotationYaw=(orientation*90)+90; + entity.motionX=0; + entity.motionZ=0; + entity.motionY=0; + entity.rotationYaw=(orientation*90)+90; if(orientation==2||orientation==6) { - DDTeleporter.setEntityPosition(par1Entity, x+1.5, y, z+.5 ); - par1Entity.motionX =.39; - par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); + DDTeleporter.setEntityPosition(entity, x+1.5, y, z+.5 ); + entity.motionX =.39; + entity.worldObj.updateEntityWithOptionalForce(entity, false); } else if(orientation==3||orientation==7) { - DDTeleporter.setEntityPosition(par1Entity, x+.5, y, z+1.5 ); - par1Entity.motionZ =.39; - par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); + DDTeleporter.setEntityPosition(entity, x+.5, y, z+1.5 ); + entity.motionZ =.39; + entity.worldObj.updateEntityWithOptionalForce(entity, false); } else if(orientation==0||orientation==4) { - DDTeleporter.setEntityPosition(par1Entity,x-.5, y, z+.5); - par1Entity.motionX =-.39; - par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); + DDTeleporter.setEntityPosition(entity,x-.5, y, z+.5); + entity.motionX =-.39; + entity.worldObj.updateEntityWithOptionalForce(entity, false); } else if(orientation==1||orientation==5) { - DDTeleporter.setEntityPosition(par1Entity,x+.5, y, z-.5); - par1Entity.motionZ =-.39; - par1Entity.worldObj.updateEntityWithOptionalForce(par1Entity, false); + DDTeleporter.setEntityPosition(entity,x+.5, y, z-.5); + entity.motionZ =-.39; + entity.worldObj.updateEntityWithOptionalForce(entity, false); } else { - DDTeleporter.setEntityPosition(par1Entity,x, y, z); + DDTeleporter.setEntityPosition(entity,x, y, z); } } - else if (par1Entity instanceof Entity) + else if (entity instanceof Entity) { - par1Entity.rotationYaw=(orientation*90)+90; + entity.rotationYaw=(orientation*90)+90; if(orientation==2||orientation==6) { - DDTeleporter.setEntityPosition(par1Entity, x+1.5, y, z+.5 ); + DDTeleporter.setEntityPosition(entity, x+1.5, y, z+.5 ); } else if(orientation==3||orientation==7) { - DDTeleporter.setEntityPosition(par1Entity, x+.5, y, z+1.5 ); + DDTeleporter.setEntityPosition(entity, x+.5, y, z+1.5 ); } else if(orientation==0||orientation==4) { - DDTeleporter.setEntityPosition(par1Entity,x-.5, y, z+.5); + DDTeleporter.setEntityPosition(entity,x-.5, y, z+.5); } else if(orientation==1||orientation==5) { - DDTeleporter.setEntityPosition(par1Entity,x+.5, y, z-.5); + DDTeleporter.setEntityPosition(entity,x+.5, y, z-.5); } else { - DDTeleporter.setEntityPosition(par1Entity,x, y, z); + DDTeleporter.setEntityPosition(entity,x, y, z); } } } @@ -142,18 +133,49 @@ public class DDTeleporter entity.setPosition(x, y, z); } - public static Entity teleportEntity(World world, Entity entity, IDimLink link) - { + private static int getDestinationOrientation(Point4D door, DDProperties properties) + { + World world = DimensionManager.getWorld(door.getDimension()); + if (world == null) + { + throw new IllegalStateException("The destination world should be loaded!"); + } + + //Check if the block at that point is actually a door + int blockID = world.getBlockId(door.getX(), door.getY(), door.getZ()); + if (blockID != properties.DimensionalDoorID && blockID != properties.WarpDoorID && + blockID != properties.TransientDoorID && blockID != properties.UnstableDoorID) + { + //Return the pocket's orientation instead + return PocketManager.getDimensionData(door.getDimension()).orientation(); + } + + //Return the orientation portion of its metadata + return world.getBlockMetadata(door.getX(), door.getY(), door.getZ()) & 3; + } + + public static Entity teleportEntity(Entity entity, Point4D destination) + { + if (entity == null) + { + throw new IllegalArgumentException("entity cannot be null."); + } + if (destination == null) + { + throw new IllegalArgumentException("destination cannot be null."); + } + //This beautiful teleport method is based off of xCompWiz's teleport function. - WorldServer oldWorld = (WorldServer)world; + WorldServer oldWorld = (WorldServer) entity.worldObj; WorldServer newWorld; - EntityPlayerMP player = (entity instanceof EntityPlayerMP) ? (EntityPlayerMP)entity : null; + EntityPlayerMP player = (entity instanceof EntityPlayerMP) ? (EntityPlayerMP) entity : null; + DDProperties properties = DDProperties.instance(); // Is something riding? Handle it first. - if(entity.riddenByEntity != null) + if (entity.riddenByEntity != null) { - return teleportEntity(oldWorld, entity.riddenByEntity, link); + return teleportEntity(entity.riddenByEntity, destination); } // Are we riding something? Dismount and tell the mount to go first. @@ -161,22 +183,21 @@ public class DDTeleporter if (cart != null) { entity.mountEntity(null); - cart = teleportEntity(oldWorld, cart, link); + cart = teleportEntity(cart, destination); // We keep track of both so we can remount them on the other side. } - // Destination doesn't exist? We need to make it. - if (DimensionManager.getWorld(link.destination().getDimension()) == null) - { - //FIXME: I think this is where I need to add initialization code for pockets!!! REALLY IMPORTANT!!! - DimensionManager.initDimension(link.destination().getDimension()); - } - - // Determine if our destination's in another realm. - boolean difDest = link.source().getDimension() != link.destination().getDimension(); + // Determine if our destination is in another realm. + boolean difDest = entity.dimension == destination.getDimension(); if (difDest) { - newWorld = DimensionManager.getWorld(link.destination().getDimension()); + // Destination isn't loaded? Then we need to load it. + newWorld = DimensionManager.getWorld(destination.getDimension()); + if (newWorld == null) + { + DimensionManager.initDimension(destination.getDimension()); + } + newWorld = DimensionManager.getWorld(destination.getDimension()); } else { @@ -185,7 +206,7 @@ public class DDTeleporter // GreyMaria: What is this even accomplishing? We're doing the exact same thing at the end of this all. // TODO Check to see if this is actually vital. - DDTeleporter.placeInPortal(entity, newWorld, link); + DDTeleporter.placeInPortal(entity, newWorld, destination, properties); if (difDest) // Are we moving our target to a new dimension? { @@ -194,7 +215,7 @@ public class DDTeleporter // We need to do all this special stuff to move a player between dimensions. // Set the new dimension and inform the client that it's moving to a new world. - player.dimension = link.destination().getDimension(); + player.dimension = destination.getDimension(); player.playerNetServerHandler.sendPacketToPlayer(new Packet9Respawn(player.dimension, (byte)player.worldObj.difficultySetting, newWorld.getWorldInfo().getTerrainType(), newWorld.getHeight(), player.theItemInWorldManager.getGameType())); // GreyMaria: Used the safe player entity remover before. @@ -203,7 +224,7 @@ public class DDTeleporter // for a pocket dimension, causing all sleeping players // to remain asleep instead of progressing to day. oldWorld.removePlayerEntityDangerously(player); - player.isDead=false; + player.isDead = false; // Creates sanity by ensuring that we're only known to exist where we're supposed to be known to exist. oldWorld.getPlayerManager().removePlayer(player); @@ -243,7 +264,8 @@ public class DDTeleporter entity = EntityList.createEntityFromNBT(entityNBT, newWorld); if (entity == null) - { // TODO FIXME IMPLEMENT NULL CHECKS THAT ACTUALLY DO SOMETHING. + { + // TODO FIXME IMPLEMENT NULL CHECKS THAT ACTUALLY DO SOMETHING. /* * shit ourselves in an organized fashion, preferably * in a neat pile instead of all over our users' games @@ -270,107 +292,84 @@ public class DDTeleporter } // Did we teleport a player? Load the chunk for them. - if(player != null) + if (player != null) { - WorldServer.class.cast(newWorld).getChunkProvider().loadChunk(MathHelper.floor_double(entity.posX) >> 4, MathHelper.floor_double(entity.posZ) >> 4); + newWorld.getChunkProvider().loadChunk(MathHelper.floor_double(entity.posX) >> 4, MathHelper.floor_double(entity.posZ) >> 4); // Tell Forge we're moving its players so everyone else knows. // Let's try doing this down here in case this is what's killing NEI. GameRegistry.onPlayerChangedDimension((EntityPlayer)entity); } - DDTeleporter.placeInPortal(entity, newWorld, link); + DDTeleporter.placeInPortal(entity, newWorld, destination, properties); return entity; } /** * Primary function used to teleport the player using doors. Performs numerous null checks, and also generates the destination door/pocket if it has not done so already. - * Also ensures correct orientation relative to the door using DDTeleporter. - * @param world- world the player is currently in - * @param linkData- the link the player is using to teleport, sends the player to its dest information. - * @param player- the instance of the player to be teleported - * @param orientation- the orientation of the door used to teleport, determines player orientation and door placement on arrival - * @Return + * Also ensures correct orientation relative to the door. + * @param world - world the player is currently in + * @param link - the link the player is using to teleport; sends the player to its destination + * @param player - the instance of the player to be teleported */ - public static void traverseDimDoor(World world, IDimLink linkData, Entity entity) + public static void traverseDimDoor(World world, IDimLink link, Entity entity) { - DDProperties properties = DDProperties.instance(); - + if (world == null) + { + throw new IllegalArgumentException("world cannot be null."); + } + if (link == null) + { + throw new IllegalArgumentException("link cannot be null."); + } + if (entity == null) + { + throw new IllegalArgumentException("entity cannot be null."); + } if (world.isRemote) { return; } - if (linkData != null) + + if (cooldown == 0 || entity instanceof EntityPlayer) { - int destinationID = link.destination().getDimension(); - - if(PocketManager.dimList.containsKey(destinationID) && PocketManager.dimList.containsKey(world.provider.dimensionId)) - { - this.generatePocket(linkData); - - if(mod_pocketDim.teleTimer==0||entity instanceof EntityPlayer) - { - mod_pocketDim.teleTimer=2+rand.nextInt(2); - } - else - { - return; - } - if(!world.isRemote) - { - entity = this.teleportEntity(world, entity, linkData); - } - entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); - - int playerXCoord=MathHelper.floor_double(entity.posX); - int playerYCoord=MathHelper.floor_double(entity.posY); - int playerZCoord=MathHelper.floor_double(entity.posZ); - - if(!entity.worldObj.isBlockOpaqueCube(playerXCoord, playerYCoord-1,playerZCoord )&&PocketManager.instance.getDimData(linkData.locDimID).isDimRandomRift&&!linkData.hasGennedDoor) - { - for(int count=0;count<20;count++) - { - if(!entity.worldObj.isAirBlock(playerXCoord, playerYCoord-2-count,playerZCoord)) - { - if(Block.blocksList[entity.worldObj.getBlockId(playerXCoord, playerYCoord-2-count,playerZCoord)].blockMaterial.isLiquid()) - { - entity.worldObj.setBlock(playerXCoord, playerYCoord-1, playerZCoord, properties.FabricBlockID); - break; - } - } - - if(entity.worldObj.isBlockOpaqueCube(playerXCoord, playerYCoord-1-count,playerZCoord)) - { - break; - } - if(count==19) - { - entity.worldObj.setBlock(playerXCoord, playerYCoord-1, playerZCoord, properties.FabricBlockID); - } - } - } - - this.generateDoor(world,linkData); - - - if(!entity.worldObj.isAirBlock(playerXCoord,playerYCoord+1,playerZCoord)) - { - if(Block.blocksList[entity.worldObj.getBlockId(playerXCoord,playerYCoord+1,playerZCoord)].isOpaqueCube() && - !mod_pocketDim.blockRift.isBlockImmune(entity.worldObj, playerXCoord+1,playerYCoord,playerZCoord)) - { - entity.worldObj.setBlock(playerXCoord,playerYCoord+1,playerZCoord,0); - } - } - if (!entity.worldObj.isAirBlock(playerXCoord,playerYCoord,playerZCoord)) - { - if(Block.blocksList[entity.worldObj.getBlockId(playerXCoord,playerYCoord,playerZCoord)].isOpaqueCube() && - !mod_pocketDim.blockRift.isBlockImmune(entity.worldObj, playerXCoord,playerYCoord,playerZCoord)) - { - entity.worldObj.setBlock(playerXCoord,playerYCoord,playerZCoord,0); - } - } - } + cooldown = 2 + random.nextInt(2); + } + else + { + return; + } + + if (!initializeDestination(link, DDProperties.instance())) + { + return; + } + + entity = teleportEntity(entity, link.destination()); + entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); + } + + private static boolean initializeDestination(IDimLink link, DDProperties properties) + { + //FIXME: Change this later to support rooms that have been wiped and must be regenerated. + if (link.hasDestination()) + { + return true; + } + + //Check the destination type and respond accordingly + //FIXME: Add missing link types. + //FIXME: Add code for restoring the destination-side door. + switch (link.linkType()) + { + case IDimLink.TYPE_DUNGEON: + return PocketBuilder.generateNewDungeonPocket(link, properties); + case IDimLink.TYPE_POCKET: + return PocketBuilder.generateNewPocket(link, properties); + case IDimLink.TYPE_NORMAL: + return true; + default: + throw new IllegalArgumentException("link has an unrecognized link type."); } - return; } } diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 4ed540e..025a24f 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -12,12 +12,11 @@ import cpw.mods.fml.relauncher.SideOnly; public class EventHookContainer { - private static DDProperties properties = null; + private final DDProperties properties; - public EventHookContainer() + public EventHookContainer(DDProperties properties) { - if (properties == null) - properties = DDProperties.instance(); + this.properties = properties; } @SideOnly(Side.CLIENT) @@ -56,7 +55,7 @@ public class EventHookContainer @ForgeSubscribe public void onWorldsave(WorldEvent.Save event) { - if (PocketManager.isInitialized() && event.world.provider.dimensionId == 0) + if (event.world.provider.dimensionId == 0) { PocketManager.save(); } diff --git a/StevenDimDoors/mod_pocketDim/PacketHandler.java b/StevenDimDoors/mod_pocketDim/PacketHandler.java index 192b4a6..644d9f6 100644 --- a/StevenDimDoors/mod_pocketDim/PacketHandler.java +++ b/StevenDimDoors/mod_pocketDim/PacketHandler.java @@ -10,6 +10,7 @@ import java.util.HashSet; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; +import StevenDimDoors.mod_pocketDim.core.IDimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; @@ -23,11 +24,9 @@ import cpw.mods.fml.common.network.Player; public class PacketHandler implements IPacketHandler { public static byte DIM_UPDATE_PACKET_ID = 1; - public static byte REGISTER_DIM_PACKET_ID = 3; - public static byte REGISTER_LINK_PACKET_ID = 4; - public static byte REMOVE_LINK_PACKET_ID = 5; - public static byte DIM_PACKET_ID = 6; - public static byte LINK_KEY_PACKET_ID = 7; + public static byte REGISTER_DIM_PACKET_ID = 2; + public static byte REGISTER_LINK_PACKET_ID = 3; + public static byte REMOVE_LINK_PACKET_ID = 4; @Override public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) @@ -71,7 +70,7 @@ public class PacketHandler implements IPacketHandler { NewDimData dimDataToAddLink= PocketManager.instance.getDimData(dimId); - ILinkData linkToAdd = new ILinkData(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); + IDimLink linkToAdd = new IDimLink(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); linkToAdd.hasGennedDoor=data.readBoolean(); PocketManager.instance.createLink(linkToAdd); @@ -90,7 +89,7 @@ public class PacketHandler implements IPacketHandler { NewDimData dimDataToRemoveFrom= PocketManager.instance.getDimData(dimId); - ILinkData linkToAdd = new ILinkData(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); + IDimLink linkToAdd = new IDimLink(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); dimDataToRemoveFrom.removeLinkAtCoords(linkToAdd.locDimID, linkToAdd.locXCoord,linkToAdd.locYCoord, linkToAdd.locZCoord); } catch (Exception e) @@ -99,11 +98,6 @@ public class PacketHandler implements IPacketHandler e.printStackTrace(); } } - else if (id == LINK_KEY_PACKET_ID) - { - ILinkData link = new ILinkData(data.readInt(), data.readInt(), data.readInt(), data.readInt()); - dimHelper.PocketManager.interDimLinkList.put(data.readInt(), link); - } } private static void processRegisterDimPacket() @@ -136,16 +130,16 @@ public class PacketHandler implements IPacketHandler { manager.addToSendQueue(PacketHandler.onDimCreatedPacket(data)); - Collection >> linkList = data.linksInThisDim.values(); + Collection >> linkList = data.linksInThisDim.values(); for(HashMap map : linkList ) { - Collection > linkList2 = map.values(); + Collection > linkList2 = map.values(); for(HashMap map2 : linkList2) { - Collection linkList3 = map2.values(); + Collection linkList3 = map2.values(); - for(ILinkData link : linkList3) + for(IDimLink link : linkList3) { packetsToSend.add(( PacketHandler.onLinkCreatedPacket(link))); } @@ -159,7 +153,7 @@ public class PacketHandler implements IPacketHandler } } - public static void sendLinkCreatedPacket(ILinkData link) + public static void sendLinkCreatedPacket(IDimLink link) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dataOut = new DataOutputStream(bos); @@ -193,36 +187,7 @@ public class PacketHandler implements IPacketHandler return packet; } - - public static void sendlinkKeyPacket(ILinkData link, int key) - { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - DataOutputStream dataOut = new DataOutputStream(bos); - - try - { - dataOut.writeByte(PacketHandler.linkKeyPacketID); - - dataOut.writeInt(link.destDimID); - dataOut.writeInt(link.destXCoord); - dataOut.writeInt(link.destYCoord); - dataOut.writeInt(link.destZCoord); - dataOut.writeInt(key); - } - catch (IOException e) - { - e.printStackTrace(); - } - - Packet250CustomPayload packet = new Packet250CustomPayload(); - packet.channel="DimDoorPackets"; - packet.data = bos.toByteArray(); - packet.length = bos.size();; - PacketDispatcher.sendPacketToAllPlayers(packet); - } - - - public static void sendLinkRemovedPacket(ILinkData link) + public static void sendLinkRemovedPacket(IDimLink link) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dataOut = new DataOutputStream(bos); diff --git a/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java b/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java index 706334f..d6b34fe 100644 --- a/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java +++ b/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java @@ -12,14 +12,13 @@ import cpw.mods.fml.common.IPlayerTracker; public class PlayerRespawnTracker implements IPlayerTracker { - public PlayerRespawnTracker() + private final DDProperties properties; + + public PlayerRespawnTracker(DDProperties properties) { - if (properties == null) - properties = DDProperties.instance(); + this.properties = properties; } - private static DDProperties properties = null; - @Override public void onPlayerLogin(EntityPlayer player) { // TODO Auto-generated method stub diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java index bdf14a9..5789fb3 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java @@ -67,7 +67,7 @@ public class BlockDimWallPerm extends Block //FIXME: Shouldn't we make the player's destination safe BEFORE teleporting him?! //player.setPositionAndUpdate( x, y, z ); Point4D destination = new Point4D(destinationX, destinationY, destinationZ, 0); - DDTeleporter.teleport(player, destination); + DDTeleporter.teleportEntity(player, destination); //player.setPositionAndUpdate( x, y, z ); diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandCreatePocket.java b/StevenDimDoors/mod_pocketDim/commands/CommandCreatePocket.java index 6365d74..5360cff 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandCreatePocket.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandCreatePocket.java @@ -34,7 +34,7 @@ public class CommandCreatePocket extends DDCommandBase } //Place a door leading to a pocket dimension where the player is standing. - //The pocket dimension will be serve as a room for the player to build a dungeon. + //The pocket dimension will serve as a room for the player to build a dungeon. int x = (int) sender.posX; int y = (int) sender.posY; int z = (int) sender.posZ; diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 39519bd..09f2e61 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -41,47 +41,37 @@ public class PocketManager private static int OVERWORLD_DIMENSION_ID = 0; - private static boolean isInitialized = false; + private static boolean isLoaded = false; private static boolean isSaving = false; - //HashMap containing all the dims registered with DimDoors, sorted by dim ID. loaded on startup + //HashMap that maps all the dimension IDs registered with DimDoors to their DD data. private static HashMap dimensionData = new HashMap(); - public static boolean isInitialized() + public static boolean isLoaded() { - return isInitialized; + return isLoaded; } /** * simple method called on startup to register all dims saved in the dim list. Only tries to register pocket dims, though. Also calls load() * @return */ - public static void initPockets() + public static void load() { - if (isInitialized) + if (isLoaded) { - throw new IllegalStateException("Pocket dimensions have already been initialized!"); + throw new IllegalStateException("Pocket dimensions have already been loaded!"); } + isLoaded = true; + loadInternal(); + + //Register Limbo DDProperties properties = DDProperties.instance(); + registerDimension(properties.LimboDimensionID, null, false, false); - isInitialized = true; - load(); - for (NewDimData dimension : dimensionData.values()) - { - if (dimension.isPocketDimension()) - { - try - { - DimensionManager.registerDimension(dimension.id(), properties.PocketProviderID); - } - catch (Exception e) - { - System.err.println("Could not register pocket dimension #" + dimension.id() + ". Probably caused by a version update/save data corruption/other mods."); - e.printStackTrace(); - } - } - } + //Register pocket dimensions + registerPockets(properties); } public boolean clearPocket(NewDimData dimension) @@ -120,8 +110,27 @@ public class PocketManager return false; } } + + private static void registerPockets(DDProperties properties) + { + for (NewDimData dimension : dimensionData.values()) + { + if (dimension.isPocketDimension()) + { + try + { + DimensionManager.registerDimension(dimension.id(), properties.PocketProviderID); + } + catch (Exception e) + { + System.err.println("Could not register pocket dimension #" + dimension.id() + ". Probably caused by a version update/save data corruption/other mods."); + e.printStackTrace(); + } + } + } + } - private static void unregisterDimensions() + private static void unregisterPockets() { for (NewDimData dimension : dimensionData.values()) { @@ -149,6 +158,10 @@ public class PocketManager //TODO change from saving serialized objects to just saving data for compatabilies sake. //TODO If saving is multithreaded as the concurrent modification exception implies, you should be synchronizing access. ~SenseiKiwi + if (!isLoaded) + { + return; + } if (isSaving) { return; @@ -188,7 +201,10 @@ public class PocketManager e.printStackTrace(); System.err.println("Could not save data-- SEVERE"); } - isSaving = false; + finally + { + isSaving = false; + } } } @@ -197,7 +213,7 @@ public class PocketManager * @return */ @SuppressWarnings("unchecked") - public static void load() + private static void loadInternal() { //FIXME: There are a lot of things to fix here... First, we shouldn't be created so many File instances //when we could just hold references and reuse them. Second, duplicate code is BAD. Loading stuff should @@ -353,7 +369,7 @@ public class PocketManager public static void unload() { save(); - unregisterDimensions(); + unregisterPockets(); dimensionData.clear(); } diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 756fe57..bcac33e 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -25,26 +25,16 @@ import StevenDimDoors.mod_pocketDim.blocks.TransientDoor; import StevenDimDoors.mod_pocketDim.blocks.UnstableDoor; import StevenDimDoors.mod_pocketDim.blocks.WarpDoor; import StevenDimDoors.mod_pocketDim.blocks.dimHatch; -import StevenDimDoors.mod_pocketDim.commands.CommandCreateDungeonRift; -import StevenDimDoors.mod_pocketDim.commands.CommandCreatePocket; -import StevenDimDoors.mod_pocketDim.commands.CommandDeleteAllLinks; -import StevenDimDoors.mod_pocketDim.commands.CommandDeleteDimensionData; -import StevenDimDoors.mod_pocketDim.commands.CommandDeleteRifts; -import StevenDimDoors.mod_pocketDim.commands.CommandExportDungeon; -import StevenDimDoors.mod_pocketDim.commands.CommandPrintDimensionData; -import StevenDimDoors.mod_pocketDim.commands.CommandPruneDimensions; -import StevenDimDoors.mod_pocketDim.commands.CommandResetDungeons; -import StevenDimDoors.mod_pocketDim.commands.CommandTeleportPlayer; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.items.ItemBlockDimWall; import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; import StevenDimDoors.mod_pocketDim.items.ItemRiftBlade; +import StevenDimDoors.mod_pocketDim.items.ItemRiftSignature; import StevenDimDoors.mod_pocketDim.items.ItemStabilizedRiftSignature; import StevenDimDoors.mod_pocketDim.items.ItemStableFabric; import StevenDimDoors.mod_pocketDim.items.ItemUnstableDoor; import StevenDimDoors.mod_pocketDim.items.ItemWarpDoor; -import StevenDimDoors.mod_pocketDim.items.ItemRiftSignature; import StevenDimDoors.mod_pocketDim.items.itemRiftRemover; import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler; import StevenDimDoors.mod_pocketDim.ticking.LimboDecay; @@ -135,9 +125,6 @@ public class mod_pocketDim public static DDProperties properties; public static MonolithSpawner spawner; //Added this field temporarily. Will be refactored out later. public static GatewayGenerator riftGen; - - public static long genTime; - public static int teleTimer = 0; public static CreativeTabs dimDoorsCreativeTab = new CreativeTabs("dimDoorsCreativeTab") { @@ -157,22 +144,20 @@ public class mod_pocketDim @PreInit - public void PreInit(FMLPreInitializationEvent event) + public void onPreInitialization(FMLPreInitializationEvent event) { //This should be the FIRST thing that gets done. properties = DDProperties.initialize(event.getSuggestedConfigurationFile()); //Now do other stuff - MinecraftForge.EVENT_BUS.register(new EventHookContainer()); + MinecraftForge.EVENT_BUS.register(new EventHookContainer(properties)); - //These fields MUST be initialized after properties are loaded to prevent - //instances from holding onto null references to the properties. - tracker = new PlayerRespawnTracker(); - riftGen = new GatewayGenerator(); + tracker = new PlayerRespawnTracker(properties); + riftGen = new GatewayGenerator(properties); } @Init - public void Init(FMLInitializationEvent event) + public void onInitialization(FMLInitializationEvent event) { CommonTickHandler commonTickHandler = new CommonTickHandler(); TickRegistry.registerTickHandler(new ClientTickHandler(), Side.CLIENT); @@ -255,8 +240,6 @@ public class mod_pocketDim LanguageRegistry.instance().addStringLocalization("itemGroup.dimDoorsCustomTab", "en_US", "Dimensional Doors Items"); - //GameRegistry.registerTileEntity(TileEntityDimDoor.class, "TileEntityDimRail"); - GameRegistry.registerTileEntity(TileEntityDimDoor.class, "TileEntityDimDoor"); GameRegistry.registerTileEntity(TileEntityRift.class, "TileEntityRift"); @@ -268,7 +251,7 @@ public class mod_pocketDim //GameRegistry.addBiome(this.limboBiome); //GameRegistry.addBiome(this.pocketBiome); - if (properties.CraftingDimensionaDoorAllowed) + if (properties.CraftingDimensionalDoorAllowed) { GameRegistry.addRecipe(new ItemStack(itemDimDoor, 1), new Object[] { @@ -280,22 +263,6 @@ public class mod_pocketDim " ", "yxy", " ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorIron }); } - - /** - if(this.enableDimRail) - { - GameRegistry.addRecipe(new ItemStack(dimRail, 1), new Object[] - { - " ", "yxy", " ", 'x', this.itemDimDoor, 'y', Block.rail - }); - - GameRegistry.addRecipe(new ItemStack(dimRail, 1), new Object[] - { - " ", "yxy", " ", 'x', this.itemExitDoor, 'y', Block.rail - }); - } - **/ - if(properties.CraftingUnstableDoorAllowed) { GameRegistry.addRecipe(new ItemStack(itemChaosDoor, 1), new Object[] @@ -385,28 +352,29 @@ public class mod_pocketDim @PostInit - public void PostInit(FMLPostInitializationEvent event) + public void onPostInitialization(FMLPostInitializationEvent event) { //Register loot chests DDLoot.registerInfo(); } @ServerStopping - public void serverStopping(FMLServerStoppingEvent event) + public void onServerStopping(FMLServerStoppingEvent event) { try { PocketManager.unload(); } - catch(Exception e) + catch (Exception e) { e.printStackTrace(); } } @ServerStarting - public void serverStarting(FMLServerStartingEvent event) + public void onServerStarting(FMLServerStartingEvent event) { + /* CommandResetDungeons.instance().register(event); CommandCreateDungeonRift.instance().register(event); CommandDeleteAllLinks.instance().register(event); @@ -417,6 +385,7 @@ public class mod_pocketDim CommandPruneDimensions.instance().register(event); CommandCreatePocket.instance().register(event); CommandTeleportPlayer.instance().register(event); + */ PocketManager.load(); } } diff --git a/StevenDimDoors/mod_pocketDim/ticking/CommonTickHandler.java b/StevenDimDoors/mod_pocketDim/ticking/CommonTickHandler.java index 6cf3ecd..a190039 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/CommonTickHandler.java +++ b/StevenDimDoors/mod_pocketDim/ticking/CommonTickHandler.java @@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.ticking; import java.util.ArrayList; import java.util.EnumSet; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.DDTeleporter; import cpw.mods.fml.common.ITickHandler; import cpw.mods.fml.common.TickType; @@ -43,9 +43,9 @@ public class CommonTickHandler implements ITickHandler, IRegularTickSender //TODO: Stuck this in here because it's already rather hackish. //We should standardize this as an IRegularTickReceiver in the future. ~SenseiKiwi - if (mod_pocketDim.teleTimer > 0) + if (DDTeleporter.cooldown > 0) { - mod_pocketDim.teleTimer--; + DDTeleporter.cooldown--; } } diff --git a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index e983edf..2fed8ab 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -150,7 +150,7 @@ public class MobMonolith extends EntityFlying implements IMob (int) this.posY + 500, (int) this.posZ + MathHelper.getRandomIntegerInRange(rand, -250, 250), properties.LimboDimensionID); - DDTeleporter.teleport(entityPlayer, destination); + DDTeleporter.teleportEntity(entityPlayer, destination); this.aggro = 0; entityPlayer.worldObj.playSoundAtEntity(entityPlayer,"mods.DimDoors.sfx.crack",13, 1); diff --git a/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java index abbc7ea..5bc6fb0 100644 --- a/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java +++ b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java @@ -29,12 +29,12 @@ public class GatewayGenerator implements IWorldGenerator private static final int NETHER_CHANCE_CORRECTION = 4; private static final int OVERWORLD_DIMENSION_ID = 0; private static final int NETHER_DIMENSION_ID = -1; - private static DDProperties properties = null; - public GatewayGenerator() + private final DDProperties properties; + + public GatewayGenerator(DDProperties properties) { - if (properties == null) - properties = DDProperties.instance(); + this.properties = properties; } @Override @@ -141,7 +141,7 @@ public class GatewayGenerator implements IWorldGenerator } else { - createLimboGateway(world, x, y, z); + createLimboGateway(world, x, y, z, properties.LimboBlockID); } //Place the shiny transient door into a dungeon @@ -190,11 +190,10 @@ public class GatewayGenerator implements IWorldGenerator world.setBlock(x, y, z + 1, blockID, 0, 3); } - private static void createLimboGateway(World world, int x, int y, int z) + private static void createLimboGateway(World world, int x, int y, int z, int blockID) { //Build the gateway out of Unraveled Fabric. Since nearly all the blocks in Limbo are of //that type, there is no point replacing the ground. - final int blockID = properties.LimboBlockID; world.setBlock(x, y + 2, z + 1, blockID, 0, 3); world.setBlock(x, y + 2, z - 1, blockID, 0, 3); -- 2.39.5 From efa5b3eb4c4645fec609da079890d1c3252bff6d Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 1 Sep 2013 10:50:20 -0400 Subject: [PATCH 043/544] Modified NewDimData and IDimLink Modified how links are created so that the caller must specify a link type when the link is created, rather than setting it later. This was done to avoid having to send two link data packets following the way links would be handled logically. Turns out this was good idea overall for ensuring link integrity, because there was one case where I forgot to set the link type after creating the link. --- .../mod_pocketDim/blocks/DimensionalDoor.java | 2 +- .../mod_pocketDim/blocks/UnstableDoor.java | 2 +- .../mod_pocketDim/blocks/WarpDoor.java | 2 +- .../mod_pocketDim/core/IDimLink.java | 1 - .../mod_pocketDim/core/NewDimData.java | 67 +++++++++++-------- .../dungeon/DungeonSchematic.java | 6 +- .../mod_pocketDim/helpers/DungeonHelper.java | 2 +- .../mod_pocketDim/items/ItemRiftBlade.java | 2 +- .../items/ItemRiftSignature.java | 4 +- .../mod_pocketDim/world/GatewayGenerator.java | 4 +- 10 files changed, 51 insertions(+), 41 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java index 1d0cd0d..fbd0281 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java @@ -172,7 +172,7 @@ public class DimensionalDoor extends BlockContainer IDimLink link = dimension.getLink(x, y, z); if (link == null) { - dimension.createLink(x, y, z).setLinkType(IDimLink.TYPE_POCKET); + dimension.createLink(x, y, z, IDimLink.TYPE_POCKET); } } world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); diff --git a/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java index 74a0f73..d53e576 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java @@ -54,7 +54,7 @@ public class UnstableDoor extends DimensionalDoor if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) { NewDimData dimension = PocketManager.getDimensionData(world); - dimension.createLink(x, y, z).setLinkType(IDimLink.TYPE_RANDOM); + dimension.createLink(x, y, z, IDimLink.TYPE_RANDOM); } } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java index cbe5159..410a052 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java @@ -41,7 +41,7 @@ public class WarpDoor extends DimensionalDoor IDimLink link = dimension.getLink(x, y, z); if (link == null) { - dimension.createLink(x, y, z).setLinkType(IDimLink.TYPE_SAFE_EXIT); + dimension.createLink(x, y, z, IDimLink.TYPE_SAFE_EXIT); } } world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); diff --git a/StevenDimDoors/mod_pocketDim/core/IDimLink.java b/StevenDimDoors/mod_pocketDim/core/IDimLink.java index 34d2f9b..cb62dc3 100644 --- a/StevenDimDoors/mod_pocketDim/core/IDimLink.java +++ b/StevenDimDoors/mod_pocketDim/core/IDimLink.java @@ -27,5 +27,4 @@ public interface IDimLink extends Serializable public IDimLink parent(); public int linkType(); public IDimLink setDestination(int x, int y, int z, NewDimData dimension); - public IDimLink setLinkType(int linkType); } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index f8c9941..40c3333 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -27,7 +27,7 @@ public abstract class NewDimData implements Serializable private ArrayList children; public DimLink(Point4D source, DimLink parent) - { + { this.parent = parent; this.source = source; this.tail = parent.tail; @@ -35,11 +35,16 @@ public abstract class NewDimData implements Serializable parent.children.add(this); } - public DimLink(Point4D source) + public DimLink(Point4D source, int linkType) { + if (linkType < IDimLink.TYPE_ENUM_MIN || linkType > IDimLink.TYPE_ENUM_MAX) + { + throw new IllegalArgumentException("The specified link type is invalid."); + } + this.parent = null; this.source = source; - this.tail = new LinkTail(0, null); + this.tail = new LinkTail(linkType, null); this.children = new ArrayList(EXPECTED_CHILDREN); } @@ -72,18 +77,6 @@ public abstract class NewDimData implements Serializable tail.setDestination(new Point4D(x, y, z, dimension.id())); return this; } - - @Override - public IDimLink setLinkType(int linkType) - { - if (linkType < IDimLink.TYPE_ENUM_MIN || linkType > IDimLink.TYPE_ENUM_MAX) - { - throw new IllegalArgumentException("The specified link type is invalid."); - } - - tail.setLinkType(linkType); - return this; - } @Override public Iterable children() @@ -131,6 +124,11 @@ public abstract class NewDimData implements Serializable public void overwrite(DimLink nextParent) { + if (nextParent == null) + { + throw new IllegalArgumentException("nextParent cannot be null."); + } + if (this == nextParent) { //Ignore this request silently @@ -152,15 +150,28 @@ public abstract class NewDimData implements Serializable //Attach to new parent parent = nextParent; + tail = nextParent.tail; + nextParent.children.add(this); + } + + public void overwrite(int linkType) + { + //Release children + for (IDimLink child : children) + { + ((DimLink) child).parent = null; + } + children.clear(); + + //Release parent if (parent != null) { - tail = parent.tail; - parent.children.add(this); - } - else - { - tail = new LinkTail(0, null); + parent.children.remove(this); } + + //Attach to new parent + parent = null; + tail = new LinkTail(linkType, null); } @Override @@ -224,7 +235,7 @@ public abstract class NewDimData implements Serializable public IDimLink findNearestRift(World world, int range, int x, int y, int z) { - //TODO: Rewrite this later to use an octtree, remove World parameter + //TODO: Rewrite this later to use an octtree //Sanity check... if (world.provider.dimensionId != id) @@ -271,24 +282,24 @@ public abstract class NewDimData implements Serializable return Math.abs(i) + Math.abs(j) + Math.abs(k); } - public IDimLink createLink(int x, int y, int z) + public IDimLink createLink(int x, int y, int z, int linkType) { - return createLink(new Point4D(x, y, z, id)); + return createLink(new Point4D(x, y, z, id), linkType); } - private IDimLink createLink(Point4D source) - { + private IDimLink createLink(Point4D source, int linkType) + { //Return an existing link if there is one to avoid creating multiple links starting at the same point. DimLink link = linkMapping.get(source); if (link == null) { - link = new DimLink(source); + link = new DimLink(source, linkType); linkMapping.put(source, link); linkList.add(link); } else { - link.overwrite(null); + link.overwrite(linkType); } return link; } diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index ab6013a..1c0663d 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -284,7 +284,7 @@ public class DungeonSchematic extends Schematic { private static void createEntranceReverseLink(NewDimData dimension, Point3D pocketCenter, IDimLink entryLink) { - IDimLink link = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ()); + IDimLink link = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ(), IDimLink.TYPE_NORMAL); Point4D destination = link.source(); link.setDestination(destination.getX(), destination.getY(), destination.getZ(), PocketManager.getDimensionData(destination.getDimension())); @@ -295,7 +295,7 @@ public class DungeonSchematic extends Schematic { //Transform the door's location to the pocket coordinate system Point3D location = point.clone(); BlockRotator.transformPoint(location, entrance, rotation, pocketCenter); - dimension.createLink(location.getX(), location.getY(), location.getZ()).setLinkType(IDimLink.TYPE_DUNGEON_EXIT); + dimension.createLink(location.getX(), location.getY(), location.getZ(), IDimLink.TYPE_DUNGEON_EXIT); } private static void createDimensionalDoorLink(NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) @@ -303,7 +303,7 @@ public class DungeonSchematic extends Schematic { //Transform the door's location to the pocket coordinate system Point3D location = point.clone(); BlockRotator.transformPoint(location, entrance, rotation, pocketCenter); - dimension.createLink(location.getX(), location.getY(), location.getZ()).setLinkType(IDimLink.TYPE_DUNGEON); + dimension.createLink(location.getX(), location.getY(), location.getZ(), IDimLink.TYPE_DUNGEON); } private static void spawnMonolith(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 3913932..cc9cfdb 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -278,7 +278,7 @@ public class DungeonHelper { //Create a link above the specified position. Link to a new pocket dimension. NewDimData dimension = PocketManager.getDimensionData(world); - IDimLink link = dimension.createLink(x, y + 1, z).setLinkType(IDimLink.TYPE_POCKET); + IDimLink link = dimension.createLink(x, y + 1, z, IDimLink.TYPE_POCKET); //Place a Warp Door linked to that pocket ItemDimensionalDoor.placeDoorBlock(world, x, y, z, 3, mod_pocketDim.warpDoor); diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index 727fc24..c6eec69 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -187,7 +187,7 @@ public class ItemRiftBlade extends ItemSword NewDimData dimension = PocketManager.getDimensionData(world); if (!dimension.isPocketDimension() && dimension.getLink(x, y + 1, z) == null) { - dimension.createLink(x, y + 1, z).setLinkType(IDimLink.TYPE_POCKET); + dimension.createLink(x, y + 1, z, IDimLink.TYPE_POCKET); player.worldObj.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1); ItemDimensionalDoor.placeDoorBlock(world, x, y, z, orientation, mod_pocketDim.transientDoor); } diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java index bd3c74b..fc521bf 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java @@ -66,8 +66,8 @@ public class ItemRiftSignature extends Item //The link was used before and already has an endpoint stored. Create links connecting the two endpoints. NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension()); NewDimData destinationDimension = PocketManager.getDimensionData(world); - IDimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ()).setLinkType(IDimLink.TYPE_NORMAL); - IDimLink reverse = destinationDimension.createLink(x, y, z).setLinkType(IDimLink.TYPE_NORMAL); + IDimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), IDimLink.TYPE_NORMAL); + IDimLink reverse = destinationDimension.createLink(x, y, z, IDimLink.TYPE_NORMAL); link.setDestination(x, y, z, destinationDimension); reverse.setDestination(source.getX(), source.getY(), source.getZ(), sourceDimension); diff --git a/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java index 5bc6fb0..2a2e0f0 100644 --- a/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java +++ b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java @@ -97,7 +97,7 @@ public class GatewayGenerator implements IWorldGenerator if (link == null) { dimension = PocketManager.getDimensionData(world); - link = dimension.createLink(x, y + 1, z).setLinkType(IDimLink.TYPE_POCKET); + link = dimension.createLink(x, y + 1, z, IDimLink.TYPE_POCKET); } else { @@ -132,7 +132,7 @@ public class GatewayGenerator implements IWorldGenerator { //Create a partial link to a dungeon. dimension = PocketManager.getDimensionData(world); - link = dimension.createLink(x, y + 1, z).setLinkType(IDimLink.TYPE_DUNGEON); + link = dimension.createLink(x, y + 1, z, IDimLink.TYPE_DUNGEON); //If the current dimension isn't Limbo, build a Rift Gateway out of Stone Bricks if (dimension.id() != properties.LimboDimensionID) -- 2.39.5 From 62fed83e2f7e75b4aa0caf6969f3843bf234773b Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 1 Sep 2013 22:01:17 -0400 Subject: [PATCH 044/544] Started Rewriting Packet Handling Started rewriting our packet handling code. Deleted PacketHandler in favor of using sided (Server-, Client-) packet handlers to make it easier to follow what's going on in our code. Added some event-based handling of updates which greatly simplified signaling that data needs to be sent, but it's not completely done yet. --- StevenDimDoors/mod_pocketDim/CommonProxy.java | 14 +- .../mod_pocketDim/ConnectionHandler.java | 36 ++- .../mod_pocketDim/PacketConstants.java | 15 + StevenDimDoors/mod_pocketDim/Point3D.java | 2 + .../mod_pocketDim/ServerPacketHandler.java | 86 +++++- .../mod_pocketDim/core/IDimLink.java | 5 +- .../mod_pocketDim/core/NewDimData.java | 93 ++++-- .../mod_pocketDim/core/PocketManager.java | 279 +++++++++--------- .../mod_pocketDim/dungeon/DungeonData.java | 5 +- .../dungeon/DungeonSchematic.java | 4 +- .../items/ItemRiftSignature.java | 4 +- .../mod_pocketDim/mod_pocketDim.java | 8 +- .../mod_pocketDim/watcher/IOpaqueMessage.java | 8 + .../mod_pocketDim/watcher/IOpaqueReader.java | 8 + .../mod_pocketDim/watcher/IUpdateWatcher.java | 8 + .../watcher/UpdateWatcherProxy.java | 51 ++++ .../ClientPacketHandler.java | 16 +- 17 files changed, 421 insertions(+), 221 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/PacketConstants.java create mode 100644 StevenDimDoors/mod_pocketDim/watcher/IOpaqueMessage.java create mode 100644 StevenDimDoors/mod_pocketDim/watcher/IOpaqueReader.java create mode 100644 StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java create mode 100644 StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java diff --git a/StevenDimDoors/mod_pocketDim/CommonProxy.java b/StevenDimDoors/mod_pocketDim/CommonProxy.java index 951244e..ada7b95 100644 --- a/StevenDimDoors/mod_pocketDim/CommonProxy.java +++ b/StevenDimDoors/mod_pocketDim/CommonProxy.java @@ -1,10 +1,7 @@ package StevenDimDoors.mod_pocketDim; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; -import StevenDimDoors.mod_pocketDimClient.ClientTickHandler; - import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.CompressedStreamTools; @@ -47,7 +44,6 @@ public class CommonProxy implements IGuiHandler public void writeNBTToFile(World world) { boolean flag = true; - boolean secondTry = false; try { @@ -58,7 +54,6 @@ public class CommonProxy implements IGuiHandler if (!flag) { dirFolder.replace("saves/", FMLCommonHandler.instance().getMinecraftServerInstance().getFolderName()); - secondTry = true; } File file = new File(dirFolder, "GGMData.dat"); @@ -91,7 +86,6 @@ public class CommonProxy implements IGuiHandler public void readNBTFromFile(World world) { boolean flag = true; - boolean secondTry = false; try { @@ -102,7 +96,6 @@ public class CommonProxy implements IGuiHandler if (!flag) { dirFolder.replace("saves/", FMLCommonHandler.instance().getMinecraftServerInstance().getFolderName()); - secondTry = true; } File file = new File(dirFolder, "GGMData.dat"); @@ -117,12 +110,9 @@ public class CommonProxy implements IGuiHandler fileoutputstream.close(); } - FileInputStream fileinputstream = new FileInputStream(file); + /*FileInputStream fileinputstream = new FileInputStream(file); NBTTagCompound nbttagcompound = CompressedStreamTools.readCompressed(fileinputstream); - - - - fileinputstream.close(); + fileinputstream.close();*/ } catch (Exception exception) { diff --git a/StevenDimDoors/mod_pocketDim/ConnectionHandler.java b/StevenDimDoors/mod_pocketDim/ConnectionHandler.java index 7b855a5..0b13248 100644 --- a/StevenDimDoors/mod_pocketDim/ConnectionHandler.java +++ b/StevenDimDoors/mod_pocketDim/ConnectionHandler.java @@ -1,21 +1,25 @@ package StevenDimDoors.mod_pocketDim; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; + import net.minecraft.network.INetworkManager; import net.minecraft.network.NetLoginHandler; import net.minecraft.network.packet.NetHandler; import net.minecraft.network.packet.Packet1Login; +import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.server.MinecraftServer; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.watcher.IOpaqueMessage; import cpw.mods.fml.common.network.IConnectionHandler; import cpw.mods.fml.common.network.Player; public class ConnectionHandler implements IConnectionHandler { @Override - public String connectionReceived(NetLoginHandler netHandler, INetworkManager manager) + public String connectionReceived(NetLoginHandler netHandler, INetworkManager manager) { - //Sends a packet to the client containing all the information about the dimensions and links. - //Lots of packets, actually. - PacketHandler.sendClientJoinPacket(manager); return null; } @@ -32,5 +36,27 @@ public class ConnectionHandler implements IConnectionHandler public void clientLoggedIn(NetHandler clientHandler, INetworkManager manager, Packet1Login login) { } @Override - public void playerLoggedIn(Player player, NetHandler netHandler, INetworkManager manager) { } + public void playerLoggedIn(Player player, NetHandler netHandler, INetworkManager manager) + { + //Send information about all the registered dimensions and links to the client + try + { + IOpaqueMessage message = PocketManager.getState(); + Packet250CustomPayload packet = new Packet250CustomPayload(); + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + DataOutputStream writer = new DataOutputStream(buffer); + writer.writeByte(PacketConstants.CLIENT_JOIN_PACKET_ID); + message.writeToStream(writer); + writer.close(); + packet.channel = PacketConstants.CHANNEL_NAME; + packet.data = buffer.toByteArray(); + packet.length = packet.data.length; + manager.addToSendQueue(packet); + } + catch (IOException e) + { + //This shouldn't happen... + e.printStackTrace(); + } + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/PacketConstants.java b/StevenDimDoors/mod_pocketDim/PacketConstants.java new file mode 100644 index 0000000..67d4e60 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/PacketConstants.java @@ -0,0 +1,15 @@ +package StevenDimDoors.mod_pocketDim; + +public class PacketConstants +{ + private PacketConstants() { } + + public static final byte CLIENT_JOIN_PACKET_ID = 1; + public static final byte CREATE_DIM_PACKET_ID = 2; + public static final byte UPDATE_DIM_PACKET_ID = 3; + public static final byte DELETE_DIM_PACKET_ID = 4; + public static final byte CREATE_LINK_PACKET_ID = 5; + public static final byte UPDATE_LINK_PACKET_ID = 6; + public static final byte DELETE_LINK_PACKET_ID = 7; + public static final String CHANNEL_NAME = "DimDoorsPackets"; +} diff --git a/StevenDimDoors/mod_pocketDim/Point3D.java b/StevenDimDoors/mod_pocketDim/Point3D.java index 4a8e72a..7a3d357 100644 --- a/StevenDimDoors/mod_pocketDim/Point3D.java +++ b/StevenDimDoors/mod_pocketDim/Point3D.java @@ -4,6 +4,8 @@ import java.io.Serializable; public class Point3D implements Serializable { + private static final long serialVersionUID = -9044026830605287190L; + private int x; private int y; private int z; diff --git a/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java b/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java index fff2079..310b84a 100644 --- a/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java +++ b/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java @@ -1,15 +1,93 @@ package StevenDimDoors.mod_pocketDim; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; + import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.watcher.IOpaqueMessage; +import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; import cpw.mods.fml.common.network.IPacketHandler; +import cpw.mods.fml.common.network.PacketDispatcher; import cpw.mods.fml.common.network.Player; public class ServerPacketHandler implements IPacketHandler { - @Override - public void onPacketData(INetworkManager manager, - Packet250CustomPayload packet, Player player) + public ServerPacketHandler() { + PocketManager.registerDimWatcher(new DimWatcher()); + PocketManager.registerLinkWatcher(new LinkWatcher()); } -} \ No newline at end of file + + @Override + public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) + { + + } + + private class DimWatcher implements IUpdateWatcher + { + @Override + public void onCreated(IOpaqueMessage message) + { + sendMessageToAllPlayers(PacketConstants.CREATE_DIM_PACKET_ID, message); + } + + @Override + public void onUpdated(IOpaqueMessage message) + { + sendMessageToAllPlayers(PacketConstants.UPDATE_DIM_PACKET_ID, message); + } + + @Override + public void onDeleted(IOpaqueMessage message) + { + sendMessageToAllPlayers(PacketConstants.DELETE_DIM_PACKET_ID, message); + } + } + + private class LinkWatcher implements IUpdateWatcher + { + @Override + public void onCreated(IOpaqueMessage message) + { + sendMessageToAllPlayers(PacketConstants.CREATE_LINK_PACKET_ID, message); + } + + @Override + public void onUpdated(IOpaqueMessage message) + { + sendMessageToAllPlayers(PacketConstants.UPDATE_LINK_PACKET_ID, message); + } + + @Override + public void onDeleted(IOpaqueMessage message) + { + sendMessageToAllPlayers(PacketConstants.DELETE_LINK_PACKET_ID, message); + } + } + + private static void sendMessageToAllPlayers(byte id, IOpaqueMessage message) + { + try + { + Packet250CustomPayload packet = new Packet250CustomPayload(); + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + DataOutputStream writer = new DataOutputStream(buffer); + writer.writeByte(id); + message.writeToStream(writer); + writer.close(); + packet.channel = PacketConstants.CHANNEL_NAME; + packet.data = buffer.toByteArray(); + packet.length = packet.data.length; + PacketDispatcher.sendPacketToAllPlayers(packet); + } + catch (IOException e) + { + //This shouldn't happen... + e.printStackTrace(); + } + } +} diff --git a/StevenDimDoors/mod_pocketDim/core/IDimLink.java b/StevenDimDoors/mod_pocketDim/core/IDimLink.java index cb62dc3..4ed15b0 100644 --- a/StevenDimDoors/mod_pocketDim/core/IDimLink.java +++ b/StevenDimDoors/mod_pocketDim/core/IDimLink.java @@ -1,10 +1,8 @@ package StevenDimDoors.mod_pocketDim.core; -import java.io.Serializable; - import StevenDimDoors.mod_pocketDim.util.Point4D; -public interface IDimLink extends Serializable +public interface IDimLink { public final int TYPE_ENUM_MIN = 0; public final int TYPE_ENUM_MAX = 8; @@ -26,5 +24,4 @@ public interface IDimLink extends Serializable public int childCount(); public IDimLink parent(); public int linkType(); - public IDimLink setDestination(int x, int y, int z, NewDimData dimension); } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index 40c3333..c7e0c2e 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -1,5 +1,4 @@ package StevenDimDoors.mod_pocketDim.core; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -11,14 +10,15 @@ import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.util.Point4D; +import StevenDimDoors.mod_pocketDim.watcher.IOpaqueMessage; +import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; -public abstract class NewDimData implements Serializable +public abstract class NewDimData { private static class DimLink implements IDimLink { //DimLink is an inner class here to make it immutable to code outside NewDimData - private static final long serialVersionUID = 1462177151401498444L; private static final int EXPECTED_CHILDREN = 2; private Point4D source; @@ -66,16 +66,9 @@ public abstract class NewDimData implements Serializable return (tail.getDestination() != null); } - @Override - public IDimLink setDestination(int x, int y, int z, NewDimData dimension) + public void setDestination(int x, int y, int z, NewDimData dimension) { - if (dimension == null) - { - throw new IllegalArgumentException("dimension cannot be null."); - } - tail.setDestination(new Point4D(x, y, z, dimension.id())); - return this; } @Override @@ -179,9 +172,18 @@ public abstract class NewDimData implements Serializable { return source + " -> " + (hasDestination() ? destination() : ""); } - } - private static final long serialVersionUID = 89361974746997260L; + public IOpaqueMessage toMessage() + { + return null; + } + + public IOpaqueMessage toKey() + { + return null; + } + } + private static Random random = new Random(); private final int id; @@ -197,8 +199,11 @@ public abstract class NewDimData implements Serializable private Point4D origin; private int orientation; private DungeonData dungeon; + private final IUpdateWatcher dimWatcher; + private final IUpdateWatcher linkWatcher; - protected NewDimData(int id, NewDimData parent, boolean isPocket, boolean isDungeon) + protected NewDimData(int id, NewDimData parent, boolean isPocket, boolean isDungeon, + IUpdateWatcher dimWatcher, IUpdateWatcher linkWatcher) { //The isPocket flag is redundant. It's meant as an integrity safeguard. if (isPocket == (parent != null)) @@ -215,24 +220,33 @@ public abstract class NewDimData implements Serializable this.linkList = new ArrayList(); //Should be stored in oct tree -- temporary solution this.children = new ArrayList(); this.parent = parent; - this.root = (parent != null ? parent.root : this); - this.depth = (parent != null ? parent.depth + 1 : 0); this.packDepth = 0; this.isDungeon = isDungeon; this.isFilled = false; this.orientation = 0; this.origin = null; this.dungeon = null; + this.dimWatcher = dimWatcher; + this.linkWatcher = linkWatcher; //Register with parent - addChildDimension(this); + if (parent != null) + { + //We don't need to raise an update event for adding a child because the child's creation will be signaled. + this.root = parent.root; + this.depth = parent.depth + 1; + parent.children.add(this); + } + else + { + this.root = this; + this.depth = 0; + } } - private void addChildDimension(NewDimData child) - { - children.add(child); - } - + protected abstract IOpaqueMessage toMessage(); + protected abstract IOpaqueMessage toKey(); + public IDimLink findNearestRift(World world, int range, int x, int y, int z) { //TODO: Rewrite this later to use an octtree @@ -301,6 +315,8 @@ public abstract class NewDimData implements Serializable { link.overwrite(linkType); } + //Link created! + linkWatcher.onCreated(link.toMessage()); return link; } @@ -330,7 +346,8 @@ public abstract class NewDimData implements Serializable { link.overwrite(parent); } - + //Link created! + linkWatcher.onCreated(link.toMessage()); return link; } @@ -344,6 +361,8 @@ public abstract class NewDimData implements Serializable if (target != null) { linkList.remove(target); + //Raise deletion event + linkWatcher.onDeleted(target.toKey()); target.clear(); } return (target != null); @@ -356,6 +375,8 @@ public abstract class NewDimData implements Serializable if (target != null) { linkList.remove(target); + //Raise deletion event + linkWatcher.onDeleted(target.toKey()); target.clear(); } return (target != null); @@ -400,6 +421,8 @@ public abstract class NewDimData implements Serializable public void setFilled(boolean isFilled) { this.isFilled = isFilled; + //Raise the dim update event + dimWatcher.onUpdated(this.toMessage()); } public int id() @@ -457,7 +480,7 @@ public abstract class NewDimData implements Serializable return children; } - public void initializeDungeon(int originX, int originY, int originZ, int orientation, IDimLink link, DungeonData dungeon) + public void initializeDungeon(int originX, int originY, int originZ, int orientation, IDimLink incoming, DungeonData dungeon) { if (!isDungeon) { @@ -468,11 +491,13 @@ public abstract class NewDimData implements Serializable throw new IllegalStateException("The dimension has already been initialized."); } - link.setDestination(originX, originY, originZ, this); - this.origin = link.destination(); + setDestination(incoming, originX, originY, originZ); + this.origin = incoming.destination(); this.orientation = orientation; this.dungeon = dungeon; this.packDepth = calculatePackDepth(parent, dungeon); + //Raise the dim update event + dimWatcher.onUpdated(this.toMessage()); } private static int calculatePackDepth(NewDimData parent, DungeonData current) @@ -507,7 +532,7 @@ public abstract class NewDimData implements Serializable } } - public void initializePocket(int originX, int originY, int originZ, int orientation, IDimLink link) + public void initializePocket(int originX, int originY, int originZ, int orientation, IDimLink incoming) { if (!isPocketDimension()) { @@ -518,9 +543,19 @@ public abstract class NewDimData implements Serializable throw new IllegalStateException("The dimension has already been initialized."); } - link.setDestination(originX, originY, originZ, this); - this.origin = link.destination(); + setDestination(incoming, originX, originY, originZ); + this.origin = incoming.destination(); this.orientation = orientation; + //Raise the dim update event + dimWatcher.onUpdated(this.toMessage()); + } + + public void setDestination(IDimLink incoming, int x, int y, int z) + { + DimLink link = (DimLink) incoming; + link.setDestination(x, y, z, this); + //Raise update event + linkWatcher.onUpdated(link.toMessage()); } public IDimLink getRandomLink() diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 09f2e61..3555915 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -1,9 +1,10 @@ package StevenDimDoors.mod_pocketDim.core; +import java.io.DataOutputStream; import java.io.File; -import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.ObjectOutputStream; +import java.io.IOException; import java.util.HashMap; import net.minecraft.entity.player.EntityPlayer; @@ -12,11 +13,12 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.ObjectSaveInputStream; import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDim.util.Point4D; -import cpw.mods.fml.common.FMLCommonHandler; +import StevenDimDoors.mod_pocketDim.watcher.IOpaqueMessage; +import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; +import StevenDimDoors.mod_pocketDim.watcher.UpdateWatcherProxy; /** * This class regulates all the operations involving the storage and manipulation of dimensions. It handles saving dim data, teleporting the player, and @@ -30,19 +32,35 @@ public class PocketManager //a public constructor from NewDimData. It's meant to stop us from constructing instances //of NewDimData without using PocketManager's functions. In turn, that enforces that any //link destinations must be real dimensions controlled by PocketManager. - - private static final long serialVersionUID = -3497038894870586232L; - public InnerDimData(int id, NewDimData parent, boolean isPocket, boolean isDungeon) + public InnerDimData(int id, NewDimData parent, boolean isPocket, boolean isDungeon, + IUpdateWatcher dimWatcher, IUpdateWatcher linkWatcher) { - super(id, parent, isPocket, isDungeon); + super(id, parent, isPocket, isDungeon, dimWatcher, linkWatcher); + } + + @Override + protected IOpaqueMessage toMessage() + { + // TODO Auto-generated method stub + return null; + } + + @Override + protected IOpaqueMessage toKey() + { + // TODO Auto-generated method stub + return null; } } private static int OVERWORLD_DIMENSION_ID = 0; - private static boolean isLoaded = false; - private static boolean isSaving = false; + private static volatile boolean isLoading = false; + private static volatile boolean isLoaded = false; + private static volatile boolean isSaving = false; + private static UpdateWatcherProxy linkWatcher = null; + private static UpdateWatcherProxy dimWatcher = null; //HashMap that maps all the dimension IDs registered with DimDoors to their DD data. private static HashMap dimensionData = new HashMap(); @@ -62,8 +80,17 @@ public class PocketManager { throw new IllegalStateException("Pocket dimensions have already been loaded!"); } + if (isLoading) + { + return; + } + + isLoading = true; + + //Set up watcher proxies + dimWatcher = new UpdateWatcherProxy(); + linkWatcher = new UpdateWatcherProxy(); - isLoaded = true; loadInternal(); //Register Limbo @@ -72,6 +99,9 @@ public class PocketManager //Register pocket dimensions registerPockets(properties); + + isLoaded = true; + isLoading = false; } public boolean clearPocket(NewDimData dimension) @@ -103,6 +133,9 @@ public class PocketManager File save = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); DeleteFolder.deleteFolder(save); } + //Raise the dim deleted event + dimWatcher.onDeleted(dimension.toKey()); + //dimension.implode()??? -- more like delete, but yeah return true; } else @@ -149,65 +182,6 @@ public class PocketManager } } - /** - * Function that saves all dim data in a hashMap. Calling too often can cause Concurrent modification exceptions, so be careful. - * @return - */ - public static void save() - { - //TODO change from saving serialized objects to just saving data for compatabilies sake. - //TODO If saving is multithreaded as the concurrent modification exception implies, you should be synchronizing access. ~SenseiKiwi - - if (!isLoaded) - { - return; - } - if (isSaving) - { - return; - } - World world = DimensionManager.getWorld(OVERWORLD_DIMENSION_ID); - if (world == null || world.isRemote) - { - return; - } - if (DimensionManager.getCurrentSaveRootDirectory() != null) - { - isSaving = true; - HashMap comboSave = new HashMap(); - comboSave.put("dimensionData", dimensionData); - - FileOutputStream saveFile = null; - try - { - String saveFileName=DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataTEMP"; - saveFile = new FileOutputStream(saveFileName); - - ObjectOutputStream save = new ObjectOutputStream(saveFile); - save.writeObject(comboSave); - save.close(); - saveFile.close(); - - if (new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataOLD").exists()) - { - new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataOLD").delete(); - } - new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsData").renameTo(new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataOLD")); - - new File(saveFileName).renameTo( new File(DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsData")); - } - catch(Exception e) - { - e.printStackTrace(); - System.err.println("Could not save data-- SEVERE"); - } - finally - { - isSaving = false; - } - } - } - /** * loads the dim data from the saved hashMap. Also handles compatibility with old saves, see OldSaveHandler * @return @@ -215,81 +189,68 @@ public class PocketManager @SuppressWarnings("unchecked") private static void loadInternal() { - //FIXME: There are a lot of things to fix here... First, we shouldn't be created so many File instances - //when we could just hold references and reuse them. Second, duplicate code is BAD. Loading stuff should - //be a function so that you can apply it to the save file first, then the "backup", instead of duplicating - //so much code. >_< + // SenseiKiwi: This is a temporary function for testing purposes. + // We'll move on to using a text-based format in the future. - boolean firstRun = false; - System.out.println("Loading DimDoors data"); - FileInputStream saveFile = null; - - if (!DimensionManager.getWorld(OVERWORLD_DIMENSION_ID).isRemote && DimensionManager.getCurrentSaveRootDirectory()!=null) + if (!DimensionManager.getWorld(OVERWORLD_DIMENSION_ID).isRemote && + DimensionManager.getCurrentSaveRootDirectory() != null) { - try - { - File dataStore = new File( DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsData"); - if (!dataStore.exists()) - { - if (!new File( DimensionManager.getCurrentSaveRootDirectory()+"/DimensionalDoorsDataOLD").exists()) - { - firstRun=true; - } - } - saveFile = new FileInputStream(dataStore); - ObjectSaveInputStream save = new ObjectSaveInputStream(saveFile); - HashMap comboSave = (HashMap) save.readObject(); + System.out.println("Loading Dimensional Doors save data..."); + File saveFile = new File(DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.dat"); + //Missing code for converting the binary data in the file into an IOpaqueMessage + IOpaqueMessage saveData; + setState(saveData); + System.out.println("Loaded successfully!"); + } + } + + public static void save() + { + // SenseiKiwi: This is a temporary function for testing purposes. + // We'll move on to using a text-based format in the future. - try - { - dimensionData = (HashMap) comboSave.get("dimensionData"); - } - catch(Exception e) - { - System.out.println("Could not load pocket dimension list. Saves are probably lost, but repairable. Move the files from individual pocket dim files to active ones. See MC thread for details."); - } + if (!isLoaded) + { + return; + } + World world = DimensionManager.getWorld(OVERWORLD_DIMENSION_ID); + if (world == null || world.isRemote || DimensionManager.getCurrentSaveRootDirectory() != null) + { + return; + } + //Check this last to make sure we set the flag shortly after. + if (isSaving) + { + return; + } - save.close(); - saveFile.close(); - } - catch (Exception e) - { - try - { - if (!firstRun) - { - System.out.println("Save data damaged, trying backup..."); - } - World world=FMLCommonHandler.instance().getMinecraftServerInstance().worldServers[0]; - File dataStore =new File( world.getSaveHandler().getMapFileFromName("idcounts").getParentFile().getParent()+"/DimensionalDoorsDataOLD"); - - - saveFile = new FileInputStream(dataStore); - ObjectSaveInputStream save = new ObjectSaveInputStream(saveFile); - HashMap comboSave = (HashMap) save.readObject(); - - try - { - dimensionData = (HashMap) comboSave.get("dimensionData"); - } - catch (Exception e2) - { - System.out.println("Could not load pocket dim list. Saves probably lost, but repairable. Move the files from indivual pocket dim files to active ones. See MC thread for details."); - } - - save.close(); - saveFile.close(); - } - catch (Exception e2) - { - if (!firstRun) - { - System.err.println("Could not read data-- SEVERE"); - e2.printStackTrace(); - } - } - } - } + isSaving = true; + try + { + System.out.println("Writing Dimensional Doors save data..."); + String tempPath = DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.tmp"; + String savePath = DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.dat"; + File tempFile = new File(tempPath); + File saveFile = new File(savePath); + DataOutputStream writer = new DataOutputStream(new FileOutputStream(tempFile)); + getState().writeToStream(writer); + writer.close(); + saveFile.delete(); + tempFile.renameTo(saveFile); + System.out.println("Saved successfully!"); + } + catch (FileNotFoundException e) + { + e.printStackTrace(); + } + catch (IOException e) + { + e.printStackTrace(); + } + finally + { + isSaving = false; + } } public static boolean removeRift(World world, int x, int y, int z, int range, EntityPlayer player, ItemStack item) @@ -340,7 +301,7 @@ public class PocketManager throw new IllegalArgumentException("Cannot register a dimension with ID = " + dimensionID + " because it has already been registered."); } - NewDimData dimension = new InnerDimData(dimensionID, parent, isPocket, isDungeon); + NewDimData dimension = new InnerDimData(dimensionID, parent, isPocket, isDungeon, dimWatcher, linkWatcher); dimensionData.put(dimensionID, dimension); return dimension; } @@ -395,4 +356,38 @@ public class PocketManager return null; } } + + public static void registerDimWatcher(IUpdateWatcher watcher) + { + dimWatcher.registerReceiver(watcher); + } + + public static boolean unregisterDimWatcher(IUpdateWatcher watcher) + { + return dimWatcher.unregisterReceiver(watcher); + } + + public static void registerLinkWatcher(IUpdateWatcher watcher) + { + linkWatcher.registerReceiver(watcher); + } + + public static boolean unregisterLinkWatcher(IUpdateWatcher watcher) + { + return linkWatcher.unregisterReceiver(watcher); + } + + public static IOpaqueMessage getState() + { + + } + + public static void setState(IOpaqueMessage state) + { + if (isLoaded) + { + throw new IllegalStateException("Pocket dimensions have already been loaded!"); + } + + } } diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonData.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonData.java index 6d57e7d..7c298df 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonData.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonData.java @@ -1,16 +1,13 @@ package StevenDimDoors.mod_pocketDim.dungeon; import java.io.FileNotFoundException; -import java.io.Serializable; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonType; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.schematic.InvalidSchematicException; -public class DungeonData implements Serializable +public class DungeonData { - private static final long serialVersionUID = -5624866366474710161L; - private final int weight; private final boolean isOpen; private final boolean isInternal; diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 1c0663d..9426174 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -286,8 +286,8 @@ public class DungeonSchematic extends Schematic { { IDimLink link = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ(), IDimLink.TYPE_NORMAL); Point4D destination = link.source(); - link.setDestination(destination.getX(), destination.getY(), destination.getZ(), - PocketManager.getDimensionData(destination.getDimension())); + NewDimData prevDim = PocketManager.getDimensionData(destination.getDimension()); + prevDim.setDestination(link, destination.getX(), destination.getY(), destination.getZ()); } private static void createExitDoorLink(NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java index fc521bf..36c2757 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java @@ -68,8 +68,8 @@ public class ItemRiftSignature extends Item NewDimData destinationDimension = PocketManager.getDimensionData(world); IDimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), IDimLink.TYPE_NORMAL); IDimLink reverse = destinationDimension.createLink(x, y, z, IDimLink.TYPE_NORMAL); - link.setDestination(x, y, z, destinationDimension); - reverse.setDestination(source.getX(), source.getY(), source.getZ(), sourceDimension); + destinationDimension.setDestination(link, x, y, z); + sourceDimension.setDestination(reverse, source.getX(), source.getY(), source.getZ()); //Try placing a rift at the destination point if (!mod_pocketDim.blockRift.isBlockImmune(world, x, y, z)) diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index bcac33e..cde2099 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -74,13 +74,11 @@ import cpw.mods.fml.relauncher.Side; @Mod(modid = mod_pocketDim.modid, name = "Dimensional Doors", version = mod_pocketDim.version) - -@NetworkMod(clientSideRequired = true, serverSideRequired = false, +@NetworkMod(clientSideRequired = true, serverSideRequired = false, connectionHandler=ConnectionHandler.class, clientPacketHandlerSpec = -@SidedPacketHandler(channels = {"pocketDim" }, packetHandler = ClientPacketHandler.class), +@SidedPacketHandler(channels = {PacketConstants.CHANNEL_NAME}, packetHandler = ClientPacketHandler.class), serverPacketHandlerSpec = -@SidedPacketHandler(channels = {"pocketDim" }, packetHandler = ServerPacketHandler.class), -channels={"DimDoorPackets"}, packetHandler = PacketHandler.class, connectionHandler=ConnectionHandler.class) +@SidedPacketHandler(channels = {PacketConstants.CHANNEL_NAME}, packetHandler = ServerPacketHandler.class)) public class mod_pocketDim { diff --git a/StevenDimDoors/mod_pocketDim/watcher/IOpaqueMessage.java b/StevenDimDoors/mod_pocketDim/watcher/IOpaqueMessage.java new file mode 100644 index 0000000..a3add2e --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/watcher/IOpaqueMessage.java @@ -0,0 +1,8 @@ +package StevenDimDoors.mod_pocketDim.watcher; + +import java.io.DataOutputStream; + +public interface IOpaqueMessage +{ + void writeToStream(DataOutputStream stream); +} diff --git a/StevenDimDoors/mod_pocketDim/watcher/IOpaqueReader.java b/StevenDimDoors/mod_pocketDim/watcher/IOpaqueReader.java new file mode 100644 index 0000000..8250094 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/watcher/IOpaqueReader.java @@ -0,0 +1,8 @@ +package StevenDimDoors.mod_pocketDim.watcher; + +import com.google.common.io.ByteArrayDataInput; + +public interface IOpaqueReader +{ + IOpaqueMessage read(ByteArrayDataInput source); +} diff --git a/StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java b/StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java new file mode 100644 index 0000000..31f5a85 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java @@ -0,0 +1,8 @@ +package StevenDimDoors.mod_pocketDim.watcher; + +public interface IUpdateWatcher +{ + public void onCreated(IOpaqueMessage message); + public void onUpdated(IOpaqueMessage message); + public void onDeleted(IOpaqueMessage message); +} diff --git a/StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java b/StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java new file mode 100644 index 0000000..49874f2 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java @@ -0,0 +1,51 @@ +package StevenDimDoors.mod_pocketDim.watcher; + +import java.util.ArrayList; +import java.util.List; + +public class UpdateWatcherProxy implements IUpdateWatcher +{ + private List watchers; + + public UpdateWatcherProxy() + { + watchers = new ArrayList(); + } + + @Override + public void onCreated(IOpaqueMessage message) + { + for (IUpdateWatcher receiver : watchers) + { + receiver.onCreated(message); + } + } + + @Override + public void onUpdated(IOpaqueMessage message) + { + for (IUpdateWatcher receiver : watchers) + { + receiver.onUpdated(message); + } + } + + @Override + public void onDeleted(IOpaqueMessage message) + { + for (IUpdateWatcher receiver : watchers) + { + receiver.onDeleted(message); + } + } + + public void registerReceiver(IUpdateWatcher receiver) + { + watchers.add(receiver); + } + + public boolean unregisterReceiver(IUpdateWatcher receiver) + { + return watchers.remove(receiver); + } +} diff --git a/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java b/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java index c86e15a..9100b78 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java +++ b/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java @@ -1,23 +1,15 @@ - - -// This is my package declaration, do not mess with the standard (package net.minecraft.src;) like I did, -// Because I know what Im doing in this part, If you don't know what your doing keep it the normal (package net.minecraft.src;) package StevenDimDoors.mod_pocketDimClient; -// Theses are all the imports you need import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; import cpw.mods.fml.common.network.IPacketHandler; import cpw.mods.fml.common.network.Player; -// Create a class and implement IPacketHandler -// This just handles the data packets in the server -public class ClientPacketHandler implements IPacketHandler{ - +public class ClientPacketHandler implements IPacketHandler +{ @Override - public void onPacketData(INetworkManager manager, - Packet250CustomPayload packet, Player player) { - // TODO Auto-generated method stub + public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) + { } } -- 2.39.5 From 0bd7ef959379e7fff7e6817e17881d64c03d80ae Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 1 Sep 2013 22:02:05 -0400 Subject: [PATCH 045/544] Deleted PacketHandler Forgot to commit this change before. --- .../mod_pocketDim/PacketHandler.java | 271 ------------------ 1 file changed, 271 deletions(-) delete mode 100644 StevenDimDoors/mod_pocketDim/PacketHandler.java diff --git a/StevenDimDoors/mod_pocketDim/PacketHandler.java b/StevenDimDoors/mod_pocketDim/PacketHandler.java deleted file mode 100644 index 644d9f6..0000000 --- a/StevenDimDoors/mod_pocketDim/PacketHandler.java +++ /dev/null @@ -1,271 +0,0 @@ -package StevenDimDoors.mod_pocketDim; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.ObjectOutputStream; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; - -import net.minecraft.network.INetworkManager; -import net.minecraft.network.packet.Packet250CustomPayload; -import StevenDimDoors.mod_pocketDim.core.IDimLink; -import StevenDimDoors.mod_pocketDim.core.NewDimData; -import StevenDimDoors.mod_pocketDim.core.PocketManager; - -import com.google.common.io.ByteArrayDataInput; -import com.google.common.io.ByteStreams; - -import cpw.mods.fml.common.network.IPacketHandler; -import cpw.mods.fml.common.network.PacketDispatcher; -import cpw.mods.fml.common.network.Player; - -public class PacketHandler implements IPacketHandler -{ - public static byte DIM_UPDATE_PACKET_ID = 1; - public static byte REGISTER_DIM_PACKET_ID = 2; - public static byte REGISTER_LINK_PACKET_ID = 3; - public static byte REMOVE_LINK_PACKET_ID = 4; - - @Override - public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) - { - if (packet.channel.equals("DimDoorPackets")) - { - processPacket(packet, player); - } - } - - private void processPacket(Packet250CustomPayload packet, Player player) - { - ByteArrayDataInput data = ByteStreams.newDataInput(packet.data); - int id = data.readByte(); - if (id == REGISTER_DIM_PACKET_ID) - { - int dimId = data.readInt(); - try - { - NewDimData dimDataToAdd = new NewDimData(dimId, data.readBoolean(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt()); - - if(!PocketManager.dimList.containsKey(dimId)) - { - PocketManager.dimList.put(dimId, dimDataToAdd); - } - if (dimDataToAdd.isPocket) - { - DDProperties properties = DDProperties.instance(); - PocketManager.registerDimension(dimId, properties.PocketProviderID); - } - } - catch (Exception e) - { - e.printStackTrace(); - } - } - else if (id == REGISTER_LINK_PACKET_ID) - { - int dimId = data.readInt(); - try - { - NewDimData dimDataToAddLink= PocketManager.instance.getDimData(dimId); - - IDimLink linkToAdd = new IDimLink(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); - linkToAdd.hasGennedDoor=data.readBoolean(); - - PocketManager.instance.createLink(linkToAdd); - - } - catch (Exception e) - { - System.err.println("Tried to update client link data and failed!"); - e.printStackTrace(); - } - } - else if (id == REMOVE_LINK_PACKET_ID) - { - int dimId = data.readInt(); - try - { - NewDimData dimDataToRemoveFrom= PocketManager.instance.getDimData(dimId); - - IDimLink linkToAdd = new IDimLink(dimId, data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readInt(), data.readBoolean(),data.readInt()); - dimDataToRemoveFrom.removeLinkAtCoords(linkToAdd.locDimID, linkToAdd.locXCoord,linkToAdd.locYCoord, linkToAdd.locZCoord); - } - catch (Exception e) - { - System.out.println("Tried to update client link data & failed!"); - e.printStackTrace(); - } - } - } - - private static void processRegisterDimPacket() - { - - } - - private static void processUpdateDimPacket() - { - - } - - private static void processRegisterLinkPacket() - { - - } - - private static void processRemoveLinkPacket() - { - - } - - public static void sendClientJoinPacket(INetworkManager manager) - { - Collection dimIDs= dimList.keySet(); - Collection dimDataSet= dimList.values(); - Collection packetsToSend = new HashSet(); - - for(NewDimData data : dimDataSet) - { - manager.addToSendQueue(PacketHandler.onDimCreatedPacket(data)); - - Collection >> linkList = data.linksInThisDim.values(); - - for(HashMap map : linkList ) - { - Collection > linkList2 = map.values(); - for(HashMap map2 : linkList2) - { - Collection linkList3 = map2.values(); - - for(IDimLink link : linkList3) - { - packetsToSend.add(( PacketHandler.onLinkCreatedPacket(link))); - } - } - } - } - - for (Packet250CustomPayload packet : packetsToSend) - { - manager.addToSendQueue(packet); - } - } - - public static void sendLinkCreatedPacket(IDimLink link) - { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - DataOutputStream dataOut = new DataOutputStream(bos); - - try - { - dataOut.writeByte(PacketHandler.registerLinkPacketID); - dataOut.writeInt(link.locDimID); - dataOut.writeInt(link.destDimID); - dataOut.writeInt(link.locXCoord); - dataOut.writeInt(link.locYCoord); - dataOut.writeInt(link.locZCoord); - dataOut.writeInt(link.destXCoord); - dataOut.writeInt(link.destYCoord); - dataOut.writeInt(link.destZCoord); - dataOut.writeBoolean(link.isLocPocket); - - dataOut.writeInt(link.linkOrientation); - dataOut.writeBoolean(link.hasGennedDoor); - } - catch (IOException e) - { - e.printStackTrace(); - } - - Packet250CustomPayload packet= new Packet250CustomPayload(); - packet.channel = "DimDoorPackets"; - packet.data = bos.toByteArray(); - packet.length = bos.size();; - PacketDispatcher.sendPacketToAllPlayers(packet); - return packet; - } - - public static void sendLinkRemovedPacket(IDimLink link) - { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - DataOutputStream dataOut = new DataOutputStream(bos); - - try - { - dataOut.writeByte(PacketHandler.removeLinkPacketID); - dataOut.writeInt(link.locDimID); - dataOut.writeInt(link.destDimID); - dataOut.writeInt(link.locXCoord); - dataOut.writeInt(link.locYCoord); - dataOut.writeInt(link.locZCoord); - dataOut.writeInt(link.destXCoord); - dataOut.writeInt(link.destYCoord); - dataOut.writeInt(link.destZCoord); - dataOut.writeBoolean(link.isLocPocket); - } - catch (IOException e) - { - e.printStackTrace(); - } - - Packet250CustomPayload packet= new Packet250CustomPayload(); - packet.channel="DimDoorPackets"; - packet.data = bos.toByteArray(); - packet.length = bos.size();; - PacketDispatcher.sendPacketToAllPlayers(packet); - } - - - public static void sendDimCreatedPacket(NewDimData data) - { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - DataOutputStream dataOut = new DataOutputStream(bos); - - try - { - dataOut.writeByte(PacketHandler.regsiterDimPacketID); - dataOut.writeInt(data.dimID); - dataOut.writeBoolean(data.isPocket); - - dataOut.writeInt(data.depth); - dataOut.writeInt(data.exitDimLink.destDimID); - dataOut.writeInt(data.exitDimLink.destXCoord); - dataOut.writeInt(data.exitDimLink.destYCoord); - dataOut.writeInt(data.exitDimLink.destZCoord); - } - catch (IOException e) - { - e.printStackTrace(); - } - - Packet250CustomPayload packet= new Packet250CustomPayload(); - packet.channel="DimDoorPackets"; - packet.data = bos.toByteArray(); - packet.length = bos.size(); - - PacketDispatcher.sendPacketToAllPlayers(packet); - return packet; - } - - public static void sendDimObject(NewDimData dim) - { - try - { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream dataOut = new ObjectOutputStream(bos); - dataOut.writeObject(dim); - - Packet250CustomPayload packet= new Packet250CustomPayload(); - packet.channel="DimDoorPackets"; - packet.data = bos.toByteArray(); - packet.length = bos.size();; - PacketDispatcher.sendPacketToAllPlayers(packet); - } - catch (IOException e) - { - e.printStackTrace(); - } - } -} \ No newline at end of file -- 2.39.5 From af7bb05042401348e3742abc23e8e7eecb83fc54 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Sun, 1 Sep 2013 23:27:30 -0400 Subject: [PATCH 046/544] Chunk leak patched Not checking if a chunk existed before we placed a rift block could cause the MC server to generate chunks in unloaded terrain. Bad things commence. Possible world leak canidate. --- StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java index 950c505..77f088c 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java +++ b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java @@ -48,7 +48,7 @@ public class RiftRegenerator implements IRegularTickReceiver { { IDimLink link = dimension.getRandomLink(); Point4D source = link.source(); - if (!mod_pocketDim.blockRift.isBlockImmune(world, source.getX(), source.getY(), source.getZ())) + if (!mod_pocketDim.blockRift.isBlockImmune(world, source.getX(), source.getY(), source.getZ())&& world.getChunkProvider().chunkExists(source.getX() >> 4, source.getZ() >> 4)) { world.setBlock(source.getX(), source.getY(), source.getZ(), properties.RiftBlockID); } -- 2.39.5 From 56ecb0cd9ea7c9fbdacf76e7f0bb4b840275b42d Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 2 Sep 2013 11:47:12 -0400 Subject: [PATCH 047/544] Reorganized DimLink Code Moved the DimLink code out of NewDimData in order to reduce clutter inside that class and made it a separate class, except for functions that should only be available for NewDimData. Deleted IDimLink and changed all references to it to use DimLink instead. DimLink is now an abstract class, which achieves the same encapsulation and protection we had before by having DimLink implement IDimLink from within NewDimData. NewDimData has a new class inside, InnerDimLink, which provides it access to special functions that would be dangerous to expose. This is the same mechanism used to protect NewDimData's dangerous functions. These changes are in preparation for adding more code for packet handling. --- .../mod_pocketDim/DDTeleporter.java | 13 +- .../mod_pocketDim/blocks/DimensionalDoor.java | 9 +- .../mod_pocketDim/blocks/TransientDoor.java | 4 +- .../mod_pocketDim/blocks/UnstableDoor.java | 4 +- .../mod_pocketDim/blocks/WarpDoor.java | 7 +- .../commands/CommandCreateDungeonRift.java | 4 +- .../mod_pocketDim/core/DimLink.java | 77 ++++++++ .../mod_pocketDim/core/IDimLink.java | 27 --- .../mod_pocketDim/core/LinkTypes.java | 19 ++ .../mod_pocketDim/core/NewDimData.java | 164 ++++++------------ .../mod_pocketDim/core/PocketManager.java | 6 +- .../dungeon/DungeonSchematic.java | 15 +- .../mod_pocketDim/helpers/DungeonHelper.java | 7 +- .../mod_pocketDim/items/BaseItemDoor.java | 4 +- .../mod_pocketDim/items/ItemRiftBlade.java | 4 +- .../items/ItemRiftSignature.java | 7 +- .../ticking/RiftRegenerator.java | 4 +- .../tileentities/TileEntityRift.java | 6 +- .../mod_pocketDim/world/GatewayGenerator.java | 9 +- .../mod_pocketDim/world/PocketBuilder.java | 8 +- 20 files changed, 206 insertions(+), 192 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/core/DimLink.java delete mode 100644 StevenDimDoors/mod_pocketDim/core/IDimLink.java create mode 100644 StevenDimDoors/mod_pocketDim/core/LinkTypes.java diff --git a/StevenDimDoors/mod_pocketDim/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/DDTeleporter.java index e390ca7..06b7289 100644 --- a/StevenDimDoors/mod_pocketDim/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/DDTeleporter.java @@ -16,7 +16,8 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.world.PocketBuilder; @@ -312,7 +313,7 @@ public class DDTeleporter * @param link - the link the player is using to teleport; sends the player to its destination * @param player - the instance of the player to be teleported */ - public static void traverseDimDoor(World world, IDimLink link, Entity entity) + public static void traverseDimDoor(World world, DimLink link, Entity entity) { if (world == null) { @@ -349,7 +350,7 @@ public class DDTeleporter entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); } - private static boolean initializeDestination(IDimLink link, DDProperties properties) + private static boolean initializeDestination(DimLink link, DDProperties properties) { //FIXME: Change this later to support rooms that have been wiped and must be regenerated. if (link.hasDestination()) @@ -362,11 +363,11 @@ public class DDTeleporter //FIXME: Add code for restoring the destination-side door. switch (link.linkType()) { - case IDimLink.TYPE_DUNGEON: + case LinkTypes.DUNGEON: return PocketBuilder.generateNewDungeonPocket(link, properties); - case IDimLink.TYPE_POCKET: + case LinkTypes.POCKET: return PocketBuilder.generateNewPocket(link, properties); - case IDimLink.TYPE_NORMAL: + case LinkTypes.NORMAL: return true; default: throw new IllegalArgumentException("link has an unrecognized link type."); diff --git a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java index fbd0281..95de79d 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java @@ -20,7 +20,8 @@ import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.DDTeleporter; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; @@ -59,7 +60,7 @@ public class DimensionalDoor extends BlockContainer { this.onPoweredBlockChange(world, x, y, z, false); - IDimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); + DimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); if (link != null) { DDTeleporter.traverseDimDoor(world, link, entity); @@ -169,10 +170,10 @@ public class DimensionalDoor extends BlockContainer if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) { NewDimData dimension = PocketManager.getDimensionData(world); - IDimLink link = dimension.getLink(x, y, z); + DimLink link = dimension.getLink(x, y, z); if (link == null) { - dimension.createLink(x, y, z, IDimLink.TYPE_POCKET); + dimension.createLink(x, y, z, LinkTypes.POCKET); } } world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java index 6fbbc93..48ce75e 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java @@ -12,7 +12,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDTeleporter; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -66,7 +66,7 @@ public class TransientDoor extends WarpDoor { this.onPoweredBlockChange(world, x, y, z, false); - IDimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); + DimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); if (link != null) { DDTeleporter.traverseDimDoor(world, link, entity); diff --git a/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java index d53e576..c4875ed 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java @@ -7,7 +7,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; @@ -54,7 +54,7 @@ public class UnstableDoor extends DimensionalDoor if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) { NewDimData dimension = PocketManager.getDimensionData(world); - dimension.createLink(x, y, z, IDimLink.TYPE_RANDOM); + dimension.createLink(x, y, z, LinkTypes.RANDOM); } } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java index 410a052..445d8d9 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java @@ -9,7 +9,8 @@ import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; @@ -38,10 +39,10 @@ public class WarpDoor extends DimensionalDoor if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) { NewDimData dimension = PocketManager.getDimensionData(world); - IDimLink link = dimension.getLink(x, y, z); + DimLink link = dimension.getLink(x, y, z); if (link == null) { - dimension.createLink(x, y, z, IDimLink.TYPE_SAFE_EXIT); + dimension.createLink(x, y, z, LinkTypes.SAFE_EXIT); } } world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java index 8a055f8..c15b458 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java @@ -4,7 +4,7 @@ import java.util.Collection; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.MathHelper; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; @@ -55,7 +55,7 @@ public class CommandCreateDungeonRift extends DDCommandBase } else { - IDimLink link; + DimLink link; DungeonData result; int x = MathHelper.floor_double(sender.posX); int y = MathHelper.floor_double(sender.posY); diff --git a/StevenDimDoors/mod_pocketDim/core/DimLink.java b/StevenDimDoors/mod_pocketDim/core/DimLink.java new file mode 100644 index 0000000..c0cf6de --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/core/DimLink.java @@ -0,0 +1,77 @@ +package StevenDimDoors.mod_pocketDim.core; + +import java.util.ArrayList; + +import StevenDimDoors.mod_pocketDim.util.Point4D; + +public abstract class DimLink +{ + private static final int EXPECTED_CHILDREN = 2; + + protected Point4D source; + protected DimLink parent; + protected LinkTail tail; + protected ArrayList children; + + public DimLink(Point4D source, DimLink parent) + { + this.parent = parent; + this.source = source; + this.tail = parent.tail; + this.children = new ArrayList(EXPECTED_CHILDREN); + parent.children.add(this); + } + + public DimLink(Point4D source, int linkType) + { + if (linkType < LinkTypes.ENUM_MIN || linkType > LinkTypes.ENUM_MAX) + { + throw new IllegalArgumentException("The specified link type is invalid."); + } + + this.parent = null; + this.source = source; + this.tail = new LinkTail(linkType, null); + this.children = new ArrayList(EXPECTED_CHILDREN); + } + + public Point4D source() + { + return source; + } + + public Point4D destination() + { + return tail.getDestination(); + } + + public boolean hasDestination() + { + return (tail.getDestination() != null); + } + + public Iterable children() + { + return children; + } + + public int childCount() + { + return children.size(); + } + + public DimLink parent() + { + return parent; + } + + public int linkType() + { + return tail.getLinkType(); + } + + public String toString() + { + return source + " -> " + (hasDestination() ? destination() : ""); + } +} diff --git a/StevenDimDoors/mod_pocketDim/core/IDimLink.java b/StevenDimDoors/mod_pocketDim/core/IDimLink.java deleted file mode 100644 index 4ed15b0..0000000 --- a/StevenDimDoors/mod_pocketDim/core/IDimLink.java +++ /dev/null @@ -1,27 +0,0 @@ -package StevenDimDoors.mod_pocketDim.core; - -import StevenDimDoors.mod_pocketDim.util.Point4D; - -public interface IDimLink -{ - public final int TYPE_ENUM_MIN = 0; - public final int TYPE_ENUM_MAX = 8; - - public final int TYPE_NORMAL = 0; - public final int TYPE_LIMBO = 1; - public final int TYPE_POCKET = 2; - public final int TYPE_DUNGEON = 3; - public final int TYPE_RANDOM = 4; - public final int TYPE_DUNGEON_EXIT = 5; - public final int TYPE_SAFE_EXIT = 6; - public final int TYPE_UNSAFE_EXIT = 7; - public final int TYPE_RANDOM_DUNGEON = 8; - - public Point4D source(); - public Point4D destination(); - public boolean hasDestination(); - public Iterable children(); - public int childCount(); - public IDimLink parent(); - public int linkType(); -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/core/LinkTypes.java b/StevenDimDoors/mod_pocketDim/core/LinkTypes.java new file mode 100644 index 0000000..b493e6c --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/core/LinkTypes.java @@ -0,0 +1,19 @@ +package StevenDimDoors.mod_pocketDim.core; + +public class LinkTypes +{ + private LinkTypes() { } + + public static final int ENUM_MIN = 0; + public static final int ENUM_MAX = 8; + + public static final int NORMAL = 0; + public static final int LIMBO = 1; + public static final int POCKET = 2; + public static final int DUNGEON = 3; + public static final int RANDOM = 4; + public static final int DUNGEON_EXIT = 5; + public static final int SAFE_EXIT = 6; + public static final int UNSAFE_EXIT = 7; + public static final int RANDOM_DUNGEON = 8; +} diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index c7e0c2e..02ba5c4 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -1,4 +1,5 @@ package StevenDimDoors.mod_pocketDim.core; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -15,92 +16,29 @@ import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; public abstract class NewDimData { - private static class DimLink implements IDimLink + private static class InnerDimLink extends DimLink { - //DimLink is an inner class here to make it immutable to code outside NewDimData - - private static final int EXPECTED_CHILDREN = 2; - - private Point4D source; - private DimLink parent; - private LinkTail tail; - private ArrayList children; - - public DimLink(Point4D source, DimLink parent) + public InnerDimLink(Point4D source, DimLink parent) { - this.parent = parent; - this.source = source; - this.tail = parent.tail; - this.children = new ArrayList(EXPECTED_CHILDREN); - parent.children.add(this); + super(source, parent); } - public DimLink(Point4D source, int linkType) + public InnerDimLink(Point4D source, int linkType) { - if (linkType < IDimLink.TYPE_ENUM_MIN || linkType > IDimLink.TYPE_ENUM_MAX) - { - throw new IllegalArgumentException("The specified link type is invalid."); - } - - this.parent = null; - this.source = source; - this.tail = new LinkTail(linkType, null); - this.children = new ArrayList(EXPECTED_CHILDREN); + super(source, linkType); } - @Override - public Point4D source() - { - return source; - } - - @Override - public Point4D destination() - { - return tail.getDestination(); - } - - @Override - public boolean hasDestination() - { - return (tail.getDestination() != null); - } - public void setDestination(int x, int y, int z, NewDimData dimension) { tail.setDestination(new Point4D(x, y, z, dimension.id())); } - - @Override - public Iterable children() - { - return children; - } - - @Override - public int childCount() - { - return children.size(); - } - - @Override - public IDimLink parent() - { - return parent; - } - - @Override - public int linkType() - { - return tail.getLinkType(); - } public void clear() { //Release children - for (IDimLink child : children) + for (DimLink child : children) { - ((DimLink) child).parent = null; + ((InnerDimLink) child).parent = null; } children.clear(); @@ -115,7 +53,7 @@ public abstract class NewDimData tail = new LinkTail(0, null); } - public void overwrite(DimLink nextParent) + public boolean overwrite(InnerDimLink nextParent) { if (nextParent == null) { @@ -125,13 +63,13 @@ public abstract class NewDimData if (this == nextParent) { //Ignore this request silently - return; + return false; } //Release children - for (IDimLink child : children) + for (DimLink child : children) { - ((DimLink) child).parent = null; + ((InnerDimLink) child).parent = null; } children.clear(); @@ -145,14 +83,15 @@ public abstract class NewDimData parent = nextParent; tail = nextParent.tail; nextParent.children.add(this); + return true; } public void overwrite(int linkType) { //Release children - for (IDimLink child : children) + for (DimLink child : children) { - ((DimLink) child).parent = null; + ((InnerDimLink) child).parent = null; } children.clear(); @@ -166,12 +105,6 @@ public abstract class NewDimData parent = null; tail = new LinkTail(linkType, null); } - - @Override - public String toString() - { - return source + " -> " + (hasDestination() ? destination() : ""); - } public IOpaqueMessage toMessage() { @@ -187,8 +120,8 @@ public abstract class NewDimData private static Random random = new Random(); private final int id; - private final Map linkMapping; - private final List linkList; + private final Map linkMapping; + private final List linkList; private final boolean isDungeon; private boolean isFilled; private final int depth; @@ -216,8 +149,8 @@ public abstract class NewDimData } this.id = id; - this.linkMapping = new TreeMap(); //Should be stored in oct tree -- temporary solution - this.linkList = new ArrayList(); //Should be stored in oct tree -- temporary solution + this.linkMapping = new TreeMap(); //Should be stored in oct tree -- temporary solution + this.linkList = new ArrayList(); //Should be stored in oct tree -- temporary solution this.children = new ArrayList(); this.parent = parent; this.packDepth = 0; @@ -247,7 +180,7 @@ public abstract class NewDimData protected abstract IOpaqueMessage toMessage(); protected abstract IOpaqueMessage toKey(); - public IDimLink findNearestRift(World world, int range, int x, int y, int z) + public DimLink findNearestRift(World world, int range, int x, int y, int z) { //TODO: Rewrite this later to use an octtree @@ -260,8 +193,8 @@ public abstract class NewDimData //Note: Only detect rifts at a distance > 1, so we ignore the rift //that called this function and any adjacent rifts. - IDimLink nearest = null; - IDimLink link; + DimLink nearest = null; + DimLink link; int distance; int minDistance = Integer.MAX_VALUE; @@ -296,18 +229,18 @@ public abstract class NewDimData return Math.abs(i) + Math.abs(j) + Math.abs(k); } - public IDimLink createLink(int x, int y, int z, int linkType) + public DimLink createLink(int x, int y, int z, int linkType) { return createLink(new Point4D(x, y, z, id), linkType); } - private IDimLink createLink(Point4D source, int linkType) + private DimLink createLink(Point4D source, int linkType) { //Return an existing link if there is one to avoid creating multiple links starting at the same point. - DimLink link = linkMapping.get(source); + InnerDimLink link = linkMapping.get(source); if (link == null) { - link = new DimLink(source, linkType); + link = new InnerDimLink(source, linkType); linkMapping.put(source, link); linkList.add(link); } @@ -320,44 +253,49 @@ public abstract class NewDimData return link; } - public IDimLink createChildLink(int x, int y, int z, IDimLink parent) + public DimLink createChildLink(int x, int y, int z, DimLink parent) { if (parent == null) { throw new IllegalArgumentException("parent cannot be null."); } - return createChildLink(new Point4D(x, y, z, id), (DimLink) parent); + return createChildLink(new Point4D(x, y, z, id), (InnerDimLink) parent); } - private IDimLink createChildLink(Point4D source, DimLink parent) + private DimLink createChildLink(Point4D source, InnerDimLink parent) { //To avoid having multiple links at a single point, if we find an existing link then we overwrite //its destination data instead of creating a new instance. - DimLink link = linkMapping.get(source); + InnerDimLink link = linkMapping.get(source); if (link == null) { - link = new DimLink(source, parent); + link = new InnerDimLink(source, parent); linkMapping.put(source, link); linkList.add(link); + + //Link created! + linkWatcher.onCreated(link.toMessage()); } else { - link.overwrite(parent); + if (link.overwrite(parent)) + { + //Link created! + linkWatcher.onCreated(link.toMessage()); + } } - //Link created! - linkWatcher.onCreated(link.toMessage()); return link; } - public boolean deleteLink(IDimLink link) + public boolean deleteLink(DimLink link) { if (link.source().getDimension() != id) { throw new IllegalArgumentException("Attempted to delete a link from another dimension."); } - DimLink target = linkMapping.remove(link.source()); + InnerDimLink target = linkMapping.remove(link.source()); if (target != null) { linkList.remove(target); @@ -371,7 +309,7 @@ public abstract class NewDimData public boolean deleteLink(int x, int y, int z) { Point4D location = new Point4D(x, y, z, id); - DimLink target = linkMapping.remove(location); + InnerDimLink target = linkMapping.remove(location); if (target != null) { linkList.remove(target); @@ -382,13 +320,13 @@ public abstract class NewDimData return (target != null); } - public IDimLink getLink(int x, int y, int z) + public DimLink getLink(int x, int y, int z) { Point4D location = new Point4D(x, y, z, id); return linkMapping.get(location); } - public IDimLink getLink(Point4D location) + public DimLink getLink(Point4D location) { if (location.getDimension() != id) return null; @@ -396,9 +334,9 @@ public abstract class NewDimData return linkMapping.get(location); } - public ArrayList getAllLinks() + public ArrayList getAllLinks() { - ArrayList results = new ArrayList(linkMapping.size()); + ArrayList results = new ArrayList(linkMapping.size()); results.addAll(linkMapping.values()); return results; } @@ -480,7 +418,7 @@ public abstract class NewDimData return children; } - public void initializeDungeon(int originX, int originY, int originZ, int orientation, IDimLink incoming, DungeonData dungeon) + public void initializeDungeon(int originX, int originY, int originZ, int orientation, DimLink incoming, DungeonData dungeon) { if (!isDungeon) { @@ -532,7 +470,7 @@ public abstract class NewDimData } } - public void initializePocket(int originX, int originY, int originZ, int orientation, IDimLink incoming) + public void initializePocket(int originX, int originY, int originZ, int orientation, DimLink incoming) { if (!isPocketDimension()) { @@ -550,15 +488,15 @@ public abstract class NewDimData dimWatcher.onUpdated(this.toMessage()); } - public void setDestination(IDimLink incoming, int x, int y, int z) + public void setDestination(DimLink incoming, int x, int y, int z) { - DimLink link = (DimLink) incoming; + InnerDimLink link = (InnerDimLink) incoming; link.setDestination(x, y, z, this); //Raise update event linkWatcher.onUpdated(link.toMessage()); } - public IDimLink getRandomLink() + public DimLink getRandomLink() { if (linkMapping.isEmpty()) { diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 3555915..92ff1e2 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -259,7 +259,7 @@ public class PocketManager //Does not actually unregister the rift data, see deleteRift for that. NewDimData dimension = getDimensionData(world); - IDimLink nearest = dimension.findNearestRift(world, range, x, y, z); + DimLink nearest = dimension.findNearestRift(world, range, x, y, z); if (nearest != null) { @@ -339,12 +339,12 @@ public class PocketManager return dimensionData.values(); } - public static IDimLink getLink(int x, int y, int z, World world) + public static DimLink getLink(int x, int y, int z, World world) { return getLink(x, y, z, world.provider.dimensionId); } - public static IDimLink getLink(int x, int y, int z, int dimensionID) + public static DimLink getLink(int x, int y, int z, int dimensionID) { NewDimData dimension = dimensionData.get(dimensionID); if (dimension != null) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 9426174..c118c17 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -17,7 +17,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; @@ -167,7 +168,7 @@ public class DungeonSchematic extends Schematic { return new DungeonSchematic(Schematic.copyFromWorld(world, x, y, z, width, height, length, doCompactBounds)); } - public void copyToWorld(World world, Point3D pocketCenter, int dungeonOrientation, IDimLink entryLink, Random random) + public void copyToWorld(World world, Point3D pocketCenter, int dungeonOrientation, DimLink entryLink, Random random) { //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, @@ -224,7 +225,7 @@ public class DungeonSchematic extends Schematic { setUpDungeon(PocketManager.getDimensionData(world), world, pocketCenter, turnAngle, entryLink, random); } - private void setUpDungeon(NewDimData dimension, World world, Point3D pocketCenter, int turnAngle, IDimLink entryLink, Random random) + private void setUpDungeon(NewDimData dimension, World world, Point3D pocketCenter, int turnAngle, DimLink entryLink, Random random) { //Transform dungeon corners Point3D minCorner = new Point3D(0, 0, 0); @@ -282,9 +283,9 @@ public class DungeonSchematic extends Schematic { } } - private static void createEntranceReverseLink(NewDimData dimension, Point3D pocketCenter, IDimLink entryLink) + private static void createEntranceReverseLink(NewDimData dimension, Point3D pocketCenter, DimLink entryLink) { - IDimLink link = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ(), IDimLink.TYPE_NORMAL); + DimLink link = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ(), LinkTypes.NORMAL); Point4D destination = link.source(); NewDimData prevDim = PocketManager.getDimensionData(destination.getDimension()); prevDim.setDestination(link, destination.getX(), destination.getY(), destination.getZ()); @@ -295,7 +296,7 @@ public class DungeonSchematic extends Schematic { //Transform the door's location to the pocket coordinate system Point3D location = point.clone(); BlockRotator.transformPoint(location, entrance, rotation, pocketCenter); - dimension.createLink(location.getX(), location.getY(), location.getZ(), IDimLink.TYPE_DUNGEON_EXIT); + dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkTypes.DUNGEON_EXIT); } private static void createDimensionalDoorLink(NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) @@ -303,7 +304,7 @@ public class DungeonSchematic extends Schematic { //Transform the door's location to the pocket coordinate system Point3D location = point.clone(); BlockRotator.transformPoint(location, entrance, rotation, pocketCenter); - dimension.createLink(location.getX(), location.getY(), location.getZ(), IDimLink.TYPE_DUNGEON); + dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkTypes.DUNGEON); } private static void spawnMonolith(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index cc9cfdb..cebfefb 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -21,7 +21,8 @@ import net.minecraft.util.WeightedRandom; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; @@ -274,11 +275,11 @@ public class DungeonHelper return pack; } - public IDimLink createCustomDungeonDoor(World world, int x, int y, int z) + public DimLink createCustomDungeonDoor(World world, int x, int y, int z) { //Create a link above the specified position. Link to a new pocket dimension. NewDimData dimension = PocketManager.getDimensionData(world); - IDimLink link = dimension.createLink(x, y + 1, z, IDimLink.TYPE_POCKET); + DimLink link = dimension.createLink(x, y + 1, z, LinkTypes.POCKET); //Place a Warp Door linked to that pocket ItemDimensionalDoor.placeDoorBlock(world, x, y, z, 3, mod_pocketDim.warpDoor); diff --git a/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java b/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java index 88600bc..9517b95 100644 --- a/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java +++ b/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java @@ -15,7 +15,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; public abstract class BaseItemDoor extends ItemDoor @@ -114,7 +114,7 @@ public abstract class BaseItemDoor extends ItemDoor { if (world.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) { - IDimLink link = PocketManager.getLink(hit.blockX, hit.blockY, hit.blockZ, world.provider.dimensionId); + DimLink link = PocketManager.getLink(hit.blockX, hit.blockY, hit.blockZ, world.provider.dimensionId); if (link != null) { int x = hit.blockX; diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index c6eec69..ba49480 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -20,7 +20,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; @@ -187,7 +187,7 @@ public class ItemRiftBlade extends ItemSword NewDimData dimension = PocketManager.getDimensionData(world); if (!dimension.isPocketDimension() && dimension.getLink(x, y + 1, z) == null) { - dimension.createLink(x, y + 1, z, IDimLink.TYPE_POCKET); + dimension.createLink(x, y + 1, z, LinkTypes.POCKET); player.worldObj.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1); ItemDimensionalDoor.placeDoorBlock(world, x, y, z, orientation, mod_pocketDim.transientDoor); } diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java index 36c2757..088b93d 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java @@ -10,7 +10,8 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.util.Point4D; @@ -66,8 +67,8 @@ public class ItemRiftSignature extends Item //The link was used before and already has an endpoint stored. Create links connecting the two endpoints. NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension()); NewDimData destinationDimension = PocketManager.getDimensionData(world); - IDimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), IDimLink.TYPE_NORMAL); - IDimLink reverse = destinationDimension.createLink(x, y, z, IDimLink.TYPE_NORMAL); + DimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.NORMAL); + DimLink reverse = destinationDimension.createLink(x, y, z, LinkTypes.NORMAL); destinationDimension.setDestination(link, x, y, z); sourceDimension.setDestination(reverse, source.getX(), source.getY(), source.getZ()); diff --git a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java index 950c505..4c82dc1 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java +++ b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java @@ -4,7 +4,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; @@ -46,7 +46,7 @@ public class RiftRegenerator implements IRegularTickReceiver { { for (int count = 0; count < RIFTS_REGENERATED_PER_DIMENSION; count++) { - IDimLink link = dimension.getRandomLink(); + DimLink link = dimension.getRandomLink(); Point4D source = link.source(); if (!mod_pocketDim.blockRift.isBlockImmune(world, source.getX(), source.getY(), source.getZ())) { diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index dfa27b5..fc74f69 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -17,7 +17,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.util.Point4D; @@ -38,7 +38,7 @@ public class TileEntityRift extends TileEntity public int age = 0; public HashMap renderingCenters = new HashMap(); - public IDimLink nearestRiftData; + public DimLink nearestRiftData; public int spawnedEndermenID=0; DataWatcher watcher = new DataWatcher(); @@ -240,7 +240,7 @@ public class TileEntityRift extends TileEntity if (growCount < 100) { NewDimData dimension = PocketManager.getDimensionData(worldObj); - IDimLink link = dimension.getLink(xCoord, yCoord, zCoord); + DimLink link = dimension.getLink(xCoord, yCoord, zCoord); if (link != null) { if (!this.hasGrownRifts && random.nextInt(3) == 0) diff --git a/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java index 2a2e0f0..bc52bf7 100644 --- a/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java +++ b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java @@ -9,7 +9,8 @@ import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; @@ -57,7 +58,7 @@ public class GatewayGenerator implements IWorldGenerator int attempts; int correction; boolean valid; - IDimLink link; + DimLink link; NewDimData dimension; //Check if we're generating things in the Nether @@ -97,7 +98,7 @@ public class GatewayGenerator implements IWorldGenerator if (link == null) { dimension = PocketManager.getDimensionData(world); - link = dimension.createLink(x, y + 1, z, IDimLink.TYPE_POCKET); + link = dimension.createLink(x, y + 1, z, LinkTypes.POCKET); } else { @@ -132,7 +133,7 @@ public class GatewayGenerator implements IWorldGenerator { //Create a partial link to a dungeon. dimension = PocketManager.getDimensionData(world); - link = dimension.createLink(x, y + 1, z, IDimLink.TYPE_DUNGEON); + link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON); //If the current dimension isn't Limbo, build a Rift Gateway out of Stone Bricks if (dimension.id() != properties.LimboDimensionID) diff --git a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index cc524fd..1f9aa7b 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -10,7 +10,7 @@ import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; -import StevenDimDoors.mod_pocketDim.core.IDimLink; +import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; @@ -36,7 +36,7 @@ public class PocketBuilder private PocketBuilder() { } - public static boolean generateNewDungeonPocket(IDimLink link, DDProperties properties) + public static boolean generateNewDungeonPocket(DimLink link, DDProperties properties) { if (link == null) { @@ -214,7 +214,7 @@ public class PocketBuilder schematic.getLength() <= DungeonHelper.MAX_DUNGEON_LENGTH); } - public static boolean generateNewPocket(IDimLink link, DDProperties properties) + public static boolean generateNewPocket(DimLink link, DDProperties properties) { return generateNewPocket(link, DEFAULT_POCKET_SIZE, DEFAULT_POCKET_WALL_THICKNESS, properties); } @@ -240,7 +240,7 @@ public class PocketBuilder return orientation; } - public static boolean generateNewPocket(IDimLink link, int size, int wallThickness, DDProperties properties) + public static boolean generateNewPocket(DimLink link, int size, int wallThickness, DDProperties properties) { if (link == null) { -- 2.39.5 From 307d2258d14f4ca2f51e28db403ec9a7fac6db8b Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 2 Sep 2013 16:51:20 -0400 Subject: [PATCH 048/544] Progress on Rewriting Packet Handling Continued building a system for transferring the complete internal states of our dimensions from the server to the client. However, Steven suggested that clients only need minimal data to operate properly, as opposed to the server. My motivation for this more complicated system was the concern that minimal information wouldn't be enough. I'm going to commit my progress, then tear it down and write a much simpler version. --- .../mod_pocketDim/ConnectionHandler.java | 4 +- .../mod_pocketDim/ServerPacketHandler.java | 18 +-- .../mod_pocketDim/core/DimLink.java | 4 +- .../mod_pocketDim/core/NewDimData.java | 18 +-- .../mod_pocketDim/core/PocketManager.java | 30 ++-- .../messages/DimMessageBuilder.java | 116 +++++++++++++++ .../mod_pocketDim/messages/IDataMessage.java | 9 ++ .../messages/IMessageBuilder.java | 11 ++ .../messages/IUpdateWatcher.java | 8 ++ .../messages/LinkMessageBuilder.java | 134 ++++++++++++++++++ .../UpdateWatcherProxy.java | 8 +- .../mod_pocketDim/util/Point4D.java | 28 ++++ .../mod_pocketDim/watcher/IOpaqueMessage.java | 8 -- .../mod_pocketDim/watcher/IOpaqueReader.java | 8 -- .../mod_pocketDim/watcher/IUpdateWatcher.java | 8 -- 15 files changed, 348 insertions(+), 64 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/messages/DimMessageBuilder.java create mode 100644 StevenDimDoors/mod_pocketDim/messages/IDataMessage.java create mode 100644 StevenDimDoors/mod_pocketDim/messages/IMessageBuilder.java create mode 100644 StevenDimDoors/mod_pocketDim/messages/IUpdateWatcher.java create mode 100644 StevenDimDoors/mod_pocketDim/messages/LinkMessageBuilder.java rename StevenDimDoors/mod_pocketDim/{watcher => messages}/UpdateWatcherProxy.java (79%) delete mode 100644 StevenDimDoors/mod_pocketDim/watcher/IOpaqueMessage.java delete mode 100644 StevenDimDoors/mod_pocketDim/watcher/IOpaqueReader.java delete mode 100644 StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java diff --git a/StevenDimDoors/mod_pocketDim/ConnectionHandler.java b/StevenDimDoors/mod_pocketDim/ConnectionHandler.java index 0b13248..2abf8d3 100644 --- a/StevenDimDoors/mod_pocketDim/ConnectionHandler.java +++ b/StevenDimDoors/mod_pocketDim/ConnectionHandler.java @@ -11,7 +11,7 @@ import net.minecraft.network.packet.Packet1Login; import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.server.MinecraftServer; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.watcher.IOpaqueMessage; +import StevenDimDoors.mod_pocketDim.messages.IDataMessage; import cpw.mods.fml.common.network.IConnectionHandler; import cpw.mods.fml.common.network.Player; @@ -41,7 +41,7 @@ public class ConnectionHandler implements IConnectionHandler //Send information about all the registered dimensions and links to the client try { - IOpaqueMessage message = PocketManager.getState(); + IDataMessage message = PocketManager.getState(); Packet250CustomPayload packet = new Packet250CustomPayload(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); DataOutputStream writer = new DataOutputStream(buffer); diff --git a/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java b/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java index 310b84a..d33c613 100644 --- a/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java +++ b/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java @@ -7,8 +7,8 @@ import java.io.IOException; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.watcher.IOpaqueMessage; -import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; +import StevenDimDoors.mod_pocketDim.messages.IDataMessage; +import StevenDimDoors.mod_pocketDim.messages.IUpdateWatcher; import cpw.mods.fml.common.network.IPacketHandler; import cpw.mods.fml.common.network.PacketDispatcher; import cpw.mods.fml.common.network.Player; @@ -30,19 +30,19 @@ public class ServerPacketHandler implements IPacketHandler private class DimWatcher implements IUpdateWatcher { @Override - public void onCreated(IOpaqueMessage message) + public void onCreated(IDataMessage message) { sendMessageToAllPlayers(PacketConstants.CREATE_DIM_PACKET_ID, message); } @Override - public void onUpdated(IOpaqueMessage message) + public void onUpdated(IDataMessage message) { sendMessageToAllPlayers(PacketConstants.UPDATE_DIM_PACKET_ID, message); } @Override - public void onDeleted(IOpaqueMessage message) + public void onDeleted(IDataMessage message) { sendMessageToAllPlayers(PacketConstants.DELETE_DIM_PACKET_ID, message); } @@ -51,25 +51,25 @@ public class ServerPacketHandler implements IPacketHandler private class LinkWatcher implements IUpdateWatcher { @Override - public void onCreated(IOpaqueMessage message) + public void onCreated(IDataMessage message) { sendMessageToAllPlayers(PacketConstants.CREATE_LINK_PACKET_ID, message); } @Override - public void onUpdated(IOpaqueMessage message) + public void onUpdated(IDataMessage message) { sendMessageToAllPlayers(PacketConstants.UPDATE_LINK_PACKET_ID, message); } @Override - public void onDeleted(IOpaqueMessage message) + public void onDeleted(IDataMessage message) { sendMessageToAllPlayers(PacketConstants.DELETE_LINK_PACKET_ID, message); } } - private static void sendMessageToAllPlayers(byte id, IOpaqueMessage message) + private static void sendMessageToAllPlayers(byte id, IDataMessage message) { try { diff --git a/StevenDimDoors/mod_pocketDim/core/DimLink.java b/StevenDimDoors/mod_pocketDim/core/DimLink.java index c0cf6de..a8c296b 100644 --- a/StevenDimDoors/mod_pocketDim/core/DimLink.java +++ b/StevenDimDoors/mod_pocketDim/core/DimLink.java @@ -13,7 +13,7 @@ public abstract class DimLink protected LinkTail tail; protected ArrayList children; - public DimLink(Point4D source, DimLink parent) + protected DimLink(Point4D source, DimLink parent) { this.parent = parent; this.source = source; @@ -22,7 +22,7 @@ public abstract class DimLink parent.children.add(this); } - public DimLink(Point4D source, int linkType) + protected DimLink(Point4D source, int linkType) { if (linkType < LinkTypes.ENUM_MIN || linkType > LinkTypes.ENUM_MAX) { diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index 02ba5c4..7ff3160 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -10,9 +10,10 @@ import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; +import StevenDimDoors.mod_pocketDim.messages.IDataMessage; +import StevenDimDoors.mod_pocketDim.messages.IUpdateWatcher; +import StevenDimDoors.mod_pocketDim.messages.LinkMessageBuilder; import StevenDimDoors.mod_pocketDim.util.Point4D; -import StevenDimDoors.mod_pocketDim.watcher.IOpaqueMessage; -import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; public abstract class NewDimData { @@ -106,17 +107,18 @@ public abstract class NewDimData tail = new LinkTail(linkType, null); } - public IOpaqueMessage toMessage() + public IDataMessage toMessage() { - return null; + return linkMessageBuilder.createMessage(this); } - public IOpaqueMessage toKey() + public IDataMessage toKey() { - return null; + return linkMessageBuilder.createKey(this); } } + private static LinkMessageBuilder linkMessageBuilder = new LinkMessageBuilder(); private static Random random = new Random(); private final int id; @@ -177,8 +179,8 @@ public abstract class NewDimData } } - protected abstract IOpaqueMessage toMessage(); - protected abstract IOpaqueMessage toKey(); + protected abstract IDataMessage toMessage(); + protected abstract IDataMessage toKey(); public DimLink findNearestRift(World world, int range, int x, int y, int z) { diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 92ff1e2..91f90ca 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -14,18 +14,19 @@ import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; +import StevenDimDoors.mod_pocketDim.messages.DimMessageBuilder; +import StevenDimDoors.mod_pocketDim.messages.IDataMessage; +import StevenDimDoors.mod_pocketDim.messages.IUpdateWatcher; +import StevenDimDoors.mod_pocketDim.messages.UpdateWatcherProxy; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDim.util.Point4D; -import StevenDimDoors.mod_pocketDim.watcher.IOpaqueMessage; -import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; -import StevenDimDoors.mod_pocketDim.watcher.UpdateWatcherProxy; /** * This class regulates all the operations involving the storage and manipulation of dimensions. It handles saving dim data, teleporting the player, and * creating/registering new dimensions as well as loading old dimensions on startup */ public class PocketManager -{ +{ private static class InnerDimData extends NewDimData { //This inner class allows us to instantiate NewDimData indirectly without exposing @@ -40,22 +41,21 @@ public class PocketManager } @Override - protected IOpaqueMessage toMessage() + protected IDataMessage toMessage() { - // TODO Auto-generated method stub - return null; + return dimMessageBuilder.createMessage(this); } @Override - protected IOpaqueMessage toKey() + protected IDataMessage toKey() { - // TODO Auto-generated method stub - return null; + return dimMessageBuilder.createKey(this); } } - + + private static DimMessageBuilder dimMessageBuilder = new DimMessageBuilder(); private static int OVERWORLD_DIMENSION_ID = 0; - + private static volatile boolean isLoading = false; private static volatile boolean isLoaded = false; private static volatile boolean isSaving = false; @@ -198,7 +198,7 @@ public class PocketManager System.out.println("Loading Dimensional Doors save data..."); File saveFile = new File(DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.dat"); //Missing code for converting the binary data in the file into an IOpaqueMessage - IOpaqueMessage saveData; + IDataMessage saveData; setState(saveData); System.out.println("Loaded successfully!"); } @@ -377,12 +377,12 @@ public class PocketManager return linkWatcher.unregisterReceiver(watcher); } - public static IOpaqueMessage getState() + public static IDataMessage getState() { } - public static void setState(IOpaqueMessage state) + public static void setState(IDataMessage state) { if (isLoaded) { diff --git a/StevenDimDoors/mod_pocketDim/messages/DimMessageBuilder.java b/StevenDimDoors/mod_pocketDim/messages/DimMessageBuilder.java new file mode 100644 index 0000000..cb46451 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/messages/DimMessageBuilder.java @@ -0,0 +1,116 @@ +package StevenDimDoors.mod_pocketDim.messages; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.NewDimData.InnerDimLink; +import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; +import StevenDimDoors.mod_pocketDim.util.Point4D; + +import com.google.common.collect.ImmutableList; + +public class DimMessageBuilder implements IMessageBuilder +{ + public static class DimMessage implements IDataMessage + { + //We'll use public fields here since this is a data container object and all the fields are immutable + //We will not transfer dungeon, link data, or any data on child dimensions + //As far as I can tell, the children will handle updating their parents anyway + + public final int ID; + public final boolean IsDungeon; + public final boolean IsFilled; + public final int Depth; + public final int PackDepth; + public final Integer ParentID; + public final int RootID; + public final Point4D Origin; + public final int Orientation; + + private DimMessage(NewDimData dimension) + { + ID = dimension.id(); + IsDungeon = dimension.isDungeon(); + IsFilled = dimension.isFilled(); + Depth = dimension.depth(); + PackDepth = dimension.packDepth(); + ParentID = (dimension.parent() != null) ? dimension.parent().id() : null; + RootID = dimension.root().id(); + Origin = dimension.origin(); + Orientation = dimension.orientation(); + } + + private DimMessage(DataInputStream stream) throws IOException + { + ID = stream.readInt(); + IsDungeon = stream.readBoolean(); + IsFilled = stream.readBoolean(); + Depth = stream.readInt(); + PackDepth = stream.readInt(); + ParentID = stream. + } + + @Override + public void writeToStream(DataOutputStream stream) throws IOException + { + //Write a flag indicating that this is a full message and not a key + stream.writeBoolean(true); + + } + } + + public static class DimKeyMessage implements IDataMessage + { + //We'll use public fields here since this is a data container object and all the fields are immutable + public final int ID; + + private DimKeyMessage(NewDimData dimension) + { + ID = dimension.id(); + } + + private DimKeyMessage(DataInputStream stream) throws IOException + { + ID = stream.readInt(); + } + + @Override + public void writeToStream(DataOutputStream stream) throws IOException + { + //Write a flag indicating that this is a key + stream.writeBoolean(false); + stream.writeInt(ID); + } + } + + @Override + public IDataMessage createKey(NewDimData target) + { + return new DimKeyMessage(target); + } + + @Override + public IDataMessage createMessage(NewDimData target) + { + return new DimMessage(target); + } + + @Override + public IDataMessage read(DataInputStream source) throws IOException + { + //Check whether the message is a full message or just a key + if (source.readBoolean()) + { + return new DimMessage(source); + } + else + { + return new DimKeyMessage(source); + } + } +} diff --git a/StevenDimDoors/mod_pocketDim/messages/IDataMessage.java b/StevenDimDoors/mod_pocketDim/messages/IDataMessage.java new file mode 100644 index 0000000..8ee841d --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/messages/IDataMessage.java @@ -0,0 +1,9 @@ +package StevenDimDoors.mod_pocketDim.messages; + +import java.io.DataOutputStream; +import java.io.IOException; + +public interface IDataMessage +{ + public void writeToStream(DataOutputStream stream) throws IOException; +} diff --git a/StevenDimDoors/mod_pocketDim/messages/IMessageBuilder.java b/StevenDimDoors/mod_pocketDim/messages/IMessageBuilder.java new file mode 100644 index 0000000..297f8e5 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/messages/IMessageBuilder.java @@ -0,0 +1,11 @@ +package StevenDimDoors.mod_pocketDim.messages; + +import java.io.DataInputStream; +import java.io.IOException; + +public interface IMessageBuilder +{ + public IDataMessage createKey(T target); + public IDataMessage createMessage(T target); + public IDataMessage read(DataInputStream source) throws IOException; +} diff --git a/StevenDimDoors/mod_pocketDim/messages/IUpdateWatcher.java b/StevenDimDoors/mod_pocketDim/messages/IUpdateWatcher.java new file mode 100644 index 0000000..3bc24fd --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/messages/IUpdateWatcher.java @@ -0,0 +1,8 @@ +package StevenDimDoors.mod_pocketDim.messages; + +public interface IUpdateWatcher +{ + public void onCreated(IDataMessage message); + public void onUpdated(IDataMessage message); + public void onDeleted(IDataMessage message); +} diff --git a/StevenDimDoors/mod_pocketDim/messages/LinkMessageBuilder.java b/StevenDimDoors/mod_pocketDim/messages/LinkMessageBuilder.java new file mode 100644 index 0000000..d9d21bc --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/messages/LinkMessageBuilder.java @@ -0,0 +1,134 @@ +package StevenDimDoors.mod_pocketDim.messages; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.util.Point4D; + +import com.google.common.collect.ImmutableList; + +public class LinkMessageBuilder implements IMessageBuilder +{ + public static class LinkMessage implements IDataMessage + { + //We'll use public fields here since this is a data container object and all the fields are immutable + public final Point4D Source; + public final Point4D Destination; + public final int LinkType; + public final Point4D Parent; + public final ImmutableList Children; + + private LinkMessage(DimLink link) + { + // TODO: In the case that a child's parent has been removed but the rest of the group still exists, + // this group bond will be lost to this link on the client side. Currently, that's not a problem since + // destination data and groups don't matter to the client, but it's something to think about later. + + Source = link.source(); + Destination = link.destination(); + LinkType = link.linkType(); + Parent = link.parent().source(); + ImmutableList.Builder builder = new ImmutableList.Builder(); + for (DimLink child : link.children()) + { + builder.add(child.source()); + } + Children = builder.build(); + } + + private LinkMessage(DataInputStream stream) throws IOException + { + Source = Point4D.read(stream); + Parent = Point4D.read(stream); + if (Parent == null) + { + Destination = Point4D.read(stream); + LinkType = stream.readInt(); + } + else + { + Destination = null; + LinkType = -1; + } + int childCount = stream.readInt(); + ImmutableList.Builder builder = new ImmutableList.Builder(); + for (int k = 0; k < childCount; k++) + { + builder.add(Point4D.read(stream)); + } + Children = builder.build(); + } + + @Override + public void writeToStream(DataOutputStream stream) throws IOException + { + //Write a flag indicating that this is a full message and not a key + stream.writeBoolean(true); + Point4D.write(Source, stream); + Point4D.write(Parent, stream); + //A link only has its own destination information if it has no parent to provide it + if (Parent == null) + { + Point4D.write(Destination, stream); + stream.writeInt(LinkType); + } + stream.writeInt(Children.size()); + for (Point4D child : Children) + { + Point4D.write(child, stream); + } + } + } + + public static class LinkKeyMessage implements IDataMessage + { + //We'll use public fields here since this is a data container object and all the fields are immutable + public final Point4D Source; + + private LinkKeyMessage(DimLink link) + { + Source = link.source(); + } + + private LinkKeyMessage(DataInputStream stream) throws IOException + { + Source = Point4D.read(stream); + } + + @Override + public void writeToStream(DataOutputStream stream) throws IOException + { + //Write a flag indicating that this is a key + stream.writeBoolean(false); + Point4D.write(Source, stream); + } + } + + @Override + public IDataMessage createKey(DimLink target) + { + return new LinkKeyMessage(target); + } + + @Override + public IDataMessage createMessage(DimLink target) + { + return new LinkMessage(target); + } + + @Override + public IDataMessage read(DataInputStream source) throws IOException + { + //Check whether the message is a full message or just a key + if (source.readBoolean()) + { + return new LinkMessage(source); + } + else + { + return new LinkKeyMessage(source); + } + } +} diff --git a/StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java b/StevenDimDoors/mod_pocketDim/messages/UpdateWatcherProxy.java similarity index 79% rename from StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java rename to StevenDimDoors/mod_pocketDim/messages/UpdateWatcherProxy.java index 49874f2..1326151 100644 --- a/StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java +++ b/StevenDimDoors/mod_pocketDim/messages/UpdateWatcherProxy.java @@ -1,4 +1,4 @@ -package StevenDimDoors.mod_pocketDim.watcher; +package StevenDimDoors.mod_pocketDim.messages; import java.util.ArrayList; import java.util.List; @@ -13,7 +13,7 @@ public class UpdateWatcherProxy implements IUpdateWatcher } @Override - public void onCreated(IOpaqueMessage message) + public void onCreated(IDataMessage message) { for (IUpdateWatcher receiver : watchers) { @@ -22,7 +22,7 @@ public class UpdateWatcherProxy implements IUpdateWatcher } @Override - public void onUpdated(IOpaqueMessage message) + public void onUpdated(IDataMessage message) { for (IUpdateWatcher receiver : watchers) { @@ -31,7 +31,7 @@ public class UpdateWatcherProxy implements IUpdateWatcher } @Override - public void onDeleted(IOpaqueMessage message) + public void onDeleted(IDataMessage message) { for (IUpdateWatcher receiver : watchers) { diff --git a/StevenDimDoors/mod_pocketDim/util/Point4D.java b/StevenDimDoors/mod_pocketDim/util/Point4D.java index e8c6214..08164a8 100644 --- a/StevenDimDoors/mod_pocketDim/util/Point4D.java +++ b/StevenDimDoors/mod_pocketDim/util/Point4D.java @@ -1,5 +1,9 @@ package StevenDimDoors.mod_pocketDim.util; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + public final class Point4D implements Comparable { @@ -155,4 +159,28 @@ public final class Point4D implements Comparable { return "(" + x + ", " + y + ", " + z + ", " + dimension + ")"; } + + public static void write(Point4D point, DataOutputStream stream) throws IOException + { + stream.writeBoolean(point != null); + if (point != null) + { + stream.writeInt(point.x); + stream.writeInt(point.y); + stream.writeInt(point.z); + stream.writeInt(point.dimension); + } + } + + public static Point4D read(DataInputStream stream) throws IOException + { + if (stream.readBoolean()) + { + return new Point4D( stream.readInt(), stream.readInt(), stream.readInt(), stream.readInt() ); + } + else + { + return null; + } + } } diff --git a/StevenDimDoors/mod_pocketDim/watcher/IOpaqueMessage.java b/StevenDimDoors/mod_pocketDim/watcher/IOpaqueMessage.java deleted file mode 100644 index a3add2e..0000000 --- a/StevenDimDoors/mod_pocketDim/watcher/IOpaqueMessage.java +++ /dev/null @@ -1,8 +0,0 @@ -package StevenDimDoors.mod_pocketDim.watcher; - -import java.io.DataOutputStream; - -public interface IOpaqueMessage -{ - void writeToStream(DataOutputStream stream); -} diff --git a/StevenDimDoors/mod_pocketDim/watcher/IOpaqueReader.java b/StevenDimDoors/mod_pocketDim/watcher/IOpaqueReader.java deleted file mode 100644 index 8250094..0000000 --- a/StevenDimDoors/mod_pocketDim/watcher/IOpaqueReader.java +++ /dev/null @@ -1,8 +0,0 @@ -package StevenDimDoors.mod_pocketDim.watcher; - -import com.google.common.io.ByteArrayDataInput; - -public interface IOpaqueReader -{ - IOpaqueMessage read(ByteArrayDataInput source); -} diff --git a/StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java b/StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java deleted file mode 100644 index 31f5a85..0000000 --- a/StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java +++ /dev/null @@ -1,8 +0,0 @@ -package StevenDimDoors.mod_pocketDim.watcher; - -public interface IUpdateWatcher -{ - public void onCreated(IOpaqueMessage message); - public void onUpdated(IOpaqueMessage message); - public void onDeleted(IOpaqueMessage message); -} -- 2.39.5 From 3568d223ffedcb99875ca3e739e5fbcb0ff50e3f Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 3 Sep 2013 15:33:09 -0400 Subject: [PATCH 049/544] Overhauled Server-Side Packet Handling Threw out the complicated architecture that I'd made for synchronizing server and client data perfectly. Instead, we now send just enough data to the client and the resulting code is simpler. Some of the client-side code is also done so all packet handling should be finished soon. --- .../mod_pocketDim/ConnectionHandler.java | 4 +- .../mod_pocketDim/ServerPacketHandler.java | 68 ++++---- .../mod_pocketDim/core/DimLink.java | 15 +- .../core/IDimRegistrationCallback.java | 6 + .../mod_pocketDim/core/LinkTypes.java | 2 + .../mod_pocketDim/core/NewDimData.java | 78 +++++---- .../mod_pocketDim/core/PocketManager.java | 165 ++++++++++++------ .../mod_pocketDim/helpers/Compactor.java | 83 +++++++++ .../messages/DimMessageBuilder.java | 116 ------------ .../mod_pocketDim/messages/IDataMessage.java | 9 - .../messages/IMessageBuilder.java | 11 -- .../messages/IUpdateWatcher.java | 8 - .../messages/LinkMessageBuilder.java | 134 -------------- .../messages/UpdateWatcherProxy.java | 51 ------ .../mod_pocketDim/watcher/ClientDimData.java | 37 ++++ .../mod_pocketDim/watcher/IUpdateWatcher.java | 7 + .../watcher/UpdateWatcherProxy.java | 42 +++++ 17 files changed, 377 insertions(+), 459 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/core/IDimRegistrationCallback.java create mode 100644 StevenDimDoors/mod_pocketDim/helpers/Compactor.java delete mode 100644 StevenDimDoors/mod_pocketDim/messages/DimMessageBuilder.java delete mode 100644 StevenDimDoors/mod_pocketDim/messages/IDataMessage.java delete mode 100644 StevenDimDoors/mod_pocketDim/messages/IMessageBuilder.java delete mode 100644 StevenDimDoors/mod_pocketDim/messages/IUpdateWatcher.java delete mode 100644 StevenDimDoors/mod_pocketDim/messages/LinkMessageBuilder.java delete mode 100644 StevenDimDoors/mod_pocketDim/messages/UpdateWatcherProxy.java create mode 100644 StevenDimDoors/mod_pocketDim/watcher/ClientDimData.java create mode 100644 StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java create mode 100644 StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java diff --git a/StevenDimDoors/mod_pocketDim/ConnectionHandler.java b/StevenDimDoors/mod_pocketDim/ConnectionHandler.java index 2abf8d3..07a0b77 100644 --- a/StevenDimDoors/mod_pocketDim/ConnectionHandler.java +++ b/StevenDimDoors/mod_pocketDim/ConnectionHandler.java @@ -11,7 +11,6 @@ import net.minecraft.network.packet.Packet1Login; import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.server.MinecraftServer; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.messages.IDataMessage; import cpw.mods.fml.common.network.IConnectionHandler; import cpw.mods.fml.common.network.Player; @@ -41,12 +40,11 @@ public class ConnectionHandler implements IConnectionHandler //Send information about all the registered dimensions and links to the client try { - IDataMessage message = PocketManager.getState(); Packet250CustomPayload packet = new Packet250CustomPayload(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); DataOutputStream writer = new DataOutputStream(buffer); writer.writeByte(PacketConstants.CLIENT_JOIN_PACKET_ID); - message.writeToStream(writer); + PocketManager.writePacket(writer); writer.close(); packet.channel = PacketConstants.CHANNEL_NAME; packet.data = buffer.toByteArray(); diff --git a/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java b/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java index d33c613..e8eb51a 100644 --- a/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java +++ b/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java @@ -7,8 +7,9 @@ import java.io.IOException; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.messages.IDataMessage; -import StevenDimDoors.mod_pocketDim.messages.IUpdateWatcher; +import StevenDimDoors.mod_pocketDim.util.Point4D; +import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; +import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; import cpw.mods.fml.common.network.IPacketHandler; import cpw.mods.fml.common.network.PacketDispatcher; import cpw.mods.fml.common.network.Player; @@ -22,54 +23,39 @@ public class ServerPacketHandler implements IPacketHandler } @Override - public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) - { - - } + public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) { } - private class DimWatcher implements IUpdateWatcher + private static class DimWatcher implements IUpdateWatcher { @Override - public void onCreated(IDataMessage message) + public void onCreated(ClientDimData message) { - sendMessageToAllPlayers(PacketConstants.CREATE_DIM_PACKET_ID, message); + sendDimPacket(PacketConstants.CREATE_DIM_PACKET_ID, message); } @Override - public void onUpdated(IDataMessage message) + public void onDeleted(ClientDimData message) { - sendMessageToAllPlayers(PacketConstants.UPDATE_DIM_PACKET_ID, message); - } - - @Override - public void onDeleted(IDataMessage message) - { - sendMessageToAllPlayers(PacketConstants.DELETE_DIM_PACKET_ID, message); + sendDimPacket(PacketConstants.DELETE_DIM_PACKET_ID, message); } } - private class LinkWatcher implements IUpdateWatcher + private static class LinkWatcher implements IUpdateWatcher { @Override - public void onCreated(IDataMessage message) + public void onCreated(Point4D message) { - sendMessageToAllPlayers(PacketConstants.CREATE_LINK_PACKET_ID, message); + sendLinkPacket(PacketConstants.CREATE_LINK_PACKET_ID, message); } @Override - public void onUpdated(IDataMessage message) + public void onDeleted(Point4D message) { - sendMessageToAllPlayers(PacketConstants.UPDATE_LINK_PACKET_ID, message); - } - - @Override - public void onDeleted(IDataMessage message) - { - sendMessageToAllPlayers(PacketConstants.DELETE_LINK_PACKET_ID, message); + sendLinkPacket(PacketConstants.DELETE_LINK_PACKET_ID, message); } } - private static void sendMessageToAllPlayers(byte id, IDataMessage message) + private static void sendDimPacket(byte id, ClientDimData data) { try { @@ -77,7 +63,29 @@ public class ServerPacketHandler implements IPacketHandler ByteArrayOutputStream buffer = new ByteArrayOutputStream(); DataOutputStream writer = new DataOutputStream(buffer); writer.writeByte(id); - message.writeToStream(writer); + data.write(writer); + writer.close(); + packet.channel = PacketConstants.CHANNEL_NAME; + packet.data = buffer.toByteArray(); + packet.length = packet.data.length; + PacketDispatcher.sendPacketToAllPlayers(packet); + } + catch (IOException e) + { + //This shouldn't happen... + e.printStackTrace(); + } + } + + private static void sendLinkPacket(byte id, Point4D data) + { + try + { + Packet250CustomPayload packet = new Packet250CustomPayload(); + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + DataOutputStream writer = new DataOutputStream(buffer); + writer.writeByte(id); + Point4D.write(data, writer); writer.close(); packet.channel = PacketConstants.CHANNEL_NAME; packet.data = buffer.toByteArray(); diff --git a/StevenDimDoors/mod_pocketDim/core/DimLink.java b/StevenDimDoors/mod_pocketDim/core/DimLink.java index a8c296b..af8c7aa 100644 --- a/StevenDimDoors/mod_pocketDim/core/DimLink.java +++ b/StevenDimDoors/mod_pocketDim/core/DimLink.java @@ -1,30 +1,29 @@ package StevenDimDoors.mod_pocketDim.core; -import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; import StevenDimDoors.mod_pocketDim.util.Point4D; public abstract class DimLink -{ - private static final int EXPECTED_CHILDREN = 2; - +{ protected Point4D source; protected DimLink parent; protected LinkTail tail; - protected ArrayList children; + protected List children; protected DimLink(Point4D source, DimLink parent) { this.parent = parent; this.source = source; this.tail = parent.tail; - this.children = new ArrayList(EXPECTED_CHILDREN); + this.children = new LinkedList(); parent.children.add(this); } protected DimLink(Point4D source, int linkType) { - if (linkType < LinkTypes.ENUM_MIN || linkType > LinkTypes.ENUM_MAX) + if (linkType < LinkTypes.ENUM_MIN || linkType > LinkTypes.ENUM_MAX && linkType != LinkTypes.UNKNOWN) { throw new IllegalArgumentException("The specified link type is invalid."); } @@ -32,7 +31,7 @@ public abstract class DimLink this.parent = null; this.source = source; this.tail = new LinkTail(linkType, null); - this.children = new ArrayList(EXPECTED_CHILDREN); + this.children = new LinkedList(); } public Point4D source() diff --git a/StevenDimDoors/mod_pocketDim/core/IDimRegistrationCallback.java b/StevenDimDoors/mod_pocketDim/core/IDimRegistrationCallback.java new file mode 100644 index 0000000..04a0c38 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/core/IDimRegistrationCallback.java @@ -0,0 +1,6 @@ +package StevenDimDoors.mod_pocketDim.core; + +public interface IDimRegistrationCallback +{ + public NewDimData registerDimension(int dimensionID, int rootID); +} diff --git a/StevenDimDoors/mod_pocketDim/core/LinkTypes.java b/StevenDimDoors/mod_pocketDim/core/LinkTypes.java index b493e6c..f5fe139 100644 --- a/StevenDimDoors/mod_pocketDim/core/LinkTypes.java +++ b/StevenDimDoors/mod_pocketDim/core/LinkTypes.java @@ -7,6 +7,8 @@ public class LinkTypes public static final int ENUM_MIN = 0; public static final int ENUM_MAX = 8; + public static final int UNKNOWN = -1337; + public static final int NORMAL = 0; public static final int LIMBO = 1; public static final int POCKET = 2; diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index 7ff3160..de313b9 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -10,10 +10,8 @@ import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; -import StevenDimDoors.mod_pocketDim.messages.IDataMessage; -import StevenDimDoors.mod_pocketDim.messages.IUpdateWatcher; -import StevenDimDoors.mod_pocketDim.messages.LinkMessageBuilder; import StevenDimDoors.mod_pocketDim.util.Point4D; +import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; public abstract class NewDimData { @@ -106,19 +104,8 @@ public abstract class NewDimData parent = null; tail = new LinkTail(linkType, null); } - - public IDataMessage toMessage() - { - return linkMessageBuilder.createMessage(this); - } - - public IDataMessage toKey() - { - return linkMessageBuilder.createKey(this); - } } - private static LinkMessageBuilder linkMessageBuilder = new LinkMessageBuilder(); private static Random random = new Random(); private final int id; @@ -134,13 +121,12 @@ public abstract class NewDimData private Point4D origin; private int orientation; private DungeonData dungeon; - private final IUpdateWatcher dimWatcher; - private final IUpdateWatcher linkWatcher; + private final IUpdateWatcher linkWatcher; protected NewDimData(int id, NewDimData parent, boolean isPocket, boolean isDungeon, - IUpdateWatcher dimWatcher, IUpdateWatcher linkWatcher) + IUpdateWatcher linkWatcher) { - //The isPocket flag is redundant. It's meant as an integrity safeguard. + // The isPocket flag is redundant. It's meant as an integrity safeguard. if (isPocket == (parent != null)) { throw new NullPointerException("Dimensions can be pocket dimensions if and only if they have a parent dimension."); @@ -161,7 +147,6 @@ public abstract class NewDimData this.orientation = 0; this.origin = null; this.dungeon = null; - this.dimWatcher = dimWatcher; this.linkWatcher = linkWatcher; //Register with parent @@ -179,8 +164,32 @@ public abstract class NewDimData } } - protected abstract IDataMessage toMessage(); - protected abstract IDataMessage toKey(); + protected NewDimData(int id, NewDimData root) + { + // This constructor is meant for client-side code only + this.id = id; + this.linkMapping = new TreeMap(); //Should be stored in oct tree -- temporary solution + this.linkList = new ArrayList(); //Should be stored in oct tree -- temporary solution + this.children = new ArrayList(); + this.parent = null; + this.packDepth = 0; + this.isDungeon = false; + this.isFilled = false; + this.orientation = 0; + this.origin = null; + this.dungeon = null; + this.linkWatcher = null; + this.depth = 0; + if (root != null) + { + this.root = root; + } + else + { + this.root = this; + } + + } public DimLink findNearestRift(World world, int range, int x, int y, int z) { @@ -251,7 +260,7 @@ public abstract class NewDimData link.overwrite(linkType); } //Link created! - linkWatcher.onCreated(link.toMessage()); + linkWatcher.onCreated(link.source); return link; } @@ -278,14 +287,14 @@ public abstract class NewDimData linkList.add(link); //Link created! - linkWatcher.onCreated(link.toMessage()); + linkWatcher.onCreated(link.source); } else { if (link.overwrite(parent)) { //Link created! - linkWatcher.onCreated(link.toMessage()); + linkWatcher.onCreated(link.source); } } return link; @@ -302,7 +311,7 @@ public abstract class NewDimData { linkList.remove(target); //Raise deletion event - linkWatcher.onDeleted(target.toKey()); + linkWatcher.onDeleted(target.source); target.clear(); } return (target != null); @@ -316,7 +325,7 @@ public abstract class NewDimData { linkList.remove(target); //Raise deletion event - linkWatcher.onDeleted(target.toKey()); + linkWatcher.onDeleted(target.source); target.clear(); } return (target != null); @@ -345,7 +354,7 @@ public abstract class NewDimData public boolean isPocketDimension() { - return (parent != null); + return (root != this); } public boolean isDungeon() @@ -361,8 +370,6 @@ public abstract class NewDimData public void setFilled(boolean isFilled) { this.isFilled = isFilled; - //Raise the dim update event - dimWatcher.onUpdated(this.toMessage()); } public int id() @@ -412,7 +419,7 @@ public abstract class NewDimData public int linkCount() { - return linkMapping.size(); + return linkList.size(); } public Iterable children() @@ -420,6 +427,11 @@ public abstract class NewDimData return children; } + public Iterable links() + { + return linkList; + } + public void initializeDungeon(int originX, int originY, int originZ, int orientation, DimLink incoming, DungeonData dungeon) { if (!isDungeon) @@ -436,8 +448,6 @@ public abstract class NewDimData this.orientation = orientation; this.dungeon = dungeon; this.packDepth = calculatePackDepth(parent, dungeon); - //Raise the dim update event - dimWatcher.onUpdated(this.toMessage()); } private static int calculatePackDepth(NewDimData parent, DungeonData current) @@ -486,16 +496,12 @@ public abstract class NewDimData setDestination(incoming, originX, originY, originZ); this.origin = incoming.destination(); this.orientation = orientation; - //Raise the dim update event - dimWatcher.onUpdated(this.toMessage()); } public void setDestination(DimLink incoming, int x, int y, int z) { InnerDimLink link = (InnerDimLink) incoming; link.setDestination(x, y, z, this); - //Raise update event - linkWatcher.onUpdated(link.toMessage()); } public DimLink getRandomLink() diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 91f90ca..fc1f854 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -1,9 +1,8 @@ package StevenDimDoors.mod_pocketDim.core; +import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; @@ -13,13 +12,13 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.helpers.Compactor; import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; -import StevenDimDoors.mod_pocketDim.messages.DimMessageBuilder; -import StevenDimDoors.mod_pocketDim.messages.IDataMessage; -import StevenDimDoors.mod_pocketDim.messages.IUpdateWatcher; -import StevenDimDoors.mod_pocketDim.messages.UpdateWatcherProxy; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDim.util.Point4D; +import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; +import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; +import StevenDimDoors.mod_pocketDim.watcher.UpdateWatcherProxy; /** * This class regulates all the operations involving the storage and manipulation of dimensions. It handles saving dim data, teleporting the player, and @@ -29,41 +28,40 @@ public class PocketManager { private static class InnerDimData extends NewDimData { - //This inner class allows us to instantiate NewDimData indirectly without exposing - //a public constructor from NewDimData. It's meant to stop us from constructing instances - //of NewDimData without using PocketManager's functions. In turn, that enforces that any - //link destinations must be real dimensions controlled by PocketManager. + // This class allows us to instantiate NewDimData indirectly without exposing + // a public constructor from NewDimData. It's meant to stop us from constructing + // instances of NewDimData going through PocketManager. In turn, that enforces + // that any link destinations must be real dimensions controlled by PocketManager. - public InnerDimData(int id, NewDimData parent, boolean isPocket, boolean isDungeon, - IUpdateWatcher dimWatcher, IUpdateWatcher linkWatcher) + public InnerDimData(int id, InnerDimData parent, boolean isPocket, boolean isDungeon, + IUpdateWatcher linkWatcher) { - super(id, parent, isPocket, isDungeon, dimWatcher, linkWatcher); + super(id, parent, isPocket, isDungeon, linkWatcher); } - - @Override - protected IDataMessage toMessage() + + public InnerDimData(int id, InnerDimData root) { - return dimMessageBuilder.createMessage(this); + // This constructor is meant for client-side code only + super(id, root); } - - @Override - protected IDataMessage toKey() + + public InnerDimData(int id) { - return dimMessageBuilder.createKey(this); + // This constructor is meant for client-side code only + super(id, null); } } - private static DimMessageBuilder dimMessageBuilder = new DimMessageBuilder(); private static int OVERWORLD_DIMENSION_ID = 0; private static volatile boolean isLoading = false; private static volatile boolean isLoaded = false; private static volatile boolean isSaving = false; - private static UpdateWatcherProxy linkWatcher = null; - private static UpdateWatcherProxy dimWatcher = null; + private static UpdateWatcherProxy linkWatcher = null; + private static UpdateWatcherProxy dimWatcher = null; //HashMap that maps all the dimension IDs registered with DimDoors to their DD data. - private static HashMap dimensionData = new HashMap(); + private static HashMap dimensionData = null; public static boolean isLoaded() { @@ -87,16 +85,17 @@ public class PocketManager isLoading = true; - //Set up watcher proxies - dimWatcher = new UpdateWatcherProxy(); - linkWatcher = new UpdateWatcherProxy(); - - loadInternal(); + //Set up fields + dimensionData = new HashMap(); + dimWatcher = new UpdateWatcherProxy(); + linkWatcher = new UpdateWatcherProxy(); //Register Limbo DDProperties properties = DDProperties.instance(); registerDimension(properties.LimboDimensionID, null, false, false); + loadInternal(); + //Register pocket dimensions registerPockets(properties); @@ -134,7 +133,7 @@ public class PocketManager DeleteFolder.deleteFolder(save); } //Raise the dim deleted event - dimWatcher.onDeleted(dimension.toKey()); + dimWatcher.onDeleted(new ClientDimData(dimension)); //dimension.implode()??? -- more like delete, but yeah return true; } @@ -184,9 +183,7 @@ public class PocketManager /** * loads the dim data from the saved hashMap. Also handles compatibility with old saves, see OldSaveHandler - * @return */ - @SuppressWarnings("unchecked") private static void loadInternal() { // SenseiKiwi: This is a temporary function for testing purposes. @@ -196,10 +193,9 @@ public class PocketManager DimensionManager.getCurrentSaveRootDirectory() != null) { System.out.println("Loading Dimensional Doors save data..."); - File saveFile = new File(DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.dat"); - //Missing code for converting the binary data in the file into an IOpaqueMessage - IDataMessage saveData; - setState(saveData); + /*File saveFile = new File(DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.dat"); + + setState(saveData);*/ System.out.println("Loaded successfully!"); } } @@ -228,7 +224,7 @@ public class PocketManager try { System.out.println("Writing Dimensional Doors save data..."); - String tempPath = DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.tmp"; + /*String tempPath = DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.tmp"; String savePath = DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.dat"; File tempFile = new File(tempPath); File saveFile = new File(savePath); @@ -236,17 +232,17 @@ public class PocketManager getState().writeToStream(writer); writer.close(); saveFile.delete(); - tempFile.renameTo(saveFile); + tempFile.renameTo(saveFile);*/ System.out.println("Saved successfully!"); } - catch (FileNotFoundException e) + /*catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); - } + }*/ finally { isSaving = false; @@ -291,17 +287,17 @@ public class PocketManager DDProperties properties = DDProperties.instance(); int dimensionID = DimensionManager.getNextFreeDimId(); DimensionManager.registerDimension(dimensionID, properties.PocketProviderID); - return registerDimension(dimensionID, parent, true, isDungeon); + return registerDimension(dimensionID, (InnerDimData) parent, true, isDungeon); } - private static NewDimData registerDimension(int dimensionID, NewDimData parent, boolean isPocket, boolean isDungeon) + private static NewDimData registerDimension(int dimensionID, InnerDimData parent, boolean isPocket, boolean isDungeon) { if (dimensionData.containsKey(dimensionID)) { throw new IllegalArgumentException("Cannot register a dimension with ID = " + dimensionID + " because it has already been registered."); } - NewDimData dimension = new InnerDimData(dimensionID, parent, isPocket, isDungeon, dimWatcher, linkWatcher); + InnerDimData dimension = new InnerDimData(dimensionID, parent, isPocket, isDungeon, linkWatcher); dimensionData.put(dimensionID, dimension); return dimension; } @@ -330,14 +326,18 @@ public class PocketManager public static void unload() { save(); + dimWatcher = null; + linkWatcher = null; + dimensionData = null; unregisterPockets(); - dimensionData.clear(); } + /* + * This isn't needed right now and it's causing me problems due to the iterator's generic type -_- public static Iterable getDimensions() { return dimensionData.values(); - } + }*/ public static DimLink getLink(int x, int y, int z, World world) { @@ -357,37 +357,96 @@ public class PocketManager } } - public static void registerDimWatcher(IUpdateWatcher watcher) + public static void registerDimWatcher(IUpdateWatcher watcher) { dimWatcher.registerReceiver(watcher); } - public static boolean unregisterDimWatcher(IUpdateWatcher watcher) + public static boolean unregisterDimWatcher(IUpdateWatcher watcher) { return dimWatcher.unregisterReceiver(watcher); } - public static void registerLinkWatcher(IUpdateWatcher watcher) + public static void registerLinkWatcher(IUpdateWatcher watcher) { linkWatcher.registerReceiver(watcher); } - public static boolean unregisterLinkWatcher(IUpdateWatcher watcher) + public static boolean unregisterLinkWatcher(IUpdateWatcher watcher) { return linkWatcher.unregisterReceiver(watcher); } - public static IDataMessage getState() + public static void writePacket(DataOutputStream output) throws IOException { - + // Write a very compact description of our dimensions and links to be sent to a client + Compactor.write(dimensionData.values(), output); } - public static void setState(IDataMessage state) + public static void readPacket(DataInputStream input) throws IOException { if (isLoaded) { throw new IllegalStateException("Pocket dimensions have already been loaded!"); } + if (isLoading) + { + throw new IllegalStateException("Pocket dimensions are already loading!"); + } + + isLoading = true; + // Set up fields + dimensionData = new HashMap(); + dimWatcher = new UpdateWatcherProxy(); + linkWatcher = new UpdateWatcherProxy(); + + // Load compacted client-side dimension data + Compactor.readDimensions(input, new DimRegistrationCallback()); + + // Register pocket dimensions + DDProperties properties = DDProperties.instance(); + registerPockets(properties); + + isLoaded = true; + isLoading = false; + } + + private static class DimRegistrationCallback implements IDimRegistrationCallback + { + // We use this class to provide Compactor with the ability to send us dim data without + // having to instantiate a bunch of data containers and without exposing an "unsafe" + // creation method for anyone to call. Integrity protection for the win! It's like + // exposing a private constructor ONLY to a very specific trusted class. + + @Override + public NewDimData registerDimension(int dimensionID, int rootID) + { + // No need to raise events here since this code should only run on the client side + // We assume that the root dimension has already been registered to avoid dependency issues + + InnerDimData root = dimensionData.get(rootID); + InnerDimData dimension; + + if (rootID != dimensionID) + { + dimension = dimensionData.get(dimensionID); + if (dimension == null) + { + dimension = new InnerDimData(dimensionID, root); + dimensionData.put(dimension.id(), dimension); + } + } + else + { + if (root == null) + { + root = new InnerDimData(rootID); + dimensionData.put(root.id(), root); + } + dimension = root; + } + return dimension; + } } } diff --git a/StevenDimDoors/mod_pocketDim/helpers/Compactor.java b/StevenDimDoors/mod_pocketDim/helpers/Compactor.java new file mode 100644 index 0000000..6d5f5d5 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/helpers/Compactor.java @@ -0,0 +1,83 @@ +package StevenDimDoors.mod_pocketDim.helpers; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashSet; + +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.IDimRegistrationCallback; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.util.Point4D; + +public class Compactor +{ + + private static class DimComparator implements Comparator + { + @Override + public int compare(NewDimData a, NewDimData b) + { + return a.id() - b.id(); + } + } + + public static void write(Collection values, DataOutputStream output) throws IOException + { + // SenseiKiwi: Just encode the data straight up for now. I'll implement fancier compression later. + output.writeInt(values.size()); + for (NewDimData dimension : values) + { + output.writeInt(dimension.id()); + output.writeInt(dimension.root().id()); + output.writeInt(dimension.linkCount()); + for (DimLink link : dimension.links()) + { + Point4D.write(link.source(), output); + } + } + + + // Note to self: the root ID can be "compressed" by grouping + // dimensions by their root ID and then only sending it once + + /* + // To compress the dimension IDs, we'll sort them by ID + // and write the _difference_ between their ID numbers. + NewDimData[] dimensions = new NewDimData[values.size()]; + dimensions = values.toArray(dimensions); + Arrays.sort(dimensions, new DimComparator()); + */ + } + + public static void readDimensions(DataInputStream input, IDimRegistrationCallback callback) throws IOException + { + // Read in the dimensions one by one. Make sure we register root dimensions before + // attempting to register the dimensions under them. + + HashSet rootIDs = new HashSet(); + + int dimCount = input.readInt(); + for (int k = 0; k < dimCount; k++) + { + int id = input.readInt(); + int rootID = input.readInt(); + + if (rootIDs.add(rootID)) + { + callback.registerDimension(rootID, rootID); + } + // Don't check if (id != rootID) - we want to retrieve the reference anyway + NewDimData dimension = callback.registerDimension(id, rootID); + int linkCount = input.readInt(); + for (int h = 0; h < linkCount; h++) + { + Point4D source = Point4D.read(input); + dimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.UNKNOWN); + } + } + } +} diff --git a/StevenDimDoors/mod_pocketDim/messages/DimMessageBuilder.java b/StevenDimDoors/mod_pocketDim/messages/DimMessageBuilder.java deleted file mode 100644 index cb46451..0000000 --- a/StevenDimDoors/mod_pocketDim/messages/DimMessageBuilder.java +++ /dev/null @@ -1,116 +0,0 @@ -package StevenDimDoors.mod_pocketDim.messages; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import StevenDimDoors.mod_pocketDim.core.DimLink; -import StevenDimDoors.mod_pocketDim.core.NewDimData; -import StevenDimDoors.mod_pocketDim.core.NewDimData.InnerDimLink; -import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; -import StevenDimDoors.mod_pocketDim.util.Point4D; - -import com.google.common.collect.ImmutableList; - -public class DimMessageBuilder implements IMessageBuilder -{ - public static class DimMessage implements IDataMessage - { - //We'll use public fields here since this is a data container object and all the fields are immutable - //We will not transfer dungeon, link data, or any data on child dimensions - //As far as I can tell, the children will handle updating their parents anyway - - public final int ID; - public final boolean IsDungeon; - public final boolean IsFilled; - public final int Depth; - public final int PackDepth; - public final Integer ParentID; - public final int RootID; - public final Point4D Origin; - public final int Orientation; - - private DimMessage(NewDimData dimension) - { - ID = dimension.id(); - IsDungeon = dimension.isDungeon(); - IsFilled = dimension.isFilled(); - Depth = dimension.depth(); - PackDepth = dimension.packDepth(); - ParentID = (dimension.parent() != null) ? dimension.parent().id() : null; - RootID = dimension.root().id(); - Origin = dimension.origin(); - Orientation = dimension.orientation(); - } - - private DimMessage(DataInputStream stream) throws IOException - { - ID = stream.readInt(); - IsDungeon = stream.readBoolean(); - IsFilled = stream.readBoolean(); - Depth = stream.readInt(); - PackDepth = stream.readInt(); - ParentID = stream. - } - - @Override - public void writeToStream(DataOutputStream stream) throws IOException - { - //Write a flag indicating that this is a full message and not a key - stream.writeBoolean(true); - - } - } - - public static class DimKeyMessage implements IDataMessage - { - //We'll use public fields here since this is a data container object and all the fields are immutable - public final int ID; - - private DimKeyMessage(NewDimData dimension) - { - ID = dimension.id(); - } - - private DimKeyMessage(DataInputStream stream) throws IOException - { - ID = stream.readInt(); - } - - @Override - public void writeToStream(DataOutputStream stream) throws IOException - { - //Write a flag indicating that this is a key - stream.writeBoolean(false); - stream.writeInt(ID); - } - } - - @Override - public IDataMessage createKey(NewDimData target) - { - return new DimKeyMessage(target); - } - - @Override - public IDataMessage createMessage(NewDimData target) - { - return new DimMessage(target); - } - - @Override - public IDataMessage read(DataInputStream source) throws IOException - { - //Check whether the message is a full message or just a key - if (source.readBoolean()) - { - return new DimMessage(source); - } - else - { - return new DimKeyMessage(source); - } - } -} diff --git a/StevenDimDoors/mod_pocketDim/messages/IDataMessage.java b/StevenDimDoors/mod_pocketDim/messages/IDataMessage.java deleted file mode 100644 index 8ee841d..0000000 --- a/StevenDimDoors/mod_pocketDim/messages/IDataMessage.java +++ /dev/null @@ -1,9 +0,0 @@ -package StevenDimDoors.mod_pocketDim.messages; - -import java.io.DataOutputStream; -import java.io.IOException; - -public interface IDataMessage -{ - public void writeToStream(DataOutputStream stream) throws IOException; -} diff --git a/StevenDimDoors/mod_pocketDim/messages/IMessageBuilder.java b/StevenDimDoors/mod_pocketDim/messages/IMessageBuilder.java deleted file mode 100644 index 297f8e5..0000000 --- a/StevenDimDoors/mod_pocketDim/messages/IMessageBuilder.java +++ /dev/null @@ -1,11 +0,0 @@ -package StevenDimDoors.mod_pocketDim.messages; - -import java.io.DataInputStream; -import java.io.IOException; - -public interface IMessageBuilder -{ - public IDataMessage createKey(T target); - public IDataMessage createMessage(T target); - public IDataMessage read(DataInputStream source) throws IOException; -} diff --git a/StevenDimDoors/mod_pocketDim/messages/IUpdateWatcher.java b/StevenDimDoors/mod_pocketDim/messages/IUpdateWatcher.java deleted file mode 100644 index 3bc24fd..0000000 --- a/StevenDimDoors/mod_pocketDim/messages/IUpdateWatcher.java +++ /dev/null @@ -1,8 +0,0 @@ -package StevenDimDoors.mod_pocketDim.messages; - -public interface IUpdateWatcher -{ - public void onCreated(IDataMessage message); - public void onUpdated(IDataMessage message); - public void onDeleted(IDataMessage message); -} diff --git a/StevenDimDoors/mod_pocketDim/messages/LinkMessageBuilder.java b/StevenDimDoors/mod_pocketDim/messages/LinkMessageBuilder.java deleted file mode 100644 index d9d21bc..0000000 --- a/StevenDimDoors/mod_pocketDim/messages/LinkMessageBuilder.java +++ /dev/null @@ -1,134 +0,0 @@ -package StevenDimDoors.mod_pocketDim.messages; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; - -import StevenDimDoors.mod_pocketDim.core.DimLink; -import StevenDimDoors.mod_pocketDim.util.Point4D; - -import com.google.common.collect.ImmutableList; - -public class LinkMessageBuilder implements IMessageBuilder -{ - public static class LinkMessage implements IDataMessage - { - //We'll use public fields here since this is a data container object and all the fields are immutable - public final Point4D Source; - public final Point4D Destination; - public final int LinkType; - public final Point4D Parent; - public final ImmutableList Children; - - private LinkMessage(DimLink link) - { - // TODO: In the case that a child's parent has been removed but the rest of the group still exists, - // this group bond will be lost to this link on the client side. Currently, that's not a problem since - // destination data and groups don't matter to the client, but it's something to think about later. - - Source = link.source(); - Destination = link.destination(); - LinkType = link.linkType(); - Parent = link.parent().source(); - ImmutableList.Builder builder = new ImmutableList.Builder(); - for (DimLink child : link.children()) - { - builder.add(child.source()); - } - Children = builder.build(); - } - - private LinkMessage(DataInputStream stream) throws IOException - { - Source = Point4D.read(stream); - Parent = Point4D.read(stream); - if (Parent == null) - { - Destination = Point4D.read(stream); - LinkType = stream.readInt(); - } - else - { - Destination = null; - LinkType = -1; - } - int childCount = stream.readInt(); - ImmutableList.Builder builder = new ImmutableList.Builder(); - for (int k = 0; k < childCount; k++) - { - builder.add(Point4D.read(stream)); - } - Children = builder.build(); - } - - @Override - public void writeToStream(DataOutputStream stream) throws IOException - { - //Write a flag indicating that this is a full message and not a key - stream.writeBoolean(true); - Point4D.write(Source, stream); - Point4D.write(Parent, stream); - //A link only has its own destination information if it has no parent to provide it - if (Parent == null) - { - Point4D.write(Destination, stream); - stream.writeInt(LinkType); - } - stream.writeInt(Children.size()); - for (Point4D child : Children) - { - Point4D.write(child, stream); - } - } - } - - public static class LinkKeyMessage implements IDataMessage - { - //We'll use public fields here since this is a data container object and all the fields are immutable - public final Point4D Source; - - private LinkKeyMessage(DimLink link) - { - Source = link.source(); - } - - private LinkKeyMessage(DataInputStream stream) throws IOException - { - Source = Point4D.read(stream); - } - - @Override - public void writeToStream(DataOutputStream stream) throws IOException - { - //Write a flag indicating that this is a key - stream.writeBoolean(false); - Point4D.write(Source, stream); - } - } - - @Override - public IDataMessage createKey(DimLink target) - { - return new LinkKeyMessage(target); - } - - @Override - public IDataMessage createMessage(DimLink target) - { - return new LinkMessage(target); - } - - @Override - public IDataMessage read(DataInputStream source) throws IOException - { - //Check whether the message is a full message or just a key - if (source.readBoolean()) - { - return new LinkMessage(source); - } - else - { - return new LinkKeyMessage(source); - } - } -} diff --git a/StevenDimDoors/mod_pocketDim/messages/UpdateWatcherProxy.java b/StevenDimDoors/mod_pocketDim/messages/UpdateWatcherProxy.java deleted file mode 100644 index 1326151..0000000 --- a/StevenDimDoors/mod_pocketDim/messages/UpdateWatcherProxy.java +++ /dev/null @@ -1,51 +0,0 @@ -package StevenDimDoors.mod_pocketDim.messages; - -import java.util.ArrayList; -import java.util.List; - -public class UpdateWatcherProxy implements IUpdateWatcher -{ - private List watchers; - - public UpdateWatcherProxy() - { - watchers = new ArrayList(); - } - - @Override - public void onCreated(IDataMessage message) - { - for (IUpdateWatcher receiver : watchers) - { - receiver.onCreated(message); - } - } - - @Override - public void onUpdated(IDataMessage message) - { - for (IUpdateWatcher receiver : watchers) - { - receiver.onUpdated(message); - } - } - - @Override - public void onDeleted(IDataMessage message) - { - for (IUpdateWatcher receiver : watchers) - { - receiver.onDeleted(message); - } - } - - public void registerReceiver(IUpdateWatcher receiver) - { - watchers.add(receiver); - } - - public boolean unregisterReceiver(IUpdateWatcher receiver) - { - return watchers.remove(receiver); - } -} diff --git a/StevenDimDoors/mod_pocketDim/watcher/ClientDimData.java b/StevenDimDoors/mod_pocketDim/watcher/ClientDimData.java new file mode 100644 index 0000000..7614a10 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/watcher/ClientDimData.java @@ -0,0 +1,37 @@ +package StevenDimDoors.mod_pocketDim.watcher; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import StevenDimDoors.mod_pocketDim.core.NewDimData; + +public class ClientDimData +{ + //We'll use public fields since this is just a data container and it's immutable + public final int ID; + public final int RootID; + + public ClientDimData(int id, int rootID) + { + ID = id; + RootID = rootID; + } + + public ClientDimData(NewDimData dimension) + { + ID = dimension.id(); + RootID = dimension.root().id(); + } + + public void write(DataOutputStream output) throws IOException + { + output.writeInt(ID); + output.writeInt(RootID); + } + + public static ClientDimData read(DataInputStream input) throws IOException + { + return new ClientDimData(input.readInt(), input.readInt()); + } +} diff --git a/StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java b/StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java new file mode 100644 index 0000000..eb8f920 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java @@ -0,0 +1,7 @@ +package StevenDimDoors.mod_pocketDim.watcher; + +public interface IUpdateWatcher +{ + public void onCreated(T message); + public void onDeleted(T message); +} diff --git a/StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java b/StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java new file mode 100644 index 0000000..e105476 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java @@ -0,0 +1,42 @@ +package StevenDimDoors.mod_pocketDim.watcher; + +import java.util.ArrayList; +import java.util.List; + +public class UpdateWatcherProxy implements IUpdateWatcher +{ + private List> watchers; + + public UpdateWatcherProxy() + { + watchers = new ArrayList>(); + } + + @Override + public void onCreated(T message) + { + for (IUpdateWatcher receiver : watchers) + { + receiver.onCreated(message); + } + } + + @Override + public void onDeleted(T message) + { + for (IUpdateWatcher receiver : watchers) + { + receiver.onDeleted(message); + } + } + + public void registerReceiver(IUpdateWatcher receiver) + { + watchers.add(receiver); + } + + public boolean unregisterReceiver(IUpdateWatcher receiver) + { + return watchers.remove(receiver); + } +} -- 2.39.5 From 4cd7d3c0ae334122d4ad6a9b77dbe65ca1c68b59 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 3 Sep 2013 17:25:58 -0400 Subject: [PATCH 050/544] Completed Packet Handling Code Finished implementing all the packet handling code. It could be improved in the future to compress the initial packet sent to clients. With this, the code is complete enough to run! Commands have not been fixed yet but that will come in the future. --- .../mod_pocketDim/PacketConstants.java | 11 +- .../mod_pocketDim/core/DimLink.java | 2 +- .../mod_pocketDim/core/LinkTypes.java | 2 +- .../mod_pocketDim/core/NewDimData.java | 15 +-- .../mod_pocketDim/core/PocketManager.java | 125 ++++++++++++------ .../mod_pocketDim/helpers/Compactor.java | 2 +- .../mod_pocketDim/mod_pocketDim.java | 2 +- .../ticking/RiftRegenerator.java | 8 +- .../mod_pocketDim/watcher/IUpdateSource.java | 8 ++ .../ClientPacketHandler.java | 59 ++++++++- 10 files changed, 162 insertions(+), 72 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/watcher/IUpdateSource.java diff --git a/StevenDimDoors/mod_pocketDim/PacketConstants.java b/StevenDimDoors/mod_pocketDim/PacketConstants.java index 67d4e60..847a5b0 100644 --- a/StevenDimDoors/mod_pocketDim/PacketConstants.java +++ b/StevenDimDoors/mod_pocketDim/PacketConstants.java @@ -3,13 +3,12 @@ package StevenDimDoors.mod_pocketDim; public class PacketConstants { private PacketConstants() { } + + public static final String CHANNEL_NAME = "DimDoorsPackets"; public static final byte CLIENT_JOIN_PACKET_ID = 1; public static final byte CREATE_DIM_PACKET_ID = 2; - public static final byte UPDATE_DIM_PACKET_ID = 3; - public static final byte DELETE_DIM_PACKET_ID = 4; - public static final byte CREATE_LINK_PACKET_ID = 5; - public static final byte UPDATE_LINK_PACKET_ID = 6; - public static final byte DELETE_LINK_PACKET_ID = 7; - public static final String CHANNEL_NAME = "DimDoorsPackets"; + public static final byte DELETE_DIM_PACKET_ID = 3; + public static final byte CREATE_LINK_PACKET_ID = 4; + public static final byte DELETE_LINK_PACKET_ID = 5; } diff --git a/StevenDimDoors/mod_pocketDim/core/DimLink.java b/StevenDimDoors/mod_pocketDim/core/DimLink.java index af8c7aa..cdf25a6 100644 --- a/StevenDimDoors/mod_pocketDim/core/DimLink.java +++ b/StevenDimDoors/mod_pocketDim/core/DimLink.java @@ -23,7 +23,7 @@ public abstract class DimLink protected DimLink(Point4D source, int linkType) { - if (linkType < LinkTypes.ENUM_MIN || linkType > LinkTypes.ENUM_MAX && linkType != LinkTypes.UNKNOWN) + if (linkType < LinkTypes.ENUM_MIN || linkType > LinkTypes.ENUM_MAX && linkType != LinkTypes.CLIENT_SIDE) { throw new IllegalArgumentException("The specified link type is invalid."); } diff --git a/StevenDimDoors/mod_pocketDim/core/LinkTypes.java b/StevenDimDoors/mod_pocketDim/core/LinkTypes.java index f5fe139..5e64aff 100644 --- a/StevenDimDoors/mod_pocketDim/core/LinkTypes.java +++ b/StevenDimDoors/mod_pocketDim/core/LinkTypes.java @@ -7,7 +7,7 @@ public class LinkTypes public static final int ENUM_MIN = 0; public static final int ENUM_MAX = 8; - public static final int UNKNOWN = -1337; + public static final int CLIENT_SIDE = -1337; public static final int NORMAL = 0; public static final int LIMBO = 1; diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index de313b9..0be6468 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -167,6 +167,11 @@ public abstract class NewDimData protected NewDimData(int id, NewDimData root) { // This constructor is meant for client-side code only + if (root == null) + { + throw new IllegalArgumentException("root cannot be null."); + } + this.id = id; this.linkMapping = new TreeMap(); //Should be stored in oct tree -- temporary solution this.linkList = new ArrayList(); //Should be stored in oct tree -- temporary solution @@ -180,15 +185,7 @@ public abstract class NewDimData this.dungeon = null; this.linkWatcher = null; this.depth = 0; - if (root != null) - { - this.root = root; - } - else - { - this.root = this; - } - + this.root = root; } public DimLink findNearestRift(World world, int range, int x, int y, int z) diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index fc1f854..d590930 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -17,6 +17,7 @@ import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; +import StevenDimDoors.mod_pocketDim.watcher.IUpdateSource; import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; import StevenDimDoors.mod_pocketDim.watcher.UpdateWatcherProxy; @@ -44,14 +45,54 @@ public class PocketManager // This constructor is meant for client-side code only super(id, root); } - - public InnerDimData(int id) + } + + private static class ClientLinkWatcher implements IUpdateWatcher + { + @Override + public void onCreated(Point4D source) { - // This constructor is meant for client-side code only - super(id, null); + NewDimData dimension = getDimensionData(source.getDimension()); + dimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.CLIENT_SIDE); + } + + @Override + public void onDeleted(Point4D source) + { + NewDimData dimension = getDimensionData(source.getDimension()); + dimension.deleteLink(source.getX(), source.getY(), source.getZ()); + } + } + + private static class ClientDimWatcher implements IUpdateWatcher + { + @Override + public void onCreated(ClientDimData data) + { + registerClientDimension(data.ID, data.RootID); + } + + @Override + public void onDeleted(ClientDimData data) + { + deletePocket(getDimensionData(data.ID), false); } } + private static class DimRegistrationCallback implements IDimRegistrationCallback + { + // We use this class to provide Compactor with the ability to send us dim data without + // having to instantiate a bunch of data containers and without exposing an "unsafe" + // creation method for anyone to call. Integrity protection for the win! It's like + // exposing a private constructor ONLY to a very specific trusted class. + + @Override + public NewDimData registerDimension(int dimensionID, int rootID) + { + return registerClientDimension(dimensionID, rootID); + } + } + private static int OVERWORLD_DIMENSION_ID = 0; private static volatile boolean isLoading = false; @@ -301,6 +342,30 @@ public class PocketManager dimensionData.put(dimensionID, dimension); return dimension; } + + private static NewDimData registerClientDimension(int dimensionID, int rootID) + { + // No need to raise events here since this code should only run on the client side + // getDimensionData() always handles root dimensions properly, even if the weren't defined before + + InnerDimData root = (InnerDimData) getDimensionData(rootID); + InnerDimData dimension; + + if (rootID != dimensionID) + { + dimension = dimensionData.get(dimensionID); + if (dimension == null) + { + dimension = new InnerDimData(dimensionID, root); + dimensionData.put(dimension.id(), dimension); + } + } + else + { + dimension = root; + } + return dimension; + } public static NewDimData getDimensionData(World world) { @@ -323,6 +388,11 @@ public class PocketManager return dimension; } + public static Iterable getDimensions() + { + return dimensionData.values(); + } + public static void unload() { save(); @@ -376,6 +446,11 @@ public class PocketManager { return linkWatcher.unregisterReceiver(watcher); } + + public static void getWatchers(IUpdateSource updateSource) + { + updateSource.registerWatchers(new ClientDimWatcher(), new ClientLinkWatcher()); + } public static void writePacket(DataOutputStream output) throws IOException { @@ -398,8 +473,8 @@ public class PocketManager // Set up fields dimensionData = new HashMap(); - dimWatcher = new UpdateWatcherProxy(); - linkWatcher = new UpdateWatcherProxy(); + dimWatcher = null; // Clients shouldn't need to watch dims + linkWatcher = null; // Clients shouldn't need to watch links // Load compacted client-side dimension data Compactor.readDimensions(input, new DimRegistrationCallback()); @@ -411,42 +486,4 @@ public class PocketManager isLoaded = true; isLoading = false; } - - private static class DimRegistrationCallback implements IDimRegistrationCallback - { - // We use this class to provide Compactor with the ability to send us dim data without - // having to instantiate a bunch of data containers and without exposing an "unsafe" - // creation method for anyone to call. Integrity protection for the win! It's like - // exposing a private constructor ONLY to a very specific trusted class. - - @Override - public NewDimData registerDimension(int dimensionID, int rootID) - { - // No need to raise events here since this code should only run on the client side - // We assume that the root dimension has already been registered to avoid dependency issues - - InnerDimData root = dimensionData.get(rootID); - InnerDimData dimension; - - if (rootID != dimensionID) - { - dimension = dimensionData.get(dimensionID); - if (dimension == null) - { - dimension = new InnerDimData(dimensionID, root); - dimensionData.put(dimension.id(), dimension); - } - } - else - { - if (root == null) - { - root = new InnerDimData(rootID); - dimensionData.put(root.id(), root); - } - dimension = root; - } - return dimension; - } - } } diff --git a/StevenDimDoors/mod_pocketDim/helpers/Compactor.java b/StevenDimDoors/mod_pocketDim/helpers/Compactor.java index 6d5f5d5..e13d902 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/Compactor.java +++ b/StevenDimDoors/mod_pocketDim/helpers/Compactor.java @@ -76,7 +76,7 @@ public class Compactor for (int h = 0; h < linkCount; h++) { Point4D source = Point4D.read(input); - dimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.UNKNOWN); + dimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.CLIENT_SIDE); } } } diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index cde2099..c7cd467 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -164,7 +164,7 @@ public class mod_pocketDim //MonolithSpawner should be initialized before any provider instances are created //Register the other regular tick receivers as well spawner = new MonolithSpawner(commonTickHandler, properties); - new RiftRegenerator(commonTickHandler, properties); //No need to store the reference + new RiftRegenerator(commonTickHandler); //No need to store the reference LimboDecay decay = new LimboDecay(commonTickHandler, properties); transientDoor = (new TransientDoor(properties.TransientDoorID, Material.iron)).setHardness(1.0F) .setUnlocalizedName("transientDoor"); diff --git a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java index 4c82dc1..114fa35 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java +++ b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java @@ -7,22 +7,16 @@ import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDim.util.Point4D; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.relauncher.Side; public class RiftRegenerator implements IRegularTickReceiver { private static final int RIFT_REGENERATION_INTERVAL = 200; //Regenerate random rifts every 200 ticks private static final int RIFTS_REGENERATED_PER_DIMENSION = 5; - private DDProperties properties; - - public RiftRegenerator(IRegularTickSender sender, DDProperties properties) + public RiftRegenerator(IRegularTickSender sender) { sender.registerForTicking(this, RIFT_REGENERATION_INTERVAL, false); - this.properties = properties; } @Override diff --git a/StevenDimDoors/mod_pocketDim/watcher/IUpdateSource.java b/StevenDimDoors/mod_pocketDim/watcher/IUpdateSource.java new file mode 100644 index 0000000..98e260e --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/watcher/IUpdateSource.java @@ -0,0 +1,8 @@ +package StevenDimDoors.mod_pocketDim.watcher; + +import StevenDimDoors.mod_pocketDim.util.Point4D; + +public interface IUpdateSource +{ + public void registerWatchers(IUpdateWatcher dimWatcher, IUpdateWatcher linkWatcher); +} diff --git a/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java b/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java index 9100b78..a98f115 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java +++ b/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java @@ -1,15 +1,70 @@ package StevenDimDoors.mod_pocketDimClient; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; + import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; +import StevenDimDoors.mod_pocketDim.PacketConstants; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.util.Point4D; +import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; +import StevenDimDoors.mod_pocketDim.watcher.IUpdateSource; +import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; import cpw.mods.fml.common.network.IPacketHandler; import cpw.mods.fml.common.network.Player; -public class ClientPacketHandler implements IPacketHandler +public class ClientPacketHandler implements IPacketHandler, IUpdateSource { + private IUpdateWatcher linkWatcher; + private IUpdateWatcher dimWatcher; + + public ClientPacketHandler() + { + PocketManager.getWatchers(this); + } + + @Override + public void registerWatchers(IUpdateWatcher dimWatcher, IUpdateWatcher linkWatcher) + { + this.dimWatcher = dimWatcher; + this.linkWatcher = linkWatcher; + } + @Override public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) { - + // TODO: Is this even necessary? I'm not convinced we can receive packets from other channels anyway! + if (!packet.channel.equals(PacketConstants.CHANNEL_NAME)) + return; + + try + { + DataInputStream input = new DataInputStream(new ByteArrayInputStream(packet.data)); + byte packetID = input.readByte(); + switch (packetID) + { + case PacketConstants.CLIENT_JOIN_PACKET_ID: + PocketManager.readPacket(input); + break; + case PacketConstants.CREATE_DIM_PACKET_ID: + dimWatcher.onCreated( ClientDimData.read(input) ); + break; + case PacketConstants.CREATE_LINK_PACKET_ID: + linkWatcher.onCreated( Point4D.read(input) ); + break; + case PacketConstants.DELETE_DIM_PACKET_ID: + dimWatcher.onDeleted( ClientDimData.read(input) ); + break; + case PacketConstants.DELETE_LINK_PACKET_ID: + linkWatcher.onDeleted( Point4D.read(input) ); + break; + } + } + catch (Exception e) + { + System.err.println("An exception occurred while processing a data packet:"); + e.printStackTrace(); + } } } -- 2.39.5 From 77bc0e833f69092971f66adb6774d93de4d86aa9 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 3 Sep 2013 17:47:02 -0400 Subject: [PATCH 051/544] Fixed Bugs Fixed bugs that would cause Minecraft to crash on startup. At least I can get to the main menu now. --- .../mod_pocketDim/core/PocketManager.java | 16 +++------------- .../mod_pocketDim/dungeon/DungeonData.java | 2 +- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index d590930..b79ee2b 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -98,8 +98,8 @@ public class PocketManager private static volatile boolean isLoading = false; private static volatile boolean isLoaded = false; private static volatile boolean isSaving = false; - private static UpdateWatcherProxy linkWatcher = null; - private static UpdateWatcherProxy dimWatcher = null; + private static final UpdateWatcherProxy linkWatcher = new UpdateWatcherProxy(); + private static final UpdateWatcherProxy dimWatcher = new UpdateWatcherProxy(); //HashMap that maps all the dimension IDs registered with DimDoors to their DD data. private static HashMap dimensionData = null; @@ -125,11 +125,7 @@ public class PocketManager } isLoading = true; - - //Set up fields dimensionData = new HashMap(); - dimWatcher = new UpdateWatcherProxy(); - linkWatcher = new UpdateWatcherProxy(); //Register Limbo DDProperties properties = DDProperties.instance(); @@ -396,8 +392,6 @@ public class PocketManager public static void unload() { save(); - dimWatcher = null; - linkWatcher = null; dimensionData = null; unregisterPockets(); } @@ -470,12 +464,8 @@ public class PocketManager } isLoading = true; - - // Set up fields dimensionData = new HashMap(); - dimWatcher = null; // Clients shouldn't need to watch dims - linkWatcher = null; // Clients shouldn't need to watch links - + // Load compacted client-side dimension data Compactor.readDimensions(input, new DimRegistrationCallback()); diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonData.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonData.java index 7c298df..aa4bfa3 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonData.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonData.java @@ -31,7 +31,7 @@ public class DungeonData int indexB = schematicPath.lastIndexOf('/'); indexA = Math.max(indexA, indexB) + 1; - return schematicPath.substring(indexA, schematicPath.length() - DungeonHelper.SCHEMATIC_FILE_EXTENSION.length() - indexA); + return schematicPath.substring(indexA, schematicPath.length() - DungeonHelper.SCHEMATIC_FILE_EXTENSION.length()); } public int weight() -- 2.39.5 From 8bfe9dc22ecd56b785e5c2c830dac55271a50f40 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 3 Sep 2013 18:28:42 -0400 Subject: [PATCH 052/544] Fixed More Bugs Fixed more bugs. Now it's possible to generate a world without crashing. Unfortunately, it's clear that there is a packet-sending loop going on. I'll have to add a check to prevent integrated servers from spamming themselves. --- .../mod_pocketDim/EventHookContainer.java | 13 ++++++++++++- StevenDimDoors/mod_pocketDim/core/NewDimData.java | 2 +- StevenDimDoors/mod_pocketDim/mod_pocketDim.java | 1 - 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 025a24f..2e2756d 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -36,7 +36,18 @@ public class EventHookContainer @ForgeSubscribe public void onWorldLoad(WorldEvent.Load event) { - RiftRegenerator.regenerateRiftsInAllWorlds(); + // We need to initialize PocketManager here because onServerAboutToStart fires before we can + // use DimensionManager and onServerStarting fires after the game tries to generate terrain. + // If a gateway tries to generate before PocketManager has initialized, we get a crash. + if (!PocketManager.isLoaded()) + { + PocketManager.load(); + } + + if (PocketManager.isLoaded()) + { + RiftRegenerator.regenerateRiftsInAllWorlds(); + } } @ForgeSubscribe diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index 0be6468..40fe18d 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -127,7 +127,7 @@ public abstract class NewDimData IUpdateWatcher linkWatcher) { // The isPocket flag is redundant. It's meant as an integrity safeguard. - if (isPocket == (parent != null)) + if (isPocket != (parent != null)) { throw new NullPointerException("Dimensions can be pocket dimensions if and only if they have a parent dimension."); } diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index c7cd467..4ab5058 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -384,6 +384,5 @@ public class mod_pocketDim CommandCreatePocket.instance().register(event); CommandTeleportPlayer.instance().register(event); */ - PocketManager.load(); } } -- 2.39.5 From 1a50aa2290a540905c336feae6b5d61a54b291cc Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 3 Sep 2013 19:31:19 -0400 Subject: [PATCH 053/544] Minor Changes Minor changes: removed unused imports and random blocks of whitespace --- .../mod_pocketDimClient/ClientProxy.java | 36 +++---------------- .../ClientTickHandler.java | 3 -- .../mod_pocketDimClient/RenderDimDoor.java | 3 -- .../mod_pocketDimClient/RenderMobObelisk.java | 3 -- .../mod_pocketDimClient/RenderRift.java | 21 +++++------ 5 files changed, 13 insertions(+), 53 deletions(-) diff --git a/StevenDimDoors/mod_pocketDimClient/ClientProxy.java b/StevenDimDoors/mod_pocketDimClient/ClientProxy.java index b1428c3..7cb1469 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClientProxy.java +++ b/StevenDimDoors/mod_pocketDimClient/ClientProxy.java @@ -1,19 +1,10 @@ package StevenDimDoors.mod_pocketDimClient; -import java.io.File; - -import cpw.mods.fml.client.FMLClientHandler; -import cpw.mods.fml.client.registry.ClientRegistry; -import cpw.mods.fml.client.registry.RenderingRegistry; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.src.ModLoader; -import net.minecraftforge.client.MinecraftForgeClient; import StevenDimDoors.mod_pocketDim.CommonProxy; -import StevenDimDoors.mod_pocketDim.Spells; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.ticking.CommonTickHandler; import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; -import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.client.registry.RenderingRegistry; public class ClientProxy extends CommonProxy @@ -22,41 +13,24 @@ public class ClientProxy extends CommonProxy @Override public void registerRenderers() { - //MinecraftForgeClient.preloadTexture(BLOCK_PNG); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDimDoor.class, new RenderDimDoor()); //This code activates the new rift rendering, as well as a bit of code in TileEntityRift //ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRift.class, new RenderRift()); - //MinecraftForgeClient.preloadTexture(RIFT2_PNG); - RenderingRegistry.registerEntityRenderingHandler(MobMonolith.class, new RenderMobObelisk(.5F)); - - - - + RenderingRegistry.registerEntityRenderingHandler(MobMonolith.class, new RenderMobObelisk(.5F)); } - - - @Override public void loadTextures() { - - - - - - - - } + @Override public void printStringClient(String string) - { - + { ModLoader.getMinecraftInstance().ingameGUI.getChatGUI().printChatMessage(string); } diff --git a/StevenDimDoors/mod_pocketDimClient/ClientTickHandler.java b/StevenDimDoors/mod_pocketDimClient/ClientTickHandler.java index 1b9ad55..cece273 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClientTickHandler.java +++ b/StevenDimDoors/mod_pocketDimClient/ClientTickHandler.java @@ -1,9 +1,6 @@ package StevenDimDoors.mod_pocketDimClient; import java.util.EnumSet; -import StevenDimDoors.mod_pocketDim.Spells; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import cpw.mods.fml.common.ITickHandler; diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index 6239fc8..384ec97 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -3,11 +3,9 @@ package StevenDimDoors.mod_pocketDimClient; import java.nio.FloatBuffer; import java.util.Random; -import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; @@ -15,7 +13,6 @@ import org.lwjgl.opengl.GL11; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java b/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java index e1060a9..2bbdbad 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java @@ -1,9 +1,6 @@ package StevenDimDoors.mod_pocketDimClient; -import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; import net.minecraft.client.renderer.entity.RenderLiving; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/StevenDimDoors/mod_pocketDimClient/RenderRift.java b/StevenDimDoors/mod_pocketDimClient/RenderRift.java index adb4f13..07c1cf9 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderRift.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderRift.java @@ -1,24 +1,19 @@ package StevenDimDoors.mod_pocketDimClient; -import java.nio.FloatBuffer; -import java.util.HashMap; -import java.util.Random; +import static org.lwjgl.opengl.GL11.GL_BLEND; +import static org.lwjgl.opengl.GL11.GL_LIGHTING; +import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_DST_COLOR; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; +import static org.lwjgl.opengl.GL11.GL_ZERO; +import static org.lwjgl.opengl.GL11.glBlendFunc; + +import java.util.HashMap; -import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ActiveRenderInfo; -import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import org.lwjgl.opengl.GL11; -import static org.lwjgl.opengl.GL11.*; -import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; -import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -- 2.39.5 From 549ee548527db96deed0a49f3a1be9a7cb2ce630 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 3 Sep 2013 21:41:54 -0400 Subject: [PATCH 054/544] Fixed More Bugs Fixed the issue with integrated servers causing circular updates between the combined server and client. We now check on the client side whether the connection we're receiving data from is a memory connection (which is presumably only used by integrated servers). If so, the client ignores any incoming packets. We don't just disable update events altogether because LAN games will require updating remote clients. Also fixed a bug in PocketManager.unload() - we weren't setting isLoaded to false after unloading everything and unregisterPockets() had to be called before setting dimensionData to null. --- .../mod_pocketDim/core/PocketManager.java | 15 +++++++-------- .../mod_pocketDimClient/ClientPacketHandler.java | 5 +++++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index b79ee2b..a03a7b9 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -391,17 +391,16 @@ public class PocketManager public static void unload() { + if (!isLoaded) + { + throw new IllegalStateException("Pocket dimensions have already been unloaded!"); + } + save(); - dimensionData = null; unregisterPockets(); + dimensionData = null; + isLoaded = false; } - - /* - * This isn't needed right now and it's causing me problems due to the iterator's generic type -_- - public static Iterable getDimensions() - { - return dimensionData.values(); - }*/ public static DimLink getLink(int x, int y, int z, World world) { diff --git a/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java b/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java index a98f115..a969a92 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java +++ b/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java @@ -38,6 +38,11 @@ public class ClientPacketHandler implements IPacketHandler, IUpdateSource if (!packet.channel.equals(PacketConstants.CHANNEL_NAME)) return; + // If this is a memory connection, then our client is running an integrated server. + // We can tell by checking if packet size is 0. + if (manager.packetSize() == 0) + return; + try { DataInputStream input = new DataInputStream(new ByteArrayInputStream(packet.data)); -- 2.39.5 From b9fcfea877da4c5cb10e07c91bcbeff996dad105 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 4 Sep 2013 00:34:11 -0400 Subject: [PATCH 055/544] Fixed Various Bugs Fixed various minor bugs affecting transient doors and teleportation. --- StevenDimDoors/mod_pocketDim/DDTeleporter.java | 4 ++-- StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java | 5 +---- StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/DDTeleporter.java index 06b7289..bb9ca30 100644 --- a/StevenDimDoors/mod_pocketDim/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/DDTeleporter.java @@ -189,7 +189,7 @@ public class DDTeleporter } // Determine if our destination is in another realm. - boolean difDest = entity.dimension == destination.getDimension(); + boolean difDest = entity.dimension != destination.getDimension(); if (difDest) { // Destination isn't loaded? Then we need to load it. @@ -197,8 +197,8 @@ public class DDTeleporter if (newWorld == null) { DimensionManager.initDimension(destination.getDimension()); + newWorld = DimensionManager.getWorld(destination.getDimension()); } - newWorld = DimensionManager.getWorld(destination.getDimension()); } else { diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java index 48ce75e..c1fe83c 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java @@ -61,11 +61,8 @@ public class TransientDoor extends WarpDoor int var12 = (int) (MathHelper.floor_double((double) ((entity.rotationYaw + 90) * 4.0F / 360.0F) + 0.5D) & 3); int orientation = world.getBlockMetadata(x, y - 1, z); - if (!world.isRemote && (orientation >= 4 && orientation <= 7) && (orientation - 4) == var12 && - world.getBlockId(x, y - 1, z) == this.blockID) + if (!world.isRemote && orientation == var12 && world.getBlockId(x, y - 1, z) == this.blockID) { - this.onPoweredBlockChange(world, x, y, z, false); - DimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); if (link != null) { diff --git a/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java index bc52bf7..f7379d3 100644 --- a/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java +++ b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java @@ -146,7 +146,7 @@ public class GatewayGenerator implements IWorldGenerator } //Place the shiny transient door into a dungeon - ItemDimensionalDoor.placeDoorBlock(world, x, y + 1, z, 0, mod_pocketDim.transientDoor); + ItemDimensionalDoor.placeDoorBlock(world, x, y, z, 0, mod_pocketDim.transientDoor); } } } -- 2.39.5 From b3847a62b7ffb7a710a8b768056949ba9aad5ada Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 4 Sep 2013 13:48:54 -0400 Subject: [PATCH 056/544] Fixed More Bugs 1. Fixed mistakes in PocketBuilder that would cause dungeons to be initialized as non-dungeon pockets. This restored Monolith spawning around dungeons. 2. Fixed a bug in DungeonSchematic - returning links through entry doors should work now. 3. Made minor changes to DungeonSchematic for clarity --- .../mod_pocketDim/dungeon/DungeonSchematic.java | 10 +++++----- StevenDimDoors/mod_pocketDim/world/PocketBuilder.java | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index c118c17..d61f64e 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -168,14 +168,14 @@ public class DungeonSchematic extends Schematic { return new DungeonSchematic(Schematic.copyFromWorld(world, x, y, z, width, height, length, doCompactBounds)); } - public void copyToWorld(World world, Point3D pocketCenter, int dungeonOrientation, DimLink entryLink, Random random) + public void copyToWorld(World world, Point3D pocketCenter, int targetOrientation, DimLink entryLink, Random random) { //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, //then just use that support from DungeonSchematic instead of making this local fix. //It might be easiest to support transformations using a WorldOperation - final int turnAngle = dungeonOrientation - orientation; + final int turnAngle = targetOrientation - this.orientation; int index; int count; @@ -285,10 +285,10 @@ public class DungeonSchematic extends Schematic { private static void createEntranceReverseLink(NewDimData dimension, Point3D pocketCenter, DimLink entryLink) { - DimLink link = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ(), LinkTypes.NORMAL); - Point4D destination = link.source(); + DimLink reverseLink = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ(), LinkTypes.NORMAL); + Point4D destination = entryLink.source(); NewDimData prevDim = PocketManager.getDimensionData(destination.getDimension()); - prevDim.setDestination(link, destination.getX(), destination.getY(), destination.getZ()); + prevDim.setDestination(reverseLink, destination.getX(), destination.getY(), destination.getZ()); } private static void createExitDoorLink(NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) diff --git a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index 1f9aa7b..98e51a4 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -55,7 +55,7 @@ public class PocketBuilder { //Register a new dimension NewDimData parent = PocketManager.getDimensionData(link.source().getDimension()); - NewDimData dimension = PocketManager.registerPocket(parent, false); + NewDimData dimension = PocketManager.registerPocket(parent, true); //Load a world World world = DimensionManager.getWorld(dimension.id()); @@ -106,7 +106,7 @@ public class PocketBuilder schematic.copyToWorld(world, destination, orientation, link, random); //Finish up destination initialization - dimension.initializePocket(destination.getX(), destination.getY(), destination.getZ(), orientation, link); + dimension.initializeDungeon(destination.getX(), destination.getY(), destination.getZ(), orientation, link, dungeon); dimension.setFilled(true); return true; } -- 2.39.5 From 70eb27608674a4338029c491cbfef2aa9a1a02b3 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 4 Sep 2013 14:29:53 -0400 Subject: [PATCH 057/544] Fixed More Bugs Fixed a similar bug in DDTeleporter and PocketBuilder that caused things to be oriented wrong. Specifically, teleporting would orient the player wrong relative to the destination door and pockets would be oriented wrong relative to their parents. Teleporting works properly now. --- StevenDimDoors/mod_pocketDim/DDTeleporter.java | 6 +++--- StevenDimDoors/mod_pocketDim/world/PocketBuilder.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/DDTeleporter.java index bb9ca30..97aae3f 100644 --- a/StevenDimDoors/mod_pocketDim/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/DDTeleporter.java @@ -142,8 +142,8 @@ public class DDTeleporter throw new IllegalStateException("The destination world should be loaded!"); } - //Check if the block at that point is actually a door - int blockID = world.getBlockId(door.getX(), door.getY(), door.getZ()); + //Check if the block below that point is actually a door + int blockID = world.getBlockId(door.getX(), door.getY() - 1, door.getZ()); if (blockID != properties.DimensionalDoorID && blockID != properties.WarpDoorID && blockID != properties.TransientDoorID && blockID != properties.UnstableDoorID) { @@ -152,7 +152,7 @@ public class DDTeleporter } //Return the orientation portion of its metadata - return world.getBlockMetadata(door.getX(), door.getY(), door.getZ()) & 3; + return world.getBlockMetadata(door.getX(), door.getY() - 1, door.getZ()) & 3; } public static Entity teleportEntity(Entity entity, Point4D destination) diff --git a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index 98e51a4..e8afbe0 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -227,8 +227,8 @@ public class PocketBuilder throw new IllegalStateException("The link's source world should be loaded!"); } - //Check if the block at that point is actually a door - int blockID = world.getBlockId(source.getX(), source.getY(), source.getZ()); + //Check if the block below that point is actually a door + int blockID = world.getBlockId(source.getX(), source.getY() - 1, source.getZ()); if (blockID != properties.DimensionalDoorID && blockID != properties.WarpDoorID && blockID != properties.TransientDoorID) { @@ -236,7 +236,7 @@ public class PocketBuilder } //Return the orientation portion of its metadata - int orientation = world.getBlockMetadata(source.getX(), source.getY(), source.getZ()) & 3; + int orientation = world.getBlockMetadata(source.getX(), source.getY() - 1, source.getZ()) & 3; return orientation; } -- 2.39.5 From 8d5a3ac72ed7457f879ceecec378661fdbcb437f Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 4 Sep 2013 16:06:54 -0400 Subject: [PATCH 058/544] Fixed More Bugs Fixed how the door in a pocket is placed so that it doesn't break and so that it's placed facing into the pocket. Also added code to make that door link back to the parent dimension - forgot that before! --- .../mod_pocketDim/world/PocketBuilder.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index e8afbe0..d76e9b6 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -10,7 +10,9 @@ import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; @@ -18,6 +20,7 @@ import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; +import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import StevenDimDoors.mod_pocketDim.util.Pair; import StevenDimDoors.mod_pocketDim.util.Point4D; @@ -301,6 +304,10 @@ public class PocketBuilder int destinationY = yCoordHelper.adjustDestinationY(source.getY(), world.getHeight(), wallThickness + 1, size); int orientation = getDoorOrientation(source, properties); + //Place a link leading back out of the pocket + DimLink reverseLink = dimension.createLink(source.getX(), destinationY, source.getZ(), LinkTypes.NORMAL); + parent.setDestination(reverseLink, source.getX(), source.getY(), source.getZ()); + //Build the actual pocket area buildPocket(world, source.getX(), destinationY, source.getZ(), orientation, size, wallThickness, properties); @@ -352,11 +359,10 @@ public class PocketBuilder buildBox(world, center.getX(), center.getY(), center.getZ(), (size / 2) - layer, properties.FabricBlockID, layer < (wallThickness - 1) && properties.TNFREAKINGT_Enabled, properties.NonTntWeight); } - + //Build the door - int metadata = BlockRotator.transformMetadata(BlockRotator.EAST_DOOR_METADATA, orientation - BlockRotator.EAST_DOOR_METADATA, properties.DimensionalDoorID); - setBlockDirectly(world, x, y, z, properties.DimensionalDoorID, metadata); - setBlockDirectly(world, x, y - 1, z, properties.DimensionalDoorID, metadata); + int doorOrientation = BlockRotator.transformMetadata(BlockRotator.EAST_DOOR_METADATA, orientation - BlockRotator.EAST_DOOR_METADATA + 2, properties.DimensionalDoorID); + ItemDimensionalDoor.placeDoorBlock(world, x, y - 1, z, doorOrientation, mod_pocketDim.dimensionalDoor); } private static void buildBox(World world, int centerX, int centerY, int centerZ, int radius, int blockID, boolean placeTnt, int nonTntWeight) -- 2.39.5 From fa33fa95c8b298feaea77a31b00f95fc3d795251 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 4 Sep 2013 19:26:59 -0400 Subject: [PATCH 059/544] Fixed Rift Signatures Fixed Rift Signatures and Stabilized Rift Signatures. A few unexpected MC-related issues were preventing them from working properly. Also fixed a typo that caused us to place rift blocks at the wrong coordinates with respect to the rift sig endpoints. Autocorrected the indentation on both source files for aesthetics. --- .../items/ItemRiftSignature.java | 126 ++++++++-------- .../items/ItemStabilizedRiftSignature.java | 140 ++++++++++++------ 2 files changed, 158 insertions(+), 108 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java index 088b93d..05b1f51 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java @@ -24,9 +24,9 @@ public class ItemRiftSignature extends Item { super(itemID); this.setMaxStackSize(1); - this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); this.setMaxDamage(0); this.hasSubtypes = true; + this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); } @SideOnly(Side.CLIENT) @@ -43,67 +43,69 @@ public class ItemRiftSignature extends Item } @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int par7, float par8, float par9, float par10) + public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { - tryItemUse(stack, player, world, x, y, z); - return true; - } - - protected boolean tryItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z) - { - if (!world.isRemote) + // We must use onItemUseFirst() instead of onItemUse() because Minecraft checks + // whether the user is in creative mode after calling onItemUse() and undoes any + // damage we might set to indicate the rift sig has been activated. Otherwise, + // we would need to rely on checking NBT tags for hasEffect() and that function + // gets called constantly. Avoiding NBT lookups reduces our performance impact. + + // Return false on the client side to pass this request to the server + if (world.isRemote) + { + return false; + } + + //We don't check for replaceable blocks. The user can deal with that. <_< + + y += 2; //Increase y by 2 to place the rift at head level + if (!player.canPlayerEdit(x, y, z, 0, stack)) { - //We don't check for replaceable blocks. The user can deal with that. <_< - - y += 2; //Increase y by 2 to place the rift at head level - if (!player.canPlayerEdit(x, y, z, 0, stack)) - { - return false; - } - - Point4D source = getSource(stack); - if (source != null) - { - //The link was used before and already has an endpoint stored. Create links connecting the two endpoints. - NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension()); - NewDimData destinationDimension = PocketManager.getDimensionData(world); - DimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.NORMAL); - DimLink reverse = destinationDimension.createLink(x, y, z, LinkTypes.NORMAL); - destinationDimension.setDestination(link, x, y, z); - sourceDimension.setDestination(reverse, source.getX(), source.getY(), source.getZ()); - - //Try placing a rift at the destination point - if (!mod_pocketDim.blockRift.isBlockImmune(world, x, y, z)) - { - world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); - } - - //Try placing a rift at the source point, but check if its world is loaded first - World sourceWorld = DimensionManager.getWorld(sourceDimension.id()); - if (sourceWorld != null && - !mod_pocketDim.blockRift.isBlockImmune(sourceWorld, source.getX(), source.getY(), source.getZ())) - { - sourceWorld.setBlock(source.getX(), source.getY(), source.getY(), mod_pocketDim.blockRift.blockID); - } - - if (!player.capabilities.isCreativeMode) - { - stack.stackSize--; - } - clearSource(stack); - player.sendChatToPlayer("Rift Created"); - world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftEnd", 0.6f, 1); - } - else - { - //The link signature has not been used. Store its current target as the first location. - setSource(stack, x, y, z, PocketManager.getDimensionData(world)); - player.sendChatToPlayer("Location Stored in Rift Signature"); - world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftStart", 0.6f, 1); - } return true; } - return false; + + Point4D source = getSource(stack); + if (source != null) + { + //The link was used before and already has an endpoint stored. Create links connecting the two endpoints. + NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension()); + NewDimData destinationDimension = PocketManager.getDimensionData(world); + DimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.NORMAL); + DimLink reverse = destinationDimension.createLink(x, y, z, LinkTypes.NORMAL); + destinationDimension.setDestination(link, x, y, z); + sourceDimension.setDestination(reverse, source.getX(), source.getY(), source.getZ()); + + //Try placing a rift at the destination point + if (!mod_pocketDim.blockRift.isBlockImmune(world, x, y, z)) + { + world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); + } + + //Try placing a rift at the source point, but check if its world is loaded first + World sourceWorld = DimensionManager.getWorld(sourceDimension.id()); + if (sourceWorld != null && + !mod_pocketDim.blockRift.isBlockImmune(sourceWorld, source.getX(), source.getY(), source.getZ())) + { + sourceWorld.setBlock(source.getX(), source.getY(), source.getZ(), mod_pocketDim.blockRift.blockID); + } + + if (!player.capabilities.isCreativeMode) + { + stack.stackSize--; + } + clearSource(stack); + player.sendChatToPlayer("Rift Created"); + world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftEnd", 0.6f, 1); + } + else + { + //The link signature has not been used. Store its current target as the first location. + setSource(stack, x, y, z, PocketManager.getDimensionData(world)); + player.sendChatToPlayer("Location Stored in Rift Signature"); + world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftStart", 0.6f, 1); + } + return true; } /** @@ -138,7 +140,7 @@ public class ItemRiftSignature extends Item itemStack.setTagCompound(tag); itemStack.setItemDamage(1); } - + public static void clearSource(ItemStack itemStack) { //Don't just set the tag to null since there may be other data there (e.g. for renamed items) @@ -149,7 +151,7 @@ public class ItemRiftSignature extends Item tag.removeTag("linkDimID"); itemStack.setItemDamage(0); } - + public static Point4D getSource(ItemStack itemStack) { if (itemStack.getItemDamage() != 0) @@ -157,12 +159,12 @@ public class ItemRiftSignature extends Item if (itemStack.hasTagCompound()) { NBTTagCompound tag = itemStack.getTagCompound(); - + Integer x = tag.getInteger("linkX"); Integer y = tag.getInteger("linkY"); Integer z = tag.getInteger("linkZ"); Integer dimID = tag.getInteger("linkDimID"); - + if (x != null && y != null && z != null && dimID != null) { return new Point4D(x, y, z, dimID); diff --git a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java index 5ea3f9e..0a20abb 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java @@ -7,65 +7,113 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.util.Point4D; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class ItemStabilizedRiftSignature extends ItemRiftSignature { - public ItemStabilizedRiftSignature(int itemID) - { - super(itemID); - } - - public void registerIcons(IconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); - } + public ItemStabilizedRiftSignature(int itemID) + { + super(itemID); + } - @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int par7, float par8, float par9, float par10) - { - //Check if the Stabilized Rift Signature has been initialized - Point4D source = getSource(stack); - if (source != null) - { - //Yes, it's initialized. Check if the player can pay an Ender Pearl to create a rift. - if (player.inventory.hasItem(Item.enderPearl.itemID)) - { - if (tryItemUse(stack, player, world, x, y, z) && !player.capabilities.isCreativeMode) - { - player.inventory.consumeInventoryItem(Item.enderPearl.itemID); - } - } - } - else - { - //Initialization doesn't cost any materials - tryItemUse(stack, player, world, x, y, z); - } - return true; - } - - /** - * allows items to add custom lines of information to the mouseover description - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) + public void registerIcons(IconRegister par1IconRegister) + { + this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); + } + + @Override + public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) + { + // Return false on the client side to pass this request to the server + if (world.isRemote) + { + return false; + } + + // We don't check for replaceable blocks. The user can deal with that. <_< + y += 2; //Increase y by 2 to place the rift at head level + if (!player.canPlayerEdit(x, y, z, 0, stack)) + { + return true; + } + + // Check if the Stabilized Rift Signature has been initialized + Point4D source = getSource(stack); + if (source != null) + { + // Yes, it's initialized. Check if the player is in creative + // or if the player can pay an Ender Pearl to create a rift. + if (!player.capabilities.isCreativeMode && !player.inventory.hasItem(Item.enderPearl.itemID)) + { + player.sendChatToPlayer("You don't have any Ender Pearls!"); + return true; + } + + //The link was used before and already has an endpoint stored. Create links connecting the two endpoints. + NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension()); + NewDimData destinationDimension = PocketManager.getDimensionData(world); + DimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.NORMAL); + DimLink reverse = destinationDimension.createLink(x, y, z, LinkTypes.NORMAL); + destinationDimension.setDestination(link, x, y, z); + sourceDimension.setDestination(reverse, source.getX(), source.getY(), source.getZ()); + + //Try placing a rift at the destination point + if (!mod_pocketDim.blockRift.isBlockImmune(world, x, y, z)) + { + world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); + } + + //Try placing a rift at the source point, but check if its world is loaded first + World sourceWorld = DimensionManager.getWorld(sourceDimension.id()); + if (sourceWorld != null && + !mod_pocketDim.blockRift.isBlockImmune(sourceWorld, source.getX(), source.getY(), source.getZ())) + { + sourceWorld.setBlock(source.getX(), source.getY(), source.getZ(), mod_pocketDim.blockRift.blockID); + } + + if (!player.capabilities.isCreativeMode) + { + player.inventory.consumeInventoryItem(Item.enderPearl.itemID); + } + player.sendChatToPlayer("Rift Created"); + world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftEnd", 0.6f, 1); + } + else + { + //The link signature has not been used. Store its current target as the first location. + setSource(stack, x, y, z, PocketManager.getDimensionData(world)); + player.sendChatToPlayer("Location Stored in Rift Signature"); + world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftStart", 0.6f, 1); + } + return true; + } + + /** + * allows items to add custom lines of information to the mouseover description + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) @SideOnly(Side.CLIENT) - @Override - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) - { + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { Point4D source = getSource(par1ItemStack); if (source != null) { par3List.add("Leads to (" + source.getX() + ", " + source.getY() + ", " + source.getZ() + ") at dimension #" + source.getDimension()); } else - { - par3List.add("First click stores a location,"); - par3List.add("second click creates two rifts"); - par3List.add("that link the locations together."); - } - } + { + par3List.add("First click stores a location,"); + par3List.add("second click creates two rifts"); + par3List.add("that link the locations together."); + } + } } -- 2.39.5 From e8e0cdf8ad6932abcb556359771885b3d691279f Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 5 Sep 2013 00:15:48 -0400 Subject: [PATCH 060/544] Minor Changes Made minor changes to LinkTypes for clarity. Removed removeRift() from PocketManager since it wasn't used by anything and because it shouldn't contain rift removal code anyway. --- .../mod_pocketDim/core/LinkTypes.java | 18 ++++++------- .../mod_pocketDim/core/PocketManager.java | 27 ------------------- 2 files changed, 9 insertions(+), 36 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/LinkTypes.java b/StevenDimDoors/mod_pocketDim/core/LinkTypes.java index 5e64aff..cce9f9c 100644 --- a/StevenDimDoors/mod_pocketDim/core/LinkTypes.java +++ b/StevenDimDoors/mod_pocketDim/core/LinkTypes.java @@ -5,17 +5,17 @@ public class LinkTypes private LinkTypes() { } public static final int ENUM_MIN = 0; - public static final int ENUM_MAX = 8; + public static final int ENUM_MAX = 7; public static final int CLIENT_SIDE = -1337; + // WARNING: Don't modify these values carelessly or you'll risk breaking links in existing worlds! public static final int NORMAL = 0; - public static final int LIMBO = 1; - public static final int POCKET = 2; - public static final int DUNGEON = 3; - public static final int RANDOM = 4; - public static final int DUNGEON_EXIT = 5; - public static final int SAFE_EXIT = 6; - public static final int UNSAFE_EXIT = 7; - public static final int RANDOM_DUNGEON = 8; + public static final int POCKET = 1; + public static final int DUNGEON = 2; + public static final int RANDOM = 3; + public static final int DUNGEON_EXIT = 4; + public static final int SAFE_EXIT = 5; + public static final int UNSAFE_EXIT = 6; + public static final int RANDOM_DUNGEON = 7; } diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index a03a7b9..a6365f7 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -6,15 +6,11 @@ import java.io.File; import java.io.IOException; import java.util.HashMap; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.helpers.Compactor; import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; -import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; import StevenDimDoors.mod_pocketDim.watcher.IUpdateSource; @@ -286,29 +282,6 @@ public class PocketManager } } - public static boolean removeRift(World world, int x, int y, int z, int range, EntityPlayer player, ItemStack item) - { - //Function called by rift tile entities and the rift remover to find and spread between rifts. - //Does not actually unregister the rift data, see deleteRift for that. - - NewDimData dimension = getDimensionData(world); - DimLink nearest = dimension.findNearestRift(world, range, x, y, z); - - if (nearest != null) - { - Point4D location = nearest.source(); - TileEntity tileEntity = world.getBlockTileEntity(location.getX(), location.getY(), location.getZ()); - if (tileEntity != null) - { - TileEntityRift riftEntity = (TileEntityRift) tileEntity; - riftEntity.shouldClose = true; - item.damageItem(1, player); - return true; - } - } - return false; - } - public static NewDimData registerDimension(World world) { return registerDimension(world.provider.dimensionId, null, false, false); -- 2.39.5 From b4cb8f8610d6b41688c140d1a20a1ea652211040 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 5 Sep 2013 02:12:59 -0400 Subject: [PATCH 061/544] Fixed Rift Remover Fixed the Rift Remover item. --- .../mod_pocketDim/items/itemRiftRemover.java | 153 +++++++++++------- 1 file changed, 98 insertions(+), 55 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java index 02e8ed3..c3759ac 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java +++ b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java @@ -5,79 +5,122 @@ import java.util.List; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.MathHelper; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; +import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class itemRiftRemover extends Item { - public itemRiftRemover(int par1, Material par2Material) - { - super(par1); - this.setMaxStackSize(1); - this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - this.setMaxDamage(5); - this.hasSubtypes = true; - } - - public void registerIcons(IconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()); - } - - public static MovingObjectPosition getBlockTarget(World par1World, EntityPlayer par2EntityPlayer, boolean par3) - { - float var4 = 1.0F; - float var5 = par2EntityPlayer.prevRotationPitch + (par2EntityPlayer.rotationPitch - par2EntityPlayer.prevRotationPitch) * var4; - float var6 = par2EntityPlayer.prevRotationYaw + (par2EntityPlayer.rotationYaw - par2EntityPlayer.prevRotationYaw) * var4; - double var7 = par2EntityPlayer.prevPosX + (par2EntityPlayer.posX - par2EntityPlayer.prevPosX) * (double)var4; - double var9 = par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * (double)var4 + 1.62D - (double)par2EntityPlayer.yOffset; - double var11 = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * (double)var4; - Vec3 var13 = par1World.getWorldVec3Pool().getVecFromPool(var7, var9, var11); - float var14 = MathHelper.cos(-var6 * 0.017453292F - (float)Math.PI); - float var15 = MathHelper.sin(-var6 * 0.017453292F - (float)Math.PI); - float var16 = -MathHelper.cos(-var5 * 0.017453292F); - float var17 = MathHelper.sin(-var5 * 0.017453292F); - float var18 = var15 * var16; - float var20 = var14 * var16; - double var21 = 5.0D; - if (par2EntityPlayer instanceof EntityPlayerMP) - { - var21 = 6; - } - Vec3 var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21); - return par1World.rayTraceBlocks_do_do(var13, var23, true, false); - } + public itemRiftRemover(int itemID, Material par2Material) + { + super(itemID); + this.setMaxStackSize(1); + this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); + this.setMaxDamage(4); + } - public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - MovingObjectPosition hit = getBlockTarget(par3EntityPlayer.worldObj, par3EntityPlayer, false); + public void registerIcons(IconRegister par1IconRegister) + { + this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + { + // We invoke PlayerControllerMP.onPlayerRightClick() from here so that Minecraft + // will invoke onItemUseFirst() on the client side. We'll tell it to pass the + // request to the server, which will make sure that rift-related changes are + // reflected on the server. + + if (!world.isRemote) + { + return stack; + } + + MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(world, player, true); if (hit != null) { - if (PocketManager.removeRift(par2World, hit.blockX, hit.blockY, hit.blockZ, 1, par3EntityPlayer, par1ItemStack)) + int hx = hit.blockX; + int hy = hit.blockY; + int hz = hit.blockZ; + NewDimData dimension = PocketManager.getDimensionData(world); + DimLink link = dimension.getLink(hx, hy, hz); + if (world.getBlockId(hx, hy, hz) == mod_pocketDim.blockRift.blockID && link != null && + player.canPlayerEdit(hx, hy, hz, 0, stack)) { - par3EntityPlayer.worldObj.playSoundAtEntity(par3EntityPlayer,"mods.DimDoors.sfx.riftClose", 0.8f, 1); + // Invoke onPlayerRightClick() + FMLClientHandler.instance().getClient().playerController.onPlayerRightClick( + player, world, stack, hx, hy, hz, hit.sideHit, hit.hitVec); } } - return par1ItemStack; - } - - /** - * allows items to add custom lines of information to the mouseover description - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) + return stack; + } + + @Override + public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) + { + // We want to use onItemUseFirst() here so that this code will run on the server side, + // so we don't need the client to send link-related updates to the server. Still, + // check whether we have a rift in sight before passing the request over. + + // On integrated servers, the link won't be removed immediately because of the rift + // removal animation. That means we'll have a chance to check for the link before + // it's deleted. Otherwise the Rift Remover's durability wouldn't drop. + + NewDimData dimension = PocketManager.getDimensionData(world); + DimLink link = dimension.getLink(x, y, z); + if (world.getBlockId(x, y, z) == mod_pocketDim.blockRift.blockID && link != null && + player.canPlayerEdit(x, y, z, side, stack)) + { + // Tell the rift's tile entity to do its removal animation + TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof TileEntityRift) + { + ((TileEntityRift) tileEntity).shouldClose = true; + } + else if (!world.isRemote) + { + // Only set the block to air on the server side so that we don't + // tell the server to remove the rift block before it can use the + // Rift Remover. Otherwise, it won't know to reduce durability. + world.setBlockToAir(x, y, z); + } + if (world.isRemote) + { + // Tell the server about this + return false; + } + else + { + if (!player.capabilities.isCreativeMode) + { + stack.damageItem(1, player); + } + player.sendChatToPlayer("Clink! Damaged!"); + player.worldObj.playSoundAtEntity(player, "mods.DimDoors.sfx.riftClose", 0.8f, 1); + } + } + return true; + } + + /** + * allows items to add custom lines of information to the mouseover description + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) @SideOnly(Side.CLIENT) - @Override - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) - { + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { par3List.add("Use near exposed rift"); par3List.add("to remove it and"); par3List.add("any nearby rifts."); -- 2.39.5 From 6a816bbca79eea7fb60c0a4841b0866364699106 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 5 Sep 2013 11:04:48 -0400 Subject: [PATCH 062/544] Minor Change Removed a debug message from the Rift Remover. --- StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java | 1 - 1 file changed, 1 deletion(-) diff --git a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java index c3759ac..201ffcb 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java +++ b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java @@ -106,7 +106,6 @@ public class itemRiftRemover extends Item { stack.damageItem(1, player); } - player.sendChatToPlayer("Clink! Damaged!"); player.worldObj.playSoundAtEntity(player, "mods.DimDoors.sfx.riftClose", 0.8f, 1); } } -- 2.39.5 From 22b7ed147a7bdea52da923b37764c92a226553d6 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 5 Sep 2013 11:13:14 -0400 Subject: [PATCH 063/544] Fixed Bug in PocketManager Fixed a bug in PocketManager - I had forgotten to raise the dimension creation event when needed. --- StevenDimDoors/mod_pocketDim/core/PocketManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index a6365f7..aa3b549 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -309,6 +309,8 @@ public class PocketManager InnerDimData dimension = new InnerDimData(dimensionID, parent, isPocket, isDungeon, linkWatcher); dimensionData.put(dimensionID, dimension); + dimWatcher.onCreated(new ClientDimData(dimension)); + return dimension; } -- 2.39.5 From 1138f6733eef74bd277a6c36d0eae6d2ed20d9d6 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 5 Sep 2013 11:36:59 -0400 Subject: [PATCH 064/544] Cleaned Up Code Changed calls to canPlayerEdit() to pass hit.sideHit data with the request. Also renamed several variables to make the code clearer. Removed a custom implementation of the ray tracing call in BaseItemDoor - we can use the built-in call from Minecraft there. --- .../mod_pocketDim/items/BaseItemDoor.java | 42 ++++--------------- .../mod_pocketDim/items/ItemRiftBlade.java | 19 ++++----- .../items/ItemRiftSignature.java | 2 +- .../items/ItemStabilizedRiftSignature.java | 2 +- .../mod_pocketDim/items/itemRiftRemover.java | 2 +- 5 files changed, 19 insertions(+), 48 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java b/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java index 9517b95..e084b1f 100644 --- a/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java +++ b/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java @@ -6,12 +6,10 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemDoor; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -41,12 +39,12 @@ public abstract class BaseItemDoor extends ItemDoor public abstract void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4); @Override - public abstract boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int par7, float par8, float par9, float par10); + public abstract boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ); - public static boolean tryItemUse(Block doorBlock, ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int par7, boolean requireLink, boolean reduceStack) + public static boolean tryItemUse(Block doorBlock, ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, boolean requireLink, boolean reduceStack) { - //FIXME: Without any sort of this documentation, this condition is like magic -_- ~SenseiKiwi - if (par7 == 1 && !world.isRemote) + // Only place doors on top of blocks - check if we're targeting the top side + if (side == 1 && !world.isRemote) { int blockID = world.getBlockId(x, y, z); if (blockID != 0) @@ -58,7 +56,7 @@ public abstract class BaseItemDoor extends ItemDoor } if (canPlace(world, x, y, z) && canPlace(world, x, y + 1, z) && - player.canPlayerEdit(x, y, z, par7, stack) && player.canPlayerEdit(x, y + 1, z, par7, stack) && + player.canPlayerEdit(x, y, z, side, stack) && player.canPlayerEdit(x, y + 1, z, side, stack) && (!requireLink || PocketManager.getLink(x, y + 1, z, world) != null)) { int orientation = MathHelper.floor_double((double) ((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; @@ -74,31 +72,6 @@ public abstract class BaseItemDoor extends ItemDoor return false; } - @Override - public final MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean par3) - { - float var4 = 1.0F; - float var5 = par2EntityPlayer.prevRotationPitch + (par2EntityPlayer.rotationPitch - par2EntityPlayer.prevRotationPitch) * var4; - float var6 = par2EntityPlayer.prevRotationYaw + (par2EntityPlayer.rotationYaw - par2EntityPlayer.prevRotationYaw) * var4; - double var7 = par2EntityPlayer.prevPosX + (par2EntityPlayer.posX - par2EntityPlayer.prevPosX) * (double)var4; - double var9 = par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * (double)var4 + 1.62D - (double)par2EntityPlayer.yOffset; - double var11 = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * (double)var4; - Vec3 var13 = par1World.getWorldVec3Pool().getVecFromPool(var7, var9, var11); - float var14 = MathHelper.cos(-var6 * 0.017453292F - (float)Math.PI); - float var15 = MathHelper.sin(-var6 * 0.017453292F - (float)Math.PI); - float var16 = -MathHelper.cos(-var5 * 0.017453292F); - float var17 = MathHelper.sin(-var5 * 0.017453292F); - float var18 = var15 * var16; - float var20 = var14 * var16; - double var21 = 5.0D; - if (par2EntityPlayer instanceof EntityPlayerMP) - { - var21 = 4; - } - Vec3 var23 = var13.addVector((double) var18 * var21, (double)var17 * var21, (double)var20 * var21); - return par1World.rayTraceBlocks_do_do(var13, var23, true, false); - } - @Override public abstract ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player); @@ -109,7 +82,7 @@ public abstract class BaseItemDoor extends ItemDoor return false; } - MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(player.worldObj, player, false); + MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(player.worldObj, player, true); if (hit != null) { if (world.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) @@ -120,9 +93,8 @@ public abstract class BaseItemDoor extends ItemDoor int x = hit.blockX; int y = hit.blockY; int z = hit.blockZ; - int par7 = 0; - if (player.canPlayerEdit(x, y, z, par7, item) && player.canPlayerEdit(x, y - 1, z, par7, item)) + if (player.canPlayerEdit(x, y, z, hit.sideHit, item) && player.canPlayerEdit(x, y - 1, z, hit.sideHit, item)) { if (canPlace(world, x, y, z) && canPlace(world, x, y - 1, z)) { diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index ba49480..4de21ce 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -224,20 +224,19 @@ public class ItemRiftBlade extends ItemSword { if (PocketManager.getLink(hit.blockX, hit.blockY, hit.blockZ, world) != null) { - Block var11 = mod_pocketDim.transientDoor; - int par4 = hit.blockX; - int par5 = hit.blockY; - int par6 = hit.blockZ; - int par7 = 0; + Block block = mod_pocketDim.transientDoor; + int x = hit.blockX; + int y = hit.blockY; + int z = hit.blockZ; - if (player.canPlayerEdit(par4, par5, par6, par7, stack) && player.canPlayerEdit(par4, par5 + 1, par6, par7, stack)&&!world.isRemote) + if (player.canPlayerEdit(x, y, z, hit.sideHit, stack) && player.canPlayerEdit(x, y + 1, z, hit.sideHit, stack) && !world.isRemote) { - int var12 = MathHelper.floor_double((double)((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; + int orientation = MathHelper.floor_double((double)((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; - if (BaseItemDoor.canPlace(world, par4, par5, par6) && - BaseItemDoor.canPlace(world, par4, par5 - 1, par6)) + if (BaseItemDoor.canPlace(world, x, y, z) && + BaseItemDoor.canPlace(world, x, y - 1, z)) { - ItemDimensionalDoor.placeDoorBlock(world, par4, par5 - 1, par6, var12, var11); + ItemDimensionalDoor.placeDoorBlock(world, x, y - 1, z, orientation, block); player.worldObj.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1); stack.damageItem(10, player); } diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java index 05b1f51..b4003fe 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java @@ -60,7 +60,7 @@ public class ItemRiftSignature extends Item //We don't check for replaceable blocks. The user can deal with that. <_< y += 2; //Increase y by 2 to place the rift at head level - if (!player.canPlayerEdit(x, y, z, 0, stack)) + if (!player.canPlayerEdit(x, y, z, side, stack)) { return true; } diff --git a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java index 0a20abb..0e37b6b 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java @@ -40,7 +40,7 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature // We don't check for replaceable blocks. The user can deal with that. <_< y += 2; //Increase y by 2 to place the rift at head level - if (!player.canPlayerEdit(x, y, z, 0, stack)) + if (!player.canPlayerEdit(x, y, z, side, stack)) { return true; } diff --git a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java index 201ffcb..a0256ad 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java +++ b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java @@ -56,7 +56,7 @@ public class itemRiftRemover extends Item NewDimData dimension = PocketManager.getDimensionData(world); DimLink link = dimension.getLink(hx, hy, hz); if (world.getBlockId(hx, hy, hz) == mod_pocketDim.blockRift.blockID && link != null && - player.canPlayerEdit(hx, hy, hz, 0, stack)) + player.canPlayerEdit(hx, hy, hz, hit.sideHit, stack)) { // Invoke onPlayerRightClick() FMLClientHandler.instance().getClient().playerController.onPlayerRightClick( -- 2.39.5 From a82c7ce4c258dee2af0a73a60473ba2a1f9e2b4f Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 5 Sep 2013 16:19:05 -0400 Subject: [PATCH 065/544] Minor Changes Made minor changes to ItemRiftBlade to clarify our code. Had to update mod_pocketDim to use ItemRiftBlade's new constructor after changing it slightly. --- .../mod_pocketDim/items/ItemRiftBlade.java | 12 ++++++------ StevenDimDoors/mod_pocketDim/mod_pocketDim.java | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index 4de21ce..9fc3115 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -28,9 +28,9 @@ import cpw.mods.fml.relauncher.SideOnly; public class ItemRiftBlade extends ItemSword { - private static DDProperties properties = null; + private final DDProperties properties; - public ItemRiftBlade(int itemID, EnumToolMaterial material) + public ItemRiftBlade(int itemID, EnumToolMaterial material, DDProperties properties) { super(itemID, material); @@ -38,10 +38,10 @@ public class ItemRiftBlade extends ItemSword this.setMaxStackSize(1); this.setMaxDamage(500); this.hasSubtypes = false; - if (properties == null) - properties = DDProperties.instance(); + this.properties = properties; } + @Override @SideOnly(Side.CLIENT) public boolean isFull3D() { @@ -272,9 +272,9 @@ public class ItemRiftBlade extends ItemSword @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, - int z, int par7, float par8, float par9, float par10) + int z, int side, float hitX, float hitY, float hitZ) { - if (BaseItemDoor.tryItemUse(mod_pocketDim.transientDoor, stack, player, world, x, y, z, par7, true, false)) + if (BaseItemDoor.tryItemUse(mod_pocketDim.transientDoor, stack, player, world, x, y, z, side, true, false)) { world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1); return true; diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 4ab5058..c395c11 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -185,7 +185,7 @@ public class mod_pocketDim itemRiftRemover = (new itemRiftRemover(properties.RiftRemoverItemID, Material.wood)).setUnlocalizedName("itemRiftRemover"); itemStableFabric = (new ItemStableFabric(properties.StableFabricItemID, 0)).setUnlocalizedName("itemStableFabric"); itemChaosDoor = (new ItemUnstableDoor(properties.UnstableDoorItemID, Material.iron)).setUnlocalizedName("itemChaosDoor"); - itemRiftBlade = (new ItemRiftBlade(properties.RiftBladeItemID, EnumToolMaterial.GOLD)).setUnlocalizedName("ItemRiftBlade"); + itemRiftBlade = (new ItemRiftBlade(properties.RiftBladeItemID, EnumToolMaterial.GOLD, properties)).setUnlocalizedName("ItemRiftBlade"); itemStabilizedLinkSignature = (new ItemStabilizedRiftSignature(properties.StabilizedRiftSignatureItemID)).setUnlocalizedName("itemStabilizedRiftSig"); mod_pocketDim.limboBiome= (new BiomeGenLimbo(properties.LimboBiomeID)); -- 2.39.5 From 64cc95f92b3fe03779c3de0522e53c02c7a7808b Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 5 Sep 2013 16:24:01 -0400 Subject: [PATCH 066/544] Deleted DimUpdatePacket Deleted DimUpdatePacket since it's not used for anything and the file is essentially empty. --- .../mod_pocketDim/DimUpdatePacket.java | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 StevenDimDoors/mod_pocketDim/DimUpdatePacket.java diff --git a/StevenDimDoors/mod_pocketDim/DimUpdatePacket.java b/StevenDimDoors/mod_pocketDim/DimUpdatePacket.java deleted file mode 100644 index daed1ea..0000000 --- a/StevenDimDoors/mod_pocketDim/DimUpdatePacket.java +++ /dev/null @@ -1,17 +0,0 @@ -package StevenDimDoors.mod_pocketDim; - - -public class DimUpdatePacket -{ - - public DimUpdatePacket(int dim) - { - - } - - - - - - -} \ No newline at end of file -- 2.39.5 From 1dfa5817bf6cb734c2b2c658b65ad364e27c09a7 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 5 Sep 2013 16:31:32 -0400 Subject: [PATCH 067/544] Moved DDTeleporter Moved DDTeleporter to the mod_pocketDim.core package. It seemed reasonable given that DDTeleporter is closely tied to how Dimensional Doors works. It controls the most critical feature for all items - teleportation - and handles routing requests to initialize link destinations. --- StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java | 2 +- StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java | 2 +- StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java | 2 +- StevenDimDoors/mod_pocketDim/{ => core}/DDTeleporter.java | 6 ++---- StevenDimDoors/mod_pocketDim/ticking/CommonTickHandler.java | 2 +- StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java | 2 +- 6 files changed, 7 insertions(+), 9 deletions(-) rename StevenDimDoors/mod_pocketDim/{ => core}/DDTeleporter.java (98%) diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java index 5789fb3..f5e34ae 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java @@ -12,8 +12,8 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.DDTeleporter; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.util.Point4D; diff --git a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java index 95de79d..83b64f4 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java @@ -18,8 +18,8 @@ import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.DDTeleporter; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java index c1fe83c..cc847cc 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java @@ -10,8 +10,8 @@ import net.minecraft.util.Icon; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDTeleporter; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; diff --git a/StevenDimDoors/mod_pocketDim/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java similarity index 98% rename from StevenDimDoors/mod_pocketDim/DDTeleporter.java rename to StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 97aae3f..f973e38 100644 --- a/StevenDimDoors/mod_pocketDim/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -1,4 +1,4 @@ -package StevenDimDoors.mod_pocketDim; +package StevenDimDoors.mod_pocketDim.core; import java.util.Random; @@ -16,9 +16,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.core.DimLink; -import StevenDimDoors.mod_pocketDim.core.LinkTypes; -import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.world.PocketBuilder; import cpw.mods.fml.common.registry.GameRegistry; diff --git a/StevenDimDoors/mod_pocketDim/ticking/CommonTickHandler.java b/StevenDimDoors/mod_pocketDim/ticking/CommonTickHandler.java index a190039..26057b4 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/CommonTickHandler.java +++ b/StevenDimDoors/mod_pocketDim/ticking/CommonTickHandler.java @@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.ticking; import java.util.ArrayList; import java.util.EnumSet; -import StevenDimDoors.mod_pocketDim.DDTeleporter; +import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import cpw.mods.fml.common.ITickHandler; import cpw.mods.fml.common.TickType; diff --git a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index 2fed8ab..71ba77a 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -13,7 +13,7 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.DDTeleporter; +import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.world.LimboProvider; import StevenDimDoors.mod_pocketDim.world.PocketProvider; -- 2.39.5 From 3ce380ad5e108460d241f23890c574a66995554d Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 5 Sep 2013 18:13:05 -0400 Subject: [PATCH 068/544] Fixed Unstable Doors Added code so that the links for Unstable Doors are handled properly by DDTeleporter. Hurray! Also cleaned up some unused imports in the BiomeGen classes and removed the RANDOM_DUNGEON link type - it was meant for the dd-rift command but there is no need for it anymore. --- .../mod_pocketDim/core/DDTeleporter.java | 53 ++++++++++++++++++- .../mod_pocketDim/core/LinkTypes.java | 3 +- .../mod_pocketDim/world/BiomeGenLimbo.java | 3 -- .../mod_pocketDim/world/BiomeGenPocket.java | 2 - 4 files changed, 52 insertions(+), 9 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index f973e38..4ff768b 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -1,5 +1,6 @@ package StevenDimDoors.mod_pocketDim.core; +import java.util.ArrayList; import java.util.Random; import net.minecraft.entity.Entity; @@ -344,8 +345,20 @@ public class DDTeleporter return; } - entity = teleportEntity(entity, link.destination()); - entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); + if (link.linkType() == LinkTypes.RANDOM) + { + Point4D randomDestination = getRandomDestination(); + if (randomDestination != null) + { + entity = teleportEntity(entity, randomDestination); + entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); + } + } + else + { + entity = teleportEntity(entity, link.destination()); + entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); + } } private static boolean initializeDestination(DimLink link, DDProperties properties) @@ -366,9 +379,45 @@ public class DDTeleporter case LinkTypes.POCKET: return PocketBuilder.generateNewPocket(link, properties); case LinkTypes.NORMAL: + case LinkTypes.RANDOM: return true; default: throw new IllegalArgumentException("link has an unrecognized link type."); } } + + private static Point4D getRandomDestination() + { + // Our aim is to return a point near a random link's source + // so that a link of type RANDOM can teleport a player there. + + // Restrictions: + // 1. Ignore links with their source inside a pocket dimension. + // 2. Ignore links with link type RANDOM. + + ArrayList matches = new ArrayList(); + for (NewDimData dimension : PocketManager.getDimensions()) + { + if (!dimension.isPocketDimension()) + { + for (DimLink link : dimension.getAllLinks()) + { + if (link.linkType() != LinkTypes.RANDOM) + { + matches.add(link.source()); + } + } + } + } + + // Pick a random point, if any is available + if (!matches.isEmpty()) + { + return matches.get( random.nextInt(matches.size()) ); + } + else + { + return null; + } + } } diff --git a/StevenDimDoors/mod_pocketDim/core/LinkTypes.java b/StevenDimDoors/mod_pocketDim/core/LinkTypes.java index cce9f9c..9cebd37 100644 --- a/StevenDimDoors/mod_pocketDim/core/LinkTypes.java +++ b/StevenDimDoors/mod_pocketDim/core/LinkTypes.java @@ -5,7 +5,7 @@ public class LinkTypes private LinkTypes() { } public static final int ENUM_MIN = 0; - public static final int ENUM_MAX = 7; + public static final int ENUM_MAX = 6; public static final int CLIENT_SIDE = -1337; @@ -17,5 +17,4 @@ public class LinkTypes public static final int DUNGEON_EXIT = 4; public static final int SAFE_EXIT = 5; public static final int UNSAFE_EXIT = 6; - public static final int RANDOM_DUNGEON = 7; } diff --git a/StevenDimDoors/mod_pocketDim/world/BiomeGenLimbo.java b/StevenDimDoors/mod_pocketDim/world/BiomeGenLimbo.java index 4b8fd1d..b60eabe 100644 --- a/StevenDimDoors/mod_pocketDim/world/BiomeGenLimbo.java +++ b/StevenDimDoors/mod_pocketDim/world/BiomeGenLimbo.java @@ -1,9 +1,6 @@ package StevenDimDoors.mod_pocketDim.world; -import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; -import net.minecraft.entity.monster.EntitySpider; import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.biome.SpawnListEntry; public class BiomeGenLimbo extends BiomeGenBase { diff --git a/StevenDimDoors/mod_pocketDim/world/BiomeGenPocket.java b/StevenDimDoors/mod_pocketDim/world/BiomeGenPocket.java index 3fe0c57..e9dbdb7 100644 --- a/StevenDimDoors/mod_pocketDim/world/BiomeGenPocket.java +++ b/StevenDimDoors/mod_pocketDim/world/BiomeGenPocket.java @@ -1,8 +1,6 @@ package StevenDimDoors.mod_pocketDim.world; -import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.biome.SpawnListEntry; public class BiomeGenPocket extends BiomeGenBase { -- 2.39.5 From 03660699cfe83ae3ca3bd640bf605277274f4898 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 5 Sep 2013 21:03:11 -0400 Subject: [PATCH 069/544] Minor Changes Cleaned up our code related to initializing dimensions. Removed redundant instances of that code and instead created a function: PocketManager.loadDimension() - to centralize all uses of that logic. Added LinkTypes.REVERSE to represent links leading back out of pockets through their entrances. That distinction might prove critical in the future when we support resetting dungeons. --- .../mod_pocketDim/core/DDTeleporter.java | 26 ++++++++++--------- .../mod_pocketDim/core/LinkTypes.java | 3 ++- .../mod_pocketDim/core/PocketManager.java | 17 ++++++++++++ .../dungeon/DungeonSchematic.java | 2 +- .../mod_pocketDim/world/PocketBuilder.java | 24 +++-------------- 5 files changed, 37 insertions(+), 35 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 4ff768b..57c1dcd 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -192,12 +192,7 @@ public class DDTeleporter if (difDest) { // Destination isn't loaded? Then we need to load it. - newWorld = DimensionManager.getWorld(destination.getDimension()); - if (newWorld == null) - { - DimensionManager.initDimension(destination.getDimension()); - newWorld = DimensionManager.getWorld(destination.getDimension()); - } + newWorld = PocketManager.loadDimension(destination.getDimension()); } else { @@ -230,10 +225,10 @@ public class DDTeleporter oldWorld.getPlayerManager().removePlayer(player); newWorld.getPlayerManager().addPlayer(player); - player.theItemInWorldManager.setWorld((WorldServer)newWorld); + player.theItemInWorldManager.setWorld(newWorld); // Synchronize with the server so the client knows what time it is and what it's holding. - player.mcServer.getConfigurationManager().updateTimeAndWeatherForPlayer(player, (WorldServer)newWorld); + player.mcServer.getConfigurationManager().updateTimeAndWeatherForPlayer(player, newWorld); player.mcServer.getConfigurationManager().syncPlayerInventory(player); for(Object potionEffect : player.getActivePotionEffects()) { @@ -304,7 +299,7 @@ public class DDTeleporter DDTeleporter.placeInPortal(entity, newWorld, destination, properties); return entity; } - + /** * Primary function used to teleport the player using doors. Performs numerous null checks, and also generates the destination door/pocket if it has not done so already. * Also ensures correct orientation relative to the door. @@ -347,7 +342,7 @@ public class DDTeleporter if (link.linkType() == LinkTypes.RANDOM) { - Point4D randomDestination = getRandomDestination(); + Point4D randomDestination = prepareRandomDestination(); if (randomDestination != null) { entity = teleportEntity(entity, randomDestination); @@ -364,6 +359,7 @@ public class DDTeleporter private static boolean initializeDestination(DimLink link, DDProperties properties) { //FIXME: Change this later to support rooms that have been wiped and must be regenerated. + //We might need to implement regeneration for REVERSE links as well. if (link.hasDestination()) { return true; @@ -378,7 +374,13 @@ public class DDTeleporter return PocketBuilder.generateNewDungeonPocket(link, properties); case LinkTypes.POCKET: return PocketBuilder.generateNewPocket(link, properties); + case LinkTypes.SAFE_EXIT: + case LinkTypes.DUNGEON_EXIT: + return ; + case LinkTypes.UNSAFE_EXIT: + return ; case LinkTypes.NORMAL: + case LinkTypes.REVERSE: case LinkTypes.RANDOM: return true; default: @@ -386,9 +388,9 @@ public class DDTeleporter } } - private static Point4D getRandomDestination() + private static Point4D prepareRandomDestination() { - // Our aim is to return a point near a random link's source + // Our aim is to return a random link's source point // so that a link of type RANDOM can teleport a player there. // Restrictions: diff --git a/StevenDimDoors/mod_pocketDim/core/LinkTypes.java b/StevenDimDoors/mod_pocketDim/core/LinkTypes.java index 9cebd37..f7424b5 100644 --- a/StevenDimDoors/mod_pocketDim/core/LinkTypes.java +++ b/StevenDimDoors/mod_pocketDim/core/LinkTypes.java @@ -5,7 +5,7 @@ public class LinkTypes private LinkTypes() { } public static final int ENUM_MIN = 0; - public static final int ENUM_MAX = 6; + public static final int ENUM_MAX = 7; public static final int CLIENT_SIDE = -1337; @@ -17,4 +17,5 @@ public class LinkTypes public static final int DUNGEON_EXIT = 4; public static final int SAFE_EXIT = 5; public static final int UNSAFE_EXIT = 6; + public static final int REVERSE = 7; } diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index aa3b549..105843b 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -7,6 +7,7 @@ import java.io.IOException; import java.util.HashMap; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.helpers.Compactor; @@ -281,6 +282,22 @@ public class PocketManager isSaving = false; } } + + public static WorldServer loadDimension(int id) + { + WorldServer world = DimensionManager.getWorld(id); + if (world == null) + { + DimensionManager.initDimension(id); + world = DimensionManager.getWorld(id); + } + else if (world.provider == null) + { + DimensionManager.initDimension(id); + world = DimensionManager.getWorld(id); + } + return world; + } public static NewDimData registerDimension(World world) { diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index d61f64e..e33a455 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -285,7 +285,7 @@ public class DungeonSchematic extends Schematic { private static void createEntranceReverseLink(NewDimData dimension, Point3D pocketCenter, DimLink entryLink) { - DimLink reverseLink = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ(), LinkTypes.NORMAL); + DimLink reverseLink = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ(), LinkTypes.REVERSE); Point4D destination = entryLink.source(); NewDimData prevDim = PocketManager.getDimensionData(destination.getDimension()); prevDim.setDestination(reverseLink, destination.getX(), destination.getY(), destination.getZ()); diff --git a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index d76e9b6..0f2d42f 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -61,17 +61,8 @@ public class PocketBuilder NewDimData dimension = PocketManager.registerPocket(parent, true); //Load a world - World world = DimensionManager.getWorld(dimension.id()); + World world = PocketManager.loadDimension(dimension.id()); - if (world == null) - { - DimensionManager.initDimension(dimension.id()); - world = DimensionManager.getWorld(dimension.id()); - } - if (world != null && world.provider == null) - { - DimensionManager.initDimension(dimension.id()); - } if (world == null || world.provider == null) { System.err.println("Could not initialize dimension for a dungeon!"); @@ -282,17 +273,8 @@ public class PocketBuilder NewDimData dimension = PocketManager.registerPocket(parent, false); //Load a world - World world = DimensionManager.getWorld(dimension.id()); + World world = PocketManager.loadDimension(dimension.id()); - if (world == null) - { - DimensionManager.initDimension(dimension.id()); - world = DimensionManager.getWorld(dimension.id()); - } - if (world != null && world.provider == null) - { - DimensionManager.initDimension(dimension.id()); - } if (world == null || world.provider == null) { System.err.println("Could not initialize dimension for a pocket!"); @@ -305,7 +287,7 @@ public class PocketBuilder int orientation = getDoorOrientation(source, properties); //Place a link leading back out of the pocket - DimLink reverseLink = dimension.createLink(source.getX(), destinationY, source.getZ(), LinkTypes.NORMAL); + DimLink reverseLink = dimension.createLink(source.getX(), destinationY, source.getZ(), LinkTypes.REVERSE); parent.setDestination(reverseLink, source.getX(), source.getY(), source.getZ()); //Build the actual pocket area -- 2.39.5 From b795c411be782e36e5323b96785b9ff890f90e6e Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 5 Sep 2013 22:43:11 -0400 Subject: [PATCH 070/544] Added Support for Missing Link Types Added functions for generating destinations for some link types that we hadn't included yet - player-made exits, trapdoors, and dungeon exits. The player-made and dungeon exits still don't generate anything, but there's a single function where we can write up the code: DDTeleporter.generateSafeExit(). Also added some simple code for listing root dimensions in PocketManager. None of this has been tested yet! --- .../mod_pocketDim/core/DDTeleporter.java | 99 +++++++++++++++---- .../mod_pocketDim/core/PocketManager.java | 17 ++++ 2 files changed, 99 insertions(+), 17 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 57c1dcd..c0d9b37 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -25,6 +25,7 @@ import cpw.mods.fml.common.registry.GameRegistry; public class DDTeleporter { private static final Random random = new Random(); + private static int END_DIMENSION_ID = 1; public static int cooldown = 0; private DDTeleporter() { } @@ -342,7 +343,7 @@ public class DDTeleporter if (link.linkType() == LinkTypes.RANDOM) { - Point4D randomDestination = prepareRandomDestination(); + Point4D randomDestination = getRandomDestination(); if (randomDestination != null) { entity = teleportEntity(entity, randomDestination); @@ -358,16 +359,16 @@ public class DDTeleporter private static boolean initializeDestination(DimLink link, DDProperties properties) { - //FIXME: Change this later to support rooms that have been wiped and must be regenerated. - //We might need to implement regeneration for REVERSE links as well. + // FIXME: Change this later to support rooms that have been wiped and must be regenerated. + // FIXME: Add code for restoring the destination-side door. + // We might need to implement regeneration for REVERSE links as well. + if (link.hasDestination()) { return true; } - //Check the destination type and respond accordingly - //FIXME: Add missing link types. - //FIXME: Add code for restoring the destination-side door. + // Check the destination type and respond accordingly switch (link.linkType()) { case LinkTypes.DUNGEON: @@ -375,10 +376,11 @@ public class DDTeleporter case LinkTypes.POCKET: return PocketBuilder.generateNewPocket(link, properties); case LinkTypes.SAFE_EXIT: + return generateSafeExit(link, properties); case LinkTypes.DUNGEON_EXIT: - return ; + return generateDungeonExit(link, properties); case LinkTypes.UNSAFE_EXIT: - return ; + return generateUnsafeExit(link); case LinkTypes.NORMAL: case LinkTypes.REVERSE: case LinkTypes.RANDOM: @@ -387,8 +389,8 @@ public class DDTeleporter throw new IllegalArgumentException("link has an unrecognized link type."); } } - - private static Point4D prepareRandomDestination() + + private static Point4D getRandomDestination() { // Our aim is to return a random link's source point // so that a link of type RANDOM can teleport a player there. @@ -397,17 +399,17 @@ public class DDTeleporter // 1. Ignore links with their source inside a pocket dimension. // 2. Ignore links with link type RANDOM. + // Iterate over the root dimensions. Pocket dimensions cannot be roots. + // Don't just pick a random root and a random link within that root + // because we want to have unbiased selection among all links. ArrayList matches = new ArrayList(); - for (NewDimData dimension : PocketManager.getDimensions()) + for (NewDimData dimension : PocketManager.getRootDimensions()) { - if (!dimension.isPocketDimension()) + for (DimLink link : dimension.getAllLinks()) { - for (DimLink link : dimension.getAllLinks()) + if (link.linkType() != LinkTypes.RANDOM) { - if (link.linkType() != LinkTypes.RANDOM) - { - matches.add(link.source()); - } + matches.add(link.source()); } } } @@ -422,4 +424,67 @@ public class DDTeleporter return null; } } + + private static boolean generateUnsafeExit(DimLink link) + { + // An unsafe exit teleports the user to exactly the same coordinates + // as the link source, except located at the dimension's root dimension. + // This is very risky, as we make no effort to clear an air pocket or + // place a platform at the destination. We also don't place a reverse + // link at the destination, so it's a one-way trip. Good luck! + + // To avoid loops, don't generate a destination if the player is + // already in a non-pocket dimension. + + NewDimData current = PocketManager.getDimensionData(link.source.getDimension()); + if (current.isPocketDimension()) + { + Point4D source = link.source(); + current.root().setDestination(link, source.getX(), source.getY(), source.getZ()); + return true; + } + else + { + return false; + } + } + + private static boolean generateSafeExit(DimLink link, DDProperties properties) + { + NewDimData current = PocketManager.getDimensionData(link.source.getDimension()); + return generateSafeExit(current.root(), link, properties); + } + + private static boolean generateDungeonExit(DimLink link, DDProperties properties) + { + // A dungeon exit acts the same as a safe exit, but has the chance of + // taking the user to any non-pocket dimension, excluding Limbo and The End. + + ArrayList roots = PocketManager.getRootDimensions(); + for (int attempts = 0; attempts < 10; attempts++) + { + NewDimData selection = roots.get( random.nextInt(roots.size()) ); + if (selection.id() != END_DIMENSION_ID && selection.id() != properties.LimboDimensionID) + { + return generateSafeExit(selection, link, properties); + } + } + return false; + } + + private static boolean generateSafeExit(NewDimData target, DimLink link, DDProperties properties) + { + // A safe exit attempts to place a Warp Door in a dimension with + // some precautions to protect the player. The X and Z coordinates + // are fixed to match the source, but the Y coordinate is chosen by + // searching for a safe location to place the door. The direction of + // the vertical search is away from the map boundary closest to + // the source Y. In other words, if a player is really high up, the + // search proceeds down. If a player is near the bottom of the map, + // the search proceeds up. If a safe destination cannot be found, + // then we return false and the source-side door slams shut. + + // FIXME: Add code here! + return false; + } } diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 105843b..eda8947 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -4,6 +4,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import net.minecraft.world.World; @@ -97,6 +98,7 @@ public class PocketManager private static volatile boolean isSaving = false; private static final UpdateWatcherProxy linkWatcher = new UpdateWatcherProxy(); private static final UpdateWatcherProxy dimWatcher = new UpdateWatcherProxy(); + private static ArrayList rootDimensions = null; //HashMap that maps all the dimension IDs registered with DimDoors to their DD data. private static HashMap dimensionData = null; @@ -123,6 +125,7 @@ public class PocketManager isLoading = true; dimensionData = new HashMap(); + rootDimensions = new ArrayList(); //Register Limbo DDProperties properties = DDProperties.instance(); @@ -326,6 +329,10 @@ public class PocketManager InnerDimData dimension = new InnerDimData(dimensionID, parent, isPocket, isDungeon, linkWatcher); dimensionData.put(dimensionID, dimension); + if (!dimension.isPocketDimension()) + { + rootDimensions.add(dimension); + } dimWatcher.onCreated(new ClientDimData(dimension)); return dimension; @@ -336,6 +343,9 @@ public class PocketManager // No need to raise events here since this code should only run on the client side // getDimensionData() always handles root dimensions properly, even if the weren't defined before + // SenseiKiwi: I'm a little worried about how getDimensionData will raise + // an event when it creates any root dimensions... Needs checking later. + InnerDimData root = (InnerDimData) getDimensionData(rootID); InnerDimData dimension; @@ -381,6 +391,12 @@ public class PocketManager return dimensionData.values(); } + @SuppressWarnings("unchecked") + public static ArrayList getRootDimensions() + { + return (ArrayList) rootDimensions.clone(); + } + public static void unload() { if (!isLoaded) @@ -391,6 +407,7 @@ public class PocketManager save(); unregisterPockets(); dimensionData = null; + rootDimensions = null; isLoaded = false; } -- 2.39.5 From 6512327ee8d28c150e288345df33e299df9a0d63 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Fri, 6 Sep 2013 02:07:47 -0400 Subject: [PATCH 071/544] Cleaned up door code More to come, but this helps a little. Should make changing dim door behavior much easier. --- .../mod_pocketDim/blocks/DDoorBase.java | 537 ++++++++++++++++++ .../mod_pocketDim/blocks/DimensionalDoor.java | 482 +--------------- .../mod_pocketDim/blocks/IDDoorLogic.java | 13 + .../mod_pocketDim/blocks/TransientDoor.java | 63 +- .../mod_pocketDim/blocks/UnstableDoor.java | 42 +- .../mod_pocketDim/blocks/WarpDoor.java | 42 +- .../tileentities/TileEntityDimDoor.java | 11 + 7 files changed, 615 insertions(+), 575 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/blocks/DDoorBase.java create mode 100644 StevenDimDoors/mod_pocketDim/blocks/IDDoorLogic.java diff --git a/StevenDimDoors/mod_pocketDim/blocks/DDoorBase.java b/StevenDimDoors/mod_pocketDim/blocks/DDoorBase.java new file mode 100644 index 0000000..e6f4be6 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/blocks/DDoorBase.java @@ -0,0 +1,537 @@ +package StevenDimDoors.mod_pocketDim.blocks; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Icon; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.DDTeleporter; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class DDoorBase extends BlockContainer implements IDDoorLogic +{ + protected static DDProperties properties = null; + private Icon blockIconBottom; + + public DDoorBase(int par1, Material material) + { + super(par1, material); + + if (properties == null) + properties = DDProperties.instance(); + } + + public void registerIcons(IconRegister par1IconRegister) + { + this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); + this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); + } + + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) + { + this.enterDimDoor(world, x, y, z, entity); + } + + public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) + { + + boolean shouldOpen=true; + + //System.out.println(String.valueOf(par1World.getBlockMetadata(par2, par3, par4))); + if(par5EntityPlayer.inventory.getCurrentItem()!=null) + { + if(par5EntityPlayer.inventory.getCurrentItem().getItem() == mod_pocketDim.itemRiftBlade) + { + shouldOpen = false; + if (!par1World.isRemote && par1World.getBlockId(par2, par3-1, par4) == this.blockID) + { + int var12 = (int) (MathHelper.floor_double((double)((par5EntityPlayer.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); + + if (par1World.getBlockMetadata(par2, par3-1, par4) == var12) + { + var12 = BlockRotator.transformMetadata(var12, 1, this.blockID); + } + par1World.setBlockMetadataWithNotify(par2, par3-1, par4, var12, 2); + } + if (!par1World.isRemote && par1World.getBlockId(par2, par3+1, par4) == this.blockID) + { + int var12 = (int) (MathHelper.floor_double((double)((par5EntityPlayer.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); + if(par1World.getBlockMetadata(par2, par3, par4)==var12) + { + var12 = BlockRotator.transformMetadata(var12, 1, this.blockID); + } + par1World.setBlockMetadataWithNotify(par2, par3, par4, var12, 2); + } + par1World.playAuxSFXAtEntity(par5EntityPlayer, 1001, par2, par3, par4, 0); + + if (!shouldOpen && !par1World.isRemote) + { + par5EntityPlayer.inventory.getCurrentItem().damageItem(5, par5EntityPlayer); + } + } + } + + if(shouldOpen) + { + int var10 = this.getFullMetadata(par1World, par2, par3, par4); + int var11 = var10 & 7; + var11 ^= 4; + + if ((var10 & 8) == 0) + { + par1World.setBlockMetadataWithNotify(par2, par3, par4, var11,2); + par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4); + } + else + { + par1World.setBlockMetadataWithNotify(par2, par3 - 1, par4, var11,2); + par1World.markBlockRangeForRenderUpdate(par2, par3 - 1, par4, par2, par3, par4); + } + + par1World.playAuxSFXAtEntity(par5EntityPlayer, 1003, par2, par3, par4, 0); + return true; + } + else + { + return false; + } + + } + + /** + * A function to open a door. + */ + public void onPoweredBlockChange(World par1World, int par2, int par3, int par4, boolean par5) + { + int var6 = this.getFullMetadata(par1World, par2, par3, par4); + boolean var7 = (var6 & 4) != 0; + + if (var7 != par5) + { + int var8 = var6 & 7; + var8 ^= 4; + + if ((var6 & 8) == 0) + { + par1World.setBlockMetadataWithNotify(par2, par3, par4, var8,2); + par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4); + } + else + { + par1World.setBlockMetadataWithNotify(par2, par3 - 1, par4, var8,2); + par1World.markBlockRangeForRenderUpdate(par2, par3 - 1, par4, par2, par3, par4); + } + + par1World.playAuxSFXAtEntity((EntityPlayer)null, 1003, par2, par3, par4, 0); + } + } + + @Override + public void onBlockAdded(World world, int x, int y, int z) + { + //FIXME: We need to set door generation flags on the tile entities. Ignoring that for now. ~SenseiKiwi + + this.placeDimDoor(world, x, y, z); + world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); + this.updateAttachedTile(world, x, y, z); + } + + @SideOnly(Side.CLIENT) + + /** + * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side + */ + public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) + { + if(par1IBlockAccess.getBlockId(par2, par3-1, par4) == this.blockID) + { + return this.blockIcon; + } + else + { + return blockIconBottom; + } + } + + //Called to update the render information on the tile entity. Could probably implement a data watcher, + //but this works fine and is more versatile I think. + public DDoorBase updateAttachedTile(World world, int x, int y, int z) + { + TileEntity tile = world.getBlockTileEntity(x, y, z); + if (tile instanceof TileEntityDimDoor) + { + TileEntityDimDoor dimTile = (TileEntityDimDoor) tile; + dimTile.openOrClosed = PocketManager.getLink(x, y, z, world.provider.dimensionId) != null; + dimTile.orientation = this.getFullMetadata(world, x, y, z) & 7; + } + return this; + } + + /** + * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two + * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. + */ + public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) + { + TileEntityDimDoor tile = (TileEntityDimDoor) par1World.getBlockTileEntity(par2, par3, par4); + tile.openOrClosed = this.isDoorOpen( par1World, par2, par3, par4); + tile.orientation = this.getFullMetadata(par1World, par2, par3, par4) & 7; + } + + public boolean isOpaqueCube() + { + return false; + } + + public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) + { + int var5 = this.getFullMetadata(par1IBlockAccess, par2, par3, par4); + return (var5 & 4) != 0; + } + + /** + * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) + */ + public boolean renderAsNormalBlock() + { + return false; + } + + /** + * The type of render function that is called for this block + */ + public int getRenderType() + { + return 7; + } + + @SideOnly(Side.CLIENT) + + /** + * Returns the bounding box of the wired rectangular prism to render. + */ + public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4) + { + this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); + return super.getSelectedBoundingBoxFromPool(par1World, par2, par3, par4); + } + + /** + * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been + * cleared to be reused) + */ + public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) + { + this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); + return super.getCollisionBoundingBoxFromPool(par1World, par2, par3, par4); + } + + /** + * Updates the blocks bounds based on its current state. Args: world, x, y, z + */ + public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) + { + this.setDoorRotation(this.getFullMetadata(par1IBlockAccess, par2, par3, par4)); + } + + /** + * Returns 0, 1, 2 or 3 depending on where the hinge is. + */ + public int getDoorOrientation(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) + { + return this.getFullMetadata(par1IBlockAccess, par2, par3, par4) & 3; + } + + public boolean isDoorOpen(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) + { + return (this.getFullMetadata(par1IBlockAccess, par2, par3, par4) & 4) != 0; + } + + private void setDoorRotation(int par1) + { + float var2 = 0.1875F; + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F); + int var3 = par1 & 3; + boolean var4 = (par1 & 4) != 0; + boolean var5 = (par1 & 16) != 0; + + if (var3 == 0) + { + if (var4) + { + if (!var5) + { + this.setBlockBounds(0.001F, 0.0F, 0.0F, 1.0F, 1.0F, var2); + } + else + { + this.setBlockBounds(0.001F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F); + } + } + else + { + this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 1.0F); + } + } + else if (var3 == 1) + { + if (var4) + { + if (!var5) + { + this.setBlockBounds(1.0F - var2, 0.0F, 0.001F, 1.0F, 1.0F, 1.0F); + } + else + { + this.setBlockBounds(0.0F, 0.0F, 0.001F, var2, 1.0F, 1.0F); + } + } + else + { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var2); + } + } + else if (var3 == 2) + { + if (var4) + { + if (!var5) + { + this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, .99F, 1.0F, 1.0F); + } + else + { + this.setBlockBounds(0.0F, 0.0F, 0.0F, .99F, 1.0F, var2); + } + } + else + { + this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + } + else if (var3 == 3) + { + if (var4) + { + if (!var5) + { + this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 0.99F); + } + else + { + this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 0.99F); + } + } + else + { + this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F); + } + } + } + + /** + * Called when the block is clicked by a player. Args: x, y, z, entityPlayer + */ + public void onBlockClicked(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer) + { + // System.out.println(this.getFullMetadata(par1World, par2, par3, par4)%4); + } + + /** + * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are + * their own) Args: x, y, z, neighbor blockID + */ + public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) + { + int var6 = par1World.getBlockMetadata(par2, par3, par4); + + if ((var6 & 8) == 0) + { + boolean var7 = false; + + if (par1World.getBlockId(par2, par3 + 1, par4) != this.blockID) + { + par1World.setBlock(par2, par3, par4, 0); + var7 = true; + } + + /** + if (!par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4)) + { + par1World.setBlockWithNotify(par2, par3, par4, 0); + var7 = true; + + if (par1World.getBlockId(par2, par3 + 1, par4) == this.blockID) + { + par1World.setBlockWithNotify(par2, par3 + 1, par4, 0); + } + } + **/ + + if (var7) + { + if (!par1World.isRemote) + { + this.dropBlockAsItem(par1World, par2, par3, par4, properties.DimensionalDoorID, 0); + } + } + else + { + boolean var8 = par1World.isBlockIndirectlyGettingPowered(par2, par3, par4) || par1World.isBlockIndirectlyGettingPowered(par2, par3 + 1, par4); + + if ((var8 || par5 > 0 && Block.blocksList[par5].canProvidePower()) && par5 != this.blockID) + { + this.onPoweredBlockChange(par1World, par2, par3, par4, var8); + } + } + } + else + { + if (par1World.getBlockId(par2, par3 - 1, par4) != this.blockID) + { + par1World.setBlock(par2, par3, par4, 0); + } + + if (par5 > 0 && par5 != this.blockID) + { + this.onNeighborBlockChange(par1World, par2, par3 - 1, par4, par5); + } + } + } + + /** + * Ray traces through the blocks collision from start vector to end vector returning a ray trace hit. Args: world, + * x, y, z, startVec, endVec + */ + public MovingObjectPosition collisionRayTrace(World par1World, int par2, int par3, int par4, Vec3 par5Vec3, Vec3 par6Vec3) + { + this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); + return super.collisionRayTrace(par1World, par2, par3, par4, par5Vec3, par6Vec3); + } + + /** + * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z + */ + public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) + { + return par3 >= 255 ? false : par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) && super.canPlaceBlockAt(par1World, par2, par3, par4) && super.canPlaceBlockAt(par1World, par2, par3 + 1, par4); + } + + /** + * Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility + * and stop pistons + */ + public int getMobilityFlag() + { + return 2; + } + + /** + * Returns the full metadata value created by combining the metadata of both blocks the door takes up. + */ + public int getFullMetadata(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) + { + int var5 = par1IBlockAccess.getBlockMetadata(par2, par3, par4); + boolean var6 = (var5 & 8) != 0; + int var7; + int var8; + + if (var6) + { + var7 = par1IBlockAccess.getBlockMetadata(par2, par3 - 1, par4); + var8 = var5; + } + else + { + var7 = var5; + var8 = par1IBlockAccess.getBlockMetadata(par2, par3 + 1, par4); + } + + boolean var9 = (var8 & 1) != 0; + return var7 & 7 | (var6 ? 8 : 0) | (var9 ? 16 : 0); + } + + @SideOnly(Side.CLIENT) + /** + * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative) + */ + public int idPicked(World par1World, int par2, int par3, int par4) + { + return this.blockID; + } + + public int idDropped(int par1, Random par2Random, int par3) + { + return (par1 & 8) != 0 ? 0 : (getDrops()); + } + + /** + * Called when the block is attempted to be harvested + */ + public void onBlockHarvested(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer) + { + if (par6EntityPlayer.capabilities.isCreativeMode && (par5 & 8) != 0 && par1World.getBlockId(par2, par3 - 1, par4) == this.blockID) + { + par1World.setBlock(par2, par3 - 1, par4, 0); + } + } + + @Override + public TileEntity createNewTileEntity(World world) + { + TileEntity tile = new TileEntityDimDoor(); + return tile; + } + + @Override + public void enterDimDoor(World world, int x, int y, int z, Entity entity) + { + int var12 = (int) (MathHelper.floor_double((double) ((entity.rotationYaw + 90) * 4.0F / 360.0F) + 0.5D) & 3); + + int orientation = world.getBlockMetadata(x, y - 1, z); + if (!world.isRemote && (orientation >= 4 && orientation <= 7) && (orientation - 4) == var12 && + world.getBlockId(x, y - 1, z) == this.blockID) + { + this.onPoweredBlockChange(world, x, y, z, false); + + DimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); + if (link != null) + { + DDTeleporter.traverseDimDoor(world, link, entity); + } + } + } + + @Override + public void placeDimDoor(World world, int x, int y, int z) + { + // TODO Auto-generated method stub + } + @Override + public int getDrops() + { + return this.blockID; + } +} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java index 83b64f4..b2ba41c 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java @@ -29,144 +29,18 @@ import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class DimensionalDoor extends BlockContainer +public class DimensionalDoor extends DDoorBase implements IDDoorLogic { - protected static DDProperties properties = null; - private Icon blockIconBottom; - + public DimensionalDoor(int par1, Material material) { super(par1, material); - - if (properties == null) - properties = DDProperties.instance(); - } - - public void registerIcons(IconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); - this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); + // TODO Auto-generated constructor stub } @Override - public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) + public void placeDimDoor(World world, int x, int y, int z) { - //TODO: Would it kill us to use REASONABLE variable names? <_< ~SenseiKiwi - int var12 = (int) (MathHelper.floor_double((double) ((entity.rotationYaw + 90) * 4.0F / 360.0F) + 0.5D) & 3); - - int orientation = world.getBlockMetadata(x, y - 1, z); - if (!world.isRemote && (orientation >= 4 && orientation <= 7) && (orientation - 4) == var12 && - world.getBlockId(x, y - 1, z) == this.blockID) - { - this.onPoweredBlockChange(world, x, y, z, false); - - DimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); - if (link != null) - { - DDTeleporter.traverseDimDoor(world, link, entity); - } - } - } - - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) - { - - boolean shouldOpen=true; - - //System.out.println(String.valueOf(par1World.getBlockMetadata(par2, par3, par4))); - if(par5EntityPlayer.inventory.getCurrentItem()!=null) - { - if(par5EntityPlayer.inventory.getCurrentItem().getItem() == mod_pocketDim.itemRiftBlade) - { - shouldOpen = false; - if (!par1World.isRemote && par1World.getBlockId(par2, par3-1, par4) == this.blockID) - { - int var12 = (int) (MathHelper.floor_double((double)((par5EntityPlayer.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); - - if (par1World.getBlockMetadata(par2, par3-1, par4) == var12) - { - var12 = BlockRotator.transformMetadata(var12, 1, this.blockID); - } - par1World.setBlockMetadataWithNotify(par2, par3-1, par4, var12, 2); - } - if (!par1World.isRemote && par1World.getBlockId(par2, par3+1, par4) == this.blockID) - { - int var12 = (int) (MathHelper.floor_double((double)((par5EntityPlayer.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); - if(par1World.getBlockMetadata(par2, par3, par4)==var12) - { - var12 = BlockRotator.transformMetadata(var12, 1, this.blockID); - } - par1World.setBlockMetadataWithNotify(par2, par3, par4, var12, 2); - } - par1World.playAuxSFXAtEntity(par5EntityPlayer, 1001, par2, par3, par4, 0); - - if (!shouldOpen && !par1World.isRemote) - { - par5EntityPlayer.inventory.getCurrentItem().damageItem(5, par5EntityPlayer); - } - } - } - - if(shouldOpen) - { - int var10 = this.getFullMetadata(par1World, par2, par3, par4); - int var11 = var10 & 7; - var11 ^= 4; - - if ((var10 & 8) == 0) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, var11,2); - par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4); - } - else - { - par1World.setBlockMetadataWithNotify(par2, par3 - 1, par4, var11,2); - par1World.markBlockRangeForRenderUpdate(par2, par3 - 1, par4, par2, par3, par4); - } - - par1World.playAuxSFXAtEntity(par5EntityPlayer, 1003, par2, par3, par4, 0); - return true; - } - else - { - return false; - } - - } - - /** - * A function to open a door. - */ - public void onPoweredBlockChange(World par1World, int par2, int par3, int par4, boolean par5) - { - int var6 = this.getFullMetadata(par1World, par2, par3, par4); - boolean var7 = (var6 & 4) != 0; - - if (var7 != par5) - { - int var8 = var6 & 7; - var8 ^= 4; - - if ((var6 & 8) == 0) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, var8,2); - par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4); - } - else - { - par1World.setBlockMetadataWithNotify(par2, par3 - 1, par4, var8,2); - par1World.markBlockRangeForRenderUpdate(par2, par3 - 1, par4, par2, par3, par4); - } - - par1World.playAuxSFXAtEntity((EntityPlayer)null, 1003, par2, par3, par4, 0); - } - } - - @Override - public void onBlockAdded(World world, int x, int y, int z) - { - //FIXME: We need to set door generation flags on the tile entities. Ignoring that for now. ~SenseiKiwi - if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) { NewDimData dimension = PocketManager.getDimensionData(world); @@ -176,353 +50,11 @@ public class DimensionalDoor extends BlockContainer dimension.createLink(x, y, z, LinkTypes.POCKET); } } - world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); + } - - @SideOnly(Side.CLIENT) - - /** - * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side - */ - public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) - { - if(par1IBlockAccess.getBlockId(par2, par3-1, par4) == this.blockID) - { - return this.blockIcon; - } - else - { - return blockIconBottom; - } - } - - //Called to update the render information on the tile entity. Could probably implement a data watcher, - //but this works fine and is more versatile I think. - public DimensionalDoor updateAttachedTile(World world, int x, int y, int z) - { - TileEntity tile = world.getBlockTileEntity(x, y, z); - if (tile instanceof TileEntityDimDoor) - { - TileEntityDimDoor dimTile = (TileEntityDimDoor) tile; - dimTile.openOrClosed = PocketManager.getLink(x, y, z, world.provider.dimensionId) != null; - dimTile.orientation = this.getFullMetadata(world, x, y, z) & 7; - } - return this; - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) - { - TileEntityDimDoor tile = (TileEntityDimDoor) par1World.getBlockTileEntity(par2, par3, par4); - tile.openOrClosed = this.isDoorOpen( par1World, par2, par3, par4); - tile.orientation = this.getFullMetadata(par1World, par2, par3, par4) & 7; - } - - public boolean isOpaqueCube() - { - return false; - } - - public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - int var5 = this.getFullMetadata(par1IBlockAccess, par2, par3, par4); - return (var5 & 4) != 0; - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - public boolean renderAsNormalBlock() - { - return false; - } - - /** - * The type of render function that is called for this block - */ - public int getRenderType() - { - return 7; - } - - @SideOnly(Side.CLIENT) - - /** - * Returns the bounding box of the wired rectangular prism to render. - */ - public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4) - { - this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); - return super.getSelectedBoundingBoxFromPool(par1World, par2, par3, par4); - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) - { - this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); - return super.getCollisionBoundingBoxFromPool(par1World, par2, par3, par4); - } - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - this.setDoorRotation(this.getFullMetadata(par1IBlockAccess, par2, par3, par4)); - } - - /** - * Returns 0, 1, 2 or 3 depending on where the hinge is. - */ - public int getDoorOrientation(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - return this.getFullMetadata(par1IBlockAccess, par2, par3, par4) & 3; - } - - public boolean isDoorOpen(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - return (this.getFullMetadata(par1IBlockAccess, par2, par3, par4) & 4) != 0; - } - - private void setDoorRotation(int par1) - { - float var2 = 0.1875F; - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F); - int var3 = par1 & 3; - boolean var4 = (par1 & 4) != 0; - boolean var5 = (par1 & 16) != 0; - - if (var3 == 0) - { - if (var4) - { - if (!var5) - { - this.setBlockBounds(0.001F, 0.0F, 0.0F, 1.0F, 1.0F, var2); - } - else - { - this.setBlockBounds(0.001F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F); - } - } - else - { - this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 1.0F); - } - } - else if (var3 == 1) - { - if (var4) - { - if (!var5) - { - this.setBlockBounds(1.0F - var2, 0.0F, 0.001F, 1.0F, 1.0F, 1.0F); - } - else - { - this.setBlockBounds(0.0F, 0.0F, 0.001F, var2, 1.0F, 1.0F); - } - } - else - { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var2); - } - } - else if (var3 == 2) - { - if (var4) - { - if (!var5) - { - this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, .99F, 1.0F, 1.0F); - } - else - { - this.setBlockBounds(0.0F, 0.0F, 0.0F, .99F, 1.0F, var2); - } - } - else - { - this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - } - else if (var3 == 3) - { - if (var4) - { - if (!var5) - { - this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 0.99F); - } - else - { - this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 0.99F); - } - } - else - { - this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F); - } - } - } - - /** - * Called when the block is clicked by a player. Args: x, y, z, entityPlayer - */ - public void onBlockClicked(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer) - { - // System.out.println(this.getFullMetadata(par1World, par2, par3, par4)%4); - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor blockID - */ - public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) - { - int var6 = par1World.getBlockMetadata(par2, par3, par4); - - if ((var6 & 8) == 0) - { - boolean var7 = false; - - if (par1World.getBlockId(par2, par3 + 1, par4) != this.blockID) - { - par1World.setBlock(par2, par3, par4, 0); - var7 = true; - } - - /** - if (!par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4)) - { - par1World.setBlockWithNotify(par2, par3, par4, 0); - var7 = true; - - if (par1World.getBlockId(par2, par3 + 1, par4) == this.blockID) - { - par1World.setBlockWithNotify(par2, par3 + 1, par4, 0); - } - } - **/ - - if (var7) - { - if (!par1World.isRemote) - { - this.dropBlockAsItem(par1World, par2, par3, par4, properties.DimensionalDoorID, 0); - } - } - else - { - boolean var8 = par1World.isBlockIndirectlyGettingPowered(par2, par3, par4) || par1World.isBlockIndirectlyGettingPowered(par2, par3 + 1, par4); - - if ((var8 || par5 > 0 && Block.blocksList[par5].canProvidePower()) && par5 != this.blockID) - { - this.onPoweredBlockChange(par1World, par2, par3, par4, var8); - } - } - } - else - { - if (par1World.getBlockId(par2, par3 - 1, par4) != this.blockID) - { - par1World.setBlock(par2, par3, par4, 0); - } - - if (par5 > 0 && par5 != this.blockID) - { - this.onNeighborBlockChange(par1World, par2, par3 - 1, par4, par5); - } - } - } - - /** - * Ray traces through the blocks collision from start vector to end vector returning a ray trace hit. Args: world, - * x, y, z, startVec, endVec - */ - public MovingObjectPosition collisionRayTrace(World par1World, int par2, int par3, int par4, Vec3 par5Vec3, Vec3 par6Vec3) - { - this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); - return super.collisionRayTrace(par1World, par2, par3, par4, par5Vec3, par6Vec3); - } - - /** - * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { - return par3 >= 255 ? false : par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) && super.canPlaceBlockAt(par1World, par2, par3, par4) && super.canPlaceBlockAt(par1World, par2, par3 + 1, par4); - } - - /** - * Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility - * and stop pistons - */ - public int getMobilityFlag() - { - return 2; - } - - /** - * Returns the full metadata value created by combining the metadata of both blocks the door takes up. - */ - public int getFullMetadata(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - int var5 = par1IBlockAccess.getBlockMetadata(par2, par3, par4); - boolean var6 = (var5 & 8) != 0; - int var7; - int var8; - - if (var6) - { - var7 = par1IBlockAccess.getBlockMetadata(par2, par3 - 1, par4); - var8 = var5; - } - else - { - var7 = var5; - var8 = par1IBlockAccess.getBlockMetadata(par2, par3 + 1, par4); - } - - boolean var9 = (var8 & 1) != 0; - return var7 & 7 | (var6 ? 8 : 0) | (var9 ? 16 : 0); - } - - @SideOnly(Side.CLIENT) - /** - * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative) - */ - public int idPicked(World par1World, int par2, int par3, int par4) + @Override + public int getDrops() { return Item.doorIron.itemID; } - - public int idDropped(int par1, Random par2Random, int par3) - { - return (par1 & 8) != 0 ? 0 : (Item.doorIron.itemID); - } - - /** - * Called when the block is attempted to be harvested - */ - public void onBlockHarvested(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer) - { - if (par6EntityPlayer.capabilities.isCreativeMode && (par5 & 8) != 0 && par1World.getBlockId(par2, par3 - 1, par4) == this.blockID) - { - par1World.setBlock(par2, par3 - 1, par4, 0); - } - } - - @Override - public TileEntity createNewTileEntity(World world) - { - TileEntity tile = new TileEntityDimDoor(); - return tile; - } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/IDDoorLogic.java b/StevenDimDoors/mod_pocketDim/blocks/IDDoorLogic.java new file mode 100644 index 0000000..6d459ed --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/blocks/IDDoorLogic.java @@ -0,0 +1,13 @@ +package StevenDimDoors.mod_pocketDim.blocks; + +import net.minecraft.entity.Entity; +import net.minecraft.world.World; + +public interface IDDoorLogic +{ + public void enterDimDoor(World world, int x, int y, int z, Entity entity); + + public void placeDimDoor(World world, int x, int y, int z); + + public int getDrops(); +} diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java index cc847cc..d9b00d4 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java @@ -13,49 +13,21 @@ import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; +import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class TransientDoor extends WarpDoor +public class TransientDoor extends DDoorBase implements IDDoorLogic { public TransientDoor(int blockID, Material material) { super(blockID, material); } - - public void registerIcons(IconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); - } - - /** - * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side - */ - @SideOnly(Side.CLIENT) - public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) - { - return this.blockIcon; - } - public boolean isCollidable() - { - return false; - } - - public void onBlockAdded(World par1World, int par2, int par3, int par4) - { - super.onBlockAdded(par1World, par2, par3, par4); - this.updateAttachedTile(par1World, par2, par3, par4); - } - - public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) - { - return null; - } - @Override - public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) + public void enterDimDoor(World world, int x, int y, int z, Entity entity) { //TODO: Would it kill us to use REASONABLE variable names? <_< ~SenseiKiwi int var12 = (int) (MathHelper.floor_double((double) ((entity.rotationYaw + 90) * 4.0F / 360.0F) + 0.5D) & 3); @@ -73,16 +45,35 @@ public class TransientDoor extends WarpDoor world.setBlockToAir(x, y - 1, z); } } + } + + @Override + public void placeDimDoor(World world, int x, int y, int z) + { + if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) + { + NewDimData dimension = PocketManager.getDimensionData(world); + DimLink link = dimension.getLink(x, y, z); + if (link == null&&dimension.isPocketDimension()) + { + dimension.createLink(x, y, z, LinkTypes.SAFE_EXIT); + } + } + } + @Override + public int getDrops() + { + return 0; } - public int idPicked(World par1World, int par2, int par3, int par4) + public boolean isCollidable() { - return 0; + return false; } - public int idDropped(int par1, Random par2Random, int par3) + public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) { - return 0; + return null; } public int getRenderType() diff --git a/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java index c4875ed..155520c 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java @@ -2,54 +2,31 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.item.Item; import net.minecraft.util.Icon; +import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.DDTeleporter; +import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class UnstableDoor extends DimensionalDoor +public class UnstableDoor extends DDoorBase implements IDDoorLogic { - private Icon blockIconBottom; - private static DDProperties properties = null; - public UnstableDoor(int par1, Material material) { super(par1, material); - if (properties == null) - properties = DDProperties.instance(); - } - - public void registerIcons(IconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); - this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); - } - - @SideOnly(Side.CLIENT) - - /** - * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side - */ - public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) - { - if (par1IBlockAccess.getBlockId(par2, par3 - 1, par4) == this.blockID) - { - return this.blockIcon; - } - else - { - return this.blockIconBottom; - } } @Override - public void onBlockAdded(World world, int x, int y, int z) + public void placeDimDoor(World world, int x, int y, int z) { if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) { @@ -57,4 +34,9 @@ public class UnstableDoor extends DimensionalDoor dimension.createLink(x, y, z, LinkTypes.RANDOM); } } + @Override + public int getDrops() + { + return Item.doorIron.itemID; + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java index 445d8d9..960fc33 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java @@ -4,6 +4,7 @@ import java.util.Random; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.Entity; import net.minecraft.item.Item; import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; @@ -16,7 +17,7 @@ import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class WarpDoor extends DimensionalDoor +public class WarpDoor extends DDoorBase implements IDDoorLogic { private Icon blockIconBottom; @@ -25,52 +26,25 @@ public class WarpDoor extends DimensionalDoor super(blockID, material); } - public void registerIcons(IconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); - this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); - } - @Override - public void onBlockAdded(World world, int x, int y, int z) + public void placeDimDoor(World world, int x, int y, int z) { - //FIXME: We need to set door generation flags on the tile entities. Ignoring that for now. ~SenseiKiwi - if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) { NewDimData dimension = PocketManager.getDimensionData(world); DimLink link = dimension.getLink(x, y, z); - if (link == null) + if (link == null&&dimension.isPocketDimension()) { dimension.createLink(x, y, z, LinkTypes.SAFE_EXIT); } } - world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); } - - @SideOnly(Side.CLIENT) - /** - * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side - */ - public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) - { - if(par1IBlockAccess.getBlockId(par2, par3-1, par4)==this.blockID) - { - return this.blockIcon; - } - else - { - return this.blockIconBottom; - } - } - - public int idPicked(World par1World, int par2, int par3, int par4) + + @Override + public int getDrops() { return Item.doorWood.itemID; } - public int idDropped(int par1, Random par2Random, int par3) - { - return (par1 & 8) != 0 ? 0 : (Item.doorWood.itemID); - } + } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java index 9f27d4e..4d49cf3 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java @@ -1,7 +1,10 @@ package StevenDimDoors.mod_pocketDim.tileentities; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.PocketManager; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; public class TileEntityDimDoor extends TileEntity @@ -13,6 +16,14 @@ public class TileEntityDimDoor extends TileEntity + public boolean shouldRefresh(int oldID, int newID, int oldMeta, int newMeta, World world, int x, int y, int z) + { + if(newID==0&&PocketManager.getLink(x, y, z, world)!=null) + { + world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); + } + return true; + } public boolean canUpdate() { -- 2.39.5 From cff13e9bb5649d8d2cd6c21c5fc69c4790db99f8 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Fri, 6 Sep 2013 15:36:12 -0400 Subject: [PATCH 072/544] Changed limbo trips to never kill the player Solves the player not getting inventory back, especially for special slots. --- .../mod_pocketDim/EventHookContainer.java | 29 ++++++++++++-- .../mod_pocketDim/PlayerRespawnTracker.java | 38 ++----------------- .../mod_pocketDim/blocks/DDoorBase.java | 2 +- .../mod_pocketDim/util/Point4D.java | 7 ++++ .../mod_pocketDim/world/LimboProvider.java | 14 +++++-- 5 files changed, 46 insertions(+), 44 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 2e2756d..5a7f80d 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -1,12 +1,25 @@ package StevenDimDoors.mod_pocketDim; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.DamageSource; import net.minecraftforge.client.event.sound.SoundLoadEvent; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.EventPriority; import net.minecraftforge.event.ForgeSubscribe; +import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.entity.player.PlayerDropsEvent; import net.minecraftforge.event.world.WorldEvent; +import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator; +import StevenDimDoors.mod_pocketDim.util.Point4D; +import StevenDimDoors.mod_pocketDim.world.LimboProvider; +import StevenDimDoors.mod_pocketDim.world.PocketProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -56,11 +69,19 @@ public class EventHookContainer event.setCanceled(event.entity.worldObj.provider.dimensionId == properties.LimboDimensionID); } - @ForgeSubscribe - public void onPlayerDrops(PlayerDropsEvent event) + + @ForgeSubscribe(priority=EventPriority.HIGHEST) + public boolean LivingDeathEvent(LivingDeathEvent event) { - //TODO: I have some doubts. Is this triggered even if you die outside Limbo? And do you still drop items that others could pick up? We don't cancel the event. ~SenseiKiwi - mod_pocketDim.limboSpawnInventory.put(event.entityPlayer.username, event.drops); + Entity entity = event.entity; + if(entity instanceof EntityPlayer&&entity.worldObj.provider instanceof PocketProvider && this.properties.LimboEnabled) + { + ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(entity.worldObj.rand); + DDTeleporter.teleportEntity(entity, new Point4D(coords.posX,coords.posY,coords.posZ,mod_pocketDim.properties.LimboDimensionID)); + ((EntityLiving) entity).setEntityHealth(20); + event.setCanceled(true); + } + return true; } @ForgeSubscribe diff --git a/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java b/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java index d6b34fe..2a4f57e 100644 --- a/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java +++ b/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java @@ -38,42 +38,10 @@ public class PlayerRespawnTracker implements IPlayerTracker } @Override - public void onPlayerRespawn(EntityPlayer player) - { - if(player.worldObj.provider.dimensionId==properties.LimboDimensionID) - { - - if(!player.worldObj.isRemote && properties.LimboReturnsInventoryEnabled) - { - - if(player.username!=null) - { - - if(!mod_pocketDim.limboSpawnInventory.isEmpty()&&mod_pocketDim.limboSpawnInventory.containsKey(player.username)) - { - for(EntityItem drop : mod_pocketDim.limboSpawnInventory.get(player.username)) - { - if(drop.getEntityItem().getItem() instanceof ItemArmor) - { - - - } - player.inventory.addItemStackToInventory(drop.getEntityItem()); - - - } - } - } - - - - - } - - } - - + public void onPlayerRespawn(EntityPlayer player) { + // TODO Auto-generated method stub } + } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/DDoorBase.java b/StevenDimDoors/mod_pocketDim/blocks/DDoorBase.java index e6f4be6..b51f08c 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/DDoorBase.java +++ b/StevenDimDoors/mod_pocketDim/blocks/DDoorBase.java @@ -479,7 +479,7 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic */ public int idPicked(World par1World, int par2, int par3, int par4) { - return this.blockID; + return this.getDrops(); } public int idDropped(int par1, Random par2Random, int par3) diff --git a/StevenDimDoors/mod_pocketDim/util/Point4D.java b/StevenDimDoors/mod_pocketDim/util/Point4D.java index 08164a8..2b41eb5 100644 --- a/StevenDimDoors/mod_pocketDim/util/Point4D.java +++ b/StevenDimDoors/mod_pocketDim/util/Point4D.java @@ -12,6 +12,13 @@ public final class Point4D implements Comparable private final int z; private final int dimension; + /** + * + * @param x + * @param y + * @param z + * @param dimension + */ public Point4D(int x, int y, int z, int dimension) { this.x = x; diff --git a/StevenDimDoors/mod_pocketDim/world/LimboProvider.java b/StevenDimDoors/mod_pocketDim/world/LimboProvider.java index 166a89f..4ddbc2b 100644 --- a/StevenDimDoors/mod_pocketDim/world/LimboProvider.java +++ b/StevenDimDoors/mod_pocketDim/world/LimboProvider.java @@ -1,5 +1,7 @@ package StevenDimDoors.mod_pocketDim.world; +import java.util.Random; + import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.ChunkCoordinates; @@ -163,8 +165,7 @@ public class LimboProvider extends WorldProvider return false; } - @Override - public ChunkCoordinates getRandomizedSpawnPoint() + public static ChunkCoordinates getLimboSkySpawn(Random rand) { ChunkCoordinates var5 = new ChunkCoordinates(0,0,0); @@ -173,11 +174,16 @@ public class LimboProvider extends WorldProvider int spawnFuzzHalf = spawnFuzz / 2; { - var5.posX += this.worldObj.rand.nextInt(spawnFuzz) - spawnFuzzHalf; - var5.posZ += this.worldObj.rand.nextInt(spawnFuzz) - spawnFuzzHalf; + var5.posX += rand.nextInt(spawnFuzz) - spawnFuzzHalf; + var5.posZ += rand.nextInt(spawnFuzz) - spawnFuzzHalf; var5.posY = 700; } return var5; } + @Override + public ChunkCoordinates getRandomizedSpawnPoint() + { + return getLimboSkySpawn(this.worldObj.rand); + } } \ No newline at end of file -- 2.39.5 From 9587f914c20feefdcd2da0105789db263ff3ad8e Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Fri, 6 Sep 2013 15:43:22 -0400 Subject: [PATCH 073/544] Respect keepLimboInventory config --- StevenDimDoors/mod_pocketDim/EventHookContainer.java | 5 +++++ StevenDimDoors/mod_pocketDim/mod_pocketDim.java | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 5a7f80d..abdeafb 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -76,10 +76,15 @@ public class EventHookContainer Entity entity = event.entity; if(entity instanceof EntityPlayer&&entity.worldObj.provider instanceof PocketProvider && this.properties.LimboEnabled) { + if(!this.properties.LimboReturnsInventoryEnabled) + { + ((EntityPlayer)entity).inventory.clearInventory(-1, -1); + } ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(entity.worldObj.rand); DDTeleporter.teleportEntity(entity, new Point4D(coords.posX,coords.posY,coords.posZ,mod_pocketDim.properties.LimboDimensionID)); ((EntityLiving) entity).setEntityHealth(20); event.setCanceled(true); + return false; } return true; } diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index c395c11..487ffe3 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -115,8 +115,6 @@ public class mod_pocketDim public static BiomeGenBase pocketBiome; public static PlayerRespawnTracker tracker; - - public static HashMap> limboSpawnInventory = new HashMap>(); public static boolean isPlayerWearingGoogles = false; -- 2.39.5 From c57b001fe23d1fd444dd23474c4139fba2ea5790 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Fri, 6 Sep 2013 18:40:43 -0400 Subject: [PATCH 074/544] Partially Fixed Exit Doors Added code so that exit doors will search for a destination and place a platform for the player on the other side. However, the search function only searches upward, not downward. I'd like to discuss some details about this before completing the implementation: 1. How should the search work? 2. What should be the likelihood of a dungeon exit leading to a different root dimension than the dungeon's actual root? I've tested the exits and they're working well. --- .../mod_pocketDim/core/DDTeleporter.java | 69 +++++++++++++++--- .../mod_pocketDim/helpers/yCoordHelper.java | 72 +++++++++++++++++++ 2 files changed, 131 insertions(+), 10 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index c0d9b37..b2e6388 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -18,6 +18,11 @@ import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.Point3D; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; +import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; +import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.world.PocketBuilder; import cpw.mods.fml.common.registry.GameRegistry; @@ -472,19 +477,63 @@ public class DDTeleporter return false; } - private static boolean generateSafeExit(NewDimData target, DimLink link, DDProperties properties) + private static boolean generateSafeExit(NewDimData destinationDim, DimLink link, DDProperties properties) { // A safe exit attempts to place a Warp Door in a dimension with // some precautions to protect the player. The X and Z coordinates - // are fixed to match the source, but the Y coordinate is chosen by - // searching for a safe location to place the door. The direction of - // the vertical search is away from the map boundary closest to - // the source Y. In other words, if a player is really high up, the - // search proceeds down. If a player is near the bottom of the map, - // the search proceeds up. If a safe destination cannot be found, - // then we return false and the source-side door slams shut. + // are fixed to match the source (mostly - may be shifted a little), + // but the Y coordinate is chosen by searching for a safe location + // to place the door. - // FIXME: Add code here! - return false; + // The direction of the vertical search is away from the map boundary + // closest to the source Y. In other words, if a player is really + // high up, the search goes down. If a player is near the bottom + // of the map, the search goes up. If a safe destination cannot be + // found, then we return false and the source-side door slams shut. + + Point3D destination; + Point4D source = link.source(); + World world = PocketManager.loadDimension(destinationDim.id()); + if (world == null) + { + return false; + } + + boolean searchDown = (source.getY() >= world.getActualHeight() / 2); + destination = yCoordHelper.findSafeCube(world, source.getX(), source.getY() - 2, source.getZ(), searchDown); + if (destination == null) + { + destination = yCoordHelper.findSafeCube(world, source.getX(), source.getY() - 2, source.getZ(), !searchDown); + } + if (destination != null) + { + // Set up a 3x3 platform at the destination + int x = destination.getX(); + int y = destination.getY(); + int z = destination.getZ(); + for (int dx = -1; dx <= 1; dx++) + { + for (int dz = -1; dz <= 1; dz++) + { + world.setBlock(x + dx, y, z + dz, properties.FabricBlockID); + } + } + + // Create a reverse link for returning + NewDimData sourceDim = PocketManager.getDimensionData(link.source().getDimension()); + DimLink reverse = destinationDim.createLink(x, y + 2, z, LinkTypes.REVERSE); + sourceDim.setDestination(reverse, source.getX(), source.getY(), source.getZ()); + + // Set up the warp door at the destination + int orientation = getDestinationOrientation(source, properties); + orientation = BlockRotator.transformMetadata(orientation, 2, properties.WarpDoorID); + ItemDimensionalDoor.placeDoorBlock(world, x, y + 1, z, orientation, mod_pocketDim.warpDoor); + + // Complete the link to the destination + // This comes last so the destination isn't set unless everything else works first + destinationDim.setDestination(link, x, y + 2, z); + } + + return (destination != null); } } diff --git a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java index 1574634..d912b46 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java @@ -2,8 +2,10 @@ package StevenDimDoors.mod_pocketDim.helpers; import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; +import StevenDimDoors.mod_pocketDim.Point3D; public class yCoordHelper { @@ -67,6 +69,76 @@ public class yCoordHelper material = block.blockMaterial; return (material.isLiquid() || !material.isReplaceable()); } + + public static Point3D findSafeCube(World world, int x, int startY, int z, boolean searchDown) + { + // Search for a 3x3x3 cube of air with blocks underneath + // We can also match against a 3x2x3 box with + // We shift the search area into the bounds of a chunk for the sake of simplicity, + // so that we don't need to worry about working across chunks. + + int localX = x < 0 ? (x % 16) + 16 : (x % 16); + int localZ = z < 0 ? (z % 16) + 16 : (z % 16); + int cornerX = x - localX; + int cornerZ = z - localZ; + localX = MathHelper.clamp_int(localX, 1, 14); + localZ = MathHelper.clamp_int(localZ, 1, 14); + + Chunk chunk = world.getChunkProvider().loadChunk(x >> 4, z >> 4); + + int layers = 0; + int height = world.getActualHeight(); + int y, dx, dz, blockID; + boolean filled; + Block block; + Point3D location = null; + + if (searchDown) + { + /*for (y = startY; y >= 0; y--) + { + blockID = chunk.getBlockID(localX, y, localZ); + + }*/ + } + else + { + // Check if a 3x3 layer of blocks is empty + // If we find a layer that contains replaceable blocks, it can + // serve as the base where we'll place the player and door. + for (y = Math.max(startY, 0); y < height; y++) + { + filled = false; + for (dx = -1; dx <= 1 && !filled; dx++) + { + for (dz = -1; dz <= 1 && !filled; dz++) + { + blockID = chunk.getBlockID(localX + dx, y, localZ + dz); + if (blockID != 0) + { + block = Block.blocksList[blockID]; + if (block != null && !block.blockMaterial.isReplaceable()) + { + filled = true; + } + layers = 0; + } + } + } + if (!filled) + { + layers++; + if (layers == 3) + { + location = new Point3D(localX + cornerX, y - 2, localZ + cornerZ); + break; + } + } + } + } + + return location; + } public static int adjustDestinationY(int y, int worldHeight, int entranceY, int dungeonHeight) { -- 2.39.5 From a0454351d56907de7e55512b0430542a77fb07ba Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Fri, 6 Sep 2013 20:57:00 -0400 Subject: [PATCH 075/544] Cleaned Up Code Deleted PlayerRespawnTracker and removed all references to it - we weren't going to use it anymore anyway. Renamed IDDoorLogic to IDimDoor - abbreviating the "Dim" as D next to the standard I for Interface is confusing. Renamed DDoorBase to BaseDimDoor and made it into an abstract class - that's effectively what it was supposed to be. We should be declaring methods as abstract rather than using empty ones. I renamed the class because the convention for naming abstract classes is to start the name with Base. Cleaned up code in other files. --- .../mod_pocketDim/EventHookContainer.java | 4 - .../mod_pocketDim/PlayerRespawnTracker.java | 47 --------- .../{DDoorBase.java => BaseDimDoor.java} | 96 ++++++++++--------- .../mod_pocketDim/blocks/DimensionalDoor.java | 27 +----- .../{IDDoorLogic.java => IDimDoor.java} | 2 +- .../mod_pocketDim/blocks/TransientDoor.java | 23 ++--- .../mod_pocketDim/blocks/UnstableDoor.java | 16 +--- .../mod_pocketDim/blocks/WarpDoor.java | 22 +---- .../mod_pocketDim/mod_pocketDim.java | 21 ++-- .../mod_pocketDim/world/LimboProvider.java | 1 + 10 files changed, 79 insertions(+), 180 deletions(-) delete mode 100644 StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java rename StevenDimDoors/mod_pocketDim/blocks/{DDoorBase.java => BaseDimDoor.java} (85%) rename StevenDimDoors/mod_pocketDim/blocks/{IDDoorLogic.java => IDimDoor.java} (90%) diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index abdeafb..9915963 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -4,15 +4,11 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.DamageSource; import net.minecraftforge.client.event.sound.SoundLoadEvent; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.EventPriority; import net.minecraftforge.event.ForgeSubscribe; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingFallEvent; -import net.minecraftforge.event.entity.player.PlayerDropsEvent; import net.minecraftforge.event.world.WorldEvent; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.PocketManager; diff --git a/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java b/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java deleted file mode 100644 index 2a4f57e..0000000 --- a/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java +++ /dev/null @@ -1,47 +0,0 @@ - - -package StevenDimDoors.mod_pocketDim; - - -import net.minecraft.entity.item.EntityItem; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemArmor; -import cpw.mods.fml.common.IPlayerTracker; - - -public class PlayerRespawnTracker implements IPlayerTracker -{ - private final DDProperties properties; - - public PlayerRespawnTracker(DDProperties properties) - { - this.properties = properties; - } - - @Override - public void onPlayerLogin(EntityPlayer player) { - // TODO Auto-generated method stub - - } - - @Override - public void onPlayerLogout(EntityPlayer player) { - // TODO Auto-generated method stub - - } - - @Override - public void onPlayerChangedDimension(EntityPlayer player) { - // TODO Auto-generated method stub - - } - - @Override - public void onPlayerRespawn(EntityPlayer player) { - // TODO Auto-generated method stub - - } - - -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/DDoorBase.java b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java similarity index 85% rename from StevenDimDoors/mod_pocketDim/blocks/DDoorBase.java rename to StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index b51f08c..a23dac6 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/DDoorBase.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -8,7 +8,6 @@ import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Icon; @@ -21,25 +20,22 @@ import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.DimLink; -import StevenDimDoors.mod_pocketDim.core.LinkTypes; -import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class DDoorBase extends BlockContainer implements IDDoorLogic +public abstract class BaseDimDoor extends BlockContainer implements IDimDoor { - protected static DDProperties properties = null; + protected final DDProperties properties; private Icon blockIconBottom; - public DDoorBase(int par1, Material material) + public BaseDimDoor(int blockID, Material material, DDProperties properties) { - super(par1, material); + super(blockID, material); - if (properties == null) - properties = DDProperties.instance(); + this.properties = properties; } public void registerIcons(IconRegister par1IconRegister) @@ -54,63 +50,63 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic this.enterDimDoor(world, x, y, z, entity); } - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { boolean shouldOpen=true; //System.out.println(String.valueOf(par1World.getBlockMetadata(par2, par3, par4))); - if(par5EntityPlayer.inventory.getCurrentItem()!=null) + if(player.inventory.getCurrentItem()!=null) { - if(par5EntityPlayer.inventory.getCurrentItem().getItem() == mod_pocketDim.itemRiftBlade) + if(player.inventory.getCurrentItem().getItem() == mod_pocketDim.itemRiftBlade) { shouldOpen = false; - if (!par1World.isRemote && par1World.getBlockId(par2, par3-1, par4) == this.blockID) + if (!world.isRemote && world.getBlockId(x, y-1, z) == this.blockID) { - int var12 = (int) (MathHelper.floor_double((double)((par5EntityPlayer.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); + int var12 = (int) (MathHelper.floor_double((double)((player.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); - if (par1World.getBlockMetadata(par2, par3-1, par4) == var12) + if (world.getBlockMetadata(x, y-1, z) == var12) { var12 = BlockRotator.transformMetadata(var12, 1, this.blockID); } - par1World.setBlockMetadataWithNotify(par2, par3-1, par4, var12, 2); + world.setBlockMetadataWithNotify(x, y-1, z, var12, 2); } - if (!par1World.isRemote && par1World.getBlockId(par2, par3+1, par4) == this.blockID) + if (!world.isRemote && world.getBlockId(x, y+1, z) == this.blockID) { - int var12 = (int) (MathHelper.floor_double((double)((par5EntityPlayer.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); - if(par1World.getBlockMetadata(par2, par3, par4)==var12) + int var12 = (int) (MathHelper.floor_double((double)((player.rotationYaw+90) * 4.0F / 360.0F) + 0.5D) & 3); + if(world.getBlockMetadata(x, y, z)==var12) { var12 = BlockRotator.transformMetadata(var12, 1, this.blockID); } - par1World.setBlockMetadataWithNotify(par2, par3, par4, var12, 2); + world.setBlockMetadataWithNotify(x, y, z, var12, 2); } - par1World.playAuxSFXAtEntity(par5EntityPlayer, 1001, par2, par3, par4, 0); + world.playAuxSFXAtEntity(player, 1001, x, y, z, 0); - if (!shouldOpen && !par1World.isRemote) + if (!shouldOpen && !world.isRemote) { - par5EntityPlayer.inventory.getCurrentItem().damageItem(5, par5EntityPlayer); + player.inventory.getCurrentItem().damageItem(5, player); } } } if(shouldOpen) { - int var10 = this.getFullMetadata(par1World, par2, par3, par4); + int var10 = this.getFullMetadata(world, x, y, z); int var11 = var10 & 7; var11 ^= 4; if ((var10 & 8) == 0) { - par1World.setBlockMetadataWithNotify(par2, par3, par4, var11,2); - par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4); + world.setBlockMetadataWithNotify(x, y, z, var11,2); + world.markBlockRangeForRenderUpdate(x, y, z, x, y, z); } else { - par1World.setBlockMetadataWithNotify(par2, par3 - 1, par4, var11,2); - par1World.markBlockRangeForRenderUpdate(par2, par3 - 1, par4, par2, par3, par4); + world.setBlockMetadataWithNotify(x, y - 1, z, var11,2); + world.markBlockRangeForRenderUpdate(x, y - 1, z, x, y, z); } - par1World.playAuxSFXAtEntity(par5EntityPlayer, 1003, par2, par3, par4, 0); + world.playAuxSFXAtEntity(player, 1003, x, y, z, 0); return true; } else @@ -158,11 +154,11 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic this.updateAttachedTile(world, x, y, z); } - @SideOnly(Side.CLIENT) /** * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side */ + @SideOnly(Side.CLIENT) public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) { if(par1IBlockAccess.getBlockId(par2, par3-1, par4) == this.blockID) @@ -177,7 +173,7 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic //Called to update the render information on the tile entity. Could probably implement a data watcher, //but this works fine and is more versatile I think. - public DDoorBase updateAttachedTile(World world, int x, int y, int z) + public BaseDimDoor updateAttachedTile(World world, int x, int y, int z) { TileEntity tile = world.getBlockTileEntity(x, y, z); if (tile instanceof TileEntityDimDoor) @@ -200,11 +196,18 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic tile.orientation = this.getFullMetadata(par1World, par2, par3, par4) & 7; } + public boolean isDoorOpen(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) + { + return (this.getFullMetadata(par1IBlockAccess, par2, par3, par4) & 4) != 0; + } + + @Override public boolean isOpaqueCube() { return false; } + @Override public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) { int var5 = this.getFullMetadata(par1IBlockAccess, par2, par3, par4); @@ -214,6 +217,7 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic /** * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) */ + @Override public boolean renderAsNormalBlock() { return false; @@ -222,16 +226,18 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic /** * The type of render function that is called for this block */ + @Override public int getRenderType() { return 7; } - @SideOnly(Side.CLIENT) /** * Returns the bounding box of the wired rectangular prism to render. */ + @Override + @SideOnly(Side.CLIENT) public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4) { this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); @@ -251,6 +257,7 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic /** * Updates the blocks bounds based on its current state. Args: world, x, y, z */ + @Override public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) { this.setDoorRotation(this.getFullMetadata(par1IBlockAccess, par2, par3, par4)); @@ -264,11 +271,6 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic return this.getFullMetadata(par1IBlockAccess, par2, par3, par4) & 3; } - public boolean isDoorOpen(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - return (this.getFullMetadata(par1IBlockAccess, par2, par3, par4) & 4) != 0; - } - private void setDoorRotation(int par1) { float var2 = 0.1875F; @@ -354,6 +356,7 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic /** * Called when the block is clicked by a player. Args: x, y, z, entityPlayer */ + @Override public void onBlockClicked(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer) { // System.out.println(this.getFullMetadata(par1World, par2, par3, par4)%4); @@ -363,6 +366,7 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are * their own) Args: x, y, z, neighbor blockID */ + @Override public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) { int var6 = par1World.getBlockMetadata(par2, par3, par4); @@ -425,6 +429,7 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic * Ray traces through the blocks collision from start vector to end vector returning a ray trace hit. Args: world, * x, y, z, startVec, endVec */ + @Override public MovingObjectPosition collisionRayTrace(World par1World, int par2, int par3, int par4, Vec3 par5Vec3, Vec3 par6Vec3) { this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); @@ -434,6 +439,7 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic /** * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z */ + @Override public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) { return par3 >= 255 ? false : par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) && super.canPlaceBlockAt(par1World, par2, par3, par4) && super.canPlaceBlockAt(par1World, par2, par3 + 1, par4); @@ -443,6 +449,7 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic * Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility * and stop pistons */ + @Override public int getMobilityFlag() { return 2; @@ -473,15 +480,17 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic return var7 & 7 | (var6 ? 8 : 0) | (var9 ? 16 : 0); } - @SideOnly(Side.CLIENT) /** * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative) */ + @Override + @SideOnly(Side.CLIENT) public int idPicked(World par1World, int par2, int par3, int par4) { return this.getDrops(); } + @Override public int idDropped(int par1, Random par2Random, int par3) { return (par1 & 8) != 0 ? 0 : (getDrops()); @@ -490,6 +499,7 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic /** * Called when the block is attempted to be harvested */ + @Override public void onBlockHarvested(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer) { if (par6EntityPlayer.capabilities.isCreativeMode && (par5 & 8) != 0 && par1World.getBlockId(par2, par3 - 1, par4) == this.blockID) @@ -501,8 +511,7 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic @Override public TileEntity createNewTileEntity(World world) { - TileEntity tile = new TileEntityDimDoor(); - return tile; + return new TileEntityDimDoor(); } @Override @@ -523,12 +532,7 @@ public class DDoorBase extends BlockContainer implements IDDoorLogic } } } - - @Override - public void placeDimDoor(World world, int x, int y, int z) - { - // TODO Auto-generated method stub - } + @Override public int getDrops() { diff --git a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java index b2ba41c..9b59b8b 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java @@ -1,41 +1,20 @@ package StevenDimDoors.mod_pocketDim.blocks; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.Icon; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; -import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class DimensionalDoor extends DDoorBase implements IDDoorLogic +public class DimensionalDoor extends BaseDimDoor { - public DimensionalDoor(int par1, Material material) + public DimensionalDoor(int blockID, Material material, DDProperties properties) { - super(par1, material); - // TODO Auto-generated constructor stub + super(blockID, material, properties); } @Override diff --git a/StevenDimDoors/mod_pocketDim/blocks/IDDoorLogic.java b/StevenDimDoors/mod_pocketDim/blocks/IDimDoor.java similarity index 90% rename from StevenDimDoors/mod_pocketDim/blocks/IDDoorLogic.java rename to StevenDimDoors/mod_pocketDim/blocks/IDimDoor.java index 6d459ed..6ebe012 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/IDDoorLogic.java +++ b/StevenDimDoors/mod_pocketDim/blocks/IDimDoor.java @@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.entity.Entity; import net.minecraft.world.World; -public interface IDDoorLogic +public interface IDimDoor { public void enterDimDoor(World world, int x, int y, int z, Entity entity); diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java index d9b00d4..e0d7c1d 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java @@ -1,29 +1,22 @@ package StevenDimDoors.mod_pocketDim.blocks; -import java.util.Random; - import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.Icon; import net.minecraft.util.MathHelper; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class TransientDoor extends DDoorBase implements IDDoorLogic +public class TransientDoor extends BaseDimDoor { - public TransientDoor(int blockID, Material material) + public TransientDoor(int blockID, Material material, DDProperties properties) { - super(blockID, material); + super(blockID, material, properties); } @Override @@ -54,28 +47,32 @@ public class TransientDoor extends DDoorBase implements IDDoorLogic { NewDimData dimension = PocketManager.getDimensionData(world); DimLink link = dimension.getLink(x, y, z); - if (link == null&&dimension.isPocketDimension()) + if (link == null && dimension.isPocketDimension()) { dimension.createLink(x, y, z, LinkTypes.SAFE_EXIT); } } } + @Override public int getDrops() { return 0; } - + + @Override public boolean isCollidable() { return false; } + @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) { return null; } + @Override public int getRenderType() { return 8; diff --git a/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java index 155520c..77d283d 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java @@ -1,28 +1,18 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.Entity; import net.minecraft.item.Item; -import net.minecraft.util.Icon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.DDTeleporter; -import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class UnstableDoor extends DDoorBase implements IDDoorLogic +public class UnstableDoor extends BaseDimDoor { - public UnstableDoor(int par1, Material material) + public UnstableDoor(int blockID, Material material, DDProperties properties) { - super(par1, material); + super(blockID, material, properties); } @Override diff --git a/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java index 960fc33..4e4c4b4 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java @@ -1,29 +1,19 @@ package StevenDimDoors.mod_pocketDim.blocks; -import java.util.Random; - import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.Entity; import net.minecraft.item.Item; -import net.minecraft.util.Icon; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -public class WarpDoor extends DDoorBase implements IDDoorLogic +public class WarpDoor extends BaseDimDoor { - private Icon blockIconBottom; - - public WarpDoor(int blockID, Material material) + public WarpDoor(int blockID, Material material, DDProperties properties) { - super(blockID, material); + super(blockID, material, properties); } @Override @@ -33,7 +23,7 @@ public class WarpDoor extends DDoorBase implements IDDoorLogic { NewDimData dimension = PocketManager.getDimensionData(world); DimLink link = dimension.getLink(x, y, z); - if (link == null&&dimension.isPocketDimension()) + if (link == null && dimension.isPocketDimension()) { dimension.createLink(x, y, z, LinkTypes.SAFE_EXIT); } @@ -45,6 +35,4 @@ public class WarpDoor extends DDoorBase implements IDDoorLogic { return Item.doorWood.itemID; } - - } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 487ffe3..0dd6474 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -1,15 +1,11 @@ package StevenDimDoors.mod_pocketDim; -import java.util.ArrayList; -import java.util.HashMap; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityEggInfo; import net.minecraft.entity.EntityList; -import net.minecraft.entity.item.EntityItem; import net.minecraft.item.EnumToolMaterial; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -113,8 +109,6 @@ public class mod_pocketDim public static BiomeGenBase limboBiome; public static BiomeGenBase pocketBiome; - - public static PlayerRespawnTracker tracker; public static boolean isPlayerWearingGoogles = false; @@ -148,7 +142,6 @@ public class mod_pocketDim //Now do other stuff MinecraftForge.EVENT_BUS.register(new EventHookContainer(properties)); - tracker = new PlayerRespawnTracker(properties); riftGen = new GatewayGenerator(properties); } @@ -165,15 +158,15 @@ public class mod_pocketDim new RiftRegenerator(commonTickHandler); //No need to store the reference LimboDecay decay = new LimboDecay(commonTickHandler, properties); - transientDoor = (new TransientDoor(properties.TransientDoorID, Material.iron)).setHardness(1.0F) .setUnlocalizedName("transientDoor"); + transientDoor = new TransientDoor(properties.TransientDoorID, Material.iron, properties).setHardness(1.0F) .setUnlocalizedName("transientDoor"); - blockDimWall = (new BlockDimWall(properties.FabricBlockID, 0, Material.iron)).setLightValue(1.0F).setHardness(0.1F).setUnlocalizedName("blockDimWall"); + blockDimWall = new BlockDimWall(properties.FabricBlockID, 0, Material.iron).setLightValue(1.0F).setHardness(0.1F).setUnlocalizedName("blockDimWall"); blockDimWallPerm = (new BlockDimWallPerm(properties.PermaFabricBlockID, 0, Material.iron)).setLightValue(1.0F).setBlockUnbreakable().setResistance(6000000.0F).setUnlocalizedName("blockDimWallPerm"); - warpDoor = (new WarpDoor(properties.WarpDoorID, Material.wood)).setHardness(1.0F) .setUnlocalizedName("dimDoorWarp"); + warpDoor = new WarpDoor(properties.WarpDoorID, Material.wood, properties).setHardness(1.0F) .setUnlocalizedName("dimDoorWarp"); blockRift = (BlockRift) (new BlockRift(properties.RiftBlockID, 0, Material.air, properties).setHardness(1.0F) .setUnlocalizedName("rift")); - blockLimbo = (new BlockLimbo(properties.LimboBlockID, 15, Material.iron, properties.LimboDimensionID, decay).setHardness(.2F).setUnlocalizedName("BlockLimbo").setLightValue(.0F)); - unstableDoor = (new UnstableDoor(properties.UnstableDoorID, Material.iron).setHardness(.2F).setUnlocalizedName("chaosDoor").setLightValue(.0F) ); - dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(properties.DimensionalDoorID, Material.iron)).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor"); + blockLimbo = new BlockLimbo(properties.LimboBlockID, 15, Material.iron, properties.LimboDimensionID, decay).setHardness(.2F).setUnlocalizedName("BlockLimbo").setLightValue(.0F); + unstableDoor = (new UnstableDoor(properties.UnstableDoorID, Material.iron, properties).setHardness(.2F).setUnlocalizedName("chaosDoor").setLightValue(.0F) ); + dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(properties.DimensionalDoorID, Material.iron, properties).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor")); dimHatch = (new dimHatch(properties.TransTrapdoorID, 84, Material.iron)).setHardness(1.0F) .setUnlocalizedName("dimHatch"); // dimRail = (new DimRail(dimRailID, 88, false)).setHardness(.5F) .setUnlocalizedName("dimRail"); @@ -202,8 +195,6 @@ public class mod_pocketDim GameRegistry.registerBlock(blockDimWall, ItemBlockDimWall.class, "Fabric of Reality"); - GameRegistry.registerPlayerTracker(tracker); - DimensionManager.registerProviderType(properties.PocketProviderID, PocketProvider.class, false); DimensionManager.registerProviderType(properties.LimboProviderID, LimboProvider.class, false); DimensionManager.registerDimension(properties.LimboDimensionID, properties.LimboProviderID); diff --git a/StevenDimDoors/mod_pocketDim/world/LimboProvider.java b/StevenDimDoors/mod_pocketDim/world/LimboProvider.java index 4ddbc2b..44d1843 100644 --- a/StevenDimDoors/mod_pocketDim/world/LimboProvider.java +++ b/StevenDimDoors/mod_pocketDim/world/LimboProvider.java @@ -181,6 +181,7 @@ public class LimboProvider extends WorldProvider return var5; } + @Override public ChunkCoordinates getRandomizedSpawnPoint() { -- 2.39.5 From bac3caa5ccb8bf1fb7dda76b500296512b5742fb Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Fri, 6 Sep 2013 22:14:27 -0400 Subject: [PATCH 076/544] Minor Changes Changed EventHookContainer.LivingDeathEvent() to use the player's max health instead of a fixed health value. No magic numbers! Also cleaned up the code a little. --- .../mod_pocketDim/EventHookContainer.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 9915963..132a161 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -1,7 +1,6 @@ package StevenDimDoors.mod_pocketDim; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ChunkCoordinates; import net.minecraftforge.client.event.sound.SoundLoadEvent; @@ -70,15 +69,17 @@ public class EventHookContainer public boolean LivingDeathEvent(LivingDeathEvent event) { Entity entity = event.entity; - if(entity instanceof EntityPlayer&&entity.worldObj.provider instanceof PocketProvider && this.properties.LimboEnabled) + if (entity instanceof EntityPlayer && entity.worldObj.provider instanceof PocketProvider + && properties.LimboEnabled) { - if(!this.properties.LimboReturnsInventoryEnabled) + EntityPlayer player = (EntityPlayer) entity; + if (!properties.LimboReturnsInventoryEnabled) { - ((EntityPlayer)entity).inventory.clearInventory(-1, -1); + player.inventory.clearInventory(-1, -1); } - ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(entity.worldObj.rand); - DDTeleporter.teleportEntity(entity, new Point4D(coords.posX,coords.posY,coords.posZ,mod_pocketDim.properties.LimboDimensionID)); - ((EntityLiving) entity).setEntityHealth(20); + ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(player.worldObj.rand); + DDTeleporter.teleportEntity(player, new Point4D(coords.posX, coords.posY, coords.posZ, mod_pocketDim.properties.LimboDimensionID)); + player.setEntityHealth(player.getMaxHealth()); event.setCanceled(true); return false; } -- 2.39.5 From ac8c13f81c3e6ed241f92cce5df71f53a3bf19a9 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Sat, 7 Sep 2013 00:41:45 -0400 Subject: [PATCH 077/544] Removed door re-write for now --- .../mod_pocketDim/EventHookContainer.java | 34 +++++++++++++++-- .../mod_pocketDim/PlayerRespawnTracker.java | 38 ++----------------- .../mod_pocketDim/mod_pocketDim.java | 2 - .../tileentities/TileEntityRift.java | 6 +++ .../mod_pocketDim/util/Point4D.java | 7 ++++ .../mod_pocketDim/world/LimboProvider.java | 14 +++++-- 6 files changed, 56 insertions(+), 45 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 2e2756d..abdeafb 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -1,12 +1,25 @@ package StevenDimDoors.mod_pocketDim; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.DamageSource; import net.minecraftforge.client.event.sound.SoundLoadEvent; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.EventPriority; import net.minecraftforge.event.ForgeSubscribe; +import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.entity.player.PlayerDropsEvent; import net.minecraftforge.event.world.WorldEvent; +import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator; +import StevenDimDoors.mod_pocketDim.util.Point4D; +import StevenDimDoors.mod_pocketDim.world.LimboProvider; +import StevenDimDoors.mod_pocketDim.world.PocketProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -56,11 +69,24 @@ public class EventHookContainer event.setCanceled(event.entity.worldObj.provider.dimensionId == properties.LimboDimensionID); } - @ForgeSubscribe - public void onPlayerDrops(PlayerDropsEvent event) + + @ForgeSubscribe(priority=EventPriority.HIGHEST) + public boolean LivingDeathEvent(LivingDeathEvent event) { - //TODO: I have some doubts. Is this triggered even if you die outside Limbo? And do you still drop items that others could pick up? We don't cancel the event. ~SenseiKiwi - mod_pocketDim.limboSpawnInventory.put(event.entityPlayer.username, event.drops); + Entity entity = event.entity; + if(entity instanceof EntityPlayer&&entity.worldObj.provider instanceof PocketProvider && this.properties.LimboEnabled) + { + if(!this.properties.LimboReturnsInventoryEnabled) + { + ((EntityPlayer)entity).inventory.clearInventory(-1, -1); + } + ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(entity.worldObj.rand); + DDTeleporter.teleportEntity(entity, new Point4D(coords.posX,coords.posY,coords.posZ,mod_pocketDim.properties.LimboDimensionID)); + ((EntityLiving) entity).setEntityHealth(20); + event.setCanceled(true); + return false; + } + return true; } @ForgeSubscribe diff --git a/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java b/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java index d6b34fe..2a4f57e 100644 --- a/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java +++ b/StevenDimDoors/mod_pocketDim/PlayerRespawnTracker.java @@ -38,42 +38,10 @@ public class PlayerRespawnTracker implements IPlayerTracker } @Override - public void onPlayerRespawn(EntityPlayer player) - { - if(player.worldObj.provider.dimensionId==properties.LimboDimensionID) - { - - if(!player.worldObj.isRemote && properties.LimboReturnsInventoryEnabled) - { - - if(player.username!=null) - { - - if(!mod_pocketDim.limboSpawnInventory.isEmpty()&&mod_pocketDim.limboSpawnInventory.containsKey(player.username)) - { - for(EntityItem drop : mod_pocketDim.limboSpawnInventory.get(player.username)) - { - if(drop.getEntityItem().getItem() instanceof ItemArmor) - { - - - } - player.inventory.addItemStackToInventory(drop.getEntityItem()); - - - } - } - } - - - - - } - - } - - + public void onPlayerRespawn(EntityPlayer player) { + // TODO Auto-generated method stub } + } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index c395c11..487ffe3 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -115,8 +115,6 @@ public class mod_pocketDim public static BiomeGenBase pocketBiome; public static PlayerRespawnTracker tracker; - - public static HashMap> limboSpawnInventory = new HashMap>(); public static boolean isPlayerWearingGoogles = false; diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index fc74f69..d1f472c 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -213,6 +213,12 @@ public class TileEntityRift extends TileEntity } } } + else + { + this.xOffset=0; + this.yOffset=0; + this.xOffset=0; + } } public void grow(int distance) diff --git a/StevenDimDoors/mod_pocketDim/util/Point4D.java b/StevenDimDoors/mod_pocketDim/util/Point4D.java index 08164a8..2b41eb5 100644 --- a/StevenDimDoors/mod_pocketDim/util/Point4D.java +++ b/StevenDimDoors/mod_pocketDim/util/Point4D.java @@ -12,6 +12,13 @@ public final class Point4D implements Comparable private final int z; private final int dimension; + /** + * + * @param x + * @param y + * @param z + * @param dimension + */ public Point4D(int x, int y, int z, int dimension) { this.x = x; diff --git a/StevenDimDoors/mod_pocketDim/world/LimboProvider.java b/StevenDimDoors/mod_pocketDim/world/LimboProvider.java index 166a89f..4ddbc2b 100644 --- a/StevenDimDoors/mod_pocketDim/world/LimboProvider.java +++ b/StevenDimDoors/mod_pocketDim/world/LimboProvider.java @@ -1,5 +1,7 @@ package StevenDimDoors.mod_pocketDim.world; +import java.util.Random; + import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.ChunkCoordinates; @@ -163,8 +165,7 @@ public class LimboProvider extends WorldProvider return false; } - @Override - public ChunkCoordinates getRandomizedSpawnPoint() + public static ChunkCoordinates getLimboSkySpawn(Random rand) { ChunkCoordinates var5 = new ChunkCoordinates(0,0,0); @@ -173,11 +174,16 @@ public class LimboProvider extends WorldProvider int spawnFuzzHalf = spawnFuzz / 2; { - var5.posX += this.worldObj.rand.nextInt(spawnFuzz) - spawnFuzzHalf; - var5.posZ += this.worldObj.rand.nextInt(spawnFuzz) - spawnFuzzHalf; + var5.posX += rand.nextInt(spawnFuzz) - spawnFuzzHalf; + var5.posZ += rand.nextInt(spawnFuzz) - spawnFuzzHalf; var5.posY = 700; } return var5; } + @Override + public ChunkCoordinates getRandomizedSpawnPoint() + { + return getLimboSkySpawn(this.worldObj.rand); + } } \ No newline at end of file -- 2.39.5 From 25d3931210953202e76b08ff8afe51cc6676844c Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 05:12:07 -0400 Subject: [PATCH 078/544] Improved DDLoot Fixed an issue with DDLoot where we couldn't distinguish between items with the same ID but different subtypes while merging loot categories. For instance, we could not include two different colors of dye in our loot because their item IDs matched. We can now tell them apart properly and include both items. --- StevenDimDoors/mod_pocketDim/DDLoot.java | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/DDLoot.java b/StevenDimDoors/mod_pocketDim/DDLoot.java index 41d80a9..a6be018 100644 --- a/StevenDimDoors/mod_pocketDim/DDLoot.java +++ b/StevenDimDoors/mod_pocketDim/DDLoot.java @@ -78,9 +78,6 @@ public class DDLoot { //because the items in that category have strange weights that are incompatible with all other //chest categories. - //This function has a flaw. It treats items with the same item ID but different damage values as - //the same item. For instance, it cannot distinguish between different types of wood. That shouldn't - //matter for most chest loot, though. This could be fixed if we cared enough. Random random = new Random(); HashMap container = new HashMap(); @@ -89,7 +86,9 @@ public class DDLoot { WeightedRandomChestContent[] items = ChestGenHooks.getItems(category, random); for (WeightedRandomChestContent item : items) { - int id = item.theItemId.itemID; + ItemStack stack = item.theItemId; + int id = stack.itemID; + int subtype = stack.getItem().getHasSubtypes() ? stack.getItemDamage() : 0; //Correct the weights of Vanilla dungeon chests (DUNGEON_CHEST) //Comparing by String references is valid here since they should match! @@ -100,20 +99,25 @@ public class DDLoot { item.itemWeight /= DUNGEON_CHEST_WEIGHT_INFLATION; if (item.itemWeight == 0) item.itemWeight = 1; - } - if (!container.containsKey(id)) + } + + //Generate an identifier for this item using its item ID and damage value, + //if it has subtypes. This solves the issue of matching items that have + //the same item ID but different subtypes (e.g. wood planks, dyes). + int key = ((subtype & 0xFFFF) << 16) + ((id & 0xFFFF) << 16); + WeightedRandomChestContent other = container.get(key); + if (other == null) { //This item has not been seen before. Simply add it to the container. - container.put(id, item); + container.put(key, item); } else { //This item conflicts with an existing entry. Replace that entry //if our current item has a lower weight. - WeightedRandomChestContent other = container.get(id); if (item.itemWeight < other.itemWeight) { - container.put(id, item); + container.put(key, item); } } } @@ -127,7 +131,7 @@ public class DDLoot { { if (item.theItemId.itemID == enchantedBookID) { - item.itemWeight = 3; + item.itemWeight = 4; break; } } -- 2.39.5 From 07a5e2a64d87ef115f994852231bb7eea1685267 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 12:27:28 -0400 Subject: [PATCH 079/544] Progress on Rewrite Completed exit door code. Also fixed noise calculation for dungeon door destinations - we were attempting to use pack depth in the calculation before it had been initialized. --- .../mod_pocketDim/core/DDTeleporter.java | 60 ++++--- .../mod_pocketDim/core/NewDimData.java | 2 +- .../mod_pocketDim/helpers/yCoordHelper.java | 160 +++++++++++++----- .../mod_pocketDim/world/PocketBuilder.java | 6 +- 4 files changed, 164 insertions(+), 64 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index b2e6388..5f693c8 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -30,7 +30,11 @@ import cpw.mods.fml.common.registry.GameRegistry; public class DDTeleporter { private static final Random random = new Random(); - private static int END_DIMENSION_ID = 1; + private static final int END_DIMENSION_ID = 1; + private static final int MAX_ROOT_SHIFT_CHANCE = 100; + private static final int START_ROOT_SHIFT_CHANCE = 0; + private static final int ROOT_SHIFT_CHANCE_PER_LEVEL = 5; + public static int cooldown = 0; private DDTeleporter() { } @@ -465,16 +469,26 @@ public class DDTeleporter // A dungeon exit acts the same as a safe exit, but has the chance of // taking the user to any non-pocket dimension, excluding Limbo and The End. + NewDimData current = PocketManager.getDimensionData(link.source.getDimension()); ArrayList roots = PocketManager.getRootDimensions(); - for (int attempts = 0; attempts < 10; attempts++) + int shiftChance = START_ROOT_SHIFT_CHANCE + ROOT_SHIFT_CHANCE_PER_LEVEL * (current.packDepth() - 1); + + if (random.nextInt(MAX_ROOT_SHIFT_CHANCE) < shiftChance) { - NewDimData selection = roots.get( random.nextInt(roots.size()) ); - if (selection.id() != END_DIMENSION_ID && selection.id() != properties.LimboDimensionID) + for (int attempts = 0; attempts < 10; attempts++) { - return generateSafeExit(selection, link, properties); + NewDimData selection = roots.get( random.nextInt(roots.size()) ); + if (selection.id() != END_DIMENSION_ID && + selection.id() != properties.LimboDimensionID && + selection != current.root()) + { + return generateSafeExit(selection, link, properties); + } } } - return false; + + // Yes, this could lead you back into Limbo. That's intentional. + return generateSafeExit(current.root(), link, properties); } private static boolean generateSafeExit(NewDimData destinationDim, DimLink link, DDProperties properties) @@ -482,16 +496,9 @@ public class DDTeleporter // A safe exit attempts to place a Warp Door in a dimension with // some precautions to protect the player. The X and Z coordinates // are fixed to match the source (mostly - may be shifted a little), - // but the Y coordinate is chosen by searching for a safe location - // to place the door. + // but the Y coordinate is chosen by searching for the nearest + // a safe location to place the door. - // The direction of the vertical search is away from the map boundary - // closest to the source Y. In other words, if a player is really - // high up, the search goes down. If a player is near the bottom - // of the map, the search goes up. If a safe destination cannot be - // found, then we return false and the source-side door slams shut. - - Point3D destination; Point4D source = link.source(); World world = PocketManager.loadDimension(destinationDim.id()); if (world == null) @@ -499,11 +506,26 @@ public class DDTeleporter return false; } - boolean searchDown = (source.getY() >= world.getActualHeight() / 2); - destination = yCoordHelper.findSafeCube(world, source.getX(), source.getY() - 2, source.getZ(), searchDown); - if (destination == null) + int startY = source.getY() - 2; + Point3D destination; + Point3D locationUp = yCoordHelper.findSafeCubeUp(world, source.getX(), startY, source.getZ()); + Point3D locationDown = yCoordHelper.findSafeCubeDown(world, source.getX(), startY, source.getZ()); + + if (locationUp == null) { - destination = yCoordHelper.findSafeCube(world, source.getX(), source.getY() - 2, source.getZ(), !searchDown); + destination = locationDown; + } + else if (locationDown == null) + { + destination = locationUp; + } + else if (locationUp.getY() - startY <= startY - locationDown.getY()) + { + destination = locationUp; + } + else + { + destination = locationDown; } if (destination != null) { diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index 40fe18d..9e735aa 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -447,7 +447,7 @@ public abstract class NewDimData this.packDepth = calculatePackDepth(parent, dungeon); } - private static int calculatePackDepth(NewDimData parent, DungeonData current) + public static int calculatePackDepth(NewDimData parent, DungeonData current) { DungeonData predecessor = parent.dungeon(); if (current == null) diff --git a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java index d912b46..ec514e3 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java @@ -5,6 +5,7 @@ import net.minecraft.block.material.Material; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; import StevenDimDoors.mod_pocketDim.Point3D; public class yCoordHelper @@ -70,7 +71,7 @@ public class yCoordHelper return (material.isLiquid() || !material.isReplaceable()); } - public static Point3D findSafeCube(World world, int x, int startY, int z, boolean searchDown) + public static Point3D findSafeCubeUp(World world, int x, int startY, int z) { // Search for a 3x3x3 cube of air with blocks underneath // We can also match against a 3x2x3 box with @@ -84,62 +85,139 @@ public class yCoordHelper localX = MathHelper.clamp_int(localX, 1, 14); localZ = MathHelper.clamp_int(localZ, 1, 14); - Chunk chunk = world.getChunkProvider().loadChunk(x >> 4, z >> 4); + Chunk chunk = initializeChunkArea(world, x >> 4, z >> 4); - int layers = 0; int height = world.getActualHeight(); int y, dx, dz, blockID; - boolean filled; + boolean isSafe; Block block; - Point3D location = null; - - if (searchDown) + + // Initialize layers to a huge negative number so that we won't + // consider an area as usable unless it gets reset to 0 first + // when we find a foundation upon which to build. + int layers = -1000000; + + // Check if a 3x3 layer of blocks is empty + // If we find a layer that contains replaceable blocks, it can + // serve as the base where we'll place the player and door. + for (y = Math.max(startY - 1, 0); y < height; y++) { - /*for (y = startY; y >= 0; y--) + isSafe = true; + for (dx = -1; dx <= 1 && isSafe; dx++) { - blockID = chunk.getBlockID(localX, y, localZ); - - }*/ - } - else - { - // Check if a 3x3 layer of blocks is empty - // If we find a layer that contains replaceable blocks, it can - // serve as the base where we'll place the player and door. - for (y = Math.max(startY, 0); y < height; y++) - { - filled = false; - for (dx = -1; dx <= 1 && !filled; dx++) + for (dz = -1; dz <= 1 && isSafe; dz++) { - for (dz = -1; dz <= 1 && !filled; dz++) + blockID = chunk.getBlockID(localX + dx, y, localZ + dz); + if (blockID != 0) { - blockID = chunk.getBlockID(localX + dx, y, localZ + dz); - if (blockID != 0) + block = Block.blocksList[blockID]; + if (!block.blockMaterial.isReplaceable()) { - block = Block.blocksList[blockID]; - if (block != null && !block.blockMaterial.isReplaceable()) - { - filled = true; - } - layers = 0; + isSafe = false; } - } - } - if (!filled) - { - layers++; - if (layers == 3) - { - location = new Point3D(localX + cornerX, y - 2, localZ + cornerZ); - break; + layers = 0; } } } + if (isSafe) + { + layers++; + if (layers == 3) + { + return new Point3D(localX + cornerX, y - 2, localZ + cornerZ); + } + } } - - return location; + return null; } + public static Point3D findSafeCubeDown(World world, int x, int startY, int z) + { + // Search for a 3x3x3 cube of air with blocks underneath + // We can also match against a 3x2x3 box with + // We shift the search area into the bounds of a chunk for the sake of simplicity, + // so that we don't need to worry about working across chunks. + + int localX = x < 0 ? (x % 16) + 16 : (x % 16); + int localZ = z < 0 ? (z % 16) + 16 : (z % 16); + int cornerX = x - localX; + int cornerZ = z - localZ; + localX = MathHelper.clamp_int(localX, 1, 14); + localZ = MathHelper.clamp_int(localZ, 1, 14); + + Chunk chunk = initializeChunkArea(world, x >> 4, z >> 4); + + int height = world.getActualHeight(); + int y, dx, dz, blockID; + boolean isSafe; + boolean hasBlocks; + Block block; + int layers = 0; + + // Check if a 3x3 layer of blocks is empty + // If we find a layer that contains replaceable blocks, it can + // serve as the base where we'll place the player and door. + for (y = Math.min(startY + 2, height - 1); y >= 0; y--) + { + isSafe = true; + hasBlocks = false; + for (dx = -1; dx <= 1 && isSafe; dx++) + { + for (dz = -1; dz <= 1 && isSafe; dz++) + { + blockID = chunk.getBlockID(localX + dx, y, localZ + dz); + if (blockID != 0) + { + block = Block.blocksList[blockID]; + if (!block.blockMaterial.isReplaceable()) + { + if (layers >= 3) + { + return new Point3D(localX + cornerX, y + 1, localZ + cornerZ); + } + isSafe = false; + } + hasBlocks = true; + } + } + } + if (isSafe) + { + layers++; + if (hasBlocks) + { + if (layers >= 3) + { + return new Point3D(localX + cornerX, y, localZ + cornerZ); + } + layers = 0; + } + } + } + return null; + } + + private static Chunk initializeChunkArea(World world, int chunkX, int chunkZ) + { + // We initialize a 3x3 area of chunks instead of just initializing + // the target chunk because things generated in adjacent chunks + // (e.g. trees) might intrude into the target chunk. + + IChunkProvider provider = world.getChunkProvider(); + Chunk target = provider.loadChunk(chunkX, chunkZ); + for (int dx = -1; dx <= 1; dx++) + { + for (int dz = -1; dz <= 1; dz++) + { + if (!provider.chunkExists(chunkX + dx, chunkZ + dz)) + { + provider.loadChunk(chunkX, chunkZ); + } + } + } + return target; + } + public static int adjustDestinationY(int y, int worldHeight, int entranceY, int dungeonHeight) { //The goal here is to guarantee that the dungeon fits within the vertical bounds diff --git a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index 0f2d42f..0b55e71 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -87,7 +87,7 @@ public class PocketBuilder if (packConfig != null && packConfig.doDistortDoorCoordinates()) { - destination = calculateNoisyDestination(source, dimension, orientation); + destination = calculateNoisyDestination(source, dimension, dungeon, orientation); } else { @@ -111,9 +111,9 @@ public class PocketBuilder } } - private static Point3D calculateNoisyDestination(Point4D source, NewDimData dimension, int orientation) + private static Point3D calculateNoisyDestination(Point4D source, NewDimData dimension, DungeonData dungeon, int orientation) { - int depth = dimension.packDepth(); + int depth = NewDimData.calculatePackDepth(dimension.parent(), dungeon); int forwardNoise = MathHelper.getRandomIntegerInRange(random, -50 * depth, 150 * depth); int sidewaysNoise = MathHelper.getRandomIntegerInRange(random, -10 * depth, 10 * depth); -- 2.39.5 From fd4b9b508609f8d46f3f494c81379ebd4df7ab3c Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 13:14:43 -0400 Subject: [PATCH 080/544] Fixed Regression in DungeonSchematic As part of the rewrite, I'd removed code related to replacing the sandstone markers under dungeon exit doors, so the markers weren't being replaced. Now that's working again. --- .../mod_pocketDim/dungeon/DungeonSchematic.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index e33a455..2389c82 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -248,7 +248,7 @@ public class DungeonSchematic extends Schematic { //Set up link data for exit door for (Point3D location : exitDoorLocations) { - createExitDoorLink(dimension, location, entranceDoorLocation, turnAngle, pocketCenter); + createExitDoorLink(world, dimension, location, entranceDoorLocation, turnAngle, pocketCenter); } //Remove end portal frames and spawn Monoliths @@ -291,12 +291,22 @@ public class DungeonSchematic extends Schematic { prevDim.setDestination(reverseLink, destination.getX(), destination.getY(), destination.getZ()); } - private static void createExitDoorLink(NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) + private static void createExitDoorLink(World world, NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) { //Transform the door's location to the pocket coordinate system Point3D location = point.clone(); BlockRotator.transformPoint(location, entrance, rotation, pocketCenter); dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkTypes.DUNGEON_EXIT); + //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) + { + int blockID = world.getBlockId(x, y, z); + int metadata = world.getBlockMetadata(x, y, z); + setBlockDirectly(world, x, y + 1, z, blockID, metadata); + } } private static void createDimensionalDoorLink(NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) -- 2.39.5 From 921b6e88afd9c7e607dcf37539690cadd3efc050 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 19:44:33 -0400 Subject: [PATCH 081/544] Removed Rift Creation and Unused Settings Removed the rift creation code from the Rift Blade and removed unused settings from DDProperties. Specifically, the rift creation flag for the Rift Blade, since that's getting removed, and the RiftSpreadModified, which hasn't been referenced for a while. I also cleaned up the code in Rift Blade slightly. Its special functions worked during testing but blocking did not. I'm not sure why at the moment. --- .../mod_pocketDim/DDProperties.java | 9 -- .../mod_pocketDim/items/ItemRiftBlade.java | 119 ++++-------------- 2 files changed, 22 insertions(+), 106 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/DDProperties.java b/StevenDimDoors/mod_pocketDim/DDProperties.java index a18218d..cb0ea3b 100644 --- a/StevenDimDoors/mod_pocketDim/DDProperties.java +++ b/StevenDimDoors/mod_pocketDim/DDProperties.java @@ -94,14 +94,12 @@ public class DDProperties public final boolean LimboReturnsInventoryEnabled; public final boolean DoorRenderingEnabled; public final boolean TNFREAKINGT_Enabled; - public final boolean RiftBladeRiftCreationEnabled; /** * Other */ public final int NonTntWeight; - public final int RiftSpreadModifier; public final int ClusterGenerationChance; public final int GatewayGenerationChance; public final int MonolithSpawningChance; @@ -166,9 +164,6 @@ public class DDProperties LimboReturnRange = config.get(Configuration.CATEGORY_GENERAL, "Limbo Return Range", 500, "Sets the farthest distance that Limbo can send you upon returning to the Overworld").getInt(); DoorRenderingEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Door Rendering", true).getBoolean(true); - RiftBladeRiftCreationEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Rift Creation with Rift Blade", true, - "Sets whether Rift Blades can create new rifts. If set to false, " + - "they will only be able to create transient doors on existing rifts.").getBoolean(true); TNFREAKINGT_Enabled = config.get(Configuration.CATEGORY_GENERAL, "EXPLOSIONS!!???!!!?!?!!", false).getBoolean(false); NonTntWeight = config.get(Configuration.CATEGORY_GENERAL, "HOWMUCHTNT", 25, @@ -218,10 +213,6 @@ public class DDProperties GatewayGenerationChance = config.get(Configuration.CATEGORY_GENERAL, "Gateway Generation Chance", 10, "Sets the chance (out of " + GatewayGenerator.MAX_GATEWAY_GENERATION_CHANCE + ") that a Rift Gateway will " + "generate in a given chunk. The default chance is 10.").getInt(); - - RiftSpreadModifier = config.get(Configuration.CATEGORY_GENERAL, "Rift Spread Modifier", 3, - "Sets the number of times a rift can spread. 0 prevents rifts from spreading at all. " + - "A value greater than 5 is not recommended as the growth is exponential.").getInt(); LimboBiomeID = config.get(CATEGORY_BIOME, "Limbo Biome ID", 251).getInt(); PocketBiomeID = config.get(CATEGORY_BIOME, "Pocket Biome ID", 250).getInt(); diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index 9fc3115..857a7d8 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -9,7 +9,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.EnumAction; import net.minecraft.item.EnumToolMaterial; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; @@ -20,8 +19,6 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.LinkTypes; -import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -62,8 +59,14 @@ public class ItemRiftBlade extends ItemSword } } - @SideOnly(Side.CLIENT) @Override + public int getDamageVsEntity(Entity par1Entity) + { + return 7; + } + + @Override + @SideOnly(Side.CLIENT) public boolean hasEffect(ItemStack par1ItemStack) { return true; @@ -76,12 +79,6 @@ public class ItemRiftBlade extends ItemSword return true; } - @Override - public int getDamageVsEntity(Entity par1Entity) - { - return 7; - } - @Override public MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean par3) { @@ -139,61 +136,6 @@ public class ItemRiftBlade extends ItemSword return true; } - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack par1ItemStack) - { - return 72000; - } - - @Override - public EnumAction getItemUseAction(ItemStack stack) - { - return properties.RiftBladeRiftCreationEnabled ? EnumAction.bow : EnumAction.block; - } - - @Override - public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int itemInUseCount) - { - //Condition for disabling rift creation - if (!properties.RiftBladeRiftCreationEnabled) - return; - - if (world.isRemote) - return; - - Vec3 var2 = player.getLook(1.0F); - - double cooef = -2; - var2.xCoord *= cooef; - var2.yCoord *= cooef; - var2.zCoord *= cooef; - double var5 = player.posX - var2.xCoord; - double var9 = player.posZ - var2.zCoord; - double var7 = player.posY - var2.yCoord + 2; - - int x = MathHelper.floor_double(var5); - int y = MathHelper.floor_double(var7); - int z = MathHelper.floor_double(var9); - - int orientation = (int) (MathHelper.floor_double((double) ((player.rotationYaw + 90) * 4.0F / 360.0F) + 0.5D) & 3); - - //TODO: This looks weird. Shouldn't we aim to only create rifts on maxed-out usage time? i.e. "<= 0" - if (this.getMaxItemUseDuration(stack) - itemInUseCount > 12 && - ItemDimensionalDoor.canPlace(world, x, y, z) && ItemDimensionalDoor.canPlace(world, x, y + 1, z)) - { - NewDimData dimension = PocketManager.getDimensionData(world); - if (!dimension.isPocketDimension() && dimension.getLink(x, y + 1, z) == null) - { - dimension.createLink(x, y + 1, z, LinkTypes.POCKET); - player.worldObj.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1); - ItemDimensionalDoor.placeDoorBlock(world, x, y, z, orientation, mod_pocketDim.transientDoor); - } - } - } - @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { @@ -212,7 +154,8 @@ public class ItemRiftBlade extends ItemSword double var7 = var3.dotProduct(var4); if( (var7+.1) > 1.0D - 0.025D / var5 ? player.canEntityBeSeen(ent) : false) { - ((ItemRiftBlade) stack.getItem()).teleportToEntity(stack, ent, player); + teleportToEntity(stack, ent, player); + stack.damageItem(3, player); return stack; } } @@ -220,36 +163,33 @@ public class ItemRiftBlade extends ItemSword MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(world, player, false); if (hit != null) { - if (world.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) + int x = hit.blockX; + int y = hit.blockY; + int z = hit.blockZ; + if (world.getBlockId(x, y, z) == properties.RiftBlockID) { - if (PocketManager.getLink(hit.blockX, hit.blockY, hit.blockZ, world) != null) + if (PocketManager.getLink(x, y, z, world) != null) { - Block block = mod_pocketDim.transientDoor; - int x = hit.blockX; - int y = hit.blockY; - int z = hit.blockZ; - - if (player.canPlayerEdit(x, y, z, hit.sideHit, stack) && player.canPlayerEdit(x, y + 1, z, hit.sideHit, stack) && !world.isRemote) + if (player.canPlayerEdit(x, y, z, hit.sideHit, stack) && + player.canPlayerEdit(x, y + 1, z, hit.sideHit, stack)) { int orientation = MathHelper.floor_double((double)((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; if (BaseItemDoor.canPlace(world, x, y, z) && BaseItemDoor.canPlace(world, x, y - 1, z)) { - ItemDimensionalDoor.placeDoorBlock(world, x, y - 1, z, orientation, block); + ItemDimensionalDoor.placeDoorBlock(world, x, y - 1, z, orientation, mod_pocketDim.transientDoor); player.worldObj.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1); - stack.damageItem(10, player); + stack.damageItem(3, player); + return stack; } } } - return stack; } } - //FIXME: Should this be inside or after this IF? player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); } - return stack; } @@ -269,21 +209,6 @@ public class ItemRiftBlade extends ItemSword //That would cause this sword to accept gold as a repair material (since we set material = Gold). return mod_pocketDim.itemStableFabric.itemID == par2ItemStack.itemID ? true : false; } - - @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, - int z, int side, float hitX, float hitY, float hitZ) - { - if (BaseItemDoor.tryItemUse(mod_pocketDim.transientDoor, stack, player, world, x, y, z, side, true, false)) - { - world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1); - return true; - } - else - { - return false; - } - } /** * allows items to add custom lines of information to the mouseover description @@ -292,8 +217,8 @@ public class ItemRiftBlade extends ItemSword @SideOnly(Side.CLIENT) public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Opens a temporary door, has"); - par3List.add("a special teleport attack,"); - par3List.add("and rotates existing doors."); + par3List.add("Creates temporary doors"); + par3List.add("on rifts, rotates doors,"); + par3List.add("and has a teleport attack."); } } -- 2.39.5 From 1d1d0a767cbadcd73d4b81238e7a85993da78745 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 20:14:14 -0400 Subject: [PATCH 082/544] Fixed Doors and Minor Dungeon Change Fixed the regression bug that caused some of our doors to get placed in the wrong direction. Changing doors to inherit from BaseDimDoor caused BlockRotator to assume they weren't dimensional doors because it used "instanceof DimensionalDoor" to check. Thanks for figuring it out, Steven! ^_^ Also made a minor change to dungeon generation. We now check the game rule doMobSpawning and don't spawn Monoliths from DungeonSchematic if the value is false. This is useful for testing without Monoliths around. We still do work to remove the portal frame blocks even if the mobs aren't spawned. --- .../mod_pocketDim/dungeon/DungeonSchematic.java | 17 +++++++++++------ .../mod_pocketDim/schematic/BlockRotator.java | 4 ++-- .../mod_pocketDim/ticking/MonolithSpawner.java | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 2389c82..1d2664b 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -27,6 +27,7 @@ import StevenDimDoors.mod_pocketDim.schematic.InvalidSchematicException; import StevenDimDoors.mod_pocketDim.schematic.ReplacementFilter; import StevenDimDoors.mod_pocketDim.schematic.Schematic; import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; +import StevenDimDoors.mod_pocketDim.ticking.MonolithSpawner; import StevenDimDoors.mod_pocketDim.util.Point4D; public class DungeonSchematic extends Schematic { @@ -251,10 +252,11 @@ public class DungeonSchematic extends Schematic { createExitDoorLink(world, dimension, location, entranceDoorLocation, turnAngle, pocketCenter); } - //Remove end portal frames and spawn Monoliths + //Remove end portal frames and spawn Monoliths, if allowed + boolean canSpawn = MonolithSpawner.isMobSpawningAllowed(); for (Point3D location : monolithSpawnLocations) { - spawnMonolith(world, location, entranceDoorLocation, turnAngle, pocketCenter); + spawnMonolith(world, location, entranceDoorLocation, turnAngle, pocketCenter, canSpawn); } } @@ -317,7 +319,7 @@ public class DungeonSchematic extends Schematic { dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkTypes.DUNGEON); } - private static void spawnMonolith(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) + private static void spawnMonolith(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter, boolean canSpawn) { //Transform the frame block's location to the pocket coordinate system Point3D location = point.clone(); @@ -325,8 +327,11 @@ public class DungeonSchematic extends Schematic { //Remove frame block setBlockDirectly(world, location.getX(), location.getY(), location.getZ(), 0, 0); //Spawn Monolith - Entity mob = new MobMonolith(world); - mob.setLocationAndAngles(location.getX(), location.getY(), location.getZ(), 1, 1); - world.spawnEntityInWorld(mob); + if (canSpawn) + { + Entity mob = new MobMonolith(world); + mob.setLocationAndAngles(location.getX(), location.getY(), location.getZ(), 1, 1); + world.spawnEntityInWorld(mob); + } } } diff --git a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java index 06f14c8..f32c0dc 100644 --- a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java +++ b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java @@ -7,7 +7,7 @@ import net.minecraft.block.BlockRedstoneRepeater; import net.minecraft.block.BlockStairs; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; +import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class BlockRotator { @@ -379,7 +379,7 @@ public class BlockRotator break; } } - else if(Block.blocksList[blockID] instanceof BlockRedstoneRepeater || Block.blocksList[blockID] instanceof BlockDoor || Block.blocksList[blockID] instanceof DimensionalDoor || blockID== Block.tripWireSource.blockID || Block.blocksList[blockID] instanceof BlockComparator) + else if(Block.blocksList[blockID] instanceof BlockRedstoneRepeater || Block.blocksList[blockID] instanceof BlockDoor || Block.blocksList[blockID] instanceof BaseDimDoor || blockID== Block.tripWireSource.blockID || Block.blocksList[blockID] instanceof BlockComparator) { switch (metadata) { diff --git a/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java b/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java index 59f8fb5..fac59e4 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java +++ b/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java @@ -194,7 +194,7 @@ public class MonolithSpawner implements IRegularTickReceiver { } } - private static boolean isMobSpawningAllowed() + public static boolean isMobSpawningAllowed() { //This function is used to retrieve the value of doMobSpawning. The code is the same //as the code used by Minecraft. Jaitsu requested this to make testing easier. ~SenseiKiwi -- 2.39.5 From 87343b45ee8e1f4a7f75b2ecd89ac8335f26d609 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Sat, 7 Sep 2013 20:20:29 -0400 Subject: [PATCH 083/544] Doors are finally doors, not chests! --- .../mod_pocketDim/blocks/BaseDimDoor.java | 187 ++---------------- 1 file changed, 19 insertions(+), 168 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index a23dac6..c017fff 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -4,6 +4,8 @@ import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; +import net.minecraft.block.BlockDoor; +import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; @@ -26,10 +28,14 @@ import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public abstract class BaseDimDoor extends BlockContainer implements IDimDoor +public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEntityProvider { protected final DDProperties properties; private Icon blockIconBottom; + protected boolean isBlockContainer=true; + private boolean isTileProvider = true; + + public BaseDimDoor(int blockID, Material material, DDProperties properties) { @@ -43,6 +49,18 @@ public abstract class BaseDimDoor extends BlockContainer implements IDimDoor this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); } + + @SideOnly(Side.CLIENT) + + /** + * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata + */ + public Icon getIcon(int par1, int par2) + { + return this.blockIcon; + } + + @Override public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) @@ -116,34 +134,6 @@ public abstract class BaseDimDoor extends BlockContainer implements IDimDoor } - /** - * A function to open a door. - */ - public void onPoweredBlockChange(World par1World, int par2, int par3, int par4, boolean par5) - { - int var6 = this.getFullMetadata(par1World, par2, par3, par4); - boolean var7 = (var6 & 4) != 0; - - if (var7 != par5) - { - int var8 = var6 & 7; - var8 ^= 4; - - if ((var6 & 8) == 0) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, var8,2); - par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4); - } - else - { - par1World.setBlockMetadataWithNotify(par2, par3 - 1, par4, var8,2); - par1World.markBlockRangeForRenderUpdate(par2, par3 - 1, par4, par2, par3, par4); - } - - par1World.playAuxSFXAtEntity((EntityPlayer)null, 1003, par2, par3, par4, 0); - } - } - @Override public void onBlockAdded(World world, int x, int y, int z) { @@ -195,82 +185,6 @@ public abstract class BaseDimDoor extends BlockContainer implements IDimDoor tile.openOrClosed = this.isDoorOpen( par1World, par2, par3, par4); tile.orientation = this.getFullMetadata(par1World, par2, par3, par4) & 7; } - - public boolean isDoorOpen(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - return (this.getFullMetadata(par1IBlockAccess, par2, par3, par4) & 4) != 0; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - @Override - public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - int var5 = this.getFullMetadata(par1IBlockAccess, par2, par3, par4); - return (var5 & 4) != 0; - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() - { - return 7; - } - - - /** - * Returns the bounding box of the wired rectangular prism to render. - */ - @Override - @SideOnly(Side.CLIENT) - public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4) - { - this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); - return super.getSelectedBoundingBoxFromPool(par1World, par2, par3, par4); - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) - { - this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); - return super.getCollisionBoundingBoxFromPool(par1World, par2, par3, par4); - } - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - this.setDoorRotation(this.getFullMetadata(par1IBlockAccess, par2, par3, par4)); - } - - /** - * Returns 0, 1, 2 or 3 depending on where the hinge is. - */ - public int getDoorOrientation(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - return this.getFullMetadata(par1IBlockAccess, par2, par3, par4) & 3; - } - private void setDoorRotation(int par1) { float var2 = 0.1875F; @@ -353,14 +267,6 @@ public abstract class BaseDimDoor extends BlockContainer implements IDimDoor } } - /** - * Called when the block is clicked by a player. Args: x, y, z, entityPlayer - */ - @Override - public void onBlockClicked(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer) - { - // System.out.println(this.getFullMetadata(par1World, par2, par3, par4)%4); - } /** * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are @@ -425,61 +331,6 @@ public abstract class BaseDimDoor extends BlockContainer implements IDimDoor } } - /** - * Ray traces through the blocks collision from start vector to end vector returning a ray trace hit. Args: world, - * x, y, z, startVec, endVec - */ - @Override - public MovingObjectPosition collisionRayTrace(World par1World, int par2, int par3, int par4, Vec3 par5Vec3, Vec3 par6Vec3) - { - this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); - return super.collisionRayTrace(par1World, par2, par3, par4, par5Vec3, par6Vec3); - } - - /** - * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z - */ - @Override - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { - return par3 >= 255 ? false : par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) && super.canPlaceBlockAt(par1World, par2, par3, par4) && super.canPlaceBlockAt(par1World, par2, par3 + 1, par4); - } - - /** - * Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility - * and stop pistons - */ - @Override - public int getMobilityFlag() - { - return 2; - } - - /** - * Returns the full metadata value created by combining the metadata of both blocks the door takes up. - */ - public int getFullMetadata(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - int var5 = par1IBlockAccess.getBlockMetadata(par2, par3, par4); - boolean var6 = (var5 & 8) != 0; - int var7; - int var8; - - if (var6) - { - var7 = par1IBlockAccess.getBlockMetadata(par2, par3 - 1, par4); - var8 = var5; - } - else - { - var7 = var5; - var8 = par1IBlockAccess.getBlockMetadata(par2, par3 + 1, par4); - } - - boolean var9 = (var8 & 1) != 0; - return var7 & 7 | (var6 ? 8 : 0) | (var9 ? 16 : 0); - } - /** * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative) */ -- 2.39.5 From 703ec03d294d5c07fb5ea422f32ec2d8c8161917 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 21:25:38 -0400 Subject: [PATCH 084/544] Stopped Cluster/Gateway Generation in The End Added a condition preventing rift clusters and gateways from generating in The End. It's not really useful to do that right now and could actually cause some annoying side-effects. --- StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java index f7379d3..43efc21 100644 --- a/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java +++ b/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java @@ -30,6 +30,7 @@ public class GatewayGenerator implements IWorldGenerator private static final int NETHER_CHANCE_CORRECTION = 4; private static final int OVERWORLD_DIMENSION_ID = 0; private static final int NETHER_DIMENSION_ID = -1; + private static final int END_DIMENSION_ID = 1; private final DDProperties properties; @@ -43,8 +44,9 @@ public class GatewayGenerator implements IWorldGenerator { //Don't generate rifts or gateways if the rift generation flag is disabled, //the current world is a pocket dimension, or the world is remote. - if ((!properties.WorldRiftGenerationEnabled && !(world.provider instanceof LimboProvider)) || - world.provider instanceof PocketProvider || world.isRemote) + //Also don't generate anything in The End. + if (world.isRemote || (!properties.WorldRiftGenerationEnabled && !(world.provider instanceof LimboProvider)) || + (world.provider instanceof PocketProvider) || (world.provider.dimensionId == END_DIMENSION_ID)) { return; } -- 2.39.5 From b5d4df8f6a7f89b0cace96413312d49d3637ac9d Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 21:35:15 -0400 Subject: [PATCH 085/544] Updated LimboDecay Updated LimboDecay to not affect certain blocks from DD. This matters in case we decide to start placing gateways in Limbo again. --- .../mod_pocketDim/ticking/LimboDecay.java | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java b/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java index 999c813..31fc1fe 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java +++ b/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java @@ -24,16 +24,27 @@ public class LimboDecay implements IRegularTickReceiver { //Provides a reversed list of the block IDs that blocks cycle through during decay. private final int[] decaySequence; - private Random random; - private DDProperties properties = null; + private final Random random; + private final DDProperties properties; + private final int[] blocksImmuneToDecay; public LimboDecay(IRegularTickSender tickSender, DDProperties properties) { decaySequence = new int[] { - properties.LimboBlockID, - Block.gravel.blockID, - Block.cobblestone.blockID, - Block.stone.blockID + properties.LimboBlockID, + Block.gravel.blockID, + Block.cobblestone.blockID, + Block.stone.blockID + }; + + blocksImmuneToDecay = new int[] { + properties.LimboBlockID, + properties.PermaFabricBlockID, + properties.TransientDoorID, + properties.DimensionalDoorID, + properties.WarpDoorID, + properties.RiftBlockID, + properties.UnstableDoorID }; this.properties = properties; @@ -151,12 +162,22 @@ public class LimboDecay implements IRegularTickReceiver { } /** - * Checks if a block can decay. We will not decay air, Unraveled Fabric, Eternal Fabric, or containers. + * Checks if a block can decay. We will not decay air, certain DD blocks, or containers. */ private boolean canDecayBlock(int blockID) { - if (blockID == 0 || blockID == properties.LimboBlockID || blockID == properties.PermaFabricBlockID) + if (blockID == 0) + { return false; + } + + for (int k = 0; k < blocksImmuneToDecay.length; k++) + { + if (blockID == blocksImmuneToDecay[k]) + { + return false; + } + } Block block = Block.blocksList[blockID]; return (block == null || !(block instanceof BlockContainer)); -- 2.39.5 From 7280b54c470e1fea0519758499991582880fd215 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 22:16:47 -0400 Subject: [PATCH 086/544] Updated BlockRotator Updated BlockRotator to check if a block is an instance of DoorBlock instead of checking for BaseDimDoor - since we changed BaseDimDoor to derive from DoorBlock, the latter check is no longer needed. --- StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java | 5 ++--- StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index c017fff..a0507fd 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -32,10 +32,8 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn { protected final DDProperties properties; private Icon blockIconBottom; - protected boolean isBlockContainer=true; + protected boolean isBlockContainer = true; private boolean isTileProvider = true; - - public BaseDimDoor(int blockID, Material material, DDProperties properties) { @@ -185,6 +183,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn tile.openOrClosed = this.isDoorOpen( par1World, par2, par3, par4); tile.orientation = this.getFullMetadata(par1World, par2, par3, par4) & 7; } + private void setDoorRotation(int par1) { float var2 = 0.1875F; diff --git a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java index f32c0dc..4248fab 100644 --- a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java +++ b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java @@ -7,7 +7,6 @@ import net.minecraft.block.BlockRedstoneRepeater; import net.minecraft.block.BlockStairs; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class BlockRotator { @@ -379,7 +378,7 @@ public class BlockRotator break; } } - else if(Block.blocksList[blockID] instanceof BlockRedstoneRepeater || Block.blocksList[blockID] instanceof BlockDoor || Block.blocksList[blockID] instanceof BaseDimDoor || blockID== Block.tripWireSource.blockID || Block.blocksList[blockID] instanceof BlockComparator) + else if (Block.blocksList[blockID] instanceof BlockRedstoneRepeater || Block.blocksList[blockID] instanceof BlockDoor || blockID== Block.tripWireSource.blockID || Block.blocksList[blockID] instanceof BlockComparator) { switch (metadata) { -- 2.39.5 From f83841a142ed161ee4bdbe0983ce4926d9a6b7d0 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 23:27:07 -0400 Subject: [PATCH 087/544] Fixed Transdimensional Trapdoor Got the Transdimensional Trapdoor working again. Renamed the file to TransTrapdoor and trimmed off unnecessary code - BlockTrapDoor implements a lot of the necessary logic. Implemented IDimDoor for clarity. --- StevenDimDoors/mod_pocketDim/DDLoot.java | 2 +- .../mod_pocketDim/blocks/BaseDimDoor.java | 6 -- .../mod_pocketDim/blocks/TransTrapdoor.java | 90 +++++++++++++++++++ .../mod_pocketDim/blocks/dimHatch.java | 69 -------------- .../mod_pocketDim/mod_pocketDim.java | 17 ++-- 5 files changed, 99 insertions(+), 85 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java delete mode 100644 StevenDimDoors/mod_pocketDim/blocks/dimHatch.java diff --git a/StevenDimDoors/mod_pocketDim/DDLoot.java b/StevenDimDoors/mod_pocketDim/DDLoot.java index a6be018..37da541 100644 --- a/StevenDimDoors/mod_pocketDim/DDLoot.java +++ b/StevenDimDoors/mod_pocketDim/DDLoot.java @@ -58,7 +58,7 @@ public class DDLoot { addContent(properties.DimensionalDoorLootEnabled, items, mod_pocketDim.itemDimDoor.itemID, UNCOMMON_LOOT_WEIGHT); addContent(properties.WarpDoorLootEnabled, items, mod_pocketDim.itemExitDoor.itemID, UNCOMMON_LOOT_WEIGHT); - addContent(properties.TransTrapdoorLootEnabled, items, mod_pocketDim.dimHatch.blockID, UNCOMMON_LOOT_WEIGHT); + addContent(properties.TransTrapdoorLootEnabled, items, mod_pocketDim.transTrapdoor.blockID, UNCOMMON_LOOT_WEIGHT); addContent(properties.RiftSignatureLootEnabled, items, mod_pocketDim.itemLinkSignature.itemID, UNCOMMON_LOOT_WEIGHT); addContent(properties.StableFabricLootEnabled, items, mod_pocketDim.itemStableFabric.itemID, UNCOMMON_LOOT_WEIGHT); addContent(properties.RiftRemoverLootEnabled, items, mod_pocketDim.itemRiftRemover.itemID, UNCOMMON_LOOT_WEIGHT); diff --git a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index a0507fd..851aaa9 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -3,7 +3,6 @@ package StevenDimDoors.mod_pocketDim.blocks; import java.util.Random; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.BlockDoor; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; @@ -11,11 +10,8 @@ import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Icon; import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; @@ -32,8 +28,6 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn { protected final DDProperties properties; private Icon blockIconBottom; - protected boolean isBlockContainer = true; - private boolean isTileProvider = true; public BaseDimDoor(int blockID, Material material, DDProperties properties) { diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java new file mode 100644 index 0000000..c5bb7bc --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java @@ -0,0 +1,90 @@ +package StevenDimDoors.mod_pocketDim.blocks; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockTrapDoor; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.DDTeleporter; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.world.PocketProvider; + +public class TransTrapdoor extends BlockTrapDoor implements IDimDoor +{ + + public TransTrapdoor(int blockID, Material material) + { + super(blockID, material); + this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); + } + + @Override + public void registerIcons(IconRegister par1IconRegister) + { + this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()); + } + + //Teleports the player to the exit link of that dimension, assuming it is a pocket + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) + { + enterDimDoor(world, x, y, z, entity); + } + + @Override + public void enterDimDoor(World world, int x, int y, int z, Entity entity) + { + if (!world.isRemote && isTrapdoorOpen(world.getBlockMetadata(x, y, z))) + { + this.onPoweredBlockChange(world, x, y, z, false); + + DimLink link = PocketManager.getLink(x, y, z, world); + if (link != null) + { + DDTeleporter.traverseDimDoor(world, link, entity); + } + } + } + + @Override + public void onBlockAdded(World world, int x, int y, int z) + { + this.placeDimDoor(world, x, y, z); + //world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); + //this.updateAttachedTile(world, x, y, z); + } + + + @Override + public void placeDimDoor(World world, int x, int y, int z) + { + if (!world.isRemote) + { + NewDimData dimension = PocketManager.getDimensionData(world); + DimLink link = dimension.getLink(x, y, z); + if (link == null && dimension.isPocketDimension()) + { + dimension.createLink(x, y, z, LinkTypes.UNSAFE_EXIT); + } + } + } + + @Override + public int idDropped(int metadata, Random random, int fortuneLevel) + { + return getDrops(); + } + + @Override + public int getDrops() + { + return Block.trapdoor.blockID; + } +} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java b/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java deleted file mode 100644 index c4b528b..0000000 --- a/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java +++ /dev/null @@ -1,69 +0,0 @@ -package StevenDimDoors.mod_pocketDim.blocks; - -import net.minecraft.block.BlockTrapDoor; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.world.PocketProvider; - -public class dimHatch extends BlockTrapDoor -{ - - public dimHatch(int par1,int par2, Material par2Material) - { - super(par1, Material.iron); - this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - // this.setTextureFile("/PocketBlockTextures.png"); - // this.blockIndexInTexture = 16; - } - - public void registerIcons(IconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()); - - } - - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) - { - - { - int var10 = par1World.getBlockMetadata(par2, par3, par4); - par1World.setBlockMetadataWithNotify(par2, par3, par4, var10 ^ 4,2); - par1World.playAuxSFXAtEntity(par5EntityPlayer, 1003, par2, par3, par4, 0); - return true; - } - } - - //Teleports the player to the exit link of that dimension, assuming it is a pocket - public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity) - { - int num = par1World.getBlockMetadata(par2, par3, par4); - - if (!par1World.isRemote&&(num>3&&num<8||num>11)&&par1World.provider instanceof PocketProvider) - { - this.onPoweredBlockChange(par1World, par2, par3, par4, false); - - /* FIXME: No point in fixing the following code when it's going to be rewritten later anyway. ~SenseiKiwi - - NewDimData newDimData = (NewDimData) dimHelper.PocketManager.dimList.get(par1World.provider.dimensionId); - ILinkData exitLink=newDimData.exitDimLink; - exitLink.locDimID=par1World.provider.dimensionId; - PocketManager.instance.traverseDimDoor(par1World, exitLink, par5Entity);*/ - } - } - - public void onPoweredBlockChange(World par1World, int par2, int par3, int par4, boolean par5) - { - int var6 = par1World.getBlockMetadata(par2, par3, par4); - boolean var7 = (var6 & 4) > 0; - - if (var7 != par5) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, var6 ^ 4,2); - par1World.playAuxSFXAtEntity((EntityPlayer)null, 1003, par2, par3, par4, 0); - } - } -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 0dd6474..fe576f2 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -20,7 +20,7 @@ import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; import StevenDimDoors.mod_pocketDim.blocks.TransientDoor; import StevenDimDoors.mod_pocketDim.blocks.UnstableDoor; import StevenDimDoors.mod_pocketDim.blocks.WarpDoor; -import StevenDimDoors.mod_pocketDim.blocks.dimHatch; +import StevenDimDoors.mod_pocketDim.blocks.TransTrapdoor; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.items.ItemBlockDimWall; @@ -94,7 +94,7 @@ public class mod_pocketDim public static Block blockLimbo; public static DimensionalDoor dimensionalDoor; public static Block blockDimWall; - public static Block dimHatch; + public static Block transTrapdoor; public static Block blockDimWallPerm; public static BlockRift blockRift; @@ -167,9 +167,8 @@ public class mod_pocketDim blockLimbo = new BlockLimbo(properties.LimboBlockID, 15, Material.iron, properties.LimboDimensionID, decay).setHardness(.2F).setUnlocalizedName("BlockLimbo").setLightValue(.0F); unstableDoor = (new UnstableDoor(properties.UnstableDoorID, Material.iron, properties).setHardness(.2F).setUnlocalizedName("chaosDoor").setLightValue(.0F) ); dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(properties.DimensionalDoorID, Material.iron, properties).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor")); - dimHatch = (new dimHatch(properties.TransTrapdoorID, 84, Material.iron)).setHardness(1.0F) .setUnlocalizedName("dimHatch"); - // dimRail = (new DimRail(dimRailID, 88, false)).setHardness(.5F) .setUnlocalizedName("dimRail"); - + transTrapdoor = (new TransTrapdoor(properties.TransTrapdoorID, Material.wood)).setHardness(1.0F) .setUnlocalizedName("dimHatch"); + itemDimDoor = (new ItemDimensionalDoor(properties.DimensionalDoorItemID, Material.iron)).setUnlocalizedName("itemDimDoor"); itemExitDoor = (new ItemWarpDoor(properties.WarpDoorItemID, Material.wood)).setUnlocalizedName("itemDimDoorWarp"); itemLinkSignature = (new ItemRiftSignature(properties.RiftSignatureItemID)).setUnlocalizedName("itemLinkSignature"); @@ -189,7 +188,7 @@ public class mod_pocketDim GameRegistry.registerBlock(blockRift, "Rift"); GameRegistry.registerBlock(blockLimbo, "Unraveled Fabric"); GameRegistry.registerBlock(dimensionalDoor, "Dimensional Door"); - GameRegistry.registerBlock(dimHatch,"Transdimensional Trapdoor"); + GameRegistry.registerBlock(transTrapdoor,"Transdimensional Trapdoor"); GameRegistry.registerBlock(blockDimWallPerm, "Fabric of RealityPerm"); GameRegistry.registerBlock(transientDoor, "transientDoor"); @@ -207,7 +206,7 @@ public class mod_pocketDim LanguageRegistry.addName(blockDimWall , "Fabric of Reality"); LanguageRegistry.addName(blockDimWallPerm , "Eternal Fabric"); LanguageRegistry.addName(dimensionalDoor, "Dimensional Door"); - LanguageRegistry.addName(dimHatch, "Transdimensional Trapdoor"); + LanguageRegistry.addName(transTrapdoor, "Transdimensional Trapdoor"); LanguageRegistry.addName(itemExitDoor, "Warp Door"); LanguageRegistry.addName(itemLinkSignature , "Rift Signature"); @@ -271,12 +270,12 @@ public class mod_pocketDim } if(properties.CraftingTransTrapdoorAllowed) { - GameRegistry.addRecipe(new ItemStack(dimHatch, 1), new Object[] + GameRegistry.addRecipe(new ItemStack(transTrapdoor, 1), new Object[] { " y ", " x ", " y ", 'x', Item.enderPearl, 'y', Block.trapdoor }); - GameRegistry.addRecipe(new ItemStack(dimHatch, 1), new Object[] + GameRegistry.addRecipe(new ItemStack(transTrapdoor, 1), new Object[] { " y ", " x ", " y ", 'x', mod_pocketDim.itemStableFabric, 'y', Block.trapdoor }); -- 2.39.5 From 8dc47e8befb2967b5b8686930654007c49198ab3 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Sun, 8 Sep 2013 02:49:36 -0400 Subject: [PATCH 088/544] Added rendering effect to dimHatch --- .../mod_pocketDim/blocks/dimHatch.java | 61 +++++- .../mod_pocketDim/mod_pocketDim.java | 2 + .../tileentities/TileEntityDimHatch.java | 78 +++++++ .../mod_pocketDimClient/ClientProxy.java | 2 + .../RenderDimTrapDoor.java | 200 ++++++++++++++++++ 5 files changed, 342 insertions(+), 1 deletion(-) create mode 100644 StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimHatch.java create mode 100644 StevenDimDoors/mod_pocketDimClient/RenderDimTrapDoor.java diff --git a/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java b/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java index c4b528b..94653b6 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java +++ b/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java @@ -1,15 +1,22 @@ package StevenDimDoors.mod_pocketDim.blocks; +import java.util.Random; + import net.minecraft.block.BlockTrapDoor; +import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimHatch; import StevenDimDoors.mod_pocketDim.world.PocketProvider; -public class dimHatch extends BlockTrapDoor +public class dimHatch extends BlockTrapDoor implements IDimDoor, ITileEntityProvider { public dimHatch(int par1,int par2, Material par2Material) @@ -66,4 +73,56 @@ public class dimHatch extends BlockTrapDoor par1World.playAuxSFXAtEntity((EntityPlayer)null, 1003, par2, par3, par4, 0); } } + + public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) + { + TileEntityDimHatch tile = (TileEntityDimHatch) par1World.getBlockTileEntity(par2, par3, par4); + tile.hasRift = PocketManager.getLink(par2, par3, par4, par1World)!=null; + tile.metaData = par1World.getBlockMetadata(par2, par3, par4); + tile.isShut = this.isTrapdoorOpen(par4); + } + @Override + public TileEntity createNewTileEntity(World world) + { + + return new TileEntityDimHatch(); + } + + public dimHatch updateAttachedTile(World world, int x, int y, int z) + { + TileEntity tile = world.getBlockTileEntity(x, y, z); + if (tile instanceof TileEntityDimHatch) + { + TileEntityDimHatch dimTile = (TileEntityDimHatch) tile; + dimTile.hasRift = PocketManager.getLink(x, y, z, world)!=null; + dimTile.metaData = world.getBlockMetadata(x, y, z); + dimTile.isShut = this.isTrapdoorOpen( world.getBlockMetadata(x, y, z)); + } + return this; + } + @Override + public void enterDimDoor(World world, int x, int y, int z, Entity entity) { + // TODO Auto-generated method stub + + } + + @Override + public void placeDimDoor(World world, int x, int y, int z) { + // TODO Auto-generated method stub + + } + + @Override + public void onBlockAdded(World world, int x, int y, int z) + { + world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); + this.updateAttachedTile(world, x, y, z); + } + @Override + public int getDrops() { + // TODO Auto-generated method stub + return 0; + } + + } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 0dd6474..e55ba6c 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -38,6 +38,7 @@ import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; import StevenDimDoors.mod_pocketDim.ticking.MonolithSpawner; import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimHatch; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDim.world.BiomeGenLimbo; import StevenDimDoors.mod_pocketDim.world.BiomeGenPocket; @@ -229,6 +230,7 @@ public class mod_pocketDim GameRegistry.registerTileEntity(TileEntityDimDoor.class, "TileEntityDimDoor"); GameRegistry.registerTileEntity(TileEntityRift.class, "TileEntityRift"); + GameRegistry.registerTileEntity(TileEntityDimHatch.class, "TileEntityDimHatch"); EntityRegistry.registerModEntity(MobMonolith.class, "Monolith", properties.MonolithEntityID, this, 70, 1, true); EntityList.IDtoClassMapping.put(properties.MonolithEntityID, MobMonolith.class); diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimHatch.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimHatch.java new file mode 100644 index 0000000..b2b658c --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimHatch.java @@ -0,0 +1,78 @@ +package StevenDimDoors.mod_pocketDim.tileentities; + +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class TileEntityDimHatch extends TileEntity + +{ + public boolean hasRift; + public boolean isShut; + public int metaData; + + + + + public boolean shouldRefresh(int oldID, int newID, int oldMeta, int newMeta, World world, int x, int y, int z) + { + if(newID==0&&PocketManager.getLink(x, y, z, world)!=null) + { + world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); + } + return true; + } + + public boolean canUpdate() + { + return true; + } + + public void updateEntity() + { + System.out.println(this.worldObj.getBlockMetadata(xCoord, yCoord, zCoord)); + + } + + @Override + public void readFromNBT(NBTTagCompound nbt) + { + super.readFromNBT(nbt); + int i = nbt.getInteger(("Size")); + + try + { + this.hasRift = nbt.getBoolean("hasRift"); + this.isShut = nbt.getBoolean("isShut"); + + this.metaData = nbt.getInteger("metaData"); + + + + + + + } + catch (Exception e) + { + + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) + { + int i = 0; + super.writeToNBT(nbt); + nbt.setBoolean("hasRift", this.hasRift); + nbt.setBoolean("isShut", this.isShut); + + + nbt.setInteger("metaData", this.metaData); + + + + } +} diff --git a/StevenDimDoors/mod_pocketDimClient/ClientProxy.java b/StevenDimDoors/mod_pocketDimClient/ClientProxy.java index 7cb1469..1e6fd5d 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClientProxy.java +++ b/StevenDimDoors/mod_pocketDimClient/ClientProxy.java @@ -3,6 +3,7 @@ import net.minecraft.src.ModLoader; import StevenDimDoors.mod_pocketDim.CommonProxy; import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimHatch; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; @@ -15,6 +16,7 @@ public class ClientProxy extends CommonProxy { //MinecraftForgeClient.preloadTexture(BLOCK_PNG); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDimDoor.class, new RenderDimDoor()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDimHatch.class, new RenderDimTrapDoor()); //This code activates the new rift rendering, as well as a bit of code in TileEntityRift //ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRift.class, new RenderRift()); diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimTrapDoor.java b/StevenDimDoors/mod_pocketDimClient/RenderDimTrapDoor.java new file mode 100644 index 0000000..a51f1d2 --- /dev/null +++ b/StevenDimDoors/mod_pocketDimClient/RenderDimTrapDoor.java @@ -0,0 +1,200 @@ +package StevenDimDoors.mod_pocketDimClient; + +import java.nio.FloatBuffer; +import java.util.Random; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; + +import org.lwjgl.opengl.GL11; + +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.dimHatch; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimHatch; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class RenderDimTrapDoor extends TileEntitySpecialRenderer +{ + FloatBuffer field_76908_a = GLAllocation.createDirectFloatBuffer(16); + + public RenderDimTrapDoor() + { + if (properties == null) + properties = DDProperties.instance(); + } + + private static DDProperties properties = null; + + /** + * Renders the dimdoor. + */ + public void renderDimHatchTileEntity(TileEntityDimHatch tile, double x, double y, double z, float par8) + { + try + { + ( (dimHatch) mod_pocketDim.dimHatch).updateAttachedTile(tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord); + } + catch(Exception e) + { + e.printStackTrace(); + } + + + // float playerX = (float)this.tileEntityRenderer.playerX; + // float playerY = (float)this.tileEntityRenderer.playerY; + // float playerZ = (float)this.tileEntityRenderer.playerZ; + + //float distance = (float) tile.getDistanceFrom(playerX, playerY, playerZ); + GL11.glDisable(GL11.GL_LIGHTING); + Random rand = new Random(31100L); + float var13 = 0.75F; + + + + for (int count = 0; count < 16; ++count) + { + GL11.glPushMatrix(); + float var15 = (float)(16 - count); + float var16 = 0.2625F; + float var17 = 1.0F / (var15 + 1.0F); + + if (count == 0) + { + this.bindTextureByName("/RIFT.png"); + var17 = 0.1F; + var15 = 25.0F; + var16 = 0.125F; + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + } + + if (count == 1) + { + this.bindTextureByName("/WARP.png"); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + var16 = .5F; + } + + + + GL11.glTranslatef( (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F,0, 0.0F); + GL11.glTranslatef(0, (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F, 0.0F); + + GL11.glTranslatef(0,0, (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F); + + GL11.glTexGeni(GL11.GL_S, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); + GL11.glTexGeni(GL11.GL_T, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); + GL11.glTexGeni(GL11.GL_R, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); + GL11.glTexGeni(GL11.GL_Q, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_EYE_LINEAR); + + GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); + GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); + GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); + + + GL11.glEnable(GL11.GL_TEXTURE_GEN_S); + GL11.glEnable(GL11.GL_TEXTURE_GEN_T); + GL11.glEnable(GL11.GL_TEXTURE_GEN_R); + GL11.glEnable(GL11.GL_TEXTURE_GEN_Q); + GL11.glPopMatrix(); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glPushMatrix(); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F*var15, 0.0F); + GL11.glScalef(var16, var16, var16); + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + GL11.glRotatef((float)(count * count * 4321 + count * 9) * 2.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + + GL11.glBegin(GL11.GL_QUADS); + + + + + float var21 = rand.nextFloat() * 0.5F + 0.1F; + float var22 = rand.nextFloat() * 0.4F + 0.4F; + float var23 = rand.nextFloat() * 0.6F + 0.5F; + + if (count == 0) + { + var23 = 1.0F; + var22 = 1.0F; + } + GL11.glColor4d(var21 * var17, var22 * var17, var23 * var17, 1.0F); + if(tile.metaData>7) + { + if(tile.isShut) + { + GL11.glVertex3d(x, y+0.85, z); + GL11.glVertex3d(x, y+0.85, z+1); + GL11.glVertex3d(x+1 , y+0.85 , z+1); + GL11.glVertex3d(x+1 , y+0.85 , z); + } + else + { + GL11.glVertex3d(x, y+0.95, z); + GL11.glVertex3d(x, y+0.95, z+1); + GL11.glVertex3d(x+1 , y+0.95 , z+1); + GL11.glVertex3d(x+1 , y+0.95 , z); + + } + + + } + else + { + if(tile.isShut) + { + GL11.glVertex3d(x, y+0.2, z); + GL11.glVertex3d(x, y+0.2, z+1); + GL11.glVertex3d(x+1 , y+0.2 , z+1); + GL11.glVertex3d(x+1 , y+0.2 , z); + } + else + { + GL11.glVertex3d(x, y+0.15, z); + GL11.glVertex3d(x, y+0.15, z+1); + GL11.glVertex3d(x+1 , y+0.15 , z+1); + GL11.glVertex3d(x+1 , y+0.15 , z); + } + + } + + GL11.glEnd(); + + GL11.glPopMatrix(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + } + + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_TEXTURE_GEN_S); + GL11.glDisable(GL11.GL_TEXTURE_GEN_T); + GL11.glDisable(GL11.GL_TEXTURE_GEN_R); + GL11.glDisable(GL11.GL_TEXTURE_GEN_Q); + GL11.glEnable(GL11.GL_LIGHTING); + } + + private FloatBuffer getFloatBuffer(float par1, float par2, float par3, float par4) + { + this.field_76908_a.clear(); + this.field_76908_a.put(par1).put(par2).put(par3).put(par4); + this.field_76908_a.flip(); + return this.field_76908_a; + } + + public void renderTileEntityAt(TileEntity par1TileEntity, double par2, double par4, double par6, float par8) + { + if (properties.DoorRenderingEnabled) + { + this.renderDimHatchTileEntity((TileEntityDimHatch)par1TileEntity, par2, par4, par6, par8); + } + } +} -- 2.39.5 From 44b39be7b78ff327ed14693c7ff15c6916fbf4b5 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 8 Sep 2013 15:18:48 -0400 Subject: [PATCH 089/544] Modified RiftFX Classes Modifed the RiftFX classes so that their particles have noClip = true. This avoids rifts spamming the collision events of other blocks, including dimensional doors, and it should improve the performance of DD a little. --- StevenDimDoors/mod_pocketDimClient/ClosingRiftFX.java | 2 +- StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java | 2 +- StevenDimDoors/mod_pocketDimClient/RiftFX.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/StevenDimDoors/mod_pocketDimClient/ClosingRiftFX.java b/StevenDimDoors/mod_pocketDimClient/ClosingRiftFX.java index d252ba8..f1e409c 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClosingRiftFX.java +++ b/StevenDimDoors/mod_pocketDimClient/ClosingRiftFX.java @@ -31,7 +31,7 @@ public class ClosingRiftFX extends EntityFX this.field_92047_az = par14EffectRenderer; this.particleScale *= .55F; this.particleMaxAge = 30 + this.rand.nextInt(16); - this.noClip = false; + this.noClip = true; } public void func_92045_e(boolean par1) diff --git a/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java b/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java index 2f8999f..339e002 100644 --- a/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java +++ b/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java @@ -31,7 +31,7 @@ public class GoggleRiftFX extends EntityFireworkSparkFX this.field_92047_az = par14EffectRenderer; this.particleScale *= .55F; this.particleMaxAge = 30 + this.rand.nextInt(16); - this.noClip = false; + this.noClip = true; } public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) { diff --git a/StevenDimDoors/mod_pocketDimClient/RiftFX.java b/StevenDimDoors/mod_pocketDimClient/RiftFX.java index 69310f0..06a9c31 100644 --- a/StevenDimDoors/mod_pocketDimClient/RiftFX.java +++ b/StevenDimDoors/mod_pocketDimClient/RiftFX.java @@ -31,7 +31,7 @@ public class RiftFX extends EntityFX this.field_92047_az = par14EffectRenderer; this.particleScale *= 0.75F; this.particleMaxAge = 40 + this.rand.nextInt(26); - this.noClip = false; + this.noClip = true; } public void func_92045_e(boolean par1) -- 2.39.5 From 672c19b032a3231435d74fd0cfc476e461574cd2 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 8 Sep 2013 15:22:03 -0400 Subject: [PATCH 090/544] Improved Dim Door Collision Detection Improved our code for checking whether an entity in contact with a door should be teleported. Now the check works better, works for Minecarts, and is more readable. It also ignores particle effect entities. --- .../mod_pocketDim/blocks/BaseDimDoor.java | 57 +++++++++++++++---- .../mod_pocketDim/blocks/TransientDoor.java | 49 +++++++++++----- 2 files changed, 80 insertions(+), 26 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index 851aaa9..a923bc7 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -6,8 +6,10 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockDoor; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; +import net.minecraft.client.particle.EntityFX; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; @@ -361,20 +363,39 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn @Override public void enterDimDoor(World world, int x, int y, int z, Entity entity) { - int var12 = (int) (MathHelper.floor_double((double) ((entity.rotationYaw + 90) * 4.0F / 360.0F) + 0.5D) & 3); - - int orientation = world.getBlockMetadata(x, y - 1, z); - if (!world.isRemote && (orientation >= 4 && orientation <= 7) && (orientation - 4) == var12 && - world.getBlockId(x, y - 1, z) == this.blockID) + // We need to ignore particle entities + if (world.isRemote || entity instanceof EntityFX) { - this.onPoweredBlockChange(world, x, y, z, false); - - DimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); - if (link != null) + return; + } + + // Check that this is the top block of the door + if (world.getBlockId(x, y - 1, z) == this.blockID) + { + int metadata = world.getBlockMetadata(x, y - 1, z); + boolean canUse = isDoorOpen(metadata); + if (canUse && entity instanceof EntityLiving) { - DDTeleporter.traverseDimDoor(world, link, entity); + // Don't check for non-living entities since it might not work right + canUse = isEntityFacingDoor(metadata, (EntityLiving) entity); } - } + if (canUse) + { + // Teleport the entity through the link, if it exists + DimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); + if (link != null) + { + DDTeleporter.traverseDimDoor(world, link, entity); + } + // Close the door only after the entity goes through + // so players don't have it slam in their faces. + this.onPoweredBlockChange(world, x, y, z, false); + } + } + else if (world.getBlockId(x, y + 1, z) == this.blockID) + { + enterDimDoor(world, x, y + 1, z, entity); + } } @Override @@ -382,4 +403,18 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn { return this.blockID; } + + protected static boolean isDoorOpen(int metadata) + { + return (metadata & 4) != 0; + } + + protected static boolean isEntityFacingDoor(int metadata, EntityLiving entity) + { + // Although any entity has the proper fields for this check, + // we should only apply it to living entities since things + // like Minecarts might come in backwards. + int direction = (int) (MathHelper.floor_double((double) ((entity.rotationYaw + 90) * 4.0F / 360.0F) + 0.5D) & 3); + return ((metadata & 3) == direction); + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java index e0d7c1d..3bc59db 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java @@ -1,9 +1,10 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.block.material.Material; +import net.minecraft.client.particle.EntityFX; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; @@ -18,25 +19,43 @@ public class TransientDoor extends BaseDimDoor { super(blockID, material, properties); } - + @Override public void enterDimDoor(World world, int x, int y, int z, Entity entity) { - //TODO: Would it kill us to use REASONABLE variable names? <_< ~SenseiKiwi - int var12 = (int) (MathHelper.floor_double((double) ((entity.rotationYaw + 90) * 4.0F / 360.0F) + 0.5D) & 3); - - int orientation = world.getBlockMetadata(x, y - 1, z); - if (!world.isRemote && orientation == var12 && world.getBlockId(x, y - 1, z) == this.blockID) + // We need to ignore particle entities + if (world.isRemote || entity instanceof EntityFX) { - DimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); - if (link != null) + return; + } + + // Check that this is the top block of the door + if (world.getBlockId(x, y - 1, z) == this.blockID) + { + boolean canUse = true; + int metadata = world.getBlockMetadata(x, y - 1, z); + if (canUse && entity instanceof EntityLiving) { - DDTeleporter.traverseDimDoor(world, link, entity); - //Turn the transient door into a rift AFTER teleporting the entity. - //The door's orientation may be needed for generating a room at the link's destination. - world.setBlock(x, y, z, properties.RiftBlockID); - world.setBlockToAir(x, y - 1, z); + // Don't check for non-living entities since it might not work right + canUse = BaseDimDoor.isEntityFacingDoor(metadata, (EntityLiving) entity); } + if (canUse) + { + // Teleport the entity through the link, if it exists + DimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); + if (link != null) + { + DDTeleporter.traverseDimDoor(world, link, entity); + // Turn the door into a rift AFTER teleporting the player. + // The door's orientation may be necessary for the teleport. + world.setBlock(x, y, z, properties.RiftBlockID); + world.setBlockToAir(x, y - 1, z); + } + } + } + else if (world.getBlockId(x, y + 1, z) == this.blockID) + { + enterDimDoor(world, x, y + 1, z, entity); } } @@ -53,7 +72,7 @@ public class TransientDoor extends BaseDimDoor } } } - + @Override public int getDrops() { -- 2.39.5 From 72213de4377a3618fe827879b3c2e951c2ab2363 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 8 Sep 2013 15:22:19 -0400 Subject: [PATCH 091/544] Minor Change Removed unused import in TransTrapdoor --- StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java | 1 - 1 file changed, 1 deletion(-) diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java index c5bb7bc..ee7e2c4 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java @@ -14,7 +14,6 @@ import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.world.PocketProvider; public class TransTrapdoor extends BlockTrapDoor implements IDimDoor { -- 2.39.5 From 37b05106767d762db0588a9442b99f089ba03716 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 8 Sep 2013 15:23:14 -0400 Subject: [PATCH 092/544] Partially Improved Unsafe Exits Partially completed the code for unsafe exits (used for trapdoors) so that they drop players into air pockets. It's not complete yet, but I want to merge in other changes before continuing. --- .../mod_pocketDim/core/DDTeleporter.java | 27 +++++--- .../mod_pocketDim/helpers/yCoordHelper.java | 65 +++++++++++++++++++ 2 files changed, 82 insertions(+), 10 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 5f693c8..a6edec6 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -150,7 +150,7 @@ public class DDTeleporter { throw new IllegalStateException("The destination world should be loaded!"); } - + //Check if the block below that point is actually a door int blockID = world.getBlockId(door.getX(), door.getY() - 1, door.getZ()); if (blockID != properties.DimensionalDoorID && blockID != properties.WarpDoorID && @@ -436,9 +436,9 @@ public class DDTeleporter private static boolean generateUnsafeExit(DimLink link) { - // An unsafe exit teleports the user to exactly the same coordinates - // as the link source, except located at the dimension's root dimension. - // This is very risky, as we make no effort to clear an air pocket or + // An unsafe exit teleports the user to the first available air space + // in the pocket's root dimension. X and Z are kept roughly the same + // as the source location, but Y is set by searching down. We don't // place a platform at the destination. We also don't place a reverse // link at the destination, so it's a one-way trip. Good luck! @@ -449,13 +449,20 @@ public class DDTeleporter if (current.isPocketDimension()) { Point4D source = link.source(); - current.root().setDestination(link, source.getX(), source.getY(), source.getZ()); - return true; - } - else - { - return false; + World world = PocketManager.loadDimension(current.root().id()); + if (world == null) + { + return false; + } + + Point3D destination = yCoordHelper.findDropPoint(world, source.getX(), source.getY(), source.getZ()); + if (destination != null) + { + current.root().setDestination(link, source.getX(), source.getY(), source.getZ()); + return true; + } } + return false; } private static boolean generateSafeExit(DimLink link, DDProperties properties) diff --git a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java index ec514e3..1ac8519 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java @@ -217,6 +217,71 @@ public class yCoordHelper } return target; } + + public static Point3D findDropPoint(World world, int x, int y, int z) + { + /*// Find a simple 2-block-high air gap + // Search across a 3x3 column + int localX = x < 0 ? (x % 16) + 16 : (x % 16); + int localZ = z < 0 ? (z % 16) + 16 : (z % 16); + int cornerX = x - localX; + int cornerZ = z - localZ; + localX = MathHelper.clamp_int(localX, 1, 14); + localZ = MathHelper.clamp_int(localZ, 1, 14); + + Chunk chunk = initializeChunkArea(world, x >> 4, z >> 4); + + int height = world.getActualHeight(); + int y, dx, dz, blockID; + boolean isSafe; + boolean hasBlocks; + Block block; + int layers = 0; + + // Check if a 3x3 layer of blocks is empty + // If we find a layer that contains replaceable blocks, it can + // serve as the base where we'll place the player and door. + for (y = Math.min(startY + 2, height - 1); y >= 0; y--) + { + isSafe = true; + hasBlocks = false; + for (dx = -1; dx <= 1 && isSafe; dx++) + { + for (dz = -1; dz <= 1 && isSafe; dz++) + { + blockID = chunk.getBlockID(localX + dx, y, localZ + dz); + if (blockID != 0) + { + block = Block.blocksList[blockID]; + if (!block.blockMaterial.isReplaceable()) + { + if (layers >= 3) + { + return new Point3D(localX + cornerX, y + 1, localZ + cornerZ); + } + isSafe = false; + } + hasBlocks = true; + } + } + } + if (isSafe) + { + layers++; + if (hasBlocks) + { + if (layers >= 3) + { + return new Point3D(localX + cornerX, y, localZ + cornerZ); + } + layers = 0; + } + } + } + return null;*/ + // Temporary measure to not break the build + return new Point3D(x, y - 2, z); + } public static int adjustDestinationY(int y, int worldHeight, int entranceY, int dungeonHeight) { -- 2.39.5 From 4501e9373f7249f7164480b8ccd391f623b29c07 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 8 Sep 2013 16:45:28 -0400 Subject: [PATCH 093/544] Finished Merging Changes to Trapdoor Merged together the different changes we had made to Transdimensional Trapdoors. Cleaned up the rendering and tile entity code a bit, it should be a little more understandable now. --- .../mod_pocketDim/blocks/TransTrapdoor.java | 35 ++++- .../mod_pocketDim/blocks/dimHatch.java | 128 ------------------ .../mod_pocketDim/mod_pocketDim.java | 8 +- .../tileentities/TileEntityTransTrapdoor.java | 91 +++++-------- .../mod_pocketDimClient/ClientProxy.java | 2 +- ...TrapDoor.java => RenderTransTrapdoor.java} | 81 +++++------ 6 files changed, 104 insertions(+), 241 deletions(-) delete mode 100644 StevenDimDoors/mod_pocketDim/blocks/dimHatch.java rename StevenDimDoors/mod_pocketDimClient/{RenderDimTrapDoor.java => RenderTransTrapdoor.java} (84%) diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java index ee7e2c4..55eb613 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java @@ -4,9 +4,11 @@ import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockTrapDoor; +import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; @@ -14,8 +16,9 @@ import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor; -public class TransTrapdoor extends BlockTrapDoor implements IDimDoor +public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntityProvider { public TransTrapdoor(int blockID, Material material) @@ -56,10 +59,31 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor public void onBlockAdded(World world, int x, int y, int z) { this.placeDimDoor(world, x, y, z); - //world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); - //this.updateAttachedTile(world, x, y, z); + world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); + this.updateAttachedTile(world, x, y, z); + } + + public void updateTick(World world, int x, int y, int z, Random random) + { + TileEntityTransTrapdoor tile = (TileEntityTransTrapdoor) world.getBlockTileEntity(x, y, z); + tile.hasRift = PocketManager.getLink(x, y, z, world) != null; + } + + @Override + public TileEntity createNewTileEntity(World world) + { + return new TileEntityTransTrapdoor(); } + public void updateAttachedTile(World world, int x, int y, int z) + { + TileEntity tile = world.getBlockTileEntity(x, y, z); + if (tile instanceof TileEntityTransTrapdoor) + { + TileEntityTransTrapdoor trapdoorTile = (TileEntityTransTrapdoor) tile; + trapdoorTile.hasRift = (PocketManager.getLink(x, y, z, world) != null); + } + } @Override public void placeDimDoor(World world, int x, int y, int z) @@ -86,4 +110,9 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor { return Block.trapdoor.blockID; } + + public static boolean isTrapdoorOnBlock(int metadata) + { + return (metadata & 8) == 0; + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java b/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java deleted file mode 100644 index c1f8551..0000000 --- a/StevenDimDoors/mod_pocketDim/blocks/dimHatch.java +++ /dev/null @@ -1,128 +0,0 @@ -package StevenDimDoors.mod_pocketDim.blocks; - -import java.util.Random; - -import net.minecraft.block.BlockTrapDoor; -import net.minecraft.block.ITileEntityProvider; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; -import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor; -import StevenDimDoors.mod_pocketDim.world.PocketProvider; - -public class dimHatch extends BlockTrapDoor implements IDimDoor, ITileEntityProvider -{ - - public dimHatch(int par1,int par2, Material par2Material) - { - super(par1, Material.iron); - this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - // this.setTextureFile("/PocketBlockTextures.png"); - // this.blockIndexInTexture = 16; - } - - public void registerIcons(IconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()); - - } - - public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) - { - - { - int var10 = par1World.getBlockMetadata(par2, par3, par4); - par1World.setBlockMetadataWithNotify(par2, par3, par4, var10 ^ 4,2); - par1World.playAuxSFXAtEntity(par5EntityPlayer, 1003, par2, par3, par4, 0); - return true; - } - } - - //Teleports the player to the exit link of that dimension, assuming it is a pocket - public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity) - { - int num = par1World.getBlockMetadata(par2, par3, par4); - - if (!par1World.isRemote&&(num>3&&num<8||num>11)&&par1World.provider instanceof PocketProvider) - { - this.onPoweredBlockChange(par1World, par2, par3, par4, false); - - /* FIXME: No point in fixing the following code when it's going to be rewritten later anyway. ~SenseiKiwi - - NewDimData newDimData = (NewDimData) dimHelper.PocketManager.dimList.get(par1World.provider.dimensionId); - ILinkData exitLink=newDimData.exitDimLink; - exitLink.locDimID=par1World.provider.dimensionId; - PocketManager.instance.traverseDimDoor(par1World, exitLink, par5Entity);*/ - } - } - - public void onPoweredBlockChange(World par1World, int par2, int par3, int par4, boolean par5) - { - int var6 = par1World.getBlockMetadata(par2, par3, par4); - boolean var7 = (var6 & 4) > 0; - - if (var7 != par5) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, var6 ^ 4,2); - par1World.playAuxSFXAtEntity((EntityPlayer)null, 1003, par2, par3, par4, 0); - } - } - - public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) - { - TileEntityTransTrapdoor tile = (TileEntityTransTrapdoor) par1World.getBlockTileEntity(par2, par3, par4); - tile.hasRift = PocketManager.getLink(par2, par3, par4, par1World)!=null; - tile.metaData = par1World.getBlockMetadata(par2, par3, par4); - tile.isShut = this.isTrapdoorOpen(par4); - } - @Override - public TileEntity createNewTileEntity(World world) - { - - return new TileEntityTransTrapdoor(); - } - - public dimHatch updateAttachedTile(World world, int x, int y, int z) - { - TileEntity tile = world.getBlockTileEntity(x, y, z); - if (tile instanceof TileEntityTransTrapdoor) - { - TileEntityTransTrapdoor dimTile = (TileEntityTransTrapdoor) tile; - dimTile.hasRift = PocketManager.getLink(x, y, z, world)!=null; - dimTile.metaData = world.getBlockMetadata(x, y, z); - dimTile.isShut = this.isTrapdoorOpen( world.getBlockMetadata(x, y, z)); - } - return this; - } - @Override - public void enterDimDoor(World world, int x, int y, int z, Entity entity) { - // TODO Auto-generated method stub - - } - - @Override - public void placeDimDoor(World world, int x, int y, int z) { - // TODO Auto-generated method stub - - } - - @Override - public void onBlockAdded(World world, int x, int y, int z) - { - world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); - this.updateAttachedTile(world, x, y, z); - } - @Override - public int getDrops() { - // TODO Auto-generated method stub - return 0; - } - - -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 8f061a0..c1335a6 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -17,10 +17,10 @@ import StevenDimDoors.mod_pocketDim.blocks.BlockDimWallPerm; import StevenDimDoors.mod_pocketDim.blocks.BlockLimbo; import StevenDimDoors.mod_pocketDim.blocks.BlockRift; import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; +import StevenDimDoors.mod_pocketDim.blocks.TransTrapdoor; import StevenDimDoors.mod_pocketDim.blocks.TransientDoor; import StevenDimDoors.mod_pocketDim.blocks.UnstableDoor; import StevenDimDoors.mod_pocketDim.blocks.WarpDoor; -import StevenDimDoors.mod_pocketDim.blocks.TransTrapdoor; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.items.ItemBlockDimWall; @@ -38,8 +38,8 @@ import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; import StevenDimDoors.mod_pocketDim.ticking.MonolithSpawner; import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; -import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor; import StevenDimDoors.mod_pocketDim.world.BiomeGenLimbo; import StevenDimDoors.mod_pocketDim.world.BiomeGenPocket; import StevenDimDoors.mod_pocketDim.world.GatewayGenerator; @@ -95,7 +95,7 @@ public class mod_pocketDim public static Block blockLimbo; public static DimensionalDoor dimensionalDoor; public static Block blockDimWall; - public static Block transTrapdoor; + public static TransTrapdoor transTrapdoor; public static Block blockDimWallPerm; public static BlockRift blockRift; @@ -168,7 +168,7 @@ public class mod_pocketDim blockLimbo = new BlockLimbo(properties.LimboBlockID, 15, Material.iron, properties.LimboDimensionID, decay).setHardness(.2F).setUnlocalizedName("BlockLimbo").setLightValue(.0F); unstableDoor = (new UnstableDoor(properties.UnstableDoorID, Material.iron, properties).setHardness(.2F).setUnlocalizedName("chaosDoor").setLightValue(.0F) ); dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(properties.DimensionalDoorID, Material.iron, properties).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor")); - transTrapdoor = (new TransTrapdoor(properties.TransTrapdoorID, Material.wood)).setHardness(1.0F) .setUnlocalizedName("dimHatch"); + transTrapdoor = (TransTrapdoor) (new TransTrapdoor(properties.TransTrapdoorID, Material.wood).setHardness(1.0F) .setUnlocalizedName("dimHatch")); itemDimDoor = (new ItemDimensionalDoor(properties.DimensionalDoorItemID, Material.iron)).setUnlocalizedName("itemDimDoor"); itemExitDoor = (new ItemWarpDoor(properties.WarpDoorItemID, Material.wood)).setUnlocalizedName("itemDimDoorWarp"); diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java index ad8dff1..f7a8791 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java @@ -7,72 +7,49 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class TileEntityTransTrapdoor extends TileEntity - { public boolean hasRift; - public boolean isShut; - public int metaData; - - - - + + @Override public boolean shouldRefresh(int oldID, int newID, int oldMeta, int newMeta, World world, int x, int y, int z) - { - if(newID==0&&PocketManager.getLink(x, y, z, world)!=null) + { + if (newID == 0 && PocketManager.getLink(x, y, z, world) != null) { world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); } - return true; - } - - public boolean canUpdate() - { - return true; - } - - public void updateEntity() - { - System.out.println(this.worldObj.getBlockMetadata(xCoord, yCoord, zCoord)); + return true; + } - } - - @Override - public void readFromNBT(NBTTagCompound nbt) - { - super.readFromNBT(nbt); - int i = nbt.getInteger(("Size")); + @Override + public boolean canUpdate() + { + return true; + } - try - { - this.hasRift = nbt.getBoolean("hasRift"); - this.isShut = nbt.getBoolean("isShut"); - - this.metaData = nbt.getInteger("metaData"); - - - + @Override + public void updateEntity() + { + + } - + @Override + public void readFromNBT(NBTTagCompound nbt) + { + super.readFromNBT(nbt); + try + { + this.hasRift = nbt.getBoolean("hasRift"); + } + catch (Exception e) + { - } - catch (Exception e) - { - - } - } + } + } - @Override - public void writeToNBT(NBTTagCompound nbt) - { - int i = 0; - super.writeToNBT(nbt); - nbt.setBoolean("hasRift", this.hasRift); - nbt.setBoolean("isShut", this.isShut); - - - nbt.setInteger("metaData", this.metaData); - - - - } + @Override + public void writeToNBT(NBTTagCompound nbt) + { + super.writeToNBT(nbt); + nbt.setBoolean("hasRift", this.hasRift); + } } diff --git a/StevenDimDoors/mod_pocketDimClient/ClientProxy.java b/StevenDimDoors/mod_pocketDimClient/ClientProxy.java index b4ef347..bfc4140 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClientProxy.java +++ b/StevenDimDoors/mod_pocketDimClient/ClientProxy.java @@ -16,7 +16,7 @@ public class ClientProxy extends CommonProxy { //MinecraftForgeClient.preloadTexture(BLOCK_PNG); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDimDoor.class, new RenderDimDoor()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTransTrapdoor.class, new RenderDimTrapDoor()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTransTrapdoor.class, new RenderTransTrapdoor()); //This code activates the new rift rendering, as well as a bit of code in TileEntityRift //ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRift.class, new RenderRift()); diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimTrapDoor.java b/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java similarity index 84% rename from StevenDimDoors/mod_pocketDimClient/RenderDimTrapDoor.java rename to StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java index 8d90e6e..7a8b8d9 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimTrapDoor.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java @@ -12,33 +12,31 @@ import org.lwjgl.opengl.GL11; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.blocks.dimHatch; -import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.blocks.TransTrapdoor; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class RenderDimTrapDoor extends TileEntitySpecialRenderer +public class RenderTransTrapdoor extends TileEntitySpecialRenderer { - FloatBuffer field_76908_a = GLAllocation.createDirectFloatBuffer(16); - - public RenderDimTrapDoor() + private FloatBuffer field_76908_a = GLAllocation.createDirectFloatBuffer(16); + private static DDProperties properties = null; + + public RenderTransTrapdoor() { if (properties == null) properties = DDProperties.instance(); } - - private static DDProperties properties = null; /** * Renders the dimdoor. */ - public void renderDimHatchTileEntity(TileEntityTransTrapdoor tile, double x, double y, double z, float par8) + public void renderTransTrapdoorTileEntity(TileEntityTransTrapdoor tile, double x, double y, double z, float par8) { try { - ( (dimHatch) mod_pocketDim.dimHatch).updateAttachedTile(tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord); + mod_pocketDim.transTrapdoor.updateAttachedTile(tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord); } catch(Exception e) { @@ -52,10 +50,8 @@ public class RenderDimTrapDoor extends TileEntitySpecialRenderer //float distance = (float) tile.getDistanceFrom(playerX, playerY, playerZ); GL11.glDisable(GL11.GL_LIGHTING); - Random rand = new Random(31100L); - float var13 = 0.75F; - - + Random random = new Random(31100L); + int metadata = tile.worldObj.getBlockMetadata(tile.xCoord, tile.yCoord, tile.zCoord); for (int count = 0; count < 16; ++count) { @@ -82,8 +78,6 @@ public class RenderDimTrapDoor extends TileEntitySpecialRenderer var16 = .5F; } - - GL11.glTranslatef( (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F,0, 0.0F); GL11.glTranslatef(0, (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F, 0.0F); @@ -115,13 +109,10 @@ public class RenderDimTrapDoor extends TileEntitySpecialRenderer GL11.glTranslatef(0.5F, 0.5F, 0.5F); GL11.glBegin(GL11.GL_QUADS); - - - - float var21 = rand.nextFloat() * 0.5F + 0.1F; - float var22 = rand.nextFloat() * 0.4F + 0.4F; - float var23 = rand.nextFloat() * 0.6F + 0.5F; + float var21 = random.nextFloat() * 0.5F + 0.1F; + float var22 = random.nextFloat() * 0.4F + 0.4F; + float var23 = random.nextFloat() * 0.6F + 0.5F; if (count == 0) { @@ -129,29 +120,9 @@ public class RenderDimTrapDoor extends TileEntitySpecialRenderer var22 = 1.0F; } GL11.glColor4d(var21 * var17, var22 * var17, var23 * var17, 1.0F); - if(tile.metaData>7) + if (TransTrapdoor.isTrapdoorOnBlock(metadata)) { - if(tile.isShut) - { - GL11.glVertex3d(x, y+0.85, z); - GL11.glVertex3d(x, y+0.85, z+1); - GL11.glVertex3d(x+1 , y+0.85 , z+1); - GL11.glVertex3d(x+1 , y+0.85 , z); - } - else - { - GL11.glVertex3d(x, y+0.95, z); - GL11.glVertex3d(x, y+0.95, z+1); - GL11.glVertex3d(x+1 , y+0.95 , z+1); - GL11.glVertex3d(x+1 , y+0.95 , z); - - } - - - } - else - { - if(tile.isShut) + if (TransTrapdoor.isTrapdoorOpen(metadata)) { GL11.glVertex3d(x, y+0.2, z); GL11.glVertex3d(x, y+0.2, z+1); @@ -165,11 +136,25 @@ public class RenderDimTrapDoor extends TileEntitySpecialRenderer GL11.glVertex3d(x+1 , y+0.15 , z+1); GL11.glVertex3d(x+1 , y+0.15 , z); } - } - + else + { + if (TransTrapdoor.isTrapdoorOpen(metadata)) + { + GL11.glVertex3d(x, y+0.95, z); + GL11.glVertex3d(x, y+0.95, z+1); + GL11.glVertex3d(x+1 , y+0.95 , z+1); + GL11.glVertex3d(x+1 , y+0.95 , z); + } + else + { + GL11.glVertex3d(x, y+0.85, z); + GL11.glVertex3d(x, y+0.85, z+1); + GL11.glVertex3d(x+1 , y+0.85 , z+1); + GL11.glVertex3d(x+1 , y+0.85 , z); + } + } GL11.glEnd(); - GL11.glPopMatrix(); GL11.glMatrixMode(GL11.GL_MODELVIEW); } @@ -194,7 +179,7 @@ public class RenderDimTrapDoor extends TileEntitySpecialRenderer { if (properties.DoorRenderingEnabled) { - this.renderDimHatchTileEntity((TileEntityTransTrapdoor)par1TileEntity, par2, par4, par6, par8); + this.renderTransTrapdoorTileEntity((TileEntityTransTrapdoor)par1TileEntity, par2, par4, par6, par8); } } } -- 2.39.5 From fc6dd635737495111aafccab775be0d09b7b2552 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 8 Sep 2013 16:48:16 -0400 Subject: [PATCH 094/544] Minor Change Renamed TransTrapdoor.isTrapdoorOnBlock() to TransTrapdoor.isTrapdoorSetLow() so it would be easier to understand what it indicates. --- StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java | 2 +- StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java index 55eb613..e27e22c 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java @@ -111,7 +111,7 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit return Block.trapdoor.blockID; } - public static boolean isTrapdoorOnBlock(int metadata) + public static boolean isTrapdoorSetLow(int metadata) { return (metadata & 8) == 0; } diff --git a/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java b/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java index 7a8b8d9..68fe35c 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java @@ -120,7 +120,7 @@ public class RenderTransTrapdoor extends TileEntitySpecialRenderer var22 = 1.0F; } GL11.glColor4d(var21 * var17, var22 * var17, var23 * var17, 1.0F); - if (TransTrapdoor.isTrapdoorOnBlock(metadata)) + if (TransTrapdoor.isTrapdoorSetLow(metadata)) { if (TransTrapdoor.isTrapdoorOpen(metadata)) { -- 2.39.5 From 156c61a772213d57dffed19d7fdd86685804b051 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 8 Sep 2013 21:01:38 -0400 Subject: [PATCH 095/544] Improved DDTeleporter Made a minor change to DDTeleporter - added a flag so that we can specify that entities must be teleported to the destination without trying to shift them around based on destination orientation. This is important for the trapdoor, since otherwise entities might get shoved into walls. Also cleaned up some code in DDTeleporter. It's much more readable now. These changes are in preparation for completing Trans Trapdoor destination selection. --- .../mod_pocketDim/EventHookContainer.java | 27 +-- .../blocks/BlockDimWallPerm.java | 2 +- .../mod_pocketDim/core/DDTeleporter.java | 160 +++++++++--------- .../mod_pocketDim/core/NewDimData.java | 4 + .../mod_pocketDim/ticking/MobMonolith.java | 2 +- 5 files changed, 102 insertions(+), 93 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 132a161..809e565 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -10,11 +10,11 @@ import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.world.WorldEvent; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; +import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.world.LimboProvider; -import StevenDimDoors.mod_pocketDim.world.PocketProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -69,19 +69,24 @@ public class EventHookContainer public boolean LivingDeathEvent(LivingDeathEvent event) { Entity entity = event.entity; - if (entity instanceof EntityPlayer && entity.worldObj.provider instanceof PocketProvider - && properties.LimboEnabled) + + if (entity instanceof EntityPlayer && properties.LimboEnabled) { - EntityPlayer player = (EntityPlayer) entity; - if (!properties.LimboReturnsInventoryEnabled) + NewDimData dimension = PocketManager.getDimensionData(entity.worldObj); + if (dimension.isDungeon()) { - player.inventory.clearInventory(-1, -1); + EntityPlayer player = (EntityPlayer) entity; + if (!properties.LimboReturnsInventoryEnabled) + { + player.inventory.clearInventory(-1, -1); + } + ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(player.worldObj.rand); + Point4D destination = new Point4D(coords.posX, coords.posY, coords.posZ, mod_pocketDim.properties.LimboDimensionID); + DDTeleporter.teleportEntity(player, destination, false); + player.setEntityHealth(player.getMaxHealth()); + event.setCanceled(true); + return false; } - ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(player.worldObj.rand); - DDTeleporter.teleportEntity(player, new Point4D(coords.posX, coords.posY, coords.posZ, mod_pocketDim.properties.LimboDimensionID)); - player.setEntityHealth(player.getMaxHealth()); - event.setCanceled(true); - return false; } return true; } diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java index f5e34ae..c635b7f 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java @@ -67,7 +67,7 @@ public class BlockDimWallPerm extends Block //FIXME: Shouldn't we make the player's destination safe BEFORE teleporting him?! //player.setPositionAndUpdate( x, y, z ); Point4D destination = new Point4D(destinationX, destinationY, destinationZ, 0); - DDTeleporter.teleportEntity(player, destination); + DDTeleporter.teleportEntity(player, destination, false); //player.setPositionAndUpdate( x, y, z ); diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index a6edec6..ccfa585 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -39,98 +39,98 @@ public class DDTeleporter private DDTeleporter() { } - private static void placeInPortal(Entity entity, WorldServer world, Point4D destination, DDProperties properties) + private static void placeInPortal(Entity entity, WorldServer world, Point4D destination, DDProperties properties, boolean checkOrientation) { int x = destination.getX(); int y = destination.getY(); int z = destination.getZ(); - int orientation = getDestinationOrientation(destination, properties); - + int orientation; + if (checkOrientation) + { + orientation = getDestinationOrientation(destination, properties); + entity.rotationYaw = (orientation * 90) + 90; + } + else + { + //Teleport the entity to the precise destination point + orientation = -1; + } + if (entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; - player.rotationYaw=(orientation*90)+90; - if(orientation==2||orientation==6) + switch (orientation) { - player.setPositionAndUpdate( x+1.5, y-1, z+.5 ); - } - else if(orientation==3||orientation==7) - { - player.setPositionAndUpdate( x+.5, y-1, z+1.5 ); - } - else if(orientation==0||orientation==4) - { - player.setPositionAndUpdate(x-.5, y-1, z+.5); - } - else if(orientation==1||orientation==5) - { - player.setPositionAndUpdate(x+.5, y-1, z-.5); - } - else - { - player.setPositionAndUpdate(x, y-1, z); + case 0: + player.setPositionAndUpdate(x - 0.5, y - 1, z + 0.5); + break; + case 1: + player.setPositionAndUpdate(x + 0.5, y - 1, z - 0.5); + break; + case 2: + player.setPositionAndUpdate(x + 1.5, y - 1, z + 0.5); + break; + case 3: + player.setPositionAndUpdate(x + 0.5, y - 1, z + 1.5); + break; + default: + player.setPositionAndUpdate(x, y - 1, z); + break; } } else if (entity instanceof EntityMinecart) { - entity.motionX=0; - entity.motionZ=0; - entity.motionY=0; - entity.rotationYaw=(orientation*90)+90; + entity.motionX = 0; + entity.motionZ = 0; + entity.motionY = 0; - if(orientation==2||orientation==6) + switch (orientation) { - DDTeleporter.setEntityPosition(entity, x+1.5, y, z+.5 ); - entity.motionX =.39; - entity.worldObj.updateEntityWithOptionalForce(entity, false); - } - else if(orientation==3||orientation==7) - { - DDTeleporter.setEntityPosition(entity, x+.5, y, z+1.5 ); - entity.motionZ =.39; - entity.worldObj.updateEntityWithOptionalForce(entity, false); - } - else if(orientation==0||orientation==4) - { - DDTeleporter.setEntityPosition(entity,x-.5, y, z+.5); - entity.motionX =-.39; - entity.worldObj.updateEntityWithOptionalForce(entity, false); - } - else if(orientation==1||orientation==5) - { - DDTeleporter.setEntityPosition(entity,x+.5, y, z-.5); - entity.motionZ =-.39; - entity.worldObj.updateEntityWithOptionalForce(entity, false); - } - else - { - DDTeleporter.setEntityPosition(entity,x, y, z); + case 0: + DDTeleporter.setEntityPosition(entity, x - 0.5, y, z + 0.5); + entity.motionX = -0.39; + entity.worldObj.updateEntityWithOptionalForce(entity, false); + break; + case 1: + DDTeleporter.setEntityPosition(entity, x + 0.5, y, z - 0.5); + entity.motionZ = -0.39; + entity.worldObj.updateEntityWithOptionalForce(entity, false); + break; + case 2: + DDTeleporter.setEntityPosition(entity, x + 1.5, y, z + 0.5); + entity.motionX = 0.39; + entity.worldObj.updateEntityWithOptionalForce(entity, false); + break; + case 3: + DDTeleporter.setEntityPosition(entity, x + 0.5, y, z + 1.5 ); + entity.motionZ = 0.39; + entity.worldObj.updateEntityWithOptionalForce(entity, false); + break; + default: + DDTeleporter.setEntityPosition(entity, x, y, z); + break; } } - else if (entity instanceof Entity) + else { - entity.rotationYaw=(orientation*90)+90; - if(orientation==2||orientation==6) + switch (orientation) { - DDTeleporter.setEntityPosition(entity, x+1.5, y, z+.5 ); - } - else if(orientation==3||orientation==7) - { - - DDTeleporter.setEntityPosition(entity, x+.5, y, z+1.5 ); - } - else if(orientation==0||orientation==4) - { - DDTeleporter.setEntityPosition(entity,x-.5, y, z+.5); - } - else if(orientation==1||orientation==5) - { - DDTeleporter.setEntityPosition(entity,x+.5, y, z-.5); - } - else - { - DDTeleporter.setEntityPosition(entity,x, y, z); + case 0: + setEntityPosition(entity, x - 0.5, y, z + 0.5); + break; + case 1: + setEntityPosition(entity, x + 0.5, y, z - 0.5); + break; + case 2: + setEntityPosition(entity, x + 1.5, y, z + 0.5); + break; + case 3: + setEntityPosition(entity, x + 0.5, y, z + 1.5); + break; + default: + setEntityPosition(entity, x, y, z); + break; } } } @@ -164,7 +164,7 @@ public class DDTeleporter return world.getBlockMetadata(door.getX(), door.getY() - 1, door.getZ()) & 3; } - public static Entity teleportEntity(Entity entity, Point4D destination) + public static Entity teleportEntity(Entity entity, Point4D destination, boolean checkOrientation) { if (entity == null) { @@ -185,7 +185,7 @@ public class DDTeleporter // Is something riding? Handle it first. if (entity.riddenByEntity != null) { - return teleportEntity(entity.riddenByEntity, destination); + return teleportEntity(entity.riddenByEntity, destination, checkOrientation); } // Are we riding something? Dismount and tell the mount to go first. @@ -193,7 +193,7 @@ public class DDTeleporter if (cart != null) { entity.mountEntity(null); - cart = teleportEntity(cart, destination); + cart = teleportEntity(cart, destination, checkOrientation); // We keep track of both so we can remount them on the other side. } @@ -211,7 +211,7 @@ public class DDTeleporter // GreyMaria: What is this even accomplishing? We're doing the exact same thing at the end of this all. // TODO Check to see if this is actually vital. - DDTeleporter.placeInPortal(entity, newWorld, destination, properties); + DDTeleporter.placeInPortal(entity, newWorld, destination, properties, checkOrientation); if (difDest) // Are we moving our target to a new dimension? { @@ -306,7 +306,7 @@ public class DDTeleporter GameRegistry.onPlayerChangedDimension((EntityPlayer)entity); } - DDTeleporter.placeInPortal(entity, newWorld, destination, properties); + DDTeleporter.placeInPortal(entity, newWorld, destination, properties, checkOrientation); return entity; } @@ -355,13 +355,13 @@ public class DDTeleporter Point4D randomDestination = getRandomDestination(); if (randomDestination != null) { - entity = teleportEntity(entity, randomDestination); + entity = teleportEntity(entity, randomDestination, true); entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); } } else { - entity = teleportEntity(entity, link.destination()); + entity = teleportEntity(entity, link.destination(), link.linkType() != LinkTypes.UNSAFE_EXIT); entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); } } diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index 9e735aa..a480333 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -439,6 +439,10 @@ public abstract class NewDimData { throw new IllegalStateException("The dimension has already been initialized."); } + if (orientation < 0 || orientation > 3) + { + throw new IllegalArgumentException("orientation must be between 0 and 3, inclusive."); + } setDestination(incoming, originX, originY, originZ); this.origin = incoming.destination(); diff --git a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index 71ba77a..221ebba 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -150,7 +150,7 @@ public class MobMonolith extends EntityFlying implements IMob (int) this.posY + 500, (int) this.posZ + MathHelper.getRandomIntegerInRange(rand, -250, 250), properties.LimboDimensionID); - DDTeleporter.teleportEntity(entityPlayer, destination); + DDTeleporter.teleportEntity(entityPlayer, destination, false); this.aggro = 0; entityPlayer.worldObj.playSoundAtEntity(entityPlayer,"mods.DimDoors.sfx.crack",13, 1); -- 2.39.5 From 9fec41f906fe0991dd4d1afefa6b1e23d1508f46 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 8 Sep 2013 21:05:06 -0400 Subject: [PATCH 096/544] Minor Change Renamed IDimDoor.placeDimDoor() to placeLink(), since that's what it's actually being used for in our doors. Saying it places the door itself is confusing. --- StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java | 2 +- StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java | 2 +- StevenDimDoors/mod_pocketDim/blocks/IDimDoor.java | 2 +- StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java | 4 ++-- StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java | 2 +- StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java | 2 +- StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index a923bc7..43d4ba5 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -133,7 +133,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn { //FIXME: We need to set door generation flags on the tile entities. Ignoring that for now. ~SenseiKiwi - this.placeDimDoor(world, x, y, z); + this.placeLink(world, x, y, z); world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); this.updateAttachedTile(world, x, y, z); } diff --git a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java index 9b59b8b..eea7b05 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java @@ -18,7 +18,7 @@ public class DimensionalDoor extends BaseDimDoor } @Override - public void placeDimDoor(World world, int x, int y, int z) + public void placeLink(World world, int x, int y, int z) { if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) { diff --git a/StevenDimDoors/mod_pocketDim/blocks/IDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/IDimDoor.java index 6ebe012..39bfcd2 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/IDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/IDimDoor.java @@ -7,7 +7,7 @@ public interface IDimDoor { public void enterDimDoor(World world, int x, int y, int z, Entity entity); - public void placeDimDoor(World world, int x, int y, int z); + public void placeLink(World world, int x, int y, int z); public int getDrops(); } diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java index e27e22c..91bcf94 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java @@ -58,7 +58,7 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit @Override public void onBlockAdded(World world, int x, int y, int z) { - this.placeDimDoor(world, x, y, z); + this.placeLink(world, x, y, z); world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); this.updateAttachedTile(world, x, y, z); } @@ -86,7 +86,7 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit } @Override - public void placeDimDoor(World world, int x, int y, int z) + public void placeLink(World world, int x, int y, int z) { if (!world.isRemote) { diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java index 3bc59db..cdd54ee 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java @@ -60,7 +60,7 @@ public class TransientDoor extends BaseDimDoor } @Override - public void placeDimDoor(World world, int x, int y, int z) + public void placeLink(World world, int x, int y, int z) { if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) { diff --git a/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java index 77d283d..8bcf00e 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java @@ -16,7 +16,7 @@ public class UnstableDoor extends BaseDimDoor } @Override - public void placeDimDoor(World world, int x, int y, int z) + public void placeLink(World world, int x, int y, int z) { if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) { diff --git a/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java index 4e4c4b4..ef75d8b 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java @@ -17,7 +17,7 @@ public class WarpDoor extends BaseDimDoor } @Override - public void placeDimDoor(World world, int x, int y, int z) + public void placeLink(World world, int x, int y, int z) { if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) { -- 2.39.5 From 7dbc6896b1f472b864e7dfa0522faf3fb3035908 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 9 Sep 2013 00:42:03 -0400 Subject: [PATCH 097/544] Minor Fixes Cleaned up obsolete code in PocketProvider and fixed the assignment of hasNoSky so that it actually applies. Also overloaded getActualHeight() so that we return 256 despite hasNoSky = true - the default MC behavior is that we would return 128 in that case. Also undid a previous change to EventHookContainer - players that die in pockets will respawn in Limbo, again. --- .../mod_pocketDim/EventHookContainer.java | 27 +++++++--------- .../mod_pocketDim/world/PocketProvider.java | 32 +++++++------------ 2 files changed, 23 insertions(+), 36 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 809e565..aeaa0d3 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -10,11 +10,11 @@ import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.world.WorldEvent; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; -import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.world.LimboProvider; +import StevenDimDoors.mod_pocketDim.world.PocketProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -70,23 +70,20 @@ public class EventHookContainer { Entity entity = event.entity; - if (entity instanceof EntityPlayer && properties.LimboEnabled) + if (entity instanceof EntityPlayer && properties.LimboEnabled && + entity.worldObj.provider instanceof PocketProvider) { - NewDimData dimension = PocketManager.getDimensionData(entity.worldObj); - if (dimension.isDungeon()) + EntityPlayer player = (EntityPlayer) entity; + if (!properties.LimboReturnsInventoryEnabled) { - EntityPlayer player = (EntityPlayer) entity; - if (!properties.LimboReturnsInventoryEnabled) - { - player.inventory.clearInventory(-1, -1); - } - ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(player.worldObj.rand); - Point4D destination = new Point4D(coords.posX, coords.posY, coords.posZ, mod_pocketDim.properties.LimboDimensionID); - DDTeleporter.teleportEntity(player, destination, false); - player.setEntityHealth(player.getMaxHealth()); - event.setCanceled(true); - return false; + player.inventory.clearInventory(-1, -1); } + ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(player.worldObj.rand); + Point4D destination = new Point4D(coords.posX, coords.posY, coords.posZ, mod_pocketDim.properties.LimboDimensionID); + DDTeleporter.teleportEntity(player, destination, false); + player.setEntityHealth(player.getMaxHealth()); + event.setCanceled(true); + return false; } return true; } diff --git a/StevenDimDoors/mod_pocketDim/world/PocketProvider.java b/StevenDimDoors/mod_pocketDim/world/PocketProvider.java index fa2087c..8348e08 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketProvider.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketProvider.java @@ -17,14 +17,6 @@ import cpw.mods.fml.relauncher.SideOnly; public class PocketProvider extends WorldProvider { - public int exitXCoord; - public int exitYCoord; - public int exitZCoord; - public int exitDimID; - public boolean hasNoSky = true; - - public boolean isSavingSchematic= false; - public int dimToSave; private DDProperties properties; private MonolithSpawner spawner; @@ -38,8 +30,7 @@ public class PocketProvider extends WorldProvider @Override protected void registerWorldChunkManager() { - super.worldChunkMgr = new WorldChunkManagerHell(mod_pocketDim.pocketBiome,1,1); - //this.dimensionId = ConfigAtum.dimensionID; + super.worldChunkMgr = new WorldChunkManagerHell(mod_pocketDim.pocketBiome, 1, 1); } @Override @@ -48,28 +39,18 @@ public class PocketProvider extends WorldProvider return (dimensionId == 0 ? null : "DimensionalDoors/pocketDimID" + dimensionId); } - public void saveAsSchematic(int id) - { - this.isSavingSchematic=true; - this.dimensionId=id; - - } - + @Override public Vec3 getSkyColor(Entity cameraEntity, float partialTicks) { setCloudRenderer( new CloudRenderBlank()); return this.worldObj.getWorldVec3Pool().getVecFromPool((double)0, (double)0, (double)0); - } - - @SideOnly(Side.CLIENT) @Override public Vec3 getFogColor(float par1, float par2) { return this.worldObj.getWorldVec3Pool().getVecFromPool((double)0, (double)0, (double)0); - } @Override @@ -90,6 +71,7 @@ public class PocketProvider extends WorldProvider return false; } + @Override public boolean canBlockFreeze(int x, int y, int z, boolean byWater) { return false; @@ -104,6 +86,7 @@ public class PocketProvider extends WorldProvider return "PocketDim " + this.dimensionId; } + @Override public int getRespawnDimension(EntityPlayerMP player) { int respawnDim; @@ -124,8 +107,15 @@ public class PocketProvider extends WorldProvider return respawnDim; } + @Override public boolean canRespawnHere() { return false; } + + @Override + public int getActualHeight() + { + return 256; + } } -- 2.39.5 From 2d085f60b8ceb44e2a245e41afe0e0dc59e6b0e3 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 9 Sep 2013 02:28:17 -0400 Subject: [PATCH 098/544] Working on render for DimDoors --- .../tileentities/TileEntityDimDoor.java | 9 +-------- .../tileentities/TileEntityTransTrapdoor.java | 10 +--------- .../mod_pocketDimClient/RenderDimDoor.java | 16 ++++++++-------- 3 files changed, 10 insertions(+), 25 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java index 4d49cf3..240782f 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java @@ -16,14 +16,7 @@ public class TileEntityDimDoor extends TileEntity - public boolean shouldRefresh(int oldID, int newID, int oldMeta, int newMeta, World world, int x, int y, int z) - { - if(newID==0&&PocketManager.getLink(x, y, z, world)!=null) - { - world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); - } - return true; - } + public boolean canUpdate() { diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java index f7a8791..d478148 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java @@ -10,15 +10,7 @@ public class TileEntityTransTrapdoor extends TileEntity { public boolean hasRift; - @Override - public boolean shouldRefresh(int oldID, int newID, int oldMeta, int newMeta, World world, int x, int y, int z) - { - if (newID == 0 && PocketManager.getLink(x, y, z, world) != null) - { - world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); - } - return true; - } + @Override public boolean canUpdate() diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index 384ec97..936518f 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -58,7 +58,7 @@ public class RenderDimDoor extends TileEntitySpecialRenderer { GL11.glPushMatrix(); float var15 = (float)(16 - count); - float var16 = 0.2625F; + float var16 = 0.4925F; float var17 = 1.0F / (var15 + 1.0F); if (count == 0) @@ -109,14 +109,14 @@ public class RenderDimDoor extends TileEntitySpecialRenderer GL11.glTexGeni(GL11.GL_S, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); GL11.glTexGeni(GL11.GL_T, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); GL11.glTexGeni(GL11.GL_R, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); - GL11.glTexGeni(GL11.GL_Q, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); + GL11.glTexGeni(GL11.GL_Q, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_EYE_LINEAR); switch ((tile.orientation%4)+4) { case 4: - GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); - GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); + GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); + GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); break; case 5: @@ -124,20 +124,20 @@ public class RenderDimDoor extends TileEntitySpecialRenderer GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 0.1F)); break; case 6: GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); break; case 7: GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); break; -- 2.39.5 From 027b329af80c1bfbfb16f2a04e9736c24e48dc51 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 9 Sep 2013 02:31:11 -0400 Subject: [PATCH 099/544] Completed Unsafe Exit Teleportation Completed the code in yCoordHelper for choosing a point to drop the player when using a Transdimensional Trapdoor. Made changes to DDTeleporter so that the player can be dropped at the specific point we want. This needs further testing, though, since I'm not completely sure it's working right. --- .../mod_pocketDim/core/DDTeleporter.java | 11 ++-- .../mod_pocketDim/helpers/yCoordHelper.java | 65 ++++++++----------- 2 files changed, 34 insertions(+), 42 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index ccfa585..f12e66a 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -75,7 +75,7 @@ public class DDTeleporter player.setPositionAndUpdate(x + 0.5, y - 1, z + 1.5); break; default: - player.setPositionAndUpdate(x, y - 1, z); + player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5); break; } } @@ -108,7 +108,8 @@ public class DDTeleporter entity.worldObj.updateEntityWithOptionalForce(entity, false); break; default: - DDTeleporter.setEntityPosition(entity, x, y, z); + DDTeleporter.setEntityPosition(entity, x + 0.5, y, z + 0.5); + entity.worldObj.updateEntityWithOptionalForce(entity, false); break; } } @@ -129,7 +130,7 @@ public class DDTeleporter setEntityPosition(entity, x + 0.5, y, z + 1.5); break; default: - setEntityPosition(entity, x, y, z); + setEntityPosition(entity, x + 0.5, y, z + 0.5); break; } } @@ -455,10 +456,10 @@ public class DDTeleporter return false; } - Point3D destination = yCoordHelper.findDropPoint(world, source.getX(), source.getY(), source.getZ()); + Point3D destination = yCoordHelper.findDropPoint(world, source.getX(), source.getY() + 1, source.getZ()); if (destination != null) { - current.root().setDestination(link, source.getX(), source.getY(), source.getZ()); + current.root().setDestination(link, destination.getX(), destination.getY(), destination.getZ()); return true; } } diff --git a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java index 1ac8519..34e8b8d 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java @@ -218,10 +218,12 @@ public class yCoordHelper return target; } - public static Point3D findDropPoint(World world, int x, int y, int z) + public static Point3D findDropPoint(World world, int x, int startY, int z) { - /*// Find a simple 2-block-high air gap + // Find a simple 2-block-high air gap // Search across a 3x3 column + final int GAP_HEIGHT = 2; + int localX = x < 0 ? (x % 16) + 16 : (x % 16); int localZ = z < 0 ? (z % 16) + 16 : (z % 16); int cornerX = x - localX; @@ -231,56 +233,45 @@ public class yCoordHelper Chunk chunk = initializeChunkArea(world, x >> 4, z >> 4); + int y, dx, dz, index; int height = world.getActualHeight(); - int y, dx, dz, blockID; - boolean isSafe; - boolean hasBlocks; - Block block; - int layers = 0; + int[] gaps = new int[9]; - // Check if a 3x3 layer of blocks is empty - // If we find a layer that contains replaceable blocks, it can - // serve as the base where we'll place the player and door. - for (y = Math.min(startY + 2, height - 1); y >= 0; y--) + // Check 3x3 layers of blocks for air spaces + for (y = Math.min(startY, height - 1); y > 0; y--) { - isSafe = true; - hasBlocks = false; - for (dx = -1; dx <= 1 && isSafe; dx++) + for (dx = -1, index = 0; dx <= 1; dx++) { - for (dz = -1; dz <= 1 && isSafe; dz++) + for (dz = -1; dz <= 1; dz++, index++) { - blockID = chunk.getBlockID(localX + dx, y, localZ + dz); - if (blockID != 0) - { - block = Block.blocksList[blockID]; - if (!block.blockMaterial.isReplaceable()) - { - if (layers >= 3) - { - return new Point3D(localX + cornerX, y + 1, localZ + cornerZ); - } - isSafe = false; - } - hasBlocks = true; + if (chunk.getBlockID(localX + dx, y, localZ + dz) != 0) + { + gaps[index] = 0; + } + else + { + gaps[index]++; } } } - if (isSafe) + // Check if an acceptable gap exists in the center of the search column + if (gaps[index / 2] == GAP_HEIGHT) { - layers++; - if (hasBlocks) + return new Point3D(localX + cornerX, y + GAP_HEIGHT - 1, localZ + cornerZ); + } + // Check the other positions in the column + for (dx = -1, index = 0; dx <= 1; dx++) + { + for (dz = -1; dz <= 1; dz++, index++) { - if (layers >= 3) + if (gaps[index] == GAP_HEIGHT) { - return new Point3D(localX + cornerX, y, localZ + cornerZ); + return new Point3D(localX + cornerX + dx, y + GAP_HEIGHT - 1, localZ + cornerZ + dz); } - layers = 0; } } } - return null;*/ - // Temporary measure to not break the build - return new Point3D(x, y - 2, z); + return null; } public static int adjustDestinationY(int y, int worldHeight, int entranceY, int dungeonHeight) -- 2.39.5 From a368d85b54f54887b27d176c9fa424f176486654 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 9 Sep 2013 03:55:07 -0400 Subject: [PATCH 100/544] OMGOMGOMG --- StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index 936518f..d0bb9f0 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -113,10 +113,10 @@ public class RenderDimDoor extends TileEntitySpecialRenderer switch ((tile.orientation%4)+4) { case 4: - GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); - GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); + GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); + GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); break; case 5: @@ -124,7 +124,7 @@ public class RenderDimDoor extends TileEntitySpecialRenderer GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 0.1F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); break; case 6: GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); -- 2.39.5 From 17450dff60fd425735f44e53c456867e0c41e1a0 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 9 Sep 2013 05:29:44 -0400 Subject: [PATCH 101/544] Revert "OMGOMGOMG" This reverts commit a368d85b54f54887b27d176c9fa424f176486654. --- StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index d0bb9f0..936518f 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -113,10 +113,10 @@ public class RenderDimDoor extends TileEntitySpecialRenderer switch ((tile.orientation%4)+4) { case 4: - GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); - GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); + GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); + GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); break; case 5: @@ -124,7 +124,7 @@ public class RenderDimDoor extends TileEntitySpecialRenderer GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 0.1F)); break; case 6: GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); -- 2.39.5 From 9d42565452660cb69dfb6e7270f7b13123cfa12d Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 9 Sep 2013 05:29:53 -0400 Subject: [PATCH 102/544] Revert "Working on render for DimDoors" This reverts commit 2d085f60b8ceb44e2a245e41afe0e0dc59e6b0e3. --- .../tileentities/TileEntityDimDoor.java | 9 ++++++++- .../tileentities/TileEntityTransTrapdoor.java | 10 +++++++++- .../mod_pocketDimClient/RenderDimDoor.java | 16 ++++++++-------- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java index 240782f..4d49cf3 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java @@ -16,7 +16,14 @@ public class TileEntityDimDoor extends TileEntity - + public boolean shouldRefresh(int oldID, int newID, int oldMeta, int newMeta, World world, int x, int y, int z) + { + if(newID==0&&PocketManager.getLink(x, y, z, world)!=null) + { + world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); + } + return true; + } public boolean canUpdate() { diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java index d478148..f7a8791 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java @@ -10,7 +10,15 @@ public class TileEntityTransTrapdoor extends TileEntity { public boolean hasRift; - + @Override + public boolean shouldRefresh(int oldID, int newID, int oldMeta, int newMeta, World world, int x, int y, int z) + { + if (newID == 0 && PocketManager.getLink(x, y, z, world) != null) + { + world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); + } + return true; + } @Override public boolean canUpdate() diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index 936518f..384ec97 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -58,7 +58,7 @@ public class RenderDimDoor extends TileEntitySpecialRenderer { GL11.glPushMatrix(); float var15 = (float)(16 - count); - float var16 = 0.4925F; + float var16 = 0.2625F; float var17 = 1.0F / (var15 + 1.0F); if (count == 0) @@ -109,14 +109,14 @@ public class RenderDimDoor extends TileEntitySpecialRenderer GL11.glTexGeni(GL11.GL_S, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); GL11.glTexGeni(GL11.GL_T, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); GL11.glTexGeni(GL11.GL_R, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); - GL11.glTexGeni(GL11.GL_Q, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_EYE_LINEAR); + GL11.glTexGeni(GL11.GL_Q, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); switch ((tile.orientation%4)+4) { case 4: - GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); - GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); + GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); + GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); break; case 5: @@ -124,20 +124,20 @@ public class RenderDimDoor extends TileEntitySpecialRenderer GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 0.1F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); break; case 6: GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); break; case 7: GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); break; -- 2.39.5 From 46fc5a34f2ca4a80cde8905c1b6d06da75bbf1a9 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 9 Sep 2013 05:31:00 -0400 Subject: [PATCH 103/544] Fixed excessive scaling on DimDoors --- .../tileentities/TileEntityDimDoor.java | 9 +-------- .../tileentities/TileEntityTransTrapdoor.java | 10 +--------- .../mod_pocketDimClient/RenderDimDoor.java | 12 ++++++++---- 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java index 4d49cf3..240782f 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java @@ -16,14 +16,7 @@ public class TileEntityDimDoor extends TileEntity - public boolean shouldRefresh(int oldID, int newID, int oldMeta, int newMeta, World world, int x, int y, int z) - { - if(newID==0&&PocketManager.getLink(x, y, z, world)!=null) - { - world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); - } - return true; - } + public boolean canUpdate() { diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java index f7a8791..19c52eb 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityTransTrapdoor.java @@ -10,15 +10,7 @@ public class TileEntityTransTrapdoor extends TileEntity { public boolean hasRift; - @Override - public boolean shouldRefresh(int oldID, int newID, int oldMeta, int newMeta, World world, int x, int y, int z) - { - if (newID == 0 && PocketManager.getLink(x, y, z, world) != null) - { - world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); - } - return true; - } + @Override public boolean canUpdate() diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index 384ec97..d3a212e 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -116,7 +116,7 @@ public class RenderDimDoor extends TileEntitySpecialRenderer GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.1F)); break; case 5: @@ -124,25 +124,29 @@ public class RenderDimDoor extends TileEntitySpecialRenderer GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.1F)); break; case 6: GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, -0.1F)); break; case 7: GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, -0.1F)); break; } + + + + GL11.glEnable(GL11.GL_TEXTURE_GEN_S); -- 2.39.5 From 678b5dac73a3d8af221f02e76eeb7a2f587c7354 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 9 Sep 2013 05:33:21 -0400 Subject: [PATCH 104/544] Tweaked a bit more --- StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index d3a212e..9c2145e 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -116,7 +116,7 @@ public class RenderDimDoor extends TileEntitySpecialRenderer GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.1F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.15F)); break; case 5: @@ -124,20 +124,20 @@ public class RenderDimDoor extends TileEntitySpecialRenderer GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.1F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.15F)); break; case 6: GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, -0.1F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, -0.15F)); break; case 7: GL11.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 1.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(1.0F, 0.0F, 0.0F, 0.0F)); GL11.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, -0.1F)); + GL11.glTexGen(GL11.GL_Q, GL11.GL_OBJECT_PLANE, this.getFloatBuffer(0.0F, 0.0F, 1.0F, -0.15F)); break; -- 2.39.5 From 79349e9add18f854dd6069609473cb852151eda3 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 9 Sep 2013 16:47:47 -0400 Subject: [PATCH 105/544] Fixed door collision for minecarts --- StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index 43d4ba5..01bbaee 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -180,7 +180,14 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn tile.orientation = this.getFullMetadata(par1World, par2, par3, par4) & 7; } - private void setDoorRotation(int par1) + @Override + public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) + { + this.setDoorRotation(this.getFullMetadata(par1IBlockAccess, par2, par3, par4)); + } + + + public void setDoorRotation(int par1) { float var2 = 0.1875F; this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F); -- 2.39.5 From 52aa836f7521cba80dd871007269bf3dfbb0d203 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Tue, 10 Sep 2013 04:32:19 -0400 Subject: [PATCH 106/544] Added gold dim doors, fixes Deleted the sun and adding gold dim doors --- .../mod_pocketDim/DDProperties.java | 20 +- .../mod_pocketDim/blocks/BlockDoorGold.java | 49 ++++ .../blocks/BlockGoldDimDoor.java | 41 ++++ .../mod_pocketDim/blocks/BlockRift.java | 3 + .../mod_pocketDim/core/DDTeleporter.java | 3 +- .../dungeon/ItemGoldDimDoor.java | 52 ++++ .../mod_pocketDim/dungeon/ItemGoldDoor.java | 64 +++++ .../helpers/ChunkLoaderHelper.java | 51 ++++ .../mod_pocketDim/items/BaseItemDoor.java | 2 +- .../mod_pocketDim/mod_pocketDim.java | 43 +++- .../tileentities/TileEntityDimDoorGold.java | 109 ++++++++ .../world/CustomSkyProvider.java | 232 ++++++++++++++++++ .../mod_pocketDim/world/LimboSkyProvider.java | 210 +--------------- .../mod_pocketDim/world/PocketBuilder.java | 3 +- .../mod_pocketDim/world/PocketProvider.java | 4 + .../world/PocketSkyProvider.java | 31 +++ .../textures/blocks/dimDoorGold_bottom.png | Bin 0 -> 3327 bytes .../textures/blocks/dimDoorGold_top.png | Bin 0 -> 3251 bytes .../textures/blocks/doorGold_bottom.png | Bin 0 -> 3327 bytes .../DimDoors/textures/blocks/doorGold_top.png | Bin 0 -> 3251 bytes .../textures/items/itemGoldDimDoor.png | Bin 0 -> 2944 bytes .../DimDoors/textures/items/itemGoldDoor.png | Bin 0 -> 2851 bytes .../DimDoors/textures/other/pocketMoon.png | Bin 0 -> 2809 bytes .../DimDoors/textures/other/pocketSun.png | Bin 0 -> 2809 bytes 24 files changed, 707 insertions(+), 210 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java create mode 100644 StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java create mode 100644 StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDimDoor.java create mode 100644 StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDoor.java create mode 100644 StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java create mode 100644 StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoorGold.java create mode 100644 StevenDimDoors/mod_pocketDim/world/CustomSkyProvider.java create mode 100644 StevenDimDoors/mod_pocketDim/world/PocketSkyProvider.java create mode 100644 resources/mods/DimDoors/textures/blocks/dimDoorGold_bottom.png create mode 100644 resources/mods/DimDoors/textures/blocks/dimDoorGold_top.png create mode 100644 resources/mods/DimDoors/textures/blocks/doorGold_bottom.png create mode 100644 resources/mods/DimDoors/textures/blocks/doorGold_top.png create mode 100644 resources/mods/DimDoors/textures/items/itemGoldDimDoor.png create mode 100644 resources/mods/DimDoors/textures/items/itemGoldDoor.png create mode 100644 resources/mods/DimDoors/textures/other/pocketMoon.png create mode 100644 resources/mods/DimDoors/textures/other/pocketSun.png diff --git a/StevenDimDoors/mod_pocketDim/DDProperties.java b/StevenDimDoors/mod_pocketDim/DDProperties.java index cb0ea3b..18e3218 100644 --- a/StevenDimDoors/mod_pocketDim/DDProperties.java +++ b/StevenDimDoors/mod_pocketDim/DDProperties.java @@ -13,7 +13,9 @@ public class DDProperties */ public final int UnstableDoorID; - public final int DimensionalDoorID; + public final int DimensionalDoorID; + public final int GoldDoorID; + public final int GoldDimDoorID; public final int WarpDoorID; public final int TransTrapdoorID; public final int TransientDoorID; @@ -32,7 +34,9 @@ public class DDProperties */ public final int RiftBladeItemID; - public final int RiftSignatureItemID; + public final int RiftSignatureItemID; + public final int GoldDimDoorItemID; + public final int GoldDoorItemID; public final int RiftRemoverItemID; public final int StableFabricItemID; public final int StabilizedRiftSignatureItemID; @@ -65,6 +69,8 @@ public class DDProperties public final boolean CraftingTransTrapdoorAllowed; public final boolean CraftingStabilizedRiftSignatureAllowed; public final boolean CraftingStableFabricAllowed; + public final boolean CraftingGoldDimDoorAllowed; + public final boolean CraftingGoldDoorAllowed; /** * Loot Flags @@ -136,6 +142,8 @@ public class DDProperties CraftingStabilizedRiftSignatureAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Stabilized Rift Signature", true).getBoolean(true); CraftingRiftBladeAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Rift Blade", true).getBoolean(true); CraftingStableFabricAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Stable Fabric", true).getBoolean(true); + CraftingGoldDimDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Golden Dimensional Door", true).getBoolean(true); + CraftingGoldDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Golden Door", true).getBoolean(true); DimensionalDoorLootEnabled = config.get(CATEGORY_LOOT, "Enable Dimensional Door Loot", true).getBoolean(true); WarpDoorLootEnabled = config.get(CATEGORY_LOOT, "Enable Warp Door Loot", false).getBoolean(false); @@ -180,7 +188,9 @@ public class DDProperties RiftBlockID = config.getBlock("Rift Block ID", 1977).getInt(); UnstableDoorID = config.getBlock("Unstable Door Block ID", 1978).getInt(); TransientDoorID = config.getBlock("Transient Door Block ID", 1979).getInt(); - + GoldDoorID = config.getBlock("Gold Door Block ID", 1980).getInt(); + GoldDimDoorID = config.getBlock("Gold Dim Door Block ID", 1981).getInt(); + WarpDoorItemID = config.getItem("Warp Door Item ID", 5670).getInt(); RiftRemoverItemID = config.getItem("Rift Remover Item ID", 5671).getInt(); StableFabricItemID = config.getItem("Stable Fabric Item ID", 5672).getInt(); @@ -189,7 +199,9 @@ public class DDProperties RiftSignatureItemID = config.getItem("Rift Signature Item ID", 5675).getInt(); RiftBladeItemID = config.getItem("Rift Blade Item ID", 5676).getInt(); StabilizedRiftSignatureItemID = config.getItem("Stabilized Rift Signature Item ID", 5677).getInt(); - + GoldDoorItemID = config.getItem("Gold Door Item ID", 5678).getInt(); + GoldDimDoorItemID = config.getItem("Gold Dim Door Item ID", 5679).getInt(); + LimboBlockID = config.getTerrainBlock("World Generation Block IDs - must be less than 256", "Limbo Block ID", 217, "Blocks used for the terrain in Limbo").getInt(); PermaFabricBlockID = config.getTerrainBlock("World Generation Block IDs - must be less than 256", diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java b/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java new file mode 100644 index 0000000..fdc26c3 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java @@ -0,0 +1,49 @@ +package StevenDimDoors.mod_pocketDim.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import net.minecraft.block.BlockDoor; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.util.Icon; +import net.minecraft.world.IBlockAccess; + +public class BlockDoorGold extends BlockDoor +{ + + private Icon blockIconBottom; + private DDProperties properties; + + public BlockDoorGold(int par1, Material par2Material,DDProperties properties) + { + super(par1, par2Material); + this.properties=properties; + + } + + public void registerIcons(IconRegister par1IconRegister) + { + this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_top"); + this.blockIconBottom = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName2()+"_bottom"); + } + + public Icon getIcon(int par1, int par2) + { + return this.blockIcon; + } + + @SideOnly(Side.CLIENT) + public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) + { + if(par1IBlockAccess.getBlockId(par2, par3-1, par4) == this.blockID) + { + return this.blockIcon; + } + else + { + return blockIconBottom; + } + } +} diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java new file mode 100644 index 0000000..22c1853 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java @@ -0,0 +1,41 @@ +package StevenDimDoors.mod_pocketDim.blocks; + +import net.minecraft.block.material.Material; +import net.minecraft.item.Item; +import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; + +public class BlockGoldDimDoor extends BaseDimDoor implements IDimDoor +{ + + public BlockGoldDimDoor(int blockID, Material material, + DDProperties properties) { + super(blockID, material, properties); + // TODO Auto-generated constructor stub + } + + @Override + public void placeLink(World world, int x, int y, int z) + { + if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) + { + NewDimData dimension = PocketManager.getDimensionData(world); + DimLink link = dimension.getLink(x, y, z); + if (link == null) + { + dimension.createLink(x, y, z, LinkTypes.POCKET); + } + } + + } + @Override + public int getDrops() + { + return this.properties.GoldDoorItemID; + } + +} diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java b/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java index bca54b5..11fe960 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java @@ -53,6 +53,9 @@ public class BlockRift extends BlockContainer this.blocksImmuneToRift.add(properties.UnstableDoorID); this.blocksImmuneToRift.add(properties.RiftBlockID); this.blocksImmuneToRift.add(properties.TransientDoorID); + this.blocksImmuneToRift.add(properties.GoldDimDoorID); + this.blocksImmuneToRift.add(properties.GoldDoorID); + this.blocksImmuneToRift.add(Block.blockIron.blockID); this.blocksImmuneToRift.add(Block.blockDiamond.blockID); this.blocksImmuneToRift.add(Block.blockEmerald.blockID); diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index ccfa585..312f9ee 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -154,7 +154,8 @@ public class DDTeleporter //Check if the block below that point is actually a door int blockID = world.getBlockId(door.getX(), door.getY() - 1, door.getZ()); if (blockID != properties.DimensionalDoorID && blockID != properties.WarpDoorID && - blockID != properties.TransientDoorID && blockID != properties.UnstableDoorID) + blockID != properties.TransientDoorID && blockID != properties.UnstableDoorID + && blockID != properties.GoldDimDoorID) { //Return the pocket's orientation instead return PocketManager.getDimensionData(door.getDimension()).orientation(); diff --git a/StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDimDoor.java b/StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDimDoor.java new file mode 100644 index 0000000..dde4efa --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDimDoor.java @@ -0,0 +1,52 @@ +package StevenDimDoors.mod_pocketDim.dungeon; + +import java.util.List; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; + +public class ItemGoldDimDoor extends BaseItemDoor +{ + + public ItemGoldDimDoor(int itemID, Material material) { + super(itemID, material); + // TODO Auto-generated constructor stub + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Similar to a Iron Dim Door"); + par3List.add("But if present in a pocket dim"); + par3List.add("it will keep it loaded."); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, + int z, int par7, float par8, float par9, float par10) + { + return tryItemUse(mod_pocketDim.goldDimDoor, stack, player, world, x, y, z, par7, false, true); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + { + if (!world.isRemote) + { + if (tryPlacingDoor(mod_pocketDim.goldDimDoor, world, player, stack) && + !player.capabilities.isCreativeMode) + { + stack.stackSize--; + } + } + return stack; + } + + + +} diff --git a/StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDoor.java b/StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDoor.java new file mode 100644 index 0000000..0a8a5ce --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDoor.java @@ -0,0 +1,64 @@ +package StevenDimDoors.mod_pocketDim.dungeon; + +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemDoor; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public class ItemGoldDoor extends ItemDoor +{ + + public ItemGoldDoor(int par1, Material par2Material) + { + super(par1, par2Material); + // TODO Auto-generated constructor stub + } + + public void registerIcons(IconRegister par1IconRegister) + { + this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); + } + + public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) + { + if (par7 != 1) + { + return false; + } + else + { + ++par5; + Block block = mod_pocketDim.goldDoor; + + + + if (par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack) && par2EntityPlayer.canPlayerEdit(par4, par5 + 1, par6, par7, par1ItemStack)) + { + if (!block.canPlaceBlockAt(par3World, par4, par5, par6)) + { + return false; + } + else + { + int i1 = MathHelper.floor_double((double)((par2EntityPlayer.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; + placeDoorBlock(par3World, par4, par5, par6, i1, block); + --par1ItemStack.stackSize; + return true; + } + } + else + { + return false; + } + } + } + + + + +} diff --git a/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java b/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java new file mode 100644 index 0000000..bd2a234 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java @@ -0,0 +1,51 @@ +package StevenDimDoors.mod_pocketDim.helpers; + +import java.util.List; + +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeChunkManager.Ticket; +import net.minecraftforge.common.ForgeChunkManager; + +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoorGold; + +import com.google.common.collect.Lists; + + +public class ChunkLoaderHelper implements ForgeChunkManager.OrderedLoadingCallback +{ + + @Override + public void ticketsLoaded(List tickets, World world) + { + for (Ticket ticket : tickets) + { + int goldDimDoorX = ticket.getModData().getInteger("goldDimDoorX"); + int goldDimDoorY = ticket.getModData().getInteger("goldDimDoorY"); + int goldDimDoorZ = ticket.getModData().getInteger("goldDimDoorZ"); + TileEntityDimDoorGold tile = (TileEntityDimDoorGold) world.getBlockTileEntity(goldDimDoorX, goldDimDoorY, goldDimDoorZ); + tile.forceChunkLoading(ticket); + + } + } + + @Override + public List ticketsLoaded(List tickets, World world, int maxTicketCount) + { + List validTickets = Lists.newArrayList(); + for (Ticket ticket : tickets) + { + int goldDimDoorX = ticket.getModData().getInteger("goldDimDoorX"); + int goldDimDoorY = ticket.getModData().getInteger("goldDimDoorY"); + int goldDimDoorZ = ticket.getModData().getInteger("goldDimDoorZ"); + + int blId = world.getBlockId(goldDimDoorX, goldDimDoorY, goldDimDoorZ); + if (blId == mod_pocketDim.properties.GoldDimDoorID) + { + validTickets.add(ticket); + } + } + return validTickets; + } +} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java b/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java index e084b1f..ea5bbec 100644 --- a/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java +++ b/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java @@ -57,7 +57,7 @@ public abstract class BaseItemDoor extends ItemDoor if (canPlace(world, x, y, z) && canPlace(world, x, y + 1, z) && player.canPlayerEdit(x, y, z, side, stack) && player.canPlayerEdit(x, y + 1, z, side, stack) && - (!requireLink || PocketManager.getLink(x, y + 1, z, world) != null)) + (!requireLink || PocketManager.getLink(x, y + 1, z, world) != null)&&stack.stackSize>0) { int orientation = MathHelper.floor_double((double) ((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; placeDoorBlock(world, x, y, z, orientation, doorBlock); diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index c1335a6..1523c19 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -11,9 +11,12 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.MinecraftForge; import StevenDimDoors.mod_pocketDim.blocks.BlockDimWall; import StevenDimDoors.mod_pocketDim.blocks.BlockDimWallPerm; +import StevenDimDoors.mod_pocketDim.blocks.BlockDoorGold; +import StevenDimDoors.mod_pocketDim.blocks.BlockGoldDimDoor; import StevenDimDoors.mod_pocketDim.blocks.BlockLimbo; import StevenDimDoors.mod_pocketDim.blocks.BlockRift; import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; @@ -22,6 +25,9 @@ import StevenDimDoors.mod_pocketDim.blocks.TransientDoor; import StevenDimDoors.mod_pocketDim.blocks.UnstableDoor; import StevenDimDoors.mod_pocketDim.blocks.WarpDoor; import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.dungeon.ItemGoldDimDoor; +import StevenDimDoors.mod_pocketDim.dungeon.ItemGoldDoor; +import StevenDimDoors.mod_pocketDim.helpers.ChunkLoaderHelper; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.items.ItemBlockDimWall; import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; @@ -38,6 +44,7 @@ import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; import StevenDimDoors.mod_pocketDim.ticking.MonolithSpawner; import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoorGold; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor; import StevenDimDoors.mod_pocketDim.world.BiomeGenLimbo; @@ -91,6 +98,8 @@ public class mod_pocketDim public static Block transientDoor; public static Block warpDoor; + public static Block goldDoor; + public static Block goldDimDoor; public static Block unstableDoor; public static Block blockLimbo; public static DimensionalDoor dimensionalDoor; @@ -99,6 +108,8 @@ public class mod_pocketDim public static Block blockDimWallPerm; public static BlockRift blockRift; + public static Item itemGoldDimDoor; + public static Item itemGoldDoor; public static Item itemRiftBlade; public static Item itemDimDoor; public static Item itemExitDoor; @@ -160,7 +171,9 @@ public class mod_pocketDim LimboDecay decay = new LimboDecay(commonTickHandler, properties); transientDoor = new TransientDoor(properties.TransientDoorID, Material.iron, properties).setHardness(1.0F) .setUnlocalizedName("transientDoor"); + goldDimDoor = new BlockGoldDimDoor(properties.GoldDimDoorID, Material.iron, properties).setHardness(1.0F) .setUnlocalizedName("dimDoorGold"); + goldDoor = new BlockDoorGold(properties.GoldDoorID, Material.iron, properties).setLightValue(1.0F).setHardness(0.1F).setUnlocalizedName("doorGold"); blockDimWall = new BlockDimWall(properties.FabricBlockID, 0, Material.iron).setLightValue(1.0F).setHardness(0.1F).setUnlocalizedName("blockDimWall"); blockDimWallPerm = (new BlockDimWallPerm(properties.PermaFabricBlockID, 0, Material.iron)).setLightValue(1.0F).setBlockUnbreakable().setResistance(6000000.0F).setUnlocalizedName("blockDimWallPerm"); warpDoor = new WarpDoor(properties.WarpDoorID, Material.wood, properties).setHardness(1.0F) .setUnlocalizedName("dimDoorWarp"); @@ -170,6 +183,8 @@ public class mod_pocketDim dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(properties.DimensionalDoorID, Material.iron, properties).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor")); transTrapdoor = (TransTrapdoor) (new TransTrapdoor(properties.TransTrapdoorID, Material.wood).setHardness(1.0F) .setUnlocalizedName("dimHatch")); + itemGoldDimDoor = (new ItemGoldDimDoor(properties.GoldDimDoorItemID, Material.iron)).setUnlocalizedName("itemGoldDimDoor"); + itemGoldDoor = (new ItemGoldDoor(properties.GoldDoorID, Material.wood)).setUnlocalizedName("itemGoldDoor"); itemDimDoor = (new ItemDimensionalDoor(properties.DimensionalDoorItemID, Material.iron)).setUnlocalizedName("itemDimDoor"); itemExitDoor = (new ItemWarpDoor(properties.WarpDoorItemID, Material.wood)).setUnlocalizedName("itemDimDoorWarp"); itemLinkSignature = (new ItemRiftSignature(properties.RiftSignatureItemID)).setUnlocalizedName("itemLinkSignature"); @@ -184,6 +199,8 @@ public class mod_pocketDim GameRegistry.registerWorldGenerator(mod_pocketDim.riftGen); + GameRegistry.registerBlock(goldDoor, "Golden Door"); + GameRegistry.registerBlock(goldDimDoor, "Golden Dimensional Door"); GameRegistry.registerBlock(unstableDoor, "Unstable Door"); GameRegistry.registerBlock(warpDoor, "Warp Door"); GameRegistry.registerBlock(blockRift, "Rift"); @@ -199,6 +216,8 @@ public class mod_pocketDim DimensionManager.registerProviderType(properties.LimboProviderID, LimboProvider.class, false); DimensionManager.registerDimension(properties.LimboDimensionID, properties.LimboProviderID); + LanguageRegistry.addName(goldDoor, "Golden Door"); + LanguageRegistry.addName(goldDimDoor, "Golden Dimensional Door"); LanguageRegistry.addName(transientDoor , "transientDoor"); LanguageRegistry.addName(blockRift , "Rift"); LanguageRegistry.addName(blockLimbo , "Unraveled Fabric"); @@ -211,6 +230,8 @@ public class mod_pocketDim LanguageRegistry.addName(itemExitDoor, "Warp Door"); LanguageRegistry.addName(itemLinkSignature , "Rift Signature"); + LanguageRegistry.addName(itemGoldDoor, "Golden Door"); + LanguageRegistry.addName(itemGoldDimDoor , "Golden Dimensional Door"); LanguageRegistry.addName(itemStabilizedLinkSignature, "Stabilized Rift Signature"); LanguageRegistry.addName(itemRiftRemover , "Rift Remover"); LanguageRegistry.addName(itemStableFabric , "Stable Fabric"); @@ -230,6 +251,7 @@ public class mod_pocketDim GameRegistry.registerTileEntity(TileEntityDimDoor.class, "TileEntityDimDoor"); GameRegistry.registerTileEntity(TileEntityRift.class, "TileEntityRift"); GameRegistry.registerTileEntity(TileEntityTransTrapdoor.class, "TileEntityDimHatch"); + GameRegistry.registerTileEntity(TileEntityDimDoorGold.class, "TileEntityDimDoorGold"); EntityRegistry.registerModEntity(MobMonolith.class, "Monolith", properties.MonolithEntityID, this, 70, 1, true); EntityList.IDtoClassMapping.put(properties.MonolithEntityID, MobMonolith.class); @@ -331,7 +353,25 @@ public class mod_pocketDim " y ", "yxy", " y ", 'x', mod_pocketDim.itemLinkSignature, 'y', mod_pocketDim.itemStableFabric }); } - + if (properties.CraftingGoldDimDoorAllowed) + { + GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldDimDoor,1), new Object[] + { + " x ", " y ", " x ", 'x', mod_pocketDim.itemGoldDoor, 'y', Item.eyeOfEnder + }); + } + if (properties.CraftingGoldDoorAllowed) + { + GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldDoor,1), new Object[] + { + "yy ", "yy ", "yy ", 'y', Item.ingotGold + }); + + GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldDoor,1), new Object[] + { + " yy", " yy", " yy", 'y', Item.ingotGold + }); + } DungeonHelper.initialize(); proxy.loadTextures(); @@ -342,6 +382,7 @@ public class mod_pocketDim @PostInit public void onPostInitialization(FMLPostInitializationEvent event) { + ForgeChunkManager.setForcedChunkLoadingCallback(instance, new ChunkLoaderHelper()); //Register loot chests DDLoot.registerInfo(); } diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoorGold.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoorGold.java new file mode 100644 index 0000000..d57aa37 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoorGold.java @@ -0,0 +1,109 @@ +package StevenDimDoors.mod_pocketDim.tileentities; + +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.world.PocketBuilder; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.ForgeChunkManager.Ticket; +import net.minecraftforge.common.ForgeChunkManager.Type; + +public class TileEntityDimDoorGold extends TileEntityDimDoor +{ + + private Ticket chunkTicket; + + public boolean canUpdate() + { + return true; + } + + public void updateEntity() + { + if(this.chunkTicket==null) + { + chunkTicket = ForgeChunkManager.requestTicket(mod_pocketDim.instance, worldObj, Type.NORMAL); + } + + chunkTicket.getModData().setInteger("goldDimDoorX", xCoord); + chunkTicket.getModData().setInteger("goldDimDoorY", yCoord); + chunkTicket.getModData().setInteger("goldDimDoorZ", zCoord); + + this.forceChunkLoading(chunkTicket); + } + + public void forceChunkLoading(Ticket chunkTicket) + { + if(PocketManager.getDimensionData(this.worldObj)==null) + { + return; + } + if(!PocketManager.getDimensionData(this.worldObj).isPocketDimension()) + { + return; + } + + for(int chunks = (PocketBuilder.DEFAULT_POCKET_SIZE%16)+1;chunks>0;chunks--) + { + ForgeChunkManager.forceChunk(chunkTicket, new ChunkCoordIntPair((xCoord >> 4)+chunks, (zCoord >> 4)+chunks)); + + } + + + + } + + + + @Override + public void invalidate() + { + ForgeChunkManager.releaseTicket(chunkTicket); + super.invalidate(); + } + + + @Override + public void readFromNBT(NBTTagCompound nbt) + { + super.readFromNBT(nbt); + int i = nbt.getInteger(("Size")); + + try + { + this.openOrClosed = nbt.getBoolean("openOrClosed"); + + this.orientation = nbt.getInteger("orientation"); + + this.hasExit = nbt.getBoolean("hasExit"); + + this.isDungeonChainLink = nbt.getBoolean("isDungeonChainLink"); + + + + + + } + catch (Exception e) + { + + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) + { + int i = 0; + super.writeToNBT(nbt); + nbt.setBoolean("openOrClosed", this.openOrClosed); + + nbt.setBoolean("hasExit", this.hasExit); + + nbt.setInteger("orientation", this.orientation); + + nbt.setBoolean("isDungeonChainLink", isDungeonChainLink); + + + } +} diff --git a/StevenDimDoors/mod_pocketDim/world/CustomSkyProvider.java b/StevenDimDoors/mod_pocketDim/world/CustomSkyProvider.java new file mode 100644 index 0000000..c88377c --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/world/CustomSkyProvider.java @@ -0,0 +1,232 @@ +package StevenDimDoors.mod_pocketDim.world; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.WorldClient; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; +import net.minecraftforge.client.IRenderHandler; + +public class CustomSkyProvider extends IRenderHandler +{ + + int starGLCallList; + int glSkyList; + int glSkyList2; + + + public String getMoonRenderPath() + { + return null; + } + + public String getSunRenderPath() + { + return null; + } + + + @Override + public void render(float par1, WorldClient world, Minecraft mc) + { + + starGLCallList = GLAllocation.generateDisplayLists(3); + glSkyList = this.starGLCallList + 1; + glSkyList2 = this.starGLCallList + 2; + GL11.glDisable(GL11.GL_FOG); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.disableStandardItemLighting(); + GL11.glDepthMask(false); + mc.renderEngine.bindTexture("/misc/tunnel.png"); + Tessellator tessellator = Tessellator.instance; + + if (mc.theWorld.provider.isSurfaceWorld()) + { + GL11.glDisable(GL11.GL_TEXTURE_2D); + Vec3 vec3 = world.getSkyColor(mc.renderViewEntity, par1); + float f1 = (float)vec3.xCoord; + float f2 = (float)vec3.yCoord; + float f3 = (float)vec3.zCoord; + float f4; + + if (mc.gameSettings.anaglyph) + { + float f5 = (f1 * 30.0F + f2 * 59.0F + f3 * 11.0F) / 100.0F; + float f6 = (f1 * 30.0F + f2 * 70.0F) / 100.0F; + f4 = (f1 * 30.0F + f3 * 70.0F) / 100.0F; + f1 = f5; + f2 = f6; + f3 = f4; + } + + GL11.glColor3f(f1, f2, f3); + Tessellator tessellator1 = Tessellator.instance; + GL11.glDepthMask(false); + GL11.glEnable(GL11.GL_FOG); + GL11.glColor3f(f1, f2, f3); + GL11.glCallList(this.glSkyList); + GL11.glDisable(GL11.GL_FOG); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderHelper.disableStandardItemLighting(); + float[] afloat = world.provider.calcSunriseSunsetColors(world.getCelestialAngle(par1), par1); + float f7; + float f8; + float f9; + float f10; + + if (afloat != null) + { + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glShadeModel(GL11.GL_SMOOTH); + GL11.glPushMatrix(); + GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(MathHelper.sin(world.getCelestialAngleRadians(par1)) < 0.0F ? 180.0F : 0.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(90.0F, 0.0F, 0.0F, 1.0F); + f4 = afloat[0]; + f7 = afloat[1]; + f8 = afloat[2]; + float f11; + + if (mc.gameSettings.anaglyph) + { + f9 = (f4 * 30.0F + f7 * 59.0F + f8 * 11.0F) / 100.0F; + f10 = (f4 * 30.0F + f7 * 70.0F) / 100.0F; + f11 = (f4 * 30.0F + f8 * 70.0F) / 100.0F; + f4 = f9; + f7 = f10; + f8 = f11; + } + + tessellator1.startDrawing(6); + tessellator1.setColorRGBA_F(f4, f7, f8, afloat[3]); + tessellator1.addVertex(0.0D, 100.0D, 0.0D); + byte b0 = 16; + tessellator1.setColorRGBA_F(afloat[0], afloat[1], afloat[2], 0.0F); + + for (int j = 0; j <= b0; ++j) + { + f11 = (float)j * (float)Math.PI * 2.0F / (float)b0; + float f12 = MathHelper.sin(f11); + float f13 = MathHelper.cos(f11); + tessellator1.addVertex((double)(f12 * 120.0F), (double)(f13 * 120.0F), (double)(-f13 * 40.0F * afloat[3])); + } + + tessellator1.draw(); + GL11.glPopMatrix(); + GL11.glShadeModel(GL11.GL_FLAT); + } + + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glPushMatrix(); + f4 = 1.0F - world.getRainStrength(par1); + f7 = 0.0F; + f8 = 0.0F; + f9 = 0.0F; + GL11.glColor4f(1.0F, 1.0F, 1.0F, f4); + GL11.glTranslatef(f7, f8, f9); + GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(world.getCelestialAngle(par1) * 360.0F, 1.0F, 0.0F, 0.0F); + f10 = 30.0F; + mc.renderEngine.bindTexture(this.getSunRenderPath()); + tessellator1.startDrawingQuads(); + tessellator1.addVertexWithUV((double)(-f10), 100.0D, (double)(-f10), 0.0D, 0.0D); + tessellator1.addVertexWithUV((double)f10, 100.0D, (double)(-f10), 1.0D, 0.0D); + tessellator1.addVertexWithUV((double)f10, 100.0D, (double)f10, 1.0D, 1.0D); + tessellator1.addVertexWithUV((double)(-f10), 100.0D, (double)f10, 0.0D, 1.0D); + tessellator1.draw(); + f10 = 20.0F; + mc.renderEngine.bindTexture(this.getMoonRenderPath()); + int k = world.getMoonPhase(); + int l = k % 4; + int i1 = k / 4 % 2; + float f14 = (float)(l + 0) ; + float f15 = (float)(i1 + 0); + float f16 = (float)(l + 1) ; + float f17 = (float)(i1 + 1); + tessellator1.startDrawingQuads(); + tessellator1.addVertexWithUV((double)(-f10), -100.0D, (double)f10, (double)f16, (double)f17); + tessellator1.addVertexWithUV((double)f10, -100.0D, (double)f10, (double)f14, (double)f17); + tessellator1.addVertexWithUV((double)f10, -100.0D, (double)(-f10), (double)f14, (double)f15); + tessellator1.addVertexWithUV((double)(-f10), -100.0D, (double)(-f10), (double)f16, (double)f15); + tessellator1.draw(); + GL11.glDisable(GL11.GL_TEXTURE_2D); + float f18 = world.getStarBrightness(par1) * f4; + + if (f18 > 0.0F) + { + GL11.glColor4f(f18, f18, f18, f18); + GL11.glCallList(this.starGLCallList); + } + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_FOG); + GL11.glPopMatrix(); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glColor3f(0.0F, 0.0F, 0.0F); + double d0 = mc.thePlayer.getPosition(par1).yCoord - world.getHorizon(); + + if (d0 < 0.0D) + { + GL11.glPushMatrix(); + GL11.glTranslatef(0.0F, 12.0F, 0.0F); + GL11.glCallList(this.glSkyList2); + GL11.glPopMatrix(); + f8 = 1.0F; + f9 = -((float)(d0 + 65.0D)); + f10 = -f8; + tessellator1.startDrawingQuads(); + tessellator1.setColorRGBA_I(0, 255); + tessellator1.addVertex((double)(-f8), (double)f9, (double)f8); + tessellator1.addVertex((double)f8, (double)f9, (double)f8); + tessellator1.addVertex((double)f8, (double)f10, (double)f8); + tessellator1.addVertex((double)(-f8), (double)f10, (double)f8); + tessellator1.addVertex((double)(-f8), (double)f10, (double)(-f8)); + tessellator1.addVertex((double)f8, (double)f10, (double)(-f8)); + tessellator1.addVertex((double)f8, (double)f9, (double)(-f8)); + tessellator1.addVertex((double)(-f8), (double)f9, (double)(-f8)); + tessellator1.addVertex((double)f8, (double)f10, (double)(-f8)); + tessellator1.addVertex((double)f8, (double)f10, (double)f8); + tessellator1.addVertex((double)f8, (double)f9, (double)f8); + tessellator1.addVertex((double)f8, (double)f9, (double)(-f8)); + tessellator1.addVertex((double)(-f8), (double)f9, (double)(-f8)); + tessellator1.addVertex((double)(-f8), (double)f9, (double)f8); + tessellator1.addVertex((double)(-f8), (double)f10, (double)f8); + tessellator1.addVertex((double)(-f8), (double)f10, (double)(-f8)); + tessellator1.addVertex((double)(-f8), (double)f10, (double)(-f8)); + tessellator1.addVertex((double)(-f8), (double)f10, (double)f8); + tessellator1.addVertex((double)f8, (double)f10, (double)f8); + tessellator1.addVertex((double)f8, (double)f10, (double)(-f8)); + tessellator1.draw(); + } + + if (world.provider.isSkyColored()) + { + GL11.glColor3f(f1 * 0.2F + 0.04F, f2 * 0.2F + 0.04F, f3 * 0.6F + 0.1F); + } + else + { + GL11.glColor3f(f1, f2, f3); + } + + GL11.glPushMatrix(); + GL11.glTranslatef(0.0F, -((float)(d0 - 16.0D)), 0.0F); + GL11.glCallList(this.glSkyList2); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDepthMask(true); + } + + } + +} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/world/LimboSkyProvider.java b/StevenDimDoors/mod_pocketDim/world/LimboSkyProvider.java index 21b1d73..4252564 100644 --- a/StevenDimDoors/mod_pocketDim/world/LimboSkyProvider.java +++ b/StevenDimDoors/mod_pocketDim/world/LimboSkyProvider.java @@ -11,211 +11,17 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraftforge.client.IRenderHandler; -public class LimboSkyProvider extends IRenderHandler +public class LimboSkyProvider extends CustomSkyProvider { - - int starGLCallList; - int glSkyList; - int glSkyList2; - - @Override - public void render(float par1, WorldClient world, Minecraft mc) + public String getMoonRenderPath() { - - starGLCallList = GLAllocation.generateDisplayLists(3); - glSkyList = this.starGLCallList + 1; - glSkyList2 = this.starGLCallList + 2; - GL11.glDisable(GL11.GL_FOG); - GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - RenderHelper.disableStandardItemLighting(); - GL11.glDepthMask(false); - mc.renderEngine.bindTexture("/misc/tunnel.png"); - Tessellator tessellator = Tessellator.instance; - - if (mc.theWorld.provider.isSurfaceWorld()) - { - GL11.glDisable(GL11.GL_TEXTURE_2D); - Vec3 vec3 = world.getSkyColor(mc.renderViewEntity, par1); - float f1 = (float)vec3.xCoord; - float f2 = (float)vec3.yCoord; - float f3 = (float)vec3.zCoord; - float f4; - - if (mc.gameSettings.anaglyph) - { - float f5 = (f1 * 30.0F + f2 * 59.0F + f3 * 11.0F) / 100.0F; - float f6 = (f1 * 30.0F + f2 * 70.0F) / 100.0F; - f4 = (f1 * 30.0F + f3 * 70.0F) / 100.0F; - f1 = f5; - f2 = f6; - f3 = f4; - } - - GL11.glColor3f(f1, f2, f3); - Tessellator tessellator1 = Tessellator.instance; - GL11.glDepthMask(false); - GL11.glEnable(GL11.GL_FOG); - GL11.glColor3f(f1, f2, f3); - GL11.glCallList(this.glSkyList); - GL11.glDisable(GL11.GL_FOG); - GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - RenderHelper.disableStandardItemLighting(); - float[] afloat = world.provider.calcSunriseSunsetColors(world.getCelestialAngle(par1), par1); - float f7; - float f8; - float f9; - float f10; - - if (afloat != null) - { - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glShadeModel(GL11.GL_SMOOTH); - GL11.glPushMatrix(); - GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(MathHelper.sin(world.getCelestialAngleRadians(par1)) < 0.0F ? 180.0F : 0.0F, 0.0F, 0.0F, 1.0F); - GL11.glRotatef(90.0F, 0.0F, 0.0F, 1.0F); - f4 = afloat[0]; - f7 = afloat[1]; - f8 = afloat[2]; - float f11; - - if (mc.gameSettings.anaglyph) - { - f9 = (f4 * 30.0F + f7 * 59.0F + f8 * 11.0F) / 100.0F; - f10 = (f4 * 30.0F + f7 * 70.0F) / 100.0F; - f11 = (f4 * 30.0F + f8 * 70.0F) / 100.0F; - f4 = f9; - f7 = f10; - f8 = f11; - } - - tessellator1.startDrawing(6); - tessellator1.setColorRGBA_F(f4, f7, f8, afloat[3]); - tessellator1.addVertex(0.0D, 100.0D, 0.0D); - byte b0 = 16; - tessellator1.setColorRGBA_F(afloat[0], afloat[1], afloat[2], 0.0F); - - for (int j = 0; j <= b0; ++j) - { - f11 = (float)j * (float)Math.PI * 2.0F / (float)b0; - float f12 = MathHelper.sin(f11); - float f13 = MathHelper.cos(f11); - tessellator1.addVertex((double)(f12 * 120.0F), (double)(f13 * 120.0F), (double)(-f13 * 40.0F * afloat[3])); - } - - tessellator1.draw(); - GL11.glPopMatrix(); - GL11.glShadeModel(GL11.GL_FLAT); - } - - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); - GL11.glPushMatrix(); - f4 = 1.0F - world.getRainStrength(par1); - f7 = 0.0F; - f8 = 0.0F; - f9 = 0.0F; - GL11.glColor4f(1.0F, 1.0F, 1.0F, f4); - GL11.glTranslatef(f7, f8, f9); - GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(world.getCelestialAngle(par1) * 360.0F, 1.0F, 0.0F, 0.0F); - f10 = 30.0F; - mc.renderEngine.bindTexture("/mods/DimDoors/textures/other/limboSun.png"); - tessellator1.startDrawingQuads(); - tessellator1.addVertexWithUV((double)(-f10), 100.0D, (double)(-f10), 0.0D, 0.0D); - tessellator1.addVertexWithUV((double)f10, 100.0D, (double)(-f10), 1.0D, 0.0D); - tessellator1.addVertexWithUV((double)f10, 100.0D, (double)f10, 1.0D, 1.0D); - tessellator1.addVertexWithUV((double)(-f10), 100.0D, (double)f10, 0.0D, 1.0D); - tessellator1.draw(); - f10 = 20.0F; - mc.renderEngine.bindTexture("/mods/DimDoors/textures/other/limboMoon.png"); - int k = world.getMoonPhase(); - int l = k % 4; - int i1 = k / 4 % 2; - float f14 = (float)(l + 0) ; - float f15 = (float)(i1 + 0); - float f16 = (float)(l + 1) ; - float f17 = (float)(i1 + 1); - tessellator1.startDrawingQuads(); - tessellator1.addVertexWithUV((double)(-f10), -100.0D, (double)f10, (double)f16, (double)f17); - tessellator1.addVertexWithUV((double)f10, -100.0D, (double)f10, (double)f14, (double)f17); - tessellator1.addVertexWithUV((double)f10, -100.0D, (double)(-f10), (double)f14, (double)f15); - tessellator1.addVertexWithUV((double)(-f10), -100.0D, (double)(-f10), (double)f16, (double)f15); - tessellator1.draw(); - GL11.glDisable(GL11.GL_TEXTURE_2D); - float f18 = world.getStarBrightness(par1) * f4; - - if (f18 > 0.0F) - { - GL11.glColor4f(f18, f18, f18, f18); - GL11.glCallList(this.starGLCallList); - } - - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_FOG); - GL11.glPopMatrix(); - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glColor3f(0.0F, 0.0F, 0.0F); - double d0 = mc.thePlayer.getPosition(par1).yCoord - world.getHorizon(); - - if (d0 < 0.0D) - { - GL11.glPushMatrix(); - GL11.glTranslatef(0.0F, 12.0F, 0.0F); - GL11.glCallList(this.glSkyList2); - GL11.glPopMatrix(); - f8 = 1.0F; - f9 = -((float)(d0 + 65.0D)); - f10 = -f8; - tessellator1.startDrawingQuads(); - tessellator1.setColorRGBA_I(0, 255); - tessellator1.addVertex((double)(-f8), (double)f9, (double)f8); - tessellator1.addVertex((double)f8, (double)f9, (double)f8); - tessellator1.addVertex((double)f8, (double)f10, (double)f8); - tessellator1.addVertex((double)(-f8), (double)f10, (double)f8); - tessellator1.addVertex((double)(-f8), (double)f10, (double)(-f8)); - tessellator1.addVertex((double)f8, (double)f10, (double)(-f8)); - tessellator1.addVertex((double)f8, (double)f9, (double)(-f8)); - tessellator1.addVertex((double)(-f8), (double)f9, (double)(-f8)); - tessellator1.addVertex((double)f8, (double)f10, (double)(-f8)); - tessellator1.addVertex((double)f8, (double)f10, (double)f8); - tessellator1.addVertex((double)f8, (double)f9, (double)f8); - tessellator1.addVertex((double)f8, (double)f9, (double)(-f8)); - tessellator1.addVertex((double)(-f8), (double)f9, (double)(-f8)); - tessellator1.addVertex((double)(-f8), (double)f9, (double)f8); - tessellator1.addVertex((double)(-f8), (double)f10, (double)f8); - tessellator1.addVertex((double)(-f8), (double)f10, (double)(-f8)); - tessellator1.addVertex((double)(-f8), (double)f10, (double)(-f8)); - tessellator1.addVertex((double)(-f8), (double)f10, (double)f8); - tessellator1.addVertex((double)f8, (double)f10, (double)f8); - tessellator1.addVertex((double)f8, (double)f10, (double)(-f8)); - tessellator1.draw(); - } - - if (world.provider.isSkyColored()) - { - GL11.glColor3f(f1 * 0.2F + 0.04F, f2 * 0.2F + 0.04F, f3 * 0.6F + 0.1F); - } - else - { - GL11.glColor3f(f1, f2, f3); - } - - GL11.glPushMatrix(); - GL11.glTranslatef(0.0F, -((float)(d0 - 16.0D)), 0.0F); - GL11.glCallList(this.glSkyList2); - GL11.glPopMatrix(); - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glDepthMask(true); - } - + return "/mods/DimDoors/textures/other/limboMoon.png"; } + @Override + public String getSunRenderPath() + { + return "/mods/DimDoors/textures/other/limboSun.png"; + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index 0b55e71..c3b1706 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -224,7 +224,8 @@ public class PocketBuilder //Check if the block below that point is actually a door int blockID = world.getBlockId(source.getX(), source.getY() - 1, source.getZ()); if (blockID != properties.DimensionalDoorID && blockID != properties.WarpDoorID && - blockID != properties.TransientDoorID) + blockID != properties.TransientDoorID && + blockID != properties.GoldDimDoorID) { throw new IllegalStateException("The link's source is not a door block. It should be impossible to traverse a rift without a door!"); } diff --git a/StevenDimDoors/mod_pocketDim/world/PocketProvider.java b/StevenDimDoors/mod_pocketDim/world/PocketProvider.java index 8348e08..ca51580 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketProvider.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketProvider.java @@ -6,6 +6,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.WorldProvider; import net.minecraft.world.biome.WorldChunkManagerHell; import net.minecraft.world.chunk.IChunkProvider; +import net.minecraftforge.client.IRenderHandler; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.CloudRenderBlank; import StevenDimDoors.mod_pocketDim.DDProperties; @@ -19,10 +20,13 @@ public class PocketProvider extends WorldProvider { private DDProperties properties; private MonolithSpawner spawner; + private IRenderHandler skyRenderer; public PocketProvider() { this.hasNoSky = true; + this.skyRenderer = new PocketSkyProvider(); + this.spawner = mod_pocketDim.spawner; this.properties = mod_pocketDim.properties; } diff --git a/StevenDimDoors/mod_pocketDim/world/PocketSkyProvider.java b/StevenDimDoors/mod_pocketDim/world/PocketSkyProvider.java new file mode 100644 index 0000000..a3503fe --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/world/PocketSkyProvider.java @@ -0,0 +1,31 @@ +package StevenDimDoors.mod_pocketDim.world; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.WorldClient; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; +import net.minecraftforge.client.IRenderHandler; + +public class PocketSkyProvider extends CustomSkyProvider +{ + + public class LimboSkyProvider extends CustomSkyProvider + { + @Override + public String getMoonRenderPath() + { + return "/mods/DimDoors/textures/other/pocketMoon.png"; + } + + @Override + public String getSunRenderPath() + { + return "/mods/DimDoors/textures/other/pocketSun.png"; + } + } +} \ No newline at end of file diff --git a/resources/mods/DimDoors/textures/blocks/dimDoorGold_bottom.png b/resources/mods/DimDoors/textures/blocks/dimDoorGold_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..85221b983ad9e35538cf043d8cb0235d165619a1 GIT binary patch literal 3327 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 JPDHLkV1nTtJ(U0e literal 0 HcmV?d00001 diff --git a/resources/mods/DimDoors/textures/blocks/dimDoorGold_top.png b/resources/mods/DimDoors/textures/blocks/dimDoorGold_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1b4339a852448b1ee6cff0b7ca702afb2b329b3d GIT binary patch literal 3251 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 JPDHLkV1nTtJ(U0e literal 0 HcmV?d00001 diff --git a/resources/mods/DimDoors/textures/blocks/doorGold_top.png b/resources/mods/DimDoors/textures/blocks/doorGold_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1b4339a852448b1ee6cff0b7ca702afb2b329b3d GIT binary patch literal 3251 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 Date: Tue, 10 Sep 2013 15:50:15 -0400 Subject: [PATCH 107/544] Gold dim door working Needs to gen the right type of door. --- .../blocks/BlockGoldDimDoor.java | 9 ++++++ .../items/ItemRiftSignature.java | 1 + .../mod_pocketDim/mod_pocketDim.java | 4 ++- .../tileentities/TileEntityDimDoorGold.java | 26 +++++++++--------- .../textures/blocks/dimDoorGold_bottom.png | Bin 3327 -> 3403 bytes .../textures/blocks/dimDoorGold_top.png | Bin 3251 -> 3325 bytes .../textures/blocks/doorGold_bottom.png | Bin 3327 -> 3403 bytes .../DimDoors/textures/blocks/doorGold_top.png | Bin 3251 -> 3325 bytes 8 files changed, 26 insertions(+), 14 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java index 22c1853..38b9fc7 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java @@ -2,12 +2,15 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.block.material.Material; import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoorGold; public class BlockGoldDimDoor extends BaseDimDoor implements IDimDoor { @@ -37,5 +40,11 @@ public class BlockGoldDimDoor extends BaseDimDoor implements IDimDoor { return this.properties.GoldDoorItemID; } + + @Override + public TileEntity createNewTileEntity(World world) + { + return new TileEntityDimDoorGold(); + } } diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java index b4003fe..aae42db 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java @@ -45,6 +45,7 @@ public class ItemRiftSignature extends Item @Override public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + //TODO- recognize doors and intelligently place rifts on them. // We must use onItemUseFirst() instead of onItemUse() because Minecraft checks // whether the user is in creative mode after calling onItemUse() and undoes any // damage we might set to indicate the rift sig has been activated. Otherwise, diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 1523c19..e9c2e8c 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -148,6 +148,7 @@ public class mod_pocketDim @PreInit public void onPreInitialization(FMLPreInitializationEvent event) { + this.instance = this; //This should be the FIRST thing that gets done. properties = DDProperties.initialize(event.getSuggestedConfigurationFile()); @@ -386,7 +387,6 @@ public class mod_pocketDim //Register loot chests DDLoot.registerInfo(); } - @ServerStopping public void onServerStopping(FMLServerStoppingEvent event) { @@ -403,6 +403,8 @@ public class mod_pocketDim @ServerStarting public void onServerStarting(FMLServerStartingEvent event) { + + //TODO- load dims with forced chunks on server startup here /* CommandResetDungeons.instance().register(event); CommandCreateDungeonRift.instance().register(event); diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoorGold.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoorGold.java index d57aa37..2de4528 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoorGold.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoorGold.java @@ -21,16 +21,19 @@ public class TileEntityDimDoorGold extends TileEntityDimDoor public void updateEntity() { - if(this.chunkTicket==null) - { - chunkTicket = ForgeChunkManager.requestTicket(mod_pocketDim.instance, worldObj, Type.NORMAL); + if(PocketManager.getDimensionData(this.worldObj)!=null&&PocketManager.getDimensionData(this.worldObj).isPocketDimension()&&!this.worldObj.isRemote) + { + if(this.chunkTicket==null) + { + chunkTicket = ForgeChunkManager.requestTicket(mod_pocketDim.instance, worldObj, Type.NORMAL); + } + + chunkTicket.getModData().setInteger("goldDimDoorX", xCoord); + chunkTicket.getModData().setInteger("goldDimDoorY", yCoord); + chunkTicket.getModData().setInteger("goldDimDoorZ", zCoord); + ForgeChunkManager.forceChunk(chunkTicket, new ChunkCoordIntPair(xCoord >> 4, zCoord >> 4)); + forceChunkLoading(chunkTicket); } - - chunkTicket.getModData().setInteger("goldDimDoorX", xCoord); - chunkTicket.getModData().setInteger("goldDimDoorY", yCoord); - chunkTicket.getModData().setInteger("goldDimDoorZ", zCoord); - - this.forceChunkLoading(chunkTicket); } public void forceChunkLoading(Ticket chunkTicket) @@ -48,10 +51,7 @@ public class TileEntityDimDoorGold extends TileEntityDimDoor { ForgeChunkManager.forceChunk(chunkTicket, new ChunkCoordIntPair((xCoord >> 4)+chunks, (zCoord >> 4)+chunks)); - } - - - + } } diff --git a/resources/mods/DimDoors/textures/blocks/dimDoorGold_bottom.png b/resources/mods/DimDoors/textures/blocks/dimDoorGold_bottom.png index 85221b983ad9e35538cf043d8cb0235d165619a1..9e00119f429afe8e11e891daecd142c1ac4c8861 100644 GIT binary patch delta 664 zcmV;J0%!gI8Os{5zzTnMNklCDl%hQp1P@X~p$#fpkp!{I5+bP$lBTJK5L44UVpA? zra*a%Lz7k;iS2HvdOwsqistbcn#WHG;Etks^n@VwLCD%I$Z7}9iUK8rLz7m-2XsL> zcW9#f&=)?2a!09GzYA&iKvqKVOo7vaKyi~p^Gtz%KLn%|CKpa0RDA%dJ_vO1MOLKxDDkhn4AI~bwq^#Q1QKV+>Jvf2)5wLw_?A3V zTv_5Ul>3MvP9M3b-Gr=m;G!%bDW zW=L?5q%(gPXV_k%>Bc*T*$Exm);z=3JT)?_6lZsh0M$<ClwoFEhqgM+ yF!x%=>;%=!IGtB}SL^L7s_B$~`v# delta 587 zcmV-R0<`_h8vhxvzzTmVNkl1&cf<$mdmHHWhPS$) zehH!>*t-S$w*`oXU~f2v^uzW!2v31)gvI{=XP|Z=Rg8vU@22*~Ak;5P#BTvF%khTc z7YxJ8#1UH6Q0swupVS(cq1LN<&<=hxxJ}?1hiitrXc$48hJ$uB?+nPn?scix`xI@v z8-fn?1s(rHh%JBNWz$D&T!Gzdg4B9r7iX2-Zw9}GqiO>1vf!Gm1s!RO1hn0)b9frU zPQ5`4*jzB|`$r>MHV(=$#BY(!uu~5kv}xFH1-FUg4dcgWsV}}XELt||?*;h19{&@r z#a3Ijdnf)5M$1yJI7a@lVbwWfecq_frJ$p#3F2iqTvLB78FUxbTXBrpCx+b})}i94 z>DM;_2US z-dM`3P;nGzeO`e571<4os#P38Dvq%_ZR8#qwlbLlHW#Fn*bIv)AS~)W$zRGD<0CO( zb=p{&l)XdpjPiY&)k?mTyYh^BOF84k1H+tW#;b>-jgP1}KBC&hXj)IcpWjc{(|g9B Z0RS`=yk?a>-`oHI002ovPDHLkV1ltzBaZ+8 diff --git a/resources/mods/DimDoors/textures/blocks/dimDoorGold_top.png b/resources/mods/DimDoors/textures/blocks/dimDoorGold_top.png index 1b4339a852448b1ee6cff0b7ca702afb2b329b3d..af4d1a82691a5a80b647c0a02c83248faf88b5f8 100644 GIT binary patch delta 586 zcmV-Q0=50K8T}cszY2c>C`m*?RCwBSl1*zGQ51#;`f;yF5D^KHQi=o#5=sc6ixdgL zMF?G#AYFv4N`Fm%MYkoCmJnJJvMIDp!=N!%=S#;KjFb`vu@b~{rSNufM$k-+%@FY`#i|11#b61}oSpi5kx@!qdU45|{tx&(h2F_4)+pi5|js>F4T ze+K%^gHc0b)Zp*i78x;I913XHHGbGDGw3G69LSmnnF&6daSZF6gv>Zb4T&Eg1+<^v zxa2^W`1AXn_U}@yJjhB%?#WDISeH0I5YS$|xI4`r0eBlwt>q}d$%4!zoD%`<&Fgy@ zHQ1yGz~6>)*JghLtYg6@k`V)0DUg$e@(NJ?7RHw)j62Vv{373Z8&K{Fl)H+FH0xME z`}LiTyRJz#%+7$COHi$4sP;OP`5<-y@M0zM9 zMLZM{40O-ceB}O@!-WGBK&%o-Na_?Vc321zWLsK z-;5-uf`6=$oC>!W!sDfYtMSmy&IRy_;FZ8s!PdbQWR&!Z3iN-<3NRH7uRIZ@5hgeh zL>Vjk;*(2E4g48>$<)A1>76V3Zz@DT1i9~w+vV=N{1f3D@Tc>6>ws6rKNjS0N5-#D z0taglF6Q&WJXnXDb3s0Tl2k$=4@@?pzx-c<-)EVLrV6$J!E1^Kg#n=Xzs(PS>bxlsTI^0!~ z=Omb#PC+Hqlz9?(y|0pT(`kZrh<}bcaGoF6)t>6l5wyV8G2aAv=%!QfU#LOxDhxhC zvNbj_*+@-Xg5E2z4IVFr&X-Jrb)fe$oj_W6y$@G=TAX)mDN)oW(~nog{VE7E9}dvmHWY-&N&)?BclU)xZ#y%NER&^;3V4ghFVCDl%hQp1P@X~p$#fpkp!{I5+bP$lBTJK5L44UVpA? zra*a%Lz7k;iS2HvdOwsqistbcn#WHG;Etks^n@VwLCD%I$Z7}9iUK8rLz7m-2XsL> zcW9#f&=)?2a!09GzYA&iKvqKVOo7vaKyi~p^Gtz%KLn%|CKpa0RDA%dJ_vO1MOLKxDDkhn4AI~bwq^#Q1QKV+>Jvf2)5wLw_?A3V zTv_5Ul>3MvP9M3b-Gr=m;G!%bDW zW=L?5q%(gPXV_k%>Bc*T*$Exm);z=3JT)?_6lZsh0M$<ClwoFEhqgM+ yF!x%=>;%=!IGtB}SL^L7s_B$~`v# delta 587 zcmV-R0<`_h8vhxvzzTmVNkl1&cf<$mdmHHWhPS$) zehH!>*t-S$w*`oXU~f2v^uzW!2v31)gvI{=XP|Z=Rg8vU@22*~Ak;5P#BTvF%khTc z7YxJ8#1UH6Q0swupVS(cq1LN<&<=hxxJ}?1hiitrXc$48hJ$uB?+nPn?scix`xI@v z8-fn?1s(rHh%JBNWz$D&T!Gzdg4B9r7iX2-Zw9}GqiO>1vf!Gm1s!RO1hn0)b9frU zPQ5`4*jzB|`$r>MHV(=$#BY(!uu~5kv}xFH1-FUg4dcgWsV}}XELt||?*;h19{&@r z#a3Ijdnf)5M$1yJI7a@lVbwWfecq_frJ$p#3F2iqTvLB78FUxbTXBrpCx+b})}i94 z>DM;_2US z-dM`3P;nGzeO`e571<4os#P38Dvq%_ZR8#qwlbLlHW#Fn*bIv)AS~)W$zRGD<0CO( zb=p{&l)XdpjPiY&)k?mTyYh^BOF84k1H+tW#;b>-jgP1}KBC&hXj)IcpWjc{(|g9B Z0RS`=yk?a>-`oHI002ovPDHLkV1ltzBaZ+8 diff --git a/resources/mods/DimDoors/textures/blocks/doorGold_top.png b/resources/mods/DimDoors/textures/blocks/doorGold_top.png index 1b4339a852448b1ee6cff0b7ca702afb2b329b3d..af4d1a82691a5a80b647c0a02c83248faf88b5f8 100644 GIT binary patch delta 586 zcmV-Q0=50K8T}cszY2c>C`m*?RCwBSl1*zGQ51#;`f;yF5D^KHQi=o#5=sc6ixdgL zMF?G#AYFv4N`Fm%MYkoCmJnJJvMIDp!=N!%=S#;KjFb`vu@b~{rSNufM$k-+%@FY`#i|11#b61}oSpi5kx@!qdU45|{tx&(h2F_4)+pi5|js>F4T ze+K%^gHc0b)Zp*i78x;I913XHHGbGDGw3G69LSmnnF&6daSZF6gv>Zb4T&Eg1+<^v zxa2^W`1AXn_U}@yJjhB%?#WDISeH0I5YS$|xI4`r0eBlwt>q}d$%4!zoD%`<&Fgy@ zHQ1yGz~6>)*JghLtYg6@k`V)0DUg$e@(NJ?7RHw)j62Vv{373Z8&K{Fl)H+FH0xME z`}LiTyRJz#%+7$COHi$4sP;OP`5<-y@M0zM9 zMLZM{40O-ceB}O@!-WGBK&%o-Na_?Vc321zWLsK z-;5-uf`6=$oC>!W!sDfYtMSmy&IRy_;FZ8s!PdbQWR&!Z3iN-<3NRH7uRIZ@5hgeh zL>Vjk;*(2E4g48>$<)A1>76V3Zz@DT1i9~w+vV=N{1f3D@Tc>6>ws6rKNjS0N5-#D z0taglF6Q&WJXnXDb3s0Tl2k$=4@@?pzx-c<-)EVLrV6$J!E1^Kg#n=Xzs(PS>bxlsTI^0!~ z=Omb#PC+Hqlz9?(y|0pT(`kZrh<}bcaGoF6)t>6l5wyV8G2aAv=%!QfU#LOxDhxhC zvNbj_*+@-Xg5E2z4IVFr&X-Jrb)fe$oj_W6y$@G=TAX)mDN)oW(~nog{VE7E9}dvmHWY-&N&)?BclU)xZ#y%NER&^;3V4ghFV Date: Wed, 11 Sep 2013 00:22:16 -0400 Subject: [PATCH 108/544] Gold door completed, doors check for obstructions --- .../mod_pocketDim/blocks/BaseDimDoor.java | 4 +- .../mod_pocketDim/blocks/TransTrapdoor.java | 7 +- .../mod_pocketDim/blocks/TransientDoor.java | 6 +- .../mod_pocketDim/commands/IItemDimDoor.java | 5 ++ .../mod_pocketDim/core/DDTeleporter.java | 84 ++++++++++++++++++- .../{dungeon => items}/ItemGoldDimDoor.java | 5 +- .../{dungeon => items}/ItemGoldDoor.java | 2 +- .../mod_pocketDim/mod_pocketDim.java | 4 +- .../mod_pocketDim/world/PocketBuilder.java | 30 +++++-- 9 files changed, 126 insertions(+), 21 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/commands/IItemDimDoor.java rename StevenDimDoors/mod_pocketDim/{dungeon => items}/ItemGoldDimDoor.java (92%) rename StevenDimDoors/mod_pocketDim/{dungeon => items}/ItemGoldDoor.java (97%) diff --git a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index 01bbaee..c27bd1d 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -11,6 +11,7 @@ import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemDoor; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.util.MathHelper; @@ -21,6 +22,7 @@ import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import cpw.mods.fml.relauncher.Side; @@ -392,7 +394,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn DimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); if (link != null) { - DDTeleporter.traverseDimDoor(world, link, entity); + DDTeleporter.traverseDimDoor(world, link, entity, this); } // Close the door only after the entity goes through // so players don't have it slam in their faces. diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java index 91bcf94..97f94ba 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java @@ -8,6 +8,7 @@ import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; +import net.minecraft.item.ItemDoor; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -16,6 +17,7 @@ import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor; public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntityProvider @@ -50,7 +52,7 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit DimLink link = PocketManager.getLink(x, y, z, world); if (link != null) { - DDTeleporter.traverseDimDoor(world, link, entity); + DDTeleporter.traverseDimDoor(world, link, entity,this); } } } @@ -98,6 +100,7 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit } } } + @Override public int idDropped(int metadata, Random random, int fortuneLevel) @@ -109,7 +112,7 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit public int getDrops() { return Block.trapdoor.blockID; - } + } public static boolean isTrapdoorSetLow(int metadata) { diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java index cdd54ee..174631b 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java @@ -4,14 +4,17 @@ import net.minecraft.block.material.Material; import net.minecraft.client.particle.EntityFX; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; +import net.minecraft.item.ItemDoor; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; public class TransientDoor extends BaseDimDoor { @@ -45,7 +48,7 @@ public class TransientDoor extends BaseDimDoor DimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); if (link != null) { - DDTeleporter.traverseDimDoor(world, link, entity); + DDTeleporter.traverseDimDoor(world, link, entity, this); // Turn the door into a rift AFTER teleporting the player. // The door's orientation may be necessary for the teleport. world.setBlock(x, y, z, properties.RiftBlockID); @@ -96,4 +99,5 @@ public class TransientDoor extends BaseDimDoor { return 8; } + } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/commands/IItemDimDoor.java b/StevenDimDoors/mod_pocketDim/commands/IItemDimDoor.java new file mode 100644 index 0000000..472bc9c --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/commands/IItemDimDoor.java @@ -0,0 +1,5 @@ +package StevenDimDoors.mod_pocketDim.commands; + +public interface IItemDimDoor { + +} diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 312f9ee..d51f42f 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -3,11 +3,13 @@ package StevenDimDoors.mod_pocketDim.core; import java.util.ArrayList; import java.util.Random; +import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemDoor; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet41EntityEffect; import net.minecraft.network.packet.Packet43Experience; @@ -20,7 +22,9 @@ import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.IDimDoor; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; +import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import StevenDimDoors.mod_pocketDim.util.Point4D; @@ -39,6 +43,67 @@ public class DDTeleporter private DDTeleporter() { } + /**Checks if the destination supplied is valid, ie, filled by any non-replaceable block. + * + * @param entity + * @param world + * @param destination + * @param properties + * @return + */ + public static boolean CheckDestination(Entity entity, WorldServer world, Point4D destination,DDProperties properties) + { + int x = destination.getX(); + int y = destination.getY(); + int z = destination.getZ(); + int blockIDTop; + int blockIDBottom; + + Point3D point; + + int orientation; + + orientation = getDestinationOrientation(destination, properties); + entity.rotationYaw = (orientation * 90) + 90; + switch (orientation) + { + case 0: + point= new Point3D(MathHelper.floor_double(x - 0.5), y - 1, MathHelper.floor_double(z + 0.5)); + break; + case 1: + point= new Point3D(MathHelper.floor_double(x + 0.5), y - 1, MathHelper.floor_double(z - 0.5)); + break; + case 2: + point = new Point3D(MathHelper.floor_double(x + 1.5), y - 1, MathHelper.floor_double(z + 0.5)); + break; + case 3: + point = new Point3D(MathHelper.floor_double(x + 0.5), y - 1, MathHelper.floor_double(z + 1.5)); + break; + default: + point = new Point3D(x, y - 1, z); + break; + } + blockIDBottom = world.getBlockId(point.getX(), point.getY(), point.getZ()); + blockIDTop = world.getBlockId(point.getX(), point.getY()+1, point.getZ()); + + if(!(Block.blocksList[blockIDBottom]==null)) + { + if(!Block.blocksList[blockIDBottom].isBlockReplaceable(world, point.getX(), point.getY(), point.getZ())) + { + return false; + } + } + if(!(Block.blocksList[blockIDTop]==null)) + { + if(!Block.blocksList[blockIDTop].isBlockReplaceable(world, point.getX(), point.getY()+1, point.getZ())) + { + return false; + } + } + return true; + + + } private static void placeInPortal(Entity entity, WorldServer world, Point4D destination, DDProperties properties, boolean checkOrientation) { int x = destination.getX(); @@ -209,6 +274,17 @@ public class DDTeleporter { newWorld = (WorldServer) oldWorld; } + if(!CheckDestination(entity, newWorld, destination, properties)) + { + + //TODO Give entity backwards acceleration + if(entity instanceof EntityPlayerMP) + { + EntityPlayerMP.class.cast(entity).sendChatToPlayer("Destination blocked!!"); + } + return entity; + + } // GreyMaria: What is this even accomplishing? We're doing the exact same thing at the end of this all. // TODO Check to see if this is actually vital. @@ -318,7 +394,7 @@ public class DDTeleporter * @param link - the link the player is using to teleport; sends the player to its destination * @param player - the instance of the player to be teleported */ - public static void traverseDimDoor(World world, DimLink link, Entity entity) + public static void traverseDimDoor(World world, DimLink link, Entity entity, Block door) { if (world == null) { @@ -346,7 +422,7 @@ public class DDTeleporter return; } - if (!initializeDestination(link, DDProperties.instance())) + if (!initializeDestination(link, DDProperties.instance(),door)) { return; } @@ -367,7 +443,7 @@ public class DDTeleporter } } - private static boolean initializeDestination(DimLink link, DDProperties properties) + private static boolean initializeDestination(DimLink link, DDProperties properties, Block door) { // FIXME: Change this later to support rooms that have been wiped and must be regenerated. // FIXME: Add code for restoring the destination-side door. @@ -384,7 +460,7 @@ public class DDTeleporter case LinkTypes.DUNGEON: return PocketBuilder.generateNewDungeonPocket(link, properties); case LinkTypes.POCKET: - return PocketBuilder.generateNewPocket(link, properties); + return PocketBuilder.generateNewPocket(link, properties,door); case LinkTypes.SAFE_EXIT: return generateSafeExit(link, properties); case LinkTypes.DUNGEON_EXIT: diff --git a/StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDimDoor.java b/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java similarity index 92% rename from StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDimDoor.java rename to StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java index dde4efa..b30bd7f 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java @@ -1,13 +1,13 @@ -package StevenDimDoors.mod_pocketDim.dungeon; +package StevenDimDoors.mod_pocketDim.items; import java.util.List; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; public class ItemGoldDimDoor extends BaseItemDoor { @@ -16,6 +16,7 @@ public class ItemGoldDimDoor extends BaseItemDoor super(itemID, material); // TODO Auto-generated constructor stub } + @SuppressWarnings({ "rawtypes", "unchecked" }) @Override diff --git a/StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDoor.java b/StevenDimDoors/mod_pocketDim/items/ItemGoldDoor.java similarity index 97% rename from StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDoor.java rename to StevenDimDoors/mod_pocketDim/items/ItemGoldDoor.java index 0a8a5ce..d077d43 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/ItemGoldDoor.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemGoldDoor.java @@ -1,4 +1,4 @@ -package StevenDimDoors.mod_pocketDim.dungeon; +package StevenDimDoors.mod_pocketDim.items; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import net.minecraft.block.Block; diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index e9c2e8c..c43d73d 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -25,12 +25,12 @@ import StevenDimDoors.mod_pocketDim.blocks.TransientDoor; import StevenDimDoors.mod_pocketDim.blocks.UnstableDoor; import StevenDimDoors.mod_pocketDim.blocks.WarpDoor; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.dungeon.ItemGoldDimDoor; -import StevenDimDoors.mod_pocketDim.dungeon.ItemGoldDoor; import StevenDimDoors.mod_pocketDim.helpers.ChunkLoaderHelper; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.items.ItemBlockDimWall; import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; +import StevenDimDoors.mod_pocketDim.items.ItemGoldDimDoor; +import StevenDimDoors.mod_pocketDim.items.ItemGoldDoor; import StevenDimDoors.mod_pocketDim.items.ItemRiftBlade; import StevenDimDoors.mod_pocketDim.items.ItemRiftSignature; import StevenDimDoors.mod_pocketDim.items.ItemStabilizedRiftSignature; diff --git a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index c3b1706..1a519f3 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -3,6 +3,7 @@ package StevenDimDoors.mod_pocketDim.world; import java.util.Random; import net.minecraft.block.Block; +import net.minecraft.item.ItemDoor; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; @@ -10,7 +11,8 @@ import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; -import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; +import StevenDimDoors.mod_pocketDim.blocks.IDimDoor; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; @@ -20,10 +22,11 @@ import StevenDimDoors.mod_pocketDim.dungeon.DungeonSchematic; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfig; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; -import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import StevenDimDoors.mod_pocketDim.util.Pair; import StevenDimDoors.mod_pocketDim.util.Point4D; +import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; +import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; public class PocketBuilder { @@ -208,9 +211,9 @@ public class PocketBuilder schematic.getLength() <= DungeonHelper.MAX_DUNGEON_LENGTH); } - public static boolean generateNewPocket(DimLink link, DDProperties properties) + public static boolean generateNewPocket(DimLink link, DDProperties properties, Block door) { - return generateNewPocket(link, DEFAULT_POCKET_SIZE, DEFAULT_POCKET_WALL_THICKNESS, properties); + return generateNewPocket(link, DEFAULT_POCKET_SIZE, DEFAULT_POCKET_WALL_THICKNESS, properties, door); } private static int getDoorOrientation(Point4D source, DDProperties properties) @@ -235,7 +238,7 @@ public class PocketBuilder return orientation; } - public static boolean generateNewPocket(DimLink link, int size, int wallThickness, DDProperties properties) + public static boolean generateNewPocket(DimLink link, int size, int wallThickness, DDProperties properties, Block door) { if (link == null) { @@ -250,6 +253,12 @@ public class PocketBuilder throw new IllegalArgumentException("link cannot have a destination assigned already."); } + if(door==null) + { + throw new IllegalArgumentException("Must have a doorItem to gen one!!"); + + } + if (size < MIN_POCKET_SIZE || size > MAX_POCKET_SIZE) { throw new IllegalArgumentException("size must be between " + MIN_POCKET_SIZE + " and " + MAX_POCKET_SIZE + ", inclusive."); @@ -292,7 +301,7 @@ public class PocketBuilder parent.setDestination(reverseLink, source.getX(), source.getY(), source.getZ()); //Build the actual pocket area - buildPocket(world, source.getX(), destinationY, source.getZ(), orientation, size, wallThickness, properties); + buildPocket(world, source.getX(), destinationY, source.getZ(), orientation, size, wallThickness, properties, door); //Finish up destination initialization dimension.initializePocket(source.getX(), destinationY, source.getZ(), orientation, link); @@ -306,7 +315,7 @@ public class PocketBuilder } } - private static void buildPocket(World world, int x, int y, int z, int orientation, int size, int wallThickness, DDProperties properties) + private static void buildPocket(World world, int x, int y, int z, int orientation, int size, int wallThickness, DDProperties properties, Block doorBlock) { if (properties == null) { @@ -328,6 +337,11 @@ public class PocketBuilder { throw new IllegalArgumentException("size must be large enough to fit the specified wall thickness and some air space."); } + if (!(doorBlock instanceof IDimDoor)) + { + throw new IllegalArgumentException("Door must implement IDimDoor"); + } + Point3D center = new Point3D(x - wallThickness + 1 + (size / 2), y - wallThickness - 1 + (size / 2), z); Point3D door = new Point3D(x, y, z); @@ -345,7 +359,7 @@ public class PocketBuilder //Build the door int doorOrientation = BlockRotator.transformMetadata(BlockRotator.EAST_DOOR_METADATA, orientation - BlockRotator.EAST_DOOR_METADATA + 2, properties.DimensionalDoorID); - ItemDimensionalDoor.placeDoorBlock(world, x, y - 1, z, doorOrientation, mod_pocketDim.dimensionalDoor); + ItemDimensionalDoor.placeDoorBlock(world, x, y - 1, z, doorOrientation, doorBlock); } private static void buildBox(World world, int centerX, int centerY, int centerZ, int radius, int blockID, boolean placeTnt, int nonTntWeight) -- 2.39.5 From 6f905050f270047f53c2a62a47b96dec6dc3451f Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 11 Sep 2013 01:21:12 -0400 Subject: [PATCH 109/544] Minor Change Removed unused import --- StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java b/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java index bd2a234..f734192 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java @@ -3,11 +3,9 @@ package StevenDimDoors.mod_pocketDim.helpers; import java.util.List; import net.minecraft.world.World; -import net.minecraftforge.common.ForgeChunkManager.Ticket; import net.minecraftforge.common.ForgeChunkManager; - +import net.minecraftforge.common.ForgeChunkManager.Ticket; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoorGold; import com.google.common.collect.Lists; -- 2.39.5 From 1d3038288bb6170fbb4547b96473db7b2f0f8365 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 11 Sep 2013 02:30:31 -0400 Subject: [PATCH 110/544] Minor Fix in BlockDimWall Fixed an issue that skyboy had pointed out long ago about us using ItemBlock.itemID as a block ID instead of ItemBlock.getBlockID(). That's potentially hazardous because that function was introduced specifically so mods could override it and decouple item IDs from block IDs. --- .../mod_pocketDim/blocks/BlockDimWall.java | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWall.java b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWall.java index 73e6808..6144d4d 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWall.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWall.java @@ -3,11 +3,6 @@ package StevenDimDoors.mod_pocketDim.blocks; import java.util.List; import java.util.Random; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -import StevenDimDoors.mod_pocketDim.mod_pocketDim; - import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -20,6 +15,9 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class BlockDimWall extends Block { @@ -69,14 +67,7 @@ public class BlockDimWall extends Block @Override public Icon getIcon(int par1, int par2) { - if (par2 == 1) - { - return blockIcon[par2]; - } - else - { - return blockIcon[0]; - } + return (par2 != 1) ? blockIcon[0] : blockIcon[1]; } @Override @@ -119,8 +110,13 @@ public class BlockDimWall extends Block if (playerEquip instanceof ItemBlock) { - Block block = Block.blocksList[playerEquip.itemID]; - if (!Block.isNormalCube(playerEquip.itemID) || block instanceof BlockContainer || block.blockID == this.blockID) + // SenseiKiwi: Using getBlockID() rather than the raw itemID is critical. + // Some mods may override that function and use item IDs outside the range + // of the block list. + + int blockID = ((ItemBlock) playerEquip).getBlockID(); + Block block = Block.blocksList[blockID]; + if (!Block.isNormalCube(blockID) || block instanceof BlockContainer || blockID == this.blockID) { return false; } -- 2.39.5 From 670b9a29028378e3c9fab88b464a768cf5bd0b95 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Wed, 11 Sep 2013 02:51:49 -0400 Subject: [PATCH 111/544] Fixed door obstruction check to not trap people --- .../mod_pocketDim/core/DDTeleporter.java | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index d51f42f..09bcebc 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -122,6 +122,37 @@ public class DDTeleporter orientation = -1; } + if(!CheckDestination(entity, world, destination, properties)) + { + + //TODO Give entity backwards acceleration + if(entity instanceof EntityPlayerMP) + { + EntityPlayer player = (EntityPlayer) entity; + player.rotationYaw=(orientation * 90)+90; + switch (orientation) + { + case 0: + player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5); + break; + case 1: + player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5); + break; + case 2: + player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5); + break; + case 3: + player.setPositionAndUpdate(x + 0.5, y - 1, z + .5); + break; + default: + player.setPositionAndUpdate(x, y - 1, z); + break; + } + + } + + + } if (entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) entity; @@ -274,17 +305,7 @@ public class DDTeleporter { newWorld = (WorldServer) oldWorld; } - if(!CheckDestination(entity, newWorld, destination, properties)) - { - - //TODO Give entity backwards acceleration - if(entity instanceof EntityPlayerMP) - { - EntityPlayerMP.class.cast(entity).sendChatToPlayer("Destination blocked!!"); - } - return entity; - - } + // GreyMaria: What is this even accomplishing? We're doing the exact same thing at the end of this all. // TODO Check to see if this is actually vital. -- 2.39.5 From c2fa4964f858953086f855923814236d57f60930 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 11 Sep 2013 22:13:42 -0400 Subject: [PATCH 112/544] Progress on New Save Format Integrated the base code for our new save format. It still needs more work but at least some substance is there. Ignore the file not found messages that come up when trying to save the world's data - since we're not actually writing files, an exception occurs when we some later code tries to move non-existent save files. Also moved the FileFilter functionality out of DungeonHelper and into its own class, FileFilters, since it's finally needed more broadly. --- .../mod_pocketDim/EventHookContainer.java | 2 +- .../mod_pocketDim/core/DimLink.java | 6 + .../mod_pocketDim/core/NewDimData.java | 38 ++--- .../mod_pocketDim/core/PocketManager.java | 144 +++++++++++------- .../mod_pocketDim/helpers/DungeonHelper.java | 24 +-- .../mod_pocketDim/saving/DDSaveHandler.java | 136 +++++++++++++++++ .../saving/DimDataProcessor.java | 28 ++++ .../mod_pocketDim/saving/IPackable.java | 7 + .../mod_pocketDim/saving/PackedDimData.java | 42 +++++ .../mod_pocketDim/saving/PackedLinkData.java | 6 + .../mod_pocketDim/saving/PackedLinkTail.java | 6 + .../mod_pocketDim/util/FileFilters.java | 51 +++++++ 12 files changed, 397 insertions(+), 93 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java create mode 100644 StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java create mode 100644 StevenDimDoors/mod_pocketDim/saving/IPackable.java create mode 100644 StevenDimDoors/mod_pocketDim/saving/PackedDimData.java create mode 100644 StevenDimDoors/mod_pocketDim/saving/PackedLinkData.java create mode 100644 StevenDimDoors/mod_pocketDim/saving/PackedLinkTail.java create mode 100644 StevenDimDoors/mod_pocketDim/util/FileFilters.java diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index aeaa0d3..6191018 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -89,7 +89,7 @@ public class EventHookContainer } @ForgeSubscribe - public void onWorldsave(WorldEvent.Save event) + public void onWorldSave(WorldEvent.Save event) { if (event.world.provider.dimensionId == 0) { diff --git a/StevenDimDoors/mod_pocketDim/core/DimLink.java b/StevenDimDoors/mod_pocketDim/core/DimLink.java index cdf25a6..f0270a7 100644 --- a/StevenDimDoors/mod_pocketDim/core/DimLink.java +++ b/StevenDimDoors/mod_pocketDim/core/DimLink.java @@ -14,6 +14,12 @@ public abstract class DimLink protected DimLink(Point4D source, DimLink parent) { + if (parent.source.getDimension() != source.getDimension()) + { + // Ban having children in other dimensions to avoid serialization issues with cross-dimensional tails + throw new IllegalArgumentException("source and parent.source must have the same dimension."); + } + this.parent = parent; this.source = source; this.tail = parent.tail; diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index a480333..12c7f25 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -57,13 +57,17 @@ public abstract class NewDimData if (nextParent == null) { throw new IllegalArgumentException("nextParent cannot be null."); - } - + } if (this == nextParent) { //Ignore this request silently return false; } + if (nextParent.source.getDimension() != source.getDimension()) + { + // Ban having children in other dimensions to avoid serialization issues with cross-dimensional tails + throw new IllegalArgumentException("source and parent.source must have the same dimension."); + } //Release children for (DimLink child : children) @@ -106,22 +110,22 @@ public abstract class NewDimData } } - private static Random random = new Random(); + protected static Random random = new Random(); - private final int id; - private final Map linkMapping; - private final List linkList; - private final boolean isDungeon; - private boolean isFilled; - private final int depth; - private int packDepth; - private final NewDimData parent; - private final NewDimData root; - private final List children; - private Point4D origin; - private int orientation; - private DungeonData dungeon; - private final IUpdateWatcher linkWatcher; + protected int id; + protected Map linkMapping; + protected List linkList; + protected boolean isDungeon; + protected boolean isFilled; + protected int depth; + protected int packDepth; + protected NewDimData parent; + protected NewDimData root; + protected List children; + protected Point4D origin; + protected int orientation; + protected DungeonData dungeon; + protected IUpdateWatcher linkWatcher; protected NewDimData(int id, NewDimData parent, boolean isPocket, boolean isDungeon, IUpdateWatcher linkWatcher) diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index eda8947..3c992fc 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -13,6 +13,9 @@ import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.helpers.Compactor; import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; +import StevenDimDoors.mod_pocketDim.saving.DDSaveHandler; +import StevenDimDoors.mod_pocketDim.saving.IPackable; +import StevenDimDoors.mod_pocketDim.saving.PackedDimData; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; import StevenDimDoors.mod_pocketDim.watcher.IUpdateSource; @@ -25,7 +28,7 @@ import StevenDimDoors.mod_pocketDim.watcher.UpdateWatcherProxy; */ public class PocketManager { - private static class InnerDimData extends NewDimData + private static class InnerDimData extends NewDimData implements IPackable { // This class allows us to instantiate NewDimData indirectly without exposing // a public constructor from NewDimData. It's meant to stop us from constructing @@ -43,6 +46,49 @@ public class PocketManager // This constructor is meant for client-side code only super(id, root); } + + public void clear() + { + // If this dimension has a parent, remove it from its parent's list of children + if (parent != null) + { + parent.children.remove(this); + } + // Remove this dimension as the parent of its children + for (NewDimData child : children) + { + child.parent = null; + } + // Clear all fields + id = Integer.MIN_VALUE; + linkMapping.clear(); + linkMapping = null; + linkList.clear(); + linkList = null; + children.clear(); + children = null; + isDungeon = false; + isFilled = false; + depth = Integer.MIN_VALUE; + packDepth = Integer.MIN_VALUE; + origin = null; + orientation = Integer.MIN_VALUE; + dungeon = null; + linkWatcher = null; + } + + @Override + public String name() + { + return String.valueOf(id); + } + + @Override + public PackedDimData pack() + { + // FIXME: IMPLEMENTATION PLZTHX + return null; + } } private static class ClientLinkWatcher implements IUpdateWatcher @@ -140,44 +186,44 @@ public class PocketManager isLoading = false; } - public boolean clearPocket(NewDimData dimension) + public boolean resetDungeon(NewDimData target) { - if (!dimension.isPocketDimension() || DimensionManager.getWorld(dimension.id()) != null) + // 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) { - return false; + File saveDirectory = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); + if (DeleteFolder.deleteFolder(saveDirectory)) + { + dimension.setFilled(false); + return true; + } } - - File save = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); - DeleteFolder.deleteFolder(save); - dimension.setFilled(false); - //FIXME: Reset door information? - return true; + return false; } - public static boolean deletePocket(NewDimData dimension, boolean deleteFolder) + public static boolean deletePocket(NewDimData target, boolean deleteFolder) { - //FIXME: Shouldn't the links in and out of this dimension be altered somehow? Otherwise we have links pointing - //into a deleted dimension! - - //Checks to see if the pocket is loaded or isn't actually a pocket. + // We can't delete the dimension if it's currently loaded or if it's not actually a pocket. + // 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.isPocketDimension() && DimensionManager.getWorld(dimension.id()) == null) { - dimensionData.remove(dimension.id()); - DimensionManager.unregisterDimension(dimension.id()); if (deleteFolder) { - File save = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); - DeleteFolder.deleteFolder(save); + File saveDirectory = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); + DeleteFolder.deleteFolder(saveDirectory); } - //Raise the dim deleted event + dimensionData.remove(dimension.id()); + // Raise the dim deleted event dimWatcher.onDeleted(new ClientDimData(dimension)); - //dimension.implode()??? -- more like delete, but yeah + dimension.clear(); return true; } - else - { - return false; - } + return false; } private static void registerPockets(DDProperties properties) @@ -222,32 +268,29 @@ public class PocketManager * loads the dim data from the saved hashMap. Also handles compatibility with old saves, see OldSaveHandler */ private static void loadInternal() - { - // SenseiKiwi: This is a temporary function for testing purposes. - // We'll move on to using a text-based format in the future. - + { if (!DimensionManager.getWorld(OVERWORLD_DIMENSION_ID).isRemote && DimensionManager.getCurrentSaveRootDirectory() != null) { - System.out.println("Loading Dimensional Doors save data..."); - /*File saveFile = new File(DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.dat"); + // Load and register blacklisted dimension IDs - setState(saveData);*/ - System.out.println("Loaded successfully!"); + // Load save data + System.out.println("Loading Dimensional Doors save data..."); + if (DDSaveHandler.loadAll()) + { + System.out.println("Loaded successfully!"); + } } } public static void save() { - // SenseiKiwi: This is a temporary function for testing purposes. - // We'll move on to using a text-based format in the future. - if (!isLoaded) { return; } World world = DimensionManager.getWorld(OVERWORLD_DIMENSION_ID); - if (world == null || world.isRemote || DimensionManager.getCurrentSaveRootDirectory() != null) + if (world == null || world.isRemote || DimensionManager.getCurrentSaveRootDirectory() == null) { return; } @@ -256,30 +299,23 @@ public class PocketManager { return; } - isSaving = true; + try { System.out.println("Writing Dimensional Doors save data..."); - /*String tempPath = DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.tmp"; - String savePath = DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.dat"; - File tempFile = new File(tempPath); - File saveFile = new File(savePath); - DataOutputStream writer = new DataOutputStream(new FileOutputStream(tempFile)); - getState().writeToStream(writer); - writer.close(); - saveFile.delete(); - tempFile.renameTo(saveFile);*/ - System.out.println("Saved successfully!"); + if ( DDSaveHandler.saveAll(dimensionData.values()) ) + { + System.out.println("Saved successfully!"); + } } - /*catch (FileNotFoundException e) + catch (Exception e) { - e.printStackTrace(); + // Wrap the exception in a RuntimeException so functions that call + // PocketManager.save() don't need to catch it. We want MC to + // crash if something really bad happens rather than ignoring it! + throw new RuntimeException(e); } - catch (IOException e) - { - e.printStackTrace(); - }*/ finally { isSaving = false; diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index cebfefb..42cac91 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -33,29 +33,11 @@ import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfigReader; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonType; import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; import StevenDimDoors.mod_pocketDim.util.ConfigurationProcessingException; +import StevenDimDoors.mod_pocketDim.util.FileFilters; import StevenDimDoors.mod_pocketDim.util.WeightedContainer; public class DungeonHelper { - //TODO: File-handling functionality should be spun off to a helper class later - private static class DirectoryFilter implements FileFilter - { - @Override - public boolean accept(File file) - { - return file.isDirectory(); - } - } - - private static class SchematicFileFilter implements FileFilter - { - @Override - public boolean accept(File file) - { - return file.isFile() && file.getName().endsWith(SCHEMATIC_FILE_EXTENSION); - } - } - private static DungeonHelper instance = null; private static DDProperties properties = null; @@ -387,7 +369,7 @@ public class DungeonHelper File[] packFiles; ArrayList packFilePaths; File directory = new File(path); - SchematicFileFilter schematicFileFilter = new SchematicFileFilter(); + FileFilter schematicFileFilter = new FileFilters.FileExtensionFilter(SCHEMATIC_FILE_EXTENSION); //Check that the Ruins pack has been loaded if (RuinsPack == null) @@ -411,7 +393,7 @@ public class DungeonHelper schematics = null; //Release memory //Load the custom dungeon packs - packDirectories = directory.listFiles(new DirectoryFilter()); + packDirectories = directory.listFiles(new FileFilters.DirectoryFilter()); if (packDirectories != null) { //Loop through each directory, which is assumed to be a dungeon pack diff --git a/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java b/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java new file mode 100644 index 0000000..fe63994 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java @@ -0,0 +1,136 @@ +package StevenDimDoors.mod_pocketDim.saving; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import net.minecraftforge.common.DimensionManager; +import StevenDimDoors.mod_pocketDim.util.FileFilters; + +import com.google.common.io.Files; + +public class DDSaveHandler +{ + public static boolean loadAll() + { + // SenseiKiwi: Loading up our save data is not as simple as just reading files. + // To properly restore dimensions, we need to make sure we always load + // a dimension's parent and root before trying to load it. We'll use + // topological sorting to determine the order in which to recreate the + // dimension objects such that we respect those dependencies. + // Links must be loaded after instantiating all the dimensions and must + // be checked against our dimension blacklist. + + // Don't surround this code with try-catch. Our mod should crash if an error + // occurs at this level, since it could lead to some nasty problems. + + String basePath = DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/data/"; + File dataDirectory = new File(basePath); + + // Check if the folder exists. If it doesn't, just return. + if (!dataDirectory.exists()) + { + return true; + } + + // Load the dimension blacklist + // --insert code here-- + + // List any dimension data files and read each dimension + DimDataProcessor reader = new DimDataProcessor(); + List packedDims = new ArrayList(); + FileFilter dataFileFilter = new FileFilters.RegexFileFilter("dim_-?\\d+\\.txt"); + + File[] dataFiles = dataDirectory.listFiles(dataFileFilter); + for (File dataFile : dataFiles) + { + PackedDimData packedDim = readDimension(dataFile, reader); + } + return true; + } + + private static PackedDimData readDimension(File dataFile, DimDataProcessor reader) + { + try + { + return reader.readFromFile(dataFile); + } + catch (Exception e) + { + System.err.println("Could not read dimension data from: " + dataFile.getAbsolutePath()); + System.err.println("The following error occurred:"); + printException(e, false); + return null; + } + } + + public static boolean saveAll(Iterable> dimensions) throws IOException + { + // Create the data directory for our dimensions + // Don't catch exceptions here. If we can't create this folder, + // the mod should crash to let the user know early on. + + String basePath = DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/data/"; + File basePathFile = new File(basePath); + Files.createParentDirs(basePathFile); + basePathFile = null; + basePath += "dim_"; + + boolean succeeded = true; + DimDataProcessor writer = new DimDataProcessor(); + for (IPackable dimension : dimensions) + { + succeeded &= writeDimension(dimension, writer, basePath); + } + return succeeded; + } + + private static boolean writeDimension(IPackable dimension, DimDataProcessor writer, String basePath) + { + try + { + File tempFile = new File(basePath + (dimension.name() + ".tmp")); + File saveFile = new File(basePath + (dimension.name() + ".txt")); + writer.writeToFile(tempFile, dimension.pack()); + saveFile.delete(); + tempFile.renameTo(saveFile); + return true; + } + catch (Exception e) + { + System.err.println("Could not save data for dimension #" + dimension.name() + ". The following error occurred:"); + printException(e, false); + return false; + } + } + + private static void printException(Exception e, boolean verbose) + { + if (e.getCause() == null) + { + if (verbose) + { + e.printStackTrace(); + } + else + { + System.err.println(e.getMessage()); + } + } + else + { + System.out.println(e.getMessage()); + System.err.println("Caused by an underlying error:"); + if (verbose) + { + e.getCause().printStackTrace(); + } + else + { + System.err.println(e.getCause().getMessage()); + } + } + } +} diff --git a/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java b/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java new file mode 100644 index 0000000..6102182 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java @@ -0,0 +1,28 @@ +package StevenDimDoors.mod_pocketDim.saving; + +import java.io.InputStream; +import java.io.OutputStream; + +import StevenDimDoors.mod_pocketDim.util.BaseConfigurationProcessor; +import StevenDimDoors.mod_pocketDim.util.ConfigurationProcessingException; + +public class DimDataProcessor extends BaseConfigurationProcessor +{ + + @Override + public PackedDimData readFromStream(InputStream inputStream) + throws ConfigurationProcessingException + { + // TODO Auto-generated method stub + return null; + } + + @Override + public void writeToStream(OutputStream outputStream, PackedDimData data) + throws ConfigurationProcessingException + { + // TODO Auto-generated method stub + + } + +} diff --git a/StevenDimDoors/mod_pocketDim/saving/IPackable.java b/StevenDimDoors/mod_pocketDim/saving/IPackable.java new file mode 100644 index 0000000..78908d8 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/saving/IPackable.java @@ -0,0 +1,7 @@ +package StevenDimDoors.mod_pocketDim.saving; + +public interface IPackable +{ + public String name(); + public T pack(); +} diff --git a/StevenDimDoors/mod_pocketDim/saving/PackedDimData.java b/StevenDimDoors/mod_pocketDim/saving/PackedDimData.java new file mode 100644 index 0000000..38af8f1 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/saving/PackedDimData.java @@ -0,0 +1,42 @@ +package StevenDimDoors.mod_pocketDim.saving; + +import java.util.List; + +import StevenDimDoors.mod_pocketDim.Point3D; + +public class PackedDimData +{ + // These fields will be public since this is a simple data container + public final int ID; + public final boolean IsDungeon; + public final boolean IsFilled; + public final int Depth; + public final int PackDepth; + public final int ParentID; + public final int RootID; + public final Point3D Origin; + public final int Orientation; + public final List ChildIDs; + public final List Links; + public final List Tails; + + // FIXME Missing dungeon data, not sure how to include it + + public PackedDimData(int id, int depth, int packDepth, int parentID, int rootID, int orientation, + boolean isDungeon, boolean isFilled, Point3D origin, List childIDs, List links, + List tails) + { + ID = id; + Depth = depth; + PackDepth = packDepth; + ParentID = parentID; + RootID = rootID; + Orientation = orientation; + IsDungeon = isDungeon; + IsFilled = isFilled; + Origin = origin; + ChildIDs = childIDs; + Links = links; + Tails = tails; + } +} diff --git a/StevenDimDoors/mod_pocketDim/saving/PackedLinkData.java b/StevenDimDoors/mod_pocketDim/saving/PackedLinkData.java new file mode 100644 index 0000000..f82e74a --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/saving/PackedLinkData.java @@ -0,0 +1,6 @@ +package StevenDimDoors.mod_pocketDim.saving; + +public class PackedLinkData +{ + +} diff --git a/StevenDimDoors/mod_pocketDim/saving/PackedLinkTail.java b/StevenDimDoors/mod_pocketDim/saving/PackedLinkTail.java new file mode 100644 index 0000000..c5a1bb7 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/saving/PackedLinkTail.java @@ -0,0 +1,6 @@ +package StevenDimDoors.mod_pocketDim.saving; + +public class PackedLinkTail +{ + +} diff --git a/StevenDimDoors/mod_pocketDim/util/FileFilters.java b/StevenDimDoors/mod_pocketDim/util/FileFilters.java new file mode 100644 index 0000000..efd4e3b --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/util/FileFilters.java @@ -0,0 +1,51 @@ +package StevenDimDoors.mod_pocketDim.util; + +import java.io.File; +import java.io.FileFilter; +import java.util.regex.Pattern; + +public class FileFilters +{ + private FileFilters() { } + + public static class DirectoryFilter implements FileFilter + { + @Override + public boolean accept(File file) + { + return file.isDirectory(); + } + } + + public static class FileExtensionFilter implements FileFilter + { + private final String extension; + + public FileExtensionFilter(String extension) + { + this.extension = extension; + } + + @Override + public boolean accept(File file) + { + return file.isFile() && file.getName().endsWith(extension); + } + } + + public static class RegexFileFilter implements FileFilter + { + private final Pattern pattern; + + public RegexFileFilter(String expression) + { + this.pattern = Pattern.compile(expression); + } + + @Override + public boolean accept(File file) + { + return file.isFile() && pattern.matcher(file.getName()).matches(); + } + } +} -- 2.39.5 From b5973f58eb8ec7b94dba33717231c2b008cf1430 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 11 Sep 2013 22:18:24 -0400 Subject: [PATCH 113/544] Deletes IItemDimDoor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Doesn't seem like we need it... and it's in the wrong package. Respect the packages! õ_Õ --- StevenDimDoors/mod_pocketDim/commands/IItemDimDoor.java | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 StevenDimDoors/mod_pocketDim/commands/IItemDimDoor.java diff --git a/StevenDimDoors/mod_pocketDim/commands/IItemDimDoor.java b/StevenDimDoors/mod_pocketDim/commands/IItemDimDoor.java deleted file mode 100644 index 472bc9c..0000000 --- a/StevenDimDoors/mod_pocketDim/commands/IItemDimDoor.java +++ /dev/null @@ -1,5 +0,0 @@ -package StevenDimDoors.mod_pocketDim.commands; - -public interface IItemDimDoor { - -} -- 2.39.5 From f47a9d8b99b96453d3644deabadf2e94fe34c261 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 30 Sep 2013 00:21:52 -0400 Subject: [PATCH 114/544] Added orientation to linkdata and door regen --- .../blocks/BlockGoldDimDoor.java | 2 +- .../mod_pocketDim/blocks/DimensionalDoor.java | 2 +- .../mod_pocketDim/blocks/TransientDoor.java | 2 +- .../mod_pocketDim/blocks/UnstableDoor.java | 2 +- .../mod_pocketDim/blocks/WarpDoor.java | 2 +- .../mod_pocketDim/core/DDTeleporter.java | 41 ++++++++++++- .../mod_pocketDim/core/DimLink.java | 17 ++++-- .../mod_pocketDim/core/LinkTail.java | 1 + .../mod_pocketDim/core/NewDimData.java | 21 ++++--- .../dungeon/DungeonSchematic.java | 19 +++--- .../mod_pocketDim/helpers/DungeonHelper.java | 2 +- .../mod_pocketDim/items/ItemRiftBlade.java | 9 ++- .../items/ItemRiftSignature.java | 57 +++++++++++++++--- .../items/ItemStabilizedRiftSignature.java | 12 ++-- .../mod_pocketDim/mod_pocketDim.java | 2 +- .../tileentities/TileEntityDimDoor.java | 6 +- resources/mods/DimDoors/sfx/monk.ogg | Bin 361575 -> 138267 bytes resources/mods/DimDoors/sfx/monkLarge.ogg | Bin 0 -> 361575 bytes 18 files changed, 148 insertions(+), 49 deletions(-) create mode 100644 resources/mods/DimDoors/sfx/monkLarge.ogg diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java index 38b9fc7..9089d0e 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java @@ -30,7 +30,7 @@ public class BlockGoldDimDoor extends BaseDimDoor implements IDimDoor DimLink link = dimension.getLink(x, y, z); if (link == null) { - dimension.createLink(x, y, z, LinkTypes.POCKET); + dimension.createLink(x, y, z, LinkTypes.POCKET,world.getBlockMetadata(x, y - 1, z)); } } diff --git a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java index eea7b05..4722543 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java @@ -26,7 +26,7 @@ public class DimensionalDoor extends BaseDimDoor DimLink link = dimension.getLink(x, y, z); if (link == null) { - dimension.createLink(x, y, z, LinkTypes.POCKET); + dimension.createLink(x, y, z, LinkTypes.POCKET,world.getBlockMetadata(x, y - 1, z)); } } diff --git a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java index 174631b..1a1232b 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java @@ -71,7 +71,7 @@ public class TransientDoor extends BaseDimDoor DimLink link = dimension.getLink(x, y, z); if (link == null && dimension.isPocketDimension()) { - dimension.createLink(x, y, z, LinkTypes.SAFE_EXIT); + dimension.createLink(x, y, z, LinkTypes.SAFE_EXIT,world.getBlockMetadata(x, y - 1, z)); } } } diff --git a/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java index 8bcf00e..cf2b699 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java @@ -21,7 +21,7 @@ public class UnstableDoor extends BaseDimDoor if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) { NewDimData dimension = PocketManager.getDimensionData(world); - dimension.createLink(x, y, z, LinkTypes.RANDOM); + dimension.createLink(x, y, z, LinkTypes.RANDOM,world.getBlockMetadata(x, y - 1, z)); } } @Override diff --git a/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java index ef75d8b..f8861a5 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java @@ -25,7 +25,7 @@ public class WarpDoor extends BaseDimDoor DimLink link = dimension.getLink(x, y, z); if (link == null && dimension.isPocketDimension()) { - dimension.createLink(x, y, z, LinkTypes.SAFE_EXIT); + dimension.createLink(x, y, z, LinkTypes.SAFE_EXIT,world.getBlockMetadata(x, y - 1, z)); } } } diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 09bcebc..03703de 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -15,6 +15,7 @@ import net.minecraft.network.packet.Packet41EntityEffect; import net.minecraft.network.packet.Packet43Experience; import net.minecraft.network.packet.Packet9Respawn; import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.WorldServer; @@ -22,11 +23,13 @@ import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.BlockRift; import StevenDimDoors.mod_pocketDim.blocks.IDimDoor; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; +import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.world.PocketBuilder; import cpw.mods.fml.common.registry.GameRegistry; @@ -447,7 +450,6 @@ public class DDTeleporter { return; } - if (link.linkType() == LinkTypes.RANDOM) { Point4D randomDestination = getRandomDestination(); @@ -459,6 +461,7 @@ public class DDTeleporter } else { + buildExitDoor(door, link, DDProperties.instance()); entity = teleportEntity(entity, link.destination(), link.linkType() != LinkTypes.UNSAFE_EXIT); entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); } @@ -563,6 +566,38 @@ public class DDTeleporter return false; } + private static void buildExitDoor(Block door,DimLink link, DDProperties prop) + { + World startWorld = PocketManager.loadDimension(link.source().getDimension()); + World destWorld = PocketManager.loadDimension(link.destination().getDimension()); + TileEntity doorTE = startWorld.getBlockTileEntity(link.source().getX(), link.source().getY(), link.source.getZ()); + if(doorTE instanceof TileEntityDimDoor) + { + if((TileEntityDimDoor.class.cast(doorTE).hasGennedPair)) + { + return; + } + TileEntityDimDoor.class.cast(doorTE).hasGennedPair=true; + Block blockToReplace = Block.blocksList[destWorld.getBlockId(link.destination().getX(), link.destination().getY(), link.destination().getZ())]; + + if(!destWorld.isAirBlock(link.destination().getX(), link.destination().getY(), link.destination().getZ())) + { + if(!blockToReplace.isBlockReplaceable(destWorld, link.destination().getX(), link.destination().getY(), link.destination().getZ())) + { + return; + } + } + + BaseItemDoor.placeDoorBlock(destWorld, link.destination().getX(), link.destination().getY()-1, link.destination().getZ(),link.getDestinationOrientation(), door); + TileEntity doorDestTE = startWorld.getBlockTileEntity(link.destination().getX(), link.destination().getY(), link.destination().getZ()); + + if(doorDestTE instanceof TileEntityDimDoor) + { + TileEntityDimDoor.class.cast(doorDestTE).hasGennedPair=true; + + } + } + } private static boolean generateSafeExit(DimLink link, DDProperties properties) { NewDimData current = PocketManager.getDimensionData(link.source.getDimension()); @@ -647,12 +682,12 @@ public class DDTeleporter } // Create a reverse link for returning + int orientation = getDestinationOrientation(source, properties); NewDimData sourceDim = PocketManager.getDimensionData(link.source().getDimension()); - DimLink reverse = destinationDim.createLink(x, y + 2, z, LinkTypes.REVERSE); + DimLink reverse = destinationDim.createLink(x, y + 2, z, LinkTypes.REVERSE,orientation); sourceDim.setDestination(reverse, source.getX(), source.getY(), source.getZ()); // Set up the warp door at the destination - int orientation = getDestinationOrientation(source, properties); orientation = BlockRotator.transformMetadata(orientation, 2, properties.WarpDoorID); ItemDimensionalDoor.placeDoorBlock(world, x, y + 1, z, orientation, mod_pocketDim.warpDoor); diff --git a/StevenDimDoors/mod_pocketDim/core/DimLink.java b/StevenDimDoors/mod_pocketDim/core/DimLink.java index cdf25a6..10cba75 100644 --- a/StevenDimDoors/mod_pocketDim/core/DimLink.java +++ b/StevenDimDoors/mod_pocketDim/core/DimLink.java @@ -10,10 +10,12 @@ public abstract class DimLink protected Point4D source; protected DimLink parent; protected LinkTail tail; + protected int orientation; protected List children; - protected DimLink(Point4D source, DimLink parent) + protected DimLink(Point4D source, DimLink parent, int orientation) { + this.orientation=orientation; this.parent = parent; this.source = source; this.tail = parent.tail; @@ -21,13 +23,13 @@ public abstract class DimLink parent.children.add(this); } - protected DimLink(Point4D source, int linkType) + protected DimLink(Point4D source, int linkType, int orientation) { if (linkType < LinkTypes.ENUM_MIN || linkType > LinkTypes.ENUM_MAX && linkType != LinkTypes.CLIENT_SIDE) { throw new IllegalArgumentException("The specified link type is invalid."); } - + this.orientation = orientation; this.parent = null; this.source = source; this.tail = new LinkTail(linkType, null); @@ -43,7 +45,10 @@ public abstract class DimLink { return tail.getDestination(); } - + public int getDestinationOrientation() + { + return PocketManager.getLink(source.getX(), source.getY(), source.getZ(), source.getDimension()).orientation(); + } public boolean hasDestination() { return (tail.getDestination() != null); @@ -68,6 +73,10 @@ public abstract class DimLink { return tail.getLinkType(); } + public int orientation() + { + return orientation; + } public String toString() { diff --git a/StevenDimDoors/mod_pocketDim/core/LinkTail.java b/StevenDimDoors/mod_pocketDim/core/LinkTail.java index 5513600..887f97e 100644 --- a/StevenDimDoors/mod_pocketDim/core/LinkTail.java +++ b/StevenDimDoors/mod_pocketDim/core/LinkTail.java @@ -28,4 +28,5 @@ class LinkTail public void setLinkType(int linkType) { this.linkType = linkType; } + } diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index a480333..c0c272a 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -17,14 +17,14 @@ public abstract class NewDimData { private static class InnerDimLink extends DimLink { - public InnerDimLink(Point4D source, DimLink parent) + public InnerDimLink(Point4D source, DimLink parent,int orientation) { - super(source, parent); + super(source, parent,orientation); } - public InnerDimLink(Point4D source, int linkType) + public InnerDimLink(Point4D source, int linkType, int orientation) { - super(source, linkType); + super(source, linkType,orientation); } public void setDestination(int x, int y, int z, NewDimData dimension) @@ -236,19 +236,22 @@ public abstract class NewDimData { return Math.abs(i) + Math.abs(j) + Math.abs(k); } - public DimLink createLink(int x, int y, int z, int linkType) { - return createLink(new Point4D(x, y, z, id), linkType); + return createLink(new Point4D(x, y, z, id), linkType,-1); + } + public DimLink createLink(int x, int y, int z, int linkType,int orientation) + { + return createLink(new Point4D(x, y, z, id), linkType,orientation); } - private DimLink createLink(Point4D source, int linkType) + private DimLink createLink(Point4D source, int linkType,int orientation) { //Return an existing link if there is one to avoid creating multiple links starting at the same point. InnerDimLink link = linkMapping.get(source); if (link == null) { - link = new InnerDimLink(source, linkType); + link = new InnerDimLink(source, linkType,orientation); linkMapping.put(source, link); linkList.add(link); } @@ -279,7 +282,7 @@ public abstract class NewDimData InnerDimLink link = linkMapping.get(source); if (link == null) { - link = new InnerDimLink(source, parent); + link = new InnerDimLink(source, parent, parent.orientation); linkMapping.put(source, link); linkList.add(link); diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 1d2664b..053008f 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -238,12 +238,12 @@ public class DungeonSchematic extends Schematic { filler.apply(world, minCorner, maxCorner); //Set up entrance door rift - createEntranceReverseLink(dimension, pocketCenter, entryLink); + createEntranceReverseLink(dimension, pocketCenter, entryLink, world); //Set up link data for dimensional doors for (Point3D location : dimensionalDoorLocations) { - createDimensionalDoorLink(dimension, location, entranceDoorLocation, turnAngle, pocketCenter); + createDimensionalDoorLink(dimension, location, entranceDoorLocation, turnAngle, pocketCenter,world); } //Set up link data for exit door @@ -285,9 +285,10 @@ public class DungeonSchematic extends Schematic { } } - private static void createEntranceReverseLink(NewDimData dimension, Point3D pocketCenter, DimLink entryLink) + private static void createEntranceReverseLink(NewDimData dimension, Point3D pocketCenter, DimLink entryLink,World world) { - DimLink reverseLink = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ(), LinkTypes.REVERSE); + int orientation = world.getBlockMetadata(pocketCenter.getX(), pocketCenter.getY()-1, pocketCenter.getZ()); + DimLink reverseLink = dimension.createLink(pocketCenter.getX(), pocketCenter.getY(), pocketCenter.getZ(), LinkTypes.REVERSE,orientation); Point4D destination = entryLink.source(); NewDimData prevDim = PocketManager.getDimensionData(destination.getDimension()); prevDim.setDestination(reverseLink, destination.getX(), destination.getY(), destination.getZ()); @@ -295,10 +296,12 @@ public class DungeonSchematic extends Schematic { private static void createExitDoorLink(World world, NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) { + //Transform the door's location to the pocket coordinate system Point3D location = point.clone(); BlockRotator.transformPoint(location, entrance, rotation, pocketCenter); - dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkTypes.DUNGEON_EXIT); + int orientation = world.getBlockMetadata(location.getX(), location.getY()-1, location.getZ()); + dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkTypes.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; @@ -311,12 +314,14 @@ public class DungeonSchematic extends Schematic { } } - private static void createDimensionalDoorLink(NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) + private static void createDimensionalDoorLink(NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter,World world) { //Transform the door's location to the pocket coordinate system Point3D location = point.clone(); BlockRotator.transformPoint(location, entrance, rotation, pocketCenter); - dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkTypes.DUNGEON); + int orientation = world.getBlockMetadata(location.getX(), location.getY()-1, location.getZ()); + + dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkTypes.DUNGEON,orientation); } private static void spawnMonolith(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter, boolean canSpawn) diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index cebfefb..78963fc 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -279,7 +279,7 @@ public class DungeonHelper { //Create a link above the specified position. Link to a new pocket dimension. NewDimData dimension = PocketManager.getDimensionData(world); - DimLink link = dimension.createLink(x, y + 1, z, LinkTypes.POCKET); + DimLink link = dimension.createLink(x, y + 1, z, LinkTypes.POCKET,3); //Place a Warp Door linked to that pocket ItemDimensionalDoor.placeDoorBlock(world, x, y, z, 3, mod_pocketDim.warpDoor); diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index 857a7d8..b51950c 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -114,10 +114,9 @@ public class ItemRiftBlade extends ItemSword var2.zCoord*=cooef; double var5 = holder.posX - var2.xCoord; double var9 = holder.posZ - var2.zCoord; - double var7 =holder.worldObj.getHeightValue(MathHelper.floor_double(var5), MathHelper.floor_double(var9)); - if((Math.abs((holder.posY - var2.yCoord)-var7)>2)) - { - var7 = MathHelper.floor_double(holder.posY - var2.yCoord) ; + + + double var7 = MathHelper.floor_double(holder.posY - var2.yCoord) ; int var14 = MathHelper.floor_double(var5); int var15 = MathHelper.floor_double(var7); @@ -127,7 +126,7 @@ public class ItemRiftBlade extends ItemSword var15++; } var7=var15; - } + holder.setPositionAndUpdate(var5, var7, var9); holder.playSound("mob.endermen.portal", 1.0F, 1.0F); diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java index aae42db..aef4919 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -66,14 +67,15 @@ public class ItemRiftSignature extends Item return true; } - Point4D source = getSource(stack); + Point4DOrientation source = getSource(stack); + int orientation = MathHelper.floor_double((double) ((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; if (source != null) { //The link was used before and already has an endpoint stored. Create links connecting the two endpoints. NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension()); NewDimData destinationDimension = PocketManager.getDimensionData(world); - DimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.NORMAL); - DimLink reverse = destinationDimension.createLink(x, y, z, LinkTypes.NORMAL); + DimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.NORMAL,source.getOrientation()); + DimLink reverse = destinationDimension.createLink(x, y, z, LinkTypes.NORMAL,orientation); destinationDimension.setDestination(link, x, y, z); sourceDimension.setDestination(reverse, source.getX(), source.getY(), source.getZ()); @@ -102,7 +104,7 @@ public class ItemRiftSignature extends Item else { //The link signature has not been used. Store its current target as the first location. - setSource(stack, x, y, z, PocketManager.getDimensionData(world)); + setSource(stack, x, y, z,orientation, PocketManager.getDimensionData(world)); player.sendChatToPlayer("Location Stored in Rift Signature"); world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftStart", 0.6f, 1); } @@ -116,7 +118,7 @@ public class ItemRiftSignature extends Item @SideOnly(Side.CLIENT) public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - Point4D source = getSource(par1ItemStack); + Point4DOrientation source = getSource(par1ItemStack); if (source != null) { par3List.add("Leads to (" + source.getX() + ", " + source.getY() + ", " + source.getZ() + ") at dimension #" + source.getDimension()); @@ -129,13 +131,14 @@ public class ItemRiftSignature extends Item } } - public static void setSource(ItemStack itemStack, int x, int y, int z, NewDimData dimension) + public static void setSource(ItemStack itemStack, int x, int y, int z, int orientation, NewDimData dimension) { NBTTagCompound tag = new NBTTagCompound(); tag.setInteger("linkX", x); tag.setInteger("linkY", y); tag.setInteger("linkZ", z); + tag.setInteger("orientation", orientation); tag.setInteger("linkDimID", dimension.id()); itemStack.setTagCompound(tag); @@ -149,11 +152,12 @@ public class ItemRiftSignature extends Item tag.removeTag("linkX"); tag.removeTag("linkY"); tag.removeTag("linkZ"); + tag.removeTag("orientation"); tag.removeTag("linkDimID"); itemStack.setItemDamage(0); } - public static Point4D getSource(ItemStack itemStack) + public static Point4DOrientation getSource(ItemStack itemStack) { if (itemStack.getItemDamage() != 0) { @@ -164,15 +168,52 @@ public class ItemRiftSignature extends Item Integer x = tag.getInteger("linkX"); Integer y = tag.getInteger("linkY"); Integer z = tag.getInteger("linkZ"); + Integer orientation = tag.getInteger("orientation"); Integer dimID = tag.getInteger("linkDimID"); if (x != null && y != null && z != null && dimID != null) { - return new Point4D(x, y, z, dimID); + return new Point4DOrientation(x, y, z,orientation, dimID); } } itemStack.setItemDamage(0); } return null; } + + static class Point4DOrientation + { + private Point4D point; + private int orientation; + Point4DOrientation(int x, int y, int z, int orientation, int dimID) + { + this.point= new Point4D(x,y,z,dimID); + this.orientation=orientation; + } + + int getX() + { + return point.getX(); + } + + int getY() + { + return point.getY(); + } + + int getZ() + { + return point.getZ(); + } + + int getDimension() + { + return point.getDimension(); + } + int getOrientation() + { + return orientation; + } + } } + diff --git a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java index 0e37b6b..a58cfff 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java @@ -6,6 +6,7 @@ import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -46,7 +47,8 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature } // Check if the Stabilized Rift Signature has been initialized - Point4D source = getSource(stack); + Point4DOrientation source = getSource(stack); + int orientation = MathHelper.floor_double((double) ((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; if (source != null) { // Yes, it's initialized. Check if the player is in creative @@ -60,8 +62,8 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature //The link was used before and already has an endpoint stored. Create links connecting the two endpoints. NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension()); NewDimData destinationDimension = PocketManager.getDimensionData(world); - DimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.NORMAL); - DimLink reverse = destinationDimension.createLink(x, y, z, LinkTypes.NORMAL); + DimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.NORMAL,source.getOrientation()); + DimLink reverse = destinationDimension.createLink(x, y, z, LinkTypes.NORMAL,orientation); destinationDimension.setDestination(link, x, y, z); sourceDimension.setDestination(reverse, source.getX(), source.getY(), source.getZ()); @@ -89,7 +91,7 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature else { //The link signature has not been used. Store its current target as the first location. - setSource(stack, x, y, z, PocketManager.getDimensionData(world)); + setSource(stack, x, y, z, orientation, PocketManager.getDimensionData(world)); player.sendChatToPlayer("Location Stored in Rift Signature"); world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftStart", 0.6f, 1); } @@ -104,7 +106,7 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - Point4D source = getSource(par1ItemStack); + Point4DOrientation source = getSource(par1ItemStack); if (source != null) { par3List.add("Leads to (" + source.getX() + ", " + source.getY() + ", " + source.getZ() + ") at dimension #" + source.getDimension()); diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index c43d73d..c8802e6 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -174,7 +174,7 @@ public class mod_pocketDim transientDoor = new TransientDoor(properties.TransientDoorID, Material.iron, properties).setHardness(1.0F) .setUnlocalizedName("transientDoor"); goldDimDoor = new BlockGoldDimDoor(properties.GoldDimDoorID, Material.iron, properties).setHardness(1.0F) .setUnlocalizedName("dimDoorGold"); - goldDoor = new BlockDoorGold(properties.GoldDoorID, Material.iron, properties).setLightValue(1.0F).setHardness(0.1F).setUnlocalizedName("doorGold"); + goldDoor = new BlockDoorGold(properties.GoldDoorID, Material.iron, properties).setHardness(0.1F).setUnlocalizedName("doorGold"); blockDimWall = new BlockDimWall(properties.FabricBlockID, 0, Material.iron).setLightValue(1.0F).setHardness(0.1F).setUnlocalizedName("blockDimWall"); blockDimWallPerm = (new BlockDimWallPerm(properties.PermaFabricBlockID, 0, Material.iron)).setLightValue(1.0F).setBlockUnbreakable().setResistance(6000000.0F).setUnlocalizedName("blockDimWallPerm"); warpDoor = new WarpDoor(properties.WarpDoorID, Material.wood, properties).setHardness(1.0F) .setUnlocalizedName("dimDoorWarp"); diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java index 240782f..eb43d24 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java @@ -13,6 +13,7 @@ public class TileEntityDimDoor extends TileEntity public int orientation; public boolean hasExit; public boolean isDungeonChainLink; + public boolean hasGennedPair=false; @@ -45,6 +46,8 @@ public class TileEntityDimDoor extends TileEntity this.isDungeonChainLink = nbt.getBoolean("isDungeonChainLink"); + this.hasGennedPair = nbt.getBoolean("hasGennedPair"); + @@ -69,6 +72,7 @@ public class TileEntityDimDoor extends TileEntity nbt.setBoolean("isDungeonChainLink", isDungeonChainLink); - + nbt.setBoolean("hasGennedPair", hasGennedPair); + } } diff --git a/resources/mods/DimDoors/sfx/monk.ogg b/resources/mods/DimDoors/sfx/monk.ogg index 73e69b47c63ff9c64211b96fa33752c53db39a09..a725f5f2745f8748a541da8cf3074b31c5446088 100644 GIT binary patch literal 138267 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%0A@vkoi7GX~~ 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�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 literal 361575 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�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 z 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 x@Pf=y4ET?B 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 z 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 diff --git a/resources/mods/DimDoors/sfx/monkLarge.ogg b/resources/mods/DimDoors/sfx/monkLarge.ogg new file mode 100644 index 0000000000000000000000000000000000000000..73e69b47c63ff9c64211b96fa33752c53db39a09 GIT binary patch literal 361575 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�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 z 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 x@Pf=y4ET?B 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 z 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 literal 0 HcmV?d00001 -- 2.39.5 From 2203239c816603a73fa4ba7e4144df4c42a59841 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 30 Sep 2013 00:41:12 -0400 Subject: [PATCH 115/544] Merging changes --- .../mod_pocketDim/EventHookContainer.java | 2 +- .../mod_pocketDim/blocks/BlockDimWall.java | 26 ++-- .../mod_pocketDim/commands/IItemDimDoor.java | 5 - .../mod_pocketDim/core/DDTeleporter.java | 11 +- .../mod_pocketDim/core/DimLink.java | 9 ++ .../mod_pocketDim/core/NewDimData.java | 38 ++--- .../mod_pocketDim/core/PocketManager.java | 144 +++++++++++------- .../helpers/ChunkLoaderHelper.java | 4 +- .../mod_pocketDim/helpers/DungeonHelper.java | 24 +-- .../mod_pocketDim/helpers/yCoordHelper.java | 65 ++++---- .../mod_pocketDim/saving/DDSaveHandler.java | 136 +++++++++++++++++ .../saving/DimDataProcessor.java | 28 ++++ .../mod_pocketDim/saving/IPackable.java | 7 + .../mod_pocketDim/saving/PackedDimData.java | 42 +++++ .../mod_pocketDim/saving/PackedLinkData.java | 6 + .../mod_pocketDim/saving/PackedLinkTail.java | 6 + .../mod_pocketDim/util/FileFilters.java | 51 +++++++ 17 files changed, 446 insertions(+), 158 deletions(-) delete mode 100644 StevenDimDoors/mod_pocketDim/commands/IItemDimDoor.java create mode 100644 StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java create mode 100644 StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java create mode 100644 StevenDimDoors/mod_pocketDim/saving/IPackable.java create mode 100644 StevenDimDoors/mod_pocketDim/saving/PackedDimData.java create mode 100644 StevenDimDoors/mod_pocketDim/saving/PackedLinkData.java create mode 100644 StevenDimDoors/mod_pocketDim/saving/PackedLinkTail.java create mode 100644 StevenDimDoors/mod_pocketDim/util/FileFilters.java diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index aeaa0d3..6191018 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -89,7 +89,7 @@ public class EventHookContainer } @ForgeSubscribe - public void onWorldsave(WorldEvent.Save event) + public void onWorldSave(WorldEvent.Save event) { if (event.world.provider.dimensionId == 0) { diff --git a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWall.java b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWall.java index 73e6808..6144d4d 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BlockDimWall.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BlockDimWall.java @@ -3,11 +3,6 @@ package StevenDimDoors.mod_pocketDim.blocks; import java.util.List; import java.util.Random; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -import StevenDimDoors.mod_pocketDim.mod_pocketDim; - import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -20,6 +15,9 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class BlockDimWall extends Block { @@ -69,14 +67,7 @@ public class BlockDimWall extends Block @Override public Icon getIcon(int par1, int par2) { - if (par2 == 1) - { - return blockIcon[par2]; - } - else - { - return blockIcon[0]; - } + return (par2 != 1) ? blockIcon[0] : blockIcon[1]; } @Override @@ -119,8 +110,13 @@ public class BlockDimWall extends Block if (playerEquip instanceof ItemBlock) { - Block block = Block.blocksList[playerEquip.itemID]; - if (!Block.isNormalCube(playerEquip.itemID) || block instanceof BlockContainer || block.blockID == this.blockID) + // SenseiKiwi: Using getBlockID() rather than the raw itemID is critical. + // Some mods may override that function and use item IDs outside the range + // of the block list. + + int blockID = ((ItemBlock) playerEquip).getBlockID(); + Block block = Block.blocksList[blockID]; + if (!Block.isNormalCube(blockID) || block instanceof BlockContainer || blockID == this.blockID) { return false; } diff --git a/StevenDimDoors/mod_pocketDim/commands/IItemDimDoor.java b/StevenDimDoors/mod_pocketDim/commands/IItemDimDoor.java deleted file mode 100644 index 472bc9c..0000000 --- a/StevenDimDoors/mod_pocketDim/commands/IItemDimDoor.java +++ /dev/null @@ -1,5 +0,0 @@ -package StevenDimDoors.mod_pocketDim.commands; - -public interface IItemDimDoor { - -} diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 03703de..7ae67d4 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -174,7 +174,7 @@ public class DDTeleporter player.setPositionAndUpdate(x + 0.5, y - 1, z + 1.5); break; default: - player.setPositionAndUpdate(x, y - 1, z); + player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5); break; } } @@ -207,7 +207,8 @@ public class DDTeleporter entity.worldObj.updateEntityWithOptionalForce(entity, false); break; default: - DDTeleporter.setEntityPosition(entity, x, y, z); + DDTeleporter.setEntityPosition(entity, x + 0.5, y, z + 0.5); + entity.worldObj.updateEntityWithOptionalForce(entity, false); break; } } @@ -228,7 +229,7 @@ public class DDTeleporter setEntityPosition(entity, x + 0.5, y, z + 1.5); break; default: - setEntityPosition(entity, x, y, z); + setEntityPosition(entity, x + 0.5, y, z + 0.5); break; } } @@ -556,10 +557,10 @@ public class DDTeleporter return false; } - Point3D destination = yCoordHelper.findDropPoint(world, source.getX(), source.getY(), source.getZ()); + Point3D destination = yCoordHelper.findDropPoint(world, source.getX(), source.getY() + 1, source.getZ()); if (destination != null) { - current.root().setDestination(link, source.getX(), source.getY(), source.getZ()); + current.root().setDestination(link, destination.getX(), destination.getY(), destination.getZ()); return true; } } diff --git a/StevenDimDoors/mod_pocketDim/core/DimLink.java b/StevenDimDoors/mod_pocketDim/core/DimLink.java index 10cba75..c3800c3 100644 --- a/StevenDimDoors/mod_pocketDim/core/DimLink.java +++ b/StevenDimDoors/mod_pocketDim/core/DimLink.java @@ -15,7 +15,16 @@ public abstract class DimLink protected DimLink(Point4D source, DimLink parent, int orientation) { +<<<<<<< HEAD this.orientation=orientation; +======= + if (parent.source.getDimension() != source.getDimension()) + { + // Ban having children in other dimensions to avoid serialization issues with cross-dimensional tails + throw new IllegalArgumentException("source and parent.source must have the same dimension."); + } + +>>>>>>> 25446453cba6f491cc0745803f448dd000d453cc this.parent = parent; this.source = source; this.tail = parent.tail; diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index c0c272a..05ab685 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -57,13 +57,17 @@ public abstract class NewDimData if (nextParent == null) { throw new IllegalArgumentException("nextParent cannot be null."); - } - + } if (this == nextParent) { //Ignore this request silently return false; } + if (nextParent.source.getDimension() != source.getDimension()) + { + // Ban having children in other dimensions to avoid serialization issues with cross-dimensional tails + throw new IllegalArgumentException("source and parent.source must have the same dimension."); + } //Release children for (DimLink child : children) @@ -106,22 +110,22 @@ public abstract class NewDimData } } - private static Random random = new Random(); + protected static Random random = new Random(); - private final int id; - private final Map linkMapping; - private final List linkList; - private final boolean isDungeon; - private boolean isFilled; - private final int depth; - private int packDepth; - private final NewDimData parent; - private final NewDimData root; - private final List children; - private Point4D origin; - private int orientation; - private DungeonData dungeon; - private final IUpdateWatcher linkWatcher; + protected int id; + protected Map linkMapping; + protected List linkList; + protected boolean isDungeon; + protected boolean isFilled; + protected int depth; + protected int packDepth; + protected NewDimData parent; + protected NewDimData root; + protected List children; + protected Point4D origin; + protected int orientation; + protected DungeonData dungeon; + protected IUpdateWatcher linkWatcher; protected NewDimData(int id, NewDimData parent, boolean isPocket, boolean isDungeon, IUpdateWatcher linkWatcher) diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index eda8947..3c992fc 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -13,6 +13,9 @@ import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.helpers.Compactor; import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; +import StevenDimDoors.mod_pocketDim.saving.DDSaveHandler; +import StevenDimDoors.mod_pocketDim.saving.IPackable; +import StevenDimDoors.mod_pocketDim.saving.PackedDimData; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; import StevenDimDoors.mod_pocketDim.watcher.IUpdateSource; @@ -25,7 +28,7 @@ import StevenDimDoors.mod_pocketDim.watcher.UpdateWatcherProxy; */ public class PocketManager { - private static class InnerDimData extends NewDimData + private static class InnerDimData extends NewDimData implements IPackable { // This class allows us to instantiate NewDimData indirectly without exposing // a public constructor from NewDimData. It's meant to stop us from constructing @@ -43,6 +46,49 @@ public class PocketManager // This constructor is meant for client-side code only super(id, root); } + + public void clear() + { + // If this dimension has a parent, remove it from its parent's list of children + if (parent != null) + { + parent.children.remove(this); + } + // Remove this dimension as the parent of its children + for (NewDimData child : children) + { + child.parent = null; + } + // Clear all fields + id = Integer.MIN_VALUE; + linkMapping.clear(); + linkMapping = null; + linkList.clear(); + linkList = null; + children.clear(); + children = null; + isDungeon = false; + isFilled = false; + depth = Integer.MIN_VALUE; + packDepth = Integer.MIN_VALUE; + origin = null; + orientation = Integer.MIN_VALUE; + dungeon = null; + linkWatcher = null; + } + + @Override + public String name() + { + return String.valueOf(id); + } + + @Override + public PackedDimData pack() + { + // FIXME: IMPLEMENTATION PLZTHX + return null; + } } private static class ClientLinkWatcher implements IUpdateWatcher @@ -140,44 +186,44 @@ public class PocketManager isLoading = false; } - public boolean clearPocket(NewDimData dimension) + public boolean resetDungeon(NewDimData target) { - if (!dimension.isPocketDimension() || DimensionManager.getWorld(dimension.id()) != null) + // 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) { - return false; + File saveDirectory = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); + if (DeleteFolder.deleteFolder(saveDirectory)) + { + dimension.setFilled(false); + return true; + } } - - File save = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); - DeleteFolder.deleteFolder(save); - dimension.setFilled(false); - //FIXME: Reset door information? - return true; + return false; } - public static boolean deletePocket(NewDimData dimension, boolean deleteFolder) + public static boolean deletePocket(NewDimData target, boolean deleteFolder) { - //FIXME: Shouldn't the links in and out of this dimension be altered somehow? Otherwise we have links pointing - //into a deleted dimension! - - //Checks to see if the pocket is loaded or isn't actually a pocket. + // We can't delete the dimension if it's currently loaded or if it's not actually a pocket. + // 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.isPocketDimension() && DimensionManager.getWorld(dimension.id()) == null) { - dimensionData.remove(dimension.id()); - DimensionManager.unregisterDimension(dimension.id()); if (deleteFolder) { - File save = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); - DeleteFolder.deleteFolder(save); + File saveDirectory = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); + DeleteFolder.deleteFolder(saveDirectory); } - //Raise the dim deleted event + dimensionData.remove(dimension.id()); + // Raise the dim deleted event dimWatcher.onDeleted(new ClientDimData(dimension)); - //dimension.implode()??? -- more like delete, but yeah + dimension.clear(); return true; } - else - { - return false; - } + return false; } private static void registerPockets(DDProperties properties) @@ -222,32 +268,29 @@ public class PocketManager * loads the dim data from the saved hashMap. Also handles compatibility with old saves, see OldSaveHandler */ private static void loadInternal() - { - // SenseiKiwi: This is a temporary function for testing purposes. - // We'll move on to using a text-based format in the future. - + { if (!DimensionManager.getWorld(OVERWORLD_DIMENSION_ID).isRemote && DimensionManager.getCurrentSaveRootDirectory() != null) { - System.out.println("Loading Dimensional Doors save data..."); - /*File saveFile = new File(DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.dat"); + // Load and register blacklisted dimension IDs - setState(saveData);*/ - System.out.println("Loaded successfully!"); + // Load save data + System.out.println("Loading Dimensional Doors save data..."); + if (DDSaveHandler.loadAll()) + { + System.out.println("Loaded successfully!"); + } } } public static void save() { - // SenseiKiwi: This is a temporary function for testing purposes. - // We'll move on to using a text-based format in the future. - if (!isLoaded) { return; } World world = DimensionManager.getWorld(OVERWORLD_DIMENSION_ID); - if (world == null || world.isRemote || DimensionManager.getCurrentSaveRootDirectory() != null) + if (world == null || world.isRemote || DimensionManager.getCurrentSaveRootDirectory() == null) { return; } @@ -256,30 +299,23 @@ public class PocketManager { return; } - isSaving = true; + try { System.out.println("Writing Dimensional Doors save data..."); - /*String tempPath = DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.tmp"; - String savePath = DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.dat"; - File tempFile = new File(tempPath); - File saveFile = new File(savePath); - DataOutputStream writer = new DataOutputStream(new FileOutputStream(tempFile)); - getState().writeToStream(writer); - writer.close(); - saveFile.delete(); - tempFile.renameTo(saveFile);*/ - System.out.println("Saved successfully!"); + if ( DDSaveHandler.saveAll(dimensionData.values()) ) + { + System.out.println("Saved successfully!"); + } } - /*catch (FileNotFoundException e) + catch (Exception e) { - e.printStackTrace(); + // Wrap the exception in a RuntimeException so functions that call + // PocketManager.save() don't need to catch it. We want MC to + // crash if something really bad happens rather than ignoring it! + throw new RuntimeException(e); } - catch (IOException e) - { - e.printStackTrace(); - }*/ finally { isSaving = false; diff --git a/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java b/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java index bd2a234..f734192 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java @@ -3,11 +3,9 @@ package StevenDimDoors.mod_pocketDim.helpers; import java.util.List; import net.minecraft.world.World; -import net.minecraftforge.common.ForgeChunkManager.Ticket; import net.minecraftforge.common.ForgeChunkManager; - +import net.minecraftforge.common.ForgeChunkManager.Ticket; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoorGold; import com.google.common.collect.Lists; diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 78963fc..6207f71 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -33,29 +33,11 @@ import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPackConfigReader; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonType; import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; import StevenDimDoors.mod_pocketDim.util.ConfigurationProcessingException; +import StevenDimDoors.mod_pocketDim.util.FileFilters; import StevenDimDoors.mod_pocketDim.util.WeightedContainer; public class DungeonHelper { - //TODO: File-handling functionality should be spun off to a helper class later - private static class DirectoryFilter implements FileFilter - { - @Override - public boolean accept(File file) - { - return file.isDirectory(); - } - } - - private static class SchematicFileFilter implements FileFilter - { - @Override - public boolean accept(File file) - { - return file.isFile() && file.getName().endsWith(SCHEMATIC_FILE_EXTENSION); - } - } - private static DungeonHelper instance = null; private static DDProperties properties = null; @@ -387,7 +369,7 @@ public class DungeonHelper File[] packFiles; ArrayList packFilePaths; File directory = new File(path); - SchematicFileFilter schematicFileFilter = new SchematicFileFilter(); + FileFilter schematicFileFilter = new FileFilters.FileExtensionFilter(SCHEMATIC_FILE_EXTENSION); //Check that the Ruins pack has been loaded if (RuinsPack == null) @@ -411,7 +393,7 @@ public class DungeonHelper schematics = null; //Release memory //Load the custom dungeon packs - packDirectories = directory.listFiles(new DirectoryFilter()); + packDirectories = directory.listFiles(new FileFilters.DirectoryFilter()); if (packDirectories != null) { //Loop through each directory, which is assumed to be a dungeon pack diff --git a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java index 1ac8519..34e8b8d 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java @@ -218,10 +218,12 @@ public class yCoordHelper return target; } - public static Point3D findDropPoint(World world, int x, int y, int z) + public static Point3D findDropPoint(World world, int x, int startY, int z) { - /*// Find a simple 2-block-high air gap + // Find a simple 2-block-high air gap // Search across a 3x3 column + final int GAP_HEIGHT = 2; + int localX = x < 0 ? (x % 16) + 16 : (x % 16); int localZ = z < 0 ? (z % 16) + 16 : (z % 16); int cornerX = x - localX; @@ -231,56 +233,45 @@ public class yCoordHelper Chunk chunk = initializeChunkArea(world, x >> 4, z >> 4); + int y, dx, dz, index; int height = world.getActualHeight(); - int y, dx, dz, blockID; - boolean isSafe; - boolean hasBlocks; - Block block; - int layers = 0; + int[] gaps = new int[9]; - // Check if a 3x3 layer of blocks is empty - // If we find a layer that contains replaceable blocks, it can - // serve as the base where we'll place the player and door. - for (y = Math.min(startY + 2, height - 1); y >= 0; y--) + // Check 3x3 layers of blocks for air spaces + for (y = Math.min(startY, height - 1); y > 0; y--) { - isSafe = true; - hasBlocks = false; - for (dx = -1; dx <= 1 && isSafe; dx++) + for (dx = -1, index = 0; dx <= 1; dx++) { - for (dz = -1; dz <= 1 && isSafe; dz++) + for (dz = -1; dz <= 1; dz++, index++) { - blockID = chunk.getBlockID(localX + dx, y, localZ + dz); - if (blockID != 0) - { - block = Block.blocksList[blockID]; - if (!block.blockMaterial.isReplaceable()) - { - if (layers >= 3) - { - return new Point3D(localX + cornerX, y + 1, localZ + cornerZ); - } - isSafe = false; - } - hasBlocks = true; + if (chunk.getBlockID(localX + dx, y, localZ + dz) != 0) + { + gaps[index] = 0; + } + else + { + gaps[index]++; } } } - if (isSafe) + // Check if an acceptable gap exists in the center of the search column + if (gaps[index / 2] == GAP_HEIGHT) { - layers++; - if (hasBlocks) + return new Point3D(localX + cornerX, y + GAP_HEIGHT - 1, localZ + cornerZ); + } + // Check the other positions in the column + for (dx = -1, index = 0; dx <= 1; dx++) + { + for (dz = -1; dz <= 1; dz++, index++) { - if (layers >= 3) + if (gaps[index] == GAP_HEIGHT) { - return new Point3D(localX + cornerX, y, localZ + cornerZ); + return new Point3D(localX + cornerX + dx, y + GAP_HEIGHT - 1, localZ + cornerZ + dz); } - layers = 0; } } } - return null;*/ - // Temporary measure to not break the build - return new Point3D(x, y - 2, z); + return null; } public static int adjustDestinationY(int y, int worldHeight, int entranceY, int dungeonHeight) diff --git a/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java b/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java new file mode 100644 index 0000000..fe63994 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java @@ -0,0 +1,136 @@ +package StevenDimDoors.mod_pocketDim.saving; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import net.minecraftforge.common.DimensionManager; +import StevenDimDoors.mod_pocketDim.util.FileFilters; + +import com.google.common.io.Files; + +public class DDSaveHandler +{ + public static boolean loadAll() + { + // SenseiKiwi: Loading up our save data is not as simple as just reading files. + // To properly restore dimensions, we need to make sure we always load + // a dimension's parent and root before trying to load it. We'll use + // topological sorting to determine the order in which to recreate the + // dimension objects such that we respect those dependencies. + // Links must be loaded after instantiating all the dimensions and must + // be checked against our dimension blacklist. + + // Don't surround this code with try-catch. Our mod should crash if an error + // occurs at this level, since it could lead to some nasty problems. + + String basePath = DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/data/"; + File dataDirectory = new File(basePath); + + // Check if the folder exists. If it doesn't, just return. + if (!dataDirectory.exists()) + { + return true; + } + + // Load the dimension blacklist + // --insert code here-- + + // List any dimension data files and read each dimension + DimDataProcessor reader = new DimDataProcessor(); + List packedDims = new ArrayList(); + FileFilter dataFileFilter = new FileFilters.RegexFileFilter("dim_-?\\d+\\.txt"); + + File[] dataFiles = dataDirectory.listFiles(dataFileFilter); + for (File dataFile : dataFiles) + { + PackedDimData packedDim = readDimension(dataFile, reader); + } + return true; + } + + private static PackedDimData readDimension(File dataFile, DimDataProcessor reader) + { + try + { + return reader.readFromFile(dataFile); + } + catch (Exception e) + { + System.err.println("Could not read dimension data from: " + dataFile.getAbsolutePath()); + System.err.println("The following error occurred:"); + printException(e, false); + return null; + } + } + + public static boolean saveAll(Iterable> dimensions) throws IOException + { + // Create the data directory for our dimensions + // Don't catch exceptions here. If we can't create this folder, + // the mod should crash to let the user know early on. + + String basePath = DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/data/"; + File basePathFile = new File(basePath); + Files.createParentDirs(basePathFile); + basePathFile = null; + basePath += "dim_"; + + boolean succeeded = true; + DimDataProcessor writer = new DimDataProcessor(); + for (IPackable dimension : dimensions) + { + succeeded &= writeDimension(dimension, writer, basePath); + } + return succeeded; + } + + private static boolean writeDimension(IPackable dimension, DimDataProcessor writer, String basePath) + { + try + { + File tempFile = new File(basePath + (dimension.name() + ".tmp")); + File saveFile = new File(basePath + (dimension.name() + ".txt")); + writer.writeToFile(tempFile, dimension.pack()); + saveFile.delete(); + tempFile.renameTo(saveFile); + return true; + } + catch (Exception e) + { + System.err.println("Could not save data for dimension #" + dimension.name() + ". The following error occurred:"); + printException(e, false); + return false; + } + } + + private static void printException(Exception e, boolean verbose) + { + if (e.getCause() == null) + { + if (verbose) + { + e.printStackTrace(); + } + else + { + System.err.println(e.getMessage()); + } + } + else + { + System.out.println(e.getMessage()); + System.err.println("Caused by an underlying error:"); + if (verbose) + { + e.getCause().printStackTrace(); + } + else + { + System.err.println(e.getCause().getMessage()); + } + } + } +} diff --git a/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java b/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java new file mode 100644 index 0000000..6102182 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java @@ -0,0 +1,28 @@ +package StevenDimDoors.mod_pocketDim.saving; + +import java.io.InputStream; +import java.io.OutputStream; + +import StevenDimDoors.mod_pocketDim.util.BaseConfigurationProcessor; +import StevenDimDoors.mod_pocketDim.util.ConfigurationProcessingException; + +public class DimDataProcessor extends BaseConfigurationProcessor +{ + + @Override + public PackedDimData readFromStream(InputStream inputStream) + throws ConfigurationProcessingException + { + // TODO Auto-generated method stub + return null; + } + + @Override + public void writeToStream(OutputStream outputStream, PackedDimData data) + throws ConfigurationProcessingException + { + // TODO Auto-generated method stub + + } + +} diff --git a/StevenDimDoors/mod_pocketDim/saving/IPackable.java b/StevenDimDoors/mod_pocketDim/saving/IPackable.java new file mode 100644 index 0000000..78908d8 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/saving/IPackable.java @@ -0,0 +1,7 @@ +package StevenDimDoors.mod_pocketDim.saving; + +public interface IPackable +{ + public String name(); + public T pack(); +} diff --git a/StevenDimDoors/mod_pocketDim/saving/PackedDimData.java b/StevenDimDoors/mod_pocketDim/saving/PackedDimData.java new file mode 100644 index 0000000..38af8f1 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/saving/PackedDimData.java @@ -0,0 +1,42 @@ +package StevenDimDoors.mod_pocketDim.saving; + +import java.util.List; + +import StevenDimDoors.mod_pocketDim.Point3D; + +public class PackedDimData +{ + // These fields will be public since this is a simple data container + public final int ID; + public final boolean IsDungeon; + public final boolean IsFilled; + public final int Depth; + public final int PackDepth; + public final int ParentID; + public final int RootID; + public final Point3D Origin; + public final int Orientation; + public final List ChildIDs; + public final List Links; + public final List Tails; + + // FIXME Missing dungeon data, not sure how to include it + + public PackedDimData(int id, int depth, int packDepth, int parentID, int rootID, int orientation, + boolean isDungeon, boolean isFilled, Point3D origin, List childIDs, List links, + List tails) + { + ID = id; + Depth = depth; + PackDepth = packDepth; + ParentID = parentID; + RootID = rootID; + Orientation = orientation; + IsDungeon = isDungeon; + IsFilled = isFilled; + Origin = origin; + ChildIDs = childIDs; + Links = links; + Tails = tails; + } +} diff --git a/StevenDimDoors/mod_pocketDim/saving/PackedLinkData.java b/StevenDimDoors/mod_pocketDim/saving/PackedLinkData.java new file mode 100644 index 0000000..f82e74a --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/saving/PackedLinkData.java @@ -0,0 +1,6 @@ +package StevenDimDoors.mod_pocketDim.saving; + +public class PackedLinkData +{ + +} diff --git a/StevenDimDoors/mod_pocketDim/saving/PackedLinkTail.java b/StevenDimDoors/mod_pocketDim/saving/PackedLinkTail.java new file mode 100644 index 0000000..c5a1bb7 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/saving/PackedLinkTail.java @@ -0,0 +1,6 @@ +package StevenDimDoors.mod_pocketDim.saving; + +public class PackedLinkTail +{ + +} diff --git a/StevenDimDoors/mod_pocketDim/util/FileFilters.java b/StevenDimDoors/mod_pocketDim/util/FileFilters.java new file mode 100644 index 0000000..efd4e3b --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/util/FileFilters.java @@ -0,0 +1,51 @@ +package StevenDimDoors.mod_pocketDim.util; + +import java.io.File; +import java.io.FileFilter; +import java.util.regex.Pattern; + +public class FileFilters +{ + private FileFilters() { } + + public static class DirectoryFilter implements FileFilter + { + @Override + public boolean accept(File file) + { + return file.isDirectory(); + } + } + + public static class FileExtensionFilter implements FileFilter + { + private final String extension; + + public FileExtensionFilter(String extension) + { + this.extension = extension; + } + + @Override + public boolean accept(File file) + { + return file.isFile() && file.getName().endsWith(extension); + } + } + + public static class RegexFileFilter implements FileFilter + { + private final Pattern pattern; + + public RegexFileFilter(String expression) + { + this.pattern = Pattern.compile(expression); + } + + @Override + public boolean accept(File file) + { + return file.isFile() && pattern.matcher(file.getName()).matches(); + } + } +} -- 2.39.5 From 94bbc2d658801c28d519a934abb5e3da53f9e815 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 30 Sep 2013 00:57:27 -0400 Subject: [PATCH 116/544] fixed collision --- StevenDimDoors/mod_pocketDim/core/DimLink.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/DimLink.java b/StevenDimDoors/mod_pocketDim/core/DimLink.java index c3800c3..3ca4e0b 100644 --- a/StevenDimDoors/mod_pocketDim/core/DimLink.java +++ b/StevenDimDoors/mod_pocketDim/core/DimLink.java @@ -15,16 +15,13 @@ public abstract class DimLink protected DimLink(Point4D source, DimLink parent, int orientation) { -<<<<<<< HEAD - this.orientation=orientation; -======= + if (parent.source.getDimension() != source.getDimension()) { // Ban having children in other dimensions to avoid serialization issues with cross-dimensional tails throw new IllegalArgumentException("source and parent.source must have the same dimension."); } ->>>>>>> 25446453cba6f491cc0745803f448dd000d453cc this.parent = parent; this.source = source; this.tail = parent.tail; -- 2.39.5 From 0484040e26347b7f5d67c2bfed4c82a3f9cf3c06 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 30 Sep 2013 00:58:14 -0400 Subject: [PATCH 117/544] last time --- StevenDimDoors/mod_pocketDim/core/DimLink.java | 1 - 1 file changed, 1 deletion(-) diff --git a/StevenDimDoors/mod_pocketDim/core/DimLink.java b/StevenDimDoors/mod_pocketDim/core/DimLink.java index 3ca4e0b..9752713 100644 --- a/StevenDimDoors/mod_pocketDim/core/DimLink.java +++ b/StevenDimDoors/mod_pocketDim/core/DimLink.java @@ -15,7 +15,6 @@ public abstract class DimLink protected DimLink(Point4D source, DimLink parent, int orientation) { - if (parent.source.getDimension() != source.getDimension()) { // Ban having children in other dimensions to avoid serialization issues with cross-dimensional tails -- 2.39.5 From e859d2c12ef8924bbe11f20daec58be016d87c60 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 30 Sep 2013 00:59:59 -0400 Subject: [PATCH 118/544] readded constructor --- StevenDimDoors/mod_pocketDim/core/DimLink.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/StevenDimDoors/mod_pocketDim/core/DimLink.java b/StevenDimDoors/mod_pocketDim/core/DimLink.java index 9752713..cc7ca37 100644 --- a/StevenDimDoors/mod_pocketDim/core/DimLink.java +++ b/StevenDimDoors/mod_pocketDim/core/DimLink.java @@ -15,12 +15,13 @@ public abstract class DimLink protected DimLink(Point4D source, DimLink parent, int orientation) { + if (parent.source.getDimension() != source.getDimension()) { // Ban having children in other dimensions to avoid serialization issues with cross-dimensional tails throw new IllegalArgumentException("source and parent.source must have the same dimension."); } - + this.orientation=orientation; this.parent = parent; this.source = source; this.tail = parent.tail; -- 2.39.5 From ee35c365e27ae6887ee8bd49a76f2bb9be0f208d Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 30 Sep 2013 05:20:00 -0400 Subject: [PATCH 119/544] complaining --- StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java index aef4919..0a49750 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java @@ -59,6 +59,7 @@ public class ItemRiftSignature extends Item return false; } + //But... :( //We don't check for replaceable blocks. The user can deal with that. <_< y += 2; //Increase y by 2 to place the rift at head level @@ -103,6 +104,7 @@ public class ItemRiftSignature extends Item } else { + //TODO account for replaceable blocks like snow //The link signature has not been used. Store its current target as the first location. setSource(stack, x, y, z,orientation, PocketManager.getDimensionData(world)); player.sendChatToPlayer("Location Stored in Rift Signature"); -- 2.39.5 From 491dc3b6151bbf7e24d05a9ee4cbb5e4a039dc00 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 30 Sep 2013 07:07:24 -0400 Subject: [PATCH 120/544] Rift sigs account for special blocks now --- .../items/ItemRiftSignature.java | 46 ++++++++++++++----- .../items/ItemStabilizedRiftSignature.java | 15 +++--- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java index 0a49750..578a71f 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java @@ -2,6 +2,7 @@ package StevenDimDoors.mod_pocketDim.items; import java.util.List; +import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -11,6 +12,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; @@ -58,16 +60,13 @@ public class ItemRiftSignature extends Item { return false; } - - //But... :( - //We don't check for replaceable blocks. The user can deal with that. <_< - + y += 2; //Increase y by 2 to place the rift at head level if (!player.canPlayerEdit(x, y, z, side, stack)) { return true; } - + int adjustedY = adjustYForSpecialBlocks(world,x,y,z); Point4DOrientation source = getSource(stack); int orientation = MathHelper.floor_double((double) ((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; if (source != null) @@ -76,14 +75,14 @@ public class ItemRiftSignature extends Item NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension()); NewDimData destinationDimension = PocketManager.getDimensionData(world); DimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.NORMAL,source.getOrientation()); - DimLink reverse = destinationDimension.createLink(x, y, z, LinkTypes.NORMAL,orientation); - destinationDimension.setDestination(link, x, y, z); + DimLink reverse = destinationDimension.createLink(x, adjustedY, z, LinkTypes.NORMAL,orientation); + destinationDimension.setDestination(link, x, adjustedY, z); sourceDimension.setDestination(reverse, source.getX(), source.getY(), source.getZ()); //Try placing a rift at the destination point - if (!mod_pocketDim.blockRift.isBlockImmune(world, x, y, z)) + if (!mod_pocketDim.blockRift.isBlockImmune(world, x, adjustedY, z)) { - world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); + world.setBlock(x, adjustedY, z, mod_pocketDim.blockRift.blockID); } //Try placing a rift at the source point, but check if its world is loaded first @@ -104,9 +103,8 @@ public class ItemRiftSignature extends Item } else { - //TODO account for replaceable blocks like snow //The link signature has not been used. Store its current target as the first location. - setSource(stack, x, y, z,orientation, PocketManager.getDimensionData(world)); + setSource(stack, x, adjustedY, z,orientation, PocketManager.getDimensionData(world)); player.sendChatToPlayer("Location Stored in Rift Signature"); world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftStart", 0.6f, 1); } @@ -133,6 +131,32 @@ public class ItemRiftSignature extends Item } } + /** + * Makes the rift placement account for replaceable blocks and doors. + * @param world + * @param x + * @param y + * @param z + * @return the adjusted y coord + */ + public static int adjustYForSpecialBlocks(World world, int x, int y, int z) + { + y=y-2;//get the block the player actually clicked on + Block block = Block.blocksList[world.getBlockId(x, y, z)]; + if(block.isBlockReplaceable(world, x, y, z)) + { + return y+1;//move block placement down (-2+1) one so its directly over things like snow + } + if(block instanceof BaseDimDoor) + { + if(world.getBlockId(x, y-1, z)==block.blockID&&world.getBlockMetadata(x, y, z)==8) + { + return y;//move rift placement down two so its in the right place on the door. + } + return y+1; + } + return y+2; + } public static void setSource(ItemStack itemStack, int x, int y, int z, int orientation, NewDimData dimension) { NBTTagCompound tag = new NBTTagCompound(); diff --git a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java index a58cfff..fca2c24 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java @@ -45,9 +45,10 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature { return true; } - - // Check if the Stabilized Rift Signature has been initialized Point4DOrientation source = getSource(stack); + int adjustedY = adjustYForSpecialBlocks(world,x,y,z); + + // Check if the Stabilized Rift Signature has been initialized int orientation = MathHelper.floor_double((double) ((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; if (source != null) { @@ -63,14 +64,14 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension()); NewDimData destinationDimension = PocketManager.getDimensionData(world); DimLink link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.NORMAL,source.getOrientation()); - DimLink reverse = destinationDimension.createLink(x, y, z, LinkTypes.NORMAL,orientation); - destinationDimension.setDestination(link, x, y, z); + DimLink reverse = destinationDimension.createLink(x, adjustedY, z, LinkTypes.NORMAL,orientation); + destinationDimension.setDestination(link, x, adjustedY, z); sourceDimension.setDestination(reverse, source.getX(), source.getY(), source.getZ()); //Try placing a rift at the destination point - if (!mod_pocketDim.blockRift.isBlockImmune(world, x, y, z)) + if (!mod_pocketDim.blockRift.isBlockImmune(world, x, adjustedY, z)) { - world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); + world.setBlock(x, adjustedY, z, mod_pocketDim.blockRift.blockID); } //Try placing a rift at the source point, but check if its world is loaded first @@ -91,7 +92,7 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature else { //The link signature has not been used. Store its current target as the first location. - setSource(stack, x, y, z, orientation, PocketManager.getDimensionData(world)); + setSource(stack, x, adjustedY, z, orientation, PocketManager.getDimensionData(world)); player.sendChatToPlayer("Location Stored in Rift Signature"); world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftStart", 0.6f, 1); } -- 2.39.5 From ca07a38eff44cfe56fcf1697dabe2d8092fbd127 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Tue, 1 Oct 2013 16:20:07 -0400 Subject: [PATCH 121/544] Made respawning in limbo much less nice. Takes entrance coords and THEN adds the spawnFuzz. Its much closer to how it used to be. --- .../mod_pocketDim/EventHookContainer.java | 2 +- .../mod_pocketDim/ticking/MobMonolith.java | 15 +++++++-------- .../mod_pocketDim/world/LimboProvider.java | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 6191018..4035606 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -79,7 +79,7 @@ public class EventHookContainer player.inventory.clearInventory(-1, -1); } ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(player.worldObj.rand); - Point4D destination = new Point4D(coords.posX, coords.posY, coords.posZ, mod_pocketDim.properties.LimboDimensionID); + Point4D destination = new Point4D((int) (coords.posX+entity.posX), coords.posY, (int) (coords.posZ+entity.posZ ), mod_pocketDim.properties.LimboDimensionID); DDTeleporter.teleportEntity(player, destination, false); player.setEntityHealth(player.getMaxHealth()); event.setCanceled(true); diff --git a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index 221ebba..928877f 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -9,10 +9,12 @@ import net.minecraft.entity.monster.IMob; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.world.LimboProvider; @@ -145,14 +147,11 @@ public class MobMonolith extends EntityFlying implements IMob } else if (!this.worldObj.isRemote && !entityPlayer.capabilities.isCreativeMode) { - Point4D destination = new Point4D( - (int) this.posX + MathHelper.getRandomIntegerInRange(rand, -250, 250), - (int) this.posY + 500, - (int) this.posZ + MathHelper.getRandomIntegerInRange(rand, -250, 250), - properties.LimboDimensionID); - DDTeleporter.teleportEntity(entityPlayer, destination, false); - this.aggro = 0; - + ChunkCoordinates coords = LimboProvider.getLimboSkySpawn(entityPlayer.worldObj.rand); + Point4D destination = new Point4D((int) (coords.posX+entityPlayer.posX), coords.posY, (int) (coords.posZ+entityPlayer.posZ ), mod_pocketDim.properties.LimboDimensionID); + DDTeleporter.teleportEntity(entityPlayer, destination, false); + + this.aggro = 0; entityPlayer.worldObj.playSoundAtEntity(entityPlayer,"mods.DimDoors.sfx.crack",13, 1); } if (!(this.worldObj.provider instanceof LimboProvider || this.worldObj.getClosestPlayerToEntity(this, 5) != null) || this.aggro > 300) diff --git a/StevenDimDoors/mod_pocketDim/world/LimboProvider.java b/StevenDimDoors/mod_pocketDim/world/LimboProvider.java index 44d1843..c0d4514 100644 --- a/StevenDimDoors/mod_pocketDim/world/LimboProvider.java +++ b/StevenDimDoors/mod_pocketDim/world/LimboProvider.java @@ -170,7 +170,7 @@ public class LimboProvider extends WorldProvider ChunkCoordinates var5 = new ChunkCoordinates(0,0,0); - int spawnFuzz = 10000; + int spawnFuzz = 1000; int spawnFuzzHalf = spawnFuzz / 2; { -- 2.39.5 From d046bd88ead4136fb3354541e9d6f02ce79c0add Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Tue, 1 Oct 2013 16:36:34 -0400 Subject: [PATCH 122/544] Tweaked how dungeons skip around Dungeons send the player consistently in the direction they *face* now. Allows for better travel using them, and also ensures that if they die, they will be farther away. --- StevenDimDoors/mod_pocketDim/world/PocketBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index 1a519f3..2a4056f 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -117,7 +117,7 @@ public class PocketBuilder private static Point3D calculateNoisyDestination(Point4D source, NewDimData dimension, DungeonData dungeon, int orientation) { int depth = NewDimData.calculatePackDepth(dimension.parent(), dungeon); - int forwardNoise = MathHelper.getRandomIntegerInRange(random, -50 * depth, 150 * depth); + int forwardNoise = MathHelper.getRandomIntegerInRange(random, 10 * depth, 130 * depth); int sidewaysNoise = MathHelper.getRandomIntegerInRange(random, -10 * depth, 10 * depth); //Rotate the link destination noise to point in the same direction as the door exit -- 2.39.5 From eef5117c046ca6010269cf0c1fe7b823e74cdbfa Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Tue, 1 Oct 2013 22:50:43 -0400 Subject: [PATCH 123/544] Readded commands Also implemented dungeon regeneration --- StevenDimDoors/mod_pocketDim/Point3D.java | 9 ++ .../commands/CommandCreateDungeonRift.java | 26 +++-- .../commands/CommandDeleteAllLinks.java | 44 +++------ .../commands/CommandDeleteDimensionData.java | 95 ------------------- .../commands/CommandDeleteRifts.java | 48 +++------- .../commands/CommandPrintDimensionData.java | 69 -------------- .../commands/CommandPruneDimensions.java | 73 -------------- .../commands/CommandResetDungeons.java | 10 +- .../commands/CommandTeleportPlayer.java | 16 ++-- .../mod_pocketDim/core/DDTeleporter.java | 21 +++- .../mod_pocketDim/core/NewDimData.java | 4 +- .../mod_pocketDim/core/PocketManager.java | 7 +- .../mod_pocketDim/mod_pocketDim.java | 17 +++- .../mod_pocketDim/world/PocketBuilder.java | 78 +++++++++++++++ 14 files changed, 181 insertions(+), 336 deletions(-) delete mode 100644 StevenDimDoors/mod_pocketDim/commands/CommandDeleteDimensionData.java delete mode 100644 StevenDimDoors/mod_pocketDim/commands/CommandPrintDimensionData.java delete mode 100644 StevenDimDoors/mod_pocketDim/commands/CommandPruneDimensions.java diff --git a/StevenDimDoors/mod_pocketDim/Point3D.java b/StevenDimDoors/mod_pocketDim/Point3D.java index 7a3d357..f44d0fe 100644 --- a/StevenDimDoors/mod_pocketDim/Point3D.java +++ b/StevenDimDoors/mod_pocketDim/Point3D.java @@ -2,6 +2,8 @@ package StevenDimDoors.mod_pocketDim; import java.io.Serializable; +import StevenDimDoors.mod_pocketDim.util.Point4D; + public class Point3D implements Serializable { private static final long serialVersionUID = -9044026830605287190L; @@ -16,6 +18,13 @@ public class Point3D implements Serializable { this.y = y; this.z = z; } + + public Point3D(Point4D point) + { + this.x = point.getX(); + this.y = point.getY(); + this.z = point.getZ(); + } public int getX() { diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java index c15b458..8eff0aa 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java @@ -4,7 +4,10 @@ import java.util.Collection; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.MathHelper; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; +import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; @@ -29,6 +32,7 @@ public class CommandCreateDungeonRift extends DDCommandBase @Override protected DDCommandResult processCommand(EntityPlayer sender, String[] command) { + NewDimData dimension; DungeonHelper dungeonHelper = DungeonHelper.instance(); if (sender.worldObj.isRemote) @@ -60,13 +64,16 @@ public class CommandCreateDungeonRift extends DDCommandBase int x = MathHelper.floor_double(sender.posX); int y = MathHelper.floor_double(sender.posY); int z = MathHelper.floor_double (sender.posZ); - + int orientation = MathHelper.floor_double((double) ((sender.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; + if (command[0].equals("random")) { - link = new NewLinkData(sender.worldObj.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 3); - PocketManager.createLink(link); - link = PocketManager.createPocket(link, true, true); - sender.sendChatToPlayer("Created a rift to a random dungeon (Dimension ID = " + link.destDimID + ")."); + + dimension = PocketManager.getDimensionData(sender.worldObj); + link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON); + sender.worldObj.setBlock(x, y + 1, z,mod_pocketDim.blockRift.blockID,0,3); + + sender.sendChatToPlayer("Created a rift to a random dungeon."); } else { @@ -79,10 +86,11 @@ public class CommandCreateDungeonRift extends DDCommandBase if (result != null) { //Create a rift to our selected dungeon and notify the player - link = new NewLinkData(sender.worldObj.provider.dimensionId, 0, x, y + 1, z, x, y + 1, z, true, 3); - link = PocketManager.instance.createPocket(link, true, true); - PocketManager.instance.getDimData(link.destDimID).dungeonGenerator = result; - sender.sendChatToPlayer("Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination.getDimensionID() + ")."); + dimension = PocketManager.getDimensionData(sender.worldObj); + link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON); + PocketManager.getDimensionData(link.destination().getDimension()).initializeDungeon(x, y + 1, z, orientation,link, result); + sender.worldObj.setBlock(x, y + 1, z,mod_pocketDim.blockRift.blockID,0,3); + sender.sendChatToPlayer("Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination().getDimension() + ")."); } else { diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteAllLinks.java b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteAllLinks.java index 55b307b..4b2cf42 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteAllLinks.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteAllLinks.java @@ -4,8 +4,9 @@ import java.util.ArrayList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; -import StevenDimDoors.mod_pocketDim.core.ILinkData; import StevenDimDoors.mod_pocketDim.core.PocketManager; public class CommandDeleteAllLinks extends DDCommandBase @@ -32,53 +33,34 @@ public class CommandDeleteAllLinks extends DDCommandBase int targetDim; boolean shouldGo= true; - if(command.length==0) - { - targetDim= sender.worldObj.provider.dimensionId; - } - else if(command.length==1) + if(command.length==1) { targetDim = parseInt(sender, command[0]); - if (!PocketManager.dimList.containsKey(targetDim)) - { - sender.sendChatToPlayer("Error- dim "+targetDim+" not registered"); - shouldGo=false; - } } else { targetDim=0; shouldGo=false; - sender.sendChatToPlayer("Error-Invalid argument, delete_all_links or blank for current dim"); + sender.sendChatToPlayer("Error-Invalid argument, delete_all_links "); } if(shouldGo) { - if(PocketManager.dimList.containsKey(targetDim)) - { - NewDimData dim = PocketManager.instance.getDimData(targetDim); - ArrayList linksInDim = dim.getLinksInDim(); + + NewDimData dim = PocketManager.getDimensionData(targetDim); + ArrayList linksInDim = dim.getAllLinks(); - for (ILinkData link : linksInDim) + for (DimLink link : linksInDim) { - World targetWorld = PocketManager.getWorld(targetDim); + World targetWorld = PocketManager.loadDimension(targetDim); + targetWorld.setBlock(link.source().getX(), link.source().getY(), link.source().getZ(), 0); + dim.deleteLink(link); + //TODO Probably should check what the block is, but thats annoying so Ill do it later. - if(targetWorld==null) - { - PocketManager.initDimension(targetDim); - } - else if(targetWorld.provider==null) - { - PocketManager.initDimension(targetDim); - } - targetWorld = PocketManager.getWorld(targetDim); - dim.removeLinkAtCoords(link); - targetWorld.setBlock(link.locXCoord, link.locYCoord, link.locZCoord, 0); linksRemoved++; } - //dim.linksInThisDim.clear(); sender.sendChatToPlayer("Removed " + linksRemoved + " links."); - } + } return DDCommandResult.SUCCESS; //TEMPORARY HACK } diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteDimensionData.java b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteDimensionData.java deleted file mode 100644 index 7d65435..0000000 --- a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteDimensionData.java +++ /dev/null @@ -1,95 +0,0 @@ -package StevenDimDoors.mod_pocketDim.commands; - -import java.util.ArrayList; -import java.util.Collection; - -import net.minecraft.entity.player.EntityPlayer; -import StevenDimDoors.mod_pocketDim.core.NewDimData; -import StevenDimDoors.mod_pocketDim.core.ILinkData; -import StevenDimDoors.mod_pocketDim.core.PocketManager; - -public class CommandDeleteDimensionData extends DDCommandBase -{ - private static CommandDeleteDimensionData instance = null; - - private CommandDeleteDimensionData() - { - super("dd-deletedimension", "???"); - } - - public static CommandDeleteDimensionData instance() - { - if (instance == null) - instance = new CommandDeleteDimensionData(); - - return instance; - } - - @Override - protected DDCommandResult processCommand(EntityPlayer sender, String[] command) - { - int linksRemoved=0; - int targetDim; - boolean shouldGo= true; - - if (command.length==0) - { - targetDim= sender.worldObj.provider.dimensionId; - } - else if (command.length==1) - { - targetDim = parseInt(sender, command[0]); - if(!PocketManager.dimList.containsKey(targetDim)) - { - sender.sendChatToPlayer("Error- dim "+targetDim+" not registered"); - shouldGo=false; - } - } - else - { - targetDim=0; - shouldGo=false; - sender.sendChatToPlayer("Error-Invalid argument, delete_dim_data or blank for current dim"); - } - - if(shouldGo) - { - if(PocketManager.dimList.containsKey(targetDim)) - { - try - { - for(NewDimData newDimData :PocketManager.dimList.values()) - { - Collection links= new ArrayList(); - links.addAll( newDimData.getLinksInDim()); - - for(ILinkData link : links) - { - if(link.destDimID==targetDim) - { - PocketManager.instance.getDimData(link.locDimID).removeLinkAtCoords(link); - linksRemoved++; - } - if(newDimData.dimID==targetDim) - { - linksRemoved++; - } - } - } - } - catch(Exception e) - { - e.printStackTrace(); - } - - PocketManager.dimList.remove(targetDim); - sender.sendChatToPlayer("Removed dimension " + targetDim + " from DimDoors and deleted " + linksRemoved + " links"); - } - else - { - sender.sendChatToPlayer("Error- dimension "+targetDim+" not registered with dimDoors"); - } - } - return DDCommandResult.SUCCESS; //TEMPORARY HACK - } -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteRifts.java b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteRifts.java index 529cf20..61668d7 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandDeleteRifts.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandDeleteRifts.java @@ -5,8 +5,8 @@ import java.util.ArrayList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; -import StevenDimDoors.mod_pocketDim.core.ILinkData; import StevenDimDoors.mod_pocketDim.core.PocketManager; public class CommandDeleteRifts extends DDCommandBase @@ -33,56 +33,36 @@ public class CommandDeleteRifts extends DDCommandBase int targetDim; boolean shouldGo= true; - if(command.length==0) - { - targetDim= sender.worldObj.provider.dimensionId; - } - else if(command.length==1) + if(command.length==1) { targetDim = parseInt(sender, command[0]); - if(!PocketManager.dimList.containsKey(targetDim)) - { - sender.sendChatToPlayer("Error- dim "+targetDim+" not registered"); - shouldGo=false; - } } else { targetDim=0; shouldGo=false; - sender.sendChatToPlayer("Error-Invalid argument, delete_links or blank for current dim"); + sender.sendChatToPlayer("Error-Invalid argument, delete_all_links "); } if(shouldGo) { - if(PocketManager.dimList.containsKey(targetDim)) - { - NewDimData dim = PocketManager.instance.getDimData(targetDim); - ArrayList linksInDim = dim.getLinksInDim(); + + NewDimData dim = PocketManager.getDimensionData(targetDim); + ArrayList linksInDim = dim.getAllLinks(); - for(ILinkData link : linksInDim) + for (DimLink link : linksInDim) { - World targetWorld = PocketManager.getWorld(targetDim); - - if(targetWorld==null) + World targetWorld = PocketManager.loadDimension(targetDim); + + if(sender.worldObj.getBlockId(link.source().getX(), link.source().getY(), link.source().getZ())==mod_pocketDim.blockRift.blockID) { - PocketManager.initDimension(targetDim); - } - else if(targetWorld.provider==null) - { - PocketManager.initDimension(targetDim); - } - targetWorld = PocketManager.getWorld(targetDim); - - if (targetWorld.getBlockId(link.locXCoord, link.locYCoord, link.locZCoord) == mod_pocketDim.blockRift.blockID) - { - dim.removeLinkAtCoords(link); - targetWorld.setBlock(link.locXCoord, link.locYCoord, link.locZCoord, 0); + targetWorld.setBlock(link.source().getX(), link.source().getY(), link.source().getZ(), 0); linksRemoved++; + dim.deleteLink(link); } } - sender.sendChatToPlayer("Removed "+linksRemoved+" rifts."); - } + sender.sendChatToPlayer("Removed " + linksRemoved + " rifts."); + } return DDCommandResult.SUCCESS; //TEMPORARY HACK } diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandPrintDimensionData.java b/StevenDimDoors/mod_pocketDim/commands/CommandPrintDimensionData.java deleted file mode 100644 index e4a99c6..0000000 --- a/StevenDimDoors/mod_pocketDim/commands/CommandPrintDimensionData.java +++ /dev/null @@ -1,69 +0,0 @@ -package StevenDimDoors.mod_pocketDim.commands; - -import java.util.ArrayList; - -import net.minecraft.entity.player.EntityPlayer; -import StevenDimDoors.mod_pocketDim.core.NewDimData; -import StevenDimDoors.mod_pocketDim.core.ILinkData; -import StevenDimDoors.mod_pocketDim.core.PocketManager; - -public class CommandPrintDimensionData extends DDCommandBase -{ - private static CommandPrintDimensionData instance = null; - - private CommandPrintDimensionData() - { - super("dd-dimensiondata", "[dimension number]"); - } - - public static CommandPrintDimensionData instance() - { - if (instance == null) - instance = new CommandPrintDimensionData(); - - return instance; - } - - @Override - protected DDCommandResult processCommand(EntityPlayer sender, String[] command) - { - int targetDim; - NewDimData newDimData; - - if (command.length == 0) - { - targetDim = sender.worldObj.provider.dimensionId; - } - else if (command.length == 1) - { - try - { - targetDim = Integer.parseInt(command[0]); - } - catch (Exception ex) - { - return DDCommandResult.INVALID_DIMENSION_ID; - } - } - else - { - return DDCommandResult.TOO_MANY_ARGUMENTS; - } - - newDimData = PocketManager.instance.getDimData(targetDim); - if (newDimData == null) - { - return DDCommandResult.UNREGISTERED_DIMENSION; - } - - ArrayList links = newDimData.getLinksInDim(); - - sender.sendChatToPlayer("Dimension ID = " + newDimData.dimID); - sender.sendChatToPlayer("Dimension Depth = " + newDimData.depth); - for (ILinkData link : links) - { - sender.sendChatToPlayer(link.printLinkData()); - } - return DDCommandResult.SUCCESS; - } -} diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandPruneDimensions.java b/StevenDimDoors/mod_pocketDim/commands/CommandPruneDimensions.java deleted file mode 100644 index faee05f..0000000 --- a/StevenDimDoors/mod_pocketDim/commands/CommandPruneDimensions.java +++ /dev/null @@ -1,73 +0,0 @@ -package StevenDimDoors.mod_pocketDim.commands; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import net.minecraft.entity.player.EntityPlayer; -import StevenDimDoors.mod_pocketDim.core.NewDimData; -import StevenDimDoors.mod_pocketDim.core.ILinkData; -import StevenDimDoors.mod_pocketDim.core.PocketManager; - -public class CommandPruneDimensions extends DDCommandBase -{ - private static CommandPruneDimensions instance = null; - - private CommandPruneDimensions() - { - super("dd-prune", "['delete']"); - } - - public static CommandPruneDimensions instance() - { - if (instance == null) - instance = new CommandPruneDimensions(); - - return instance; - } - - @Override - protected DDCommandResult processCommand(EntityPlayer sender, String[] command) - { - if (command.length > 1) - { - return DDCommandResult.TOO_MANY_ARGUMENTS; - } - if (command.length == 1 && !command[0].equalsIgnoreCase("delete")) - { - return DDCommandResult.INVALID_ARGUMENTS; - } - - int removedCount = 0; - boolean deleteFolders = (command.length == 1); - Set linkedDimensions = new HashSet(); - Collection allDims = new ArrayList(); - allDims.addAll(PocketManager.dimList.values()); - - for (NewDimData data : allDims) - { - for (ILinkData link : data.getLinksInDim()) - { - linkedDimensions.add(link.destDimID); - } - } - for (ILinkData link : dimHelper.PocketManager.interDimLinkList.values()) - { - linkedDimensions.add(link.destDimID); - } - for (NewDimData data : allDims) - { - if (!linkedDimensions.contains(data.dimID)) - { - if (PocketManager.instance.pruneDimension(data, deleteFolders)) - { - removedCount++; - } - } - } - PocketManager.instance.save(); - sender.sendChatToPlayer("Removed " + removedCount + " unreachable pocket dims."); - return DDCommandResult.SUCCESS; - } -} \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java b/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java index 73e808e..6c2f0ca 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java @@ -10,7 +10,7 @@ public class CommandResetDungeons extends DDCommandBase private CommandResetDungeons() { - super("dd-resetdungeons", ""); + super("dd-rebuilddungeons", ""); } public static CommandResetDungeons instance() @@ -32,12 +32,12 @@ public class CommandResetDungeons extends DDCommandBase int dungeonCount = 0; int resetCount = 0; - for (NewDimData data : PocketManager.dimList.values()) + for (NewDimData data : PocketManager.getDimensions()) { - if (data.isDimRandomRift) + if (data.isDungeon()) { dungeonCount++; - if (PocketManager.instance.resetPocket(data)) + if (PocketManager.resetDungeon(data)) { resetCount++; } @@ -45,7 +45,7 @@ public class CommandResetDungeons extends DDCommandBase } //Notify the user of the results - sender.sendChatToPlayer("Reset complete. " + resetCount + " out of " + dungeonCount + " dungeons were reset."); + sender.sendChatToPlayer("Reset complete. " + resetCount + " out of " + dungeonCount + " dungeons were rebuilt."); return DDCommandResult.SUCCESS; } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandTeleportPlayer.java b/StevenDimDoors/mod_pocketDim/commands/CommandTeleportPlayer.java index 1892b22..c91286c 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandTeleportPlayer.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandTeleportPlayer.java @@ -6,13 +6,16 @@ import java.util.List; import cpw.mods.fml.common.FMLCommonHandler; import StevenDimDoors.mod_pocketDim.BlankTeleporter; +import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; +import StevenDimDoors.mod_pocketDim.util.Point4D; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.world.World; import net.minecraft.world.WorldServer; +import net.minecraftforge.common.DimensionManager; public class CommandTeleportPlayer extends DDCommandBase @@ -39,7 +42,7 @@ public class CommandTeleportPlayer extends DDCommandBase @Override protected DDCommandResult processCommand(EntityPlayer sender, String[] command) { - List dimensionIDs = Arrays.asList(PocketManager.getStaticDimensionIDs()); //Gets list of all registered dimensions, regardless if loaded or not + List dimensionIDs = Arrays.asList(DimensionManager.getStaticDimensionIDs()); //Gets list of all registered dimensions, regardless if loaded or not EntityPlayer targetPlayer = sender; int dimDestinationID = sender.worldObj.provider.dimensionId; @@ -66,13 +69,10 @@ public class CommandTeleportPlayer extends DDCommandBase { return DDCommandResult.INVALID_DIMENSION_ID; } - if(PocketManager.getWorld(dimDestinationID)==null) - { - PocketManager.initDimension(dimDestinationID); - } - - FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().transferPlayerToDimension((EntityPlayerMP) targetPlayer, dimDestinationID, new BlankTeleporter(PocketManager.getWorld(dimDestinationID))); - targetPlayer.setPositionAndUpdate(Integer.parseInt(command[2]),Integer.parseInt(command[3]),Integer.parseInt(command[4])); + + PocketManager.loadDimension(dimDestinationID); + Point4D destination = new Point4D(Integer.parseInt(command[2]),Integer.parseInt(command[3]),Integer.parseInt(command[4]),dimDestinationID); + DDTeleporter.teleportEntity(targetPlayer, destination, false); } else { diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 7ae67d4..a2ed39d 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -470,13 +470,26 @@ public class DDTeleporter private static boolean initializeDestination(DimLink link, DDProperties properties, Block door) { - // FIXME: Change this later to support rooms that have been wiped and must be regenerated. - // FIXME: Add code for restoring the destination-side door. - // We might need to implement regeneration for REVERSE links as well. - 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 05ab685..e53058f 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -242,14 +242,14 @@ public abstract class NewDimData } public DimLink createLink(int x, int y, int z, int linkType) { - return createLink(new Point4D(x, y, z, id), linkType,-1); + return createLink(new Point4D(x, y, z, id), linkType,0); } public DimLink createLink(int x, int y, int z, int linkType,int orientation) { return createLink(new Point4D(x, y, z, id), linkType,orientation); } - private DimLink createLink(Point4D source, int linkType,int orientation) + public DimLink createLink(Point4D source, int linkType,int orientation) { //Return an existing link if there is one to avoid creating multiple links starting at the same point. InnerDimLink link = linkMapping.get(source); diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 3c992fc..39061c2 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -186,7 +186,7 @@ public class PocketManager isLoading = false; } - public boolean resetDungeon(NewDimData target) + 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 @@ -452,6 +452,11 @@ public class PocketManager return getLink(x, y, z, world.provider.dimensionId); } + public static DimLink getLink(Point4D point) + { + return getLink(point.getX(), point.getY(), point.getZ(), point.getDimension()); + } + public static DimLink getLink(int x, int y, int z, int dimensionID) { NewDimData dimension = dimensionData.get(dimensionID); diff --git a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index c8802e6..bb9d173 100644 --- a/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -24,6 +24,13 @@ import StevenDimDoors.mod_pocketDim.blocks.TransTrapdoor; import StevenDimDoors.mod_pocketDim.blocks.TransientDoor; import StevenDimDoors.mod_pocketDim.blocks.UnstableDoor; import StevenDimDoors.mod_pocketDim.blocks.WarpDoor; +import StevenDimDoors.mod_pocketDim.commands.CommandCreateDungeonRift; +import StevenDimDoors.mod_pocketDim.commands.CommandCreatePocket; +import StevenDimDoors.mod_pocketDim.commands.CommandDeleteAllLinks; +import StevenDimDoors.mod_pocketDim.commands.CommandDeleteRifts; +import StevenDimDoors.mod_pocketDim.commands.CommandExportDungeon; +import StevenDimDoors.mod_pocketDim.commands.CommandResetDungeons; +import StevenDimDoors.mod_pocketDim.commands.CommandTeleportPlayer; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.ChunkLoaderHelper; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; @@ -405,17 +412,17 @@ public class mod_pocketDim { //TODO- load dims with forced chunks on server startup here - /* + CommandResetDungeons.instance().register(event); CommandCreateDungeonRift.instance().register(event); CommandDeleteAllLinks.instance().register(event); - CommandDeleteDimensionData.instance().register(event); + //CommandDeleteDimensionData.instance().register(event); CommandDeleteRifts.instance().register(event); CommandExportDungeon.instance().register(event); - CommandPrintDimensionData.instance().register(event); - CommandPruneDimensions.instance().register(event); + //CommandPrintDimensionData.instance().register(event); + //CommandPruneDimensions.instance().register(event); CommandCreatePocket.instance().register(event); CommandTeleportPlayer.instance().register(event); - */ + } } diff --git a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index 2a4056f..88b326a 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -42,6 +42,82 @@ public class PocketBuilder private PocketBuilder() { } + /** + * Method that takes an arbitrary link into a dungeon pocket and tries to regenerate it. First uses the origin to find that link, + * then uses that link to find the link that originally created the dungeon. If it cant find any of these, it + * instead makes the link that lead to this point into an exit door style link, sending the player to the overworld. + * @param dimension The dungeon to be regenerated + * @param linkIn The link leading somewhere into the dungeon. + * @param properties + * @return + */ + public static boolean regenerateDungeonPocket(NewDimData dimension, DimLink linkIn, DDProperties properties) + { + if (linkIn == null) + { + throw new IllegalArgumentException("link cannot be null."); + } + if (properties == null) + { + throw new IllegalArgumentException("properties cannot be null."); + } + //The link that is at the origin of the dungeon + DimLink originLink = dimension.getLink(dimension.origin()); + Point4D oldLinkPos = linkIn.source(); + if(originLink==null) + { + int orientation = linkIn.orientation(); + originLink=dimension.createLink(oldLinkPos, LinkTypes.SAFE_EXIT, (orientation+2)%4); + return false; + } + //The link that originally created the dungeon on the way in + DimLink incomingLink = PocketManager.getLink(originLink.destination()); + if(incomingLink==null||incomingLink.linkType()!=LinkTypes.DUNGEON||!(originLink.linkType()==LinkTypes.REVERSE)) + { + int orientation = linkIn.orientation(); + dimension.deleteLink(originLink); + dimension.createLink(oldLinkPos, LinkTypes.SAFE_EXIT, (orientation+2)%4); + return false; + } + NewDimData parent = PocketManager.getDimensionData(incomingLink.source().getDimension()); + + if (!dimension.isDungeon()) + { + throw new IllegalArgumentException("destination must be dungeon"); + } + if (dimension.isFilled()) + { + throw new IllegalArgumentException("destination must be empty"); + } + if (!dimension.isInitialized()) + { + throw new IllegalArgumentException("destination must already exist"); + } + + try + { + //Load a world + World world = PocketManager.loadDimension(dimension.id()); + + if (world == null || world.provider == null) + { + System.err.println("Could not initialize dimension for a dungeon!"); + return false; + } + + Point3D destination = new Point3D(incomingLink.destination()); + loadAndValidateDungeon(dimension.dungeon(),properties).copyToWorld(world, destination, originLink.orientation(), incomingLink, random); + dimension.setFilled(true); + return true; + } + catch (Exception e) + { + e.printStackTrace(); + return false; + } + + + } public static boolean generateNewDungeonPocket(DimLink link, DDProperties properties) { if (link == null) @@ -52,10 +128,12 @@ public class PocketBuilder { throw new IllegalArgumentException("properties cannot be null."); } + if (link.hasDestination()) { throw new IllegalArgumentException("link cannot have a destination assigned already."); } + try { -- 2.39.5 From 69864ea9ad4e56d5a557632668d6efc820b7abd0 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Wed, 2 Oct 2013 00:52:18 -0400 Subject: [PATCH 124/544] Working on dungeon deletion --- .../commands/CommandResetDungeons.java | 35 +++++++++-- .../mod_pocketDim/core/DDTeleporter.java | 19 +----- .../mod_pocketDim/core/NewDimData.java | 11 ++-- .../mod_pocketDim/core/PocketManager.java | 59 ++++++++++++------- 4 files changed, 75 insertions(+), 49 deletions(-) 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()) -- 2.39.5 From e421987338729e84264e383e24bfa23569475407 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Thu, 3 Oct 2013 23:44:50 -0400 Subject: [PATCH 125/544] Finished ResetCommand, first pass on blackList --- .../commands/CommandResetDungeons.java | 19 ++++++------- .../mod_pocketDim/core/DDTeleporter.java | 11 ++++++-- .../mod_pocketDim/core/PocketManager.java | 28 ++++++++----------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java b/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java index e537261..b7c1bf7 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java @@ -36,20 +36,15 @@ public class CommandResetDungeons extends DDCommandBase int dungeonCount = 0; int resetCount = 0; - ArrayList dimIdsToDelete= new ArrayList(); - + ArrayList dimsToDelete = new ArrayList(); for (NewDimData data : PocketManager.getDimensions()) { dungeonCount++; - if(DimensionManager.getWorld(data.id())==null) + if(DimensionManager.getWorld(data.id())==null&&data.isDungeon()) { - if (data.isDungeon()) - { - PocketManager.deleteDimensionFolder(data); - dimIdsToDelete.add(data.id()); - } + dimsToDelete.add(data.id()); } - else + else if(data.isDungeon()) { for(DimLink link : data.links()) { @@ -64,7 +59,11 @@ public class CommandResetDungeons extends DDCommandBase } } } - resetCount = PocketManager.deleteDimensionData(dimIdsToDelete); + for(Integer dimID:dimsToDelete) + { + PocketManager.deletePocket(PocketManager.getDimensionData(dimID), true); + } + //TODO implement blackList //Notify the user of the results diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 2dbb3e2..a8db414 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -470,11 +470,16 @@ public class DDTeleporter private static boolean initializeDestination(DimLink link, DDProperties properties, Block door) { - //TODO implement blackList - if (link.hasDestination()) { - return true; + if(PocketManager.isBlackListed(link.destination().getDimension())) + { + link=PocketManager.getDimensionData(link.source().getDimension()).createLink(link.source,LinkTypes.SAFE_EXIT,link.orientation); + } + else + { + return true; + } } // Check the destination type and respond accordingly diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index bbe7822..2e6f124 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -148,6 +148,8 @@ public class PocketManager //HashMap that maps all the dimension IDs registered with DimDoors to their DD data. private static HashMap dimensionData = null; + //ArrayList that stores the dimension IDs of any dimension that has been deleted. + private static ArrayList dimensionIDBlackList = null; public static boolean isLoaded() { @@ -172,7 +174,8 @@ public class PocketManager isLoading = true; dimensionData = new HashMap(); rootDimensions = new ArrayList(); - + dimensionIDBlackList = new ArrayList(); + //Register Limbo DDProperties properties = DDProperties.instance(); registerDimension(properties.LimboDimensionID, null, false, false); @@ -197,12 +200,13 @@ public class PocketManager { deleteDimensionFolder(target); } + dimensionIDBlackList.add(dimension.id); deleteDimensionData(dimension.id); return true; } return false; } - public static boolean deleteDimensionFolder(NewDimData target) + private static boolean deleteDimensionFolder(NewDimData target) { InnerDimData dimension = (InnerDimData) target; if (dimension.isPocketDimension() && DimensionManager.getWorld(dimension.id()) == null) @@ -213,7 +217,7 @@ public class PocketManager } return false; } - public static boolean deleteDimensionData(int dimensionID) + private static boolean deleteDimensionData(int dimensionID) { if(dimensionData.containsKey(dimensionID)&& DimensionManager.getWorld(dimensionID) == null) { @@ -229,18 +233,6 @@ 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()) @@ -377,7 +369,7 @@ public class PocketManager { throw new IllegalArgumentException("Cannot register a dimension with ID = " + dimensionID + " because it has already been registered."); } - + //TODO blacklist stuff probably should happen here InnerDimData dimension = new InnerDimData(dimensionID, parent, isPocket, isDungeon, linkWatcher); dimensionData.put(dimensionID, dimension); if (!dimension.isPocketDimension()) @@ -485,6 +477,10 @@ public class PocketManager } } + public static boolean isBlackListed(int dimensionID) + { + return PocketManager.dimensionIDBlackList.contains(dimensionID); + } public static void registerDimWatcher(IUpdateWatcher watcher) { dimWatcher.registerReceiver(watcher); -- 2.39.5 From 66ad5a798f8911d88c334f2ccde3f6f91b2e1663 Mon Sep 17 00:00:00 2001 From: agaricusb Date: Sun, 6 Oct 2013 19:10:04 -0700 Subject: [PATCH 126/544] Fix possible NPE in RiftRegenerator.regenerate() --- StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java index 386c73b..aeaaf32 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java +++ b/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java @@ -57,7 +57,10 @@ public class RiftRegenerator implements IRegularTickReceiver { { dimHelper.getWorld(link.locDimID).setBlockTileEntity(link.locXCoord, link.locYCoord, link.locZCoord, new TileEntityRift()); } - rift.hasGrownRifts = true; + if (rift != null) + { + rift.hasGrownRifts = true; + } } } } -- 2.39.5 From b9bd42a345f36b1e09d00c61bd9c5d664bed4513 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Wed, 9 Oct 2013 16:23:58 -0400 Subject: [PATCH 127/544] Fixed rift remover regression still need to handle updating the other clients --- .../mod_pocketDim/items/itemRiftRemover.java | 75 ++++++------------- 1 file changed, 21 insertions(+), 54 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java index a0256ad..ee5f322 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java +++ b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java @@ -37,16 +37,13 @@ public class itemRiftRemover extends Item @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - // We invoke PlayerControllerMP.onPlayerRightClick() from here so that Minecraft - // will invoke onItemUseFirst() on the client side. We'll tell it to pass the - // request to the server, which will make sure that rift-related changes are - // reflected on the server. - - if (!world.isRemote) - { - return stack; - } - + /** + * Im not exactly sure why this was done with onItemFirstUse before, but that is what was causing the issue. + * OnItemRightClick would only be called if there was no block to be clicked on, and because we never actually click on rifts (instead we raytrace them) + * we need a method that is always called. We can update other clients of the visual information using the rift TE, by having it send a packet to all players in a radius. + * I will need to look at the new network code first, though. + */ + //Raytrace for rift block because they dont have any collision MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(world, player, true); if (hit != null) { @@ -58,9 +55,19 @@ public class itemRiftRemover extends Item if (world.getBlockId(hx, hy, hz) == mod_pocketDim.blockRift.blockID && link != null && player.canPlayerEdit(hx, hy, hz, hit.sideHit, stack)) { - // Invoke onPlayerRightClick() - FMLClientHandler.instance().getClient().playerController.onPlayerRightClick( - player, world, stack, hx, hy, hz, hit.sideHit, hit.hitVec); + // Tell the rift's tile entity to do its removal animation + // Handle server client stuff on the rift TE + TileEntity tileEntity = world.getBlockTileEntity(hx, hy, hz); + if (tileEntity != null && tileEntity instanceof TileEntityRift) + { + ((TileEntityRift) tileEntity).shouldClose = true; + } + if (!player.capabilities.isCreativeMode) + { + stack.damageItem(1, player); + } + player.worldObj.playSoundAtEntity(player, "mods.DimDoors.sfx.riftClose", 0.8f, 1); + } } return stack; @@ -69,47 +76,7 @@ public class itemRiftRemover extends Item @Override public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { - // We want to use onItemUseFirst() here so that this code will run on the server side, - // so we don't need the client to send link-related updates to the server. Still, - // check whether we have a rift in sight before passing the request over. - - // On integrated servers, the link won't be removed immediately because of the rift - // removal animation. That means we'll have a chance to check for the link before - // it's deleted. Otherwise the Rift Remover's durability wouldn't drop. - - NewDimData dimension = PocketManager.getDimensionData(world); - DimLink link = dimension.getLink(x, y, z); - if (world.getBlockId(x, y, z) == mod_pocketDim.blockRift.blockID && link != null && - player.canPlayerEdit(x, y, z, side, stack)) - { - // Tell the rift's tile entity to do its removal animation - TileEntity tileEntity = world.getBlockTileEntity(x, y, z); - if (tileEntity != null && tileEntity instanceof TileEntityRift) - { - ((TileEntityRift) tileEntity).shouldClose = true; - } - else if (!world.isRemote) - { - // Only set the block to air on the server side so that we don't - // tell the server to remove the rift block before it can use the - // Rift Remover. Otherwise, it won't know to reduce durability. - world.setBlockToAir(x, y, z); - } - if (world.isRemote) - { - // Tell the server about this - return false; - } - else - { - if (!player.capabilities.isCreativeMode) - { - stack.damageItem(1, player); - } - player.worldObj.playSoundAtEntity(player, "mods.DimDoors.sfx.riftClose", 0.8f, 1); - } - } - return true; + return false; } /** -- 2.39.5 From 9420b8edf2e28287e6569e2dfd468593e7f1e6fd Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Wed, 9 Oct 2013 19:07:58 -0400 Subject: [PATCH 128/544] Deleting dungeons is still buggy --- .../commands/CommandCreateDungeonRift.java | 1 + .../commands/CommandResetDungeons.java | 16 +++++++++++++--- .../mod_pocketDim/core/NewDimData.java | 11 ++++++++++- .../mod_pocketDim/dungeon/DungeonSchematic.java | 2 ++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java index 8eff0aa..0eaefaa 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java @@ -86,6 +86,7 @@ public class CommandCreateDungeonRift extends DDCommandBase if (result != null) { //Create a rift to our selected dungeon and notify the player + //TODO currently crashes dimension = PocketManager.getDimensionData(sender.worldObj); link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON); PocketManager.getDimensionData(link.destination().getDimension()).initializeDungeon(x, y + 1, z, orientation,link, result); diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java b/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java index b7c1bf7..7a34c7c 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java @@ -29,6 +29,10 @@ public class CommandResetDungeons extends DDCommandBase @Override protected DDCommandResult processCommand(EntityPlayer sender, String[] command) { + if(sender.worldObj.isRemote) + { + return DDCommandResult.SUCCESS; + } if (command.length > 0) { return DDCommandResult.TOO_FEW_ARGUMENTS; @@ -39,13 +43,17 @@ public class CommandResetDungeons extends DDCommandBase ArrayList dimsToDelete = new ArrayList(); for (NewDimData data : PocketManager.getDimensions()) { - dungeonCount++; + if(DimensionManager.getWorld(data.id())==null&&data.isDungeon()) { + resetCount++; + dungeonCount++; dimsToDelete.add(data.id()); } else if(data.isDungeon()) { + data.setParentToRoot(); + dungeonCount++; for(DimLink link : data.links()) { if(link.linkType()==LinkTypes.REVERSE) @@ -59,13 +67,15 @@ public class CommandResetDungeons extends DDCommandBase } } } + NewDimData test = PocketManager.getDimensionData(sender.worldObj.provider.dimensionId); + test.parent().depth(); for(Integer dimID:dimsToDelete) { PocketManager.deletePocket(PocketManager.getDimensionData(dimID), true); } - + test.parent().depth(); + //TODO- for some reason test.parent is null even though I just set like 23 lines earlier, in data.setParentToRoot //TODO implement blackList - //Notify the user of the results sender.sendChatToPlayer("Reset complete. " + resetCount + " out of " + dungeonCount + " dungeons were reset."); return DDCommandResult.SUCCESS; diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index 100be9a..ac06ed5 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -453,7 +453,6 @@ public abstract class NewDimData { throw new IllegalArgumentException("orientation must be between 0 and 3, inclusive."); } - setDestination(incoming, originX, originY, originZ); this.origin = incoming.destination(); this.orientation = orientation; @@ -461,6 +460,16 @@ public abstract class NewDimData this.packDepth = calculatePackDepth(parent, dungeon); } + /** + * effectivly moves the dungeon to the 'top' of a chain as far as dungeon generation is concerend. + */ + public void setParentToRoot() + { + this.depth=1; + this.parent=this.root; + this.root.children.add(this); + } + public static int calculatePackDepth(NewDimData parent, DungeonData current) { DungeonData predecessor = parent.dungeon(); diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 053008f..a2edde4 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -202,6 +202,8 @@ public class DungeonSchematic extends Schematic { //In the future, we might want to make this more efficient by building whole chunks at a time setBlockDirectly(world, pocketPoint.getX(), pocketPoint.getY(), pocketPoint.getZ(), blockID, blockMeta); + world.markBlockForRenderUpdate((pocketPoint.getX()), pocketPoint.getY(), pocketPoint.getZ()); + index++; } } -- 2.39.5 From b0c7c03fc6239c17c6b7c1f8cf53cc6c62ba32b9 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Wed, 9 Oct 2013 19:18:36 -0400 Subject: [PATCH 129/544] Just was trying something --- StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index a2edde4..053008f 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -202,8 +202,6 @@ public class DungeonSchematic extends Schematic { //In the future, we might want to make this more efficient by building whole chunks at a time setBlockDirectly(world, pocketPoint.getX(), pocketPoint.getY(), pocketPoint.getZ(), blockID, blockMeta); - world.markBlockForRenderUpdate((pocketPoint.getX()), pocketPoint.getY(), pocketPoint.getZ()); - index++; } } -- 2.39.5 From 5bfd40f2b20d1244dbff4bdcf02ebe4474e8c65f Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Wed, 9 Oct 2013 23:42:55 -0400 Subject: [PATCH 130/544] Temporary workaround for dungeon resetting --- .../commands/CommandCreateDungeonRift.java | 2 +- .../commands/CommandResetDungeons.java | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java index 0eaefaa..2bb8328 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java @@ -86,7 +86,7 @@ public class CommandCreateDungeonRift extends DDCommandBase if (result != null) { //Create a rift to our selected dungeon and notify the player - //TODO currently crashes + //TODO currently crashes, need to create the dimension first dimension = PocketManager.getDimensionData(sender.worldObj); link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON); PocketManager.getDimensionData(link.destination().getDimension()).initializeDungeon(x, y + 1, z, orientation,link, result); diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java b/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java index 7a34c7c..d4353fe 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandResetDungeons.java @@ -41,6 +41,8 @@ public class CommandResetDungeons extends DDCommandBase int dungeonCount = 0; int resetCount = 0; ArrayList dimsToDelete = new ArrayList(); + ArrayList dimsToFix = new ArrayList(); + for (NewDimData data : PocketManager.getDimensions()) { @@ -52,7 +54,7 @@ public class CommandResetDungeons extends DDCommandBase } else if(data.isDungeon()) { - data.setParentToRoot(); + dimsToFix.add(data.id()); dungeonCount++; for(DimLink link : data.links()) { @@ -67,14 +69,19 @@ public class CommandResetDungeons extends DDCommandBase } } } - NewDimData test = PocketManager.getDimensionData(sender.worldObj.provider.dimensionId); - test.parent().depth(); + for(Integer dimID:dimsToDelete) { PocketManager.deletePocket(PocketManager.getDimensionData(dimID), true); } - test.parent().depth(); - //TODO- for some reason test.parent is null even though I just set like 23 lines earlier, in data.setParentToRoot + /** + * temporary workaround + */ + for(Integer dimID: dimsToFix) + { + PocketManager.getDimensionData(dimID).setParentToRoot(); + } + //TODO- for some reason the parent field of loaded dimenions get reset to null if I call .setParentToRoot() before I delete the pockets. //TODO implement blackList //Notify the user of the results sender.sendChatToPlayer("Reset complete. " + resetCount + " out of " + dungeonCount + " dungeons were reset."); -- 2.39.5 From 7a36e787698ac6013c217dfd2db248e3a4d49ea4 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Tue, 15 Oct 2013 15:40:37 -0400 Subject: [PATCH 131/544] small fixes Fixed chunkloader bug Fixed doors not tping non player entites because of orientation --- .../mod_pocketDim/IChunkLoader.java | 8 ++++++ .../mod_pocketDim/blocks/BaseDimDoor.java | 4 +-- .../mod_pocketDim/core/DDTeleporter.java | 3 --- .../helpers/ChunkLoaderHelper.java | 27 ++++--------------- .../tileentities/TileEntityDimDoorGold.java | 13 ++++----- 5 files changed, 22 insertions(+), 33 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/IChunkLoader.java diff --git a/StevenDimDoors/mod_pocketDim/IChunkLoader.java b/StevenDimDoors/mod_pocketDim/IChunkLoader.java new file mode 100644 index 0000000..bbe989e --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/IChunkLoader.java @@ -0,0 +1,8 @@ +package StevenDimDoors.mod_pocketDim; + +import net.minecraftforge.common.ForgeChunkManager.Ticket; + +public interface IChunkLoader +{ + public void forceChunkLoading(Ticket ticket,int x, int z); +} diff --git a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index c27bd1d..d0ee1a2 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -383,9 +383,9 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn { int metadata = world.getBlockMetadata(x, y - 1, z); boolean canUse = isDoorOpen(metadata); - if (canUse && entity instanceof EntityLiving) + if (canUse && entity instanceof EntityPlayer) { - // Don't check for non-living entities since it might not work right + // Dont check for non-player entites canUse = isEntityFacingDoor(metadata, (EntityLiving) entity); } if (canUse) diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index a8db414..c9e9c66 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -127,8 +127,6 @@ public class DDTeleporter if(!CheckDestination(entity, world, destination, properties)) { - - //TODO Give entity backwards acceleration if(entity instanceof EntityPlayerMP) { EntityPlayer player = (EntityPlayer) entity; @@ -183,7 +181,6 @@ public class DDTeleporter entity.motionX = 0; entity.motionZ = 0; entity.motionY = 0; - switch (orientation) { case 0: diff --git a/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java b/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java index f734192..825f13e 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java @@ -4,14 +4,16 @@ import java.util.List; import net.minecraft.world.World; import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.ForgeChunkManager.LoadingCallback; import net.minecraftforge.common.ForgeChunkManager.Ticket; +import StevenDimDoors.mod_pocketDim.IChunkLoader; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoorGold; import com.google.common.collect.Lists; -public class ChunkLoaderHelper implements ForgeChunkManager.OrderedLoadingCallback +public class ChunkLoaderHelper implements LoadingCallback { @Override @@ -22,28 +24,9 @@ public class ChunkLoaderHelper implements ForgeChunkManager.OrderedLoadingCallba int goldDimDoorX = ticket.getModData().getInteger("goldDimDoorX"); int goldDimDoorY = ticket.getModData().getInteger("goldDimDoorY"); int goldDimDoorZ = ticket.getModData().getInteger("goldDimDoorZ"); - TileEntityDimDoorGold tile = (TileEntityDimDoorGold) world.getBlockTileEntity(goldDimDoorX, goldDimDoorY, goldDimDoorZ); - tile.forceChunkLoading(ticket); + IChunkLoader tile = (IChunkLoader) world.getBlockTileEntity(goldDimDoorX, goldDimDoorY, goldDimDoorZ); + tile.forceChunkLoading(ticket,goldDimDoorX,goldDimDoorZ); } } - - @Override - public List ticketsLoaded(List tickets, World world, int maxTicketCount) - { - List validTickets = Lists.newArrayList(); - for (Ticket ticket : tickets) - { - int goldDimDoorX = ticket.getModData().getInteger("goldDimDoorX"); - int goldDimDoorY = ticket.getModData().getInteger("goldDimDoorY"); - int goldDimDoorZ = ticket.getModData().getInteger("goldDimDoorZ"); - - int blId = world.getBlockId(goldDimDoorX, goldDimDoorY, goldDimDoorZ); - if (blId == mod_pocketDim.properties.GoldDimDoorID) - { - validTickets.add(ticket); - } - } - return validTickets; - } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoorGold.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoorGold.java index 2de4528..6091aed 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoorGold.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoorGold.java @@ -1,5 +1,6 @@ package StevenDimDoors.mod_pocketDim.tileentities; +import StevenDimDoors.mod_pocketDim.IChunkLoader; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.world.PocketBuilder; @@ -9,7 +10,7 @@ import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.ForgeChunkManager.Ticket; import net.minecraftforge.common.ForgeChunkManager.Type; -public class TileEntityDimDoorGold extends TileEntityDimDoor +public class TileEntityDimDoorGold extends TileEntityDimDoor implements IChunkLoader { private Ticket chunkTicket; @@ -32,22 +33,22 @@ public class TileEntityDimDoorGold extends TileEntityDimDoor chunkTicket.getModData().setInteger("goldDimDoorY", yCoord); chunkTicket.getModData().setInteger("goldDimDoorZ", zCoord); ForgeChunkManager.forceChunk(chunkTicket, new ChunkCoordIntPair(xCoord >> 4, zCoord >> 4)); - forceChunkLoading(chunkTicket); + forceChunkLoading(chunkTicket,this.xCoord,this.zCoord); } } - public void forceChunkLoading(Ticket chunkTicket) + public void forceChunkLoading(Ticket chunkTicket,int x,int z) { - if(PocketManager.getDimensionData(this.worldObj)==null) + if(PocketManager.getDimensionData(chunkTicket.world)==null) { return; } - if(!PocketManager.getDimensionData(this.worldObj).isPocketDimension()) + if(!PocketManager.getDimensionData(chunkTicket.world).isPocketDimension()) { return; } - for(int chunks = (PocketBuilder.DEFAULT_POCKET_SIZE%16)+1;chunks>0;chunks--) + for(int chunks = (PocketBuilder.DEFAULT_POCKET_SIZE/16)+1;chunks>0;chunks--) { ForgeChunkManager.forceChunk(chunkTicket, new ChunkCoordIntPair((xCoord >> 4)+chunks, (zCoord >> 4)+chunks)); -- 2.39.5 From 3e74f60807a6875a551671825b17424fab8a095e Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Tue, 15 Oct 2013 20:37:27 -0400 Subject: [PATCH 132/544] Working on client/server madness --- .../mod_pocketDim/blocks/BaseDimDoor.java | 4 ++-- .../mod_pocketDim/core/PocketManager.java | 5 ++++- .../mod_pocketDim/items/itemRiftRemover.java | 5 +++-- .../tileentities/TileEntityRift.java | 17 ++++------------- 4 files changed, 13 insertions(+), 18 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index d0ee1a2..6537d85 100644 --- a/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -372,8 +372,8 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn @Override public void enterDimDoor(World world, int x, int y, int z, Entity entity) { - // We need to ignore particle entities - if (world.isRemote || entity instanceof EntityFX) + // FX entities dont exist on the server + if (world.isRemote) { return; } diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 2e6f124..da43bec 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -7,10 +7,13 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import cpw.mods.fml.common.FMLCommonHandler; + import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.helpers.Compactor; import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; import StevenDimDoors.mod_pocketDim.saving.DDSaveHandler; @@ -276,7 +279,7 @@ public class PocketManager */ private static void loadInternal() { - if (!DimensionManager.getWorld(OVERWORLD_DIMENSION_ID).isRemote && + if (FMLCommonHandler.instance().getSide().isServer()&& DimensionManager.getCurrentSaveRootDirectory() != null) { // Load and register blacklisted dimension IDs diff --git a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java index ee5f322..0ad238e 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java +++ b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java @@ -60,7 +60,8 @@ public class itemRiftRemover extends Item TileEntity tileEntity = world.getBlockTileEntity(hx, hy, hz); if (tileEntity != null && tileEntity instanceof TileEntityRift) { - ((TileEntityRift) tileEntity).shouldClose = true; + ((TileEntityRift) tileEntity).shouldClose = true; + tileEntity.onInventoryChanged(); } if (!player.capabilities.isCreativeMode) { @@ -76,7 +77,7 @@ public class itemRiftRemover extends Item @Override public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { - return false; + return true; } /** diff --git a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index d1f472c..b08a208 100644 --- a/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -170,9 +170,10 @@ public class TileEntityRift extends TileEntity { Point4D location = nearestRiftData.source(); TileEntityRift rift = (TileEntityRift) worldObj.getBlockTileEntity(location.getX(), location.getY(), location.getZ()); - if (rift != null) + if (rift != null&&rift.shouldClose!=true) { rift.shouldClose = true; + rift.onInventoryChanged(); } } } @@ -187,6 +188,7 @@ public class TileEntityRift extends TileEntity } } count2++; + } public void calculateOldParticleOffset() @@ -200,18 +202,6 @@ public class TileEntityRift extends TileEntity this.zOffset = this.zCoord - location.getZ(); this.distance = Math.abs(xOffset) + Math.abs(yOffset) + Math.abs(zOffset); this.isNearRift=true; - - if (!worldObj.isRemote && distance > 1) - { - try - { - grow(distance); - } - catch(Exception e) - { - - } - } } else { @@ -219,6 +209,7 @@ public class TileEntityRift extends TileEntity this.yOffset=0; this.xOffset=0; } + this.onInventoryChanged(); } public void grow(int distance) -- 2.39.5 From 2f98bf91e8aed75fbb536fac834f00530d4aaf46 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Tue, 15 Oct 2013 21:11:44 -0400 Subject: [PATCH 133/544] More work on rift remover Reverted most changes back to SenseiKiwi's code, but fixed it not raytracing. --- .../mod_pocketDim/items/itemRiftRemover.java | 83 ++++++++++++++----- 1 file changed, 62 insertions(+), 21 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java index 0ad238e..6d1b1ed 100644 --- a/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java +++ b/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java @@ -37,13 +37,16 @@ public class itemRiftRemover extends Item @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - /** - * Im not exactly sure why this was done with onItemFirstUse before, but that is what was causing the issue. - * OnItemRightClick would only be called if there was no block to be clicked on, and because we never actually click on rifts (instead we raytrace them) - * we need a method that is always called. We can update other clients of the visual information using the rift TE, by having it send a packet to all players in a radius. - * I will need to look at the new network code first, though. - */ - //Raytrace for rift block because they dont have any collision + // We invoke PlayerControllerMP.onPlayerRightClick() from here so that Minecraft + // will invoke onItemUseFirst() on the client side. We'll tell it to pass the + // request to the server, which will make sure that rift-related changes are + // reflected on the server. + + if (!world.isRemote) + { + return stack; + } + MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(world, player, true); if (hit != null) { @@ -55,20 +58,9 @@ public class itemRiftRemover extends Item if (world.getBlockId(hx, hy, hz) == mod_pocketDim.blockRift.blockID && link != null && player.canPlayerEdit(hx, hy, hz, hit.sideHit, stack)) { - // Tell the rift's tile entity to do its removal animation - // Handle server client stuff on the rift TE - TileEntity tileEntity = world.getBlockTileEntity(hx, hy, hz); - if (tileEntity != null && tileEntity instanceof TileEntityRift) - { - ((TileEntityRift) tileEntity).shouldClose = true; - tileEntity.onInventoryChanged(); - } - if (!player.capabilities.isCreativeMode) - { - stack.damageItem(1, player); - } - player.worldObj.playSoundAtEntity(player, "mods.DimDoors.sfx.riftClose", 0.8f, 1); - + // Invoke onPlayerRightClick() + FMLClientHandler.instance().getClient().playerController.onPlayerRightClick( + player, world, stack, hx, hy, hz, hit.sideHit, hit.hitVec); } } return stack; @@ -77,6 +69,55 @@ public class itemRiftRemover extends Item @Override public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + + // We want to use onItemUseFirst() here so that this code will run on the server side, + // so we don't need the client to send link-related updates to the server. Still, + // check whether we have a rift in sight before passing the request over. + + // On integrated servers, the link won't be removed immediately because of the rift + // removal animation. That means we'll have a chance to check for the link before + // it's deleted. Otherwise the Rift Remover's durability wouldn't drop. + MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(world, player, true); + if (hit != null) + { + x = hit.blockX; + y = hit.blockY; + z = hit.blockZ; + + NewDimData dimension = PocketManager.getDimensionData(world); + DimLink link = dimension.getLink(x, y, z); + if (world.getBlockId(x, y, z) == mod_pocketDim.blockRift.blockID && link != null && + player.canPlayerEdit(x, y, z, side, stack)) + { + // Tell the rift's tile entity to do its removal animation + TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + if (tileEntity != null && tileEntity instanceof TileEntityRift) + { + ((TileEntityRift) tileEntity).shouldClose = true; + tileEntity.onInventoryChanged(); + } + else if (!world.isRemote) + { + // Only set the block to air on the server side so that we don't + // tell the server to remove the rift block before it can use the + // Rift Remover. Otherwise, it won't know to reduce durability. + world.setBlockToAir(x, y, z); + } + if (world.isRemote) + { + // Tell the server about this + return false; + } + else + { + if (!player.capabilities.isCreativeMode) + { + stack.damageItem(1, player); + } + player.worldObj.playSoundAtEntity(player, "mods.DimDoors.sfx.riftClose", 0.8f, 1); + } + } + } return true; } -- 2.39.5 From c08fa15f40bf54e73c8b51d7706b3ee9c18eb293 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Wed, 16 Oct 2013 17:17:46 -0400 Subject: [PATCH 134/544] Working on server client --- StevenDimDoors/mod_pocketDim/core/DimLink.java | 2 +- StevenDimDoors/mod_pocketDim/core/NewDimData.java | 5 ++++- .../mod_pocketDim/core/PocketManager.java | 8 +++++++- .../mod_pocketDimClient/RenderDimDoor.java | 13 +++++++------ 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/DimLink.java b/StevenDimDoors/mod_pocketDim/core/DimLink.java index cc7ca37..8c11bb7 100644 --- a/StevenDimDoors/mod_pocketDim/core/DimLink.java +++ b/StevenDimDoors/mod_pocketDim/core/DimLink.java @@ -31,7 +31,7 @@ public abstract class DimLink protected DimLink(Point4D source, int linkType, int orientation) { - if (linkType < LinkTypes.ENUM_MIN || linkType > LinkTypes.ENUM_MAX && linkType != LinkTypes.CLIENT_SIDE) + if ((linkType < LinkTypes.ENUM_MIN || linkType > LinkTypes.ENUM_MAX) && linkType != LinkTypes.CLIENT_SIDE) { throw new IllegalArgumentException("The specified link type is invalid."); } diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index ac06ed5..33d12df 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -267,7 +267,10 @@ public abstract class NewDimData link.overwrite(linkType,orientation); } //Link created! - linkWatcher.onCreated(link.source); + if(linkType!=LinkTypes.CLIENT_SIDE) + { + linkWatcher.onCreated(link.source); + } return link; } diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index da43bec..1272ecd 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -386,7 +386,7 @@ public class PocketManager private static NewDimData registerClientDimension(int dimensionID, int rootID) { - // No need to raise events here since this code should only run on the client side + // No need to raise events heres since this code should only run on the client side // getDimensionData() always handles root dimensions properly, even if the weren't defined before // SenseiKiwi: I'm a little worried about how getDimensionData will raise @@ -408,6 +408,12 @@ public class PocketManager { dimension = root; } + if(dimension.isPocketDimension()) + { + //Im registering pocket dims here. I *think* we can assume that if its a pocket and we are + //registering its dim data, we also need to register it with forge. + DimensionManager.registerDimension(dimensionID, mod_pocketDim.properties.PocketProviderID); + } return dimension; } diff --git a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index 9c2145e..b31d809 100644 --- a/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -21,6 +21,8 @@ import cpw.mods.fml.relauncher.SideOnly; public class RenderDimDoor extends TileEntitySpecialRenderer { FloatBuffer field_76908_a = GLAllocation.createDirectFloatBuffer(16); + + public RenderDimDoor() { @@ -78,6 +80,7 @@ public class RenderDimDoor extends TileEntitySpecialRenderer GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); var16 = .5F; } + /** float startY = (float)(+(y + (double)var13)); float ratioY = startY + ActiveRenderInfo.objectY; @@ -93,14 +96,12 @@ public class RenderDimDoor extends TileEntitySpecialRenderer float ratioX = startX + ActiveRenderInfo.objectX; float ratioX2 = startX + var15 + ActiveRenderInfo.objectX; float xConverted = ratioX / ratioX2; - - - - + yConverted += (float)(y + (double)var13); xConverted += (float)(x + (double)var13); zConverted += (float)(z + (double)var13); - + **/ + GL11.glTranslatef( (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F,0, 0.0F); GL11.glTranslatef(0, (float)(Minecraft.getSystemTime() % 200000L) / 200000.0F, 0.0F); @@ -176,7 +177,7 @@ public class RenderDimDoor extends TileEntitySpecialRenderer { var23 = 1.0F; var22 = 1.0F; - yConverted = 1.0F; + //yConverted = 1.0F; } GL11.glColor4d(var21 * var17, var22 * var17, var23 * var17, 1.0F); if(tile.openOrClosed) -- 2.39.5 From 3376c1d77243316573439f04eb95f3443d8f2f44 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Wed, 16 Oct 2013 19:48:45 -0400 Subject: [PATCH 135/544] Fixed network code Everything seems to work fine now --- .../mod_pocketDim/core/PocketManager.java | 15 +++++++++------ .../mod_pocketDimClient/ClientPacketHandler.java | 12 +++++++----- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 1272ecd..2b04529 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -173,12 +173,19 @@ public class PocketManager { return; } - isLoading = true; + dimensionData = new HashMap(); rootDimensions = new ArrayList(); dimensionIDBlackList = new ArrayList(); - + + if(FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + //Shouldnt try to load everything if we are a client + //This was preventing onPacket from loading properly + isLoading=false; + return; + } //Register Limbo DDProperties properties = DDProperties.instance(); registerDimension(properties.LimboDimensionID, null, false, false); @@ -531,10 +538,6 @@ public class PocketManager { throw new IllegalStateException("Pocket dimensions are already loading!"); } - - isLoading = true; - dimensionData = new HashMap(); - // Load compacted client-side dimension data Compactor.readDimensions(input, new DimRegistrationCallback()); diff --git a/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java b/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java index a969a92..3c2a666 100644 --- a/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java +++ b/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java @@ -5,14 +5,17 @@ import java.io.DataInputStream; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; +import net.minecraft.server.integrated.IntegratedServer; import StevenDimDoors.mod_pocketDim.PacketConstants; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; import StevenDimDoors.mod_pocketDim.watcher.IUpdateSource; import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.network.IPacketHandler; import cpw.mods.fml.common.network.Player; +import cpw.mods.fml.relauncher.Side; public class ClientPacketHandler implements IPacketHandler, IUpdateSource { @@ -36,11 +39,10 @@ public class ClientPacketHandler implements IPacketHandler, IUpdateSource { // TODO: Is this even necessary? I'm not convinced we can receive packets from other channels anyway! if (!packet.channel.equals(PacketConstants.CHANNEL_NAME)) - return; - - // If this is a memory connection, then our client is running an integrated server. - // We can tell by checking if packet size is 0. - if (manager.packetSize() == 0) + return; + + //Checking memory connection wasnt working for some reason, but this seems to work fine. + if (FMLCommonHandler.instance().getMinecraftServerInstance() instanceof IntegratedServer) return; try -- 2.39.5 From 9418ed59df5b9e1203780d6400e6197ae697d385 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Thu, 17 Oct 2013 04:00:32 -0400 Subject: [PATCH 136/544] Started packing save data. At least it writes --- StevenDimDoors/mod_pocketDim/Point3D.java | 5 +- .../mod_pocketDim/core/PocketManager.java | 49 +++++++++++++++++- .../mod_pocketDim/saving/DDSaveHandler.java | 3 +- .../saving/DimDataProcessor.java | 46 ++++++++++++++-- .../saving/PackedDungeonData.java | 5 ++ .../mod_pocketDim/saving/PackedLinkData.java | 21 +++++++- .../mod_pocketDim/saving/PackedLinkTail.java | 12 ++++- .../mod_pocketDim/util/Point4D.java | 11 ++++ .../mod_pocketDim/util/gson-2.2.4-sources.jar | Bin 0 -> 127564 bytes .../mod_pocketDim/util/gson-2.2.4.jar | Bin 0 -> 190418 bytes 10 files changed, 144 insertions(+), 8 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/saving/PackedDungeonData.java create mode 100644 StevenDimDoors/mod_pocketDim/util/gson-2.2.4-sources.jar create mode 100644 StevenDimDoors/mod_pocketDim/util/gson-2.2.4.jar diff --git a/StevenDimDoors/mod_pocketDim/Point3D.java b/StevenDimDoors/mod_pocketDim/Point3D.java index f44d0fe..b9c032e 100644 --- a/StevenDimDoors/mod_pocketDim/Point3D.java +++ b/StevenDimDoors/mod_pocketDim/Point3D.java @@ -60,7 +60,10 @@ public class Point3D implements Serializable { { return new Point3D(x, y, z); } - + public int[] toIntArray() + { + return new int[]{x,y,z}; + } public boolean equals(Point3D other) { if (other == null) diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 2b04529..dbc2607 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -6,6 +6,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import cpw.mods.fml.common.FMLCommonHandler; @@ -13,12 +14,15 @@ import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.helpers.Compactor; import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; import StevenDimDoors.mod_pocketDim.saving.DDSaveHandler; import StevenDimDoors.mod_pocketDim.saving.IPackable; import StevenDimDoors.mod_pocketDim.saving.PackedDimData; +import StevenDimDoors.mod_pocketDim.saving.PackedLinkData; +import StevenDimDoors.mod_pocketDim.saving.PackedLinkTail; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; import StevenDimDoors.mod_pocketDim.watcher.IUpdateSource; @@ -89,8 +93,51 @@ public class PocketManager @Override public PackedDimData pack() { + ArrayList ChildIDs = new ArrayList(); + ArrayList Links = new ArrayList(); + ArrayList Tails = new ArrayList(); + //Make a list of children + for(NewDimData data : this.children) + { + ChildIDs.add(data.id); + } + for(DimLink link:this.links()) + { + ArrayList children = new ArrayList(); + Point3D parentPoint = new Point3D(-1,-1,-1); + if(link.parent!=null) + { + parentPoint=link.parent.source.toPoint3D(); + } + + for(DimLink childLink : link.children) + { + children.add(childLink.source().toPoint3D()); + } + PackedLinkTail tail = new PackedLinkTail(link.tail.getDestination(),link.tail.getLinkType()); + Links.add(new PackedLinkData(link.source,parentPoint,tail,link.orientation,children)); + + PackedLinkTail tempTail = new PackedLinkTail(link.tail.getDestination(),link.tail.getLinkType()); + if(Tails.contains(tempTail)) + { + Tails.add(tempTail); + + } + } + int parentID=this.id; + Point3D originPoint=new Point3D(0,0,0); + if(this.parent!=null) + { + parentID = this.parent.id; + } + if(this.origin!=null) + { + originPoint=this.origin.toPoint3D(); + } + return new PackedDimData(this.id, depth, this.packDepth, parentID, this.root().id(), orientation, + isDungeon, isFilled, originPoint, ChildIDs, Links, Tails); // FIXME: IMPLEMENTATION PLZTHX - return null; + //I tried } } diff --git a/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java b/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java index fe63994..445996c 100644 --- a/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java +++ b/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java @@ -75,6 +75,7 @@ public class DDSaveHandler String basePath = DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/data/"; File basePathFile = new File(basePath); Files.createParentDirs(basePathFile); + basePathFile.mkdir(); basePathFile = null; basePath += "dim_"; @@ -101,7 +102,7 @@ public class DDSaveHandler catch (Exception e) { System.err.println("Could not save data for dimension #" + dimension.name() + ". The following error occurred:"); - printException(e, false); + printException(e, true); return false; } } diff --git a/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java b/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java index 6102182..4c0c66b 100644 --- a/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java +++ b/StevenDimDoors/mod_pocketDim/saving/DimDataProcessor.java @@ -1,19 +1,47 @@ package StevenDimDoors.mod_pocketDim.saving; +import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import scala.Char; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; + +import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.util.BaseConfigurationProcessor; import StevenDimDoors.mod_pocketDim.util.ConfigurationProcessingException; +import StevenDimDoors.mod_pocketDim.util.Point4D; public class DimDataProcessor extends BaseConfigurationProcessor { + private static final String dimID = "DIM_ID"; + private static final String depth = "DEPTH"; + private static final String children = "CHILDREN_DIM_IDS"; + private static final String linkTails = "LINK_TAILS"; + private static final String filled = "IS_FILLED"; + private static final String isDungeon = "IS_DUNGEON"; + private static final String orientation = "ORIENTATION"; + private static final String parentID = "PARENT_DIM_ID"; + private static final String rootID = "ROOT_DIM_ID"; + private static final String packDepth = "PACK_DEPTH"; + private static final String links = "LINKS"; + private static final String origin = "ORIGIN_POINT"; + @Override public PackedDimData readFromStream(InputStream inputStream) throws ConfigurationProcessingException - { - // TODO Auto-generated method stub + { return null; } @@ -21,8 +49,20 @@ public class DimDataProcessor extends BaseConfigurationProcessor public void writeToStream(OutputStream outputStream, PackedDimData data) throws ConfigurationProcessingException { + GsonBuilder gsonBuilder = new GsonBuilder(); + Gson gson = gsonBuilder.setPrettyPrinting().create(); + + try + { + outputStream.write(gson.toJson(data).getBytes("UTF-8")); + outputStream.close(); + } + catch (IOException e) + { + // TODO Auto-generated catch block + throw new ConfigurationProcessingException(); + } // TODO Auto-generated method stub } - } diff --git a/StevenDimDoors/mod_pocketDim/saving/PackedDungeonData.java b/StevenDimDoors/mod_pocketDim/saving/PackedDungeonData.java new file mode 100644 index 0000000..f997e85 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/saving/PackedDungeonData.java @@ -0,0 +1,5 @@ +package StevenDimDoors.mod_pocketDim.saving; + +public class PackedDungeonData { + +} diff --git a/StevenDimDoors/mod_pocketDim/saving/PackedLinkData.java b/StevenDimDoors/mod_pocketDim/saving/PackedLinkData.java index f82e74a..c1a81e0 100644 --- a/StevenDimDoors/mod_pocketDim/saving/PackedLinkData.java +++ b/StevenDimDoors/mod_pocketDim/saving/PackedLinkData.java @@ -1,6 +1,25 @@ package StevenDimDoors.mod_pocketDim.saving; +import java.util.List; + +import StevenDimDoors.mod_pocketDim.Point3D; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.util.Point4D; + public class PackedLinkData { - + public final Point4D source; + public final Point3D parent; + public final PackedLinkTail tail; + public final int orientation; + public final List children; + + public PackedLinkData(Point4D source, Point3D parent, PackedLinkTail tail, int orientation, List children) + { + this.source=source; + this.parent=parent; + this.tail=tail; + this.orientation=orientation; + this.children=children; + } } diff --git a/StevenDimDoors/mod_pocketDim/saving/PackedLinkTail.java b/StevenDimDoors/mod_pocketDim/saving/PackedLinkTail.java index c5a1bb7..64c2466 100644 --- a/StevenDimDoors/mod_pocketDim/saving/PackedLinkTail.java +++ b/StevenDimDoors/mod_pocketDim/saving/PackedLinkTail.java @@ -1,6 +1,16 @@ package StevenDimDoors.mod_pocketDim.saving; +import StevenDimDoors.mod_pocketDim.util.Point4D; + public class PackedLinkTail { - + public final Point4D destination; + public final int linkType; + + public PackedLinkTail(Point4D destination, int linkType) + { + this.destination=destination; + this.linkType=linkType; + } + } diff --git a/StevenDimDoors/mod_pocketDim/util/Point4D.java b/StevenDimDoors/mod_pocketDim/util/Point4D.java index 2b41eb5..2b6c4c0 100644 --- a/StevenDimDoors/mod_pocketDim/util/Point4D.java +++ b/StevenDimDoors/mod_pocketDim/util/Point4D.java @@ -4,9 +4,12 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import StevenDimDoors.mod_pocketDim.Point3D; + public final class Point4D implements Comparable { + private final int x; private final int y; private final int z; @@ -136,6 +139,14 @@ public final class Point4D implements Comparable return equals((Point4D) obj); } + public Point3D toPoint3D() + { + return new Point3D(this.x,this.y,this.z); + } + public int[] toIntArray() + { + return new int[]{x,y,z,dimension}; + } public boolean equals(Point4D other) { if (this == other) diff --git a/StevenDimDoors/mod_pocketDim/util/gson-2.2.4-sources.jar b/StevenDimDoors/mod_pocketDim/util/gson-2.2.4-sources.jar new file mode 100644 index 0000000000000000000000000000000000000000..30b13f653e5792dfe19105787826b101039e4fd9 GIT binary patch literal 127564 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%0D8MXgmqob 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

y)d@^y=s9`#39r;>ehppwbYq0U{|$2}4K7 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

-X*@Tz0V@JE<{JVc!OO7(MCcH*%up!yjaDX0y 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 M$1P8rF<>(NAA9kPA^-pY literal 0 HcmV?d00001 -- 2.39.5 From 2f7b713f5e23af24dd48952c852e654b9edb831f Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Thu, 17 Oct 2013 22:43:38 -0400 Subject: [PATCH 137/544] Added custom ambient music to limbo --- .../mod_pocketDim/EventHookContainer.java | 39 +++++++++++- resources/mods/DimDoors/sfx/creeepysound.aup | 57 ------------------ .../sfx/creeepysound_data/e00/d00/e000014d.au | Bin 489540 -> 0 bytes .../sfx/creeepysound_data/e00/d00/e000041b.au | Bin 1044572 -> 0 bytes .../sfx/creeepysound_data/e00/d00/e00006cb.au | Bin 701520 -> 0 bytes .../sfx/creeepysound_data/e00/d00/e0000805.au | Bin 701520 -> 0 bytes .../sfx/creeepysound_data/e00/d00/e0000a54.au | Bin 1044572 -> 0 bytes .../sfx/creeepysound_data/e00/d00/e0000d4e.au | Bin 1044572 -> 0 bytes .../sfx/creeepysound_data/e00/d00/e0000f7b.au | Bin 1044572 -> 0 bytes .../sfx/creeepysound_data/e00/d00/e0000fde.au | Bin 489540 -> 0 bytes resources/mods/DimDoors/sfx/creepy.ogg | Bin 0 -> 1679071 bytes 11 files changed, 36 insertions(+), 60 deletions(-) delete mode 100644 resources/mods/DimDoors/sfx/creeepysound.aup delete mode 100644 resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e000014d.au delete mode 100644 resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e000041b.au delete mode 100644 resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e00006cb.au delete mode 100644 resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e0000805.au delete mode 100644 resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e0000a54.au delete mode 100644 resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e0000d4e.au delete mode 100644 resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e0000f7b.au delete mode 100644 resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e0000fde.au create mode 100644 resources/mods/DimDoors/sfx/creepy.ogg diff --git a/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 4035606..37201ea 100644 --- a/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -1,8 +1,14 @@ package StevenDimDoors.mod_pocketDim; +import paulscode.sound.SoundSystem; +import net.minecraft.client.audio.SoundPool; +import net.minecraft.client.audio.SoundPoolEntry; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.World; +import net.minecraftforge.client.event.sound.PlayBackgroundMusicEvent; +import net.minecraftforge.client.event.sound.PlaySoundEffectEvent; import net.minecraftforge.client.event.sound.SoundLoadEvent; import net.minecraftforge.event.EventPriority; import net.minecraftforge.event.ForgeSubscribe; @@ -15,6 +21,7 @@ import StevenDimDoors.mod_pocketDim.ticking.RiftRegenerator; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.world.LimboProvider; import StevenDimDoors.mod_pocketDim.world.PocketProvider; +import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -39,8 +46,18 @@ public class EventHookContainer event.manager.soundPoolSounds.addSound("mods/DimDoors/sfx/riftEnd.ogg", (mod_pocketDim.class.getResource("/mods/DimDoors/sfx/riftEnd.ogg"))); event.manager.soundPoolSounds.addSound("mods/DimDoors/sfx/riftClose.ogg", (mod_pocketDim.class.getResource("/mods/DimDoors/sfx/riftClose.ogg"))); event.manager.soundPoolSounds.addSound("mods/DimDoors/sfx/riftDoor.ogg", (mod_pocketDim.class.getResource("/mods/DimDoors/sfx/riftDoor.ogg"))); - } + event.manager.soundPoolMusic.addSound("mods/DimDoors/sfx/creepy.ogg", (mod_pocketDim.class.getResource("/mods/DimDoors/sfx/creepy.ogg"))); + } + @SideOnly(Side.CLIENT) + @ForgeSubscribe + public void onSoundEffectResult(PlayBackgroundMusicEvent event) + { + if (FMLClientHandler.instance().getClient().thePlayer.worldObj.provider.dimensionId==mod_pocketDim.properties.LimboDimensionID); + { + this.playMusicForDim(FMLClientHandler.instance().getClient().thePlayer.worldObj); + } + } @ForgeSubscribe public void onWorldLoad(WorldEvent.Load event) { @@ -56,6 +73,8 @@ public class EventHookContainer { RiftRegenerator.regenerateRiftsInAllWorlds(); } + + this.playMusicForDim(event.world); } @ForgeSubscribe @@ -63,8 +82,6 @@ public class EventHookContainer { event.setCanceled(event.entity.worldObj.provider.dimensionId == properties.LimboDimensionID); } - - @ForgeSubscribe(priority=EventPriority.HIGHEST) public boolean LivingDeathEvent(LivingDeathEvent event) { @@ -96,4 +113,20 @@ public class EventHookContainer PocketManager.save(); } } + + public void playMusicForDim(World world) + { + if(world.isRemote&&world.provider instanceof LimboProvider) + { + SoundSystem sndSystem = FMLClientHandler.instance().getClient().sndManager.sndSystem; + sndSystem.stop("BgMusic"); + SoundPoolEntry soundPoolEntry = FMLClientHandler.instance().getClient().sndManager.soundPoolMusic.getRandomSoundFromSoundPool("mods.DimDoors.sfx.creepy"); + sndSystem.backgroundMusic("LimboMusic", soundPoolEntry.soundUrl, soundPoolEntry.soundName, false); + sndSystem.play("LimboMusic"); + } + else if(world.isRemote && !(world.provider instanceof LimboProvider)) + { + FMLClientHandler.instance().getClient().sndManager.sndSystem.stop("LimboMusic"); + } + } } \ No newline at end of file diff --git a/resources/mods/DimDoors/sfx/creeepysound.aup b/resources/mods/DimDoors/sfx/creeepysound.aup deleted file mode 100644 index ed4281f..0000000 --- a/resources/mods/DimDoors/sfx/creeepysound.aup +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e000014d.au b/resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e000014d.au deleted file mode 100644 index fee6c0508a2629067379392e49775168de53f82d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489540 zcmeFVJ&11Y+upUc2$q%-8!JmO5^yyN(GWW!AcBfuOpL}vgTxqOB6*DZ`i)Tt1T3`) z*coIs7Gfy~RzdIsM6goCB55M8_iyg?n>pr~^IB`&v!6GDc)>Ntc^+TaJ+o);|MR|o z;Gh3vf5-3sTYmib&Bys|KYsl9-T&E-AAiFGf7c)X1HbS0|Dk{JPyT&>#7ye#h_lyMFxmWq;i5zx|zm`tNrBmw)>|^O%3U@qgie{5OvI$M%o@SAXz*{%8Nv zAA6tww*TbcexHBupZKHi^FRIP{+;(Z`M>$E{j2Z%|I?p%pYz@S z>%aNq@BE+nz5m?%oc(|PH~zrE|FZpu|NEbO_hkQ{`al1*cRoEoe*C$2{_puq|JM8b zH~!}QIscFU?O%WQ{KdcG&+W(d_x^={;hoQ)VSa|+{-^)lcTawXd@Fwr`Mu}&oAY1$ zzyFo@&h+Q}cmAG#^4*jE?8!gh|M{=}sdxXM{qKI`ea@d@dj9f%{*S+V^3OW|9Mhk_ zKgnl*dh%zIKmXtOegD||yZQN7zhlquo!|c-TYk>`z51Ph_0PU{=ATjiS?A}>x6+^U zZ~M#tzikL`E;!GG`lt^E1q??ZmJ^YrAOSN{FYxAODn&*#to{r}K=fBLgC z|9qdn1JB=|{J!%0%|FNdnPkt$&-Rxs|4qn0$NaPS=>KKQzZd!UEB{>bd(6+X`po%m z{_g$w@lU+}eDd!|{yU#P+x+?GpKt#AmOtD4JDZ{msvr zp6tn=bI$o0KK|@}Z22?H&yary^WA(af3}&;{`~hX|6KBSGPBvAKj-}Wl7B|4zrXos zk>6wfOtLfQ{5z7rllj^5--`Tx^E2n~O#b}y&n|x_^S{&nrT_FldjEGRznAA{d;a}e z{S4Ee|92AN@bJ{QUXnp1+?T|2y)_mOc5s%%A`Be|P1(`FozhzKmLpV@cZA9 z{G9*mKltyz^ZEBZzxV(0Z~YJ6J;~==$>;BR{(Z^MpKpEqJO9g;Kez13-;MnI`E$t5 zd^hL(epf%+{5LRvAJU(l`R`A9^3OECul$_J=g;Tk`}$>Dedg@X&y#chZmhnq^yk0l z`Mu=dsqD#rhx2>M&iwp2XZGX!{rr2IZ{@$SAOD;C`M;U-_vHC|`}P06%YR$)Gw1JB z{=LrcC4VPBW#j*Mk)Ds=?H`|hx3fS09ZrA#oyz}a%k1ax<>SAvlFy%c{%>6VZshlv zzn}U0kl$DSx#Z_bKK~udKfC-h%6IekIXm;`oIjKNyP5B1e||6dd6Lh6$MW|)`TRNL z@5v`Veh2dJPJXt`uK4^}Xhx{2nzxU_g zul)O)pFclC{`;1HzUj&A$LIX~-$Lon-{Jf_l0TpPeMoFMc6`p?{LMe}XCC)A zAOF9z$N!)C|DXTA_H%fAKm7kif336XNkGx(mXZ6G>uRdwb^=`ItKL{~(J5rNNU(e~!IeqdXnzNXk+3gt810{dR zztn!v_rPvDz?^MK&RGpiZa)M$aq{a`!d!PERKF_4z>Fu}3^i9w74m$iwqpy#g*!p+({0vv!>SDerw^yx}|hW9I%=9p4do$64&R_a+{@oS2r0OMN>QQLXpp(Y8PEA+rmvp#boe9qHuR@A>sJP=M^ zMAjq1aqy(?jjS)JJ2zHjT+QsGdjGR@p5BRDJo84kA9CVW9e2FjBkau{xU-Y`er6mr zvtnCTeEN9Pn|#jbd0zET+3rkF&#!np>wea;JxpBBYE}o+vp;rjp5DDn4_kWK^OzG;yP7+b z`#yw|(<=`4cPc&3BBs^+UT_S1d0S_vEBo4$TF&_P!`yuD-MQN7vvcK{cynj(cCTKM z-khg*l5218dRP2j@3C`VJ!ZP^tf#%~_L$oozJYd$XB8_?zMnH)WV~nHXBv4;pM^KyzI%=IwKbluwzX6Zd0CT~5!0=}+A(dV6x$2PU6gIqMN8ExEI~J9^(w z!f5K9>sac{-t@`o756k<%yy75e-U|?SMOv`&hNotXkYI}UggQ{h6}&bMa3$|JFWGe z`AI{c4&8mo%V(Ed`|s|ne7=$M-QLdhJMN8F{rc0FT+UmXVop!cZ{wMU0lhujgX4N8 zPiJ~JD`uaZIQ6SFu6m~T@wQ)I^SmR6huIzN?BM6%cYY&|FL2G{<$6-jSshHj{K~5i z;<@89bJsul?!2@4(BgAV9cLU`>&dki&%ZowM?yR+nBFDVS$q?h-FWh_C&#=U1~L89 zocYwrue9{NGG|}TcJOAN$)m1zh4}TDO>WZkrM4Ypa{5F)?yq9zeMhvbcX+t%Fr+Sb zNS^>Ly`RKd^ohz>9q63SJ=xd4+BYT7H2rrxdPP6G2%kMUo0+&PE&HAAai_x>bhf(@ zeLKiA|5?v>G~e{|bVu%Z+kduqHh15fP+xbaS5ISl&StyC_OAH!@wPYloYC{V>hCOj zcc!Q3SG=8dUvT0d-cN7NekSviHgTDAeg)~w z-t7pBQ`e-~p(bWtkDPlVv%9`4Jo9ghFquh{L!S=%m4}=jJ96J2B)8AR=^@WOJFEOE zmwx7zk2lfIbUYrq^4!g3=4$RY^so5V@p;w6vyM$u;aLVNxy<%%U3%d5LukHt^H)fp zo#~yp*70mf*1YOC%TRGQch)m?z;$Nw)wl6wH6x~B;?R?4&TD>iSYUUgO-)R#=apy0 zli#Xj^0ucUUsgJ}XSqq6ILqnF(|c-XJ^Jv_(O$Sda$@S8N1M3J-1TI}&gnCx@9u2h z%75pb?zoe|Gx;WN_1WY%hXZ?8PCnm}ZzLy|{;5wc(JYvAdUBrLNPU{=CD+;B@o_zq zt~O!%vu8EaVFr)$)D35kIQgzRri>iDKaQ_h~*W*mrbXNT2g|ly^ z!_#@Eck-CshX>N1b6O`JZVyxMA-#>+K`!_9vZG&l%+WWU=Fj@tYu_p}@v9EIKs-}6 zJDvx9xt!IzBt5Ta?OpXx zJe<7Pee7y?{bcsYt#&+<2FF`=FmoE8><90jXh(8)X5Ye_^POyaem0+_}ho z&ggm?_1r%P=ANdD-IxGH@=~(QVG&%b6tTN4$OO8Fy zN=qI;J6W!$XFQz7C;Ra=bFyaGohM)FXEU0|KKDl6$+z^2?Po{xs_(~OPE>E4bUW}) zdUv>IPEI`QIn!31WX!ERyshWzbEMBcIA%35Ic5$TbMEruq@(3A568S6V)N>Uyae-U zuuDvhxih&>nTg9x_n+;VTg{p0Z7xTAZlAx>#qBfk?b{!rZg z=#xi2H92~m#eFKj$=RWuozpxV@1zdLnYgF&@l}ruT^xDP`zBm`F^A1r>}c}L?t2>- zyZ(i|q+iYPdAMh})bPG~&NA7(>eVCan|kF$yle5AF`X^6J$|OEetly4lVk3)JqT_de9fhvGu}M8JB#UKp7`y- zb2+IygE_w$>&y1oxzm~WiOcMsOU&|ONN?}Mr?%Cee&@{OtPa{KUU8XCul#ll_OUzb z5m)?5r)xSZ-u~3#}1ZppJ{D>7`*9) z>(g2FiJv(AV!ttE@Oa5hGu(!Foc6TFjt5Nbh~EY~46xrhKl3L2z9af(@A7xi{B{J~ zS>?JbJ*}PXtG?vzp18AaG_zv*CoXm06H_~z^^0fTNh6n8=Dj#_aCxRZx$M|7cru%B zKfBsV{8F;FF@vjj%;?1@C#p5#_2euE+9ATVH?^Gc_A%Q&dHv{e&hC1|iH9?%FL9N@ zL$1%{$CF+>`o#1k2hYjOlllA=efvzkZ4-yrqb|y)XEo~uGoN#MnCZ&C)RU)!%MqE= z!=5L7$vda++^Ba#yk7MExXgLdlYGv2$aBP=+3}s7%<7vswZ@f~cT;13^<>`c#HmfV z^56M9WW7^2T=(nW7J>GsO-)Q~HBa7&Tjj6#?P1`0RCtk0bB?WS?IrE_JiX z-JMri-fWE>es%PxM~;kqa(1b?iz{9oocbo7F8fv)a;r0C;JEvNQ&x{!@A4p;r{`Va zfjI~LK4w-jxt`rcGR~qLdvj=<E<}NRyO*&bRIyc(v)z-Qe(sfL z%ARE=zg*{fU-{(s$IuzLSC1KSmCv{E_TKr_r_T1L=S-v5OQyYQpeJWJa@_A8vr{*n zE1sNL-_E^rsp%KdTF<<5qO%?1ehjIvW~}W`FFL!NxE~xi9ejGx^|v=Yt$ksFYScUD4m#73^VE5zPZ_xF zxXgDuu6%U%S!Lu!vdr%EIHPe_N1uo<=T$EG^lyidoL)7tdG|*Bc8cw5-o26B_PFqB zaDCM9e)rgMC(k>RUk=?P=MKt=`rY-qqjTNS**)@L@;U2GR44b{Lr3Rx&$-_~^P=e$ z)4#>yEQa*y`;ej~^{bj^wzD0R4bvY3&=k%VottOPrjA&L9`@vN-qLt7XC`fT^O@rxZ#cF%W`%Q-#MeAm13ZI4nlk$0TYf6a5&cc%FnR-RqMfNG%g7QURNCvM8>2i0@7 zXVT!jWTw-(-1Xbh+NR+I$>3{m@A&fcuD^LR=#xiI-yJ;5>_Igl=I z@;RgDnf&R=IdjZr&pcD6xvRbVdp9q?Njz{hhvk!pj_z^K%*3VsGxN3x^JZ)8@SdFI zz~sqz7`9u2F$%rJY+fm<%aOlEb|#PreYg+KF{!{3M8lx^Q?H#>EcnfT<)ulgtc zER)?+77owUamGy=J$;g!GVOn5r|*@{_TSCk@on|N?_}^yzKN^)Pb>cI6SH2@H@%}S z(v)*IpJ|!Zw|Bu~PcG-dx}?Zub_=Jo7}87Qsy|CsZ@_0hGw_opCz8oIJ9+*?Lp6tsUGug~Dr@wbH z96XbjJTs^9$$s$ejpmv^+rN`p_5B)McI?L^y+gyvAGV(YyBaBl+lO{JQ7?W^YI2SE z&7@zh{qB14Ijh}8bD*=?-ZzE88`AstlH9AaZ-LzXxY+~e!ILMoxa2#fNxd}7Vezer5 zJe)cG?B>+)sWWqOPk&~f&W|_T8_mP#+&=eyW0h&1TypGrR$B7-*~xM}z2o6DCdZr| z?0v}NS^3aCt63dPPx8*Z!_CusYRpro88xx9xtmF3c2DoweCFRGm_BDQY;WU=-ySNL zv+|(nVdmsc&TR8<=EaxvP8K`W^o#Oh`kD2K`rPqw#Gc>8C>2*Pr|XFuRLmd1$#%H zIQf-UweRb8OrWzOU2-Ctv#39@wfzvA&y1errunP`Ke}Da`sMI&dVjL>S373)$=>l~ zp7*(DxzzA-lDpc?yanq^_mup$>H(b*_BZw8%cP|zbyE|k_Or;_`F{8PT5q4d;hW!i zi{7bw;(TX?ci-2?8~KiW_QNIbEbpEf=T|hnyWv83JxVK1z0o|m?;bkrp~E>l<$S|E zJ!&f?bLGF%SKWU-cs?87180S3tM6gOli|>5?;G*>LZ&&j73wG3Cpmq1k~f2{Cv|5q zXLE^LE;UbDbG`4?;VLi6gLb4Qm%g6UpL6=;MKotIxy(-db{NdEJ9qYMC(}8)rjvZm zdXw89B-fJ~9GYDE^f#whU2L9RZr2nDC$BH$acsZ4W_q$KXFV&V%d4k%csLHYy-n*c zdfNf7cGZ!(vzWbb^5UL`i`o1u87o&AIz2hdC8~?5^}ILn*yThlIS-MMB6BCVRl4_* z-`1;Mb&zVmz=uF&wV>wQ8%&oD@t2Nps@196Up59Z-`K&X2f4%4a{OsPctrHg^vQuMp8QJ7{Mk$g zmy_7Ny+0GrOlr)V;(_X-a_-Ez>j9h3oq0?1#f*Q-z~#wKX7u*xm&fOUV^@rbkXhW6m8ekD8cT&*|9?QPisk-We@tc65%|^R#yd9!~P~*_pE*@hy0G z^~1Fem%6ives%DA@$ScE&Ytw3O$QJ8KFv*CaGv(VPn`b7m6tbCW509KmwB_zrC(2C z`_<${dYtvZdDN0)me)67X3qR-;?&jLE8fn!XGhNH+i~@>U!C;O$K}YoKiTKkiA()w zX5a0O=}o*7KV|I|@t94{teU&H;??Pz`p}!Fi`%Dtt-DV?IPQL+-b6iey~~4WtHT?f zoaGX;XY!`b>@L#fEXw6B2XfT*$ISJ>=PnP2#!+W?hF2Hi(Dfvb=4l<@mDlWqtL)^3 zo?rdxT~Wtk=Z?S`>{+K(iPu2yPUWOM`xeRsF`)AqtC>(=WNe>zc=O5kDi&- znnz2WY;vt_7>09)UwNo&jos^WdgQ@fu~2W(<9g-gjrOd#@qx&b`|ja0^yi=}J6m^8 z&(-^6uKZUz9d}OqdcV`5$L#(foLg%iT~6E$9VlP)`>NhKckw-NF--pLB7=;leZ5<= z;#I~w=u=uh9BoSsJe_39Dr>`d?a6IUKP@#dUaXLV72!hIm+#KCflB7di2tG3=tep|14C;d+E z^cFd@qQ2eX0`K^`+sfv1&l&%2=s@?zvVB?gr;uFETbg1{Ptb4UnT7%VJD$$;{`UCI zFLyqJRogL$^3(fxR=(!xf!mMEJb51UmqSKBbDxRRkC!>mU=G4h`7GHDvMLe8DXL&osw?Jgv z#mvir0TUiZ=&tvE&@|dyjo9 z9~nJ8lewECyE@sQ9=az@4xPg;_eLCF)RXHub7%fD&CWX>y`t}f&e@Z*891+;IQi8Y z_3j}!gU%s;8qv3dIrH127j*tqSc|!$zhv8&JMVBg^6pRe^UqQbTKn{ilRk0!vs-S3 zQ;(e3*%hC@{jqqHKb!U6>F*x09PzoGe|^P!-t<}Z^MlSfa{iq7*wV8{!GKenLPVbdezlAyH zpx@tEWt%rkpPefYUOky}2F<2#;_%|}viHf3)Xc2(JMJxOu6)Vk-GX56eClC+AKU*fMAzh@H@hbfUFpdg?UDI~9QV7& z?6xS77qyY&=E;5Xr`OpYQC`eWxkf!=>T+UgTQ0{uac#Tf=?pucfy)t}+x#{CcQbc= zTRr)m&tt`%tX@A~zb~IY=JcJtlRjttVs}rwS&&OsZt|ml=aB1c?^_jL>1F@a-(4$j zzL9hK;a3{I)N;;_oVzbG&W)L8R&U;YrNeW#1NFaxc7SJR(wlP!o$1VZdP7}o5B#KU z51z}J^r!OtdgW6WGrQ`R7s)!CcSqx{4nD6Q_SIQw+Yu1;xg$G^zR|n9sJ=@qu=U(? zCcZ5?uIS9snZ2pegC>_gG>)98_o;q-UGY;#a?F|a9r)GJ-(GmGJaZp3_0;53bKcSz z^NQDEeznVs`lntsy^}|-y=2tPC#r$Y>ba}$iUXz}U+#nbP1hq%J~;ZO)BITv-uBbE z%1r!}&(B2$&y-CcvmUW^_dEK2nA0m~kGSI1#XG)y&)gMurr&XIyz14TzT|S=(iC%g zf_@v%G`&}zE1jMz&*ozTX7HT|2 z?$z11KrZibIqV#FW;td~YENeUm2BpjGoQ09`o+nkS1plT?(KEIi+16sn*-;}zM9dl z4qbWZvQJHvProxBb^T~?^6Yuw)2lZ5+ouO?%^px+a>=WU?d$!_H)+lF-u=_QAEd~d zJ6>O_aawZ**>k^fjDuWLb0s8{aM(5jnnU4 z^|s&7ATMT*vq&a=&dJ+5;nbrKEp_=u-_*}O<Sn~|-S@}P z9yKsEyq@IY*wNFIvz`f)W6oU8Xq@c{pL_@P2I|Q%zsj5M&tQ+JFLBcBQ4=$l^Q7C6 zzB}_-ZhD7KGO0O>=pH$C=G^r(wx@Uf$?pf5929%s!}>nyf;KYHc$iSlCez3bZ@ z4%8=>Jg(i*CUiYwdtTYM!%SDs-QioHb9-{9i~HS^S?B#x=1gzzXK!ULea+L!Jv*Ig zFZ#+eX?jy*-n;lG_UR4l@*RC>&Z7Rr*7ie8o;i0t*)z?VS?SrOKRI%}+oj)qLbD>C zJGty4%RS4bhIcyYLC<}aY2VbVhmP!opL*p)e4ft3CpTrxeh2CMH9GS%_UAa$(tFpJ z89qC=&&0K-_q*?>Z+b@^%(>sYyW63EcL+=_XDusk({SMA)1vpxqxV(JPT#S^Jw0j@ zhek$CG$XEf_5U}J&&}bpIlF^>{2oO0+;djn9s@TIzUERto5^~dMfmJZ-VAzrwTY!9-O?Gw(dZixXduqWuG{C^s4CCV}=CQi-Fl?UIJpw(@3v%jKJMzLWFMbeqk-{&;xKd}`+C^2&j5eLAZS-+s82-`tc@ zOT?Gnp4qnuuPFZ_1BL{Xq zwYxJN_9X6AkbBP9a?jZcIk9;=TAzG+Q`=k~m~+tYqidfRGTn8+hGv(>w$Mh%ULgo&yzD;@2igF$(R%A(gQlfb0*(Y z`TR9=nfdHmZ)R3K=z3Ny=;lSdIkV$CJMG7tT+ZEtw$iuK*k3(U_r!H?dU8&mytq9? zXMJ!Uwf4#D6O$+7Nj_)v-p!;&7Z)$cVeSK$9`y82neH%S&Rt*fa_!+A-_q}%nTbpN zXJ+5+4&H2y9p00(9C*dk)8{JF{@k;Vo>kW>ll-eQZ*zGQ>;uoymaC~X*Y**VKS*`~@cX>E8jygMY?&$EGmHt#ezGj};ygW{4@gx1( zw90Q)llv-Dk#Dd0)@r8Q&jC80JxUk%JBR+vu4a5cd$OA@IR1<=*d}*9QV7&?9@%?iYI5*w|kcd zue9#lGJMR*G3Va)mA2x|x1PK6e!LA%2cKT`-sKZled)=${k^Amn%lpHskM;a{w&oK zb58%3OU!rpm4}*@mVD3bdwhl*)0_M>UwL_>Ju7bNPmbKrocA8BJ41Tlv zdzYW^uJ^8QdZRhJ_J`oS!YQk_wchcycR#r1Gut_LvU%9i^7NjXGoCv>{Aa%GIrI5$ z<9-ll*?gn(x!aZ8S+71ljrPgocNV*&cYPpt*YEdxY`;rSJ= z`8^Fc=g#y#)vP>Qm~#&L%V%EsGQ*rc=KU~;$NFu^{w$Ff)q0=!U2=g}`XV;ce4f>3 zTD=3m(#A&)vft@_%Hq+t$DCexj`-ZxU(>f8HaT`@B=y7g4(WL(j{$9!(|eZ3GwIFs zZnwBO44By~-%8I8pU|6H&iX|B=v-#5N1mNI4?A9NYxv-r$IG2gd-Y6yyc2Jxapg^( zPVVZYcjY@+!bDBQqTFUH+}oV$PVVwqmCx0uXlL- zXXi{;6X|i@j#78ukau4pxxD(i51!76H=`%_JF}gj^A^FJq4k92ZG>NG7*fl5rCs$+ zx$f07@o1bYZF_jQd3w(d=G@8YZ{AMy$pg2_m~FJDd3L*2IAtd8?2XBv9B=1M&DqbF zdvj{w9qr7MT~~eWUG2UHdb4|rV9r6mkL1(C&dt+1+Qen%XXdTKz9puNH~E~?mpmDd zd~&V1H%=KnE3Ntc5#aushc~$Nf~%7nbMBd0@p@MJzUb7C?vZ0>c2AF9QO|0h__IFz z-D!u|dHh~IiRov?I~_Y#`jknob9;)%e8-cqsRMn*n^kXAzrt-{urK9_Q(yI+uM5v_FRq`t}~Nwh<>8XOnsk>v9y=n9&MY$ z0^6T9H8C}Mxt=?o^phjwwdYmz-R`z$#ZT|rMYeOP*)7^Nc_z-Bn4X?<$G;gWloyrR z<-|QWeTkWY&m7si2k$F>dsms{H_Zp8R?_>r@~rsx;4t+2gXN9V#~af->LQ_>-%4Ki zVix4?LpHgb2kVj|ca`0av_5fF+IsHWDs=Kj<}(gIX>uZ&oUSnB#G7B};BD?JC*RJTJ>4mv-kh)W^seT+9V_2<6pQ)Jl!23X-VRQl4rerO9yK^; zF}ch*>l53*9Y%F`=$sGREih;2t^<)bM(8PA>VJcTEGfmbtXAcszE9 za_*Ux%Wh{i{qE}UTzTf{sHX^=@A9HLy?xZ=Cy$z55kCDnn^_^= z?#aD#*?s2ATxODYM(3{jn#a33?Oplgr>;94cvjiW)rYHHU*)B2t&AIP~Nn}M+XGcpN zu1{vt3x9RYX6`C8>Eyek_br00h4en&@w}UB@GX!_7dMYPxP`#37WAjF^~_^TJ!ebK z{CY(5iR5!{ulrrJ3qReQLZ(6O4B zv#jQoKY8c=40ek864gYs{V>Rhnd{k1WBaal^7-Cs&K}=PF6Wg_xBV**J$mfyJ^9vp zw{PO@0ry-UGk$MLZ)^IQ@p8oH_R-P2`W1dBw_lX5^c8QNI_Oms^|&W)$I_nO&EPj9 zH=%hE4|8Un)1wdknPWE{^ygjmW@hr7>1bEFox8(;XWC$Ye{*`DE_jZZb8>H{_|n>b zXvs6@t|w~V$MiXi@1|pb--Fbb9CGhQ@S91_d4-)>`Q&+@dzNdBed6o{Q{PjlIejI) zuX;oUdy|(F^@8b>pExz~jz=$upS!c1ob1gxBkl-90^-on|su{wsaz z{jK2gbMU!2aLy}yGcLZ6_v9=`r@eCcCSH9)JIMA)P9L7+&7h}8UN4xldLnu5bS8e{ zGP~yzv%DD6+xzgTZE0A{naOP0gCyy-)SyYxC@K`(YDVnR7oZr=Wj3T<(V8)!=g0bB6SBJvqxIey2b4-S7TNuNivH z$%*-<^O>dxq%*y}<4K*}v*Ojo>?E_w$&2PeIWf7(mt4-7PkuG)-&Tg;^#=86ywX3J zZ!D|Nw0Z}ArLDU77-!mzkNL%tpW&)oUCc7MJ;}!`56zsr9LQ;He{kHNIo(MYoV?g? z>_MbI=(iD{-kcHLw>RhWi=29E?07)6MzS3F=l1#QUOM}obJlq$pPpZ{%g=A8JMY2C z=lieBnRjlaPp-T7CJwKDaPo8vpPBT_wclMYzMR!TH13^ahu+@py6U^q?LR|1d~<)8 zxp{KOH=XoMIviQ^iJk4;J~Qs1oS52bKI=!L%f9x?uey^b%e~5^o^y6N)5l349J?BN zo)w>-obgYYEllZ2FCMO(NR&BuxIAcE630Ao*`qF6p$C4N^_dglbJll;`u8xw$&1K( z#E886)0g@*XZNH}oEbiYpF<8mbMAP!dC>22nd`Yb&?l~Q`c~epdf4xr^iACp*S+b< zIeqft_7I)*!ExZ#1Reuebr%3Kl_wZw?>>chIx9ZClZSUEK6A_~k32nn)b8@>oBC3B<_+IjWzwV9{FH&?;+=G|dYC!A zKiTWAyy3~2zCOvNw|(yVMfpbb_T-*(X5sfCn;bJoZ|?GMhQ}AQ)>C6vcis*|@(1(P)-#Zl8(6Lyns#_s*r38D=!^q{(%se0DqIb=C*M=V?#txjU0#2B(9@ z&C~moow)3{nqSSge~SlNQ-b%x>6C zT+axInX4VU`Sj+TmC5J4r|B`LhLk&V`|-%7R}MY-l^>pi*DP~qbJr)5=cMP! zeExc+e|FCs9sRC5=scxcKl7T$vmJ}52ExgUdm1ig^JL5uxzn-oWKYi1M^P6iPjczY zIX%CXbHCa9^!7fH!CmQLy&U;G(`Vw1)jMa}*@M$NXZ|ZKKi^fix|rQ^dy>Pf59!Q% zrkQO|cCS3}dAcJt=I%_L>{VX>s%OgUP0d-&UJwqQ%gp77&u#vye;;JH=JjJ|&eLAC z_QB(wcr%SFZ}N0YeO0+ZlPi zsWYSN5%r4rJb2hw-ie>M>~l`!4G(!cL^M3y#_taLJ>2GMDq@hm+T952%)$^O>dxY+vr%L+5hj-Jk5o?^t@6 z@tI-obJo+|-0c)oJDYt^Z10LsA8&f)JBOY}fBVw2n(Y!-zT{u=W-jNcV>=9>Gt{f| z{>X4SX5F9c^J{axr}x#_cRM$|fp_A~+LazTJo3qzRdW|tygHbD_`T_2Uh(aFW#?@! z-K(QVy?1$W)s=kC<`Q|sbLGYNGk)^Z8*ptS*xG%DsYQ?;byg zxXP{c6>pC^=v5Q-xF>G8)O@9-o^#cF`rX(MvHiWDb)-h0oz3UovpL?K^7vOgneUvl zx4Lh78!q2wpM2fbyBRU{i9?6q4kNSopxyu-es%6>lZRfer#Af?PyK~Z)Z_78*DR-y8J!Zk2+vmPJyolzeHd!R%dxX+E&3eVoN7eh7J?Vd?!?G#U{dyn(Q$Rsv&!iauR7K7 z+bNejI=2s=^tGP*&-nW7?ow}__ftdHBj#sJfATBu|CIieY&h^@&$L^!B*#RjyZFU)s>r zCq6ajEsSzt@?jZA{AM+*_NlkMdYY$OPV~L+An#;P?{v2AJISAMbb6-Dl}5&kH~Y+r z>61Id?mEk(d2*HmJHH(qm}iy8GijO6dGfA0@_px3ULDN$l0Ta})9<)9o^_(>PhWC5 zZ)u7-Jwd;XXPVyj^gFGaOT6-Q=bbE_-Mi{ZU(URfyYm(wAUS4k>R9ESK@XZI=j58- z9wOJ1dd})AY;W)6Ca(LoAn>1M(i^c)qaN{-IP~)#mm@NFK7Hs{=d7!Cp+-7 zb2pabB>V__qC^Y^2z0#-P3&6t539RtGDGv^y#el$(wJUrnj=cLpzkd(x zdYJL$4tI6B`^-OeU*)F^Z^(=EulY&CgFc-VKY5euckB_< z>pW@psEKAKG?U2eK4m8E%)d>6cw?1a@zmLQ$K&&6+^6is=?A+bwX^vwr^egPXI(3e zyeDV4S9;Bgb~d)|F1FuY9rUV+dfdh2b5?I`&lU#e+(R0F|J&Pp=9%{phEQ zX7Zu0Jd>ukwS6l8CbxQnI^Id$Cnio!)ZR)}}ZRwZiE?8)W4UF6ei9~q7~d7h5X z@5+gpW6oXAcJQDleaxxp0n;Zh*BNTO){>6`jecc$x3-yM&gyv@DJ;PIGAE;Z-Id?V-f zv1j*{H~pELdeb}U=6N&Ug=YuzB*)Cb~i9MaNud|S95pt{%U@U zz^V)08}?6JXSXySGoFb@PCn-&`Ud1ZIm;!s-aFoj%Z}B&%1u1nRz;JqEZ_cY_Vk9K2tWUl;I`l|aC{>~fiVV7&{w^zD6{+!KkkAa&9UvsIS&15~!qP#fq+aaQ* z?wq`wed6{QxYL>V=6c_!q6a50rp=Dj;BrrY&MOajjyU<$#Ao9AtA0DhPB!n}XbxUY zE>Ueua+uN6lk;Bw)Jl5mXg?mg%*thloS6Q}htAcHCo}RQIww6(=JVG{pSaJd&l~>z zGxfg1x0cq{&%9d%oyCyezUSumG+fMNxt-~Ks#$sH^W-d-s4k|~^WMZ`mlLt%JVch% zo!nOG-b;R4uX-o_PVe*hJMrmT^`$2}@SkPUn;my&^J3?wx6imUt-IZQTa>>-{o5c~4y zL5Azej;pTBI49oCXJ(r1N!-hrd(PN$&v~nkUen8*yIwm$XSCd#H#^~ekeQi$sWX$~ zo}J9#WnX0`e&T#@rEMCHxAcj~dgMej=G@`(sEKNuLtuK;L1(Ob;HDW*p3LTqr}xaI zj!$o5@|o2m*E{@vh-&Vs9hMO?mvi&KA zJC`Hx{$!tDCoXlf$=#h-S>9}o9e#E6r$>&Ad~$ZFxr-}a9h~|mKD)@|#ea45r%!Hw zkj&H3qvk&OlgpXxZb8lM!*<4@rJj59-KBT(wU^zaUzFb;Lv!r#9`(l7+3~D==}({h zU9|tqf5(&gJ(rkQycTs)etQhutF!WSU-xu>?%A1hb~N96de7$lA$rpXcXrHd57WxK z;>mb&mRn(ad(YgS%Q3@sX7UZuPm~$)lNd|Bg}3+4rye!$WBcEQ$Dk&rMlaXX9`*F( zOpc7#o>!4Pr@No*nxEdCID34@J<;6cNp8zf%;|B)%j~WlK2PhZF{j^|3^O<#G;W^W zr|iUKN6+o=J^ho`+!le>l;FK`U~-+^(iroK56k<{G5gWYHl{|VkN)P})y1hJxt#3~ zue8)RLxB?)@|Q9D5OdG2oGsBS;&Ij^%H!dP&+T(gui6UJ=S;72QL*LW=^{cv=j;R|?Ufd4OoepO-?&|0h z(|49jAG2QZtWS>}y~~U0Q>PxVb#}5Mo;>i})lu8Rkh3&g@;UFC7MNM)$uEcQk#nCg z{pxULncI`QJ~2C-C$yt;lXu10vC@<0ojY&Qd8c>snBDW?V@`k0X`OhuJxsla^fqP( zx!m<8$LucR>zRE=7*6w<9qeyZdwMsw;?*Z4vp?>g>|O6wSL!+M(+500-$MFCciwIh zbIzZ_wWKd+Y*QWN+1FY6@4jJ=*j?`E z-sGmaxxKRe7J8oaw}ua{`R&1RJ*hLNrf1?Zr|%4>j`q`er}wU}`|~sOJ7~?3KjS9N zH&fdr1C!GW=Zuv(cl6cK*BSh3X0xX?Jz)Bh|ISPom-o1Na>v6FQ+q0}ea(E%w)l=X zdGxA@@Z{V@_?+4Ap3H4W2+sL#&&rqm?NJledxuXhXEQ6j>(wV_pPY#1yd6gO%-x;I znzwJto@x459{cqrs)5d_PxCgASJ~8arYd*lzQc2G)Rb#)cD2Ty9j)Khe8axXZ4Z*m zN&d-v{fftnI%S$m|F+0vm;Ua-(?@Ueyz$**pE&hQ8k}c)4DKRY&b_0hp0nPK;c?n4 z2jbBuPJT0Jt79HL=as+tRi^p9`q}fOKegobqo=2LePq)oFQ%5Wy7@`NgFc;CdHX?U zd$0CQV`R;!iDCWp4!W5{X7|jV&1e2?5i}#VZN<~a<*YntdYC!6lQY|Vd)YmDMS0Oq zcYUIKq8eFeb$8IKc7}V2_7wfLws-PO+$y)??ND!22i1~me)4P`s6BP&+|#<}a?I`R zeTa+{-BbT)4${ooyLuw_HfF{dbk^_Q+OA>1Gi|WHzu9l#r3;=T=A7J{DZaF}hn8dd zR-W`TXQnmv?9!hczTT&Dk)+*e7nV zeT&M^@tuPF>}UCvFZrzsQY-0w#WVRP?me^^wgumG`tlw5#>}@Lum1Gqte#%E^f~Vi zFCcy9n7vl8bDDp$A7Ax-FrTMA*7W8amQN#|%%=!HX>uZ&oU`N3yxlR~@MI6OySNXW znt1jM`Ljbu_mFAMz0q!X?k*9S93D^da_H%i2jMf5bNkLZ(#zc5-rMi)`=UH(M{08E z>pA^7r%zr)a~6}!>>YlKzRq6lzE1~7d~P3Klh0X4a{EEbiF(oHnEN!Rw|&jCHizdD&+d3h_}JM*<>ZhA+pGr8kwANwAr z-a~pDGfyt}_PXEo&^MjtyD#;ev#T>|6Tj-n44x^gN7N(Alh4z7YSWD0jHqvSD1=w* zOj$pzc+GthURW}pGu>xLT}-dsp5!o}`P7Wjb=9YrZ0FHdoV+-B)xezbuFn1t^y29~ zbCX6^o|)75WY;{p9eVGgZ{g4RZa#fKo1Z>|oqIe4Cm;0f-<`}b+m)De``Pz{6j{lb zV^58JI+;m-_LytVthv_7O`Lrqc{`GG2D7KVD_`>8nR%1Td;Mnac=Du{{4|q2%THbU z#mVDalV%Q2>N%UggPF_joU>=*vjcB>n9#b5lopQqLLB#+S!|SCfNhmS@kC zd}fkoMoT?AayF-*-JF_!d3I*^oOjKE6BqJ(51gH;U(IGj{k`uB2lk%+)RHI4j-H;} zliv;>IGyz7tk?Xc!J&IrvpSfbgR71F^y%b}&- z`_!HOeKH)}%9s2qZZBTv^ma#kT4$FN_k#ncgHJEI{>l4ma;wj?dZYdQnWr2XFS;EQ zXMS@iyu+_Nyw?Y>S1t2uyJBH_Q=0rMuQ@X9S#f3>&6E4?p~D_JoU>ETH{8>sHgWc@ zw5zQ8uYp&efj1@(+!h~T@|Z>eLbf?=k&>oXwG7CnZ3hr9f&>qvrAqy!rq)(=C>eo z4thCuf9G>&Za>9x>6Oce<;3()K6I{rJeiRf(eE5P?&MY;I$Fy;XFro1=!}-LUU74H zptBg#yO!M4n_SN3n(JL(;>xpyDd(Waan+}J(&a?FIiF?KR+-d$_KmHDVb?oIZ`4X( z@%FU7Jp`{F5pVm?w3XM4c-E`u4D+3wx3f@alTR-Dh{!wV9+hunYjkmc=5!}r6XzSg zC(5r7pWdADyKfPeQ*VtO57-)+Joq^Hn7Pb(;8sUJnaKy&JYFtGd~WmmYK`=EzCF3$ z@zTj%ojVXQpR5>`C0)xY*4olbbm7?#w-ByTsOd-!$GpvsananaOd_PG<13uQC%qalW_G zHVwyH`b1Y`aa@YAeM%zV!1z1wG2OrDInoYO;Y^4Qm?H+ebG zdD8cVo?blO~8&fdo9v;NFG zouxnD$i4YJ!p`YI?mZ%Jqq&K1jlH>5Zfha-RYzuWj_5eHw|7G;et#HRgM0O44}INf zU-FqjXXoZgfAY@h&l$aUGa$WO&&r#goXI^hzmVg8_n6%t1ze7pb8_(eahW}Et8=Aw z-!>E_m-AqK`yS}*v&zYf=Gf)L{ougq=u^}04rbO_OyAku{@%~BXzkx3(3%pwS57n| z%5M&Zclecus!4;Jc>OC)9pu=vAM+bId_m81)~^o_xy+gar`hZ)IQ5gazvt}6lljz~ z?GfcOm$UkWlP`NGed?LG>_K-IlbiArXI9)N(+#e3?w~U@IZw4$`jnB|j^V09pSebL zvGr;9O>mmY$ZwCCdv)~V%lRs&?i=FNp=L&0@vYk_s*BCLH>O`rF7ZrD-}YFz)4AJ0 z_NpWG>`gvD!^FdxWo}RI`b4|aBbRukr*}2e(eJv0&QreiGjHa%V-Y9K?z7G_tvl1Z zJ;dDc=8o=x&t1Opj)x3=(~%duPo6Au?)G(N#jo=EMSR`aJ6^cS3-`*ghYYi4)wANw ziFbYa6Z3N<&)izSuDW+;`D==pZ4_9b=9Z8 zd*!FR-qf7c%!6>~TxRZ_lYZtt6Gu09I+GvY_x$`R?ADX&2<<<5>6yeo6hewUsBj=uomR_|fqfbn4 zb86t!l{)iTUR}>w-b1w640GS^%3RLm`qF>Wvkj9lV`4HD~lZ`nM!w zZa}t)u`&OCeJJ);qQ%gQS10H=n>jU-l+P#^`RyUECDHd!}jE)4M$A)pG~UPu?xa^f`-RdmC3g;&zzt zcn<4(hMnA$mD>!xh~_)C>PtWK$_MZ5?rEnh&#E^)ug?93ySVC82fgjp(>(h&kq39C zbr!FF(dymdfzIveJtA+Txrs+pcXn^TyS^>5YT~Mc%<9;ix?Jaa?@aE@^mGPpbyCZm zvpD5j+YeLoX3_P?t0_Eobu+rq6k+t|=#H#yydq zJno`dF}-(YazB&JH}3SL$62Ini^Alk(eu*$-Zy{43bqtFGj8_O0ah2g&7#&+YjYZaavTo_@W_F*naH zw;yJamDzne^t+(nyg7I^xSaKzA$?p=&ds51k~a|l)R$59S9&u~j%$yI2mb2dY2UQ( zCqeNcRcv$#|!2;%THS7bDq5U&egoi=Nmb% z{8#U!o*mhp9%pq?9+caYtQn6!rQCBy-;b;JJ4h!zdHS8yoHK)emBFVsXL{T>mgC5= zGN%T|F0a;zk0bxwK7X}Cmi^8->%5as&#&3#=eN_H_vG^JpPB6wvuone_roNz;?)nL zanFu^Jn2o|d~@vF{V=o+J#mNq9mv}u*?ac1W(G`O^52>1;_@ChPwsd)Vroz2wXd1a z*%sdsCy(AqBPTE7&)NK|NVn%|PTkBI>Ia?m@5j)*I*3PIKfE0C>ZCtCWX)fB)J1x7 z&R%Eq%_VT+>_Sr)jizUs^_dglbDnmyqW)dtfpGFUrw9AwfuD|EG-q-0uQ)UN!ho)4 zVR_R#KV>E^JG%pI;>>j4%8M_x&e_*^<;za8lRrH<=UejPmf|rdH~G-zhxj`+^&sBK zTB4UOE<4yqT|W1m_rn0k0p;F^;fr3RoCoVjnGrShzE?kcp7f`dJbrfc^yJRGJuas) zIcB_`oaM;FPZ}Qd>AcF@4?5FJPwsHNe0_%KFYSR018`vs`L;uTFb< z&wO?#pEI7R;s)9w8tGmB zXYkkTv}=ESAmsKXYi!yPHewY--G{ue#(x=j=*uKj}@MvuI!L%)3IM zTzW$uKO?$+^Jd)9^{C~pPtUAv>2&nF?x1t#=xxG#N(%)Iklx&e)QJ3k|4C-@OkDS`AoNdM*v8*uR&2k#nEKtGncP)_@Q4O59)Y<9aV-h=?ckbl!&V3p@dTb5C!2)bZ+(6Ya?xE(dMBzAKOZ^pIi1_w}a-KK;38 zF7vtDCz9`u)ZFQ?M?^C#PJX#3NOyPL<;XBsIX!RZ@4x8gMO?XaSA*244S)lBf1{^ z)1=O>Pd+npdQy`UQ@h&f>`dP1J#u2}pWMDhmwV@TeEa$)m)X3NCwFwXvdEq3$kc%c zzO{*)`tYq5;_hCh%;c`V!}j)VZpR-l!%j21!_3j+BrhkXMy79lV(M~bZm%ZbNJWCy3w zr>4L8zV-ht^3EsI{`@_y*$eL{2PW6qmB!eg@H-DRlLj~OK8tpE6yD|1u6Nf3ugBbu zQ%@w@`PA9(bl!8)%kC{68c&38t}MSg)H9d6`h@9oUz2genVID5VfPlvr4+0-We-SFqH{y)sK z&F)6i^4#vAd-Ckl=sza$h9gT3%;`HdcXCX6bAPLEJ^9>^(@f`{4Se5chNUQdC*-ATzS0q$)iOr zk$m3m^?r(W;isE{bN?dZ&yEkv2m4Ked`E|}) z#CtXUj{e5%P)p7pH8DNCn~~@ClY4^QlbIDq`q)zo+t-@j)W}@r^tLDO<7MJw;ML^5 zg!rRJUr0aJ&g&O{n9oCvto!8q7w(f@eg`AIulv9H#a%)j^lPu4r#!wX)7*-}+=KpF zGsn)?{=V_#>~45J{O;+`-A;W=V!+JhewCpnz20)-@Z1k-^1-biuHSE!Jf3!oX_`26 z_!UO(_NE@z?^XYukAU9q@W4%;^k3~$_Q~(cPCEFma%k#!Kb_8S`>h9Mc<}dJacUyj z)dj_+cd&j;(f4WRFYmh^y&``1ejk3)Y}4iFAKd+BcJ215KD~CziRRGd*mLCXIP}SD&R!9o-Fs<#fOz$r zH>M`9PaQ;4pZL^r*DD7u$pI(L>|p<*?0k})JaBx+`G9zyKVZ_x^5t-+x9{|_XP#W% zdXr=K7WFkAO`Lc0Q_sX@-APIKlZFPHWA3PdN4HLrY!0G2h3} zJ>}q%&pY>{A2>S)`kU(BZ{gvR`HVErZ%d9lXQ#odxgRf%&&eGQ9|NL!!{wk|jk%pq z9dxHJ_w3*CdJdNp^@}BcooXWFaT?{sll}$hW)%CDzr(8>?@U8xr{RCnd6oCg_T=q; z)O+%xUHIhK8E*Ex<;6)y%P|kfzD}`u^;7-`>=HZdoAP;289CA1-=J^N)372lg`eV711Y;d~4q7^spZ+|ItiuSe@_aLvt7PC$@H+ zqCDuAx!rCK-CgVq{1K$SYuU?wz~R+RNSDD@?mCGp)lN3!=yLm$-ncOBh#K8XQt6SxxXDc?8%PoY~4FOW+x7f%%s6Pldkq(;orPLhHsre zVux41k-U?;9G&*c;cHH9hx*An?jpQC_T;%4bUw7y-IJGlS%1v>as50dt+~E`HvGAc za~1z6KmVQbPkOV9J#TyDM0j^GIdfuq;MOU~bGx6?W9S@R&Xaxe(wV*4gC9*UeQ1oF zsQ0b@`Mcw%4!J116g;POrC`}WD??|$2)XWq^yNY1Qi?r&mBQjxImBPmxYKa^U!`rZbZlk01K9cTam(6r*vAYK=zZy%X(_ z<9;$%olo-V$*!mGXP(^-^L^`q$D+XJ-cBa;7`E+*bxK_ROU1X+AT((_v5IQATe)%6;RL6X6)~ef_-ATF19e9(3B5 zTJHK2$@1O#QqMiR-05S|2gj|3p0nfekn6!eWzsw8^yry%xQQpnpsf?R9k`zCQ5W^< zfp(@g|ph z_n__cRT}p+ySzN;M_zvFnz%KQFE07)PrJOBntN+~>l4v)(yu0_Z?}KqwWBk;TYedQ zVeUcySkprXUryg>6PKBP+1Dn#dvnKUO?t9lJ~?x0-eU5(tAp8>p61a~&kpxHU7zS1 zcR74|*!eyk^W<`$da{4=rq1pS9#dg(dV~62)#%6`_`D6kp)u;*?0KWZJCmLoyLor> z&8vfY*n6(D_Hy%1XYxkxkrP}0mSbKVDyFnnQ=%jrl9jE-O!m zJ#g;XDVG`c^r&5-e(`TQvcG> z63e8o(041ICqD9bK6P>T=ENT-N!DGTHyYpF=uh91oPNDx^W18nd-CjzS|a=LrT)S5 z{04Oi@5a>CdmjmU+ z)IQzmI6e)XesWKGb&)?L1-|2NfTuvk-Czj>=oOJTj zO#GDZES}ExO$KiA!hJIKkYRT|?J*}l$>)3KCQM)Mc>5ji#;G?s{ctOV^S;uxr$^&1lH{UdqAK&E1JMr1O z>q}4W_^&c|?`7Atn-}r8gU1vaIDKMTCN6dNEPMa5R4!=A*W5`F7!K4X(cPF^IFdv@IInOkAbJ?QU$YjS_P`?hFL-|%qjG^7qE zf6CtgpI(K@Kl$)yM|#}R8SnS?=QpX#Png*&|CMI%6OUfe_d)mU$=%GvOM&A3)zI8c0XmEM!ze0OoKO8zwmZ|~u1A#r8{Bokuk)LF(R$3tbMxhRi)gufH}zATAD#Wq zx2gI5zkU1Kx9i>Uo$s4>@-2Hr{Hb%N#?9za6W{9m*GwY2_ni98UisH=`xirIr(xK2 zk}fQN{p#$#IF(W?7 z_uJf^Ul&DJnz5Y+KDEQZiR$Ue9UB?HGxiHQ^UF|#eOI|Ft?I^;H+J)+TaReh)GIe( z=joX^`~MaB4gQWNUG0CGed1g71D<5?OumV$`X49$^@G_T`pEG0sEg>ixBu=oD;`52 zx!ecqNYPC$vv7{PDBpOe9}#%!HG|(hYJRNUsb9pL`;TxP>2qHn?s-v|h z{qE_{T|F^%cM)IiyWGUDBx~PwYHNMhB@epW0Va36Zaz5?ACnq;kDR#LaNf;x%N?gj zTGUEIC`FE!^zkbGkbmDD)*?*kfh4>`D^T4OJ&Kt~0Px9=OmigQ#@6>^B z@=hH2f1OnY{f>8I#eSXoQ%ElNm8RI!6ZF@5rC~t-8_#;>_!#kh{priz^y>rh_{nEZ zZ7G%?y)|xmwMOgYy%X(_<9;$%olo+5`n|sOJw@~WK5z1JpLXs1_KEGwx7FlCc=CJ< zh{ks{`thVU`6;g#pZnyy;>>~W`ukoAgEyq_e}8hjz29h`Z{lmOH@GUOR`mDzi9UIK zPnX7dw|-ozu1*psK*ei5r4G2$Psc8X8K_{|&bT<&PhdczOj zNqqr&ero2t#T~DHxSXh8EcxqH6Csb&C?}ruFSyd}`W4y`SN`2QWF}1x-I3#F_fC&q zQP1v9{)rb)`|L>6lX$!ge2o12`opKru1{V+D5obi_bW|LV`uU{+WflZ#KH2I%C~lV zmhoo3o0;^%@3i!>Prl^bkMeT=>)372lg`eV1=0MHztZf>9Q)A)|8P%lWL@g=6Q?HX z@jlK4zQ6W(@36bum%4A^Im+0#a%Pfq-yykAhWGida;f2El6x~h|E6x{r{jI4Z_?rP zi29~pIZRBM0VhsA~RV##0sEmB);_{-Z)ks5a~ zxqc=+XsZm|?J3Ll>|A#n-0_o6XZPZh0~f?=Y(d^7_Dud!n1OJ2Ri|R~?h)+jsAned_PN%;mn? zShu>EvfPp6YnPY4x?3aDefBhxo$@q5w`l=#SRSyEjrOXL;Z9llMxa=Si2o_V(>t z@|}~{H=!A{tG%;!gGY&dBd5RYqh^OWJMy-txxV#@=z83}^(3~|H(oh0^V6O__X*{E z!yC*!-;htveBw@T&#q6OzvXxl>|hR@<1S9T+M!s8K6%owCpl~2CO&oYJrkEb>Y{l) z@YAl(oCu%0zC`=v^d}D|pSvC~ce_M2Z*b)i`{WJz*J=;BT~^Pp@JXPX6_Il1#&~GOPd-syu5WlaC->&e>JjxNs)>^(hsO`D zGv0dgwxdx`^V};)JA?Z5K3e;(`m^iFp1&vk(;IjvK6C8pA>+s=*P6Fz#(To4uYL6R zwe~N!Z`18Q^`*w1clvico+FI82mQTf&z+Z$e(}3#Sgt&3$1BI@z;lB+$+0td*z=YL znMr>ue{$yauhY=Hdgr~b&@M5(a4U(r(fzRX4tF*9pA5cr8mEjLn0t4t!LL(HZs*6N zPt?1Hp7iUx!|ugzH@lsaPi@M;^<-~r)1Cd(`@2l@Wb^IpZSU2czajg`sEPJ)>t)YR z54hvi^y16$7E|ke=UHLQ9r~5|A346e+4;<_O~HaVLu*R#esW-Pon2{+{RzMG97aRJv-$x!=4^BamwJIcr#ahdj1u6ZzP|; z5ne6#PkzVKobP0JbKc!4pV{2i#nhheciD9o?R@HDzB^^$YI}vS{)7N?YnQ7hJ6`F6HGTEX+A>H{5X=o7b-gee#^~U!ec^rTlp_ zCH-*y4js)+J~(FbzLnp9cV2iuQpfM;H?!;bHoTVXN}k<3c${K#C-nvL$+?>q;q@n{ zKT)5k*0;Qf?kD#NX14dMo}d-<1b#(vLF?x~GplZ|r@;-OUjOcYD0CxP$Hy{aV*apy$5x%j+ec`&su3 z$l+^m-}rL!etG}b{^^!GqDU^NA8YH}&HV_JezbUV+by{9a(JP|mp5AHy#Cr?{aNW_qzK5Fc|2-z} z#L)r2qKvz}sfYD@ZU470bfreGAN;NdkCVF`xm{Mz72aj1H|d++&92U+mV5uU&b7|1 zN7OU*%87cjr@8J;eV1#`bWguw^4)P)zwb)R-u6BDZFnZ%#N}Jlz9w?u^zlZ%Bj1=6 z`b9MT>C0UmC!d@+b->v%>1IVd?A|LvazTBsYWlr3z^lRKt_SR#8hmQ*OG6;q#E0eAYTqy6 zB-E!~wa!kwoJeL>Ftw6?oaEBmH|EwYNM3G2IFqu5T^?Q^=&rx-r7(Cy`u_JP_qRK5^6^{v za=b;g$%~f0+|4DXp1YoPF5=|Tt2QB=JpSA}?>%AW)@guqpE93t+21)e(Ko%*pIq){ z((8_vUik_2iF&dlHFtEz`+a@(-!HTF*^_vs>3ibQEBZd@o;|snnYcU6ZhY?9<1X6w z1kD^_mV;u?J8a)8`tg0emmOEOA7^(UPMjg$$k}=ErPjIZ$opT4HAGQAbN%zR{e1?kT5kK5zZUOXTaBxb&EZ%RN0;`!3V`QT^OG=}#?r{M_j2 z$vgRV`oL+@o4a1~lZFR<8hKGq-}2(&a-x2*<+0VSci# zAk)X5n!AX;n>Dy>^mR)PV3GmH*ZbTZ{*z>ZaH!4e9EoU zNS8ZQ?%e1M=>A1){*dSUo9TXgn(zB>-m;r4eSTM6nVEd(JCE8i1&e#)smS*9_xOGq zc_($XiBl8xc+yIAq9oliFXP5ru$o9SKgSX>fJ(=fyzN_xk@G{B0nf+fg zljBK`9?_nuS5DLmc7DfY=BcMM-28^=cj%pdPx^B=GhzF(*Ik_Q6NmpO0dC^UHlE~i z`c_N+kbI$hV(wx6TG7;7TBQ-gExo0l@xlf+d-9`MlPkFg@E~o#0-s+!VzxkwV@+3zmpOYFKnq2zy z%ZYl`#pb!?4o!h@^7=yFu6XsE*PI%hK6SBk@Nj3gc#dFXU(qFB2zoYfOr$_I8+oV6~o!%lhWqE^dnk#Mc z%T4d7J;nS@x&KSI+3f4zgGXO$+^x~&H~Etz+j;aIH}Uun{=7zfU-Mr)emHW^dvTnT z9`@F_Z<<0D2|1Y|_!~2NG;N*k;>(wqXi<~Qa(1OAC+@n*m=nq97wy55KKUK$ZQS|c+k3n?z8-vf)!K*N9Ny;e zT}}GkMRK`MJv)6>mix)v`F8JRcY1Q)d3cjgFFPZ$r#9_)b~E+pMN3`2(Kny+?fdlh zH}&t6r!V*HPyTobe2l#Jn|=SCxYYk;_ucN8-o!icX3_bWMmVzRfpgHN+41S6(@B5w z=&hmqnZLsB!z*`O1;dvaBV_OLc+-=+J&7xhJ1&8vfVli4R;-pmZQlYDcNrspa87G1gT^7#1fhA#WAyi*rkX5G`v zp7+%oSDM{;?7ZvEjNN9v?{N1J!Pv3SYfA@PPJ@a-xL2~(JW_kx5ey3&rZ+3o*lRF%5HYcCRel_&;$kFePhkKgz zw2rpR>FqrJ%(QOq6U@HO(Z72m`P{o>y4Oi&&Rs2Ya(LLi(=+YqXYYY)e!Vz8Mtont zz4GmYKVIL&o6(c^v}XsMe7i}np60ll!<&5S?&7Xj9z61>{Yt~?J7UGRCw{-J=|bo% z_i=V+3@&H7lgo~k!PlO?l;qRTo_G2`*|Wz!@Tii$mCbnLlM~_Y2G8W910Hm|g#pz{mtxhyxAHz{BHE)aTm$JGs(S~Kbm*rl)(f4R6AZ?KE|B* zX0QM11syr=L-Is!zmhJ`?$HdtJYJYScTt=E*j z>mcLgF1N$>_HAy*qhD#}@9>D8?n84@%Zz$s`ajX|`mUIHdb4}-;7?EPXk`4j|7OTD z-Th|w{PeC}Q(tO!i*`+(?BBm@*Vq1ky?5^<-~Wcx zcJJeve9iSe^{t5LL~HSN`FtFUqX?)RA27X6}$T$nmi=;`@64g`0RiR~nu} z;|tT9yO#9A;c2eD_K2->?>h8~laJnsHV}gS*U5R);f}_4H~Q~dxNXY zeV6=oPM+kBmy6Fy4Gv8%efs4@z3O7~d7Blh6}G?c^$PRJv-hB>-)Z`GJrkdu z=H>d97uBa;HN9f;=Hx`ZJ2WSzuQ~1`4Yj8qU*2W?KA(E%n?_#jK6$e2dE3{SD}KuB z7xC;m^?-UrHS)Wew9MzOH@RK!#G7v|`*Kg;j>ps5k-^vQ-B`9?r~VX@%RN20UwN)H zJKD1pPDF3d-CY&G{`;jq^{1Zu%Hw9&o4+-8<8t`f`Pg&h;n;J$&4}sw+x@@n>fh!< zZ}QRG-QM7OeK~4!+{t+-rx#26H`F+}CO3mOH7(kXiet@Rg>2=i!arsDbV)%(+WXoLN1MlWtFH z?EQ6@_moo;?ecESj@GzaUy~`g_D>yQ|FM#t@|buxHEt*Q+|hTwDJ$2Qop<|A&rUr0 zR_u7>*>^+6Nq_F>eVb{GKD;24IXHQ=ymLPgYbGu&>({VcbhbB`yl zrlolO}Zca20=B_TPtrx-fx06}-qssa&`O#^&<|mzv=o(e={?=(5J5E`nHRFPjgeYJ>Aha9eh{0 z)bKLNP4}1S{9`6L_wJET)FY}*y>g;nu=6`EGyk&l8>Zi}>umqi>=WOrN1tTyOumV$ z`X49$^@I6+E2nRIM_nYByFKESmRWpyMLQ0c7v>)H{_DcZ$vb2sZP!sDA}$Lpmdd*I152mfTq_9U0R$(un> zkGx(mclAW_eA7&PbA3-eaK|Z#>6<#>CU53a&wcWw?k=tjoV%PJEzNW55%u0-`{{Ca zyERk)QsYLGOCK7%oCr6~j>l_Ol=HsI=3DyZ`lg3Zp8b;{XO>*<_Q-)t@*$eN zveWsb_sZitBJZU?_xvsJtxfllq1WEGa%OW^pYVx~_u2=?i0|v~|8{>jwcfY>lgph<>-IDrFM=dCSuQ4?5m*qWTq*W$rSmvzz-0 z*Pls)yUOh{RsDTVenj4I(v!QM|~teb4S0rCvBajt;r+1EyGgFijFXCHiOz9TQnH>N)IwBP&AyIw{; z>^*Amx#yjH?%l<`g1qylKXXl zV-`g7Oa4l;FLUfi7yQFLy^(dP%TJt|sK@&_7x?_t+b{nF>E7ji%O1Qr>Y2}7FFC%y z9kWw6ojabKS>J9>y?Onjx_)_Z;!^KD{kiK~E+&XaHCPX8_g&)0r3%r5s<=fAtI)A(dVu66zZ|+F$DO?T6>pYYXYZ0-r05Pxx>uoPWRK9a>?bs>rIdE>YX$_VtdG% z$AjLUyPMq8nfj+JzBLIiu73|Uy{YAHl^lL{KK2|qCwDk+GVXfSo5#!Nq@KGvn11>8 z_Kk1i%!}EL|0kNqJx&3cpzWsgM^9j;nPh<8RdBko;3ZI;)c7^2ldgy=$`J5-a-bA{X%yY}L zGpXnPR_DLzqmLV$X5!_@^{6$UUObZz58qDf&gmw?)rC#H#;)x4!UR0%44&W!*}P!my>tq<>7KB4|@ADv(x`3)4jXf zZn1qkK7GgQ@Jl{-^qhb3+a+f2ZvVu)>$u|AOXPEQyE>Sj<8|}p^o=%gnfaG}ZNj|S z8aMoI^zS_K`m#qYx!k9W`jw^!%r`QVd-{9F*Iv0}(9G-E-SS}fr^Xvj?o+0@ogZI& zeIv0wed|sBILYMFH}UEd;`f{M=Iozv>d{Bf(PeR`FX$iZ6Hf;EJ#R6+*{$A~{;NH^ zu6(VL%WU4wXZARc^g#8U8Fq6Mzth^AHyOT_WbM1&%;aA2UuS#!Hn8K-uQc;_ctj6< zPdYP0KQ~{_RnL`1hh1X#lDFf^V@|I(89%vC(Rb0tY1?(ki)Ogx#N*_^Y4GV)pExyf*QXBJ)BSpOyt??*ryo4dFFE<0#ZjcOC0YKK128 zyNtZJGF0!OO?pS{YX0f%8=`&Q^yL1uH+^XGkTUQE3?G&yk@c!=q@!)R)7d9$}4 z&&0tqYNA};U&e=j*6Hg!JfA#!51M*v@~P#nR}Ng8F1?BP&C2g?dVAX2dfs}))IQz& zw{UlF-@dWq)kQj;tIST57nfxx%5$>keOk8AT^OI_@$9mh$1{1;!<+c7CiUFA$BrGZ zEXj(21C^sPVn8_C4k7NiUqd-JfFS-5ald&-5Po z>^LUV1($w%F6>`#;WPInlYQnuclEy4DS)k+0re&K>23$ecbp$RYH*I6n3|p|G>3;h z^SRrhUz|L8C(Rt5JKdfqNN;xE?WxCV2%WY=9s>)Cgu zwXg4WhULBO%v%o{eBQaEJ(=`n-t5GwiRro9)z>TRZV#NJ);@WC6HYz&$fBhVKMh_+ zKld(|yneGFS-zf$YmYa*chh}OGIVyX@9b%0|$-x3k{eAuqP>E$VAj2mN-QE8ZSGeZxy`Z~#cD1HwhwZnkdGqLcXj4qf}P)SnR)8z3^%`F`W=&Z@_&+@ zIy1k@kXlLKC!WbSao?d~!M_H6qV$pBbL1P*<@AeYcR2YbF7tPKdUGeow@wn|&QVM5 zYVUmB*~RWH+UtEtJU}y|5pPlcU+}-|@^>7s#ok6eS4iH;U5-wB`S8StSRqQ;^&Fl6RjnXmoaOdfC18k=srB^_cgjhfkip2TeUS`P6bx zulsU&hGg-s_M#=v&NRN+J>NPvZ#@~`dg8tFeA2b^ zHt&7J<8bmpf3#-aJu&yG_&7pdOox@v}SX(~ah2=897TGoO2U zu68q`-oB4|OP|>Or19PCmHwP9F2eOXPFlxxt*|*cm+RdCQBFj+SE{j(weC z^Xj0U)A|K+VruT$nOtY`-et&7n!Qiax9D=8vc3i8-d;8M)#7lcKjqB2x3}-i_io1( zPoH1=^4@jnL7zPG;Gwy^nM+UD|7x`tbhn6i(CpNGmouv`@9s-YKM0?nn)zK$Ut{|1O^>~D`sGD+ZaMKdIdB?$ zde!?TJ8}A-ARRe*+@4!#_G&85!Xx;NRLy^)U#0<-cXt}5NYA5p~x2mM?lE2Qo-bsJbJG})rWqD(I2mh6Zz8l`zb?!3FXFm6- zJ9T^T^~g>B^j`VY^wZ@hC+>K4P!H(j4%fFnak&gg_AXBh&#q_6>rKsFjb29%54*QI zJR`oZpTDa${mrkJz~`i%yZR2Fc%OJyJb?cylir9uUd@XH-Ni0Dnt0t4r|n9^<2$0c zJJc^;`Hw*)*I9fMmvKBf+{v-8(;%jQ+B2Uz`JI-&tDTPS>6`r3JE^ggXT*LryPn?lCE{I4ocqMt zi>5AGksfz7u>Gm+bbCPe>|xJ)*8|VA_s#z4<~~kRuXk#vWrWP-KJ~!K>&;TNNVTH!Q0=SH<@MdVh_s?zn$pz*q@n+OZ{JV-?hWHz}C3c@#oI% z-0}4E+-2II_tcjd{c6d%XP4X)B$wGIJH5wQ zo_?slPunff=ZD!Hyc+d&Vbar-?+=`OZ~}i4%9EIam$Iv$$``8 zOARjhT{bhH?w@wHpWnyFw6^1}c(iHg_8s-UCw}@(=0tM2+atfz^r?e`c zyv4Wcw@+Sdzx*Apmx1re-1*eStIqZur@49P)F$0`^ojC2-1&S%)aOl~ySRHpJ(2y` z1ul4Vc4_TfKGFBmo4a1Pulcoz~poHtt%w&r;nS- zE;%syFXPQ0vsX4c{qB4_-FHNMbUL}qf$*(O_mQF6(~r*^%-z_IR|nIRy!+vDqVE*_ zb+%W}E|Yxj=61+C?eCkcoM_+Sa$@SOVM#sr$y?Qz=PsXb(%ZwZzcJK5|d-~aXCXQ}C zCq22VUt#uK`OtRW<1TngiWi z^Uj|3>e=z?pCWJa(c9hLqTN^C^tex$ow@5>=ORuXy^}^xUc{gKRbEZ(95>(6@Q>L2 z)Y+{jHlI)HfyUIuY77^=GJ*k8j^ZudME35<)5_X`p&n|CjB@~pnLjq zw@*%#2PY2x;7<)+zSMFr`}ax4$z86|&h+Nqes6Q$VrSdew|;r=sZS4x&s*;ulG%-2 zJ0xdb%q}@Gwc|WQJns779JS=w<@HUNnf9ZlKIP%erGLt$PA>2CABZ&*mzK=uo}R0H zmudcZl{CjKC-T<8pL5#7jh>#|iQ!=yllwBnpYBNSq^a|UpLN{R?0CJ$YvFVBi}HzT zBHD2pKXo9g%S&aT`I>lNX1*C#(|a-!bM?)E9OUgqS)^}5*IepXJ6XqFlouy{y+pnqyz>$GO8z-n6F9p0_?Z z5#C))&YYMYx%98sap%cg?wzB{$z5)T>7|p;NevE7E`9ptMEOQLoj_sgXfcHpGLhkcs_Ibyz$F{$)jBjezQBD`jg(tBWF*(qn2Fnc-qH(gt2d=*0saq z?`bY?GP~Jn^5Uujd1&^$wRYx;pYr-eJalI7U2f7dZ}(H&Wv6%Ogjefq-~AiRHUIR^ zeC~JeUiF*JKK%0T-tAKd9Xyk7;+CPpiHDOHEB52vEC2Bd@-eyRP2SN1$DSIVg;6rt|l{hxpx_Pk>1?7bI?+EUtvm*I zxEwW6ZMg*MK~opCrDxjpnG@l2pKklQBY8UP5%H(TJedCEbI%_4MEA^0yS^htIVkqL zwI#=XD4e+C%65Bp?^R&u?cc)vWYRZvPux}S&fols5_b_VA0y{3|0QnzWTyRSsc$O2 z-$%z!&y<5pKJVO*m#=5y(nH?KU9PeFcA4fo*LV6;OP=4tjh>#|^@y#(J69T>bsBd* z^qqD_zdO7W?N5%qdEU5tr#teduRG=FZOyEn-7SBIyy4_Ny_;Nm%{S^7Q*Z9-Ry$q= zd=5M}n3EhkgU8*w5nT`dY1Gl!cRqD+^2mw!o=#`_?w;c$#MXEB)SF!HyAJp#@6z?O zZ+a`U?nia@J@v@h;VmXlpP%}Knc3+(4?N#71y4T0gFS|`}6mtmb^Ww!*R=rdY4P#6MpB( zH*&|n%kVr}`r(|roIX(Rt_xm|xgDq8XrA2P4juMnM|QUEogT9jhel?n-DTDP3%vUc z(;H--=Jbj7<(<3wdM$i8_?kt4>I_@I8KKA6f8T9mgk*_~`!Q9mo$@5LK zJ5659?0OyWsmZ0U_w?tUK6!D4=q`pduKL8|bTy9Q7uh~<{A(8)a_P-|SCO8hOsOGp z%ZWy=?nBcBb{;F7S@!nitq)8-_m}i*CVk?51%vq1AJMP%IElNS)ZNAGoVX(mH#>Pg zGTFNC_!Yp)aWqo{R=M-waZ!^gsk{g`#%x_{NO>UQ+-k}73r=jnL zcm5`~>&q^>r;%?=uiBC1YnO*+&l@hMwc{o7JsGl{CkNLZ>76pXnUcPB2KfcM2cjB{m*O#8`!2cvOc_uF3VP8Q^{!h7`UtWx7 zzkkC@^1+VZ?}7c7rL)|}*_mdzoas(3_Z2~SHBq^5`4t(tzd?GK#D25ycj8aRJAL-4 zHKvz6Z@qLh-#4CV+J{H3GxGMN&W_$5y<%qYa_=$|KXG>Nw58#EOP`3WM@~dz&l@gB zO-!x#^sG}9^`^%ikGnoNM(lmMy8{oCJbiZNu1EX|)}KkEgGr4&zc0h)&y;KHu4}b% zxU)ay&bBY_m-m1AlkdLC1Gmd$K6iVPbGHlhLzCCn*!pV22e)0~6m5;Wxy((PoY}lH zJMDT?o46}I{p{Z2itug^%lH4^!O_t@-kE8x@AQ7UuT5Zj18?%VQ-jVl|7QR2`sANv zt~^s;cAMpQ`P;~t6Fc+dw&%DpG(kI^OZMg23e0RUYjF|q3Lx*2sCO)H_L@;cPmlSD%WUuZ&9{EX zqo*ft`Q!9})96#v?+s4biOWpy?eDw&eYbzT417#$Z}!cjwVqsS%W&ZxkG}I*rJi27 zL(>OnR-8JL%l+vybd$?0oZ}9nd-AO`-0V|6 zBdOaf;>$gAPj7O>Y^TR&|M8&aZGy1KfKAi+a=0_yKZ?f_sqJl z*TU!IE(h9^+~l2nWb}&qyeE%urAIDN-OkiFH*Xfq9gke{x#M9bF8SW` zJ~&=u2fJMJ+)n!8xcSU_qd9PnJ}~**^(IdG#AT-U_V?ZXyZbl|Q;(V*lLwBky=2m# zJDLOE+H@ZV224M`ya)Rib>~6nJ9Y)d-}ROK>)d6M&)tq4cf1U(^-YJIXz$^2V(TS; z_rRyup5!vS~0UOV4z^r>?{;nL5Z8F%o|Se~H2R()dX$>pwRxdiG%a}W7@owDEJ zxsdOUzO$#b>`PzrpX_#ke8>4^2b_Z^C$;3=ThBau>baZOFHRo4lSWQn#GkwQCz!c) z2H@PGcKd0+1iEtQvQJG+Ei>$R&>8*gnNf#lxYPSZp1iv_`OtP9=Fq1}e%EadT~FrJ z#VhR-k6zKYLHB$scQX^GwnMwo-R<#Ct#|I8&gHEaZsJpSZ@kK-w|#xD(=6|8N8WnS z;Pcjhh1u0UyFfoY^6lTbj`Ofv7{?wA^4Q_NlxZJt%Fd*7)t~4^{cRuuKc6@s61gBlE+U{PbAaa_K z6YZGLOd`AYl$p3I|C$2l8#|52u9J+pork<0cBbz)JM-=3_A{5*el;_qd}3<$B&v&@ z&3m`ox6|RDc&7X=m%leX$63-ibx&M&wSK3i&h9PJ$9}NXqz9?*vTski{kEnH;p$y_ zr!fP%Prl~b+jsl()(g6$yEkuEUSDVQHKrf!I1Tck-zhzY?3hC6M+o|pL+;y%es8e3 zDchdRPrDsgxk;P2sUOZaCjCi|9?_nuS5DLmc7DfY=BXz$zBB!X^!*pRZ{2l0^<@vg zfBH8}T;`_z>HF!M-cc8M%l*nf{ie*SPaVnSZsrcx%V3V35p#!29xdle!*_&v=WRYS zxkuGk?@sG?uYBFR72v$=Qw)oo71Yp1#8a$@Tx|2W&5x4ZZw_&O$j zy?8z*b$2lLFXQH-F7v(%;_QO>d80&>c_iX7o&2dfcyYy~OP4n{4a$!Q;cKD zdGV?bkG|~RWhQ>gXBRu3DXRuDcqT90Zgv`ccTL`j<1O>~?#`Q@b!OqN{7<#?Ww&pp zF4vfz+|wt&PSQI)YI1lc-^7_|q_h2SyU{D|eDHYu@@8k$*8BXyskg>W4onUICqqY0 z->K#P>6_i_E!y3;{8Kc)&VV;3oct;O6WG;Asa!vBoP?-1{b;FoN8jnq9(~E_h09$p zh{ks}@BMW}Hx$vgK$L*T@P{NugsO3&3!h7sS_@4J6T-<{v};3J#)+{xi#8k1x1TT13Z9;cR~OUcekh*Ucgc@VyEW5!*V`GhAevwDSDJm9V?Vm!AMWW5 z>+&6aXzrr^#MX{eOrAY&J=rtuX2kZuXP3U@$nWA`>G$p&x14yK95@X=z3P4Mviko9KkaOP{>Ik)J@9^VU~-*Z zX^i~|zw_i9xkvr?+Irs_m&*gZ^YTV}nnQ=%jrl9jE-O!mJ#g;XDVG`c^r-ESj>(_h zlfLV_;?G=Hyle&RtHA7Wur}qxK2XOV3r88s57}PwsY@ zPfbolYd@M?X64Y6-}&Jgyk^-uo3}oZ{FAZc(_D7b(fPb{&z!sZlGtGC?qWvZnm^KT z?h}V(w)MV;%3uE-^w^pGYCFtKd;Be8>T)7l?s_Lq&CHz#-^$Q%m;80wE4F9i`<>2w zdh^Eg4n32$^Y*)D)1SNjo%2p_?n^^p>Oucn&F=io_x-EzMc|oy6F24I)*!&ii)}lK zn0$Eru;-pPSu`d+>}Za+h{nDf^xb4G_w*;9yB@ga*NfwGQqNs|hwbgVbE}ErrXzbg z(>E0pH&lQ5^op5>JEq{kUHPuGelM$ee;Rqv51;&$kxNf!)kHI(oS542I{0$*iK)4# zMxHx4e0{_9+2`qb?USeHZp_|gQqTRWKYho`$PMP` zX@2q~xAWVFH$A!QkrU12oo}j}Z>{g_F(c~L13&Hh%!%;1Pq$gI{buAr_u~wS@}T=^ z`30%Fi@(eRf!7cDI6wBBPdd%fHBEQ5k6X_R|K|?Rc)zdTzdw01a*5r8HgUVmRd;6G z?H1+59j^}hrkI+0YuwH01)peFp6t5oYwxGGzhgx(_n^O5GU?&w%jp}fxxO?1WPg&M zJga`o#fbk}+mpBZF}w@c1D6?eZg@UMU4)x-c*dNV+-^@Vp53(1Tg)8XdVQ&J zJMgK&dpDYCOdq?qzKK%L?+#v#zV$NgyvgTI z=F=hnNiN^>ExE+rz0FLBXHCM3+vPjM-QKn7lum!{=-#5433r|q=G>uQng5aF``fw8 zu1)duZgzDJtvRdF_;U0nFPFaF)6bqa-tM^5)9+4(9h?S@&%u{BJY3JjwI}cP_nqEp zZ~qEYYfA8baQY_B%yKDw!tXr1=j0C88Fl#9?3i+D=Dn}H>Dlf420Q&dVrJkbUeA?= z=g|1V^yVIxuhk45_x5=2dNP;0xd|uVuK#HsA063~ck@&4jx#Ine90eiWG;6-qLIGk z#Yta^7l=pS)R9qr$>pvtrnc*r7s0+|8#qcYSclyNmeT#mwe@cm&F2RxWJ6{`;hV@}cu(S7zkJ?6}&qF51<%{2iWmhD(3iuMhO2LjJ0|g~@*oJ#fyHQTr6>;-jB0#~VB@K}_G1J#*}5 zgmRbGFHRo4lSWQn#Gm^vuO?>hxJWp6ed3B&Z=`EAYT~Y24_&#FS>@o3VeUcySj|D^uBkaY zlh55;qq*ig+rGT<>X-Mnck-aMPrulD_UIAyity(pih5UQR&3vjPoHmzskyht&39<{ z0PPZ=L_hI9>05d7-@~5wDkGo%&h>o`-Ra5Qez1A&^ZL*k?i@3Xc;wQ*+V!3bgF5nR z&uDs*ckg%fi~17PM6~lV$cdTj-Ap38cl)RNxcs2A+SNhcn0#{R)1cpZ$my}8?^7Xg z;zGV%JMWuf7o?wE--K}T-E(($?%V{_#Etcbq+k3Y#-R@Sh5WVZX`cI-$cJ2J*}X+; zPL~(Dx2NxjY*+gHFuH@g(RXZ2tB$)&=eYUEwU*DPmb)If!{deAlP@ekR=tgBQah4- z?JHgzx}ThA*86Z-VCwANXZiasd3%}_F(2E+Z;>qD(;VKrY0q@a9d~6f9gqIB@3={$ zr)T2+;^_=GzhU|vlXu7Q8&|(`#nYE>?|iGb$!CYYiBnr)zu&jHr-`Gz~_K2`5D{AYyH%kC{|JzZXyd(hu&XB9G+yZVIbb3Z2IAGqvc z_ZF$l{mB#h#m=mFed?#gh2CPx%QO8)xRRGf*E8vG@}gPshz>ast!LuWvwBBf%nUnx zYDe98dNPyQ^vR28?qYJ8eZn7$zV4ZB-p}7a*OM_LW)4nXq|+TdAYLQ)zTSVE)0-al z=JU2g#Lw=1Ks=cCdmE)EyV%>q-5h!O)N;qe$bm=PXgzx6KfTR?WFpbjx(LVg{bqmvrPJAERvNq?J%?o%W-fhY8_({-lzn5UJn8TE>4yWK4*ni{ z;B%k6cvd`G&J!Q+J(=|7PB!1k9bew7cktzqk$aLSJNfLe8_(pMxX#)E-+nm#qJFV6 z@{Rb?>n;x-5t4_RG`#ZcOyir~|FuIG_y3FOUT@Jiy+!$_*g0;$V^PwXh3yx;>eJZ0 z+;Sq`|tN7+21BLQN3^Yj@j&nlNZUPhg%JFhi@NT>h2=? z(=l_t0(?E_dRp^FpR&!}^`zfj^sPp9(7ioJY22TT-QC~!UFXU#FCIfta+42Teu#fl zQx76pwAA5y(D5?*x!HTv<@3({)DSpvA^&)fuDj{JRi=4z&E;FE;dPRS<3>+U-t5Qg zV;YlV$Lr)SXMWP~py$^)Z_z&QM&99b^o#O|XnykNwd`_wMKj*widS#Mzk4_PCSP*t z?RU8G>KD`3-0oI8Uj=*)JU5t=96N)DJ#Tq&($N@mqTKPN{?o7X3-szq&3)3$iF(D( zQ+shnyAN{E=C^o`x0J%^mwn(j+G9dUHX%2&#r6Ix(ko*O#X?ZgKw8h4evDR zLC<@YY2VbFp6rC5dga9I?0j~oulFg}p1j*X{g(9qW&gCZ{rMYPd-{9mAe&veXU`LU z<)LTN;F9m1`y@O}dRuO-@AmVC9(E?VH?#jO=JkRTmwNB`Gn2dC=Dbf050K2{w`)~# zr>}DVE8h3{?d~h&O?-^_zJA~GBAxci(b1gR3hg1=lU(*DZw6gY>h56f<`R!QYM->` z`mT!a^Sn0kTX-!~$HZmkzwG`7k*?gc`;I@-{NZl59iV$w$=&H>&g(O8)*D@py+;i` z_w<=dU2d04zkP6K+4Jr$ePVXFPe><|Ik~rT|MydWH|E>9w=dsu7t;$TFP>?*+0B2F zv2vB6)5%?K!Y4l7OJDA2|9?!r$$NeK8;T7x_J6Qf5AXHJ^yPVf2_*zc%yu6^ioVrJmv#neC9Gk;t`aq7`8riWZ+ z+3_WZA1-IQlVd-wfM`B_a^Q+5ztVO&G=~m8Cb4_-&fUzr;pgvZO^=v8?0M^<10HnJ z*P0$Mee!TqMz44ncpNpM9OmiF25GE)ZLFTrbiuFkDQ3co;O?$+VT2! z9{uSd!-((eUk`lxbJq)IKKItRR~^aIVUIXvQ_CH1PwMVsd#4+(ANm=l>`6~peyn&h zkC+{rCr%CQjumHyK07ljr|%B4=gy0sZ|V0%d)L)E-3;jN4Km5UnfKr1&lknV$a}xp_uq+2-E4AC_f?iRTjPdbjsEn=k&#c% zE;aAQDWhkn>7m~b?n%b%4(Z{ed)2AOp1$S5RR`M1pKEfLOU#}-FS)0FeCf?MvxhhN z95Q*!!=W+i-0XRy!#k6n8oPOS^UbS+)0h*}W0%-kXY%e0x1890yF0bq={hcA*Ndhu zc2C~9A9>WCUGDAgyDGka*Tmb2#_reNy!9MO){bYIU1svb(e*U9@=YCZpHB9y-s;ZG zu=}NtF8I|v(RLntSDr(|3v-7iOSt&-VOi$+BJESJN`wM zn|{3RXaw7iR z%{Ssn-?S&!dG1g2BMQiw6+?csX2&it^*86;o${-Gb+LWjr+&N^z9)0%Qx~)I%p-Pr zaN4oTAFrM7ZuF;b%IOpFv+D)9`55`!lS`g`8vS;P?QPz>(Hy**T%y{M;yG{4H{dt~r+wr?^kFZtC> zT6X6?dFfs8{pJ&2zL)vt^UmGh)0})__D}m6qRoo~;RJ3Hv) zTTOabo*i#q#On^8yKrdw#E@<~c!v?+*Zp7p;(g+$gIs3W&*FY2-WQ%6?&NYm!q~o$ ze&mzSeDZ(Y>Em}exy$*cIC=C=nmIhF=WhNlNDto;;ng0NUu$Mkgm3M<43lOSPv_8f z88mV|Q_tihx9YHS>M}Q>xfQPZvTK!n>gl}ycCmY=-y|ny=ftJXeqMxL@6;~K2$^$F zV{`U5pP6YVN2YUqc^-c`rM9~TL_L#_79{srkdUko23@BL=qeA!_tK3Tm<7IK-* zyZNj2@5FbOd*|yOZbt0=OZ?yu zZ}Z(vdVD)M^4_3(^6b;3SN(9=ARc{FM@B#OP1)pfU%f3aW`^GbpBmiVWG1tjlNZt4 z#pE*kgg-j)!R`BYh+QEMx~C_(^Cj>(sllPirB8ozdez0|^R`1I!|r`pa)a&nHbxJh zJo_~2t-+_3`{X^Eyt#LMM(KRgt7qzz6Yai3JJSc3J$)1n+qwpZ$zm;`eqJV#6R&;{jc+&j_?Yy{y_Mg8 z_2SF@w{y*y1KoA^eJBjxkj8&Y>bdtDsj>4WAHMc_gU9R3QA;lOPxQ(A$$OpWCND4Y z`*P=gI-TQg?ufG7gI=!Pl}0tuZtuwpm%5qsx}&96enNesp6qB15BihY`LZ{Cx$}lT z_-Xfdm=oc1pKh~_zGKE75k5Wo#Pq@Sr0y=ZcXi`8bFNI`!Gf>7bjXQ%K?mP%GOKUm z)DrQnyhmx=pUkRz^gFd65BfAKe)1;AJNcG9 zVtU;t%?>ru%!FnV+4G)q&FOER`v@|9?qb-!))kLM zaG7;)Z{OMRbhleSop-&R$*lW?8kHach~VodsbX$xyhO*_t(ju?8r{vQTI-d+6v8xlkbzhDKEEsL(dNLci08z zZnkfDeA6VKyI#8Za_}{m`fexdxQp`QibqFF-933Z`^4k5@J%!E&GkL?z@3*Mrf=$i zo4lF(WX~>l@z@mU(b8USJ)+(_Y(HJjYDYIGrWZ~gZ))6Va_K{3pH%YBOZ zn{t2JJ^AFaZ~9&Oo@(7^UbLt09gkPPs9!u?F7M8#7j!qyeRzZp*BZ9u%{Ah?o2h%3 z`O6!-J~TV;e0tOGF52OJO1uzGKIs4Hns4M=?xK(OEf1d8Ax>Iyx!WtIw%hUh;rnae zH^`q4dhq0MCzl;Z8aKO{_V>N1SW0x*lXzCbTaR+z_~b;rJ0v#^9cUmQ!<{1!mwS48 zzw@P@d-vp>zVjt;gE@NSMLh0$GN+atJ6`>F9(9pCd){z4Xh#y)E+<0cb>u;JG(B+c z$+M&JF=Fr24L41`)7|##5wk}R+@w$5%%r~C&FtRLv+6E9slT(_-I<==Kk=IFOyByzd5 z$H;rX+4tXxOa0S5`+T=M(vw>9xvxAEKfU>+D?PbqAAD-QFF$E|z&ky??8iks$>}lE zUD-Ej=FxJWy!plxuYPgrlxt7k?q~f*csO-2Id%q(J#Tq&($N@mqTKPN{?o7X3-szq z&3)3$iF(D(AfEL_Ey#hVic+ zMZF???)p~v)VuPX^&U6hr(;IU{KTQdA7SKfZ|Y(FT6Y?T?#evb%%@jPG?#ujGJbkK zMe@rx#s+dRN)> ze7b+y+5RIQY)uK?PYz73vqu_Zf5NXkys^@DJQ~?)R=Jg*j+Hj?a7R5n`LyWWdGxN3 z4tvs*ovnMPC$rN|=FY#;;Zt)z;vqRPq_1_w>r4H(NRcylGf$CjzPm|}?e zeVX)6`ieVV0^gJQU;B8|-!1Y6yLWof_;My+a_N1#`-W(rH$Cp6-F?f8>gPo?>XYvq z{*VlW?@Y+wT4rXX;+4JMcSk*3(w zv&%>1dnMcXZ}D36q%U`DeRoIS`a!?;^lhej?nyf?V`{l~4}Nq$_8xdfd|yBB*7P@j zyaYZc_1x80_{96fll}NV&1C*=KQ4pF=`PyQw>)@Whd61;P5Z7t{rW(^)SvF1@ zT?d{V?&PxLNaJQV-~PTg6-$W@dlJt@LXUFa?EOpp!yn(H*S%|2{9k;$ z!-%_XJnH(%!pU>zz^6C0-t~#8%ZX_2$7S@++|xa?_D$KHrvHgYuju=rd-mjRX5z^5 zttK`1<1%}5=DzC6T<%jAPF^p)xv$r-xO1GZ;hMp(C`QB&RxYP-d#^?{(jI8kNng9d>Q!|v)*s^{deM0H=EqkeU;_S z*0|wUqdz?pmwEL3)XaH{D_*@(zleU83C&MQ4?H8julcVTadzFayL|tSymR*zxl`hW za!~Af!!ga>-S5=TzVjkGYyZTnWnb=O{Nxj}(|y9JLtpky`%_r6I&RtjgGpi=1MlYY!9`*F(p1IDdJwdZ}bMtvm9cb!!ds0`^&pl-( zpIoC|qWaV;C+Y<|zv43U)YBR6={HQi|H4iGCj0XJ_NAu35zpkCxX$){G_kn#@y7Iy zx|lWk#ne{2J>p&VPM_YP+Z;QSIPGuO&%gS9vj490-}>DTmATx}%)q^(RKKY(<^yGMpXt}3%wd)t#x8n7wpAr{(i^_e=i+8%d#^XisF?SvM-tOOj)y3bA z-;8gHQ+B8QZk+!eQ*USWh^_lOM15lV^~mXw_f~(3E zeNu2u-_Wh=Or7vx(O!KRJcCq8@tR6H6&*V*yUUAaw!NcxM zUbGc&PJH6a_srd4XZjuQ#=Bnq=}Rv6BTccVC+M$rr|G@(pttAlwp%=23*R)mE;PQ( z%F#7xc;(r1`cAEPJLI{a%qMT$_5Clpy2Ja7$Km9I{_|>ABZYEZel~G=^@EeAWBTFK zpS+pm^uoE@k+<19>`dQB6tou7^1oMl?sne-`FM|y;by$q#hWoEqqU!~^X4A*Fs^Uhz7=Gu}_pZgH2x~I`pNS3Ok8@*!{wfy+`I2dhJ5Gx&Yskgr-vIoJ$bVqua9X=jvcR)yPWw+ z!=t|2?RtW|Grg7XbkC&Op(bWlkDPZRySKhO-1(0P>jQHS%lE4OO~i6s`_2>guhq~#6=t`|*R%>Lw#6h7GL z$gDfO!=AVNe?dFNRoAf+E*^d5*=fWxcV2xB@GEWd!ewvnXxY^o`fl29SMzqD`^l|v z)scR>dYbFI{h!`Xephz#KHn~frjBgr*P7Q%_Vn{!-@^^ju{(}65 z>34kE#c#~t+4(1LbpA;O&*Yo9{!M)!O)E_vQLkk zH@V!q=eUTSr!&)SPiooOx_5faP8=GUm3Eg^e~P^IzZ$#v?e4p7eAB?IiRn9D2VV}p z=2D+_{bYNR(}yQ{Gw6C!cL#Gfmv}@+^6Y3m&GmhD;JW3-w9x^d8r&z7*(sO0yEysf z+H)wp@&D@nsoq>uw|ycN?x1^CCwHcB<8Lp~h5B`2PZF{X}I=@Ln6c1df#|^Rv!AC+~pG0#ngH~ zn}|EL+{5ypR)3#pS>F?X_j^|Qiua8bPQQt+Ro_mVx_lRH)v4zWGoL%%)5tfbSM5x4 z*!3ypojW>Re)?BPw)1#boV;l7c`c$H`o#86HywPL;b!E-H~Z%Cz)zY!u=UjJNbbp= zow+~Bw&#=l%GB-lPAB@(zn~`;A0ZIx9@l2U&b3>_Q0DJ)0=ziXxZg1?=8xM zt2ti+UuGt6>bXx|x%8da8{jk(FLw+9H1(9zo1XOINnhqOle|0nl$|)djymX$rU%YF zd3MH(nB12kJl>6F^Bp+(+|xtP>uQng1il_t!CdybAc94mq=C^6swG^owYIauasvpdY?z z^iEoHcU|Wz(0wbeyScNU++QbqvLie3V&5fyop_%3FyHyq#jgjhKW84X%Zs}#+N4`&hbX_omCrXo zJo@D6a~I*BjQ;b9IXwCsvCs*x2G_IG+Pk{5BlpRFyvWHThwjL6%gc$A7fziVpEnw} zBQMIQM=nvlbLqL;>G*4&+|w-YIPRi62-p0XhHIZVB(p1hsQRW>89TH8JG59bv#^Z+ z?feZQ+1yuMf93t1zTv&=)4TGdp8Lu#&)fRh9XW4t#jA@?efpnb{zfwWj(6i-zy95|iN{{DxlgzK;^8vj>Ng~x`%v-g_oRoclY4W=i|`%xoGGWCTJEVg zf4oFKC-vObSBN)zCf}1jI_$x}%jlcldctMicjQ31yDoiV`X?^+zwXBs6n8z-Zy?uM zd=r=5cyhRt%l$}W_|k)=Z)2U8{{-o z8+Sef`n?m?L_59PyVKK~`_z@X`^v|gYN8nseHwXj^2pK4$L#!Q`o7G=pIv^ie^GXV z?%9*O9TRt_*^MvvzR~hSUrqLyX|H^G)3f67?6h4+=8l(mSN`Vh7FT-nc|Unuk2!9>L!z+#DXWR8t@cm6tB#33E)sNyTJ4wp3(|AG7(Pbc z`^~=pPF(8$W%u3gnBK%Y@n-Exj~pKP)Lfy}7G{eyOwTX`cJIzDe70oy(iu$sO*zgy#D;e~0whdFM^t%5<;)C+dLxhZ3Qr|A)ShwqaN*-!ms zm{l(M<8A%uFZt{+JaK9(?DzXNmwdh>pO`!O^iO?qiP@2RdUBuMNPXJrC6`$^2AuXU z@xwn;KNb1Lt}^qJFMnt1nae#ry{FIpc$wVA&Ux>2dUCu)wA|CX+VzX)%DCWHIeS2N zDsrDH)kQqVWGoKP6CW{sXLWe0i}E|POWbAAcDnD_DMdT=be3U6Tj-xe`@#x zn)O{fsglb*^?WY9=S$#oQiDU2OCOp%yEAcU&F6hyVUd&F`?&O{px?YXcs01(^?;pI zgHO%<&=80=@nQM3+V@K+V(RVe3)r zx{IIwhP&Lpxz zJ?Z&G)4R*#L2u99ZMS&13^?@@oyO`tmX~v z4!U3VB^;NMemNxeyf6C?KtC@=3 zAsyK{`R?>7^C|b~8~kpDock9s-0-XZh7Ss8BzX_ z7;w^>>-!vfpyb80bqCtSWrjVwa!;SUn7N6|YI>MG2c)-ldK(&zLLI9H4*Zhj4v)dSo$_L@o@5@e(@}i zK2cvIIftDuGjez)4X->q)A(lhf9=@2eyhIqTltLP{hYp2d$ODN_j!|rlYi26=dr7i zoSYrrr$iu{I*5lar*C{tYRRiN$IW+Y_z=y3?pE{-4|ix-pt(eMBDo*cky=VCp8QJ7 z{BEa%k4fy_zTb&|8E<^qBM){*-nnNcyWG*)y~WI}_VW_%GO4qhTlK&qVB zTlv$AN1sR@4_|Wd4BW(jiI+z9$=HM6Ozw1~XWD%y^UbYpcyqmHMi1zIYPe87J!Sbm z^+LFd-=>=--#NpZJ?RO{_nUBdGA{?_th)4c2mHk8r|-$&%brhiyZ-FNH}$3`_v}rc z4!)k`^e4wI-`Tt~gFkO}zs&Sbj?v4_-lHzxw|pX9tLZ$qle-+4{Q0{17)w3dSJeo1w3s}7e0P(X_M-Vc)$Ge0 z``HB_+}TBpn`!>d{?onn=Iy@vUGToM^0ux|%_Q3sve;a-{ldwt*U z==%i8Gu{1W*MFyX?V9>h>sGtcb6lp0>wMn&$-AcxpVOY!x#h(3;=pO}=~eHWY;$^_ zA{{w>-)Zt2uhpR65?ptxIe)Hu1 zI&|2R9oea#9NxZH96TNRMfjXgd9$mWdg98PeC}jl_y5T?+70h_Wt6^fr(rm*@5_As zAp`$p@NVYU@7HS%^ixaRY5I<9!TaeruR-$r)M>2sk@7rORxHwhMV2|CmAbO89VW@Pb1$rdF4)*Kshm_ zAL|qS&O_nxqxJV)^4EFSJL&z-)H`wH%!>L>mjPE=cVx6R?j5Hlo`c_hJ>E~z9Ni4J zyEoV~dB`%Uy_w&C?>u+<@5bMZzXv6E?(A<3J?9f$Z}z*ZP2G6VCl7w~oV;__1K0fV z;`pX%ub#<|cjC=}tG@JP2mW0qz1i_}HxK$wa@ixFoV!`jy*2Mfd&SoC&TjmE>6!M- zsdtteAGjMlIo!#yAD2PYpFTNo#gkuYnZMiVVG_GH@7&G28|ME;`o;9--Z~on@E{+< zog)vIdwSf-b{?&{>|saOBa+L(=iuR9c_;oU=NpM;MYSV-Lu&5mjQ9Kc_uo-nenPT- zlP>q9YvrLo#~YmX^d5PHzv%C?{ocNV(S4`k@%t{X#UALDS3bS?5B|KS`8WIiyVG{Q z&fUF*K6&8IeCWY$&t$a=^us4VWs*CtLrjf*#ix(A@=MJfJx70Y-aEfpJ)+q}H8Hij zy)%8Amp>$4n0wIQE1C3g^X2r7)?DA2|8zeVf$0sr$>*Lm$&+#9lWWaeG{c>{I+%TU zCZGJIWtYC>p6t8c<5j@t86g z>gmbdesX+&9kbaz?aBF;+39XS-sUog&exONDxaD3=dPza^vH{oU(Jl3r%2AM_%xfo z<8|<@=1F(w$=u~up1a)iJCBLnaI3fN5vgz|!-(%||JSUpDVtpGW}YCq&h~vgDcX3l z@6#^)nfICOaToPuE_d|_)8~G?jPBx;z2mY6FE=B)|Md-Woy~6gne?b9mmc`ka>v(m zr?=nxcrAQSM&If!bul|v8F`VcyLoRkzPr(%z9%{TdPV!Z@wtng?OUICUItPB3iUPW zhgXwJR6COVU?*?Zu8hlxspW2mT;66yJnY_wp@*p7yfJt+xZL%Cos)x4&Hcb|jU1S~ z`VP&mJnBz+Cl4IoIXsa5+_8Ft?pAQ09+#eXNMCE_@#U?zId4&)2+wy)+~CwRaW^$z za_9IBe0PJVvwhPcC$4%Y9Zp`%PWF>OuSxyQJo{_D-PxCW`kK$%T|6`R+Pxdg_UqJ- zaFlv?YtIfjai^_3yqj;+@ubJT3A3;D?B4mvsf%`Hha8@juX!?Z=e2vI?I!)~PloQN z{ZIOKo_@#sj1ZiB(0^X-60>OH(9g>xa^g*YYM1>NWG4ODV`#-?PA`am%IGl%y0_+S z57=HkpuXfj-R%JR&g;t_I0p|SzOQG0$z+cGjA-uC`o+nkw>55Z@*@7+xt~tvjw_U0 z_vmSUb?>^=#9g-@-pPHJK}+xIH)d!1R~`D$Gk=}m|6i!f-{H=`)9l@OR@!-mLHG3L zjulUH@Xksj=j0BTw>#)(PCTv!J$LRNIC;Hza_@|{IqwywZ`zYvb-?3Wd5_Y#r|JC4 zXSV(FiRro9)sI(!yIpXOT5|02`XtLJq25btv8jmL-YV7FrzrT0m}>ik*gkLcPsiTO!u3pCd+zS3WB0E9^gMY3zuC$E zN#B%z!u{n9GJMDNfH=K}ZyItm7`qiz|N8^@6$U1?7(t)wDbQ1qF+Z0 diff --git a/resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e000041b.au b/resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e000041b.au deleted file mode 100644 index 5f58ad4b60a5d985898e5f8b24bf51d80e182d75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1044572 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�*Ni(^n%mtScuJ3R_3FEtCqL4Yb7#-{M_#`vvAe0Bx2sQ$H}hS1b}%bBW(tq9 zdm=Ns9{gGIA{w*4%BzEWWq!|7wX>Q0ro7Sdc~iaO(GB&yB_|$fspo87Tpb2FSAX3j zavjZeJX+Q3KFcjth<$crFB9<>Be!aqOU@aa{rduE+QGe=ncb$@GqiNM}1w5lgpwI%L4R*yWG{+!d3zP($S;TApf zqn)YD=X@rshul$i86Ns<)qA<;ot(X`SH$D2ry?FoylpRYM>o2RT)iv*Ihfz!U6Fe^ zpShp@bp+_F)H`0i=G?{1I-6y8#_!zuCiT#L7^df{h&Z=_eQ-pf7x z$(u!|-SMzn@?i4nGwi$_H_OB0U-t|<8oA8oTw_ZR&SFT{?~xbRG#t!k(gv3|>YiTa zypg%;bH|?<`9wXldzIh2hqwB9YnJKwE}!4ajHk<1pB_=2{H)Z-m=nq5yiShH_-dc| z@{OEpKKJzHjAu<_?DArWC&OH;G>We78j}mX&`Jd#>ilo<_6Y1Nr?MmJN>2>Q2!BHTdEVblvRu@xa zPCjRSi^GPUM~hmAaPs(bmlwU)VfA=tDdy@c@^q~^?s{8I^hn*|lgoKA)F4`V8_P4L zPgKYosX3!l>~dG)4L>sLy)KS+^u}Jky9wt_&^hlg=T4^XaO>90U7=gf-f>6IS%1Y@ zZkCld2Rd`R?!LD=6wEAA`j~UaOH;|;nA^|JgBO05$$ZXaW>s&wi?dwiXK&2-%=4C= ze9q`uU*b1gZ|40vzs0+Zuy4He4q3~YTW8Bm^;f>$tb6)XOWrro(~~nEGa#CKYRqW0 zsuxe^BZoH|j)LoI#_L_jKwJ7n`NU51hMJhUI-8Max8=@Yy_1RYR!*^fL`cNd$JFaB=fv#WRS#!}6( zA8DyGyNjI4IZnUgXTHpI^EycStz~BKT|M=7W^%5++__b~bx(gccQ@e9RKDdbcKNEU zo2l|<(e=p9aCSpKdfw8X9NxN{|6KH)vw7a9_j0M>rINcb^PgtA+?hLiKxb~P{3s&kD&V9&2fj8XYNY9YVfH!FV(pDI=-=9DQ- zPMp1WhF^v$@6>(oM&{DTjjXz-=Dhc=?}+uDJhzy0&->1a-K{QPGk9t?J-3IPaPRovY^V9k6=!fclbq z>+B7XUboIWa1@A#64h?({!cRIbY?zhb^T)J(c5X{cWK_C z#J$^k($7q0FQ>oDXAWJDNEQz*C!#Uu4wr?tB(cpMmv=gys2+6ZLv+>$XQ?H}EU&M_%%nf(E|*+-xyKH6l{~Y1&TA9wxW;y+ygAe1>%Cc~ z@-h~Ke&rX)Ma%WyPp`v~fua&c$`A);5u3vmBZ;p5JE$@i>5;HjB@Q$OX*!!w&t zzGmDzG@qKc#MGE;CigBQC)Rs!+4HU0%st-%osZthdq>{Xxu03*%CmoIdD}bOJi1#m zW<~UwM{U(yFmp3ciJV%!3pyL*9XS!rS=66cwRIEaLED@j_ZjAm&V%kPX8m$z>Mq}* zH`Kap_2``;H|Wf% z*S*NE*6QaQt*RxDR`uknwiqsWhM#%zjhyodd2tyc?Ves{w611;yfY2H-kWjVn{ejI zeQt5XJ9#5-R^2^4neApWNB$$dyW4TR^;?y<_%>&6yNmGnx|;ENxsi9^$y5&hOp&dX zT;5II47#39hm#l0ic8#(6VYl_uI|B?D#FBVD|g zvTM6y&At%FQgv?a-K%-`%y5&oQiD^I7dwB|^wb-9S5JrDGmi((ojG@PkkSX@vvQV8 zJkrxUo4K*h!~>pOW^=C5B?xCRr0cK0@@pCnX0r5KGM=1exM$@o*Wnpo_nw^C-Tp1P z`ki(6t>llsZKlt7-{_Ecv(q!X2S3v?UuWJiCsxnVp1GWtxP5e^>SU?BcVqgWozEL4 z@Yr%-mrXrqZdO0stn`Zb@b6{vR_5T@Gs~{0)9}hOQx$LQC*D2L8_AuSeG6~SXR^H6 zRd;9R&HNcp_3vf6@5ns!o<~hgKimpY>MUoh^Q(cpLy5O-{!<@l&)n-Ki0P|Yc6?wK zTvoRy$GmI-G4tJQzWVFlWsf*+cqeh41obG_ot&JgcMr+YwY&j3SD!rDoV%SYU43}7 zQqMU(bxz+pM0T*Nj_)|LGi}i@5RX0)84oQdqA}+VmxZ<@vCSQqcho^=qI%%E8BbPb zbH-Em%%$!-a^^&MJt7>1Cw*74{7BuoVu`e?nYC4Kq@I}ty~|hb=+2S9=5x<%^0RNQ z{9eY}Gpx5}`|OPwpLclMPCjS!thf4Wmc8CgPn|n&$7QbSb=NDuNDQ3KVR_-bLnMv7uW5G2=BZ}ry+AW?;YrT%NKk@zQvs^cM&b;^v-7e;>e>Iv*Z_cj*4dD%?n$MlN`pLWqpX9|g4JYTCse5;(dfb;V=N$B_Ki|}x z$$C?6hV`AyG3V}$nwjylyneBJqtkd7FPL>UZ^k?I*6hxV_nvshw`hI?)=YiJz2eam z`qP(O&P$qNPEXL+aZl4*J-kC(=+&bp9_jizJagaN;!tq!{k*TQy91|}x$~4~uPYe} zzw?#Ye!x{8FKwlsvpSf5dAuF34$khShZ{Ejy$rrDDf1$?oWb?vaeZROIxh9kotG^r zzV!~dnq8YCm2*#YCZ6-s-0LVa`rSb}b87At)y34gm3+?n@K9psxj8=FN{=}_$>(hT z40buVCBm~gEYq>OuUSpZcl3yO)b*pm$+Ks{r#H1a&wP2K^PqPnFLoZeyu0V$)4a9k zLF@E&3yZAjW6oW@~7`Bk*T@5c%CMPI9UuzOpq_8E^)ZQVj*YIWYMSHSO$Ce-cjZ)-lJQo`~9Ge zE?;MMD?RHVX-eKbxvOFPNDZ#;-l$sgXzXNZYc}fzt(<4M>P?>-n76)!H_JQu7WZ?< zS9d(M^r(sH(!&; zuD&yS=5r>yoH?+0%!;#U)!oIToIY{pul!PpZ9lq0F0;8;KA%{(B|T7e&kVD zcCUVSeTzhcvm0Gz=JhOkms79U-K#g)tFP|$F1sEvJsoFe*^GGX%&I4sGnq5Ro%DJ) zIquZ`%G`Mja8-q@G9?uNd^&d1%3&)k`rJ6Y}`TF&X6&HBaaoALT) z`nnlFXQ-Sv%M0lA<%Q$*f^Mfe%O&6Cypg^cr$^LRaoq?p^)B0SnK?WAo=DDFOs?Kd zPipc@l5d>r4Q_c)du|Km9rVJ z=H%d0%NY+P2QIOr9hKRcPo2A;Q|7!Qa!akw`A&M|;p&~-^>v7k{863paAWpv<@fGY zuirMybo}f_-on#m^@w=Rc#m$So-?<*n(@^;^W_^kXTI{e=S*hJVC?c@vAtS5UvfFu z@Sdg@k1Yq*Y~9n_`IpVm<>bVAD|b9Le9pNqEL)|AxoX(tQ`_RFfg4$MPc7#!c{A@Y z|CYD>es8+}R_}N>?UE!?S@qnxO~E;{&t|lv z;?}Ix#C)e_@Tlv@11Ha3E4^x+zw_b8+i7y>UCE1`C%L?526V=o9_QqlDKlbnSHp=P zX7e35`JB^}Z>4AUr1xshJ@xK}Z|GaYB=?qEnfFxX@~)o5^gD~`bFTMhUVN$5ocAiG zFZ0#+TkgD>?>dXTwQdh4$1K0eEo7$p(d;(7k>>QWGiRwKFNZJZbqmUYN0lCPN14W*+#NHaYv^dzND2mYi5D)3y4!MOFUBe)>Ij-$QSR zo!9r!^d$#hceu0FWqs!@H@LHxOAYT^YcG?xXLs>%qk7?L!P#hfzy+dI#}!MPtDbJ> zO_~yKTmN(BS%#hdlB&1!Ue$aD-j)NCtJx)uF`waQ9?n#a-S!zh^6r_J6U`=8&3#Q% z%^ctmQ1i=iTJZpr=P(FPO7>qIrFtw#S**)7?Rn7xjbQNDVIc^gE;L z$ypstU4D<#vuuOj8IMnosJHI&V$~Ogf-_!Q>fEHQ)ZozM(x+ce)T=I5K6kSs8D{sz zBO4}PwcPcA$>&^7U)N6WILvEzU~u?n8j(G%>U&<^v7AMD5KdlP({M1GCu9B~@+{BZ z$vZhe2jeYuF+JU!zMMPne+5_Hth;X}ze-N9(=$JbwKO@iqQ=#sApA_LH!`}XrEhP} zcXK|vtuE#pa%+;!tWPQToYA>O*Xp?Haj!Sw;p9dA;_9%WK2aH8dh5)-Xx_YfIt{Np zGga}%e&XE|y&=bbrhMy+_sH{G-13IsUw6I%PJZv3&Uj||e1mx{#*V{MeaY=<<@^_~ ze4ouR=2>;$m05D^_`oc6y)X!OZ7ewahr{=N+1Ylh0XQyqb$2uIlMZ?DXyr{hw0#y9gWMPu)(=Ji#+?%gf8>hoUp&-nClD?2r3^ep{Lk|$@g_2ypu zE#AF5RrC8nXFRhx^XXZKKvVMWH}>|k<5D-9+}U}S<;|+G!_P{8dgRE+C+96ScX7t6 zbE~_DUU_cOzh&_Ty?0lS@4ADvI!@2(Ffiw!pU1q@c~fV07oQJ>2A5tvnQ>l+NL%o^ z%fq2j>g>$9qr+1({ic4(nTKaKUwL&<53?mF${!)`kO8f{k-WN`D1U@`SFaqma#pX1 zk3K4Hd2i3#-Ga-kb9$L`KYFA3>)z${ESfy|WuE2XQ>%B>(~~o|$=K|lQ{<_7`^L`s?p<$n_fqq==&jC^ z++tt{_2YF;`|O6iXog)*TsIEvN}rm3cd+A9|D1XDJ+oWYzl5=BA+>+!@S73MEDi)1Hdk1tTmvi26?({`*2l1ToapK6QF6Ogq zF53(zU+2dD;@?E4%XyPMXLWI=Et^5q=Z>7S_d2XT_jNN@^oD%h}WzHQByQNQ*KSFQ3HJ5k2kzCGux6xA1Id3p8K{$&c zU44~b)3D7QheVd1>3C)}%W%)iS+2t~zV1CavAg|NuKSiV_wjUD-p@Rq&YK=GU6G|J zvCi(P!&z_TyWH%C-VSSKEhhJh#rA5|pF(muFKLQ7Jwac`Jq-i;=Xh$S?$^iT#}acL z$sXm+%digpyv-dNz4PEj&q{yQ@O9iWc)F|3kFWFN?fAT#_hw#r8$UfOd|Bp_ z+nddcc%8v@FC3aaF{BqaI(^y9VrJ`{dHrJb9_{4J)_E_x7Lh$U=4JDUCGu)DpMK`t zUxiK*dB=O;TJr9ClG*|HL>csf6mNZZ!bFs_B3OA9<)whw=n3OKIYu9*Bx%<$4+&+cT#f(o$J|U zBha0z#~lwntIyT)Uf!thE%E=4e|>{{QS5ShFu>&wcU0b~K6&v-pZUnmv>Bgot=l4| z=3F)Q%IO8GmVReFV&?07#&eYM256I!U*f=Q4$F(*^Soyku2#oY&*$#GTl2hGwYrnR zw^wBF%zWt9Y*q);lf3suHT|M|VyAgWP0U=*oz4wAy?Zlv$jl18tGx{Vna(|Lrbo`V z_V!s$zGk@zColTe4E2efPi>9+)rZHf+L_%q&UpC_O1y2ae^%XH%)}Cldd09zM>2V9 zYTN|hU?rE?*^D=H&gsWfcepHb$uYy*YIT=S)Uza6W;|W(Wjepy+1$*>_f!q;tz|~c ze8-`~FJWY_-qgeTJf=Tq4DRA{s2Qqf86I0Zd)CNYMnAuk+UL&Rt8eAK)bPKx_A+^U zc2|$6ue&QJ>IG|l#%1P9=I$Hba_>yO`!#iMob_e4zVD67XJ$5=o$2!Wc%yqqT{H)F z{?xnKJL1ueBYpM;xtgu}Qo>a)^6tHQt7hwtzk4t5oUmL##1*&^bNHtwW$^g{Hsr$%(T&-sp6*A|7VtUzzjvSc$)p+p3?98U#-BqjEj+Yb3EH&8dod>So$(=K~%}GF{=BX_d#Dm3q$Una%YUzB4!Q)NI|kB`3mB>kXcNR{dGnhSYPecg)Rrb#dm) zH}t**YrekYUh(J+{rHw*KH9bC4LK35-cb{4zWUKSPxaM%T?S9h;nSNlUiXD%E4^|e zG8((6CgM3;+{mhXYB_(-Tba)}Z=HQV^EsRMraKb`6OST!@CzT`f4=9cf(H{C%zS!&6>WzKxg-taxK z^XOF*;mNs+@Hw-8PH~&!mNWZoM*EWD9ZJl1Zpx>hdeYClmqE)M{#ot$)Wp28cSJjWV<7PKzUfxZO{Y)MC^5&U)GrzpZt(@5xevE=wlY?iLXP;GO(x3AzE3cPZ zG&@K!*OJ4dPeh|@bzJqhd&|AcR<35uR=(!yp8nL5=QcZfdg_jcs(52R{j4`WDYuC{ zp7f;$y{otK-Upqz>m70Lt@L<9PVDk>W)hj*^&R1!f0=~Mh}AaZ@p*I4Q}3DCDIXv&A~Wl&ygI0dIV&^C@6BZDz1+K-a^l|o)bg%;a4Xc0+z~D42ZC#WwwO znq}bWwI15`S+29|o!x@hV}8b|&v5p}%wPHX9q8QjuDZMVy32RSjm{5mb-LRBD)jsK zHfO)3?(q1!f>#sMw~U3(!dJP}yLom8FZZmxn|$i&k=G06te)8A)jO@@^n<>aT=JdH zP59K{jw<~*XHH&3a~6}!Y{xGz4VSXNR1da%AM5N^@;Q4xxpgDuM7^M#-qe!Ar#C&! zl~3=wnMGD+_hrmB8pYmK^`)n3vm0xMwi(V=?tE&C!)IW9XYWM5<1A(luJUUdVy-?U z^JF?b;-^P%5;%MFjBkCzz0)82Mq~ZXx_d5pzI(4aJ@b3n)X3CU=MB26J+1R6H@lgh zoR?h6oVWIT#P)QxyjPxj{(VZ`Tz8*ad-w9rZ03Hw0Y_8fZTs{yGiUrJGsjGmx2m2R z9(Funrw#g4dE=BhO!du>-Zb)lmV3qY?9Jwu&E(DsC%?&8NY5EwkGDj5u;bu;OVq0$ zRI7;BQgfdn_qxh_&iX-l(K~gQ2g%VEGyde%67giQC&#>O1~L8JY(_t5SHB+ly331s zM=!W)*f95;k#o;^DL3kxUgq5OaswW;(wDQkn3^-_tPiZ*5@OClzZ%oWJ$A6Gj+Y}> zORe(h#iLKeuSZTqW6m8e3vEean>)@sXzDo=O;66-*=NYSq?~(2@9pv2@Q#Sztf&S$ zAEh{cuas*t@Fv&XZjA z&+eM3e)&XhgCTD-*PSQi>T~jhcwjJnH$*>_+nBD7iZ4p0|^q&DD>O%C~OJr=Mz~$~p#`s(52R{Z#L~YGQhp zPbaPup3bLDO@z-`UqwA))pK8B>HHlRk>}An_-m%_gpxC}Y`hvfB{HL_vuADECG|RQ zp65HA&Q1BmITryc&46YMvaov+&r-=Ug+XIiK-#-kM{#^@IA<#HyJ|zaBFiUM4$y)voUcuP&-r zJkqb9>v#B_{u*Yx{zSdWIj81rG-|!U^LMkVIp@CFU%|{HFJ^GfWz4x(e`)puLeRe}1n6uyWir;+jPtooo znlotMZF7fkulo8S@k5VP?#^JAJlssvBbs+lRI7-mtK^-*rI^(U{o>zqYMFPgSpBIp zyX))rJ(RXlv&$G$T9{0uJ0KK2Kv%MEXZK6} z-rV{4y88=)&#F7xvKhq6bs0E&i(hwU`OL|wn-P~W*m7WU-7E)E;%$5RbA7p9H}fgs z+q;9eyOlSXy`8AX`(pBPT~1#`GnIGu7Q0?i54h$MGv3sg;VAL8^*`~X&$&Z6E-|}z zvs{Pf#n~NntMjO>+n`6jB6@n<`ld;U&?i@xX) z^NsK&ef_mme|nuWRQ+c)e3^A#<3P?qzZlIy=B%l5-joMzZ&WRBrB{A+7|0xbNo`2a ze=bIrG0a*Ih={HNHMiddIfmt<&`ogyuW3i z|4igb=A3)wQ)8yKySL@!&n0|02mNZycbKVx*I$qO#yx-2mU;H*+xV;RdT9HR{MmW$ z&8m(4`CF>yx9L$A{T_BI{LIgH^;I-uPV9KKig>BYFE{#?R(GSl!PN95s*87VOAeH; zGyBt)5#`*$yYFwE^Zmwwwe^eSym#5&yW_4s#%ryC%6rGl(+I-XAnJW9m`Jp_ZhVDJA>@cowu3MsO1LFKiw0{d|}Ui4o`-4@HFMz;AL<$ z9_PfTjR)`k^{MNgnsfEIgU))z5kKbrtU1(Z=La- zZ^n6J4`C9W+D{Wseh<;IFTC^pOU~W@ ztq|{r&lzOTe%N*}ThC0d-t>`G&sk4$&Y<(dHs=m!KZcjtMt24;+b%Dn*>KsFckhrK zJXm|id}#Q^ zIuG^JztuWl#rUy)ny>$DV1={mE}w{p8r=0pXzbZ~lKb2_Z_Q?JKaKC8-9foT|NAPY zRx|D*Ugx`Q7U603=iYwLfM+iCEkiE*Y3%gfhVJ4ecxHF!Zok`nXmw_{(X-*%MQ8T5 z2mOL~Ph?)^oqzBByI;8%dG1j=H#?1+cGZ(-ehM#hw^#nM`Shxb=r){lhj*bfXXDS^ z89rMcgm-7|_T=<}$>*FJe5;LT@jZKEzw&j*YdMSZiK(qAlzFDX+eDU~T>7-ZQEG|u zSHsP7Nxhqg?dpk)hIsG}WW1%VM1~0)mC)Sx=?rxittFxY` z?HzQvXPkYbytrjqueEFlZ{;i}nlG5&RA+YkY0O=x&Rjim`V#NTw>Zy75+BL&oJ>4F@OX|ThzAC&{oxP(D%1!Xa+v)MfvJIkqMfB>a zd(G5czqi&fsL6qH+SJ_lkZk6eGoQ0}^oyNGZ-?Z}i0MP8W~hdqo-tp7d!B>4`ZH5+ z=@rpuwGJU0U*?>}AwPdpc;V#5yDf9w!~25Ya(J%3f-kt{2Gq59tJb;^;OI+(a9!&+ z!~WcyWzSm1676>`m5jF-F-d!o6+}Me>ad` zMn8=Hq4bZzqvQK_G)4`W}wo1A4vvy?YwS|0ds$ekct`-))VTzL2rU z$i2(x>+SEyKAN}ahtZFLmod}tO8fi5?+w2%{2FL}fBe1S*ODS^j}8*ZS+4z|8w+zjD8yZpV4stK6)LE2QL}2??(S| z^v|Pz8qM7wM)StEqwhz5Gn#k5ioP2&4L6(7$kE)Ox%b`H4+DSL`u77LNB=bX=h2s~ z|1|K=qu-7G>uA0iwEZ=pvmK)sqaWwDn=KbieN8gS9b^KobGWz{!es3Q}-;I9$ z`!Rms{kt)yTa7;l{w(m3;r|=Mhtb^mIGVd(ZOuE*qVN7Xyfm4o(d2D7b#Bn#jON?z zZ^vxIq5B?hc=!Fdbs7CQ`fh7}eb-;(?N{{tYvkVm{rqb#b86Mw?N8f1kiPr=6V{oX zz90Rt;p0I2GG_bznBR>~WTv0C=HKDRt@*cP-~Dd9Gy1DQW_NWxYT(z={2RTG9j$ug zlVZ`s@1Fm`C&Le;EBZ`ZD_6=ntcxw&s85KW^>+&R0Z-1I>LH^ZU{7MqfrhjJ~7C z``7RJ{`TEZ1NrYO|BZea{rk~BjsC;d%y4Mmj>gNcpI_V4xWya%-zyKJ|1kQ`qyIMg z!{~MNzmI;}n)#oj|84a9(eFlIMn8`JVf1&S`M*u>M*lMI@@t^|H9U^_GFoJ&(cf>a zAA|$xUq*i%{p)D%+kE@iqy4{$m~B1eXl`(eyYEI{Mn8_eAAL8P-w*n-Au~MvF#2)y zWoz>9M}yg^JA;qW_hYv2#(eDocf3a}x90EO)7H%P9r`G~GryIa4^6|LpbBW9p_pI&q({>-s?_oY_vzP7G9hkLli@53d?WZx@ym!C#!$6uHeB6-vOy3V5 zeK*>-z-xi)cz0|5JMcLAGWz}K52Jq>{p)D{d+C2W`S0odX#Sr&zbg$-DKpAUuB$`MdNqG7qCK;|AZy8^0g@r_p~K z{m;?=G5Wuc{-2}&@6sPP4G-SGkA64$GWv1!!|40bccVX!`@f9l+x@*@ej5GjXgvIW z@O!X~{$ccwqxqg}xNLm*zuTJpH(P%_kp60GzJa%X*_yZc7W!Sx>>oy>+hjhD{&lq9 z$~(Rx`W7C%G+FL^82x_qW%R@7`_XsoL_16Qx+WKywzc2hA{Id1az@x@XhUNyhXm9flZ}K+HchGzj-}b}k zAGiMfz{lvH#{7rTKW}{*X#a7{_MgT~|2a4`yktdY?$O+~A7kbl=pRNuj9x~6JNka~ zH>1BE&99SRH@`O@M!(;X9sX|fk>kdXqaU~CP42^?eK(q${QkWoJO2Lj?~{M8{5$5~ zIsc9MVf2rqf4}wPz@N7M!-jCQ9#9{ipGRLt|8eU-4gB-ycU%8;;NP}>KhTC_7M=gT z@!&s3|J!J0&@9N^zl`QB-n@+FdmcygjX#Wj82w%JGG-d>$I*Cy8cpu!(fk^?)|-;dUako$oS#JNka~SEKJn^WRYZJl>7IjONdW|8_pDW8eDv-_Y36Xngn|M_;z) z4)^G%z+c8Z>yJaDe;v&?b?x`+!Oy)9qu-ByH~Mkwhk^H_{mu*DT6<703Y}WUuVvEw z_dEOU`{5sb-}FPn;p_Z(Z9LiX;N#Ypf&6=VKbn7|{JZ?P_1*7o|K|92_wCmFJ6yK@ zVIckEhVC=OM?a4KY4p#d|2X>H=)aEsTQocTpGV`tPxgNFujBh3MpOLR@aOe3`q$C? z*?t}EpY_MhgZF_s{*3Ovzx_Tv4&*Lqv(xvZ`SZ#@&%4;2!RNky;qCAK^}T=H-o6Z^ z`IZk`zYk>Ab3f)gcD{G?W!!(_jqh*Y#CI{%@aT8;ddvAXcbL63oX>wp$(J>MK0l(jOO3Nx1%3M|1kRZqyI4aGWt)W`8V{J z(f)ga|7kQ{vfSo9zM0>T_oMlJC?+5y4{V-v=7-UseHnAM{Qcmw@5b)!%l1Zn$LwXh`F>#j-FO=NFQY$h&EFAc zcp8uWVa)dXF~8gTao}Y%Xg`dZcE5}{`~BFTw&tB*M}OS#?swz&ZuD29>)+LH2X{Xj zq?geTqkkC9-`~g4KW)w5<)24iw*KQln*C3s^Y8cH$Nqja_>a*aMz5ovM*p9q|6}yO zkA}zh=h58f{jW#!`*KJB>-O(}zhmEx{&DnAqc5ZXwDlji{SO1t=*QA%>OYT}CjV~q zUq`=3Z8TZFgSUPd{oUwqMt?Q>*YVx_oBA+1{|)f#d0Izq z^!2}M1DVFy_atF9U7<{=eV)X&}wt<&UHJ`+WDi+uz}@ z2J&}=zTf(rf!}TYFz|=bzaRZL`VXUj9(@`8r_t}W{>#AHe+?bqpSRZcx3Rw;{rA!T zHhLZXpQHcB=>KQ*|2z8s8-4eG+-CM)N27fl{mW=F-1vF)GMZo8Bfq}!d&lqTFQdQu zZ@2%w{c+$=qyISi-RQrL{`=?;qyM=ze;2I7S+2q#+}XG|~tojWp7bagA$S<9%P8y_75WJ)zXC zo(-SY|JrNsb0ShV^ZLH}J~YpIM#w;4OH9o39$K*P6ny_W@LrlS%NBAQb`sj+yrLd? z+UlMoq`Li^!gAec#KEY?WhwqBMM4Ds1J?!m%Q`iCD!I|e`wKx2@ z?eFgZ*}^$o!2;gEd-w?V@I5qt;JrtRwiuJo1@o#7M#a9UA}vMPNtCGy{+B;x$Pql;RMd%0@5>e}naR(DpIPtDb9gS#>iK8j^L+_#U6DcHm3Yk&7~wtYB&DI6A# zktc8pGdPC}cwSJ~FXmZi{SIuwl0BSxdc6nVg=;v6c&_fhWEMXI&g5*~r*k^5cXJ2% ze#X1~Gu=me&LcP}ct3ImGw^=qa0M^mCA@+~lImhC^pKGoG3^fC6kZoQ>dm_b_qzo5 zJ_qNU!UT3;1eZ8Sa^-D>&B_M%p~1cutdN{X0BI#&g=*?a${q zJ?|bIz#+8YUBvU5p?g1~9vD9bWni84M+N)YcOS+uf(`IaMcrApVF%0+XA%&I1!r&wV~BgcW}moYKL_Gn z2intQ`wUjkfi0Y~c}5Mia1BfF9G>4Z#d#0WkHNbeskQ@I(trFb;g_i_mQL9{&(P)$hYtjyj#Cx{I2o+ z_Iv8j!0)WM`_JTg_piabpMkyN?(gXDy?f8C?=^QB-#_iM{;ZzcGs?zpe<$9{Hh9K8 z@SF#5Sny2Z`MlpVn87(*6rLBU&zL!54OrbH=WB2J&-e5eA6&y7d7TFaBk(=; zUVX>CQ}6!@&fow>u%y55ZUgz<_5E$0ePM(?ffk(2JMIeJ^*uQECX8Sk#)UYWa=+lY zgDJWk!Vw%7scrrqSZhCJ5Vmp$wqOIC#hIMXdHp<&Zu<9Ua*Ge?%jHqMTU-N3x2J z&k1e)-r*bY?ytbQ8Jt4CPe1Fvm)_;-vtI7WGq>OznK`yxLsz7F_#>t-a?HC+EYa^_ zW0$*y33&b%&fvUofqV}0gtqZnk>*>s58j>oOu@UG-1P6t)@^@($4Kws5?;b z)Zan}3wQx>chAu;;2h521dd=2wqX;N?AO5@rZ9r|tk>_E_vF3AU3ed&EuP~V%uzSy zeQm-vOyCea|8uy4YgoW5cnxpi9o!XNUkB#AfD1T=J+QBPjlh{bgJ;@@7S3S~SMU;E zf%o^ONbPI5gy&$soWThk!yz2N1V*q08_eIwZ(Yk7;C}4d$0}e6?fLMx3jF)v#;;QJ7~dsaBlCRE2!%;K22zw z-@y_#cKdtVLGHmJoWgUs0`E^=6<#7=fcG~8bB|#PW7q)q9>Hqe^w0bn>6x}}``<(M zk;mZKPvNW(_xBuI<^x>fyMpV&i(;E^z0ct2ESRrujec_`Z~!OZ9eQsc;2yq*AK*Lq1p42>8!*p%J%<+dz`oAqe9k$6 zM%^>hQ^LKC$8@pfb%X=LsygSdm4^udS3wQ}{;11pveS!48uHX{p@Em5) z!U5QC8@6B*8dx&J9XQtnyi4B;&*C}e1>e^W?!dEq2i}EuGKC{JfpeIHcX$bLhvw{q zbz86j_L|w3{W|t_2Jc0jNt|zEw}0ox$o<3~y6Bt2Vd5D51kT|K7VsLnqU*bWGdL|$ zJAB9J_T7SeW^kr!m={{)2wamJ;^3J^unnGb44ymg#rt>xFAE*=4cx)IB3~oTIfr97 zggvm=CM?-!4kPfLU%mU!*av3djLy5UOAhS79!x66*s=}gC`I1^v~U5J@Ep$IxNw3r z_5xnPqUh!sJA?z+1NXK6CfqTX_vYtedV>vHxBc1nk<-F4@)R!M3SPpiL|60$@*3uF z21j6@9kA~vG~hnh&_bi+-dy$FIiGizSz?D@*%fBUIT+vC?aw(ydUoYLj0@hy30%T8 zyn?Ps?Kzx-Io4Y{fo*8i-IJNSoBsXsjEB$`ysH^_U(aC^p}EIET-#dB*<7&hUaS-d}I@}2YSOSmu6ne|N)4Z5uIJ&$!T#kVwXx4$><>J4}= z9}=I?zlWdwp8xKI4fr|eTf%F&f*Blv{Ti^ppASDTTetl=j*;HQbMSsH;RRg70$vqf zBJ~?L_X5t~6zt)>9l$?sbXqaPl2haNV%=_Bd?QvG`A?|Ku4)>Fn z_htPI?qG|WeQ4nVuHg;5hmY{7Nc9i!4&K5mFn128FokVxdOD-e*Rx&1JNOJgfPY8g zfA5Qb2O#>5-@!GULkmY>k6>E#eWXla2S%_7ckJms#pluUi|5Vv5O*-eFB2F+6L-b@ z=Ct^{U(dA<$8ZK0@I2ui$Q8VV*9q-Qn86Y3Ku1sCr{=al+Y96!EWvyD9=sR-?#{ng z^6yCQ@x6gLw6G7`Fe+>zWiv_j4QLA9PgiJ>Q&_!I`aH8Uu{^u?Aroj|b!WuQvqmN` zExLa1&wSrM?`>oEYc{bbZ~~X`3f{n?*e%ld7Fa)rj-Ec#o!kC%vp{+e@*1>Xf_Hcc z=Wqg3n7|0)9^!8Fc~{=elHT_BETcq&?ixMo=ZNztub~BFO_I*qa1ZvG!?K{R&pVtw z<4gtnXot`HnZk2;39sQ5TtW+DXkbo_`?^}+A$MR&k15#G{`atd+rJC1knh2}kR^B@-qRJF!4$S(N!>L}p)FE< z0?xcz&%QkOhW%Rn#z)YAwtkmN44ISMZ$PiT9=S zURt<<*Kh}K!8@9RF>5;VS9{!`!|1j@?*(!JZ{Z!pJ93FWgCp31B{dUpb>&>nHv!M) zS(@GcGrNr(!6rDTEEDE-a1HZ{8TJ$!VV@R8CC56?Y~LX49efAidCv+b$SF9Bwf5<_ z*Y<|qx3q^7@cF-iC44TZzk}Cs4c^l!9D;Qt*aY7(@qRj(!xS1}uehtpv;MB8NNHgX zaVBRJ&vRXJM##WEz7w;Xey@$P_XvAJUPIjkrf>u;oWo0a2lwFbJHLcKgFl5o0sS4E z!WP)ep5D(MoWK>lf;WW@`4TSS435EE?_^1>pPhL@J>&c>toBgnOsnPjV0BKU=XRDE zcpu)Abj8-Eu1|dqBWS=L>JylOar2s8{4j~G)$ zcfBY^``W^8Ze+L&}t@rJ6rpawT>kH&N_zwJc`}ntI|9#ni%lG$He|I(R zoxF#)@ER6y4Rbh$7JLV`z~}GX`uu(F4SRdv&akoD-~R-;4~K;*@&LwQj(0VM3Cv*$ zBmCx_z&TvO8@LC*6aNza8veHMJLI2(@5TpmuHgt8vF{E0-S*G#HS#lf5B@(S;_vF; z;rj&d;VrxZ&wUB!a0(}I3{&t9M$mxY1ucxA<1SW<`-soN=vjX+p4E3E=!)MN&6Nqd z{?TrKZ!OYiyMQ~m2j6v{zjxth!E=9C;xCZLum!Dsndknde^=+X{b$_&j`JPx|0DZN zK|TIW-1zt8-h+4Y5#B-E%O(059Kk+#7u&E29ea5f6YxIb-IzY>pLMg_pKTkt1IiIN zuTpyg`!IzQn8R!M0G|H`@U!5#1AU*sybCyhM%cGujwMWP`{(!)`2jwI=Uc*CSiluL zhZ&s03AEr@r?3Y*(7@_5M&HI~$38yajotpUJVMHL!LyEG51j27PT>q@MV=t_OIv); zkuTvbEWz{px%b?@1EQ|)dtx8q4P3$zY=Cz#W6tecdc$*g39kw-kQdOx6eci&Eoi{^ zrvuO1!U!65-Yw5QdPaX}cKb8$Ah$u8nPBh1L1CKYKDrn?2G6~Kckmf}=RKp(U8yZU z5c>{3fp=uxA#6a$Y&F2R!o(JnQP5oYl{#XZ2an z3!Yo_W%OOc9W=ZBJe$bC`If})3;K7!J89t@Ucf83OT0#Z3D3d2J+S|TKGU0i_KVy8 zZ2rBC-|c?Z#lM^Q1$<9@33u=cUVt^8{|NSA3%t7)^0RK-2ik)B>hrFB7gnq2-q*^v zAP(N;q+m~%^-GxS_Me9r?aOTx|)}PsD+EwVA!wjY{DtIRkcYv-vA=bg>ZvVcY zBIn?{-W6UJ-x=}{cJxzYujx(yJ-dI~&+QrB!}sv>Kk%L<;_srA#ytO9@XX%P1UA95 zE}?@tv@n7Od~U1vzu5Y7EZ>bY-oYG3;Jlt$8te&7!TZ|S?VtHE(mQw#p8Hk7`?v!A z#;33i9kmVpu5bExeRkVFOV8#RpK}((ccJ$f0?Z2l^ zkUq-=yn(myuIQfi8jPPq3x}`=JFp4P=d4q(x99iVb6A4=j$t31!{^}47X|eecEIP} zQa`!r&%ANlP|-=Qfv<~8I8+B5KOto3{&YMk`~JjX}yyUge5_n5z@D1FzzC-$M_ zy+po%OLz`vV4rQUuQRmlwXxg(Idg)X!vfyIC-D2l@0t<(rpR9-{d3m%E11CqI(m6$ zExniEecpj~BQD~r9QK~#>tN%ypXmU33eM^|m+-Sc^uLq(|J(ZiF8;dMp8pf^x8OOi zz`AodgJal(M%W|ndULn`u2F8m4jjS-yoS%WD(!)tg8AK*Lio%QdJe11XvIr=^EcklwdyD@b1b`PK7>NzsD_5{CYQ#OLndvd00 zXm0yCeFvYzYxoR4!@mO0_>b_<@GnJr{v9yx+2gbPiMls%3Hvajzjyo`?qTcq)WJW( zKNluQ-`Q>W3-FA;fY0Q6Cugt&9kY7|&(y*QeWnd@r{;~oJ@4?F@A9m7uyxyi_j=BE z;M^ndnf@Q}AK;+y?~wX^?mv**!6}TOp;xopf2aB!d{6!F+TRp>UcSSg;RX178fKYM zw{hEle~git9qdhTPVde0-NV6d|IROv?)3rQgLVtf;eB+}Om6${lUK-l@VoYJz~`5r zo$v8q!Y|+>d9PssS8xGG;GBM5yxVj541UM>y#6Ch;a}mu!oP#R1<&kkmv9VY@HzO* zCd{`w+bz!%Jo`4><8Q??kn1y?!U?o+2>O=9R?nL}@5eglbnfrr&;QWBt9!`*2>%)W z3;ZYe_wY~fci_2y2G%))&&654gTMJbHSj;-6#hT>f8hu`qtDm8Ie0ebad|dp^1kBT zye8(%@ow&s?^)tpN9g+Q$%*^fyzS3)ja-7y$8&9i?_!+oU(x?NC_SIg*Z24bYJ7%1 zJ7+uH?VpG5=WoGhcL4t#{s;K{_Q06un!z1)vzz|&drqG@T)+`H-;|hlHV0?l+U?)b zGvo_+18?CqT!D9MUUS3#w|wV-bNU>d+xb0*=ZQ1`8TqHb@830_%U{73 zY=AR#FazhiW=_A$=ghrv+n;R{sjc5LZ<4nUXW(627t}q&i-Pt!Ora6#y{k+34tx*& z&ff(;N56$l_)P32oWT^fV6{JcZ}0X!-y@y>FW|4?cSZjN@)NN)5cj!>-csvoIfv&u zfD<@|G5CJ^nepz&yX3)h@N6$(0Ug}INBABZ_PR&Dg&A0De|vWD34Va)5B>MaXY>zX z>^U647EGy`Qajo0_xynLJ@kEx^SJjJjG+O~ z-Tt%HB2VD7;QVv&tlphxdIdheZSZdVtnA%V16Qzsw{QpV;T?FkIqZYy>e$mg-hpTN zHTdp%wtIXXxc443uzF7HHKO(!wr=|~oFUJl1!vd*pPA?PY|S%lxPz_TFYo6y`W<|N zCAz_wX4!pXZ%G$6hlW7vlloI zcn$Vfz5(Me!2Nud6MES575o66$@BRA?VnAe?Vnkm`Hq|!EU9zfdr?_dEl*oOwD_IHs#g=^Tn?cc2#@)E9#JVWk*_vCrnXZ?LocKdyvBklhh-a-eS z!~G7xXVXwKr`|qSu!Iff_V*q?L!QZVe2@P%96?9Eb=JGr9_)bctuwe}doRjO>@2K0q?cZPf{+yY8r+gOT zSv=PrG52$?5w)Y;{(Gz~((|~teVt>KQ>5QDqZ?+t<=H@-sYCZ1+AZvXITLd2vHCpk ze)+!iJf6cdJ%4(U43^VR!h6&bx3Enk3GF-=L@vAVG9~??kPOp|fju_C8C)}RoKLPndjxH<-DB&v-)o8<{p@oB zFW@bFgil4jFFs@DjKKX`?#v$E$uYcyPvCpw`~M5L$9@B+&l*IJXV}~jQ^#kH_r6hTy%X=&JD$NDocm?s65W{lEvfY!-qq-~|6I4o zbGR(1AA<2Yd9nZM`D1$rGJ!VPBlJd?)jd4N6z0%@_b}S+-xKHc9-K{_`y8CpJGz2J zLHiIqb3+gJ+_~-V_yzJcc;^dn_Az)qbDQ1%y*Wn86t=+o_Kxkfam!i2GarEU4a|v6 zz;lntU&3Vf%lD@9y#nPmyeMdQ@TN%5*Mj@H=k{%X*PoI8*%p6J`#t1$l77#%2hL#4 zoV_=8QQ-iNirhpR>&Wrm&0XpETJ+WI^caEq6u&ix@En{~oPQ2J183cbZ7|p8ChpUK zcjD*Dd-BeX3kOK=(erJAIUP*Fy`5|Ftj9T>X$d|{YwfiUW3YY%#zfm*jXdjTSt7lY z5jg8kky}Xp#yjv?w=hvU!wo%dk>H*(EvWCoCio7`pe>A)oWt20CAL0wd%IV&+wXmc z?!F^^V7!GX=wE{KPT?31LA%56J+1b->1S{b?{fRLzo!}U60YG2F5m>bC+D3!>wBH- z_RsVM@)9mU-#&Op?q#m~d8Ss0Jt`P;R?p&nZWcUahi?woC9Y5Iv6qFg&1s-p^yl$z zz2ie@;TR5J1a~*g1grZkGdY(timP4p_p`ctZ2M1k`+Gb>dXLU9g;Bx%)%BV0oFnqA zlemvr$(bNm``xg?Z9n5H!t?J|RRdJb2xfUd|(r0^ak?H9b4 z5!?}*fXip-^Reb0eCPII44dFA#>{ihd$6bPcbhmupBBIJ0LHK+-*YeNVc%1@D9n&Y z;9ka^!(8vyx@Na$6Y2Zv-W|+gVqBPOdehJD`KJZ-9q>%fzslY1@8S&k9IoIJ&fyrg z!M*L-Q8T&i@BIz(JMi~pzu(1o<|Do_bOh!>p_Qcl$GMAvd9cj$W;h<6Tb4 zw`SwEe`d!>d)e~^%%O#CC3()Wz1z=wiF^gGp@S>%EXHT#x#rYZdj`(@4nD#6;NO$T zXY>xt*@IEV7WO9izS(aCE}u#BtUrtQ>U=(1^X;(#6Kv1xOowm|SMU;?-MJT_&)5{a z^M-!bAHW%0f-^3``QO4E4#EB0_u9R{d-Z_OfzU<0!w;0&*&LvfexJg4puYj^Vzs3`VyS`3|@ls-W92R4$ke&_vG5M z5!UFYzdQHrU=GuY3HAtP;JtbGG5-#_KHnE-aYpx$Ygp}b)1S%QeHerHWX+76&E5X{ z$1`}h2L)~KIQMa{?c2VOGpKLC68{`pdbac&?e@Lw;VdKY9OgCTyZ<%lbB@M3CH4rW z&=w|0X47~j zF=uu^&v}o}*bLetuaV~J8-e%i49@KAo?`-2IDq|P>vyIGmgG6x1gs65RqW~Wa7AoH z?zGh1Be&^eZ|~20JcIMX3DW)J9y;=81@#SL*6$RYO`m=5N}hX-Aog$2C47yumN{3m zmU&lxV&=`kexBR?Cg7bMfipVutmucxeb@tY;#_eibM={HFYoc1-V<<5o_%>vtLMTD z##)$}Bg{B`*1rS3KR(|(@R_z?kIr+X`Q2v=#s$wH*`8v1o(p&Z*YF%#a8~!XZ%2RM zuMup3`!5T|rm(t8_IFt`(Fd~F_e3x6#aXw(&+;BjUkxWD!k8Zc*dZ#Vt^&f#+Ak#U%Vbv`3mqR*fa z^KZz5IV{0@oWL=hf_HrZ-hW#-LQcWF9q>HXdWI3WCeOaynfqUZK4)8t=nXSNN#=X2sCaJknV#LRolF)pYdfO9G%HbQTprLKXNz1`nlbMRSoMQVGd zAmZU~h&lK4*_S(xnVnbS^WhzM?-OW*I_sxkKlg2mJwZ0Gx|cNH2%jZuapO@$tbF4do8C<|6ynvT*UGyuY{)jEmU&A|C!gt_*m-ye`{&%?l)*JZm zaDo307k{U7PtB)N{{d;Qw_x86UM1;%&f-k!#@>MW5_5b;{~mq-|6V}i-wgbFBympt z@%Ky4>%T$!_rv}hoB!?^|5jy=bK2jTyoYmW;Q+?42|hQUpU?jq=HT;J*BAaNdIK%* zOrR|tzSVlxzi)TQX18aF9^4oI1~Jh#X8v`eMV}Vt$PUa|CafR91Pb!Oq8|B5?K}7g-^0&;-~WBYFOmLz#Gk=mz+b^{;ja_h=)Zvx z{AI%2z__|Oe-8ftME-v__Llg24}HeX{~hdrd#Nk`2L2Aluv<|7TQFu$p2uF!F7Bap zZ~e~VKGyv``~&<8{ChZnDf~D1KjHs^{|EjjwD7-*)IJ8|{{zhb&+s2$4<_Ke&gEWl zAMWj4d8hd<{5zlx_(hT0zXWH`^KW5WZ$HoLJ?+9j7CejhBKozBg;f71@Vx(=q`EkF z#P`wv6Z{wWukf$nS^sbFE>6JzH&*Grcppdb-@rQe@cH}({uF)=-|>zu!S~L0`Vih&-`bh`;WjG+JyFME~NP_bTFa5 z1;10AFYr4=-xSQXr{8lMxBc%d6XYHoz#*K#8C<|Q%-|G`!JHjvU``L`n$UL%+q?Z; zA0bcS9OiIUq~|rZ1NY=R&+05U)ZSu)`(D8t_y|AyL;wHm{3%lYtVs1=!3KO^a^E3e z!z*|J&fUU3jKMve-SfKF5qKu0wmBQnF;5GVg8Cem(3G5ebnkEq-hub;c|6zlE;^jS zCA=u8`wr^&9`;}hd^SE8d)a>vPT&eW&qwf#e^So==g7Y({3UXf_zn7R6UNN<-sIP? z1=jr){5AY7{C(l?kUOvqxz_vM1ZVgK{J=b)Anx4zz5wSwfC+5F26$H;%nNr&{l?8b zhBG*aIoRtZ_#CB6yg`2pci`Ud3+np3FKg{{3O-x+*oVEMYs(?H?*c{#2E?@>HFa^)FUD!f4;4}1@Dwm*dl-NY~xksM4*9G5$ zS<$WCAXn@m`owzs1QF}-+shtvXbV&12=aGh^NcgV4CdfxO??8!8a{UopWo)D?{kOr ztcP$8SKuAJ0q;`OeGcB+C75>x-q$f4!4&MFJ%eko_7nU7ey{mC`X%^17T;z1jemwE zyaV^T0{5`zK8#@-Ho<#x?qG>7VTaUrU+^x~b6(b?MyWqD6tkbRIMYs%>Lc)-(I?I= zk)u9=y@I-R)@*=%ol`ovhN-&GjOF+4=vn_veYQ*3*ku;jf>Dv$_r&hNycx8KdGU8h z(QaW16Buc;m-~)x`gdi94Cd(4!UP&|J?s0-k;{T}Wb`|eIa6qay;}CNmwR-ug!=*R z@LfX-jZn9$r-%0=tDet#IVw_Lj_IGmTt772**5IMF`U8$%;6dq(7|hX3-90qe1v=W z9{in0{GCqJ{oUw0VxPeLH(;+Tu>Tpfa0JuB0Wzci5X=dV(XBgyQ?SoD%;9;G?lCKv zXN|q~V5hKMGG&kR)&)44Wu@9czIho^|zJGw*6Sf1*WSo$IFm ze0fe86&hrqZwlT=2XRmL=o`1}3tI*C28>0X@*3taOK9siZjH4g7{fjs!V$D^3g_?~ zuHa?i8Y!2BIntcK+!tW}D|iie@D4r{-WOkoT!8(o6Lo!2Yu!iq9{jV*-v|AD(%&Wh zz4LeA?~eXH8NXAG(Rbk=;2(>w&)+lu2CVrl_`9aR)7me7&-^*Md)>nloZT}xljri> z7jOngZ~!~71r2z&-g6667!`c>z60?d#JdpjCgo1hgK5!~L5n^w#PeKY-xoHRLpH&= zMz9UeIRR%rhEwny!3_NzF2Lt`1)kYwxd87W@cGC!m?Peeby2TA2m2Vy(tPc}xR{@N z*vpyZ3{K$~j$jH0g?;2+!gFft7xTv|{C@O%M`~TWsfe7>GiELL-6bu|3fIV*4&NOt zi&WQV-W+C$7G3li3(Spted^|j`O^x05s#dlr(QF~H!5`HUOacuBt3k}uJ}Xdn0h0z zvaT=U$gW_Gdc!Q@OcR(ET4bC}U2?3pjZI(#4cI^Sh<%L7#5mZ04%g5XvL3#W5mQE; zdf1V7hi?hWjB#^o?3HP;XP^vSTOu#?YkYUm6&bp=7?-+kmVCy|UBW#yyFX?l`P9QU z{|>Boj}|5a=%0Z(9aysj>+Q7(BiMm)k?NCTD`l^c?R|W50MjB5kwft(=2@F3MeEnRNZy_l4%R*Ef*rO4)?1Bts8>*pVMH`YA(qzvyk< zsIZOPDNK+uhP^`g!f(uc>ts~nY#Y#k=ga3-&v*|VTqmhME40Xr{&|W=p1v+|m-Osc zzb;tY7N*EaqCp=)Jac8xrgx%2|7wk~z;~!qf7ZWS@s7oN7SgzA*GvX{=I9?H$3hP| zrKU~H(C47c{?Mlb{yJCtskoP1C#fE`ecao9Gx`GklVYpuw{BjDejWB5gj8P^pEC6D zhcElPQm>4@kIBdjY3>|mNvdb2*fJ?H?2v7Wk4j$1NwGstOK$8p$Cm3t*dfhp3sdA| zfFXbOjY>^}%=q31eh%bEYk|KIpEW;kZNbmx9Q>>*^Jg`3l+#CuymdJdw|DF}M|V%@ zk{*7gL`{}$<+l8UuJR+#!g1lD$r`29Mla<vGZDmdPn-WuIM#(=(_3AQ(HW8m+eWB;iWcI0BFB2FQS?k(? zIn!k84_hgt6ju)#bnhsmPs~wHD#EV}%$cUV><_&u`SDD&Ydz1Q-WFDQ$qxTI*^v9y zO0}z)@j7Q*Dzbkl&$RF(Tj+{ZmnIYWNWY8X`$j#}VN3Wz57}7jT2!o@<%h9Yp+~-c z^>IlES7SD`P{6kA#Ax&4D~o@?BTho9jueOCPp)^-%s{&57>NaKmN=pl`T zu9U8jf5%Y|f8;5fQnS*_2<-v|vQ(EY`5W}FuzvhC_LVMC+c8_t4LxL2`i89xU&z|` zl^wGovtPZY$-S+s*8)eOMM~IT$*3En6x=IxrFN$;Js)lTL1R2vpu3dNCc328G4txU zIV=-V!d}&sUiKAzS=SC<=<8&ga@B(deFfqx zS^VZbrtAMk4M#%h1isy7r^wea6YidU8M7EA2Hj!;o*)FZ#P@O~kTH`+QZO zb5ftU*A8DM{K_U{pT!p*=C1q?dy~7$8H(Fy&5HfqTfIv}EPOd0v4;E=_Ft4ul$jhW zDT?S3vZGh%%BGO@ReAK*h`d#x`eE!_tFDil;&<<$E4tFpP<(#0Bi0%#dFnM?$+ccR z_px8@X)K67jWwlj=y<-|!(wIiKh(pf=Bs=&vJbrt+gPjx$^b1s=?3`f&xjl96Xt6V z)#+3|)HS6?Nc};Vdh5%!y1q}u4|(c&*&|l!?;hO%`ZGFgIwD_c{S-1&H33(>< z>|YnpH922@T@&%_@5mG1Lm9!OFhxq6i2wc$U$#SEC!&6f~MfyZ8~R@ zZ1u1^bg?d^eWF*^BeyN}4RT1=m;L6gKs+pc<6`A__(Gb3?mHq~MSj<6ee|sVo>fLH z^oWH&%L(~11^<3q8NLyE19=YZz_?6`3|)H)E!2N!uHU!}=_CBoRKyJ4i-fJLb04## zuCXpypo^>MEwWR;>7{zSC;H-Dc}zy0QtS~l=xrf<+M$Qcb?TF{_Y^rqTm0q)4SL4j z?iIvdwahi4=bWf-=(Sp7eimA!blT5`8CCu|H``gapLXrjZ_i1Qp=$?IbZHCmek!vb z@yMSLAFZLmpJ$2L+A^auXewR%N8nodl=WKR5Z92z=W{U@^0C~(*vi@Wc-TW<>DwX2 zcVbisJ>C;#$_q z&TC7bkd1kuon`pb>H0fZ;1O3yYh6hDtmC1l`6VypP)*J^9(Lr`cH~6-F}tH*jrsbN zLAIOXR}Rr8f0ud;^7iu-^}!dh@GGN_ zdL7rUF)vom&w9j%WaN!YFl6LvLt9wQSJ@G(Wmoc)O~&5Zu0=0aKf{+?U#SsS1}21_ zWfU%oqI`sQD9_UHmo^U~_X_8@C`xD(UD5Nb#pES z;4x`TnxNFLe9 zFSOxDuJjaJ<(TgZe{c0aOYKly?F&0(vu?lGr;^sywb?hMKjw>A$R_oFiZ60PM!mNB z1Kw2hF1lhB51I3a^pe+>nDSftLw{>sLw&10U*$y2s(9eXqWD4%q8lb_D6s7LJzsF zHtMsC8l>l`&opS)dxo8*`obSiT#*|xmoe9B4aE%9{>bmEe*DvTV00*d$d_}g`iFZm zCsyQy)IZdB(HFGJOz-~sd?j}k%DJ_kYg5cUzQtEFq}m_(-NU#m=Y7i_s!6^!_d>7j zul8JRKJX*@5gMx3m;FO_Q|5@g$mvRL*dd#$r}iL@TgUXdioZ?0)b)o{UxztCcdSn@T&QlM+@+nv&ksJ26eC9{4`X5X5 zSjo8eEVG{W)csX$9a|-oA33J(3Sa0eXZaC1;fvgmQIqZPDaZaOOZ{6!ZrxA+Bfd6b zA)}9SoQ-1ZtEtj{WZJtd_j}k=U)V)orA59n^i^PuJ(OquIEsqYu6=cF*vN-D^|>Mz z`pQ}T7$-aHy2Dn69{#X%EPUoXwxTAaxw*F17sSOCdM*2C|I^sG~WFlrBnBNtt z9yI7K&(Ia(@4>Z0&wnRwt~51cd|>acQ2%|hF>_XH@uiRbx?-yb4Z4I~%T>IzTlF1d zfcr>SaE?*>dvo=eO&NL0CSz~yycWekI?rl`B4fU;#KJa5UHP!aXc+_AdF42I8}Z^_ z*^y&it><0~40xEM*sGb;V~xu`MY>1L!#>0w^r%-ZlA#`U$jAwMT=J3bwOU25_YS*D z@h0l5t^B3ikMGvN;vu?H+OU;DP6^*QIkRqDyU?!DBfjclPOQk+4uANZINNG zwhQ0NC_lm%Qn&iLwI~7Q0B!b}8g}R*!(Yo3|EgEY(;wJB^49sx$>e*hS z%3s@2Q%QS@wIS7q?C{(AK`*%v_9{5=!@Ru4#mN5Bt5q5=_9|0-Xqgun4_z56>)}%_ z65$WuP(1pWlULXwb8JYDJY|scBA$Iu(W6&LYo5|;T$|qcD``%w=ofaDi)8Tf(c6;0PClHWuFZQ7>Eq%InRCjXD_7{1jCtJuLARjF%WWU}Mc$8ssaNzF z$XV+emx%H)qQOv39Si#@azRq?l>EnX>=Vm5T_Jnxiyi)u5zjS?>`eMPfAmsjJxYh_ zeu~fBoS${~sO{J{%bXLsG86f=FKpxL^&0YxNs?IW^r$ti9=3I%Xa71q=c~thN`CBP zP1d8wI{8y_pW1_-ZS+;v*r)c@cI>4;R_Nn!Aj6kjKiOxGx=;2+EM(s6-=asq*lV4P zJtALwNRRqDp6#g1xyD`NUOdQRt`*TM>P%G6_S)h#fv68@TIhA(Y-c@MFG4|vo@K3T zLtErmx~(E#-K9NVY5k8J&w5H(sS#7wn6NHxY@Fg*H&(CcV_qzMkJUwu`MECJ`XiR} z&52d#L|#bq%yDI3@A+~sVTa5$p@%dlbY-w8#bHODcD=GM^pJIK*v5nKDHp|12F3Ld z)6RJj4;gil6Zv6BJn}=1ixPQJ7x8s6*JXXEkG^22-yc&mt{UYYhO$j=8~Nc6JKAW6 zFLI29FY>-6bDwp&>w1R2mbp*#kDMHPs=g?RA){y1*S)hHdPr-sUfVgg7|1n0R^(K36O)uVPu>I;7=dr%h-+L!we*HB&U z%Xa7?qfeHLY&=o7Ch9^DJGU6}MSP4RLu;Mi+`2B?xlVnNnyZH$GKC-1$6^mjrPot) z>pJamb`ID%Cvvk4y=pUP*15GEMeF=|mdJgotb2y74887^{fjD3Tk^{J*{}XsEOOW7 z=nu?YL_v`eQ^p$7t&=}?MXkN1UPC@}tdqR5UDxH9HO3>y*ihU&SL9`>9`-7!vg_DT zPWY6OU-!*+=!=w}dxRc&VJp}9a?X$*bxK#r-s*pbZ;_o((Chr@V`&}B?dn)<=iGIA z-fLY>_PfVp`{aJ159LQJ_YOVsL+a0ZowqI?dF!Mz*thOo+vdq1yK=wWC+q8ao0ID! zFV}`1GIDZV)+0V7b6)7DWIgXU9%vu+IWPMLN*;At8~cPD>KCz) z(e$bIP|xTwBqLwBZjZ>x_2CPdV?R~5$5Z=^*W?b>uk+~-oHg{EpY_O5)+_Qt8qa#2 zKNL4V6E)!rJJ%W;=fHq&PF}U0W9kwAR$p`1<>-$-AwW|L$!6DIZw@vTJ!4_eIi!NIzQsIzqWH; z*6X|>dt5oS!xu7A7NHawb}g&4ADNM#1KF4LaZXBl&Pnc-x-Pb^mqo^Md|i*#2Ia@M za&o_{TmG%uyiZ*lv7sK3n`5CzEb5ivGeFJIu%=%29`e_D z-?H;O_LNvTmi34aN%PjNh=q*21xiN0IgzJ~xUqFB*O(tmf4#CVa`k1su6e2*JtDuh z-6yDHQKK~H-@2kl-Y@oySlI3rzK}m>n`5=Vwxh2yVj**%$TKz+&$;XLTpRs{ za*cg!kH_kVdg_aw%FuJ4tVfR_pS7}X-@*;s`jh9splB7>)v%vj_1AVyvOX^Bj@Rlp0#dX)R~j>jJa}6?-~9XeT+t* z$TSv&Z%9U6oy@sH<;^g6$`BQJW^ zcJ>>qIVQ7w_+#%mnYM(N{y`P#FbC_T6uW!g7HIGT_@~Z8K zW&a|a$na;G^_2RR8aZD%lM!)c)>Fz?>f$TwX@-4=>S~{PvTi*VvnKb;x$E@2k2$$M z$3oA2!l%r2S0o%7YL zsn@q^>in>+i`tM8TZB?c{dKIitCE#D9;h42d#W$*Y44}3p}g?re)bA~=-CdR(iO3g z`WF6p!m=jUMaeo}_(Mj1$VDhfb0RNfgw2y!>N%&jBhQ?nSoW*uwa%{n)+}JipZg8z zxhCsFx!>~rTkGv#_XvBDHVacgV=A<+tK>{$sYiWKqbu`dmtL@`_mYJ*MY+^<1Cz=#lgF z4dp~`#Im$L+jVZ(%E(*i8;VEnP)y%CzjYBC59kqFC#{cF=Y&7xP&|C*Wc?|2lz z&%SkfB&0Dvui50cl>c(wdXD=hgnYuC{Z2j%9z$Xgud+JNw5aPZ=xgIXB{2M*X_H+$-z$ z$TeB7`)51!$9mPVsBw?S_NnW%#hN;X>tW@XdbS^u9`T#ANQqfb?gusZ|5mO=kstD* zQKcAvEGJ?M@+6jiZDn5Br|vRGJ=@_|x`yI?*ZT(sF%K68+z@p?QiWh6p!A<>=z8>hA-EI zPid{o__~~kD~DFDi+)3SKh+m~m7(Vz;m@(qL+1R@>)4_MYJY7<{bMp}Le{zZ7s(lU z*=M-6qa^afR@T0u+BzrK59#)h$Ley-+*qOKxUuj@UY5q{cwKLP_>`gRA6hxSPPcAR z73W+-+TjbiC_d%Tio6`FebFQ5tm~I^vR>!ccFrBr&CfOCl$8C+y~?lajAvh6JI)P? zUgzYLoS*falk2l?PF)jm{dFw&To;S_r{qRXt_fW^j)Wp3mff|lwsY>cboY~b<(_qX zT}|#WRFiw=-2dHry?5^aQ)h@?)`cGZYFoc~Lo55U9=Z0Cyv(b8IXs5dBf_(SHjx`(ms%X+TMy|SKjLeKHg#}WLA zGU}qwPbs(7y66$LVH;bwA{M#kWj$f_#%Qy4*8R zUh8^>zm|{fKeS)?LOxdizatj&Mz7iqf0o~xZ7BYfzIl((tsAO!4;flHHdH%QqtD!R zJ=fLL{#>7Rdp~6j<%KWz8|oE#5zBVgBmS*^k!S5t{W{-}KYA$_$uRd@`H^m2auy(o#FUwNJbDMNRla>JL3+of~$Ri)>W-V=+@>pO97gkIcxc<&P4RW0CYwt&bl1)XmF2 z{rd76va>Ji<6QWN9yN8ocElbje>7x|=$mETH``gaCfn-zTp=SKvXB0_u8v0!{o{dt z(Z|?Rm%XB2uF;oQ?iqTW6Zu1aebx=dtQ+zV`OI~#i;es6Lr&y{G!QxA3u#O}+xqf~ zSjZf!^`V?`m6UVT!wy-ce`St~HI%C_``77X^28NVJ@S>I>vu(7_GjIkY^!ICuUkWP zksGn-75-XAUhUUj7aLc}IZr*?=87x(d(V%5Mvl_Duz#F6?6GFuie9x`m%q-xZjW{T z+{e8$ITpI{ydppQvR>y8#U9Ja`RYF$xDC4 z^k==!3wvEo#K);mO;<+pOy#n<_xf5eqR#6m_+*jbLVk@TUO?6WS{W<9l8 zsktunI={9b>ycyj3-pJsd~8L0{76#d)G3eE)VbNN>uNja4(+Wk*Juyr}&du?Zx>6sDMee#B{eiiQD5zwv&wA8Yx30EoHE2d{-8+)QA2R&bNnY6= z%Fnr3k6yVx$3w4shCgJEt4F`uANk5UC+8Z^cIeiqD~DF(<(R(gUss!JzNObaYWt_w zKV?4m2y*}IQ_pLhjif)tzb+@W`O$NDtmd(pJtH1+kvAI9zZD-SS-GsMYioNc$ z4S1m7fCK{vBp5JYK>i7HzI)Gi-+mT$-2Fym_1Ic=x7q$-$0L+V)#`TU!JKa&P<}dn zE1qt}qp!P>8GXs+tS+Xux-BmrWzjl4-(mJv@>g>D^@`qe$LB28tb0ZM`xM0LtGqk7 zRrA>4^)&LK*7-Z`=steFi>Ac;cDx_mRr8*^Z@8n=?&=^V58|_OmP_pPj>}A)@$W%C zo6js~+`Bt!KG%8Vs@KdJnol2G-m80hnezs@+^g69%%je|t}3s8<*j~vtIUe;Zp)G3 zjhd}HemN1YtJL?#kb2H~lgs#u*JIwj!_|$-v&)Iz+Z`slS1h)#R{bd?m-CjUn9~#V zZ9LNSo_Wx(c)Zu)){&FT+ebd^>f*uKo45M*8K`{TcJ4ggd)&lJGuMKvJYKr1>ebWv z@pil!aCI*|IpaUdoV}N~y4k#l$5}L2cX@E1i`Z$&eaqav-*MjdTR`Wkx#ykg)dQw4 z`DbQtfb>2)Z@^I?o-DQGa<2MOzIwTHI@XWm9r6_aDeYvn9Q9=_A?pm+5w?~VGFcSL=OoyHxi)9%X0 zUwmd%+(r2_Jo0agaLwowQ&U?!Wz1!kId{)iZl6Ns>u&xGxo6{b29HYLc3@iFILfTf zajWL)P8Q!YaHG9Uw2nd)C<=9ip$JZPtCCN4c&Ki-WA6;+v$O$!2LG$Kk4fo zJ$rQb=)L}0|99Vc{a&GMWvaJi@7IrW^?L3we-WhUp$!EaNP zXLp{`WvDrBJyYg02Pe<1)Y#GF(uYRLiF)tq`)}oQH!J2{=JdW_{CYC4-(4rX8eGnL zz?xHoPc7&4Fr#gf3(P!o?nGAmwzzkd_O96FjmrXOGK-0iZ}gD(r6?y~qQ zk2foI=G^tw%n{$^^^15`H}!ycIxpO+I*mJ4&Yf3ZMZDEt_nL7xd*r{WrEiOGk{5k@ zg=DGfm%ppW|2b7Jx9Yv_4Y-p!Jmh!dvZ5J{Fn*q(&!svhB}USvi0ND58|oSab{AJ%Y1Tr;hfX! zoEfy5hSovP)%^d~Z9=KY1 z(A0CrpC0GrnW@a*nRl++xs~_yfXQ>0rbK2vBAnIv)K+LlT=|mMyAP7Cg|4S+?&xO0 zob`bCj>=qmIxh8`S6<#tjs4lmyxERZ>+p)7Z=-9;af7DhoaJxg;wLld&zWf5^PJi? zNSYn2r7oX)`gaY19T)P4_wrVHa<2Exh%Q{oWC)zS_IH$*tzR$D8z7 zaVzhg`BUe9W}V@)>Ym!w+1vQJXCLJ=)A`Ulk9^hK)w#*MGkjy^El#jgmA|te^&?JA z^sf6phve&8sn7=dEXJ^|rUromY7DCV4AoIc|Da4qxTeR;ZtBt&YRf@!X-Q)SbbcZ^ro}za?4b zPODtq%ZbOj&q;g;W9V*lTxOW_R?g{@7cPyXem0juhyNsN;d0=49 z(s0Q;gS)1QYSOvqtPXl3bvg9p*)93%bzkY`^@;N4+$*ZrT=gC8-1yc!Ih!|*?ra!l zIg9cjoV>WFVa^?gM24<<-SO61dAMigEGMq=>Y_eT9+VT4>wL-OOg?XxY&5X1^uRvCQSXeR%2XMO{pX+@9o^<)N8#hs&zk zK14c8kEmAnBOb4QQNOr5Os_sMiNT|IEM z^q{GWdeh^KmNUCKF*#-`HTKnwa?Hi1N>%?;gEbH8b1dq3TbYnwZ*Ze#X1H z(ec|PL1(DdJnc6~&psHMl6Swe_ur07{d;ELtv9+i@pk-CHt(BF&a9fdxZ>5p?q0`p z%X_N~xo3(yw0CP(K0VBeCZ>+r~YyIxTAk)C@hp=!x{RDy@6}x&XsF1Q)hM;jqMHt zovWwr5jh;WXJd2*k4oP*Oe^n-C-W^;b9K*~-P>@PVb@nNZ`Jw8tG3F(g;mjJ~^-}e0tR@x60~Ithdzajoeomvtat!$(XAeIt6dLi)KW4YP-XS-|9&*{W+&6 z^Eu;RWz45v4m`?Lt?qe;nK#l?XLPzNy`b}vuhZc2e%{Hu$>$yTJ&9&ED>jzX8%LQd z-(ddeTl4#v-9>KX?9C(8FIMl0*Oz+E`!s;gP&rS_4Ys+g^z?Q!d2e)ja%VnuF|&Iv zG0TfxRy*2}uFqTSIjf(cZ-C^zAy3{}gu7Du_i3)^4f(pui>X&m4OH8bd~)`Nv3e_a z=ISRWmtHya#~*0Z^#*6eaF3Gy;*nt$tRcdmZq4~6ZCC7()6Br(64yB*WuQYle==? z`07sgeRx;?j+fhK&Rz5yI>bZojo5Meu`_3Ne)Q^tTY1r}D;~Wd{%13pKbyB{0DUL9 z%*!X|Y*v&9J1+HSXTJlquih|=KeNvJ;{tn`?7&m3H*!^x+g8Gf(iVqf|4MtYplyOI|> zj~usbxel+~y5gy~d7H{_$UDrrR<8c2~aH^FV1L{{e9r{x3eAGWo>-XWLVx8C6f+05t6=i#9$CU-M5 zKW4ti>kYAarlt16ny;9)PV-KuWj1FsqFUYMS9s*#79ld7CWqb?`k7~yljnAKzvImC zCVf;juV1X$^fRw~@OHi7PTtBHj_g@o@tobbqWf(XGpm-I^KbQ?-0_yk8_YYyEa&tf z)m{G?a?i%=3?7xf?ZC9Uk(rziPTizuyxlFnr`~{jw#Kb%ZJI%QQV);&3iC$i zLEl5rpB!@CBl1n7?_3S@K7Eu!OTF&Am3rNGh(*<0XVW9<>F&yjdcm4sahbX5$&BxG z-;lnmGxxk%GaY}GtGDXD4}z}Man)1z`b~A$FV7ovEp;%v`rP%qS5)^Fx?J_L?;Ux< zaj)il1MKGRq`ppr+e1h%v%9!YuL$oPXAVdGBIcZr!kur6e5dEVmCg;?%DwV>p2d9x z=(FlPm2(H3xtnwM&Pwn2Z5*Jf)SX2=cjw1nw3XiRm8<*y@%&?x7aziWA3n7$4HxFj zYR?;~JB#{6^3HndO?iCIqTVyq&kYK6z7g{$xt#TM+)CSrpr5&xoT#_@D$icIJwnXx z)fcu8WA(dh;tnm({7jKEOU^m($bre@KP$6GK5jmHx8Cy|vFgw4d`sS`d%cBjk;`4a z;+Y4X-fM8~@?!PMV`t8No>+b-x3X6G^f2SASv_bLp3a*dy<(?v$I4l6a`@!UtZ?Pa zdpWP}z^5-~w4I-(s;{x!sLm%>Z_9hD?($&OxJB3MxSBQ7@o@5@esOo0c;riOo!PrA zT-Dq~JXFOy`_8*3dP9!=O8M3mFP@{j&)(|Z^oH-$oeZ3O-Y}CK^NQE!Em0nX>+*7< zUi{9fP5Kbh@0|>+xXdx<-etV0uV&EI^yZza=>gN1{I|^9qIr+bau+)-xtz_2sWB&? zv%bw?V&~DKmPkJL^j5y^c;zzZtX@6x>AO02x6G=Em3Ifzlk=9QW=?M-KPY{mGvYQK zaw0Ty?$i1JwC%AS58a)bP0wo1S2CY7p1S9~)RQM;PQ;s@%%;EdrI*B$?;V)|C|%Das~YV6Ne=FL{_>~8hfJL=qV)&pm$CC4nUufxow zpBXLnE)Qo;KYN!`_fGEm_qeAIguhzeI`Y?ht4!s|RW9F24X>3v96Ne?R}u}ruDJS+H$`&Kc+82bchS8ouDoabQJ#0Q>W-G&(Jj6D#npZE>d8Il?nc%3 z#XWeMGLzWpclZ0Rc^GE%$?NVoHPO5~c$7n{ncQoZT~6eUE44MIj_% zzT?!yD;~Z1F0=j24R0mpUHH1Ex0|a!zo%+7Uv+jl(ah#h@Cv{3G?#ln3jL6_*+2yp?nM zG6)3xo)mLc6y)Yxf*`=zc-?s*jRoO%I_0BT6g)xvv2G4D|hn^XL74-_YOIDwVJIveyeI{ySWwaA=FzT zeHc5RT;BT-8VeqMRb%h8?q0`rS#MT9Ui~6oO0Rfl*T4Amb~D@-@#?7>J038#IB{v@ zMpoTZ%lUiW%sb3^>+1XU#xpx_9KDm@^UPhnnfDzzvGdA_W<`0h<5G97@5!$azrFGt z@m+SGH!}y9<(}w_k9nH`ajr|qe45CwG<-)|-f`w0)!kj)GILM%Z<-Z5FIv?*A6)fq z8VBZFeP-d)Cl6YwGn1i@Dl>T5SDB9QINw7{J?GAo`Zf)6A~bXE)A|6k?XkTN9hZ01 zL1)r>;GC0Zrp$=R-3-l7-b;V--1BD6dPL8sN3J3s%ekU@hrVHE?@WW!S7meX%r&37 z*^W~K>x~uX9kKe7N6SL9d(Eqhn_t5?abEsiYGI?L6bYG^e|_UJd9Z3xwXo}r-nC6Jv}+&C1YpynVCG5w^#GsdH?O+^;W&dp4$Dw z`)_w^dzT+ma?H7F+UJ1gtOjhFp{wr8-)cx#6^=}cVni9M% z2PRjuTN-1&!mm7>S!tEu%bU4}w7l27*DcRQb&-Xo9R6>`HnooA)N?_D7H zn$<57&pFRkKKE{x6Z6*5J7`-myNjKtL=IQJiO$N~^3?-hId{;x^TB2571i89TP^WO z)3-UCVCUn0t$b7cD2vwV-t~qEpR+!(YTFbN@l+qS^vu{LFxTD8166mgXa-(QE>Ueu zvYF9W9&XT-c;D{7nPcuea_N=JTh40w-K*a1X3)%u`p+)SP-I&<#cSYf?|?@As|m#y#M z>AY~O>NM|=VYWK2+7(>o^NpPIX619wnarNS*yY7y`)WER`{K@ zshPTy%i3}&GugAek=30puQxSkHSdCO=rl8ZrSMxhCs%oH(^l#^tFI7m-dXvc;kkMA z4d45od9c1yIlbNYn-$a3aj82W-Pe<-Urf!}w?%o7TxOZ^B{$Zu3Qrb$a?IN_i0SWU z^VQF;*5x|x%%6JB-rD9Mb{@TIB0M>F5k6=3t5tLC^cDwJb6A!mw^pSl`i^_%;5uC{ zy*YQcQg>eYxUVLXaYpY-UhF(_+@h%?f2UQh?)R(5zx$Ly=e(1%mpbl>rbqP7E-^6Y zpg)Y6%h{})A$j+!NRC_eUfuC!)%l_Lg`h_Kf$+Jw1Lu=!~|S%~j7n2%0kMerNB$m8*Mtozt^P2BN1Ycjj$+ zLH1Q0X=J>!@~Nk{&g@qDg)LQIPVSy7G7y}O_OobkGgncv1jTY5zKBh38Dcg2%g-lvapso{OLjxu@MyVZ{eF1>PQ zM0}KZ-@eYv=S{haS3H@~U%w$ezt!wp-MxIj`cmt%aCkaj$E|L7XFD>4rjIv{-q9D) zhyN&-erE58tL&Lx@7A5WdE0yGgG)aB_)=r9dhXSWKTEHOmUDWY>rMUQl^fpbGTfIJ z^;djG=WeZztDfA`&)f7fWxnRzL1*sf+`V(AcbUqa-PmT}sxR-?jJNbuz4D#T4fxdL z%y*cXoYU(~5zSdlF0&oKO@mqYn!B=lLoc_wdva$wclO!LU7>rAxmM-$R$t}WE0>vl zEHriGyE{Jq>Nl?nuLhU1o+IQQZH}38zi;oqEB@W_aq`|r_T$FQD|b7O+5O|m%bWQO zz~#NVr|#}6l;`Sc`zHhZfg zIk|enw?w`A!PIKr9iN%>%jv6_-qp;FqdVq6XWyy&rqFmpI(#pES7zR%`4*aDr`(z4 zM7Zy%yq&W*>pPuCZ`Ihz%ZvDPX1`iB$4+l?U^R#3^2jak?K35&RuAGqr}Q%)Wzf=# ze^vTKeP=h&sV)bvF2WtvkYjH}OWsdGPfza2 zZ^f5+=Je*Q&wQuhLAO@3`W3A2cvI|dbeeb6#4ayqCXv})-x(hHw}bGJmN(PK?4F+b zj2`*A%Y)p>TY4+vkz=OVo!u*<>%rfZIvR85(<64Cysb~pU6dE=z1(YtT~74Qx8N3` z)r`frK<9{lHFAsomg0V9o#C_Up4!#f+xWScy}FT^^pK^{R~~h}>{*#xdD6d{xs$h? zD^Gr(-l}B=Usrn6xJAi>_DvW+dfZp&jUzp8=}(Sq-Bx>5+S^6lK8eS^7 zJG1^Z(>bo((E~bjYi|z9iD}8KJY2`CgJ*hr^^@7FaI)j?GTd6#k(RfrFZcA-chIVy zT-COEVD4A=l_%fG8UHGymj3*-Rj%{v?KEz}>+y{hr@q3~8!LbEd_#VRbKaCQ=bj$5 z6_Ppgqn~+J_y4nazMJB^oNq+=LAQ~ZvyL=;+w7X@`1Gvi`aZtoxN9XZhn^mJy0t+XECJPe}-$% z+1)eUn^%x`^KCP{v3lo7>uz}yT-{91x6G?|H&JpJcJnV?M@}TloO_)6pjFS7#yM9HboHf&*R@`! z5BZ}~@3Q9fxQm&|S$&1oTX%CSejkRa!Ck4Ea|fO4o#gl8W2dvypS*MR%Y$lSYTTu* z>QPTm&g4esb@byMZ#{$Lse1d)uKDg=Z*}+3R&RJ~l{c5j?B0EAYOC2Cs7F*|mvi2O z)0e1EuJgmy>bUC3z545(-fph`ElgEYg16o<8mJx3fGH#&db?)2`iKC;fD{%0}s+@(b4^xO;= zf5=_Qre~YClY?>>r|rSJSJW?7eYI~xpsB0bGoSbFSMR@F22Or8lh(7{Pks1ROJB!* z2+bvZsrwFyr}ODC*Ll=B)L&7reBI?iXFPRZ@4tn0|ysI1V zwO0A+yRzqZm>CT$7hvo1y)68^N=vnEn8a}wnZ-b+))N@t`(=U&= z`ZE8_Y+fYmEPAi*^5C9JnU6HAM|aDq+o~V55#(>C3qP4PzhAh6CyTvu+cb#!tFQ9u zXU<*kvzT|h2kzxi-IdL_Bo~9 zb+hd0P2O3oK5wmVnA7Jj%2!lhq5e)k()1sB&^mpeVbD2!%(-K)JDj!Bb`1k_hR)p? zbjFjl%>_N@m0w;j@to(mufW__LLsWJ?!G1O?iqGDJ!o?JDt3Cune+Av^_}7BjTN8w z>f5O~>&d-xYG-IpJo4)i)7x>WAI)UVi(3R%b67t7v%rmd$2~J0m-_e2+alb(i8uM2 z^GwIDxGjRKIV>Ok{*w2;sOC)(zVo2#0rezD_NdGxGP@sTQ#6^Q)kvw z`J??TvyCuqt!DJR#Z0FkPu=0Jl=srxaj7%wIeHgQSDDGV^CoxIyYlVhSZeI_m8v;1 zT{gLzamQol+v>^XOlDPTV)f~7Cn-%*#n|!__pO~|G5zUtC zFmL4CdExezaKLkyTxQ`cXV6*g3^TKb`CIN}-cxxeXLS8ya^_c<89nvB{Igi^xQpD& z`PuvX2++@z@70_;=*-=myLUQ$>x_lNqp!P>c74g^tS+Xux-BnuS?{3Pa4YX_Ah7f5 z6T|-a`%cYS#GiAQPcHpi6`t7Zn|Ukevyg(UO6$foV}5pvsn?IId{ER zaGR!@ho|LpKD$fC)|+?aM6}K2B6@FSSMTnst+L7M6;nH!yLaL8PTlLhyg@Ga>UB>K znXd4xw94aM72fK{yUJ94m9OvNtJ&&d*CTeG^d0HEN#!lMyYl|K;@=(j>54Dk%Y5Z? z&za1g!Pw=+V*6@M-!|3ca#pWL(({almu$`R4sCTFwX2x-a_;iHXZdz!)Zv(`mb_X; z@5{R3r&7>dqC@znabL!$4DV&bi+VWLB8(Y&Gh7)UU_kAZo^qCpS->fyF2*EqNNVs6<$g| zd(EjOFPB;7ou5)2mzH`rwQjEWGJoW+xw_|_)RN~uJ9>I@Pkw8BgL+hYbJk$K)8Np% zTJfDXId0MxcXF3c#AE3dQ`56TGl|UZt6b%e{9858-HcdmE1r8aweq0pVW#SSXFvXW zuk*rnd|ogwr(cv8@u%jTJaa8M{i(}|sX3c>7i%W>E+Z#;=UdRXxRrCgs`|ZE zd2gcIaw}ZjNI$n~Rj%&U|LlI{yYeRQKl2S&ywy|pe1E&}{>szcm8-~`+^N-Z-{Pqm zcD}*y==9{Sd`J47$*tZ<{#)*o&l|qkacV29@7JAN$9Zq19r0+p2MVro#dcfIyu498 zE3Uf_XP%rT=YEFxGvmBRP)^D{J!&f?)A_wcuG3fd{#WsSAK&J@LcR$fCEmA>d)4r8 zlg`2?uO{kS?YoA+jzjKv@1mvdoV=V*xo?A@yXyGL)qU>{4NhLHHu%)GvR6NQ`g6YO zJS6!?;d*$?k`)uYTAG$?`((is} z@4Q<2)X$K6v^SV3_xtw#yW-y+{lr~wRm4o`#Ea&D6a+v+`_V&N=AE zH_NSj>R^43jGWl{;La-ZM_%5{s(WhAXSX~3%3bd#k~1r!@3Wa}bsF52GJDluZ)Ps% ztr{15=ab8O#N|EZUVWVxPv`U274*II!gYLl^4*mmk4-k`+{s(%VXhjxd}`$D4!0_9 zWYs;job!#G({pvs{Mq|>)9)LVbKj>y)Sq~yrLWGuA*SAO=)NVw;Y~kU>Uio7XB}yJ z&TyLs&_2s_dd;%$^Je?dDUmrn>{j~WI$z##PIUI>3ia&^1G=7t z<)+tsm+82?nKzup^mQ}7m3J!|`;|)H>UQ2qfAY?&8}ee_aTf8=l$^8tO}y}P#ec=) zQ_pzKT)}OcKxe3&r{yb1&puR|l6Swe_ur07oviufugt4l_a@$s_Z@HHaTf8wQ_0<# zcgIMLq9V-ltA8C%(JyQ_bYwW#q(q z@0mT{%6WBzH?O?Qt*iIyTinmAGkjLvQ@c8Q8$b8#qkLwn56!L`yV~A}aOhcePwncB z&X;$(nT&6P&Yf2-GjQy5*4dr(=gbXvG4Iy7^K8RJTRF>-qrbJxcDK2?;>nry?c8fF zHT@#mk*?31psgl)2i;i>gzrjT)Wa?(?vn$%!lze##i@gg2I3)8cy*c%uRvB(uIm>l;#n-(jCw8~t&h%BT^4lc5=U#oe>lIUD?)WQr>mB#* zp4t_>lK+=^l$OhOxNu3(YHX~ z>9|K=F_;z8)^VwS>zv6yujAA~JXE4{^31DS>8}}fi@aV@?HS|_m00iP zo-?`Jb4H`?=W>#2JBwz1Gu`f|Rj@4uY}M{n=8+oV@iuDd*_CaTpvy>;FUEwH=Q zS@nr}xGyK7IisJI-jy%)qkBi1w^yEgL$9a?I&X>tbC&Knvb2>mT;1U|enzFnT>EBf ze(-IRH=~W6l6Swe@4qYF?7Q=Q+TO?8RBz-yysy>Y?Q(nEhRZ#qcEnGw%3BpXe|JYt zthp7RzI`rYYDY8vEBEUS-w~_c?az3-{EGAYL1(daGhcX4%J9kf^8 zj^8?R-dadEnp|eyGaUDO9|v*oUM$kZa&Wvg$so9%9sS@Gn|dOP=;OHIFs zX3HHRxAB8naJA$r;;Z?}nW;Cwb?4r1eY5+PD{pLF@Pu1^|CRUZ>8tOjuX{%w%&zZU z-SZxq{Ums%uj1tBZ5qV%!*#r#BMr~4ao|;NW^#^GAMSR1=5kJNozv&M4U=>AKeKZu zD|hbGaNxI;H=fDz9#!9TuQ%oIsjq*}^sf_lW*b0XsWYFtm^b%anpvH!bG4z-XO;P! zYp!bEuBcC*J2~gw6|YBqpMhWKs0n?u3mbJmvJK1n%IFS;CaEjdwd^;JH1vzdXD zPj7natY5zF+@a-jHgkmJ%;IzAPFE{luX%Rn-1SuCCS9v$JC7N?qP)1uc063(sk=AD zypcKeiuf~Ab#^_gdzC-BhqwBD1FY5E>hd**r)KL;Mo#q3?l3X+s$oez=gy0N#iM0i z@#TA&t$gk|li4#EyS!LzU#*=_Zi~AF*}KyJtcIWLQU0n2-%+i;oy?VQ(6@Rc{|wH) z>3(*j-X`abXR?{8H=o_}7T@zNl{d({=RG+2Z+W9;j&60@J`QAi4{!SQsGlKzEAO0f znbUg(&4JG5>b@y7-jE(+ck>}$9C(xNZoyF?o-8%Fv;8Pvv)t4#cAnMS=FN!kIcFZe z)AS^6bE$rL0{14^~$HlOm&{S@~-U?19J}g!{|-C&KNSAJag`NYoYIj>@ppfv3dh7 zxtufSywbOFhy6-j^?B>eziTWgFLK9OE1ad49J9Q>4l`5zXsLI3ICJ{hSGnZ%b0g;+ zVw7G`?j|%pdXboOZ|q;)(=VE-`>rst?&(i0d7|v->8U#&s^Xn}|IHik?E7SXRWSpZ_j1Ua$;k7P-mVkZszn?<~UAs@gsc z$usA!r{1c&8L`v5Ta~MOy_0)=tIJkT=DV32^ieJ~ywBEACU39q>JjyIcjZLAV9l?% z%v|-<3_IV@eMjfjztWEQ)f>rgM+X)f`Mja6xrLTKOUF1a0_2iM3S$%sw z5c^8&c(^UH%$-k*-Xo9R6>`Hn>B*a&jyFAKI}VK-EA1?+{#)Sc8h!6f-D&KGxxtDj7_bqj_)SZ)0j=cNkv4ZN-x#z4dt~7a3Ke&yC zPfZSeRq3yJGkQdLXE8Z*VtVA#zl}wYn7*SKe`dBLbEBEf9GpCn)Y#GF(uYRLiF)tq z`|pbHZpfY8e82ua@s4kqS4}Nv^)uuiO_pM&-0$1_?}~qSe4M=Zk$vCPuiWiCaPXp zikSD=%(YU>48FQ&_DD62+b$ivgRqv7OxSH+mC#PRj^R_5o zeeif}edgrdQ^xz=jhRW!J4c*Z->Dh(ypgjxxSYG4TX?{u@=l^Nxt!~rmA2xylY904 z+0H$xyLQ4o!!M-p!h0Ry;XMySKdz3 zyTt)Gc@bHUoQRe)doA>>k_*mT_|4?Zne=os9xC&9=AB#Z@}f6<2Ods7XEPPAdd%f* zxT|@6;O?=Rch%$GVa?-#tJQJo*>jn5$2GPawes?AYV23)%$GO0*ZI?vbG|PxZbNj| z2WP2OpS->fyF2>OQkSpjJNns=a_RTh%C8q6v%9!?U|`Nce;Cul4Vsd7zq9w>%GEu+ z&(6MEbG*@MSKeNEU`oZc~^M2jsK{amBS#?K)+onmKojG?b@YG7btM9+&VVKQVULDlKT(PUoB3{L(g(lN($~%0&#W_iR^3y(I(u9Hm76tVRzzQUI!$kC z%)1A_0rM7dcB=AlypuW{m7Mck>3{PM4t6^0=+2SG4R49{ZsyYipKUJv&U?J0?-?Xd zanGBgJlK_4wcPUtdTRPbv?E<#y(ynr=aske`n^?kb~$mM9M}~;z3O$BPh8zgPtMg} z_w;si^>1OSni9M%2PRjuTN-1&!mm8}M$VjHW#H-RCqu1rceVdr-AdjW+{ziXLVsAV zcs>NmQr|?*o1LDX^yZw;aAT$EJJa=j53b%wK4;!yuN?fw&nS_(^BwVM6gTn?9JeY5 z|1H(sx^f$jK5iVV+v(k?*=bAgx@bVU(&WD!Oc~W;acjm9U zdqwZUtH~v*Z9(QN-EnH(aIfCnbH?w!&#*hI+>}~Ke;Ul9S5NNxL~o==F0s=)E;Dt; zzZbIZMSiUK^llHfA5wP~GXW93W<`y=LxU@=-XJO`damy2tuy=1PgC+@WBEXJzT|S=J|w?h zI-PvSCx<5s?MP4W)j99g4DZv_kuUW#UwXX_=iKGx@G!fRJF4_E*XlTK)0BAM-oMfP z2)o-y{`ywu<>t}dD>u5ka^^*NXR&(S6Zc%oe57IZ9npB*Reh=DtUr-#&8P01 zcbGG`%4Y@-`^ww#9q0F)p;vLU%vU@Sd5o(ZyjsqW zU^D1%q$O2vdt;jkcUHZLtHWJRuiDuieda`S?iDka-ki;BbI6PusLq@o_}tM~rH{<2 z^r*Xw@)fJTRm0p@eA>MwrsiBV_R8r6J58=)=2o+rmHxf_HV)9%YF6ia(!)+u^6q!` z{@Zb>f6wf@^+xw5-i|-Y=6$otnN@Qalh0Wl?Cy0u`PB{l-%`GPb{C%>GpqOXb$Vvg z=PcIjipRH2^O2|CGXqbq%O>CH^=92ynXMYh8UIo4a)7>y9UDwZq%^ovS}@rEi;=s_W@^GT%~HbE|LK z$D?_JoxV~vN2bemoZfn)dQyz-po%!~LpmlM=ShOVV9qC4vsYqs0Xif7p~ef0*p%x;YluHzePORer-xrrz9 z`M?>Udd_*H&gomtHIsX0l4sru;VyQb68UO1EAGW1U+BlGUUTlCGohRxN5-(trPI~Y zpEJ5$`P`k4?&TeQ$?YDQsE3tVJ?CkC02+N(-b&wW_g>9(9=Uy*MOL+XCwDy6*X?_T4rY8c-`THt$gSS3{L#JY^?O#C6>n~Z zyi>DvCkxkk;a1gY-XX(mbzZa;Z%$nK@{OF$!Bsx@oXPA4C%RWGwy#$GDI}NkmZq4~ z1D$)$5qXU0-{Ps6x<4M6!&Zsd$)4r4ukLhty{YBwO%Xpj&736<$DEaW&U!K{w~c|e zGM96D^nNRP*PHI#ldHGWliG^cM_C3Wrl*l{z)=iv0dRTKl%Alopo@(FdeE9Q5dYsX_k{3IV9Jgrd$bY2W)5m!| z6@43Y&bM+l+i_=_xAEm%_o{g}(f9E>*E{<0(BD$t&o{a|_5Ru3-H@wUdA=bv_A8aX z%$w~vH8DLotAq057MwmfOCP&)m(ibibO$Z<%;mh#ML&C&Q#YHQoOca@9T)P4F>iek zVyX95nabB(-P501@_Yt6dU|rkW9bF0oHLhmdf___&!+KU4$B9B^3L@g?~D2p)kL&? z8sx;x<&17dp52zag7r>jwp?O1BZhPvS3IIOuXwy`#$8PQ>|T1!C)T`vF}=*`XI}Z> zZF0}n>Tce-;z|FWOUx@?i+V+M@JQRjs4u9mM*Nxi$}kCUiO|fMbxw~y@O#SJ-l%WL zC)P~W&^wQOr+Fi_UGh878{P$-J&Q+9R0BIsy=wau?($@6 zUEw-Uy^}ld(?>b9sz0;u`Cysrog&{>J)kqfepBDMPMek+q%IGae9q}{eg^j^%-y@j zzf~h|R`llXaDXe%ia$8@_>LnFT7GA~BVREy=|6i%z1};!ai)8>qPhBB`q0#qcRtdN zJiFq+dc!?E+B*)7%t|}Us{j9md^gRXfm$INzOItbSuZ!~EPRzqy_@xuwVXwGeay+T zQ|f4`JB!=R-T$Di^p3Aw-TPPGzi)30-3_?ToAEP!^rYd{u%VP zH^h2l#n(K!%GE5ooZfs-PSl$o<`s`-mf3=n&#aujL^b{Hdf?UIa@KQ%+@me$?habV zo9)nhod&1g-BmN&dEn^kHM2r*nNMH6SNHTXdy9E5J6tXO6{|0I?q->VOD*U0pUqct z`6l=3?i$dz8(LPqicBsbgn*mvN_jV>}Jn= zsWX$KuNGc&UB+7?o}6oDrEOuvqfbP}LnjAM!FBvioEq6Hm3PdD=Jmikqvfm@#AoFU zSNGM8tQ#E(=E?c>?JLz{8c`Ik%PF(3* z$+G_zwR$garzhvmqrMH%Ss$FGmK?LZz78{!erB}PyF8pZ{p?*%-8<=V-s7G=5dNsl zoIsrOcy6`yync+#KqD!Zp?&Uib%TGKQIWjdT zw>O%3J-ItqtoKvr4J+p^lU#buSJW@2o*Z-T>0@4L@Ow2+&WyU=+==R2>7F+y>IW(L zoaOY~jOFJ@E7se}&6>#_y_TGqdga{3^fGTjtmd%X{$5tM@TqYt@8yl0^(V)iS?B7l zd%baG_cmVc*+<#TR3DoCjE1-7_IlvSoqLvZeFL3$QtvWy70tnrSTX%U7ZA&6%G+Vm!cAS2ZI}~2$8!>?HtobhL- z&g^@JV@_|-hvVuNe7(2gRu7mb_pQYZ?{LF8Z_4?GdwSGXNaoCcrmt>4!$125-%XKo zz7dNb?~B^ltv5_9i(Z)F5dzRuOhz9l(l z^Q_Kda?}0+(wD+E7Z6YN)jhLy=0=vgH^lUGvp#TZ4Dfmyxz)NmaPoEbZt8Ls@$8ih zZgoSxMpwLVsJoMwW0n`;u2kO8-*IXk;y-%#OjGC1QKjxIW)80Mdm2t=vo%xq?##-= zO_~z#+xqXW`t&F6xy)HkY%ISiRll?DK9>C1w{?2vy?F)6nHA0L4h>e#z23+un!e=g zeB?De)wAV+MlbShJ-bnF=8c+7t(jlY7qI zklP2r?5-}NXXT!=9=OVHgQKm~b5>vB6>oaB)uG_=XC|cE*xjgH-Sb9jdkS+-F1^*N zPfR_zoYV6y^EN{E_vAC%eP89eJ-M8>JU-^sQj)L!x@U&jT;=QTor>x6mL9dbADz^|;qNnO76dbf`z{JiisU#i3_sqJE=Uc4raJlFJ=VUQ`E@a|Z42@tF12>OMY7 z-+k-9O)b&8mGj<_o*C!NnHBLki*oE;tAmzV{qW9-`qf4A?)x+*uQsLjyUpq8(3@iC z;f}Y`m%KSS{qE`=>P0*9Z%w%Ry;ZSBSGxDa`c0XubKT8~RcE);Bd1?YOg(3GEBS85 z*YR-Fk(T<+JpGmLZlveztu8;g*VO9G)XMzG9b~@p=uLDk_aA?6sXK#Ral^_vxy@x_ z=PQ=mT66B8bIqx#yH_9kk*40|lB@4{v!eGZANy;}U;X*2HutYG)i>Y8r?<{8p)o(Y zesk>Hc=(t{eZ}dy%lF^Ob>5Eq@Wy=S!Fktr27Yw|Pw0=i^11IbBL`-A5005i?#{ex z?$09MkyZE9>g;z_{%GfZwqD=uFu9sN+SPbt&X0e0v1ipC&AeFs@)b+=!<)m)o}6>? z&PVt*?$CN(%3XFF&yikzdd=PR`R7Wmn>+57FW;jtF=sP!?uVFv_skUUQt|$sD8Kp& z{ndZ(wqc+tF=utP+*kAM*!)>}3jgZv+pArEf!w*>8h0Kyr?>7eaRV(|Ejea+Fn8u| zm#_E|?>U2K^Xv5Bdy5dY$+KD9G1diCV~8v1P>cJyaDZ)8qhj@^c1 z7Uj<{{mx*{uXC4AylKOp9P6#(n{GN}y>)lK|DtE5AAY5y?fgWUm8x0!nuCY4(^tLj ziRKdP&7r-fzM6fz$v?i2tmPedP)=0K-5I1rXZ75fN8SD$_woL#*Bf(x_);&P$Ges1 zvbp)z?Vj8b)~vUaulbdhe9q?O#QE0a&n^#AnY%OZfA^{7tS|HPotxyGnK_^SozkMA~f_LevEMr0pv>8qGI=Ci&XoW8uZkAt(v#JEAC?`-p5@%MTbsL&h4MaJBi+eW44l)6VoRL%8RKn?~_PmcCQ{aQ9bt8 zG1IpjbIzT}O{++za+7-a-Nksv_a5l2>RIvCSN7Mk-#!73s+zl+IQYjMInhia8kJm~ z)o;e>b*@NuRog-!lbW+g%sG+S9gmfK&QpIiBf{%T&U;sIFQ&SC7j!O>$2Y+15%rp{ zygIn&Qs$$a*7P_hp3U6R8*Qe-JE`B(EdE{yMr&GyTf(Of5yq@?%W~V z>-=Yk+2)p7>dr5`H?txd&7Pcl;%oSZ`;ocLb=NDespH|Y*!S7V%N4Bu&dA+6$uYl; zmU9;2okcnJZ1~h(7Fl?`%(=^pYNGsGx$W-1KSlh`V9sVlH2m!P)Zmk2U-ipEdmFr+ zw?579l1t3ltoR!5z~%ljb{Z~cchFW(M7!++l4oseD=d3y{yUTZy>Y*aFLAHlshT%$ zUqz0JyfZ#$&>gJ(792DGj={rhyC*Wgj0SD?uF-Fm7~V%7Q}C<#ZF(NLvFA+A9drk6 zdH0GBeSXtpj~is*AKLIbw>WRTlpD}D?l#OB50w}>?st9jU)1y-Vt&KzgTCX(KZ_^) z^W+9;BVC-Ty4zB zxr;}4hUfM+-ch$XZ!Kng*>BAbch=mfSvdP8=H%ejD(YL|Tij%>&HqN(Xw07qCttI# z^BzdQ)E?AVwFMJ?^WJ(J8Z+qkCBkQ`tvK|mxxdCOX8NVU+n1wRId6lcSEUzp)?2wv zq49?Fc+b3db3d5tpOf!;8x5}p=X^unAKa}#X9#z>+~sb;_uTE~^yU1x<7 zPJQ@I-HbVL@UOE!+%p@#l}^5D9mlB;zT9u({PEt@y_LvJzfG*Od+KtabLz}?>gj>E zU&_q>==$f$-FbHy$b8gcefZ#b(_(J=b#mZs9yYlbxxnO@+vd%x74CK31mET?%CTqr z|Bg`q-zL)YTge3v(zD}MTiy9Rz94LY-bDgDFPf1Lf(z@JCIjs9iyucKf7@#W=r zqyI4bj|2ZS`t$5RPyEY3nmy-j?D)xX!>^Js2y^RJ`-JbD}br_rBA|6w+7)4!Yj68P)*Hg+42UXUBy z`s3(7&E^f>`pf9Qj{e)|e;WPw(XXTb%V@suhuQxc_+Q6t%ll^`%N_1e z{mVqMv^bZ^P>hx;uaRhw)9LKR0;$=YH_w>zL^uCjL0k{%Oo_vwt3F|1xI!B50XjLhnM~|@ec!Oc4s|e-u>R$Kg+N4&nEI`=FjS%T}%!y?G67-qTdhl?e6|L zz}5G2Qy(6(dNYR)-fu|s`x5=nu;S12&-ym-r`bOSGXF69HSo)r?ayPb{b_Kkei<6A z?w;sB+x)X`!)3$g&ipbt@KHHK?jtvw{~kMob$=;(daG8m=|y|__j@zj>3NxNfn6`X z!~Q6;+sEebg?^izf6s94pW;80&vX7V(0(1W|1A7C=Gtg-%=qmuW2QgN=3Tz&g{JoR z=Fj;SU3WCNu2&j7fBzNz&jkE5`t!t`)j;#iuknrYV9sVgHFrM`?#tvscKg%hUk2LV ze&x?HT4erE+uXp}{9V7ze))&NkM=){&ts;)jDDT%f0jRu{Vn?EIfKsVKSuvBXKsBS z{b}~gK$~y5ecOQB_wV<=x3_`**}*Tf`QP6kNAthMZ=-)6{mblM1DS1fd^S1yr_n!- z{$cc&(Vs{2?(I9qck#Wiqu)mJ?^XUCyp8_L=)aEs+w3m`|2!J))97D^|0gn|U&lS( z;QyBR^XR{i{@2m}WAwj`{@+KxjsA~`%y2)A{_msl{`2U+jsDB%KaJ-9KKb3~U&mek zOnkq8j@P+^HoA?E{;Bla*nb}V%jjQc^MCu$yv6tPe-qV)N5@Bw8{GO~_UpjUqhChz zcT4kkVzZ-tn!Yas>DSpm4&)Z-toCJkK>G9Smw~qLyzmZ9ZTEg1Xurj*Zsu*|Xl{Or z{yg84L#JPd*B;Eh#{FA?_N2bz)hGIm;@jY9{`sQa(O;&<><;(nG2Uj-QfGIb`PYGO zvwiQ=c$5A-`pfLsfi(Y}&)Hqn^JV%#`*X~n#!SC7UBAa2OuzZh^A<>d31ogPUB8w6 zr_n!7WPTg{^XOkj|2q2RAMgKn*zX7aVf3fbe;oa%*`Ei}{CmPVcmCZ$>nF<{?$Ix! zd5brB`-jo5qd(97#6JHsdkJKI^cbu5Hg)lJ?&3@4nX~q}RL|JS({Hn1#`oELtFt%xG~=18@~L*;79-NAMgLX z@z2*^NB?c~KaKt}cX(R}+)6PbS*&EErmHvWwKS^0DG9W-~o zjQ-n1_P@;5!#gy&KaS=GZ_?c6ZJM`ulkeag=pSeQ5VIQI>|e%CbMtqj|1g?2MBhZC zeVfeBqkZpn%wI--8qGf|ucP_TfPao||2+M}&_?s0&FiB1?>+tF#Jbnqm*M+7`(+^g zHr}IoGy7%kXf)nWvp)}{zl?qzo$vlM_P5bL&;Dg#_OD}K^~*oLYi97m+rJxg?cWcM zf0pS_F}we9aP*%>Z_%H}{O8$!8EF4?%wIr?Zd`qSt?jQ-td{+#@|`Fr?b^pA69 z|9SMUqklhqe;WOH^j}8*ZMJW48x0R$ZoZD@pMUIWzTMvG3@(%C4j^XZWYFlcoPlw0|CM(%vPTcmFhYn>Uyfo&PxaPosZ7`epPl<39)g z9r`-vFZ|~+`eii#{(Ss9bjLo)`aa_u{ln}Z2h#jInSPti8_tRF^smu;SN8A9 zu9uv*ejGFXI{Wj$PorOE^UZv_J(TPM|=6f(kn5po0^1&_M?kbkIQu`~9BtJl*G&Ul)A*d;b5g>VDsMyr3QO zZ})$c&*eYV*0LgvV;uUSx{@}kl1TJ>nWNv!27WhN`2CdMI~B>4I8REV-%;iC!JurI z&h@sfaEw!IaEW>lFH*Vn5o_4LfNLw^$GfS~z`OK*eUF)W%dOucqA<_>1@Dmi@eYbb z&v8{HIUiE}>-)5?Wg$lwW!}%-H{E>q{dz0nCaH;XZN^+~jHpnc>(6lATniFtoF_%o zU7cm}bC>$jKfrMmDOdNQZP#z{{qepx7Hz(cX(#$NiQ}4fyc|QyTb9eMv#m;0h;ZLK zwAjP%s&_X*@dNU2POh_^?32ISj^lWayTu01r4j`KT$Aey8Od&+a}$G)^{+p#W64O;u5(^l!igbkS^EeG@?a(4D zzsYZPLRsd!^WAEOIZCW>h$>kV<(tm$I+8xYDbBEgZ~PK?#>(YG%@IekYO5sv8`C8}5A ztGxBLvpjRHKP1;zsclJAFrVgkNqJ4pob;k!yX&t|rfB-LNSW`rPJGY4;cQR3g)uDq zH!>zpU@S1j3}tdiRE0HSa!TCbV&FWbjn?UGkhbk*az)e@kJzEb9$ygt&_~ms@d+Pc z8{68a#xdq_kA?f<96ev(OnB&jyH~_DPO!lRuHakEu1U-M7LV|~K4XVBc#C&v2P}KR z6YOJO$3BPiRVXpV1bf!COY8HExYh!`fg#_Zd-;mD5aFAUdmReoWgGd4cl;m5b^Hj= z#JL0O7$>evvw8rwN)IA4Vz*3qqLK^Zn^&>}4R_g4_7n5Agi zdo?f9WwIh3pu$lSi8{pz&alBbE^vt}Tw|Nu67TSc7wqsBEk58Q_KE5Du)cv~IIeS5 zm|=wIp7?mT;h{g{|m3XXk>h&2u{ z#{>Zl>rtJ!zL->lXjwfH4!ZD_pUe8-ITb(8W9_Kuh+Q66Lxrq z79a2lU*K=lkMWbl^p9YjZQkQ8p0P!Z6F66i0(;it_aV5(`~HsHll!c2f=k@u32*TM zAMxoG%iiPl`=}{9h2zZ;&@fjNXXN>KHVwk^+qsmaS2##=-Z&q4owsh5Oo=Km!3Y8F z+k0?M_g|qj&ssbSKly!mE?Gg^Hy7lGwywXRZ^Rak?_93IwN+T-C^;rZoMMBE!=ar87=y=b-fK*jF#U&p9AuTSi`+~HtyT~XB*NNsBw)g z?gk!7XO`!*u}S&Y?Ja-8bBd;IpWEG%zJc?}xi8?_D!A@B3QVwPZ(Ee`jd%`|2ljl~F1&&?g3`g)j<|q*0z4-g& znj$I`=-x6-eD}qIIy7hzmi@lm-wf_mD^xf}#A$Ly+zis@e~9fpL;D|Log5MmP-2QP zMv3X+I#%Rm`<%9a<`^>sxTo%WdQW`l&&500;07;vk1z0Ce+s`V-jC5TzdzQ0#9K7D z!YL}uFvgxa8st9*O46QlW?ofdxl*HXrZ?!?X7u=a`^n{2B#@XIU)B!~MF)uG31yRaGuP0Wx4hC zU10?G8#r^n^Th-6;v6@4!AImX_nmv@`MmvY`a=DC>~M<}@GdKOug;TyKT77U z;QSjjXc3k@*H&PL6%MgR#3|0<{;sjbEgC%IZSs!z1~0JOdfmbH_PxL<9QQamBCZqD zvd&oH0IOt19K$yg=lx#Y_aQd8!3#dZ_vzXBTkfBkzkz?gnzqb3e?vagw#5^!af$6+bBao>MWXAhh`F0jQ5Je!aB0^g?Z(6i0&ai7}kh@ z3V2RKo}Fj7f_HF?Q=DOghzhnT5U^pqZmsvkhkpN&cnQzu1@G_y9|z2P&TsJq+g`(d zXE?zc2Pn`ozGvyZMbCJT*4_-fr1D3iZEkRdOW5}; zIUydybDUy~J#%f5&$D}*ti$)Eu;|}VBzh+KEQ~qr`kSOC+RnW7Vc8oKORRB<8aKGb zUD6Pr2VPS8k!ZUsY;c4*MsTje`FIEJ!95+~1Q)2`*==!)Cp@R-&&4cyxvlO=0F#5u08MLsv< zZ7RPYp5YX>Utw&Tak~4wXHRh5E!>ZLbDt4;|DJ(qc{bT5m06!zX1(Vv^VS{V5RN~= z7@pe}5kY)Bhhp*VZ1P#SX3wF9XJIri>nao|Q`+(!_82YueNTxitZ@p@=Ng{br(i&Re2N(flUm1F>5l>vX*lzPBw}jF#U&s~LHf$%=S@3K18$!6TmWga(#f zqaLvB1}E_R<|r^mNL)h$*HxNM=jpoLN1eFO1}#Pp{dtx|&!oZ;PH=_`TqYZ0#34NY zDLgyJ*fEypuP%&T)k;Zj(pi3*O)z-r@<@uzkcD z2XL$j_RQs-l!%<0^LuvXqFg1jpG#c8^ErX#M(b{H zi#uGwGV6{|!Exl=6SSvM-FM`^-`DD)Kcf@kDbBEgXK;x+xh8ILlUxz4x6c{}@T|%dhv^w* zQ;gv~)$r_s=f;`&=Hh~guA)n0^Y0u*Zx46SI-rybH zr}#p&-gC2Wg&ACj^SCzG>b<+CW7N1sgO}t@icduAZg7PQoZ~DxC7vMS2vxEsI`#&h ztL$f6+c@_a`8!*%9?#BmXa{^xmQ^TGB!TE&?9(A1;dz$Je(#>u6W-u0-X$N2pYh{A zaL$S8Pn5N2aD{UmVTFK-vAtvOd-Bk~kw|o3HLh@-Y>BstX<26*+g@OUQ#i&E4sn2a zG9ymmTmcR9Zs1u(*5MhrXV1ueyT(yszJc|Hb*4G1tRY=eR-;8hzXP1$61RAU=k|V} zC9OBup@D6$aE3Lea9r2u{jMMSz3+%0@EKna_-B6k?*L@kN4$Y&cYzZe!7)@Nhr|Pv zm}7sn;M=?J_GkZMe)jn{3!7* zH5$Amp3xON8~ZqCw_e6>;Qdy(z%5>|!!z!1 z4bSZeo=Hoe3f`IHxV9{kZV;CJolS`aTw~s&F{it=kl&(C(X?Y2D-`CLC(pGZzr!fa zF-ha+b8wFpJc|v^aSF>^i+vr_GmiKDe&!FP;a;Ec79Wz9_y)e48=S+ohp=CPF-Gvc z?BKcjW*onOXBF5(SoH6pBt}#z*2EU>#r1n`?ypJp1+juLXt4J1(9h{SC3R!^t>Au- zaDofm;tf8*zvGPYXZTb62|iN(h*P)@=L?M4I_^XN8|wKqc)@c@TXu;v9K&-d;8`@- zzLLvo$|Hi&^YOzO#l-t|uLWF7gm1$8Yf^fXqWR3S!h9Mhkgj04ZR{VGv_T2a$US>T zSMZ$fu!UvTPf^>CkM}x$=>NPuA?7oAL;4+d@Qk*w?kcH?7l~(eiikBTlqlfXJLYhn z0>iU$PvxRNhp_D5$^r2ZRk9+^QDB6Y_U?O|;+{CBdi>3y#Hs?Pstr|iwkUUiikBzjNv=*6Pas^7Vaf1`|qiH8t&V)d!NAl zj}q5=fQTzRqs3{sZ2@^LawvzhhkD6cwgunIj@7z58nM?Jg(FexEC%YpasORPMeT+Iwy# zHt^i0l&^7$3*6ud@8SOc0)L6$<98`-nP>7LwYPuESgy-=T0Zpm*AVkL_`f6hDLj)e zlz+fmyufzu{R-ze!7+|d!SMN^Q?|B#m2E&%kIAa?z$KE=RceH-@ku>U*VT2?R)S% ztp7~Ak9eQFBku5sYn&mX!U{8t(K4535mBH!5BIj99D7Wb{ddzf7Kvr%XDG2kg%e!h z4sY-geiu9g`JFI+q5K0HoWuStb2+c;*u!;h@CeW0W6}~|a0mBx3Ge(gai41(pu_}@ z=RO_VHx?KDe4}N*zX@@gxTkq?Ky+WnIE8E7BcYw&#*` zwj%8r9K!WgDVmr0V_d*}@9+Vik?-9&^d+@Jx-|su(9v|@mZ}AMz z;tCtAF+)I2-|y{}@k;jU_o^P~zGvhs#3Z-bk#7-}{hC~t%7s_ zt$(E4b2x|l_Y4Cn#+*F#_w9b3@D3l~oj-gCF7w9bM#T>mfz^3LlgpG85x*CJ((*TOfnOZh-_j0W!G2p8C* z!82a4OVP3#wi~0QpJOy|%?CJvcX@{=>;}x=!g}``QK7^Pj^X-TYvs6i{r;S%MhoYi z!LvWc8P4IlTQMn}2u7e`ozf`5V~o2G^)@iBlY+fcta}k-5gpeotq_D>Qh6J^X#~pSgd5U!lOy z;omJkrna6zY1(!3aepoLaQ)_k_;hcEy*amMW1a0h|2d8@+^28Yy}3vKK9+yC{Vjh_ z+h=Uy{_MBG8BTDB0Ou(e-|o=;PLdgM4fpVj5AZkEf0p_s^53iT->s*V`FHD|;uCFm zxW+N2@C=-*`*^-+(q3JMDs17}rf{8SxWNv4_}k^ayR|9`LYJsy&mclnR_BYuy+z>jc8pAydNT%Ym# zKZNkF`0x0C@c-d|;J@OZ@N0MumvEgM*5lcC_r-dQj#pB?g=?OqwgB>7ij6{U9B7gHO{ey>&tf)Y3JG}OWMMHUE>Kmyx<1z*)hvBrh9Xp#drN% z^gH*j__w4YdT;*#_iVdQw7-CFyk;!lh2xL@(EqvT+goCe-@}m6Yb4=mK`EKwT{!ac1Q~VPCp12>^aECL@(J;5~&)`Ik zJ^mQ)se8gDT;~We&F?~8byerQ?!ZB*f#`JN$Q%qoc%L@eC-}mR>S=!%m zHi*`X^5Q<-Ezz-MnQwjmKpvaqh*+Sa&aqtgF*Z2GAuQWbXMLWdr2PgBT7(DIN^}m( zgIJ&YDi`1G#j%F_bH5`PbGo5@x7UaMJNZlu-}Qe7_IIyuehr{r#LT`|tXDVvDzU#?!zf>1#Nj zcUdxqV?M(@{TY4~^`Z@3Mk~QEXKEZi!QNedm(ayCV;28G3 z#8ryt#1mAQp{0GdfBMdr{qM~c@eZ!NNzuIXn&039 zKH)RI!1>U{8I4 zz+RlAyeDGv(BFe+;$CiWjSC#2rHy?YKP>5oh#Kze3D0P7gL70EA<(C$|LUP1`yJ8m z$)CeJ@qWCg&y>5@i0+Ne`?*%je(f`&>-X)s7QZ87+8)3@m$<_YE#Bh|wm60D9JfH} z7|Z@Q<&1cZJ3QeLS2%`q*0yE79sN9uE4;;zS+jfayPv-+Bht?Ae4bfB-(uO{Ya|}Q z{dg{pYkf$%GhTHrJK{a~p8R{L`*W^2BJEvUi^;MVh&%GWhlnc0oc6cYPvqRxeJo3Dx5O5n!x&S{ z2GPC9`P^Hb`V~a^sqXvxJa}LZoZ})z^D{KG32;4;ehu2hwRh{hXCLU=(r1jxfcX)8 zJGJfH&!XSE`;cpNAFlZjYk1}xoTqp~w9b35t^NEsZocd7Lw_$f#0^Spsdt^uFI@6uy@iwD^Gcc!wuk;RqAd^a-9NV|Ydp zw|EcV%}?QX`xE&moWQyLxPJG)L5)kCVT}UTZ?Qpz5|O#wU${?5dlr$p7OrUq$8{X{ zask)8#T_0~bdTPJZG#wR!?@#z{`=rsFL8}4T;K>(Y}5R{W$)iJREcU3bJ{lDx|yR` z^y{sO?$3Qrmi=#9BwnC~Yc}l~JtNbu`3~;I@(N>=j(Oj&?d*YiJmEQ|Et|vr1=^05 z-{w0`=?T%Z_8e;3jcH%vAej*ZtPA4fye(GCevNs3uJIP;U90H^&v=4&aE%kVe&=-j zYka_;@MiL#2l>xw%WITI=8yF8{JQ-w`?JV7I!ysl^Tz!Kn^^V~Wz8&qH zvqnUa^Ye+sZci!io*FpkX!-5W2KE*K{njvXj-juKU3 zzDav^U)}tJHZi3w_k5hAhG#Zr-dS4132_78h--Fzk120?#2PD1u%W;6?iT%-td{-v z|A06_L%DO?CeQ00-K%qYmqy3hQ|@@~y`oPG-*ts!L>yuLie=7g`@lRcW4J!|;@RpP zuHE^Z$Njq|&(*c>lku{Dr{=eC?InWvxV~{3=a6`SIi?7R)OT%{{W+WvFL0Aw65UII zI*qxdkLz-sPw-v%PW*lM?*_h=ma;22SD<}E--BiUcY&IC4Wo0NqQV^RV}r)ycizQKEZhHu?}m-2!1BW&Zj z+rGdgMboaYWh~FIVcmW_-@rWX*LUIi_OQR}wNFXDqD`^v&vip|ovvH1+jxTu9HODU zbJ*YYoZ$w~c!w4*xW*BtaBZHW>vPU-O^bf4mbk}w+22VZZpgdl-91g|?>H4)cTHK5 z+8;0bKZCc#J3OX%O+3db)+ph)_ABV`xZ!~`R){!(`x(PID!5+Tw%Dh%WhL?+y0tF) zynSr%7$cbWtZM3AgKKK=CV3*>z;kym2bf`u9epC4$8nv1_Rz1lB;ynp-%h=MdrC zSz%pL5gUwYJBNFi!ZP1Mwdl_yEc>}?@~+Rinl_Wv$G$Cj*WXg_+Fjovj^KJvQobPW zXye$9;~JfJjS8k`aBRmcVB67>I?UmETt`V=1KT;y20@JL$ML&7WhEkPQ^7X%qJR5& ztp{oRspG?FT?OCCI^~_e+biR^?k(QnJ>H?g2JWFr^Eg(Sn4VyaBBfi_;y(S@$Mw3_ zERYV=H*o&UH!vdan6CdQsfeDH~*1JE~?m0P!^_yf%w2jfSAU?%? zn(Lu|$L_^9r309sV~PR+uC03y#O{oVo_~-ZVwb1f@k>P8z`Z(_V|#X|@GLLkxte!w z=ky$Q^r;imo^zS%XQ_>2x~?|0tB55Egn^jWmwz*=MSs4=!t~t5_iJ|y=W`9N*YzCW z2xoA;u6u(MSnj&lDIJOKMaMWqfjwi^=+?$u&g*@6FZpi1uEq6=b(Pfb;r-5F^p0D~ z8r0Uok7G9&KlJN%Zr5fklR0q(%Ol)F-iu|0<&4pdxuhSe*&swekE!&a1Ev_MAqfmH@4+tzM$N>Y}3H@uEq1xWWc=p@vO@fU4Py~OW!R@ zcm{bcjGJHK<=&i3|GgBm3Y1lrivzBM+82=Ze+Y#ZTNA+2XctdawwYj*wat)-p& zw0(^V1spG?`MhJ#T@C5de45Ml_OpM32qnQkbvt!G;-XrGvNEYC}(%T!kp3)siLj_)|mVcN3hj`{)D6jFUloHBQb z6)GI#48G;7q$XZqgHzb%2)1A25RTzk0nT5+xm>gB^$b;Gn_^D4A-`R`Tz@1OoR-M>PKKjLrkcUYxpx&IrU8T@aI{&%fk z!oL1@NB{fwpTd8R&;L9>Oy@G&*w#MwbsWe04St6uod54}fPYH>pCyzYq`c zKjA;6wEbMa%y#=7;HAe@S_btHgB9-;i$b2Ji71{`-LJC!{m~UBQo2-Ivt% z6LAlteHBuh5%IO3Qs%#RnBbTA4St8e!V-Ut5`T*o{sI4pzsKLxU*jBpKk|3v zg0$ZgW3KbN6mg6-j$oN>9K-LEY0C~Vh2PsKzQ+aMX}{n3yY6?~-(i2>t@pcL(YC>a zz7?E%iyd0H?!fxJ8}H3GmG|@^wX?lzKY?S+kk{cH&iD0`()rH=*Cf{(kk=O$lw*T> zpdxLZANw_!JaFe&BPJ)rQ=H=hmnoXI%(`P7V1@wCsapqY%yaLYYe_lgaBrr+x4*QG z=>z+R<8Sed7N7Cc@B05e$dow4@9!acdaN#cG@4`WXMd8+#};?M9W@H}MNvOLybkS_2`{2HF6X~!PJ^R(ZO z;5zpBfP7xJq%U!TL(DLOd#Mo-sVyY+t0ljW=GdN1tM468` zhij|hd{1z$5BLnv*K_usvmcZ84Z9B4&g^!8{1hIQNZ^z6jE9D zTgb8bJuDWC1%D44_`4*(a}gzi{4icO?mdzH9%6$l+~EnHr7@qUb>}#N=e0%!`x+Ht z8^?HyPw=k2W50*;JLdP&`~H&JyeGbccWvKmoZ$$LKgSdkj1UHf`91r|Y-8H`VVhju zQny2c8XLqU=Pk?S)u7(8Eq2(aXxcJ0KfwAuT#Ii^uEp{V9KS$!r`%8XyTQGBZ{BGQ z@3KLQuw)Drn4!c04wDseiU~%rPiEiDx_uhYbk5h56_&e}`+j|{a|`$9x@EdX0oU&D zd%5V>+YsAiIG<_Dt#@w~g7`FyQQi0R?1|p_6uyB~V%l=+x3GPHeO-eezZ3Etb2Qzc zSoCX*#2P!erUG+#juqB8#tF`FflFND77bqT7Vq%^`&T}u@|O4p_Ob639PboIIK&F` zS7zj=NkN=oj8TfFt+$_JMC7&Bq=(MQyO#qw_`{_Q5ehkOkC3#JI@kM!eq}c-N0;@Prrm4&LECKBU+Z zEq{h>w{VONPH=<+%rJ)Q*rI}a_2Yhvd+rYvBHY^+bxK=S!tYA=S@dIgZYt4@=a{y+ z@5i#gXXV*VPz>b!n6d!d*}g)V#8j5Yn9=S4YaAuV#E4UDaEWVdahKc@W!Vj`V7rSH z>r|HeG~}P~k~|YFQyw$7v2KTV*y9U^e~OfiDzxj_N%D{^n% zp}fy3r3111-1m24AJr*V#BL0tZ=-u3q{~#lCGN0?^U8FK1~qJxqh)Gg+X5>b;S}fa z-fCRKyWGON&G%w_Ol6km`}WRT4( zj1UIKq$jX$jsrNy5h6}rMaQzv^&G-+%f$XUZMkFF#_?>Q`&n+gDJB>vrZt20wzGfc znD!aLd&&2;AssP{b*dk>DJd&#>+b@e?ssBAS>hY>{RP;@H)Nj($F3986|5`Jy|px6 zxu6|(2ut>ZX<~W|fBS4>TjvV*{T!~ffic4J?z3Qi_nqgQ!FBlVT!UxeS!AA1Ibhy4wzuCFj^&sE&S8{g6*h@&ci6*yI@Ssm);Jn4pB<34 zookvVx$hx)`$e4M95t@7#Vzjeh$eX^zQMcXZOU8z1lwljEq}o-v2X6*l6IWo7|vsV z=apmF*LLsm0iTl3MD1a@ZJaBwBah*Dj_X?T+o7~R+j^mgYIK>(Vm|}te-$*thU%>h~O4xpt z(&nunqov;#5x&0y6*g$l!gh`|OH4bjk_*!n0`xLa1q~UwI4EN`j=x|`7}b@L%ySm^eLwpu z=Z)2%&b$Kb8{~&M;(+7l{Oh!N<#ptIv`lyX*v?bIeKu&5eTtUVs8FC=PZ}eS@18T~ z%Ph-j<8TdKU&ry2*5cTiW!;B15sp>C@1bh=y)>G)u6)I^+_oXzVh?{8{C&y4KmP6< z44BVK(nGo2_J>JDlzGc-Kf@Gbj1XS2%-^U2wzH3YD;(hjXV@g?DOzUT8n&OoaopDy z5e0(h#u<8NCA`0wn6@mKr;Q))qgwR+Yhr^Ij_ca<9?b7xz3n0j^UjCv!m-+3z3 zNkiPh_vLrr-vNyi)0SIrJ8fZqqb%FQwgqM=;cv|FH>e`Ng1=L?3$TAgfdJR3l5~w0 zjyr{8+TU?A%dB%e+c~Cdv7b?vKII3`+GiaR=Atn)A9_@*CJL%o%sV8sYu!6VrJefwb)$ySV@UI%3LO-Z-~t z+n}IdiI`MG%dE4V?W_C#d>W!_ZByJ5t?R~2V{I1wni}F3=1X+*F;;ocTySrhdB-W> zSP|d*m`~-y`Z%Y2(XY26Mi^Bhzh6CC!m0OqVo!9YQM~S>XV@zd%DBFes`&nLD zmzcK9cFy6NYItvcZ}WFIe}66a%qr_eAIB~3znz<7szgAf-toJ(wugO<(X{URcD8K> z>8>BuT^rkp`fgmt-eQk2?=ti62gC1;XX9E5IJQhzu&#k)_^$0+U^-w~9y`DP{2egn zI@`TwooyU{hZ@dXBEYp63si7DTiCXR`^fewZ?w)fO_JN^HhF!+wp-dp6h`Oe)6Drl z3(5v8imA>@;)1c^d-KmD|4j4GrXuBi zfBV#?CRVmJPhUTd)1bKjHm7TAuuIW=M1>$e&Rr~6I~+3(;)Zk$-@BSuEVE5%x$9tl z$8`?(>U??b9P3n95(@;lZsoLbs7U#k+8Kl9J?HM`U-WBnJ;gvE9aCF+^k;7W`~J=< zVuWipnlBLGx}0ywx)L#|QnW0j{j>F~>Lj0CBwwOHw+H$J`gdd8lTL~hyYf7~ zlbBBJt+QQ)n3z_9t}o4<$2s$QTuWAyjycTj_=jr-bFlg`E%K^vAeO+65|7|_apVtvdTUWsK+qN4w^>-XO{%g6; z_A#{!v{Q*H#YptthAex{_9_Qn=L_nb*E#*T=5XJy-#z4gSeEzWo?grSD%vTcPSLbV zoQ%>Is(-;DP)6bE_Jss@JnVY;A= z0$lfyWhI=)d3SIR{&|<}DQjRG+xzjZYV6>jCH}eMpD+G7V|on#?6JN{ZG8tZrMIbk zPqeLlSBd}JmK~5TVZCGfXPNDt(`a7KY5h=MM{aMQEVp;;1FUhJ9HsmraRu83xaJCl zYxgZ6zYEK(i>P7S9h#Kh5UnrJy(9Z`7jeLQ@qBYENS7GKuk|$b^K~rJ_OoriNAGWj z{0@!gC-9CN+IpvDn&a!(DeqVnBI?Ak8|=_x568-HCZ{d8jr}4@1mwM$E>d|#jHt0q z(X?f%2I&oH>zV=k*sd^oo^$3~us3)Qsu5v%cW3FW%lq%|KUhxxklPX+N4dXsU(en4 z=;lqa8^dxxbJmK2J{4*-XyKd6Z`1TX)kW)MU&g8K86S0Gx^oeq`K%(X zoHv>;Q6zyF8835e(+zB6+ab#WthcQn*W|k88Vk7IAreB_yRDWicQCB3kt!xX&H)fU>=F>QN?Rl-$eSiK1(e+v%MEm9k;t z#2O8Jug1)B#es^na+&Wwzx`a6+Z5E5iDjmZHS%07>7iY!v)*=&otc+)4O;9|+z~C` zAfkl(jPBLXoIJv!=h>D?MU;7COwqK;S1gMI-ks`!Z7Q>^iX;#-%S;=y*ZEvt(x!UF zGV8m2xi|NE-|ydZs1wt}b1BHnw#Ev%{f=~tePX^rjfgS{M9){IRiHwIYANawO# zZ{0R&h}n*G3*&3Hu}_^uVwIG{0(ot(V|Y~;S-*n(%*i7xzP*Qhw+&_4jx=4jb|FmIka_b=!x$IWx(x&3>?!GL+$&i;<& zJR20~&VsY?96j3#8`SU)8sz(FN$-*Wtj&Li9LAisjcx7Y7(

@81XfyJ(36R5-$M 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 X0`sQ7DK*~ceW#&w!@P)|GwS~b!1m9R diff --git a/resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e00006cb.au b/resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e00006cb.au deleted file mode 100644 index 07fc144877a89053a3d4b100fb8bdcba810d4205..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 701520 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 }K4a!2VYr6#r7d!-H`5cgxq~TBwo{>Fx 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

1~3!)4dmF<(Bm1X=cAm*`!2G9SU#uYSL#{Z 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 USAe;bR*(MijGuQt-m${}7a#sc;Q#;t diff --git a/resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e0000a54.au b/resources/mods/DimDoors/sfx/creeepysound_data/e00/d00/e0000a54.au deleted file mode 100644 index 075f9a64018612cb5a36ab7a601364e6ee9f5023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1044572 zcmdSB3AAKsS*9Be1(fKO0?M)&uBK=+4+ReV5!t#Dg^~-R42_pbO`w2kkin*D3h9

}35$RG(ah!?0*X~8Rv1x4-=zX0yGnKIPy;e*TWL*~5Q#Hha#&FP`&>`3hfr@bar&doi0m zuJX^W_>#)cs()7Q^~A?k{|Z0(%8S-`Haon=SNq1^8qa1&*7zy+dh{Cq;G3RRv0lTh zJoQ7*So5B}{Hsr1^Dq37f4|0GdfyXzyjT1+Jm8%VPdu~YukDdgR##I-t@uqWD ze(8TbDdktMdG)!!`lgRsd%S_t0On_xNk`&(Xj4{C)EtfB*e+_pHA* z$NuNq|9tt^!te6;%3rg8f4YD5xu5v`?_YO+fBf%T@7dt(@6Qdt{oh>w{_*$3{r*1t zYjEs;C;0p0*gLQJ@gH4(zxn&`J^tSM_kd&X^w;TGfB)U@|LyRs|6RKII_?$!d^h~8 zcxUT#@$X50ZJYOh`|o!5_}9h1fBb#$zgPY57XQ5b``^DV{+j*o2Y(;D$3I{HKJ*@c zZT@$-zlZ+4-MaVLAG=roeX{-j_>k@z?C1qrZp#b@#8M|Jn4{xN@)iwX3N57@Vhvw(~ z>|JX1$XoUAuP@&4GZoJ&K0H5kr|awAdgABTc<2Rv|FQDex7@Je1C`$^*MIK$73=lP z=I^@df3NucZ=22Txp?Rkzq|gM@#Ynuy?DSoK2&?IsQ%;g>%R1M6(6ho;}$=EgHKib z`6YhUKVPr<&#w4ci#tB&1{GgY@%f9FUwBT%7gv0A@${GcOP{@L@qrKDqVk`q{8fwZ zd&314&+5NVPd|9(b1$m+t`%Rl`1zlGW5u_u_|F!fJnw}SU$f$)i)%gY;T6BDQe^&AF#iyS7GZi1N`1FH+^7IQU{+8M zUR3_p2fy?)Z?0Icb9V3pAANqsH?8=p#qWR1FI9Zwia)=&$t6#y`1FcjyLjV|>vR9s zim!L@hyUPV6<@95k1Wpp+TAMF`+sEd=->OEijP)&*Tp@$zp3xrcT~?K4?g1C|7Yd( zI-hp%)9<{h;vcB^wTr*M=bI{4=V=E&ID2%(|8B{D^ad}kSnt&p^XI)pUyEb)YkYih z)j$72#dodz*^94y`F*wj(zniLSI+nD`OJ#-y>zUU+kIQb`aYS>zj(v*YEJmT{3|zj z&Klq2E*DjNbm_VAQ~#>sy^4>_um56w@5z5?{=NtPYUO7YADG|!tBQ>)f@m|GydJqOhkmX9vv90@ z`WODC$9v_~ul%2D{Mx^KLyu?W*Wdc)H9qaSuUq5Gzx1-T|6xD&(u!xx*Wmwd^}m-k zfA;HZzU-HJ|E&1md;Z@Y|NG58iPWHdU{l5jy``<;IzpwVTelFU)&ROw${pSb& zy!`J>|M|`T+vI=W*000*bNAQd|Bm*o|NXyt&D*~}@xPxpf3MEAen;f5-~ZlTJme?V zugBld&1=}x_s-h0>e2Vo_Rr`3-xu%q*XAC7pZ&iz{+{@Mn_BOW^M0>mf8SQ0%j)&} z*U>+B&u)IM+y42=|C{b#cmMCNe{cBrq<;^4)_>mE{8`xkdD6e1{r&X!+57#^m-GJf z=ZWu+{w#0*TfX)B{q=ay4gbq8_TMx0?-u(v`0Ddoz5o8b>OXt?&kz0{Zr-2m-_Q8> zkNf>K`}fu6wQYY7``6BY{&e2oH-FFFizM~&7a5ZKiB^C z-F(mJcfXrIv;KYV?~ni4_pgP2Px|NLufhLL^FJ^Cwe!C}Tb=INyyx5hjcEND_rF8@ z^YYKv|6Fh0lkML*c-G%f|GU?F{OjWHxxa^-&t+Ep^|;@^KR55gUh%s&{H*wU=-ucm+U%$(<{{67}`+4=f>YtatKmNJ+`@DG#d*yELKU)8;SoM7Ul0WS+ zKa(7*e;4hQAOHOu>3h23W96!ko!#SExxw?VSZBZM6>nevo%7y1{L#8+_3sE}56mxk z=?~QG(fae%Ub*e_FRxfXFCCtr_tRIKuYLwQR&IKmXH|Z6@9XdIoxNvPHvcY|&7XPq zdslw-^Z(r+qn|&|S^j+Zl9ztC_FP#zkI$d{ySJ+NvdW*oc+}Ibs8~P$pTGF>KV7%_ z_4EJJ7XR(z-(K-+m;7U&x%v73zAydfKKuT~_rK+q)pJGlT(x-k?Veb%ekQ->!CQV( zKewM-e|CM(;zu9yhKlub^(Pnad-mq%|FiC)pPBVD?bjA>`@R2I@h2<3Z1M2x|5U{v zsrdARH+UC6|9@uj-t+YHzh39@#c%$*yH~8c&N}#mUwu}^tDpbBah>0)_^f)@^$s5T zkNUa&dKG`q!H>O8KmY$^#pfQp**|=sV*UL8iw8gck6*30RD8>Wcm4zY?7jN=|51OX zpZ|rgT73U|)uW%=Keu?{-~8u_uU+vai%&dRKmY6BCTASH%^Nm9|1Z9*f1Bt%xp;B< zkKDB4ODn!~@zHb6toT9I|Hy+Mdh4|huKwL|@xj;s*|jRxzcnscoc9j>`$a$h|HI+0V@`nSpF7JvM$`uSg9ubVIK_S?6s_)z^ier@sNmtS1*<0@Yk|8%?e)UV6=6(3og zb~XJQ?dBEVeDSisdqu^oulrZ-aqo)nS@{bVmmm7miqEL{jK$NR@wAFBsQ8|XYurNr zPCUHyJoS^aMg4xP`25AuzY|vf1&h}ozedHUS6u&H`TFPeoo6pjd)S*RzF*}JE$;rI zSNEOgFYf(U*QtJeU!A?U{Bh6jJ$GIF-=BC_#p2IjyzY`WRIL7s7vKG)@2LK#RlK+O zw)=i-#dYv}k70(vmbhooBe|*W;e=Ajd zq~g8#vrfOV_Z*tnzh^2wRQbd6`~SjkSG-s8vH6=`N%rXcmhZYvpFJ|a&f&kQ9(5j> zzvkArsQeWbUpfD=A3Rj?v5K#lf8j=V>G|2>hssY>d}-zDYn$osqQey*nqTL7uUOyv zhYx*S#Vh{3zb<^VdJfMY@Xo*P`NQ-3{?2PEUcLVNo&AA|_p0aE{CQVDqju``%odM* z&|@k-w&d@0;T}>JGi=I>Q z6&0Vc`15bRU&ZoYIltt~yg#Qe-hQ7aRbJmGXDkl<)&&(Gsh*?rtG!C^mA)qrEuQhn zU#(c3r!Veu@1Lt!{@LQ6F8;}iOT~v54|&ZWSFG=`vUtyTJiTK1&slu-X}?ghUfc2c z3!Zmj&mWzC@8j;=#zF-|K%?$Uits}v-*CM=hFEj{`)soe7NG{ z^Y{MBwJX-^pDljlqKhg%RQXHi_q^ko73O*ZliFtUpugIXr*CIlo&yM=L%uf5U^WUirgIeE(-(qvDn4*iXN+diE-R#r*RJ z^?jw+b7cOYm*{g;_R{%j&%a^C@*JQ4(7kS1@v(}J%>Uw%KT@$?!x8(u4$WV9)~D9@ z{`<$?XzjVtZ3)_bNU# zzv$9;RsVq{f6ljDQt@obf8?td_xx=Bo9}vV#fO%jTRie3J%4C^?(6jTgZKmUGoSqO ziuJR^fqDJ=a_#x)C%mBd9Gd^_-|Drk{MY~B@2v5!zx>j*|N2jQam9KKhvyH!x$xnN zkIZlK@;|QlSjDsQuE*)m@A7A)`Gv3LJv=af{hi+0_Z*mC>q);-@m}>Gn7`=n^f{{Y z!2BOy_=t)xt6z)zEiSqHcP&=mx92P#_&NRF^2+KtHvh)$^=G-Oo(mRdoq2i1|4{Mc z7N7g_nZ5tTi?==a#udM5$-n+ScdYnG#g{Ce^ud2qvHCAt+~jv|UGZlsKJDNcx7N=d ztDk3X@x4#2SijGF|Kb(@RlmfBk)%5$!<8RaN314-Vepb=X zFz;DB;$;u4_>&c%d2n`X{a#c*GkkLK!|&VtJoAOS>1PJ@-0*twr@FyOo zpJ&df_{@WE{bl_ea(2ZxJ$T2L|F?=)zt8-p&*}G>tN**88-MTDDqj6Q^O{$^sp8eo zGq=BmvU<(+_p}!aAE@}s#c#hrzt7aqGp}5{?`AizSp8=m{OfBys^ZfsKEC+ut$wUx zeJ;;heEe-UsrXkbKD79gKl*%qpY?muhaddJdp=Y78&-VL!L#1-&lT%699^7yKfPD_ z8SH8YFaMl=pQ)dqdshCy;#JT5Xzjn^ zt@Zn0aoN?MRk8kj&E|jom$$3og&-}H@?^XW5{Pb6U zqT<69ADLfux&BQlZetXSd^Lc-`=5PPzzo>Y1?-xFM z+Pd@0@B8z$=ge>0{O=Jj`r?b$JwNlBV{6Y<@BWh>*MG}={p)M~)i?dyHGcfL`rkqH zdF_?Q-sSZb&zAVQ@BNiE|Mwr@_py8BR=0Y^n!ocOeSVEs|C`9FXY;$?z4EeGf2?|r zEjvH)ou8^${j;+9-(qHE^?Th__U}*Q_rUsn=~vhN&;9bd*Z5z)fAc;#@2}^Z?)#4Q zz0Y{?|FzDp{`VTahP`r^`@FX2XXQa(f9Kj$U+)^9@#i03zS3+zvWjw{(A%ex3mAd-g{cV)AQd?*1sdxuWggv{=aGQ zf7jPP$7{d;4q@~A0sT4J{NJbf@8A6QY|i`Z_uqs0=eYS@$KKZeeW3qd#eXNW`Tg+r z|ILGU`tOM9_tyIJ^538M*U0<*_cQ*x3&;N2Heb8#|6SOBr{|siI{kNm{$Ba}x%s`y z-q!#9oBRFusQx<~f6e~+`g`I%{(DaUp4q&f?f2ZjfBg4Fo7X(s`o9Zx-tYDAH~-%D zPXAmsuV-ezH{09#U75eP&DVXl^?ys|@4sjL_jUd~;9m>p zSMSg2?+5Sn*Xf_5dmL~2xBoY<)%V`2-#_0?cKiF;zt-;e*W-W2{m+_zz5MsO{^!X1 zz0?1<#m(Opv$FbHtX{vrZ~i+;zstY({PjEUU$0em)$gy z{~Z1ApUvNI+uv9IXTe{O|GDT zO?#GvS#TUwToR>tN^M=wp@&^kgUFBNz8BE2IUE2lo8q}u~cR2W^=_EhU#q_$!u`}_;9bU8R7iOlp z&vkm4u0`zq^7BOBls#s(cYUYl#ra|P36@W|^Z{nSHizfkG&S#;h}A)l&n_6_j!cGK zJ~*bh>^Lv%JO0x1nw;o!4Nq$-t0!i}`EgxXdi3DWcyVPP89L)spWg%49UMGNcs$~D zm|)+R2Kykb^gC0l<6hqCMb`w&*Y##`8SdqE#Ff*~AK()N3I$hJg>+w98F&b%4t`7zzS!o>*3MsGp)=q?^i+T)qxiJ7T;X&7~9)U=Bq zJMPIkBBwsjct3oW!Pn9vPnUAi{Gn@T#y)xJ=z5&x@t|crW12F$gX1{sbI!fwJsk1cHT^gztRoMYJx=L( zr(nOUh5atwIdm_Yy7cVlsKc{h@qXg&+Eh%p{Oa=u&OPG%$e*2|Oy-A+xwzxg%sNv`mFE4x64#sN8NgKm=Q0< z{)2LQ{P^x2^0?+1w5WR?949@V1>?oTjC}M*T{|4J>p9Kr$cGob#i0+)*oC(P^fT^3 zK4Fc1-J?e*YAbfdON+X5Q7eSQoWi#}s*0L+9dxMnT6+OP|j@TDD>Ec?4 zynEnUnaIoU8E|JtI4JFU+=JGdbTBjDE`6S#k{j~qHMy=`hY5Di(lGGBv&v1$W}e8g zYl8JM9Bb#49!LjAjXh5Jd7_r>u|ImynXY%f7=~vm3&zGSO;78{$Ad@vu7^9Abg-)r z%;b)^!^he61hb{XT=!n**JX{@BrjQE-<8$Q!N-Jm z51h|2-MuZWj(Bg}TUq(=mX;~-^5bQ?MO@@NH;iENF%$Q!rsYv5$FaDWL1&W7X3Tn@ zYmT#?li_%s+`&H9iC;ctw8yM_n$9_P zkK-ZFkVZ%J6oh_8J;=*-%o97kL)o!B{-GW`OuXLh7#~x9>3W2x9{F{Y0WXREgSg1c ztB2#dWAxVC#oOu-A79I<>do%tE=}&qIM3qCxFOB`j{QF8Gwl7!@nqhN<1T4gw(I#U z3nz~s?ap~eapM3cAN_HU733oCyE^EJ(|uq(+C7Wj^*lO!Hs$3A`wp+^oz6#GdSb|r zCuXPap4UA(OxIS*<|7{W3lC+ac}{+vER*^0wls9jc(^0Z=+mx#9(3*T&=q;#r+C~i z%w3vb?{Q3491k2b^GoY6*u?7^SQBiKEhxS8%#c6pA-7c+7UkrN-nfU@*6Xg`z39(& zxX#MN`EF7Z($h4Uu;1?19WCCjTz)>fcj)e@;V)ifIQmUm!zmujyLib=nY?~YuyQTz zo$l$XphpLueZ{UmW}NF}otuh>vQg9C4HV;d51eA~&QXWPo_VCTcyj9TF8oYJ^EYwkiRrS%48ax^z29<^C*Xhj<{!h*OODc-4%6q=2%WX9`|M(`dD|tm`rJ|`yTnu@?iH!j=Mz$q59~Qk=?nh0AI<(o{JrL znX)+^s9H+V8+XrlzVuk!P$r3_)YKloD`vFo@#B8y!O;(|iNnNC zy7-u%l94C#W!%u+@|PilY3|GJL1$VteXW_#Gw7OnIu{chb!Em5y`Ckfnc=Zc>E0K2 zI>kHIt`oEJL~d!c5A-mRJm(lao0(6&8K32cIQ95pXG#<9+_VE$Zc5fYrSEr66uV}I z``8J?y(fqh2*0moFD;?x(V1>ne|F$C9lIC4R8r5_!9V6}>D-~IF8bivm3OS2Gse?} zf0r4%TV3#)V86$?t_pfMu8ETd=RW+A!;8+0ymq**H!-ye``%kdN2v}yIx+8>bbP`b zWn!+SWnRw~f)i%e6=QUd_2P?pa_G$H)1GO{>+z%Ay>WN1u;-QYUAnk<+>`0}TN*sG z5J;vx_*`yfGCs?Dm#{oB8+ZA{MQ_U|zaRPVGNn82Jg^UZGI@U;@pVNl-oqZ}*r$Ns zea<;9ZZhm1qnB_cGd?*cG^w4WS^E@2csA-o+(>3|yL1((&)dimEdJFI3 zZFRt(iY_|3zBKNl#liQslNxj}V_9be9yq2f($KZLrae2JaliMFiyT?c3HweqoA|N} z8o2_fGioMneg4kx2kTBfx-Z`8yF7kebH0U#@>v&tX6E58v}}rlm)~*BvuCrFE17v8 zT-Hww8Z+|jn(lF2+!U}h_Xc@u#m96JjwuaX+-SJPn`I5@5;2q;(kL79NXzuD4{L(m zC+xfIaTnL=Lp@Q8`^t6VM|^Rf=sb}j)0qS(O4xU^t)cX;-YLJafp8$7l4T!81!0z<8MA(d6?3?_9*5alf!M*JGBQ9DePsob&kA z<9tVPKcz)3Shn)s6@Bcnj|>xE+?9(QUQO5JrV7+#*FXT>w{xvol`mPQWscR$KEBMp0T5Rt79yy ze$Rp6r&UYV7FClKPVU&rohiYxO#>{??h&El<`l#G&~t$%}9f zZ(`dQrM_J{qkn3)<#WD-*Wz01lanX&Wn8NRz5x0ecVu|op(h@6@xs2lcSs}a{vq7D zgG^UJ^h8d&xa>&N6HmrPkMFIX&P=hBjC;(ULS-_)cuuCHovOK?JCxB=`WMlflI6>e z^N#VVQ;#3{BIo)LR+a;1iuYdU$w2P?+`IOeuGd^;0_io2szc5|PIx@~PQ!)23 zl>;-Kqqp?HJ)+=yc`xieJ#CD1uS@(6#~7TW6OM^jI-IZ{@fqhHFde?b(ZQ6*F+Q?m z6Tf#TBOZ-iGoF}}E{=x|eC*yME#sqyU4A{;Y4P&<9bl$+iGydlK8DG6!5H@-FV~hw zogBw-*&On557YB-OxON3a0#Vx5At#ydu^FMr8m1vIkHTA9Uz%#F%x%>4r%Ti!rUv5 zB(J@zk0x52?ghuG z4nJ{s%`ta5w_ogCQ}1uxMV?M}`Qc*LJy9Fl>0`P#+l(SeRoWTJEXxe(c+YsBkVi8 zrubrn`=aJPi>x8pF`w(gXyEs46iW5D~ zIPXDcQh`T2Sej$)(sh^-XM60BN5^^f(aCg=d&Rq7dv?4B%*^~Pj!b6;I8nmBn{5rH zck68fA~)9KelSz5jyJcgkhGRwf~I}flXYiY>~+r=MlZDlOrJO%@o3_}Xqxf3M;VUu z!ci0F9&)X@i?`L$;^{7CXkoLYpObX5^m-=aTqog8FPtV=Ip3Y9(>c76%e)q&c_TMc%PX@7t{UXVkYkH7xo^!%;+84$*B{Z zWu)t9f|o?&gSzyLomQ7;!SaID8~3rhGClUGQ_s-xO!P_PnX1tjb6qT$uq#6!_WkxK zpJg)+uiq_S^t!H0Jkjs^kfvVmZh76~SohS-o^pEjd&rhXL5o+8EK%QM&Nci@X;CNd zJRG@f;+GffzE%f3lZC#M+~um*if!vDxYpANyKd>kjhD?f0mI9`EqZsI$Arvl&)q%s-}Q zy}NR)JDhi{e(idSmi|Ofn?7y_Lbo#HZZQ$@GjH>xlQde@t`Tv3CfUo{$I3?4{)p2hZ%> zFoMa)Ox&}YmPef&$8ehPak?ksE)sQzVO&gdF^}}<8QbY*7C0Ph8|n<@97HdNU8)6z>#|zZUtYWZdI9}`|P<6H+9z{Dv(&&0@j+doDhtqVgu+lmC@rT?$R>OGbe*fBb?nSZ^lzW zmwVvkfp?B98he~s29Imr8eOd!yD}gBt(j#qj(n!IUWYO*O+8aOr+9cxewT7& zBah#wJUq@%#ePT3xaQb>Cv&%YVsGc=0i!X4e9|kuae6VDbKn99b0{OLa-Q|wd3ig1 z=npu0;*Ni8s*g_hW?ahO%?5IretRPpLjV9LM66;lZ=(R9?rsTX^MMea!BqEB0xZ=Dp%LS(kgk zOmf*&7f0A1cxKk;oU*6#oT@&5joIs)a?e;tt2gV;xGeA7)cf7%_rUvf>~{%EV_!DD(7SyIY*w)95L4EOR*BkNZ|ydx`>$Mbl^a~zAq&vcGVHs#MU#dvgP>}m1Q zr(L}|%!rrb4j**)l>6Po-OlMsc1^JJ!r8&g%sgY44V`mu1DZcsk<5UwVNZpLjj+j`3)sI|uKYkc$o0+5f^oQ zOxGRL%8uoU z4fWt*;`MGY8eUB}d4$=e?Q-^;%kDT8U9p3`vkS$+8@&_sJecW487IB#O-#>#rA0mN zcr{%sF7&v?c~02(EEB6^M!I)s_nxRp=eQ4U*GY$_p00nqM;u2UKdw0sMrXn^op+30 zdce#)c+q?+=X>8_IAV^S zUcxONT~ir+@UaIUdN#cS%*_0eYk5mGx~6@~8S{B(tIs`--4D+!RRrS`$3b&W7#?3X zJ>!01X|88^ah{W3d(3I)sc?CGcidsHnQ-RE8IaUA=U(P6H(6L;mJ2d}1U@^YLP zr(L>xe0RR|KF#d7H`B?reCRRT;@y{ZMs7+^=Aj3TIdnf6pTg{(9l}HY(g?;3KBnt% zsuE^*PrL>Xyzk19jXZvIcKO^3ujzb-o%390i*WR@Yw}oR3wE|S7OkwGs7ssT8S9Xq zb$hObxnFt5(NDjo0|Pt>~J0I$gtvtv6QEuZwxMEuT4j=M!pfOMQ77=edrQVMmyo*}<$ z^6EIZVzxiJPG;M&+T54v;_zsK#drD;4jj{E&%%q#c=VH**=yKO-_YwD()_OIoATP^ z$$S~-cV)O_WWu>Gy9ZsAkM0RvMi9r0Kvh@vhWqAIUQ5WuMv^{p`F7^>~+KJguoN9&*}s*jL-;V~fW@ zzO}#kv=<~^TxKnZ0>W0nd zO(&DP@cGW`W1^AOl;*lT@!%KlUgya~PP?A2H$*i@blym9yLsFBfhpLTiO?>O_4 z(d2jrPBZ3Rn~K#zkIya?u;W42jwVhR4^w=0V$OH`>JYD~hvR$X@no~Bq#n;?KG%hn z(KB>BBd_+D!4rA)W}JAPmPQ{Qd`$83=z(KO6ZT!4A8Eyj9%r2Qpfjn!BOWZxv3BV? z%!uQze5=EG_36=ZjEA{$Y^_C12YrhdmaxHO*p9Kr$cGm_?pZeD$Y(S9QybSanVt-k&8`?*6IJtbVq&Xg>l4s*4gxWhBm;XUHj5jpWghaP3)aSmVf_>M<& z${F*aGrhC(#V|Z`C@U?~t!@eFa(+qtpf?0NV&-4k&aiMqov6U!t@`6(SGw8cHh%XO?b)2H-i zcPZx&9^IiQJ40ILhtoY|Tix|!xHyL)1(Mvd_$sqmz4NqCVn*76* z*Fdt>lYI`E7hk4{ldeZt4+oyzr~8HD$+D%I^kgUN$b90ac&B*$wa7n|aj#y3_Q;8E z9lT8Wz?xkW9O7D9##3E-z=R*0^7D*&Gd*UtcYSB(hm*&TcIUjKxN!h`-fhaaH1`c* zb?DKFbH%Pcw(cQ=x8*}`P35wz`o(Md(GJISeGJD;7Xq$>qlZYwi&HMsl*@QH<>En$ zynE$|KIw2wb%3Sou&=fg-&=g>K9%KhKH{t+a&eCx*{-{FG{N5EcxkL3;F#jOUUaUf zmIK{6ysouyE9V`a#V-yXFPbKrbKsU1d!o;GdGR~X9h&IEcr?YcON&Q(JQ;^4cEufE zYtqe(z83F3?qs?Kj+%Bo1w)w8?=l+GwTSUBqkgLPQj7F(9K-q4>v4~EJ$~XYE#o{> z>Y`^qr z)^V@1M+FL{k>*y0CbjsAapl{KVdwt%BI?iLw@>Z8+*8JFop_qIBQGJZ$IF&B6DXLpN> znat-s8TQQ7K4sjiU5_8vod>($v2=DO8O_o^aG3{|VMQ zkA1FrJv~g1jW5-__S@GF{XX5c4+*MInGdt4saOCqHe#%sq;}~w2>G}A2Tx)g8 zlld~P)d61sBNLzQ$nHVcblj@NGp5tmB}V5QC)Siwcg%^4M_k57AA9Wd-FqC9WqQUj zx~BL{gJa^=96O%DTL2SgmiL(J^fKiWc8_PruyVU*b)Qbmv1@`epEy76b$$$&YS1&~ zjQP-+-r4zL7@j$lm6qvNw}fs$3oZ^vB z{qkx~Jz2Ns9cNzM)8gZ6X!-mO$1&g9VFf47d}4iPIk>wA3tc$?Seh;n2ufUBkxmr-|2;8*A&O&ykpOmUJwTs)xy1faHz|Vy68h= zy5<>SJP|9?I?_DX@`;Z=ddE8O4dsXKjT(KC*FL1-Z+YVD!>@^^2`*-E44rXPG(1dt zI*2;KnqZTcu=Ip<$L!>@fx4!`;wD<6-zjK`-uN7#3GpRo%+ z6K~v=iyU4}*W~3mFHXC3_c+FrP3MGTF6u=@J(*9ubbp)!YjWsgk2BtbpBeqy(U{^o zeW(YHxnfWJD4mQ?VfGVKIWy!hd1QS@E8F7LM`z2UEAeo>@5+&le3pfCFTFnLgu~B- z_lXv>?g8UvpE^CKd#2nq=4t6Ip4W=bgfD=RDPPOm;zuf%a@U)fT7|t696i4GH77OH z$1_w^21IE*nQf{jUzZj1+>n;V)Tg5fUJ~_#y5N}7z)W%RM6K%$&I|jFCw9f13^UWc z3!ih!#GM}e?Agq+Q*z#=4n0FT*W}&x3}w8#)r*ITFYAS4;?<1#7U!9%o|w_D*O0xA z%$xbAWV6pH>yN%E-ST9*AA~wuMNy=WM_((FFVdV#;XoJe&ow| z_rwglvhg^FPafyVNOuoBQyFqhG^X-;vXk+Vi+k4NT<1%Vvkq~YH;FH)mKUBWGnkom zmYy8)RLdT|tYeI$n+{FKS0vr>+^vI!UO4nhwye;0dbiny8ZpzU;+!gb# zsSDqfUU}4~hn%nuyD*%l^U{Wn{A61`^sE<+Y~~TC2QQNhQ=aUIk6N~OS-9uiFQ4zN z7#?QkbFE7Za7qgfEa~FFD(NB1-!oI_4>Yy>jb^0*jc*gDGV@J#DInT&XhKbjG;(Qm@QzY~U zPHWV}$qO&66X%L;^U~?St9{Dht|{JA>CwH}-H~JO>~eANMlat3-=|`_;#3|kc6B|$ z#Or=(uE&m;aj*AeIlS_L<#U|nGESM8i+izP)J$r=U+$TTb*CQP7w`049zU)*pJ8Rm z`-~mFJ0?T7G&rVf;5e1j6OTH?YwFR_&Ou|x!yc#nF%v!7y+@c_=7sZ&{N&JmN{ebFK^~|A37aOd4zrU9C}GS;^OfhbS7Rr;=$4!YnQIWj5yoH`627w;^3Le;9=4u zkNe<#x(<%h{SnK{Bdv>u9d`A^ytsHW&ONb1TE=?gK z&X>CD;eeUqyIyoo7`~U&;TiV}OLILfs3bZ3+Nb33tJnR?$0IJ|@p;}cdYrLqN=6+q z7x$?>yq=an_R24>^N#7$9OKm!&sawOmdE?#;qg1*G*9IzwM>tCHM4^Ut>r^+P2It9 z4ChmK;9jkh(saDaSibae{*E^a@EZe{5l>-9`_ zr}QC@v@Q!;Zpfo(D<5m|sgL7W93J7QwK(xQ(NCB2!oK5K77TnK!;Dt(-i6P(ECYw1 zT{#{&&FFJ2V&!#|A;*N*j7K>=eth>1d89>-tTa8XL(Zo#J2~GSqieQ!JWT!23xaBDr>U3=M z32=%pyAO`3V#g<3)F7s2O324O$jf!CJJYB1W_Kw^mYMmS>*}H>J3}4PTDhz%<2>(J z-9rbR>0Y?b$pjDi&=ec%k-i^K%)~vu7I;pox7Q?Wf-3( zPv*-wveIH!d)M>QTSp#0+MV-`;>O@}$@9*~ylYdjI_QbhJ33n&lR=gS$3%-$UXHNu z@S5U_5$U-o+cULwo5(O|YmI?(NIrp2$nM&hi^@F>o6l;is6IqugemvOC*sr*o9nNWg< zNhIrqW8&3}dAN)p%emgd*=uNd#mny*$E{px34xEkDc$m9zR1NrT)kXNMkbv5vR-ti zDjX-3gA`e2m$;pCoLHL_xzanB9>_S?Bc>DHckgl>y=3G8FUNT}>3CcRYdR+9 zvsj1o!qVc2T->`D=y!Og+teZ6HF0CdGmbq+CsP`jSv(Lh9_Z+eJH9ECZaOr_lEWT-OJfT7}t5uTLHL$&(Y0<`{iws*4Ao_IThlOB6?T zvMn3>l-?l^J$_I0Pw^-pbK0{kce#JahhLKn(>buTR$t`3M|qu$TPdrLEj{Bq4<=X{ zd17`fm+7%1xh|!YBg>Sr>mT8GhP3GQ-TR&21?z5(8pL-+Lu6#V=qQ=gYM<>n|yW!b=(&5|`%w1EwW1dsd6+75F zyIdT+(ffvU`E=~X@Lf+bwMs+Rl%{9s$frlgy>KgK^)YhV^>n={>Y_8Qx37otbU?

9h1k;%shBAjhsBLJ0{OmhFtW)%j=k|Pi6It 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

tZz5GH_w_&3gw}1fi_N%n}WvT(kS`!2hF{D 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 z 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

&fE^qPi4 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

+WzV@v*`aBj%FD{*TD*+=?bO~`Pd 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

w(L6o8YJbb3EB@hM`SH=n>r=Czo_W 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