- Версия(и) Minecraft
- 1.7.10
BlockCollider:
public class BlockCollider extends BlockContainer
{
public TileEntityCollider tile;
public BlockCollider()
{
super(Material.grass);
this.setBlockName("serverCollider");
this.setCreativeTab(CreativeTabs.tabTools);
}
public AxisAlignedBB getCollisionBoundingBoxFromPool(World w, int x, int y, int z)
{
TileEntityCollider tile = (TileEntityCollider)w.getTileEntity(x, y, z);
if(w.isRemote)
{
if(!Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode)
{
this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F);
}
else
{
this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
}
} else
{
this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F);
}
return tile != null?AxisAlignedBB.getBoundingBox((double)x + tile.minX, (double)y + tile.minY, (double)z + tile.minZ, (double)x + tile.maxX, (double)y + tile.maxY, (double)z + tile.maxZ):AxisAlignedBB.getBoundingBox((double)x + super.minX, (double)y + super.minY, (double)z + super.minZ, (double)x + super.maxX, (double)y + super.maxY, (double)z + super.maxZ);
}
public ItemStack getPickBlock(MovingObjectPosition target, World w, int x, int y, int z, EntityPlayer player)
{
ItemStack is = new ItemStack(Core.instance._iColliderPlacer);
NBTTagCompound tag = new NBTTagCompound();
TileEntityCollider tile = (TileEntityCollider)w.getTileEntity(x, y, z);
tile.safeWrite(tag);
is.setTagCompound(tag);
return is;
}
public boolean onBlockActivated(World w, int x, int y, int z, EntityPlayer p, int side, float sx, float sy, float sz)
{
if(!p.capabilities.isCreativeMode)
{
return false;
}
else if(p.getCurrentEquippedItem() != null)
{
return false;
}
else
{
double mode = 0.0625D;
if(!p.isSneaking())
{
mode = -mode;
}
TileEntityCollider tile = (TileEntityCollider)w.getTileEntity(x, y, z);
if(side == 0 && tile.minY + mode >= 0.0D && tile.minY + mode <= 1.0D)
{
tile.minY += mode;
}
else if(side == 1 && tile.maxY + mode <= 1.0D && tile.maxY + mode >= 0.0D)
{
tile.maxY += mode;
}
else if(side == 2 && tile.minZ + mode >= 0.0D && tile.minZ + mode <= 1.0D)
{
tile.minZ += mode;
}
else if(side == 3 && tile.maxZ + mode <= 1.0D && tile.maxZ + mode >= 0.0D)
{
tile.maxZ += mode;
}
else if(side == 4 && tile.minX + mode >= 0.0D && tile.minX + mode <= 1.0D)
{
tile.minX += mode;
}
else if(side == 5 && tile.maxX + mode <= 1.0D && tile.maxX + mode >= 0.0D)
{
tile.maxX += mode;
}
tile.markDirty();
return false;
}
}
public boolean isNormalCube()
{
return false;
}
public boolean renderAsNormalBlock()
{
return false;
}
public int getRenderType()
{
return -1;
}
public boolean isOpaqueCube()
{
return false;
}
public TileEntity createNewTileEntity(World w, int i)
{
return this.tile != null?this.tile:new TileEntityCollider();
}
}
ClientProxy:
public class ClientProxy
{
public static void Init(FMLInitializationEvent e)
{
ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCollider.class, new TileEntityColliderRender());
}
}
Core:
@Mod(
modid = "collider",
name = "collider",
version = "1.0"
)
public class Core
{
@Instance("collider")
public static Core instance;
public Item _iColliderPlacer;
public Block _bModelCollider;
public Core()
{
this._iColliderPlacer = new ItemCollider();
this._bModelCollider = new BlockCollider();
}
@EventHandler
public void PreInit(FMLPreInitializationEvent e)
{
this.registerItem(this._iColliderPlacer);
this.registerBlock(this._bModelCollider);
GameRegistry.registerTileEntity(TileEntityCollider.class, "serverCollider");
}
public void registerItem(Item item)
{
GameRegistry.registerItem(item, item.getUnlocalizedName());
}
public void registerBlock(Block block)
{
GameRegistry.registerBlock(block, block.getUnlocalizedName());
}
@EventHandler
public void Init(FMLInitializationEvent e)
{
if(e.getSide().isClient())
{
ClientProxy.Init(e);
}
}
}
ItemCollider:
public class ItemCollider extends Item
{
public ItemCollider()
{
this.setMaxStackSize(1);
this.setCreativeTab(CreativeTabs.tabTools);
}
public boolean onItemUse(ItemStack i, EntityPlayer p, World w, int x, int y, int z, int side, float sx, float sy, float sz)
{
TileEntityCollider tile = new TileEntityCollider();
if(i.getTagCompound() != null)
{
tile.safeRead(i.getTagCompound());
}
if(side == 0)
{
--y;
}
else if(side == 1)
{
++y;
}
else if(side == 2)
{
--z;
}
else if(side == 3)
{
++z;
}
else if(side == 4)
{
--x;
}
else if(side == 5)
{
++x;
}
w.setBlock(x, y, z, Core.instance._bModelCollider);
w.setTileEntity(x, y, z, tile);
return true;
}
}
TileEntityCollider:
public class TileEntityCollider extends TileEntity
{
public double minX = 0.0D;
public double maxX = 1.0D;
public double minZ = 0.0D;
public double maxZ = 1.0D;
public double minY = 0.0D;
public double maxY = 1.0D;
public void readFromNBT(NBTTagCompound tag)
{
super.readFromNBT(tag);
this.safeRead(tag);
}
public void safeRead(NBTTagCompound tag)
{
this.minX = tag.getDouble("minX");
this.maxX = tag.getDouble("maxX");
this.minZ = tag.getDouble("minZ");
this.maxZ = tag.getDouble("maxZ");
this.minY = tag.getDouble("minY");
this.maxY = tag.getDouble("maxY");
}
public void writeToNBT(NBTTagCompound tag)
{
super.writeToNBT(tag);
this.safeWrite(tag);
}
public void safeWrite(NBTTagCompound tag)
{
tag.setDouble("minX", this.minX);
tag.setDouble("maxX", this.maxX);
tag.setDouble("minZ", this.minZ);
tag.setDouble("maxZ", this.maxZ);
tag.setDouble("maxY", this.maxY);
tag.setDouble("minY", this.minY);
}
public Packet getDescriptionPacket()
{
NBTTagCompound nbttagcompound = new NBTTagCompound();
this.writeToNBT(nbttagcompound);
return new S35PacketUpdateTileEntity(super.xCoord, super.yCoord, super.zCoord, 5, nbttagcompound);
}
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet)
{
this.readFromNBT(packet.func_148857_g());
}
}
TileEntityColliderRender:
public class TileEntityColliderRender extends TileEntitySpecialRenderer
{
public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float t)
{
this.render((TileEntityCollider)tile, x, y, z, t);
}
private void render(TileEntityCollider tile, double x, double y, double z, float t)
{
if(Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode)
{
GL11.glPushMatrix();
GL11.glTranslated(x, y, z);
GL11.glEnable(3042);
GL11.glColor4f(0.0F, 1.0F, 0.0F, 0.4F);
GL11.glDisable(3553);
Vec3 min = Vec3.createVectorHelper(tile.minX, tile.minY, tile.minZ);
Vec3 max = Vec3.createVectorHelper(tile.maxX - 1.0D, tile.maxY - 1.0D, tile.maxZ - 1.0D);
Util.drawWorldBounds(Tessellator.instance, min, max, false);
GL11.glDisable(3042);
GL11.glEnable(3553);
GL11.glPopMatrix();
}
}
}
Util:
public class Util
{
public static void drawWorldBounds(Tessellator t, AxisAlignedBB aabb)
{
Vec3 fr = Vec3.createVectorHelper(aabb.minX, aabb.minY, aabb.minZ);
Vec3 fr2 = Vec3.createVectorHelper(aabb.maxX, aabb.maxY, aabb.maxZ);
drawWorldBounds(t, fr, fr2, true);
}
public static void drawWorldBounds(Tessellator t, Vec3 firstEdge, Vec3 secondEdge, boolean check)
{
t.startDrawingQuads();
double yMinPos = Double.min(firstEdge.yCoord, secondEdge.yCoord);
double yMaxPos = Double.max(firstEdge.yCoord, secondEdge.yCoord);
double xMinPos = Double.min(firstEdge.xCoord, secondEdge.xCoord);
double xMaxPos = Double.max(firstEdge.xCoord, secondEdge.xCoord);
double zMinPos = Double.min(firstEdge.zCoord, secondEdge.zCoord);
double zMaxPos = Double.max(firstEdge.zCoord, secondEdge.zCoord);
if(!check)
{
yMinPos = firstEdge.yCoord;
yMaxPos = secondEdge.yCoord;
xMinPos = firstEdge.xCoord;
xMaxPos = secondEdge.xCoord;
zMinPos = firstEdge.zCoord;
zMaxPos = secondEdge.zCoord;
}
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMaxPos + 0.0010000000474974513D + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMinPos + 0.0010000000474974513D);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMinPos + 0.0010000000474974513D);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMaxPos + 0.0010000000474974513D + 1.0D);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMaxPos + 0.0010000000474974513D + 1.0D);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMinPos + 0.0010000000474974513D);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMinPos + 0.0010000000474974513D);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMaxPos + 0.0010000000474974513D + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMaxPos + 0.0010000000474974513D + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMinPos + 0.0010000000474974513D);
t.addVertex(xMinPos, yMinPos, zMinPos + 0.0010000000474974513D);
t.addVertex(xMinPos, yMinPos, zMaxPos + 0.0010000000474974513D + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMinPos + 0.0010000000474974513D);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMinPos + 0.0010000000474974513D);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMinPos + 0.0010000000474974513D);
t.addVertex(xMinPos, yMinPos, zMinPos + 0.0010000000474974513D);
t.addVertex(xMaxPos + 1.0D - 0.0010000000474974513D, yMinPos, zMaxPos + 1.0D);
t.addVertex(xMaxPos + 1.0D - 0.0010000000474974513D, yMaxPos + 1.0D, zMaxPos + 1.0D);
t.addVertex(xMaxPos + 1.0D - 0.0010000000474974513D, yMaxPos + 1.0D, zMinPos);
t.addVertex(xMaxPos + 1.0D - 0.0010000000474974513D, yMinPos, zMinPos);
t.addVertex(xMinPos, yMinPos, zMaxPos + 1.0D - 0.0010000000474974513D);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMaxPos + 1.0D - 0.0010000000474974513D);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMaxPos + 1.0D - 0.0010000000474974513D);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMaxPos + 1.0D - 0.0010000000474974513D);
t.addVertex(xMinPos, yMinPos, zMaxPos + 1.0D);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMaxPos + 1.0D);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMinPos);
t.addVertex(xMinPos, yMinPos, zMinPos);
t.addVertex(xMinPos + 0.0010000000474974513D, yMinPos, zMinPos);
t.addVertex(xMinPos + 0.0010000000474974513D, yMaxPos + 1.0D, zMinPos);
t.addVertex(xMinPos + 0.0010000000474974513D, yMaxPos + 1.0D, zMaxPos + 1.0D);
t.addVertex(xMinPos + 0.0010000000474974513D, yMinPos, zMaxPos + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMinPos);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMinPos);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMaxPos + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMaxPos + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMaxPos + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMaxPos + 1.0D);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMaxPos + 1.0D);
t.addVertex(xMinPos, yMinPos, zMaxPos + 1.0D);
t.addVertex(xMinPos, yMinPos, zMinPos);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMinPos);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMinPos);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMinPos);
t.addVertex(xMinPos, yMinPos, zMaxPos + 0.0010000000474974513D + 1.0D);
t.addVertex(xMinPos, yMinPos, zMinPos + 0.0010000000474974513D);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMinPos + 0.0010000000474974513D);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMaxPos + 0.0010000000474974513D + 1.0D);
t.draw();
t.startDrawing(1);
t.setColorRGBA(0, 0, 0, 255);
GL11.glLineWidth(1.0F);
t.addVertex(xMinPos, yMinPos, zMaxPos + 1.0D);
t.addVertex(xMinPos, yMinPos, zMinPos);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMaxPos + 1.0D);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMinPos);
t.addVertex(xMinPos, yMinPos, zMinPos);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMinPos);
t.addVertex(xMinPos, yMinPos, zMaxPos + 1.0D);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMaxPos + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMaxPos + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMinPos);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMaxPos + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMinPos);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMinPos);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMinPos);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMaxPos + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMaxPos + 1.0D);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMaxPos + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMaxPos + 1.0D);
t.addVertex(xMinPos, yMinPos, zMaxPos + 1.0D);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMaxPos + 1.0D);
t.addVertex(xMinPos, yMaxPos + 1.0D, zMinPos);
t.addVertex(xMaxPos + 1.0D, yMaxPos + 1.0D, zMinPos);
t.addVertex(xMinPos, yMinPos, zMinPos);
t.addVertex(xMaxPos + 1.0D, yMinPos, zMinPos);
t.draw();
}
}