Improved Monolith Jitter #130

Merged
SenseiKiwi merged 4 commits from master into master 2014-01-21 08:14:41 +00:00
8 changed files with 142 additions and 120 deletions

View File

@@ -424,9 +424,10 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn
}
@Override
public void initDoorTE(World world, int x, int y, int z)
public TileEntity initDoorTE(World world, int x, int y, int z)
{
TileEntity te = this.createNewTileEntity(world);
world.setBlockTileEntity(x, y, z, te);
return te;
}
}

View File

@@ -1,6 +1,7 @@
package StevenDimDoors.mod_pocketDim.blocks;
import net.minecraft.entity.Entity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
public interface IDimDoor
@@ -11,5 +12,5 @@ public interface IDimDoor
public int getDrops();
public void initDoorTE(World world, int x, int y, int z);
public TileEntity initDoorTE(World world, int x, int y, int z);
}

View File

@@ -120,9 +120,10 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit
}
@Override
public void initDoorTE(World world, int x, int y, int z)
public TileEntity initDoorTE(World world, int x, int y, int z)
{
TileEntity te = this.createNewTileEntity(world);
world.setBlockTileEntity(x, y, z, te);
return te;
}
}

View File

@@ -25,6 +25,7 @@ import net.minecraftforge.common.network.packet.DimensionRegisterPacket;
import StevenDimDoors.mod_pocketDim.DDProperties;
import StevenDimDoors.mod_pocketDim.Point3D;
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor;
import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper;
import StevenDimDoors.mod_pocketDim.items.BaseItemDoor;
import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor;
@@ -600,7 +601,9 @@ public class DDTeleporter
}
BaseItemDoor.placeDoorBlock(destWorld, link.destination().getX(), link.destination().getY()-1, link.destination().getZ(),link.getDestinationOrientation(), door);
TileEntity doorDestTE = startWorld.getBlockTileEntity(link.destination().getX(), link.destination().getY(), link.destination().getZ());
TileEntity doorDestTE = ((BaseDimDoor)door).initDoorTE(destWorld, link.destination().getX(), link.destination().getY(), link.destination().getZ());
if(doorDestTE instanceof TileEntityDimDoor)
{

View File

@@ -62,7 +62,12 @@ public abstract class DimLink
}
public int getDestinationOrientation()
{
return PocketManager.getLink(link.point.getX(), link.point.getY(), link.point.getZ(), link.point.getDimension()).link().orientation;
DimLink link = PocketManager.getLink(this.destination().getX(), this.destination().getY(), this.destination().getZ(), this.destination().getDimension());
if(link !=null)
{
return link.orientation();
}
return (this.orientation()+2)%4;
}
public boolean hasDestination()
{

View File

@@ -48,7 +48,6 @@ public class ItemRiftSignature extends Item
@Override
public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
{
//TODO- recognize doors and intelligently place rifts on them.
// We must use onItemUseFirst() instead of onItemUse() because Minecraft checks
// whether the user is in creative mode after calling onItemUse() and undoes any
// damage we might set to indicate the rift sig has been activated. Otherwise,

View File

@@ -27,16 +27,25 @@ import StevenDimDoors.mod_pocketDim.world.PocketProvider;
public class MobMonolith extends EntityFlying implements IMob
{
float soundTime = 0;
public int aggro = 0;
byte textureState = 0;
float entityCollisionReduction = 100;
float scaleFactor = 0;
int aggroMax;
int destX = 0; // unused fields?
int destY = 0;
int destZ = 0;
private float soundTime = 0;
private byte textureState = 0;
private float scaleFactor = 0;
private int aggroMax;
private static DDProperties properties = null;
public MobMonolith(World par1World)
{
super(par1World);
this.setSize(3F, 9.0F);
this.noClip=true;
this.scaleFactor = (float) ((rand.nextDouble()/2)+1);
this.aggroMax = rand.nextInt(245)+200;
if (properties == null)
properties = DDProperties.instance();
}
@Override
protected void damageEntity(DamageSource par1DamageSource, float par2)
@@ -49,19 +58,6 @@ public class MobMonolith extends EntityFlying implements IMob
{
return false;
}
public MobMonolith(World par1World)
{
super(par1World);
this.setSize(3F, 9.0F);
this.noClip=true;
this.scaleFactor= (float) ((rand.nextDouble()/2)+1);
this.aggroMax=rand.nextInt(245)+200;
if (properties == null)
properties = DDProperties.instance();
}
private static DDProperties properties = null;
@Override
public boolean canDespawn()
@@ -245,13 +241,13 @@ public class MobMonolith extends EntityFlying implements IMob
public boolean attackEntityFrom(DamageSource par1DamageSource, int par2)
{
if(!(par1DamageSource == DamageSource.inWall))
if (par1DamageSource == DamageSource.inWall)
{
this.aggro=400;
this.posY = posY + 1;
}
else
{
this.posY=posY+1;
this.aggro = this.aggroMax;
}
return false;
}

View File

@@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL12;
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
import StevenDimDoors.mod_pocketDim.ticking.MobMonolith;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderLiving;
@@ -32,8 +33,23 @@ public class RenderMobObelisk extends RenderLiving
public void doRenderLiving(EntityLiving entity, double x, double y, double z, float par8, float par9)
{
int noiseFactor = (int) (50-Math.log(MobMonolith.class.cast(entity).aggro));
this.render(entity, x+entity.worldObj.rand.nextGaussian()/noiseFactor, y+entity.worldObj.rand.nextGaussian()/noiseFactor, z+entity.worldObj.rand.nextGaussian()/noiseFactor, par8, par9);
final float minScaling = 0;
final float maxScaling = 0.1f;
final int maxAggroLevel = 500;
MobMonolith monolith = ((MobMonolith) entity);
// Use linear interpolation to scale how much jitter we want for our given aggro level
float aggroScaling = minScaling + monolith.aggro * (maxScaling - minScaling) / maxAggroLevel;
// Calculate jitter - include entity ID to give Monoliths individual jitters
float time = ((Minecraft.getSystemTime() + 0xF1234568 * monolith.entityId) % 200000) / 50.0F;
// We use random constants here on purpose just to get different wave forms
double xJitter = aggroScaling * Math.sin(1.1f * time) * Math.sin(0.8f * time);
double yJitter = aggroScaling * Math.sin(1.2f * time) * Math.sin(0.9f * time);
double zJitter = aggroScaling * Math.sin(1.3f * time) * Math.sin(0.7f * time);
// Render with jitter
this.render(entity, x + xJitter, y + yJitter, z + zJitter, par8, par9);
this.func_110827_b(entity, x, y, z, par8, par9);
}