From f734e939211dfb12c073c86b50d7a817e4bf746b Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 20 Aug 2016 14:00:08 -0400 Subject: [PATCH] Testing the infrastructure and adding more things such as AreaDescriptor transforms and checking for overlaps. --- .../bloodmagic/api/ritual/AreaDescriptor.java | 86 +++++++++++++- .../item/sigil/ItemSigilDivination.java | 11 +- .../item/sigil/ItemSigilFastMiner.java | 1 - .../structures/BuildTestStructure.java | 60 ++++++++++ .../bloodmagic/structures/DungeonRoom.java | 20 ++++ .../structures/DungeonRoomRegistry.java | 15 +++ .../structures/DungeonStructure.java | 112 ++++++++++++++++++ .../bloodmagic/structures/DungeonTester.java | 74 ++++++++++++ .../bloodmagic/structures/DungeonUtil.java | 55 +++++++++ .../bloodmagic/structures/Corridor1.nbt | Bin 0 -> 631 bytes 10 files changed, 429 insertions(+), 5 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java create mode 100644 src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java create mode 100644 src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java create mode 100644 src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java create mode 100644 src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java create mode 100644 src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java create mode 100644 src/main/resources/assets/bloodmagic/structures/Corridor1.nbt diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java b/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java index 9382fd48..68d54f61 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/AreaDescriptor.java @@ -6,10 +6,12 @@ import java.util.Iterator; import java.util.List; import java.util.function.Consumer; -import WayofTime.bloodmagic.api.Constants; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import WayofTime.bloodmagic.api.Constants; public abstract class AreaDescriptor implements Iterator { @@ -57,10 +59,16 @@ public abstract class AreaDescriptor implements Iterator */ public abstract void modifyAreaByBlockPositions(BlockPos pos1, BlockPos pos2); + public abstract boolean intersects(AreaDescriptor descriptor); + + public abstract AreaDescriptor offset(BlockPos offset); + + public abstract AreaDescriptor rotateDescriptor(PlacementSettings settings); + public static class Rectangle extends AreaDescriptor { - private BlockPos minimumOffset; - private BlockPos maximumOffset; // Non-inclusive maximum offset. + protected BlockPos minimumOffset; + protected BlockPos maximumOffset; // Non-inclusive maximum offset. private BlockPos currentPosition; private ArrayList blockPosCache; @@ -259,6 +267,37 @@ public abstract class AreaDescriptor implements Iterator { return minimumOffset.getY() >= -verticalLimit && maximumOffset.getY() <= verticalLimit + 1 && minimumOffset.getX() >= -horizontalLimit && maximumOffset.getX() <= horizontalLimit + 1 && minimumOffset.getZ() >= -horizontalLimit && maximumOffset.getZ() <= horizontalLimit + 1; } + + @Override + public boolean intersects(AreaDescriptor descriptor) + { + if (descriptor instanceof AreaDescriptor.Rectangle) + { + AreaDescriptor.Rectangle rectangle = (AreaDescriptor.Rectangle) descriptor; + + return !(minimumOffset.getX() >= rectangle.maximumOffset.getX() || minimumOffset.getY() >= rectangle.maximumOffset.getY() || minimumOffset.getZ() >= rectangle.maximumOffset.getZ() || rectangle.minimumOffset.getX() >= maximumOffset.getX() || rectangle.minimumOffset.getY() >= maximumOffset.getY() || rectangle.minimumOffset.getZ() >= maximumOffset.getZ()); + } + + return false; + } + + @Override + public AreaDescriptor offset(BlockPos offset) + { + return new AreaDescriptor.Rectangle(this.minimumOffset.add(offset), this.maximumOffset.add(offset)); + } + + @Override + public AreaDescriptor rotateDescriptor(PlacementSettings settings) + { + BlockPos rotatePos1 = Template.transformedBlockPos(settings, minimumOffset); + BlockPos rotatePos2 = Template.transformedBlockPos(settings, maximumOffset.add(-1, -1, -1)); //It works, shut up! + + AreaDescriptor.Rectangle rectangle = new AreaDescriptor.Rectangle(this.minimumOffset, 1); + rectangle.modifyAreaByBlockPositions(rotatePos1, rotatePos2); + + return rectangle; + } } public static class HemiSphere extends AreaDescriptor @@ -416,6 +455,26 @@ public abstract class AreaDescriptor implements Iterator // TODO Auto-generated method stub return false; } + + @Override + public boolean intersects(AreaDescriptor descriptor) + { + // TODO Auto-generated method stub + return false; + } + + @Override + public AreaDescriptor offset(BlockPos offset) + { + return new AreaDescriptor.HemiSphere(minimumOffset.add(offset), radius); + } + + @Override + public AreaDescriptor rotateDescriptor(PlacementSettings settings) + { + // TODO Auto-generated method stub + return this; + } } public static class Cross extends AreaDescriptor @@ -537,5 +596,26 @@ public abstract class AreaDescriptor implements Iterator // TODO Auto-generated method stub return false; } + + @Override + public boolean intersects(AreaDescriptor descriptor) + { + // TODO Auto-generated method stub + return false; + } + + @Override + public AreaDescriptor offset(BlockPos offset) + { + // TODO Auto-generated method stub + return new AreaDescriptor.Cross(centerPos.add(offset), size); + } + + @Override + public AreaDescriptor rotateDescriptor(PlacementSettings settings) + { + // TODO Auto-generated method stub + return this; + } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java index f7a437a7..170a93bf 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java @@ -12,11 +12,12 @@ import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; - +import net.minecraft.world.WorldServer; import WayofTime.bloodmagic.api.altar.IBloodAltar; import WayofTime.bloodmagic.api.iface.IAltarReader; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; +import WayofTime.bloodmagic.structures.DungeonTester; import WayofTime.bloodmagic.tile.TileIncenseAltar; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.helper.NumeralHelper; @@ -31,6 +32,14 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader @Override public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) { + if (world instanceof WorldServer) + { + System.out.println("Testing..."); +// BuildTestStructure s = new BuildTestStructure(); +// s.placeStructureAtPosition(new Random(), Rotation.CLOCKWISE_180, (WorldServer) world, player.getPosition(), 0); + DungeonTester.testDungeonElementWithOutput((WorldServer) world, player.getPosition()); + } + if (!world.isRemote) { super.onItemRightClick(stack, world, player, hand); diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java index a55b9435..f67186f7 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java @@ -5,7 +5,6 @@ import net.minecraft.init.MobEffects; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; -import WayofTime.bloodmagic.api.Constants; public class ItemSigilFastMiner extends ItemSigilToggleableBase { diff --git a/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java b/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java new file mode 100644 index 00000000..173aedbd --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java @@ -0,0 +1,60 @@ +package WayofTime.bloodmagic.structures; + +import java.util.Random; + +import WayofTime.bloodmagic.api.Constants; +import net.minecraft.block.Block; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +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; + +public class BuildTestStructure +{ + public boolean placeStructureAtPosition(Random rand, Rotation baseRotation, WorldServer world, BlockPos pos, int iteration) + { + if (pos == null) + return false; + + 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) + { + System.out.println("Invalid template for location: " + resource); + return false; + } + + PlacementSettings settings = new PlacementSettings(); + settings.setMirror(Mirror.NONE); + + Rotation rot; + + rot = baseRotation; + if (rot == null) + rot = Rotation.NONE; + + settings.setRotation(rot); + settings.setIgnoreEntities(true); + settings.setChunk((ChunkPos) null); + settings.setReplacedBlock((Block) null); + settings.setIgnoreStructureBlock(false); + +// settings.func_189946_a(MathHelper.clamp_float(schema.integrity, 0.0F, 1.0F)); + + BlockPos offset = Template.transformedBlockPos(settings, new BlockPos(0, 0, 0)); + BlockPos finalPos = pos.add(offset); + template.addBlocksToWorldChunk(world, finalPos, settings); + + return true; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java new file mode 100644 index 00000000..63e60730 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java @@ -0,0 +1,20 @@ +package WayofTime.bloodmagic.structures; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import WayofTime.bloodmagic.api.ritual.AreaDescriptor; + +public class DungeonRoom +{ + protected Map structureMap = new HashMap(); + + public List getAreaDescriptors(PlacementSettings settings, BlockPos position) + { + return new ArrayList(); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java new file mode 100644 index 00000000..262faefe --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java @@ -0,0 +1,15 @@ +package WayofTime.bloodmagic.structures; + +import java.util.HashMap; +import java.util.Map; + +public class DungeonRoomRegistry +{ + public static Map dungeonWeightMap = new HashMap(); + + public static void registerDungeonRoom(DungeonRoom room, int weight) + { + dungeonWeightMap.put(room, weight); + } + +} diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java new file mode 100644 index 00000000..5bb1dd58 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java @@ -0,0 +1,112 @@ +package WayofTime.bloodmagic.structures; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +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; +import WayofTime.bloodmagic.api.ritual.AreaDescriptor; + +public class DungeonStructure +{ + final ResourceLocation resource; + Map> doorMap = new HashMap>(); //Map of doors. The EnumFacing indicates what way this door faces. + List descriptorList = new ArrayList(); + + public DungeonStructure(ResourceLocation resource, Map> doorMap, List descriptorList) + { + this.resource = resource; + this.doorMap = doorMap; + this.descriptorList = descriptorList; + } + + public List getAreaDescriptors(PlacementSettings settings, BlockPos offset) + { + List newList = new ArrayList(); + + for (AreaDescriptor desc : descriptorList) + { + newList.add(desc.rotateDescriptor(settings).offset(offset)); + } + + return newList; + } + + public List getDoorOffsetsForFacing(PlacementSettings settings, EnumFacing facing) + { + List offsetList = new ArrayList(); + + EnumFacing originalFacing = DungeonUtil.reverseRotate(settings.getMirror(), settings.getRotation(), facing); + if (doorMap.containsKey(originalFacing)) + { + List doorList = doorMap.get(originalFacing); + for (BlockPos doorPos : doorList) + { + offsetList.add(Template.transformedBlockPos(settings, doorPos)); + } + } + + return offsetList; + } + + public boolean placeStructureAtPosition(Random rand, Mirror mirror, Rotation rotation, WorldServer world, BlockPos pos) + { + if (pos == null) + return false; + + 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) + { + System.out.println("Invalid template for location: " + resource); + return false; + } + + PlacementSettings settings = new PlacementSettings(); + Mirror mir = mirror; + if (mir == null) + { + mir = Mirror.NONE; + } + + settings.setMirror(mir); + + Rotation rot; + + rot = rotation; + if (rot == null) + rot = Rotation.NONE; + + settings.setRotation(rot); + settings.setIgnoreEntities(true); + settings.setChunk((ChunkPos) null); + settings.setReplacedBlock((Block) null); + settings.setIgnoreStructureBlock(false); + +// settings.func_189946_a(MathHelper.clamp_float(schema.integrity, 0.0F, 1.0F)); + + BlockPos offset = Template.transformedBlockPos(settings, new BlockPos(0, 0, 0)); + BlockPos finalPos = pos.add(offset); + template.addBlocksToWorldChunk(world, finalPos, settings); + + return true; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java new file mode 100644 index 00000000..a52e2309 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java @@ -0,0 +1,74 @@ +package WayofTime.bloodmagic.structures; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import net.minecraft.init.Blocks; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.WorldServer; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.ritual.AreaDescriptor; + +public class DungeonTester +{ + public static void testDungeonElementWithOutput(WorldServer world, BlockPos pos) + { + ResourceLocation resource = new ResourceLocation(Constants.Mod.MODID, "Corridor1"); + 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)); + + DungeonStructure structure = new DungeonStructure(resource, doorMap, descriptorList); + + int i = 0; + + for (Mirror mirror : Mirror.values()) + { +// System.out.print("Mirror: " + mirror + '\n'); + int j = 0; + for (Rotation rot : Rotation.values()) + { +// System.out.print("Rotation: " + rot + '\n'); + PlacementSettings settings = new PlacementSettings(); + settings.setRotation(rot); + settings.setMirror(mirror); + + BlockPos offsetPos = pos.add(i * 16, 0, j * 16); + structure.placeStructureAtPosition(new Random(), mirror, rot, world, offsetPos); + +// List descriptors = structure.getAreaDescriptors(settings, offsetPos); +// for (AreaDescriptor desc : descriptors) +// { +// List posList = desc.getContainedPositions(new BlockPos(0, 0, 0)); +// for (BlockPos placePos : posList) +// { +// world.setBlockState(placePos, Blocks.REDSTONE_BLOCK.getDefaultState()); +// } +// } + +// for (EnumFacing facing : EnumFacing.HORIZONTALS) +// { +// List doorList = structure.getDoorOffsetsForFacing(settings, facing); +// for (BlockPos doorPos : doorList) +// { +// System.out.print("Door at " + doorPos + " facing " + facing + '\n'); +// } +// } + j++; + } + i++; + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java new file mode 100644 index 00000000..a6acf178 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java @@ -0,0 +1,55 @@ +package WayofTime.bloodmagic.structures; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import net.minecraft.util.EnumFacing; +import net.minecraft.util.Mirror; +import net.minecraft.util.Rotation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.gen.structure.template.PlacementSettings; + +public class DungeonUtil +{ + public static EnumFacing rotate(Mirror mirror, Rotation rotation, EnumFacing original) + { + return rotation.rotate(mirror.mirror(original)); + } + + public static EnumFacing reverseRotate(Mirror mirror, Rotation rotation, EnumFacing original) + { + return mirror.mirror(getOppositeRotation(rotation).rotate(original)); + } + + public static EnumFacing getFacingForSettings(PlacementSettings settings, EnumFacing original) + { + return rotate(settings.getMirror(), settings.getRotation(), original); + } + + public static Rotation getOppositeRotation(Rotation rotation) + { + switch (rotation) + { + case CLOCKWISE_90: + return Rotation.COUNTERCLOCKWISE_90; + case COUNTERCLOCKWISE_90: + return Rotation.CLOCKWISE_90; + default: + return rotation; + } + } + + public static void addRoom(Map> doorMap, EnumFacing facing, BlockPos offsetPos) + { + if (doorMap.containsKey(facing)) + { + doorMap.get(facing).add(offsetPos); + } else + { + List doorList = new ArrayList(); + doorList.add(offsetPos); + doorMap.put(facing, doorList); + } + } +} diff --git a/src/main/resources/assets/bloodmagic/structures/Corridor1.nbt b/src/main/resources/assets/bloodmagic/structures/Corridor1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..611688cfa69715032ff4ac3bafa0b82b29df0289 GIT binary patch literal 631 zcmV--0*L(|iwFP!000000Ik^HZ__Xk2k?u}Y15)HUJ&p73;3}Iv`54%6Vj0OIC-rp z7HM21W*`v%I|;;Xmo>gG3`XD2Bj0Q{`d|=eb znKE#uDZ_x#pveHE1QUk_uIH3dfMLLBz))Y4RI_9hU^HN;&n49(83h;(m^gCaOjAYy zh5@6&wK5=&WMU7cJd%lH0`xFt6kzy>;gKFnYh{AbfQdbn^4vFb;_4<8lz*__!WljK zu?X!Si}S_eXFvJs*yKxkvYWi{b@$~rwjuo?n_!rG7OsG zZ>X_6DHHe338MhRfQkJ{nG7%rFbtaE_x4zxl!@0^4)i%?7%;Ji(pr*Xz{Gt`fPJM* ztXaw<89r(Xnwa*E=W9B7Q+mI8XVz}{*51x&x;3Q@!FG=diaE{S*M4j3?omQP(_2$J zQ-v;*uWXw|Uzm-h(~Ya_vNj*X`JWF4arx4h?NYjQn|;vZeb86$%ia9b{d{S*uDSmG z=wc)#*LF3UaS&3}zTLm`6=kn?G0zT5H`U5j>+7by{U?IY9uoXq4vyet4~%QK+P2@; RO_!xR`Cnl_2B-fK003V^G`Ro( literal 0 HcmV?d00001