even more drone crate stuff
@ -821,8 +821,11 @@ public class ModBlocks {
|
|||||||
public static Block crane_splitter;
|
public static Block crane_splitter;
|
||||||
|
|
||||||
public static Block drone_waypoint;
|
public static Block drone_waypoint;
|
||||||
public static Block drone_waypoint_request;
|
|
||||||
public static Block drone_crate;
|
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;
|
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");
|
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 = 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_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");
|
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(conveyor_lift);
|
||||||
register(crane_splitter);
|
register(crane_splitter);
|
||||||
register(drone_waypoint);
|
register(drone_waypoint);
|
||||||
register(drone_waypoint_request);
|
|
||||||
register(drone_crate);
|
register(drone_crate);
|
||||||
|
register(drone_waypoint_request);
|
||||||
|
register(drone_dock);
|
||||||
|
register(drone_crate_provider);
|
||||||
|
register(drone_crate_requester);
|
||||||
register(fan);
|
register(fan);
|
||||||
register(piston_inserter);
|
register(piston_inserter);
|
||||||
|
|
||||||
|
|||||||
39
src/main/java/com/hbm/blocks/network/DroneDock.java
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,107 +1,21 @@
|
|||||||
package com.hbm.tileentity.network;
|
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 com.hbm.util.fauxpointtwelve.BlockPos;
|
||||||
|
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
|
||||||
import net.minecraft.util.MathHelper;
|
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;
|
import net.minecraftforge.common.util.ForgeDirection;
|
||||||
|
|
||||||
public class TileEntityDroneWaypointRequest extends TileEntity {
|
public class TileEntityDroneWaypointRequest extends TileEntityRequestNetwork {
|
||||||
|
|
||||||
public static HashMap<World, HashMap<ChunkCoordIntPair, Set<BlockPos>>> activeWaypoints = new HashMap();
|
|
||||||
public static HashMap<BlockPos, Long> lastActive = new HashMap();
|
|
||||||
public static long lastWipe = 0;
|
|
||||||
|
|
||||||
public Set<BlockPos> reachableNodes = new HashSet();
|
|
||||||
public Set<BlockPos> knownNodes = new HashSet();
|
|
||||||
public static final int maxRange = 24;
|
|
||||||
public static final int maxAge = 1_000;
|
|
||||||
|
|
||||||
public int height = 5;
|
public int height = 5;
|
||||||
|
|
||||||
@Override
|
@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<BlockPos> 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() {
|
public BlockPos getCoord() {
|
||||||
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata());
|
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata());
|
||||||
return new BlockPos(xCoord + dir.offsetX * height, yCoord + dir.offsetY * height, zCoord + dir.offsetZ * height);
|
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) {
|
public void addHeight(int h) {
|
||||||
height += h;
|
height += h;
|
||||||
height = MathHelper.clamp_int(height, 1, 15);
|
height = MathHelper.clamp_int(height, 1, 15);
|
||||||
@ -120,70 +34,4 @@ public class TileEntityDroneWaypointRequest extends TileEntity {
|
|||||||
|
|
||||||
nbt.setInteger("height", height);
|
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<ChunkCoordIntPair, Set<BlockPos>> 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<BlockPos> 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<BlockPos> getAllLocalNodes(World world, int x, int z) {
|
|
||||||
|
|
||||||
Set<BlockPos> nodes = new HashSet();
|
|
||||||
|
|
||||||
x >>= 4;
|
|
||||||
z >>= 4;
|
|
||||||
|
|
||||||
HashMap<ChunkCoordIntPair, Set<BlockPos>> coordMap = activeWaypoints.get(world);
|
|
||||||
|
|
||||||
if(coordMap == null) return nodes;
|
|
||||||
|
|
||||||
for(int i = -2; i <= 2; i++) {
|
|
||||||
for(int j = -2; j <= 2; j++) {
|
|
||||||
|
|
||||||
Set<BlockPos> 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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<World, HashMap<ChunkCoordIntPair, Set<BlockPos>>> activeWaypoints = new HashMap();
|
||||||
|
public static HashMap<BlockPos, Long> lastActive = new HashMap();
|
||||||
|
public static long lastWipe = 0;
|
||||||
|
|
||||||
|
public Set<BlockPos> reachableNodes = new HashSet();
|
||||||
|
public Set<BlockPos> 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<BlockPos> 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<ChunkCoordIntPair, Set<BlockPos>> 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<BlockPos> 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<BlockPos> getAllLocalNodes(World world, int x, int z) {
|
||||||
|
|
||||||
|
Set<BlockPos> nodes = new HashSet();
|
||||||
|
|
||||||
|
x >>= 4;
|
||||||
|
z >>= 4;
|
||||||
|
|
||||||
|
HashMap<ChunkCoordIntPair, Set<BlockPos>> coordMap = activeWaypoints.get(world);
|
||||||
|
|
||||||
|
if(coordMap == null) return nodes;
|
||||||
|
|
||||||
|
for(int i = -2; i <= 2; i++) {
|
||||||
|
for(int j = -2; j <= 2; j++) {
|
||||||
|
|
||||||
|
Set<BlockPos> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 764 B |
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"animation": {
|
||||||
|
"frametime": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 834 B |
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"animation": {
|
||||||
|
"frametime": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 732 B |
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"animation": {
|
||||||
|
"frametime": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 797 B |
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"animation": {
|
||||||
|
"frametime": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 896 B |
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"animation": {
|
||||||
|
"frametime": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 772 B |
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"animation": {
|
||||||
|
"frametime": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 528 B |
|
After Width: | Height: | Size: 675 B |
5
src/main/resources/assets/hbm/textures/blocks/drone_dock_side.png.mcmeta
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"animation": {
|
||||||
|
"frametime": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
src/main/resources/assets/hbm/textures/blocks/drone_dock_top.png
Normal file
|
After Width: | Height: | Size: 523 B |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |