Testing the infrastructure and adding more things such as AreaDescriptor transforms and checking for overlaps.

This commit is contained in:
WayofTime 2016-08-20 14:00:08 -04:00
parent 4cfe57a5f9
commit f734e93921
10 changed files with 429 additions and 5 deletions

View file

@ -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<BlockPos>
{
@ -57,10 +59,16 @@ public abstract class AreaDescriptor implements Iterator<BlockPos>
*/
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<BlockPos> blockPosCache;
@ -259,6 +267,37 @@ public abstract class AreaDescriptor implements Iterator<BlockPos>
{
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<BlockPos>
// 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<BlockPos>
// 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;
}
}
}

View file

@ -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<ItemStack> 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);

View file

@ -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
{

View file

@ -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;
}
}

View file

@ -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<DungeonStructure, BlockPos> structureMap = new HashMap<DungeonStructure, BlockPos>();
public List<AreaDescriptor> getAreaDescriptors(PlacementSettings settings, BlockPos position)
{
return new ArrayList<AreaDescriptor>();
}
}

View file

@ -0,0 +1,15 @@
package WayofTime.bloodmagic.structures;
import java.util.HashMap;
import java.util.Map;
public class DungeonRoomRegistry
{
public static Map<DungeonRoom, Integer> dungeonWeightMap = new HashMap<DungeonRoom, Integer>();
public static void registerDungeonRoom(DungeonRoom room, int weight)
{
dungeonWeightMap.put(room, weight);
}
}

View file

@ -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<EnumFacing, List<BlockPos>> doorMap = new HashMap<EnumFacing, List<BlockPos>>(); //Map of doors. The EnumFacing indicates what way this door faces.
List<AreaDescriptor> descriptorList = new ArrayList<AreaDescriptor>();
public DungeonStructure(ResourceLocation resource, Map<EnumFacing, List<BlockPos>> doorMap, List<AreaDescriptor> descriptorList)
{
this.resource = resource;
this.doorMap = doorMap;
this.descriptorList = descriptorList;
}
public List<AreaDescriptor> getAreaDescriptors(PlacementSettings settings, BlockPos offset)
{
List<AreaDescriptor> newList = new ArrayList<AreaDescriptor>();
for (AreaDescriptor desc : descriptorList)
{
newList.add(desc.rotateDescriptor(settings).offset(offset));
}
return newList;
}
public List<BlockPos> getDoorOffsetsForFacing(PlacementSettings settings, EnumFacing facing)
{
List<BlockPos> offsetList = new ArrayList<BlockPos>();
EnumFacing originalFacing = DungeonUtil.reverseRotate(settings.getMirror(), settings.getRotation(), facing);
if (doorMap.containsKey(originalFacing))
{
List<BlockPos> 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;
}
}

View file

@ -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<EnumFacing, List<BlockPos>> doorMap = new HashMap<EnumFacing, List<BlockPos>>();
List<AreaDescriptor> descriptorList = new ArrayList<AreaDescriptor>();
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<AreaDescriptor> descriptors = structure.getAreaDescriptors(settings, offsetPos);
// for (AreaDescriptor desc : descriptors)
// {
// List<BlockPos> 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<BlockPos> doorList = structure.getDoorOffsetsForFacing(settings, facing);
// for (BlockPos doorPos : doorList)
// {
// System.out.print("Door at " + doorPos + " facing " + facing + '\n');
// }
// }
j++;
}
i++;
}
}
}

View file

@ -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<EnumFacing, List<BlockPos>> doorMap, EnumFacing facing, BlockPos offsetPos)
{
if (doorMap.containsKey(facing))
{
doorMap.get(facing).add(offsetPos);
} else
{
List<BlockPos> doorList = new ArrayList<BlockPos>();
doorList.add(offsetPos);
doorMap.put(facing, doorList);
}
}
}