diff --git a/src/main/java/WayofTime/bloodmagic/gson/Adapters.java b/src/main/java/WayofTime/bloodmagic/gson/Adapters.java new file mode 100644 index 00000000..bf250a83 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/gson/Adapters.java @@ -0,0 +1,6 @@ +package WayofTime.bloodmagic.gson; + +public class Adapters +{ + public static EnumFacingTypeAdapter adapter = new EnumFacingTypeAdapter(); +} diff --git a/src/main/java/WayofTime/bloodmagic/gson/EnumFacingTypeAdapter.java b/src/main/java/WayofTime/bloodmagic/gson/EnumFacingTypeAdapter.java new file mode 100644 index 00000000..1201f458 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/gson/EnumFacingTypeAdapter.java @@ -0,0 +1,30 @@ +package WayofTime.bloodmagic.gson; + +import java.lang.reflect.Type; + +import net.minecraft.util.EnumFacing; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +public class EnumFacingTypeAdapter implements JsonDeserializer, JsonSerializer +{ + @Override + public EnumFacing deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException + { + String str = json.getAsString(); + + return EnumFacing.byName(str); + } + + @Override + public JsonElement serialize(EnumFacing src, Type typeOfSrc, JsonSerializationContext context) + { + // Not necessary, since this is only used for deserialization. + return null; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java index 743b5f4a..0d640d3c 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java +++ b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java @@ -25,6 +25,8 @@ public class Dungeon { public static boolean placeStructureAtPosition(Random rand, WorldServer world, BlockPos pos) { + long startTime = System.nanoTime(); + Map> availableDoorMap = new HashMap>(); //Map of doors. The EnumFacing indicates what way this door faces. List descriptorList = new ArrayList(); Map> roomMap = new HashMap>(); // Placement positions in terms of actual positions @@ -158,6 +160,11 @@ public class Dungeon } } + long endTime = System.nanoTime(); + + long duration = (endTime - startTime); //divide by 1000000 to get milliseconds. + System.out.println("Duration: " + duration + "(ns), " + duration / 1000000 + "(ms)"); + //Building what I've got for (Entry> entry : roomMap.entrySet()) { diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java index 5aebe083..f7d7a495 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java @@ -8,6 +8,7 @@ import java.util.Map.Entry; import java.util.Random; import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldServer; import net.minecraft.world.gen.structure.template.PlacementSettings; @@ -16,12 +17,12 @@ import WayofTime.bloodmagic.api.ritual.AreaDescriptor; public class DungeonRoom { - protected Map structureMap = new HashMap(); + public Map structureMap = new HashMap(); - Map> doorMap = new HashMap>(); //Map of doors. The EnumFacing indicates what way this door faces. - List descriptorList = new ArrayList(); + public Map> doorMap = new HashMap>(); //Map of doors. The EnumFacing indicates what way this door faces. + public List descriptorList = new ArrayList(); - public DungeonRoom(Map structureMap, Map> doorMap, List descriptorList) + public DungeonRoom(Map structureMap, Map> doorMap, List descriptorList) { this.structureMap = structureMap; this.doorMap = doorMap; @@ -59,9 +60,10 @@ public class DungeonRoom public boolean placeStructureAtPosition(Random rand, PlacementSettings settings, WorldServer world, BlockPos pos) { - for (Entry entry : structureMap.entrySet()) + for (Entry entry : structureMap.entrySet()) { - DungeonStructure structure = entry.getKey(); + ResourceLocation location = new ResourceLocation(entry.getKey()); + DungeonStructure structure = new DungeonStructure(location); BlockPos offsetPos = Template.transformedBlockPos(settings, entry.getValue()); structure.placeStructureAtPosition(rand, settings, world, pos.add(offsetPos)); diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java new file mode 100644 index 00000000..4145018f --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java @@ -0,0 +1,95 @@ +package WayofTime.bloodmagic.structures; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.Writer; +import java.util.Random; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; + +import org.apache.commons.io.IOUtils; + +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.gson.Adapters; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class DungeonRoomLoader +{ + public static void saveDungeons() + { + for (DungeonRoom room : DungeonRoomRegistry.dungeonWeightMap.keySet()) + { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + String json = gson.toJson(room); + + Writer writer; + try + { + File file = new File("config/BloodMagic/schematics"); + file.mkdirs(); + + writer = new FileWriter("config/BloodMagic/schematics/" + new Random().nextInt() + ".json"); + writer.write(json); + writer.close(); + } catch (IOException e) + { + e.printStackTrace(); + } + } + } + + public static void loadDungeons() + { + String folder = "config/BloodMagic/schematics"; + Gson gson = new GsonBuilder().setPrettyPrinting().registerTypeAdapter(EnumFacing.class, Adapters.adapter).create(); + + File file = new File(folder); + File[] files = file.listFiles(); + BufferedReader br; + + try + { + for (File f : files) + { + System.out.println("File: " + f); + br = new BufferedReader(new FileReader(f)); + + DungeonRoom room = gson.fromJson(br, DungeonRoom.class); + DungeonRoomRegistry.registerDungeonRoom(room, 1); + } + } catch (FileNotFoundException e) + { + e.printStackTrace(); + } + } + + public static void test() + { + ResourceLocation id = new ResourceLocation(Constants.Mod.MODID, "testGson"); + String s = id.getResourceDomain(); + String s1 = id.getResourcePath(); + InputStream inputstream = null; + + try + { + inputstream = MinecraftServer.class.getResourceAsStream("/assets/" + s + "/schematics/" + s1 + ".nbt"); +// this.readTemplateFromStream(s1, inputstream); + return; + } catch (Throwable var10) + { + + } finally + { + IOUtils.closeQuietly(inputstream); + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java index 37f0c5c2..bfd47d8b 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java @@ -2,22 +2,30 @@ package WayofTime.bloodmagic.structures; import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; import java.util.Random; public class DungeonRoomRegistry { public static Map dungeonWeightMap = new HashMap(); + private static int totalWeight = 0; public static void registerDungeonRoom(DungeonRoom room, int weight) { dungeonWeightMap.put(room, weight); + totalWeight += weight; } public static DungeonRoom getRandomDungeonRoom(Random rand) { - for (DungeonRoom room : dungeonWeightMap.keySet()) + int wantedWeight = rand.nextInt(totalWeight); + for (Entry entry : dungeonWeightMap.entrySet()) { - return room; + wantedWeight -= entry.getValue(); + if (wantedWeight < 0) + { + return entry.getKey(); + } } return null; diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java index 5e811bad..1aa9b655 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java @@ -9,11 +9,10 @@ import net.minecraft.world.WorldServer; import net.minecraft.world.gen.structure.template.PlacementSettings; import net.minecraft.world.gen.structure.template.Template; import net.minecraft.world.gen.structure.template.TemplateManager; -import WayofTime.bloodmagic.api.Constants; public class DungeonStructure { - final ResourceLocation resource; + public ResourceLocation resource; public DungeonStructure(ResourceLocation resource) { @@ -28,7 +27,6 @@ public class DungeonStructure MinecraftServer minecraftserver = world.getMinecraftServer(); TemplateManager templatemanager = world.getStructureTemplateManager(); - ResourceLocation resource = new ResourceLocation(Constants.Mod.MODID, "Corridor1"); Template template = templatemanager.func_189942_b(minecraftserver, resource); if (template == null) diff --git a/src/main/java/WayofTime/bloodmagic/structures/ModDungeons.java b/src/main/java/WayofTime/bloodmagic/structures/ModDungeons.java index f472d97c..021d9464 100644 --- a/src/main/java/WayofTime/bloodmagic/structures/ModDungeons.java +++ b/src/main/java/WayofTime/bloodmagic/structures/ModDungeons.java @@ -1,36 +1,28 @@ package WayofTime.bloodmagic.structures; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.minecraft.util.EnumFacing; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.ritual.AreaDescriptor; - public class ModDungeons { public static void init() { - ResourceLocation resource = new ResourceLocation(Constants.Mod.MODID, "Corridor1"); +// ResourceLocation resource = new ResourceLocation(Constants.Mod.MODID, "Corridor1"); +// +// Map structureMap = new HashMap(); +// structureMap.put(resource.toString(), new BlockPos(0, 0, 0)); +// +// Map> doorMap = new HashMap>(); +// List descriptorList = new ArrayList(); +// descriptorList.add(new AreaDescriptor.Rectangle(new BlockPos(0, 0, 0), 5, 3, 7)); +// +// DungeonUtil.addRoom(doorMap, EnumFacing.NORTH, new BlockPos(3, 0, 0)); +// DungeonUtil.addRoom(doorMap, EnumFacing.SOUTH, new BlockPos(3, 0, 6)); +// DungeonUtil.addRoom(doorMap, EnumFacing.WEST, new BlockPos(0, 0, 3)); +// +// DungeonRoom room = new DungeonRoom(structureMap, doorMap, descriptorList); +// +// DungeonRoomRegistry.registerDungeonRoom(room, 1); +// +// DungeonRoomLoader.saveDungeons(); - DungeonStructure structure = new DungeonStructure(resource); - Map structureMap = new HashMap(); - structureMap.put(structure, new BlockPos(0, 0, 0)); - - Map> doorMap = new HashMap>(); - List descriptorList = new ArrayList(); - descriptorList.add(new AreaDescriptor.Rectangle(new BlockPos(0, 0, 0), 5, 3, 7)); - - DungeonUtil.addRoom(doorMap, EnumFacing.NORTH, new BlockPos(3, 0, 0)); - DungeonUtil.addRoom(doorMap, EnumFacing.SOUTH, new BlockPos(3, 0, 6)); - DungeonUtil.addRoom(doorMap, EnumFacing.WEST, new BlockPos(0, 0, 3)); - - DungeonRoom room = new DungeonRoom(structureMap, doorMap, descriptorList); - - DungeonRoomRegistry.registerDungeonRoom(room, 1); + DungeonRoomLoader.loadDungeons(); } } diff --git a/src/main/resources/assets/bloodmagic/schematics/building/buildings.zip b/src/main/resources/assets/bloodmagic/schematics/building/buildings.zip deleted file mode 100644 index 8bd63a85..00000000 Binary files a/src/main/resources/assets/bloodmagic/schematics/building/buildings.zip and /dev/null differ