Improvements to TileEntityRift

Made some improvements to TileEntityRift. The main reason for these
changes was to remove the field nearestRift - we should not hold on to
references to links. Now we simply track the location of the nearest
rift. I also confirmed that closeRift() and updateNearestRift() must be
allowed to run on both the client and the server. If the client doesn't
run those functions, then adjacent rifts don't connect as expected and
the rift removal animation doesn't work.
This commit is contained in:
SenseiKiwi
2014-07-12 03:36:56 -04:00
parent 2c7435585d
commit fb1713ae0e

View File

@@ -1,6 +1,5 @@
package StevenDimDoors.mod_pocketDim.tileentities; package StevenDimDoors.mod_pocketDim.tileentities;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
@@ -42,8 +41,7 @@ public class TileEntityRift extends DDTileEntityBase
public int yOffset = 0; public int yOffset = 0;
public int zOffset = 0; public int zOffset = 0;
public boolean shouldClose = false; public boolean shouldClose = false;
public Point4D nearestRiftLocation = null;
public DimLink nearestRiftData;
public int spawnedEndermenID = 0; public int spawnedEndermenID = 0;
public TileEntityRift() public TileEntityRift()
@@ -64,20 +62,20 @@ public class TileEntityRift extends DDTileEntityBase
} }
else else
{ {
this.invalidate(); invalidate();
} }
return; return;
} }
if (worldObj.getBlockId(xCoord, yCoord, zCoord) != mod_pocketDim.blockRift.blockID) if (worldObj.getBlockId(xCoord, yCoord, zCoord) != mod_pocketDim.blockRift.blockID)
{ {
this.invalidate(); invalidate();
return; return;
} }
// Check if this rift should render white closing particles and // Check if this rift should render white closing particles and
// spread the closing effect to other rifts nearby. // spread the closing effect to other rifts nearby.
if (this.shouldClose) if (shouldClose)
{ {
closeRift(); closeRift();
return; return;
@@ -85,13 +83,13 @@ public class TileEntityRift extends DDTileEntityBase
if (updateTimer >= UPDATE_PERIOD) if (updateTimer >= UPDATE_PERIOD)
{ {
this.spawnEndermen(mod_pocketDim.properties); spawnEndermen(mod_pocketDim.properties);
updateTimer = 0; updateTimer = 0;
} }
else if (updateTimer == UPDATE_PERIOD / 2) else if (updateTimer == UPDATE_PERIOD / 2)
{ {
this.calculateParticleOffsets(); updateNearestRift();
this.spread(mod_pocketDim.properties); spread(mod_pocketDim.properties);
} }
updateTimer++; updateTimer++;
} }
@@ -136,57 +134,60 @@ public class TileEntityRift extends DDTileEntityBase
} }
} }
} }
public boolean updateNearestRift()
{
nearestRiftData = PocketManager.getDimensionData(worldObj).findNearestRift(this.worldObj, 5, xCoord, yCoord, zCoord);
return (nearestRiftData != null);
}
private void closeRift() private void closeRift()
{ {
NewDimData dimension = PocketManager.getDimensionData(worldObj); NewDimData dimension = PocketManager.getDimensionData(worldObj);
if (closeTimer == CLOSING_PERIOD / 2) if (closeTimer == CLOSING_PERIOD / 2)
{ {
ArrayList<DimLink> riftLinks = dimension.findRiftsInRange(worldObj, 6, xCoord, yCoord, zCoord); for (DimLink riftLink : dimension.findRiftsInRange(worldObj, 6, xCoord, yCoord, zCoord))
if (riftLinks.size() > 0)
{ {
for (DimLink riftLink : riftLinks) Point4D location = riftLink.source();
TileEntityRift rift = (TileEntityRift) worldObj.getBlockTileEntity(location.getX(), location.getY(), location.getZ());
if (rift != null && !rift.shouldClose)
{ {
Point4D location = riftLink.source(); rift.shouldClose = true;
TileEntityRift rift = (TileEntityRift) worldObj.getBlockTileEntity(location.getX(), location.getY(), location.getZ()); rift.onInventoryChanged();
if (rift != null)
{
rift.shouldClose = true;
rift.onInventoryChanged();
}
} }
} }
} }
if (closeTimer >= CLOSING_PERIOD) if (closeTimer >= CLOSING_PERIOD)
{ {
if (!this.worldObj.isRemote) DimLink link = PocketManager.getLink(this.xCoord, this.yCoord, this.zCoord, worldObj);
if (link != null)
{ {
DimLink link = PocketManager.getLink(this.xCoord, this.yCoord, this.zCoord, worldObj); dimension.deleteLink(link);
if (link != null)
{
dimension.deleteLink(link);
}
} }
worldObj.setBlockToAir(xCoord, yCoord, zCoord); worldObj.setBlockToAir(xCoord, yCoord, zCoord);
worldObj.playSound(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "mods.DimDoors.sfx.riftClose", 0.7f, 1, false); worldObj.playSound(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "mods.DimDoors.sfx.riftClose", 0.7f, 1, false);
} }
closeTimer++; closeTimer++;
} }
private void calculateParticleOffsets() public boolean updateNearestRift()
{ {
if (updateNearestRift()) Point4D previousNearest = nearestRiftLocation;
DimLink nearestRiftLink = PocketManager.getDimensionData(worldObj).findNearestRift(
worldObj, RIFT_INTERACTION_RANGE, xCoord, yCoord, zCoord);
nearestRiftLocation = (nearestRiftLink == null) ? null : nearestRiftLink.source();
// If the nearest rift location changed, then update particle offsets
if (previousNearest != nearestRiftLocation &&
(previousNearest == null || nearestRiftLocation == null || !previousNearest.equals(nearestRiftLocation)))
{ {
Point4D location = nearestRiftData.source(); updateParticleOffsets();
this.xOffset = this.xCoord - location.getX(); }
this.yOffset = this.yCoord - location.getY(); return (nearestRiftLocation != null);
this.zOffset = this.zCoord - location.getZ(); }
private void updateParticleOffsets()
{
if (nearestRiftLocation != null)
{
this.xOffset = this.xCoord - nearestRiftLocation.getX();
this.yOffset = this.yCoord - nearestRiftLocation.getY();
this.zOffset = this.zCoord - nearestRiftLocation.getZ();
} }
else else
{ {