Refactored lasers.

Moved PowerLaser logic from EntityLaser.
This commit is contained in:
psxlover 2012-09-30 22:42:09 +03:00
parent 17a40802f8
commit 6d5942bc8a
7 changed files with 95 additions and 83 deletions

View file

@ -235,7 +235,7 @@ public class TileBuilder extends TileBuildCraft implements IBuilderInventory, IP
for (BlockIndex b : path) {
if (previous != null) {
EntityLaser laser = new EntityPowerLaser(worldObj,
EntityPowerLaser laser = new EntityPowerLaser(worldObj,
new Position(previous.i + 0.5, previous.j + 0.5, previous.k + 0.5),
new Position(b.i + 0.5, b.j + 0.5, b.k + 0.5));

View file

@ -60,7 +60,7 @@ public class TilePathMarker extends TileMarker {
if (CoreProxy.proxy.isRenderWorld(worldObj))
return;
EntityLaser laser = new EntityPowerLaser(worldObj, new Position(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5), new Position(pathMarker.xCoord + 0.5, pathMarker.yCoord + 0.5, pathMarker.zCoord + 0.5));
EntityPowerLaser laser = new EntityPowerLaser(worldObj, new Position(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5), new Position(pathMarker.xCoord + 0.5, pathMarker.yCoord + 0.5, pathMarker.zCoord + 0.5));
laser.show();
laser.setTexture(DefaultProps.TEXTURE_PATH_ENTITIES + "/laser_1.png");

View file

@ -58,27 +58,20 @@ public class EntityEnergyLaser extends EntityLaser {
}
@Override
protected void updateData() {
super.updateData();
protected void updateDataClient() {
super.updateDataClient();
powerAverage = (float)decodeDouble(dataWatcher.getWatchableObjectInt(15));
}
@Override
public void setPositions(Position head, Position tail) {
super.setPositions(head, tail);
protected void updateDataServer() {
super.updateDataServer();
dataWatcher.updateObject(15, Integer.valueOf(encodeDouble((double)powerAverage)));
}
@Override
protected void initClientSide() {
super.initClientSide();
protected void entityInit() {
super.entityInit();
dataWatcher.addObject(15, Integer.valueOf(0));
}
@Override
protected void initServerSide() {
super.initServerSide();
dataWatcher.addObject(15, encodeDouble((double)powerAverage));
}
}

View file

@ -16,19 +16,22 @@ import net.minecraft.src.Entity;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.World;
public class EntityLaser extends Entity {
public abstract class EntityLaser extends Entity {
protected Position head, tail;
public double renderSize = 0;
public double angleY = 0;
public double angleZ = 0;
protected String texture;
private boolean isVisible = false;
protected boolean needsUpdate = true;
public EntityLaser(World world) {
super(world);
initClientSide();
head = new Position(0, 0, 0);
tail = new Position(0, 0, 0);
}
public EntityLaser(World world, Position head, Position tail) {
@ -39,46 +42,23 @@ public class EntityLaser extends Entity {
this.tail = tail;
setPositionAndRotation(head.x, head.y, head.z, 0, 0);
initServerSide();
setSize(10, 10);
}
protected void initClientSide() {
head = new Position(0, 0, 0);
tail = new Position(0, 0, 0);
dataWatcher.addObject(8 , Integer.valueOf(0));
dataWatcher.addObject(9 , Integer.valueOf(0));
@Override
protected void entityInit() {
preventEntitySpawning = false;
noClip = true;
isImmuneToFire = true;
dataWatcher.addObject(8, Integer.valueOf(0));
dataWatcher.addObject(9, Integer.valueOf(0));
dataWatcher.addObject(10, Integer.valueOf(0));
dataWatcher.addObject(11, Integer.valueOf(0));
dataWatcher.addObject(12, Integer.valueOf(0));
dataWatcher.addObject(13, Integer.valueOf(0));
dataWatcher.addObject(14, Byte.valueOf((byte) 0));
dataWatcher.addObject(16, "");
}
protected void initServerSide() {
preventEntitySpawning = false;
noClip = true;
isImmuneToFire = true;
setPositionAndRotation(head.x, head.y, head.z, 0, 0);
setSize(10, 10);
dataWatcher.addObject(8 , Integer.valueOf(encodeDouble(head.x)));
dataWatcher.addObject(9 , Integer.valueOf(encodeDouble(head.y)));
dataWatcher.addObject(10, Integer.valueOf(encodeDouble(head.z)));
dataWatcher.addObject(11, Integer.valueOf(encodeDouble(tail.x)));
dataWatcher.addObject(12, Integer.valueOf(encodeDouble(tail.y)));
dataWatcher.addObject(13, Integer.valueOf(encodeDouble(tail.z)));
dataWatcher.addObject(14, Byte.valueOf((byte) 0));
dataWatcher.addObject(16, "");
}
@Override
@ -87,8 +67,13 @@ public class EntityLaser extends Entity {
if (head == null || tail == null)
return;
if (CoreProxy.proxy.isSimulating(worldObj) && needsUpdate) {
updateDataServer();
needsUpdate = false;
}
if (CoreProxy.proxy.isRenderWorld(worldObj))
updateData();
updateDataClient();
boundingBox.minX = Math.min(head.x, tail.x);
boundingBox.minY = Math.min(head.y, tail.y);
@ -116,66 +101,62 @@ public class EntityLaser extends Entity {
angleY = -Math.atan2(dy, dx) * 180 / Math.PI;
}
protected void updateData() {
protected void updateDataClient() {
head.x = decodeDouble(dataWatcher.getWatchableObjectInt(8));
head.y = decodeDouble(dataWatcher.getWatchableObjectInt(9));
head.z = decodeDouble(dataWatcher.getWatchableObjectInt(10));
tail.x = decodeDouble(dataWatcher.getWatchableObjectInt(11));
tail.y = decodeDouble(dataWatcher.getWatchableObjectInt(12));
tail.z = decodeDouble(dataWatcher.getWatchableObjectInt(13));
texture = dataWatcher.getWatchableObjectString(16);
isVisible = (dataWatcher.getWatchableObjectByte(14) == 1);
}
public void setPositions(Position head, Position tail) {
this.head = head;
this.tail = tail;
setPositionAndRotation(head.x, head.y, head.z, 0, 0);
dataWatcher.updateObject(8 , Integer.valueOf(encodeDouble(head.x)));
dataWatcher.updateObject(9 , Integer.valueOf(encodeDouble(head.y)));
protected void updateDataServer() {
dataWatcher.updateObject(8, Integer.valueOf(encodeDouble(head.x)));
dataWatcher.updateObject(9, Integer.valueOf(encodeDouble(head.y)));
dataWatcher.updateObject(10, Integer.valueOf(encodeDouble(head.z)));
dataWatcher.updateObject(11, Integer.valueOf(encodeDouble(tail.x)));
dataWatcher.updateObject(12, Integer.valueOf(encodeDouble(tail.y)));
dataWatcher.updateObject(13, Integer.valueOf(encodeDouble(tail.z)));
onUpdate();
dataWatcher.updateObject(14, Byte.valueOf((byte) (isVisible ? 1 : 0)));
}
public void setPositions(Position head, Position tail) {
this.head = head;
this.tail = tail;
setPositionAndRotation(head.x, head.y, head.z, 0, 0);
needsUpdate = true;
}
public void show() {
dataWatcher.updateObject(14, Byte.valueOf((byte) 1));
isVisible = true;
needsUpdate = true;
}
public void hide() {
dataWatcher.updateObject(14, Byte.valueOf((byte) 0));
isVisible = false;
needsUpdate = true;
}
public boolean isVisible() {
return dataWatcher.getWatchableObjectByte(14) == 0 ? false : true;
return this.isVisible;
}
public void setTexture(String texture) {
this.texture = texture;
dataWatcher.updateObject(16, texture);
}
public String getTexture() {
return texture;
}
public abstract String getTexture();
protected int encodeDouble(double d) {
return (int) (d * 8000);
return (int) (d * 8192);
}
protected double decodeDouble(int i) {
return (i / 8000D);
return (i / 8192D);
}
@Override
protected void entityInit() {}
//The read/write to nbt seem to be useless
@Override
protected void readEntityFromNBT(NBTTagCompound nbt) {
@ -201,4 +182,9 @@ public class EntityLaser extends Entity {
nbt.setDouble("tailY", tail.y);
nbt.setDouble("tailZ", tail.z);
}
//Workaround for the laser's posY loosing it's precision e.g 103.5 becomes 104
public Position renderOffset() {
return new Position(head.x - posX, head.y - posY, head.z - posZ);
}
}

View file

@ -4,6 +4,7 @@ import net.minecraft.src.World;
import buildcraft.api.core.Position;
public class EntityPowerLaser extends EntityLaser {
private String texture;
public EntityPowerLaser(World world) {
super(world);
@ -13,4 +14,31 @@ public class EntityPowerLaser extends EntityLaser {
super(world, head, tail);
}
@Override
protected void entityInit() {
super.entityInit();
dataWatcher.addObject(15, "");
}
@Override
public String getTexture() {
return texture;
}
public void setTexture(String texture) {
this.texture = texture;
needsUpdate = true;
}
@Override
protected void updateDataClient() {
super.updateDataClient();
texture = dataWatcher.getWatchableObjectString(15);
}
@Override
protected void updateDataServer() {
super.updateDataServer();
dataWatcher.updateObject(15, texture);
}
}

View file

@ -1,5 +1,6 @@
package buildcraft.core.render;
import buildcraft.api.core.Position;
import net.minecraft.src.Entity;
import net.minecraft.src.ModelBase;
import net.minecraft.src.ModelRenderer;
@ -38,7 +39,9 @@ public class RenderLaser extends Render {
GL11.glPushMatrix();
GL11.glDisable(2896 /* GL_LIGHTING */);
GL11.glTranslated(x, y, z);
Position offset = laser.renderOffset();
GL11.glTranslated(x + offset.x, y + offset.y, z + offset.z);
GL11.glRotatef((float) laser.angleZ, 0, 1, 0);
GL11.glRotatef((float) laser.angleY, 0, 0, 1);

View file

@ -207,7 +207,9 @@ public class TileLaser extends TileBuildCraft implements IPowerReceptor {
assemblyTable.zCoord + 0.475 + (worldObj.rand.nextFloat() - 0.5) / 5F);
laser.setPositions(head, tail);
laser.show();
if(!laser.isVisible())
laser.show();
}
protected void removeLaser() {