From 250ee7c3836e0d3f71b7fd29b2ba3ac1bc1bf044 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 25 Sep 2023 16:42:02 +0200 Subject: [PATCH] even more drone crate stuff --- src/main/java/com/hbm/blocks/ModBlocks.java | 15 +- .../com/hbm/blocks/network/DroneDock.java | 39 ++++ .../TileEntityDroneWaypointRequest.java | 154 +--------------- .../network/TileEntityRequestNetwork.java | 172 ++++++++++++++++++ .../blocks/drone_crate_provider_bottom.png | Bin 0 -> 764 bytes .../drone_crate_provider_bottom.png.mcmeta | 5 + .../blocks/drone_crate_provider_side.png | Bin 0 -> 834 bytes .../drone_crate_provider_side.png.mcmeta | 5 + .../blocks/drone_crate_provider_top.png | Bin 0 -> 732 bytes .../drone_crate_provider_top.png.mcmeta | 5 + .../blocks/drone_crate_requester_bottom.png | Bin 0 -> 797 bytes .../drone_crate_requester_bottom.png.mcmeta | 5 + .../blocks/drone_crate_requester_side.png | Bin 0 -> 896 bytes .../drone_crate_requester_side.png.mcmeta | 5 + .../blocks/drone_crate_requester_top.png | Bin 0 -> 772 bytes .../drone_crate_requester_top.png.mcmeta | 5 + .../hbm/textures/blocks/drone_dock_bottom.png | Bin 0 -> 528 bytes .../hbm/textures/blocks/drone_dock_side.png | Bin 0 -> 675 bytes .../blocks/drone_dock_side.png.mcmeta | 5 + .../hbm/textures/blocks/drone_dock_top.png | Bin 0 -> 523 bytes .../gui/storage/gui_drone_provider.png | Bin 1239 -> 1279 bytes .../gui/storage/gui_drone_requester.png | Bin 1389 -> 1440 bytes 22 files changed, 259 insertions(+), 156 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/network/DroneDock.java create mode 100644 src/main/java/com/hbm/tileentity/network/TileEntityRequestNetwork.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_bottom.png create mode 100755 src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_bottom.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_side.png create mode 100755 src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_side.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_top.png create mode 100755 src/main/resources/assets/hbm/textures/blocks/drone_crate_provider_top.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_bottom.png create mode 100755 src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_bottom.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_side.png create mode 100755 src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_side.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_top.png create mode 100755 src/main/resources/assets/hbm/textures/blocks/drone_crate_requester_top.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/blocks/drone_dock_bottom.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/drone_dock_side.png create mode 100755 src/main/resources/assets/hbm/textures/blocks/drone_dock_side.png.mcmeta create mode 100644 src/main/resources/assets/hbm/textures/blocks/drone_dock_top.png 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 0000000000000000000000000000000000000000..c7d04c9a352e326ac1694bc6378cfe89772fce57 GIT binary patch literal 764 zcmVVx+qUf9wtVsS&sb{_LQqu|&N;N!eDv*W z?C)*Uwk`hAJ^H>!gb)ZJ(6%i{M@Im7@2Tq=DJ3BUs;XkKSO8?5)|#RyP*O^ylDh%us+Vm8xQYjcuwj;3k&{LLRJ z%M#}tRdoR&1R|LugkWQ1gBT+KLI`HFSvGLFToOWHwOV0}VVb73E)`Hp5o1IMfwh(x zBjY&cBGWV>grKf#hG9T!z0ULApD`{yqm+^uBeU6z7$e?$gb)nFfKrO0DAptQeVrxd*$)vvpjhB*B77gK+n$Q!L{FBe!_zb)&D&B+j+3}!Y|pd_l{mVmj_>8e3&(# u{_)oO;>3en+xxt)ZvxNeLDKz)crs z2!V6~mnj1wZ9+&$x6O77+le$;T&?XOKNw4XNJzGXN47?<(Va;lG!Tfz7AZo=>F@dO zcka1A3JUe`};JT zP2%x50KV^|wGIvE(pn>>B$vxktJN?~6H_V0_VzZu@6&3v`0?Tk7U|b#2iUevqtTcd zXsxMKDwNA*lu~^80p{BjYfl3tHs*d z8sqU8fFK9}{%YX+K0*kNkB`~d*uXSRJkR6u@{(LGhY%ussc1Bc)*5pHn7+0g$AzcG8hcV=kuJNp3-Wy=yW=y(`oMS?~ziH zNF)FdLd;ee34u`X$j^l(4J3Kt3-EOnKzD_I_!}oon(I`qO zYPA}ho0}w)NuI5Kix2|CFfgT*?Ck7tetwSQIDGfVb9nbikKe%0pY@2x;~X6w%`)&j zkGs1&9LFJ-%kh1oLM#>wD?A#Fm`_xngG!~N#c zT8G`3w{@=hk2TBXGXE|f{PvOaNP;u%^`9>0!H1P6i+Nz5{XGx%qA%Z@2fu&f{?7yc zn>^U-KYec=eDG@NaUQ%bUjy|=iu{(ZH$Ps?gU_!Di+NxK|11yw1lp^4c!Fv#umAu6 M07*qoM6N<$f*RwE@Bjb+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..824bd9421e2335b5bba09ee7263f581e58552cdf GIT binary patch literal 732 zcmV<20wev2P)ko_Xh; zXP)^vPi|eQwAM7`x-L~!F&d4~T9YIRp63zAF~%68C}M1Ej3|m24u>eMHA_oN7-Nu9 z0#KGE#u(eMsYbK5wnn?%Mk$4IT^C~vr)K8}!;s#5mpey~lcp&`2t3b2YmM*wTzmP9 zh1-jSVMy`jA#ofdj4>Ev2*Z%UU;sc-6a+zlloDeMp64+djR369_kA44K}ji*Qqr66 z+EG_mR}n%WrKBuNgb?I;4q$b2(=$jZ>mx`hxjA*1vMkxy*kCaD%udytI>5xl1X^o6 zZyX^6sxe0hf$#gQudf5}_}kBm&vj~Zvn(SB0;;M4Kr{`MQg+cn?ZAEhyEYZ6D=RBZPEOi| z?RFc-ad2IiG)*ar!akm=s%*Ub{XS|q9Fk=j%gf8#Of$yVY;3*W=EbV%>1qBh9`w6C zPF_5=BM+Y5d(P#>g+IiDez#{w{S^-y-JYwbe&)fE3x_s&5PsU8V_@p^{!Jc?d;fXx z+j;Qf!D}l#IJ0+09=v-ru$uGN&(uvD9yAH-cYC|?-~(T*PKf@$!h;`iBUa@YvLTKD O0000!;H4U9G#kY#saKobMS$Yi*|WH&LGpgZV$tGhnhpy^^}8H{$pzylTa zdrqD6*6AmEaR2(~oMVnW&l$&&&1Qphj;`w{%aXQj2_eul4LdtKG)=>Ly+%3bI6gim zgn*P1fEXhogj8^jS#x%FhA{@E6e`biLI_-a>lUlkishl@yU%{XT8j{ZvMh1Vp|$42 zFJ9;9_8zO%3h(aHwk;xrKnQ`=YQ@RP2>{-Es;WXtNeF?mEZJ-}07<8{Cd)FEloBZ= z%R>u13xKtjVHi+K5kkOwkF^#c>2AI9H&V)J1Sut7e)KajMwC(%g~nQ&lALqYbrhIOW!W@x+qS9Y zuIrL{F-BsHIOkAGQP(xjIgBw3!+;QC%A21@2$4=**Xb4^1j8_}-EPVA9BVDcnB<$9 zXS{Lq?PS>3pWMTHpE{XG{P?Rkljg^RKLJop(*UFmTOL}fs$v)h`o2eNjdL!o`K%K{ zOdZZ29^J&*ykQv9GM(2crKS#?b1W7M7Ulta&v{;Yag8xgk!2aXySrFx@!n&M;iqr^ zVjM@Fc{(6vITcv1*YthQ>FFttMhGG8#@y)~^B=4B_xJg4@!*bK^1;q)m-68IvtK#b zJ9O~&BtDZl{gW^&iTz4;@<3ag94<0)YZg2ibhP~Ila48Rd zXn&go9ei3|n=YPtaIkm8`}!LIs;a^mLyQrvHF=(+wZ5Qxf;=eRz!-BW4?b7#Fpj@J bULO1d^a-o}ttbwv00000NkvXXu0mjfC`@Nz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..70d40f0709beea9bd522bb11bc50b97452930fce GIT binary patch literal 896 zcmV-`1AqL9P)1vn+4cIO5J!&e!ig9_{(F_kGuOS;#O9eBWm@8sWMw!{HFqG_h?Pr4*KB5s$~wG>xO9BXrkwIXpb1 z-EI?&Mgj0V52aLKxR6o`DJ7XqhI+k@uIuQAVNfg<@jQ=Cr^C0ue8e*S_~j9`T8&n# zH8)U7ad2=zxm?CD3_gD6JJRVirfD*rPSG?C!!Q_+$82nDaDHB+R;#hMw@0m3Lr5u+ zQu6i(yOc^LQmGWJR*T2SN0d@HjuRYiG#YffU4D4>2`eirNGazlNGSoRR;v_?MRZ-K z)oQV}wgx~lnWWq8((m^v6bb;Cril;&eGv{oG#cgf^pu^Q9j4PMyvTG7Zf@c@ z4gkLI1N_;*^E`wQoSdAnwY7z=>$tAV)zuZ5Oa>uD@KWJ$7^M{YY&HuLHcc}y3WY-W zzK>xT#9}d&QV1a!4u=3}nl>M3+jd|u91a9q9G>TKb8|x~l?qBFgg}Hsp}-)Y&r`40 zxxBn&b#*nkX0=+SP$-a0CTTPp0F1}u`B2NUf`(Np6}sIn*=&|bB!cI8gu`JB!=PTT zv%S4dJRaxWH@`p#fu?EbQc8Arce%K@z_Kj9`sux;RsQ~Sn`ku3@$vCI1J`xAzrV+_ zEHar4Uw?K$BoYZKJef?G&1OU*5p-S0_caoU1VRX!%_jQw^)-XR04Zg#-$F{Mpc{*} zF0}ZudbwQY<>JAwo7U10_w!Gd^WY8pl^5{f{GWNSfAaIc=D}}U!+;0kuRO@*a-`E~ zZf|dyOeVOlOCphY*?2Jdp9k;<5A+2O_VZ7uR4NPx1G3pH)9Dn)aR`UQxUL)Uz_x8( zYYY+DIS;g_-@NWSj)QI6^!t6DuQiue`O{b5qS!^1<`?KVm&gzx(pV^~|?=5psQTTkDxyu3`e+huWak)@?2 z78Vv*Sy|zSX9rxr@jaJ2cbS=)!CH$j#$b#gj$=ln5dc+H5k(PFN{lfCLBM1(0dTr7 z4Dmb2fXwR&)HfDi&HC3RgRgrF=-0H@o&x{j0*<@-KTO77peLS5G!A0IOs z{l$4PxV^&s{5)D~f?y6I1gbGd2tgQz93342@bfPx4{vTv%`J+8D2lMw0w9_MN-5Xw zMd5iKQ52D78DSVs3s+U;j0=Lmjq<#(){ObH-n4>B zk_3Q<-#j9YV+IfUbUGc%vZN>q!Z1W@?YwDpLWt?FG#^fHVyo4nu4~GkhWtZ9LDz_kHp_r>ZJKTVs@2t1-YXB(KY0+xF~k0Vo8Mj|&vS$j1VMn-nlKD`^7V7ReDshwj;ZvIq-pvN zc`)n`T&w@agGM*Ay>^lZpWgrEEf3;XXZINRc<|v{9?S**^WdHH;J4l%PWVypgL8TC z=e?2Be6e$DnzZ3Tvth&j;6fg}(DVoX`6+;%kp0000 CTV&n< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..67ebd79eccb2298270afc77f08be6e483e0d1450 GIT binary patch literal 528 zcmV+r0`L8aP)1s=ALY$E&LOiR6h{3LG7RPUn&da+~)VJ>wi z%h%VJhY$d8cjj7EF*8I25n(=K40`W`5C|b)BEskACn7>?Z2`7zLsbzGQc9Q^?#_MR zlu`hAKA+gOZKRa=`1l~_ObCHm>jE9e!M^XLl*l>r^YcS%jpy@8YwgXz%otLke?SO}v6vUN)^PW?WD!AC*G7zy-a9EJVvOAPjffCJ zpp>#am8rIa(~jdH#>nsQFFEIT{$`jN!QE-C{i$#WVb$2oh%s_q7q!+^ zX?MrnF?U}e5#c;f?)wH<^k1 S7CSru0000;@S0}=riP= zTmlIT10#YE*n?)KXQsO=hh>^gvKT#hNeTv2i<|axhy!Q!E6a~f@lv3n*j12bt^=T|Dr`{{kAM)|$TW6KFghGa8M^^Bm_KkB^Ud@2RQ^@BNa2wU!totLG2`_xJZ0W7yf*q3b%7 zQt6%do)7}I?|b^bPt=D;cXxN(e7y$XARe-{wM9`BOePaVggnoOIV^`^jA1gFq{;&r zVD{;pvMdQ9qyoS)fl`Vr%gFPb5CTh;Vy* zyB564WImr0V@w;;!+Hift_9~D zbzLtL3hzM3hFvg&@Mk&R~`&0V9 z2S}}j5NO*L=NxSth%u(3cIe$&%l7s*8ygz{IOhNeA@K0@1)zkJphLs^!oCu0mD1VUI+?Yb`gr9-R3y@+5J ziv>^l!JyJr9f%0y@%X>+1FmlX_;z^kaz7Zr0L}UAWquGYul|s(n_WE557vQKnY_Lq zyg5EfqFU<*Qa|kn-#?tCYCqO6ko~<^_Jir^$4&R!@~o& zx3{E}jtqJjs>-q~xI1reZ~QhdFE5A)W(IHsDI!eML`n%W!`*)c1MK_GzVEcwaCb!H zAW+o->^1&HP;14^Mnj?3(`9wfzm2M5W~}SVx~`N`2-7qTU;hJl0(U3p%=LOb2zr3i zG_fqpsO&Eb+qND3$9Nofr?ob`iwLi;um5DCs?=I3r3^B6$K4MCRV9Rgi176EM6Gp@ z_1!O}kaMP#f|-p^WA`3oy>p~nWhOd)Yi+2=IkT=S+qMy79NXDXR8`LB^YEmqV`0o}gx2>ZgfQOSogWRl90I$X3Qhn3 N002ovPDHLkV1m9+@V@{6 literal 0 HcmV?d00001 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 5c3ef3032ce732a1b922a4643ad8fcd5ffde87af..a0b473215e5bb9d60a1e54f6915bf0e13ea87ec0 100644 GIT binary patch delta 869 zcmV-r1DgET3I7R@G=H{9L_t(|obBB)P8(|!hT$_&_K+sqpa2(l1?eoYiwGnaSpuCS zc7g1U72L)y*hZSHVp3SXx*?H?@l58&-}5wdhhN}%H6EEmSLd&v`T!H^rak~|JNFkz z|L@n&Q=efn|J>YHo&WEc6TF-H03(XN_^Yb!t}m*x?|^v0`zNUn@V9KY+o_N6*DW8O z>O)n1-$lTk0KYirJAnTrUi|PUA_4&Xo|7;E7*SZvM}e!VE-x>qKEmjH>XBna1)%Eu zFOV+}Py0Utf)~XFplWxKoa)oZs>g4qpJm87vzZH@<3t9aYInh$VzKyKk2m*C%{lkG z8;0j0AOsVWT>~pDBKHA&`ndc1`E#2C$BGQV^J$eG{;6DjujbzDjR{I z$}<3nlV1ZYA4Tp1Xl;{^jX+E#G61b@^05(!sYC{#%0?il@(ci?lYs#xk&wH_)W?8kLh9X!JlOLP@Jub;>F@`- zsShx+{_grB{$lvP`*QBTYhEGYMbUql`UDel@pDMZ3!|U<025029RmOW0000007U!$ zheVP;EW_L4!%YL({~-Imcm4A*HgsKAB?5zZS1x|un9XKW<&Jd_T|Enc%`~)bxm;FN z)oQh>awl+-pY{Q`_#umhAd_JOBsT~DJMiu8?aAL@KA+cmy*9_3SI?QvW+%_#_g?(> z;Pd(Xq;IfTENZ=8n`6$a=lCnt@puaW!I8lklWzkOJ+OoO0Os>~Ef$NDzlk~K(59}c z`o8b0>eqh{ZX=L6EzEho5oozwR#nw%wW`{^hIu6$fy`-sj*UR$@eGsD0U?v10S1xK z2OKs6nbZ6n#$zLpInB?p5okO%0-4kN927GN<`DjOXA+AZU?| zK*RAC0D=hs1QP%VcJLvft-$8AFz5MJV1{EWusO}o@o;)P-U5>`0U?ub0}MsXR$z0Q zpTl@;1?J7M6?iz_0zfbUfM5c^o3g+CXBh9Rs_VM0-)uI1xDaN42hd$zT}^rrIEDv+ v!+8D!>?b(|9M8oMlYs<3laK@l7vuN=u%9ic%XHUS00000NkvXXu0mjfcsQ%2 delta 827 zcmV-B1H}CQ3D*gbG=GjsL_t(|obBD=ZQEE7h0%FInzGae8xg=hRESsyRTlS$;b7y< zI*~<&&%EapFnO@eFBBn-S{>iA_W^d)_C5f8JNh5UvMjmRe`~Gk_`hSG@NMq{Y$*ET zud15oxhne(h~GH!{|-L|;C{dFc$9ryuh*)oy4`M7$NpXONe)N81Nb5F;)g#G5dh%V zlg|PcO9BAFzVCg2zv<=WW$zq%E|(vl0f66$3qaNDMe?j+7;2iP zuI8N2=cnh8B{Be2uNTZS#&N7^n!1{E^t&6@lRg16CJe(+<2W8}4m>I{0Mj%*y@ls( zlTS}`Yy{#_kpZZ(5eTY01Au6g-~$|!&jJr1SmZu{-ZuHz2*h3@1JK(h9~*(#OJo45 zYy^TT&j28rlc516lb-_ye-^n9ptnsvHUhDi$N-$r=T(+x^fm_`6%~N{{a%;LW$$A^ zH=+ViRdu~y_dWu2!$ZJ>5<33Gk?#OnYi*h5*~I|=;8#?8EN{T;r>> zhheB`n#?ih({s+}^V4(qwcma@=r9aV{R87T)-+A#nDgm5KBc-HF9DO010j>(0}MR& z;XZ(27-}5Hr~eUi%%M-Ms+MJ0s_MUA4{jrnIX%pIzY*wqy;fD#?RKkr{Tt?!Yy>i= z`#ClOZO1c{(E}?W1OS5B2xLz8bJ&iJK<0Em$3~#-*a&1!_j7Cn+Ky)clfeQcli&jh zHM0@OobKnaoewtxL62+%T920i5KI6dm;gYq4<7>B3T#dfbKY+SW<9n7o74Rq52v@| zB>S3#y^X7O1=P5uoeIS002ovPDHLk FV1n&Mg~so`}a z%w#)E)_nkcYv>oG`{(a_1CL}|{Pz2kDiLVPxdCT6`B~}lqbw^`t`M7YeyqXE<#Mdi zY^cTJbzQnx_2FZ6-KA(F0 z<<~z3Jd!rOeEzI1UwFFi!{7%-4M5fQe=PXH!`H`OaygZ!fBiY&(X{8?+c$Oh#=4J! z9~nIWRYxaDUw3X-?H}|%mLca%r>8&hzxM9!o8B|7?_8}H%U4a!dH?Bi?>UU?Oaf4K zbi(v8pWh&>{eve>%^C9Q=K9XnUVlHmd8=M5Uo|yn+pli6ft!Gnp#v0?t^^rLJCl6? zcWxhje}3EM4CVUH)tcVCwRLl7-3=-hcW$*z%0l=FqlL z1F&2!>%qgPGO7}p}TZ(gsE%=Cx2VUdRQU4k>;}bocsU)00000 z001NS`a>B$yu+sOVWNQ?KapM6Ise%VlgXq?1O{=gocwH=e;#}`oAr8t`Fvh`dwb@XbLu(1r8*vO0h3Sy8Bs_VM0s{Z@);5Gu8)54sS8-W&!MO9Vp?(S9{{SR|WHUgQ`{2UvB#*^;@G#L3g zjK@YGbDE!HBhYwk1Tv@jIW_`~$32s;1RIl(0TVRY2xLz4a~RLcjX=;M8-a%7EdT@) z00<@k5Nzd5KwE*$X<^REt-uV&R$z0QpX28Ac)SIZkpm=?t^^83t-$6qKZo(y3e3i_ z6?iz_0zfbUfM5c^MmfIxXBg+JYBHHjy2HamPcDQxz5B>GPLn%QJeLL*G^n!0~vjtE;OuAL6XNef_FFet7@The5ER;jDR{=c=l%{&%Gx zyWOs;s`mSRRolNk?#N9*?#0c?PhVQT1sH~5m=A}87aPt*>nnia^769rNFEcH|9x5O zg_u{GOUwCl@&f<>000000IcAjAIk9I9nOUh6E$-4M1K7yAM|b*hAI(g;z>FAIWvdD zp~@9&6GPn!fba6tJ9`D%`R3bzPJYN@AqWH$lWhbcG1$r925j-u-s3pdG)?B1bLTmm z&1Uf&zVCm39CRGVMGvsuZflw*bIiH(9N$u1kGGR>1S^xk0R%a@4`3X}+HSXtAH*DU z=+jVD^E}U0_3xhtw-Lyk9_HNM2(;Vns;X+g-&bA#4Rc2}0-4kO92=8W00?&SCZMgr z=JYV<_Euopu@%^y?&r8Uy&i7?lPv@!lYayWMP@6oIo;1;J+=aKc5DT1$6EjhCIApj z05~f*m;bc!w5o<-80N#_;K_wBH&+0|<>lpr9tivhHvrqX{RGYrauo36ocxnf1vryn e1r8Xnj=up0TE$ELmBAhW0000