diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index c297d4391..fc09defc2 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -821,8 +821,11 @@ public class ModBlocks { public static Block crane_splitter; public static Block drone_waypoint; - public static Block drone_waypoint_request; public static Block drone_crate; + public static Block drone_waypoint_request; + public static Block drone_dock; + public static Block drone_crate_provider; + public static Block drone_crate_requester; public static Block fan; @@ -1995,8 +1998,11 @@ public class ModBlocks { piston_inserter = new PistonInserter().setBlockName("piston_inserter").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); drone_waypoint = new DroneWaypoint().setBlockName("drone_waypoint").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_waypoint"); - drone_waypoint_request = new DroneWaypointRequest().setBlockName("drone_waypoint_request").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_waypoint_request"); drone_crate = new DroneCrate().setBlockName("drone_crate").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + drone_waypoint_request = new DroneWaypointRequest().setBlockName("drone_waypoint_request").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_waypoint_request"); + drone_dock = new DroneDock().setBlockName("drone_dock").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_dock"); + drone_crate_provider = new DroneDock().setBlockName("drone_crate_provider").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_crate_provider"); + drone_crate_requester = new DroneDock().setBlockName("drone_crate_requester").setHardness(0.1F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":drone_crate_requester"); chain = new BlockChain(Material.iron).setBlockName("dungeon_chain").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":chain"); @@ -3258,8 +3264,11 @@ public class ModBlocks { register(conveyor_lift); register(crane_splitter); register(drone_waypoint); - register(drone_waypoint_request); register(drone_crate); + register(drone_waypoint_request); + register(drone_dock); + register(drone_crate_provider); + register(drone_crate_requester); register(fan); register(piston_inserter); diff --git a/src/main/java/com/hbm/blocks/network/DroneDock.java b/src/main/java/com/hbm/blocks/network/DroneDock.java new file mode 100644 index 000000000..bee33693f --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/DroneDock.java @@ -0,0 +1,39 @@ +package com.hbm.blocks.network; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class DroneDock extends BlockContainer { + + @SideOnly(Side.CLIENT) private IIcon iconTop; + @SideOnly(Side.CLIENT) private IIcon iconBottom; + + public DroneDock() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return null; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon(this.textureName + "_side"); + this.iconTop = reg.registerIcon(this.textureName + "_top"); + this.iconBottom = reg.registerIcon(this.textureName + "_bottom"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + return side == 1 ? this.iconTop : (side == 0 ? this.iconBottom : this.blockIcon); + } +} diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypointRequest.java b/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypointRequest.java index b7bb9e52d..a4135d3b9 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypointRequest.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityDroneWaypointRequest.java @@ -1,107 +1,21 @@ package com.hbm.tileentity.network; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; - -import com.hbm.util.ParticleUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityDroneWaypointRequest extends TileEntity { - - public static HashMap>> activeWaypoints = new HashMap(); - public static HashMap lastActive = new HashMap(); - public static long lastWipe = 0; - - public Set reachableNodes = new HashSet(); - public Set knownNodes = new HashSet(); - public static final int maxRange = 24; - public static final int maxAge = 1_000; +public class TileEntityDroneWaypointRequest extends TileEntityRequestNetwork { public int height = 5; @Override - public void updateEntity() { - - if(!worldObj.isRemote) { - - if(worldObj.getTotalWorldTime() % 20 == 0) { - BlockPos pos = getCoord(); - push(worldObj, pos); - - for(BlockPos known : knownNodes) { - ParticleUtil.spawnDebugLine(worldObj, - pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, - (known.getX() - pos.getX()) / 2D, (known.getY() - pos.getY()) / 2D, (known.getZ() - pos.getZ()) / 2D, - reachableNodes.contains(known) ? 0x00ff00 : 0xff0000); - } - - //rescan known nodes - if(worldObj.getTotalWorldTime() % 40 == 0 && knownNodes.size() > 0) { - - BlockPos node = (BlockPos) new ArrayList(knownNodes).get(knownNodes.size() > 1 ? worldObj.rand.nextInt(knownNodes.size() - 1) : 0); - - if(node != null) { - - Long timestamp = lastActive.get(node); - - if(timestamp == null || timestamp < System.currentTimeMillis() - maxAge) { - knownNodes.remove(node); - reachableNodes.remove(node); - lastActive.remove(node); - } else if(!hasPath(worldObj, pos, node)) { - reachableNodes.remove(node); - } else { - reachableNodes.add(node); - } - } - - //discover new nodes - } else { - - Set nodes = getAllLocalNodes(worldObj, pos.getX(), pos.getZ()); - - for(BlockPos node : nodes) { - - if(!knownNodes.contains(node) && !node.equals(pos)) { - knownNodes.add(node); - if(hasPath(worldObj, pos, node)) reachableNodes.add(node); - break; - } - } - } - } - } - } - public BlockPos getCoord() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()); return new BlockPos(xCoord + dir.offsetX * height, yCoord + dir.offsetY * height, zCoord + dir.offsetZ * height); } - public static boolean hasPath(World world, BlockPos pos1, BlockPos pos2) { - Vec3 vec1 = Vec3.createVectorHelper(pos1.getX() + 0.5, pos1.getY() + 0.5, pos1.getZ() + 0.5); - Vec3 vec2 = Vec3.createVectorHelper(pos2.getX() + 0.5, pos2.getY() + 0.5, pos2.getZ() + 0.5); - Vec3 vec3 = vec1.subtract(vec2); - if(vec3.lengthVector() > maxRange) return false; - //for some fucking reason beyond any human comprehension, this function will randomly yield incorrect results but only from one side - //therefore we just run the stupid fucking thing twice and then compare the results - //thanks for this marvelous piece of programming, mojang - MovingObjectPosition mop0 = world.func_147447_a(vec1, vec2, false, true, false); - MovingObjectPosition mop2 = world.func_147447_a(vec2, vec1, false, true, false); - return (mop0 == null || mop0.typeOfHit == mop0.typeOfHit.MISS) && (mop2 == null || mop2.typeOfHit == mop2.typeOfHit.MISS); - } - public void addHeight(int h) { height += h; height = MathHelper.clamp_int(height, 1, 15); @@ -120,70 +34,4 @@ public class TileEntityDroneWaypointRequest extends TileEntity { nbt.setInteger("height", height); } - - /** - * Adds the position to that chunk's node list. - * @param world - * @param x - * @param y - * @param z - */ - public static void push(World world, BlockPos pos) { - - HashMap> coordMap = activeWaypoints.get(world); - - if(coordMap == null) { - coordMap = new HashMap(); - activeWaypoints.put(world, coordMap); - } - - ChunkCoordIntPair chunkPos = new ChunkCoordIntPair(pos.getX() >> 4, pos.getZ() >> 4); - Set posList = coordMap.get(chunkPos); - - if(posList == null) { - posList = new HashSet(); - coordMap.put(chunkPos, posList); - } - - posList.add(pos); - - lastActive.put(pos, System.currentTimeMillis()); - } - - /** - * Gets all active nodes in a 5x5 chunk area, centered around the given position. - * Used for finding neighbors to check connections to. - * @param world - * @param x - * @param z - * @return - */ - public static Set getAllLocalNodes(World world, int x, int z) { - - Set nodes = new HashSet(); - - x >>= 4; - z >>= 4; - - HashMap> coordMap = activeWaypoints.get(world); - - if(coordMap == null) return nodes; - - for(int i = -2; i <= 2; i++) { - for(int j = -2; j <= 2; j++) { - - Set posList = coordMap.get(new ChunkCoordIntPair(x + i, z + j)); - - if(posList != null) for(BlockPos node : posList) { - Long timestamp = lastActive.get(node); - - if(timestamp != null && timestamp >= System.currentTimeMillis() - maxAge) { - nodes.add(node); - } - } - } - } - - return nodes; - } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetwork.java b/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetwork.java new file mode 100644 index 000000000..0ae16c2df --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRequestNetwork.java @@ -0,0 +1,172 @@ +package com.hbm.tileentity.network; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +import com.hbm.util.ParticleUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; + +public class TileEntityRequestNetwork extends TileEntity { + + public static HashMap>> activeWaypoints = new HashMap(); + public static HashMap lastActive = new HashMap(); + public static long lastWipe = 0; + + public Set reachableNodes = new HashSet(); + public Set knownNodes = new HashSet(); + public static final int maxRange = 24; + public static final int maxAge = 2_000; + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(worldObj.getTotalWorldTime() % 20 == 0) { + BlockPos pos = getCoord(); + push(worldObj, pos); + + for(BlockPos known : knownNodes) { + ParticleUtil.spawnDebugLine(worldObj, + pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, + (known.getX() - pos.getX()) / 2D, (known.getY() - pos.getY()) / 2D, (known.getZ() - pos.getZ()) / 2D, + reachableNodes.contains(known) ? 0x00ff00 : 0xff0000); + } + + //rescan known nodes + if(worldObj.getTotalWorldTime() % 40 == 0 && knownNodes.size() > 0) { + + BlockPos node = (BlockPos) new ArrayList(knownNodes).get(knownNodes.size() > 1 ? worldObj.rand.nextInt(knownNodes.size() - 1) : 0); + + if(node != null) { + + Long timestamp = lastActive.get(node); + + if(timestamp == null || timestamp < System.currentTimeMillis() - maxAge) { + knownNodes.remove(node); + reachableNodes.remove(node); + lastActive.remove(node); + } else if(!hasPath(worldObj, pos, node)) { + reachableNodes.remove(node); + } else { + reachableNodes.add(node); + } + } + + //discover new nodes + } else { + + Set nodes = getAllLocalNodes(worldObj, pos.getX(), pos.getZ()); + + for(BlockPos node : nodes) { + + if(!knownNodes.contains(node) && !node.equals(pos)) { + knownNodes.add(node); + if(hasPath(worldObj, pos, node)) reachableNodes.add(node); + break; + } + } + } + } + } + } + + public BlockPos getCoord() { + return new BlockPos(xCoord, yCoord + 1, zCoord); + } + + /** + * Performs a bidirectional scan to see if the nodes have line of sight + * @param world + * @param pos1 + * @param pos2 + * @return + */ + public static boolean hasPath(World world, BlockPos pos1, BlockPos pos2) { + Vec3 vec1 = Vec3.createVectorHelper(pos1.getX() + 0.5, pos1.getY() + 0.5, pos1.getZ() + 0.5); + Vec3 vec2 = Vec3.createVectorHelper(pos2.getX() + 0.5, pos2.getY() + 0.5, pos2.getZ() + 0.5); + Vec3 vec3 = vec1.subtract(vec2); + if(vec3.lengthVector() > maxRange) return false; + //for some fucking reason beyond any human comprehension, this function will randomly yield incorrect results but only from one side + //therefore we just run the stupid fucking thing twice and then compare the results + //thanks for this marvelous piece of programming, mojang + MovingObjectPosition mop0 = world.func_147447_a(vec1, vec2, false, true, false); + MovingObjectPosition mop2 = world.func_147447_a(vec2, vec1, false, true, false); + return (mop0 == null || mop0.typeOfHit == mop0.typeOfHit.MISS) && (mop2 == null || mop2.typeOfHit == mop2.typeOfHit.MISS); + } + + /** + * Adds the position to that chunk's node list. + * @param world + * @param x + * @param y + * @param z + */ + public static void push(World world, BlockPos pos) { + + HashMap> coordMap = activeWaypoints.get(world); + + if(coordMap == null) { + coordMap = new HashMap(); + activeWaypoints.put(world, coordMap); + } + + ChunkCoordIntPair chunkPos = new ChunkCoordIntPair(pos.getX() >> 4, pos.getZ() >> 4); + Set posList = coordMap.get(chunkPos); + + if(posList == null) { + posList = new HashSet(); + coordMap.put(chunkPos, posList); + } + + posList.add(pos); + + lastActive.put(pos, System.currentTimeMillis()); + } + + /** + * Gets all active nodes in a 5x5 chunk area, centered around the given position. + * Used for finding neighbors to check connections to. + * @param world + * @param x + * @param z + * @return + */ + public static Set getAllLocalNodes(World world, int x, int z) { + + Set nodes = new HashSet(); + + x >>= 4; + z >>= 4; + + HashMap> coordMap = activeWaypoints.get(world); + + if(coordMap == null) return nodes; + + for(int i = -2; i <= 2; i++) { + for(int j = -2; j <= 2; j++) { + + Set posList = coordMap.get(new ChunkCoordIntPair(x + i, z + j)); + + if(posList != null) for(BlockPos node : posList) { + Long timestamp = lastActive.get(node); + + if(timestamp != null && timestamp >= System.currentTimeMillis() - maxAge) { + nodes.add(node); + } + } + } + } + + return nodes; + } + +} diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_bottom.png b/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_bottom.png new file mode 100644 index 000000000..c7d04c9a3 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_bottom.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_bottom.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_bottom.png.mcmeta new file mode 100755 index 000000000..92dd223c8 --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_bottom.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 10 + } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_side.png b/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_side.png new file mode 100644 index 000000000..add80fb8d Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_side.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_side.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_side.png.mcmeta new file mode 100755 index 000000000..92dd223c8 --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_side.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 10 + } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_top.png b/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_top.png new file mode 100644 index 000000000..824bd9421 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_top.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_top.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_top.png.mcmeta new file mode 100755 index 000000000..92dd223c8 --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_top.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 10 + } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_bottom.png b/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_bottom.png new file mode 100644 index 000000000..2b75efcb7 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_bottom.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_bottom.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_bottom.png.mcmeta new file mode 100755 index 000000000..92dd223c8 --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_bottom.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 10 + } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_side.png b/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_side.png new file mode 100644 index 000000000..70d40f070 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_side.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_side.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_side.png.mcmeta new file mode 100755 index 000000000..92dd223c8 --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_side.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 10 + } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_top.png b/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_top.png new file mode 100644 index 000000000..e8d4476ce Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_top.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_top.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_top.png.mcmeta new file mode 100755 index 000000000..92dd223c8 --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_top.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 10 + } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_dock_bottom.png b/src/main/resources/assets/hbm/textures/blocks/drone_dock_bottom.png new file mode 100644 index 000000000..67ebd79ec Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/drone_dock_bottom.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_dock_side.png b/src/main/resources/assets/hbm/textures/blocks/drone_dock_side.png new file mode 100644 index 000000000..fd71122a6 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/drone_dock_side.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_dock_side.png.mcmeta b/src/main/resources/assets/hbm/textures/blocks/drone_dock_side.png.mcmeta new file mode 100755 index 000000000..92dd223c8 --- /dev/null +++ b/src/main/resources/assets/hbm/textures/blocks/drone_dock_side.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 10 + } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/drone_dock_top.png b/src/main/resources/assets/hbm/textures/blocks/drone_dock_top.png new file mode 100644 index 000000000..2186e84bb Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/drone_dock_top.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_drone_provider.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_drone_provider.png index 5c3ef3032..a0b473215 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/storage/gui_drone_provider.png and b/src/main/resources/assets/hbm/textures/gui/storage/gui_drone_provider.png differ diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_drone_requester.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_drone_requester.png index 393299457..2b20d19e6 100644 Binary files a/src/main/resources/assets/hbm/textures/gui/storage/gui_drone_requester.png and b/src/main/resources/assets/hbm/textures/gui/storage/gui_drone_requester.png differ