2013-02-18 03:46:16 +01:00
package StevenDimDoors.mod_pocketDim ;
2013-05-28 02:08:42 +02:00
import java.util.ArrayList ;
2013-08-21 03:43:33 +02:00
import java.util.HashMap ;
2013-02-18 03:46:16 +01:00
import java.util.List ;
import java.util.Random ;
2013-08-21 07:10:28 +02:00
import StevenDimDoors.mod_pocketDim.blocks.BlockRift ;
2013-06-10 23:03:52 +02:00
import StevenDimDoors.mod_pocketDim.helpers.dimHelper ;
2013-05-28 02:08:42 +02:00
import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper ;
2013-07-26 11:30:59 +02:00
import StevenDimDoors.mod_pocketDim.ticking.MobMonolith ;
2013-05-28 02:08:42 +02:00
2013-08-22 04:13:59 +02:00
import net.minecraft.entity.DataWatcher ;
2013-02-18 03:46:16 +01:00
import net.minecraft.entity.Entity ;
import net.minecraft.entity.EntityList ;
import net.minecraft.entity.monster.EntityEnderman ;
import net.minecraft.nbt.NBTTagCompound ;
2013-08-22 04:13:59 +02:00
import net.minecraft.network.INetworkManager ;
import net.minecraft.network.packet.Packet ;
import net.minecraft.network.packet.Packet130UpdateSign ;
import net.minecraft.network.packet.Packet132TileEntityData ;
2013-02-18 03:46:16 +01:00
import net.minecraft.tileentity.TileEntity ;
import net.minecraft.util.AxisAlignedBB ;
import net.minecraft.util.MathHelper ;
public class TileEntityRift extends TileEntity
{
public int xOffset = 0 ;
public int yOffset = 0 ;
public int zOffset = 0 ;
public int distance = 0 ;
public boolean hasGrownRifts = false ;
public boolean shouldClose = false ;
//public boolean isClosing=false;
public boolean isNearRift = false ;
private int count = 200 ;
private int count2 = 0 ;
2013-08-23 04:10:10 +02:00
public int age = 0 ;
2013-08-21 03:43:33 +02:00
public HashMap < Integer , double [ ] > renderingCenters = new HashMap < Integer , double [ ] > ( ) ;
2013-02-18 03:46:16 +01:00
public LinkData nearestRiftData ;
2013-08-23 04:10:10 +02:00
public int spawnedEndermenID = 0 ;
2013-08-22 04:13:59 +02:00
Random rand ;
DataWatcher watcher = new DataWatcher ( ) ;
2013-08-21 03:43:33 +02:00
2013-02-18 03:46:16 +01:00
2013-08-23 04:10:10 +02:00
public void updateEntity ( )
{
if ( rand = = null )
{
rand = new Random ( ) ;
rand . setSeed ( this . xCoord + this . yCoord + this . zCoord ) ;
}
if ( dimHelper . instance . getLinkDataFromCoords ( xCoord , yCoord , zCoord , this . worldObj . provider . dimensionId ) = = null ) //ensures that only rifts with TEs are active
{
this . invalidate ( ) ;
if ( this . worldObj . getBlockId ( xCoord , yCoord , zCoord ) = = mod_pocketDim . blockRift . blockID ) //deletes rift TE if its behind something thats not a rift block
{
this . worldObj . setBlockToAir ( xCoord , yCoord , zCoord ) ;
this . invalidate ( ) ;
return ;
}
}
if ( this . worldObj . getBlockId ( xCoord , yCoord , zCoord ) ! = mod_pocketDim . blockRift . blockID ) //deletes rift TE if its behind something thats not a rift block
{
this . invalidate ( ) ;
return ;
}
//The code for the new rift rendering hooks in here, as well as in the ClientProxy to bind the TESR to the rift.
//It is inactive for now.
/ * *
if ( rand . nextInt ( 15 ) = = 1 )
{
age = age + 1 ;
this . calculateNextRenderQuad ( age , rand ) ;
}
this . clearBlocksOnRift ( ) ;
* * /
//This code should execute once every 10 seconds
count + + ;
if ( count > 200 )
{
this . spawnEndermen ( ) ;
this . calculateOldParticleOffset ( ) ; //this also calculates the distance for the particle stuff.
if ( distance > 1 ) //only grow if rifts are nearby
{
this . grow ( distance ) ;
}
count = 0 ;
}
if ( this . shouldClose ) //Determines if rift should render white closing particles and spread closing effect to other rifts nearby
{
closeRift ( ) ;
}
}
2013-02-18 03:46:16 +01:00
public boolean canUpdate ( )
{
return true ;
}
2013-08-23 04:10:10 +02:00
public void clearBlocksOnRift ( ) //clears blocks for the new rending effect
2013-02-18 03:46:16 +01:00
{
2013-08-22 22:04:08 +02:00
2013-08-21 03:43:33 +02:00
for ( double [ ] coord : this . renderingCenters . values ( ) )
2013-02-18 03:46:16 +01:00
{
2013-08-21 03:43:33 +02:00
int x = MathHelper . floor_double ( coord [ 0 ] + . 5 ) ;
int y = MathHelper . floor_double ( coord [ 1 ] + . 5 ) ;
int z = MathHelper . floor_double ( coord [ 2 ] + . 5 ) ;
2013-08-21 07:10:28 +02:00
2013-08-23 04:10:10 +02:00
if ( ! BlockRift . isBlockImmune ( worldObj , this . xCoord + x , this . yCoord + y , this . zCoord + z ) ) //right side
2013-08-21 07:10:28 +02:00
{
this . worldObj . setBlockToAir ( this . xCoord + x , this . yCoord + y , this . zCoord + z ) ;
}
2013-08-21 03:43:33 +02:00
2013-08-23 04:10:10 +02:00
if ( ! BlockRift . isBlockImmune ( worldObj , this . xCoord - x , this . yCoord - y , this . zCoord - z ) ) //left side
2013-08-21 07:10:28 +02:00
{
this . worldObj . setBlockToAir ( this . xCoord - x , this . yCoord - y , this . zCoord - z ) ;
}
2013-08-21 03:43:33 +02:00
}
}
public void spawnEndermen ( )
{
2013-08-23 04:10:10 +02:00
if ( this . worldObj . isRemote )
2013-08-21 03:43:33 +02:00
{
2013-08-23 04:10:10 +02:00
return ;
}
if ( dimHelper . instance . getDimData ( this . worldObj . provider . dimensionId ) ! = null ) //ensures that this rift is only spawning one enderman at a time, to prevent hordes of endermen
{
if ( this . worldObj . getEntityByID ( this . spawnedEndermenID ) ! = null )
{
if ( this . worldObj . getEntityByID ( this . spawnedEndermenID ) instanceof EntityEnderman )
{
return ;
}
}
2013-08-21 03:43:33 +02:00
2013-08-23 04:10:10 +02:00
nearestRiftData = dimHelper . instance . getDimData ( this . worldObj . provider . dimensionId ) . findNearestRift ( worldObj , 5 , xCoord , yCoord , zCoord ) ; //enderman will only spawn in groups of rifts
2013-02-18 03:46:16 +01:00
if ( nearestRiftData ! = null )
{
if ( rand . nextInt ( 30 ) = = 0 & & ! this . worldObj . isRemote )
{
List list = worldObj . getEntitiesWithinAABB ( EntityEnderman . class , AxisAlignedBB . getBoundingBox ( this . xCoord - 9 , this . yCoord - 3 , this . zCoord - 9 , this . xCoord + 9 , this . yCoord + 3 , this . zCoord + 9 ) ) ;
2013-03-23 06:25:50 +01:00
if ( list . size ( ) < 1 )
2013-02-18 03:46:16 +01:00
{
2013-08-21 07:10:28 +02:00
EntityEnderman creeper = new EntityEnderman ( worldObj ) ;
creeper . setLocationAndAngles ( this . xCoord + . 5 , this . yCoord - 1 , this . zCoord + . 5 , 5 , 6 ) ;
worldObj . spawnEntityInWorld ( creeper ) ;
2013-08-21 03:43:33 +02:00
}
2013-02-18 03:46:16 +01:00
}
}
else
{
this . isNearRift = false ;
}
2013-08-23 04:10:10 +02:00
2013-02-18 03:46:16 +01:00
}
2013-08-21 03:43:33 +02:00
}
public void closeRift ( )
{
if ( count2 > 20 & & count2 < 22 )
{
nearestRiftData = dimHelper . instance . getDimData ( this . worldObj . provider . dimensionId ) . findNearestRift ( worldObj , 10 , xCoord , yCoord , zCoord ) ;
if ( this . nearestRiftData ! = null )
{
2013-08-23 04:10:10 +02:00
TileEntityRift rift = ( TileEntityRift ) this . worldObj . getBlockTileEntity ( nearestRiftData . locXCoord , nearestRiftData . locYCoord , nearestRiftData . locZCoord ) ;
if ( rift ! = null )
{
rift . shouldClose = true ;
}
2013-08-21 03:43:33 +02:00
}
}
if ( count2 > 40 )
{
this . invalidate ( ) ;
this . worldObj . setBlock ( this . xCoord , this . yCoord , this . zCoord , 0 ) ;
2013-08-23 04:10:10 +02:00
if ( dimHelper . instance . getLinkDataFromCoords ( this . xCoord , this . yCoord , this . zCoord , this . worldObj . provider . dimensionId ) ! = null )
{
dimHelper . instance . removeLink ( this . worldObj . provider . dimensionId , this . xCoord , this . yCoord , this . zCoord ) ;
this . worldObj . playSound ( xCoord , yCoord , zCoord , " mods.DimDoors.sfx.riftClose " , ( float ) . 7 , 1 , true ) ;
2013-08-21 03:43:33 +02:00
2013-08-23 04:10:10 +02:00
}
2013-08-21 03:43:33 +02:00
}
count2 + + ;
}
2013-08-23 04:10:10 +02:00
public void calculateOldParticleOffset ( )
2013-08-21 03:43:33 +02:00
{
2013-08-23 04:10:10 +02:00
nearestRiftData = dimHelper . instance . getDimData ( this . worldObj . provider . dimensionId ) . findNearestRift ( worldObj , 5 , xCoord , yCoord , zCoord ) ;
if ( nearestRiftData ! = null )
2013-08-21 03:43:33 +02:00
{
2013-08-23 04:10:10 +02:00
this . xOffset = this . xCoord - nearestRiftData . locXCoord ;
this . yOffset = this . yCoord - nearestRiftData . locYCoord ;
this . zOffset = this . zCoord - nearestRiftData . locZCoord ;
this . distance = ( int ) ( MathHelper . abs ( xOffset ) + MathHelper . abs ( yOffset ) + MathHelper . abs ( zOffset ) ) ;
this . isNearRift = true ;
if ( ! this . worldObj . isRemote & & distance > 1 )
{
try
{
grow ( distance ) ;
}
catch ( Exception e )
{
}
}
2013-08-21 03:43:33 +02:00
}
2013-08-23 04:10:10 +02:00
}
public void grow ( int distance )
{
if ( this . worldObj . isRemote )
2013-08-21 03:43:33 +02:00
{
2013-08-23 04:10:10 +02:00
return ;
2013-08-21 03:43:33 +02:00
}
2013-08-23 04:10:10 +02:00
int growCount = 0 ;
if ( rand . nextInt ( distance * 2 ) = = 0 )
2013-08-22 22:04:08 +02:00
{
2013-08-23 04:10:10 +02:00
int x = 0 , y = 0 , z = 0 ;
while ( growCount < 100 )
{
growCount + + ;
x = this . xCoord + ( 1 - ( rand . nextInt ( 2 ) * 2 ) * rand . nextInt ( 6 ) ) ;
y = this . yCoord + ( 1 - ( rand . nextInt ( 2 ) * 2 ) * rand . nextInt ( 4 ) ) ;
z = this . zCoord + ( 1 - ( rand . nextInt ( 2 ) * 2 ) * rand . nextInt ( 6 ) ) ;
if ( this . worldObj . isAirBlock ( x , y , z ) )
{
break ;
}
}
if ( growCount < 100 )
{
LinkData link = dimHelper . instance . getLinkDataFromCoords ( this . xCoord , this . yCoord , this . zCoord , worldObj ) ;
if ( link ! = null )
{
if ( ! this . hasGrownRifts & & rand . nextInt ( 3 ) = = 0 )
{
// System.out.println(link.numberofChildren);
link . numberofChildren + + ;
dimHelper . instance . createLink ( this . worldObj . provider . dimensionId , link . destDimID , x , y , z , link . destXCoord , link . destYCoord , link . destZCoord ) . numberofChildren = link . numberofChildren + 1 ;
this . hasGrownRifts = true ;
}
}
}
2013-08-22 22:04:08 +02:00
}
2013-08-21 03:43:33 +02:00
}
public void calculateNextRenderQuad ( float age , Random rand )
{
2013-08-22 04:13:59 +02:00
int maxSize = MathHelper . floor_double ( ( Math . log ( Math . pow ( age + 1 , 2 ) ) ) ) ;
int iteration = 0 ;
while ( iteration < maxSize )
{
2013-08-23 04:10:10 +02:00
iteration + + ;
double fl = Math . log ( iteration + 1 ) / ( iteration ) ;
double [ ] coords = new double [ 4 ] ;
double noise = ( ( rand . nextGaussian ( ) ) / ( 2 + iteration / 3 + 1 ) ) ;
if ( ! this . renderingCenters . containsKey ( iteration - 1 ) )
2013-02-18 03:46:16 +01:00
{
2013-08-23 04:10:10 +02:00
if ( rand . nextBoolean ( ) )
{
coords [ 0 ] = fl * 1 . 5 ;
coords [ 1 ] = rand . nextGaussian ( ) / 5 ;
coords [ 2 ] = 0 ;
coords [ 3 ] = 1 ;
}
else
{
coords [ 0 ] = 0 ;
coords [ 1 ] = rand . nextGaussian ( ) / 5 ;
coords [ 2 ] = fl * 1 . 5 ;
coords [ 3 ] = 0 ;
}
this . renderingCenters . put ( iteration - 1 , coords ) ;
iteration - - ;
2013-02-18 03:46:16 +01:00
}
2013-08-23 04:10:10 +02:00
else if ( ! this . renderingCenters . containsKey ( iteration ) )
2013-02-18 03:46:16 +01:00
{
2013-08-23 04:10:10 +02:00
if ( this . renderingCenters . get ( iteration - 1 ) [ 3 ] = = 0 )
{
coords [ 0 ] = noise / 2 + this . renderingCenters . get ( iteration - 1 ) [ 0 ] ;
coords [ 1 ] = noise / 2 + this . renderingCenters . get ( iteration - 1 ) [ 1 ] ;
coords [ 2 ] = this . renderingCenters . get ( iteration - 1 ) [ 2 ] + fl ;
coords [ 3 ] = 0 ;
}
else
{
coords [ 0 ] = this . renderingCenters . get ( iteration - 1 ) [ 0 ] + fl ;
coords [ 1 ] = noise / 2 + this . renderingCenters . get ( iteration - 1 ) [ 1 ] ;
coords [ 2 ] = noise / 2 + this . renderingCenters . get ( iteration - 1 ) [ 2 ] ;
coords [ 3 ] = 1 ;
}
this . renderingCenters . put ( iteration , coords ) ;
}
2013-02-18 03:46:16 +01:00
}
}
2013-08-21 03:43:33 +02:00
@Override
public boolean shouldRenderInPass ( int pass )
{
return pass = = 1 ;
}
2013-02-18 03:46:16 +01:00
@Override
public void readFromNBT ( NBTTagCompound nbt )
{
2013-08-23 04:10:10 +02:00
super . readFromNBT ( nbt ) ;
this . renderingCenters = new HashMap < Integer , double [ ] > ( ) ;
this . count = nbt . getInteger ( " count " ) ;
this . count2 = nbt . getInteger ( " count2 " ) ;
this . xOffset = nbt . getInteger ( " xOffset " ) ;
this . yOffset = nbt . getInteger ( " yOffset " ) ;
this . zOffset = nbt . getInteger ( " zOffset " ) ;
this . hasGrownRifts = nbt . getBoolean ( " grownRifts " ) ;
this . age = nbt . getInteger ( " age " ) ;
this . shouldClose = nbt . getBoolean ( " shouldClose " ) ;
this . spawnedEndermenID = nbt . getInteger ( " spawnedEndermenID " ) ;
2013-02-18 03:46:16 +01:00
}
@Override
public void writeToNBT ( NBTTagCompound nbt )
{
2013-08-23 04:10:10 +02:00
super . writeToNBT ( nbt ) ;
2013-08-21 03:43:33 +02:00
nbt . setInteger ( " hashMapSize " , this . renderingCenters . size ( ) ) ;
2013-08-22 04:13:59 +02:00
nbt . setInteger ( " age " , this . age ) ;
2013-02-18 03:46:16 +01:00
nbt . setInteger ( " count " , this . count ) ;
nbt . setInteger ( " count2 " , this . count2 ) ;
2013-08-23 04:10:10 +02:00
nbt . setBoolean ( " grownRifts " , this . hasGrownRifts ) ;
nbt . setInteger ( " xOffset " , this . xOffset ) ;
nbt . setInteger ( " yOffset " , this . yOffset ) ;
nbt . setInteger ( " zOffset " , this . zOffset ) ;
2013-02-18 03:46:16 +01:00
nbt . setBoolean ( " shouldClose " , this . shouldClose ) ;
2013-08-23 04:10:10 +02:00
nbt . setInteger ( " spawnedEndermenID " , this . spawnedEndermenID ) ;
2013-02-18 03:46:16 +01:00
}
2013-08-22 04:13:59 +02:00
@Override
2013-08-23 04:10:10 +02:00
public Packet getDescriptionPacket ( )
{
Packet132TileEntityData packet = new Packet132TileEntityData ( ) ;
packet . actionType = 0 ;
packet . xPosition = xCoord ;
packet . yPosition = yCoord ;
packet . zPosition = zCoord ;
2013-08-22 04:13:59 +02:00
2013-08-23 04:10:10 +02:00
NBTTagCompound nbt = new NBTTagCompound ( ) ;
writeToNBT ( nbt ) ;
packet . customParam1 = nbt ;
return packet ;
2013-08-22 04:13:59 +02:00
}
@Override
2013-08-23 04:10:10 +02:00
public void onDataPacket ( INetworkManager net , Packet132TileEntityData pkt )
{
readFromNBT ( pkt . customParam1 ) ;
2013-08-22 04:13:59 +02:00
}
2013-02-18 03:46:16 +01:00
}