Testing the infrastructure and adding more things such as AreaDescriptor transforms and checking for overlaps.
This commit is contained in:
parent
4cfe57a5f9
commit
f734e93921
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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>();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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++;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
BIN
src/main/resources/assets/bloodmagic/structures/Corridor1.nbt
Normal file
BIN
src/main/resources/assets/bloodmagic/structures/Corridor1.nbt
Normal file
Binary file not shown.
Loading…
Reference in a new issue