BallOfEnergy 4bd6f0df53 More shit, also precompiled packets.
also holy shit the whitespace changes, intelliJ wanted to optimize the imports and refactored a ton of whitespace in the process.
2024-11-09 17:04:19 -06:00

248 lines
6.8 KiB
Java

package com.hbm.blocks.generic;
import java.awt.Color;
import java.util.List;
import com.hbm.blocks.ITooltipProvider;
import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toclient.AuxParticlePacketNT;
import api.hbm.block.IToolable;
import com.hbm.tileentity.TileEntityLoadedBase;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.BlockPistonBase;
import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemDye;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class BlockEmitter extends BlockContainer implements IToolable, ITooltipProvider {
public BlockEmitter() {
super(Material.iron);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntityEmitter();
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) {
int l = BlockPistonBase.determineOrientation(world, x, y, z, player);
world.setBlockMetadataWithNotify(x, y, z, l, 2);
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float fx, float fy, float fz) {
if(world.isRemote)
return true;
TileEntityEmitter te = (TileEntityEmitter)world.getTileEntity(x, y, z);
if(player.getHeldItem() != null) {
if(player.getHeldItem().getItem() instanceof ItemDye) {
te.color = ItemDye.field_150922_c[player.getHeldItem().getItemDamage()];
te.markDirty();
world.markBlockForUpdate(x, y, z);
player.getHeldItem().stackSize--;
return true;
}
}
return false;
}
@Override
public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) {
TileEntityEmitter te = (TileEntityEmitter)world.getTileEntity(x, y, z);
if(tool == ToolType.SCREWDRIVER) {
te.girth += 0.125F;
te.markDirty();
return true;
}
if(tool == ToolType.DEFUSER) {
te.girth -= 0.125F;
if(te.girth < 0.125F) te.girth = 0.125F;
te.markDirty();
return true;
}
if(tool == ToolType.HAND_DRILL) {
te.effect = (te.effect + 1) % te.effectCount;
te.markDirty();
return true;
}
return false;
}
public static class TileEntityEmitter extends TileEntityLoadedBase {
public static final int range = 100;
public int color;
public int beam;
public float girth = 0.5F;
public int effect = 0;
public static final int effectCount = 5;
@Override
public void updateEntity() {
if(!worldObj.isRemote) {
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata());
if(worldObj.getTotalWorldTime() % 20 == 0) {
for(int i = 1; i <= range; i++) {
beam = i;
int x = xCoord + dir.offsetX * i;
int y = yCoord + dir.offsetY * i;
int z = zCoord + dir.offsetZ * i;
Block b = worldObj.getBlock(x, y, z);
if(b.isBlockSolid(worldObj, x, y, z, dir.ordinal())) {
break;
}
}
}
if(effect == 4 && beam > 0) {
if(worldObj.getTotalWorldTime() % 5 == 0) {
double x = (int) (xCoord + dir.offsetX * (worldObj.getTotalWorldTime() / 5L) % beam) + 0.5;
double y = (int) (yCoord + dir.offsetY * (worldObj.getTotalWorldTime() / 5L) % beam) + 0.5;
double z = (int) (zCoord + dir.offsetZ * (worldObj.getTotalWorldTime() / 5L) % beam) + 0.5;
int prevColor = color;
if(color == 0) {
color = Color.HSBtoRGB(worldObj.getTotalWorldTime() / 50.0F, 0.5F, 0.25F) & 16777215;
}
NBTTagCompound data = new NBTTagCompound();
data.setString("type", "plasmablast");
data.setFloat("r", ((float)((color & 0xff0000) >> 16)) / 256F);
data.setFloat("g", ((float)((color & 0x00ff00) >> 8)) / 256F);
data.setFloat("b", ((float)((color & 0x0000ff))) / 256F);
data.setFloat("scale", girth * 5);
if(this.getBlockMetadata() == 2) {
data.setFloat("pitch", 90);
}
if(this.getBlockMetadata() == 3) {
data.setFloat("pitch", -90);
}
if(this.getBlockMetadata() == 4) {
data.setFloat("pitch", 90);
data.setFloat("yaw", 90);
}
if(this.getBlockMetadata() == 5) {
data.setFloat("pitch", -90);
data.setFloat("yaw", 90);
}
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x, y, z),
new TargetPoint(worldObj.provider.dimensionId, x, y, z, 100));
color = prevColor;
}
}
networkPackNT(150);
}
}
@Override
public Packet getDescriptionPacket() {
NBTTagCompound nbt = new NBTTagCompound();
this.writeToNBT(nbt);
return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt);
}
@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
this.readFromNBT(pkt.func_148857_g());
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
this.color = nbt.getInteger("color");
this.girth = nbt.getFloat("girth");
this.effect = nbt.getInteger("effect");
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setInteger("color", this.color);
nbt.setFloat("girth", this.girth);
nbt.setInteger("effect", this.effect);
}
@Override
public AxisAlignedBB getRenderBoundingBox() {
return TileEntity.INFINITE_EXTENT_AABB;
}
@Override
@SideOnly(Side.CLIENT)
public double getMaxRenderDistanceSquared() {
return 65536.0D;
}
@Override
public void serialize(ByteBuf buf) {
buf.writeInt(this.beam);
buf.writeInt(this.color);
buf.writeFloat(this.girth);
buf.writeInt(this.effect);
}
@Override
public void deserialize(ByteBuf buf) {
this.beam = buf.readInt();
this.color = buf.readInt();
this.girth = buf.readFloat();
this.effect = buf.readInt();
}
}
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
list.add(EnumChatFormatting.GOLD + "Use screwdriver to widen beam");
list.add(EnumChatFormatting.GOLD + "Use defuser to narrow beam");
list.add(EnumChatFormatting.GOLD + "Use hand drill to cycle special effects");
list.add(EnumChatFormatting.GOLD + "Use dye to change color");
}
}