From 1ae7160128e675c5ef58e90edd4bc62e6bbdf40c Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 2 Jun 2022 22:46:22 +0200 Subject: [PATCH] conveyor API stuff --- .../java/api/hbm/conveyor/IConveyorBelt.java | 10 ++++ .../api/hbm/conveyor/IEnterableBlock.java | 5 +- .../java/com/hbm/blocks/bomb/DetMiner.java | 15 ++++- .../com/hbm/blocks/network/BlockConveyor.java | 53 +++++++++++++++++- .../com/hbm/entity/item/EntityMovingItem.java | 42 +++++++++++++- .../hbm/util/fauxpointtwelve/BlockPos.java | 30 +++++++++- .../assets/hbm/textures/blocks/crane_in.png | Bin 239 -> 221 bytes .../hbm/textures/blocks/crane_in_top.png | Bin 0 -> 245 bytes .../assets/hbm/textures/blocks/crane_out.png | Bin 199 -> 178 bytes .../hbm/textures/blocks/crane_out_top.png | Bin 0 -> 253 bytes .../hbm/textures/blocks/crane_side_in.png | Bin 0 -> 239 bytes .../hbm/textures/blocks/crane_side_out.png | Bin 0 -> 199 bytes 12 files changed, 146 insertions(+), 9 deletions(-) create mode 100644 src/main/java/api/hbm/conveyor/IConveyorBelt.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/crane_in_top.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/crane_out_top.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/crane_side_in.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/crane_side_out.png diff --git a/src/main/java/api/hbm/conveyor/IConveyorBelt.java b/src/main/java/api/hbm/conveyor/IConveyorBelt.java new file mode 100644 index 000000000..075d37e79 --- /dev/null +++ b/src/main/java/api/hbm/conveyor/IConveyorBelt.java @@ -0,0 +1,10 @@ +package api.hbm.conveyor; + +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public interface IConveyorBelt { + + public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed); + public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos); +} diff --git a/src/main/java/api/hbm/conveyor/IEnterableBlock.java b/src/main/java/api/hbm/conveyor/IEnterableBlock.java index 4315726e3..a5f4abbf8 100644 --- a/src/main/java/api/hbm/conveyor/IEnterableBlock.java +++ b/src/main/java/api/hbm/conveyor/IEnterableBlock.java @@ -1,9 +1,10 @@ package api.hbm.conveyor; +import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public interface IEnterableBlock { - public boolean canEnter(IConveyorItem entity, ForgeDirection dir); - public void onEnter(IConveyorItem entity, ForgeDirection dir); + public boolean canEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity); + public void onEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity); } diff --git a/src/main/java/com/hbm/blocks/bomb/DetMiner.java b/src/main/java/com/hbm/blocks/bomb/DetMiner.java index 4bc5e01eb..1a006a7dd 100644 --- a/src/main/java/com/hbm/blocks/bomb/DetMiner.java +++ b/src/main/java/com/hbm/blocks/bomb/DetMiner.java @@ -8,13 +8,16 @@ import com.hbm.explosion.ExplosionNT; import com.hbm.explosion.ExplosionNT.ExAttrib; import com.hbm.interfaces.IBomb; +import api.hbm.conveyor.IConveyorItem; +import api.hbm.conveyor.IEnterableBlock; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.world.Explosion; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class DetMiner extends BlockPillar implements IBomb { +public class DetMiner extends BlockPillar implements IBomb, IEnterableBlock { public DetMiner(Material mat, String top) { super(mat, top); @@ -55,4 +58,14 @@ public class DetMiner extends BlockPillar implements IBomb { } } + @Override + public boolean canEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity) { + return true; + } + + @Override + public void onEnter(World world, int x, int y, int z, ForgeDirection dir, IConveyorItem entity) { + this.explode(world, x, y, z); + } + } diff --git a/src/main/java/com/hbm/blocks/network/BlockConveyor.java b/src/main/java/com/hbm/blocks/network/BlockConveyor.java index fbc7b563c..dc9235b89 100644 --- a/src/main/java/com/hbm/blocks/network/BlockConveyor.java +++ b/src/main/java/com/hbm/blocks/network/BlockConveyor.java @@ -3,6 +3,7 @@ package com.hbm.blocks.network; import com.hbm.entity.item.EntityMovingItem; import com.hbm.lib.RefStrings; +import api.hbm.conveyor.IConveyorBelt; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -16,10 +17,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class BlockConveyor extends Block { +public class BlockConveyor extends Block implements IConveyorBelt { @SideOnly(Side.CLIENT) protected IIcon sideIcon; @@ -47,6 +50,53 @@ public class BlockConveyor extends Block { return super.getIcon(side, metadata); } + @Override + public Vec3 getTravelLocation(World world, int x, int y, int z, Vec3 itemPos, double speed) { + + /*Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); + ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + return Vec3.createVectorHelper(snap.xCoord + dir.offsetX * speed, snap.yCoord, snap.zCoord + dir.offsetZ * speed);*/ + + Vec3 snap = this.getClosestSnappingPosition(world, x, y, z, itemPos); + /*double dist = snap.distanceTo(itemPos); + + if(dist > speed) { + + return Vec3.createVectorHelper( + itemPos.xCoord + (snap.xCoord - itemPos.xCoord) / dist * speed, + snap.yCoord, + itemPos.zCoord + (snap.zCoord - itemPos.zCoord) / dist * speed + ); + } else { + ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + return Vec3.createVectorHelper(snap.xCoord + dir.offsetX * speed, snap.yCoord, snap.zCoord + dir.offsetZ * speed); + }*/ + + ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + return Vec3.createVectorHelper(snap.xCoord - dir.offsetX * speed, snap.yCoord, snap.zCoord - dir.offsetZ * speed); + } + + @Override + public Vec3 getClosestSnappingPosition(World world, int x, int y, int z, Vec3 itemPos) { + + ForgeDirection dir = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)); + + itemPos.xCoord = MathHelper.clamp_double(itemPos.xCoord, x, x + 1); + itemPos.zCoord = MathHelper.clamp_double(itemPos.zCoord, z, z + 1); + + double posX = x + 0.5; + double posZ = z + 0.5; + + if(dir.offsetX != 0) { + posX = itemPos.xCoord; + } + if(dir.offsetZ != 0) { + posZ = itemPos.zCoord; + } + + return Vec3.createVectorHelper(posX, y + 0.25, posZ); + } + @Override public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { @@ -108,5 +158,4 @@ public class BlockConveyor extends Block { world.setBlockMetadataWithNotify(x, y, z, 4, 2); } } - } diff --git a/src/main/java/com/hbm/entity/item/EntityMovingItem.java b/src/main/java/com/hbm/entity/item/EntityMovingItem.java index a4bfd6399..100ed0d60 100644 --- a/src/main/java/com/hbm/entity/item/EntityMovingItem.java +++ b/src/main/java/com/hbm/entity/item/EntityMovingItem.java @@ -1,10 +1,14 @@ package com.hbm.entity.item; import com.hbm.blocks.ModBlocks; +import com.hbm.util.fauxpointtwelve.BlockPos; +import api.hbm.conveyor.IConveyorBelt; import api.hbm.conveyor.IConveyorItem; +import api.hbm.conveyor.IEnterableBlock; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -12,6 +16,7 @@ import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -104,7 +109,13 @@ public class EntityMovingItem extends Entity implements IConveyorItem { if(!worldObj.isRemote) { - if(worldObj.getBlock((int) Math.floor(posX), (int) Math.floor(posY), (int) Math.floor(posZ)) != ModBlocks.conveyor) { + int blockX = (int) Math.floor(posX); + int blockY = (int) Math.floor(posY); + int blockZ = (int) Math.floor(posZ); + + Block b = worldObj.getBlock(blockX, blockY, blockZ); + + if(!(b instanceof IConveyorBelt)) { this.setDead(); EntityItem item = new EntityItem(worldObj, posX, posY, posZ, this.getItemStack()); item.motionX = this.motionX * 3; @@ -113,9 +124,16 @@ public class EntityMovingItem extends Entity implements IConveyorItem { item.velocityChanged = true; worldObj.spawnEntityInWorld(item); return; + } else { + + Vec3 target = ((IConveyorBelt) b).getTravelLocation(worldObj, blockX, blockY, blockZ, Vec3.createVectorHelper(posX, posY, posZ), 0.0625); + //this.worldObj.spawnParticle("reddust", target.xCoord, target.yCoord, target.zCoord, 0, 0, 0); + this.motionX = target.xCoord - posX; + this.motionY = target.yCoord - posY; + this.motionZ = target.zCoord - posZ; } - if(worldObj.getBlock((int) Math.floor(posX), (int) Math.floor(posY), (int) Math.floor(posZ)) == ModBlocks.conveyor) { + /*if(worldObj.getBlock((int) Math.floor(posX), (int) Math.floor(posY), (int) Math.floor(posZ)) == ModBlocks.conveyor) { if(schedule <= 0) { ForgeDirection dir = ForgeDirection.getOrientation(worldObj.getBlockMetadata((int) Math.floor(posX), (int) Math.floor(posY), (int) Math.floor(posZ))); @@ -139,9 +157,27 @@ public class EntityMovingItem extends Entity implements IConveyorItem { } schedule--; - } + }*/ + BlockPos lastPos = new BlockPos(posX, posY, posZ); this.moveEntity(motionX, motionY, motionZ); + BlockPos newPos = new BlockPos(posX, posY, posZ); + + if(!lastPos.equals(newPos)) { + + Block newBlock = worldObj.getBlock(newPos.getX(), newPos.getY(), newPos.getZ()); + + if(newBlock instanceof IEnterableBlock) { + + ForgeDirection dir = ForgeDirection.UNKNOWN; + IEnterableBlock enterable = (IEnterableBlock) newBlock; + + if(enterable.canEnter(worldObj, newPos.getX(), newPos.getY(), newPos.getZ(), dir, this)) { + enterable.onEnter(worldObj, newPos.getX(), newPos.getY(), newPos.getZ(), dir, this); + this.setDead(); + } + } + } } } diff --git a/src/main/java/com/hbm/util/fauxpointtwelve/BlockPos.java b/src/main/java/com/hbm/util/fauxpointtwelve/BlockPos.java index 84ee5dff3..5cfe629a7 100644 --- a/src/main/java/com/hbm/util/fauxpointtwelve/BlockPos.java +++ b/src/main/java/com/hbm/util/fauxpointtwelve/BlockPos.java @@ -7,7 +7,7 @@ import net.minecraft.util.MathHelper; * Adjusted code from MC 1.12 (com.minecraft.util.math.BlockPos) */ public class BlockPos { - + private final int x; private final int y; private final int z; @@ -55,4 +55,32 @@ public class BlockPos { public int getZ() { return this.z; } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + x; + result = prime * result + y; + result = prime * result + z; + return result; + } + + @Override + public boolean equals(Object obj) { + if(this == obj) + return true; + if(obj == null) + return false; + if(getClass() != obj.getClass()) + return false; + BlockPos other = (BlockPos) obj; + if(x != other.x) + return false; + if(y != other.y) + return false; + if(z != other.z) + return false; + return true; + } } diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_in.png b/src/main/resources/assets/hbm/textures/blocks/crane_in.png index 01968dbd4b93e11b1bb00128b0bd1093b4b2fc80..9fd5029270c681fc90c1fa7faeff18884349c4b6 100644 GIT binary patch delta 177 zcmV;i08an!0o?(RG=G#yL_t(Ijir-84nrXbM5j%667I$&yqux?j=`}@&iJ1Zm3 z3y|?vYklGmJ^F!&wv1*r0Nu>YDYL4Ah+t-;17=2REd>w}sOsn-YHg;^Q7?cMB-&F5 zh#<2i-)8^-aCf-->d6|A(R2g=D5d-k$ObC}?4v0x3u3%zCpvJ=8 zU=#?rzkwnAmzl|ou+|n1=)7N)QcK2^QU&a0t@V^S#)wjilv2$=YmIYm3Sf*O##l3G zrPkATsXu@bq}8V;patnQ`P2gdpIV_3(^x$RnBQ>dt*;xUiOZP5=iw@1FrJ(brulP_dzL|jy{8pDn)5ORs`rdtA67jOpYdt`|Ae=n qeU0Bq{jlK?TsbMFKhtK#S!vEiwwLUz1a1M{&EVDsw z>HGKZ&wqG&x;}@v!fY=c`J>zh1>fJrvVlNtZS9^KiG)MX?1K)hU_5-9p(sd^nb}13 l&?PfX236ySn;Qif7*y=dpYA?6F_{4fJYD@<);T3K0RS(6|_5;e~n&M5L)vRd;}hkWxAnYv7p=A)u=J1U2=pKdfNNIRoImzx1Z= zY`+%$fG+`0{s4dj3P2gR#IU}1{4{TXC(Y)aUE`}`suQhR02C62N*0lPfw!*8|U%q?k z9bX?B8rmcf3wHO6W0WVOy{J@_f1G>PSB#j*9xz{EA1Numt0-0wt)4e z>CY?73{U2qwCvy4!)W|!8iT^pKk^3F5xxgbg>Wrkn8L9Acj>7odzZ6R*qA$TO27SN l7oM~+|M9}qUo{a|x%4!{}>vWxf~?7 vAK9?4{Eta~gZkNLb7LQ`PF^LvHi|*0%}Z>Sne1_(OBg&|{an^LB{Ts5Oejib literal 0 HcmV?d00001