193 lines
5.1 KiB
Java
193 lines
5.1 KiB
Java
/**
|
|
* Copyright (c) 2011-2017, SpaceToad and the BuildCraft Team
|
|
* http://www.mod-buildcraft.com
|
|
* <p/>
|
|
* BuildCraft is distributed under the terms of the Minecraft Mod Public
|
|
* License 1.0, or MMPL. Please check the contents of the license located in
|
|
* http://www.mod-buildcraft.com/MMPL-1.0.txt
|
|
*/
|
|
package buildcraft.core;
|
|
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.util.ResourceLocation;
|
|
import net.minecraft.world.World;
|
|
|
|
import buildcraft.api.core.Position;
|
|
|
|
public abstract class EntityLaser extends Entity {
|
|
|
|
public static final ResourceLocation[] LASER_TEXTURES = new ResourceLocation[]{
|
|
new ResourceLocation("buildcraftcore", "textures/laserBeams/laser_1.png"),
|
|
new ResourceLocation("buildcraftcore", "textures/laserBeams/laser_2.png"),
|
|
new ResourceLocation("buildcraftcore", "textures/laserBeams/laser_3.png"),
|
|
new ResourceLocation("buildcraftcore", "textures/laserBeams/laser_4.png"),
|
|
new ResourceLocation("buildcraftcore", "textures/laserBeams/stripes.png"),
|
|
new ResourceLocation("buildcraftcore", "textures/laserBeams/blue_stripes.png")};
|
|
|
|
public LaserData data = new LaserData();
|
|
|
|
protected boolean needsUpdate = true;
|
|
|
|
public EntityLaser(World world) {
|
|
super(world);
|
|
|
|
data.head = new Position(0, 0, 0);
|
|
data.tail = new Position(0, 0, 0);
|
|
}
|
|
|
|
public EntityLaser(World world, Position head, Position tail) {
|
|
|
|
super(world);
|
|
|
|
data.head = head;
|
|
data.tail = tail;
|
|
|
|
setPositionAndRotation(head.x, head.y, head.z, 0, 0);
|
|
setSize(10, 10);
|
|
}
|
|
|
|
@Override
|
|
protected void entityInit() {
|
|
preventEntitySpawning = false;
|
|
noClip = true;
|
|
isImmuneToFire = true;
|
|
|
|
dataWatcher.addObject(8, 0);
|
|
dataWatcher.addObject(9, 0);
|
|
dataWatcher.addObject(10, 0);
|
|
dataWatcher.addObject(11, 0);
|
|
dataWatcher.addObject(12, 0);
|
|
dataWatcher.addObject(13, 0);
|
|
|
|
dataWatcher.addObject(14, (byte) 0);
|
|
}
|
|
|
|
@Override
|
|
public void onUpdate() {
|
|
|
|
if (data.head == null || data.tail == null) {
|
|
return;
|
|
}
|
|
|
|
if (!worldObj.isRemote && needsUpdate) {
|
|
updateDataServer();
|
|
needsUpdate = false;
|
|
}
|
|
|
|
//if (worldObj.isRemote) {
|
|
// updateDataClient();
|
|
//}
|
|
|
|
boundingBox.minX = Math.min(data.head.x, data.tail.x);
|
|
boundingBox.minY = Math.min(data.head.y, data.tail.y);
|
|
boundingBox.minZ = Math.min(data.head.z, data.tail.z);
|
|
|
|
boundingBox.maxX = Math.max(data.head.x, data.tail.x);
|
|
boundingBox.maxY = Math.max(data.head.y, data.tail.y);
|
|
boundingBox.maxZ = Math.max(data.head.z, data.tail.z);
|
|
|
|
boundingBox.minX--;
|
|
boundingBox.minY--;
|
|
boundingBox.minZ--;
|
|
|
|
boundingBox.maxX++;
|
|
boundingBox.maxY++;
|
|
boundingBox.maxZ++;
|
|
|
|
data.update();
|
|
}
|
|
|
|
protected void updateDataClient() {
|
|
data.head.x = decodeDouble(dataWatcher.getWatchableObjectInt(8));
|
|
data.head.y = decodeDouble(dataWatcher.getWatchableObjectInt(9));
|
|
data.head.z = decodeDouble(dataWatcher.getWatchableObjectInt(10));
|
|
data.tail.x = decodeDouble(dataWatcher.getWatchableObjectInt(11));
|
|
data.tail.y = decodeDouble(dataWatcher.getWatchableObjectInt(12));
|
|
data.tail.z = decodeDouble(dataWatcher.getWatchableObjectInt(13));
|
|
|
|
data.isVisible = dataWatcher.getWatchableObjectByte(14) == 1;
|
|
}
|
|
|
|
protected void updateDataServer() {
|
|
dataWatcher.updateObject(8, encodeDouble(data.head.x));
|
|
dataWatcher.updateObject(9, encodeDouble(data.head.y));
|
|
dataWatcher.updateObject(10, encodeDouble(data.head.z));
|
|
dataWatcher.updateObject(11, encodeDouble(data.tail.x));
|
|
dataWatcher.updateObject(12, encodeDouble(data.tail.y));
|
|
dataWatcher.updateObject(13, encodeDouble(data.tail.z));
|
|
|
|
dataWatcher.updateObject(14, (byte) (data.isVisible ? 1 : 0));
|
|
}
|
|
|
|
public void setPositions(Position head, Position tail) {
|
|
data.head = head;
|
|
data.tail = tail;
|
|
|
|
setPositionAndRotation(head.x, head.y, head.z, 0, 0);
|
|
|
|
needsUpdate = true;
|
|
}
|
|
|
|
public void show() {
|
|
data.isVisible = true;
|
|
needsUpdate = true;
|
|
}
|
|
|
|
public void hide() {
|
|
data.isVisible = false;
|
|
needsUpdate = true;
|
|
}
|
|
|
|
public boolean isVisible() {
|
|
return data.isVisible;
|
|
}
|
|
|
|
public abstract ResourceLocation getTexture();
|
|
|
|
protected int encodeDouble(double d) {
|
|
return (int) (d * 8192);
|
|
}
|
|
|
|
protected double decodeDouble(int i) {
|
|
return i / 8192D;
|
|
}
|
|
|
|
// The read/write to nbt seem to be useless
|
|
@Override
|
|
protected void readEntityFromNBT(NBTTagCompound nbt) {
|
|
|
|
double headX = nbt.getDouble("headX");
|
|
double headY = nbt.getDouble("headZ");
|
|
double headZ = nbt.getDouble("headY");
|
|
data.head = new Position(headX, headY, headZ);
|
|
|
|
double tailX = nbt.getDouble("tailX");
|
|
double tailY = nbt.getDouble("tailZ");
|
|
double tailZ = nbt.getDouble("tailY");
|
|
data.tail = new Position(tailX, tailY, tailZ);
|
|
}
|
|
|
|
@Override
|
|
protected void writeEntityToNBT(NBTTagCompound nbt) {
|
|
|
|
nbt.setDouble("headX", data.head.x);
|
|
nbt.setDouble("headY", data.head.y);
|
|
nbt.setDouble("headZ", data.head.z);
|
|
|
|
nbt.setDouble("tailX", data.tail.x);
|
|
nbt.setDouble("tailY", data.tail.y);
|
|
nbt.setDouble("tailZ", data.tail.z);
|
|
}
|
|
|
|
// Workaround for the laser's posY loosing it's precision e.g 103.5 becomes 104
|
|
public Position renderOffset() {
|
|
return new Position(data.head.x - posX, data.head.y - posY, data.head.z - posZ);
|
|
}
|
|
|
|
@Override
|
|
public int getBrightnessForRender(float par1) {
|
|
return 210;
|
|
}
|
|
}
|