package net.minecraft.tileentity;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.EntityLiving;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.WeightedRandom;
import net.minecraft.world.World;
public abstract class MobSpawnerBaseLogic
{
/** The delay to spawn. */
public int spawnDelay = 20;
private String mobID = "Pig";
/** List of minecart to spawn. */
private List minecartToSpawn = null;
private WeightedRandomMinecart randomMinecart = null;
public double field_98287_c;
public double field_98284_d = 0.0D;
private int minSpawnDelay = 200;
private int maxSpawnDelay = 800;
/** A counter for spawn tries. */
private int spawnCount = 4;
private Entity field_98291_j;
private int maxNearbyEntities = 6;
/** The distance from which a player activates the spawner. */
private int activatingRangeFromPlayer = 16;
/** The range coefficient for spawning entities around. */
private int spawnRange = 4;
/**
* Gets the entity name that should be spawned.
*/
public String getEntityNameToSpawn()
{
if (this.getRandomMinecart() == null)
{
if (this.mobID.equals("Minecart"))
{
this.mobID = "MinecartRideable";
}
return this.mobID;
}
else
{
return this.getRandomMinecart().minecartName;
}
}
public void setMobID(String par1Str)
{
this.mobID = par1Str;
}
/**
* Returns true if there's a player close enough to this mob spawner to activate it.
*/
public boolean canRun()
{
return this.getSpawnerWorld().getClosestPlayer((double)this.getSpawnerX() + 0.5D, (double)this.getSpawnerY() + 0.5D, (double)this.getSpawnerZ() + 0.5D, (double)this.activatingRangeFromPlayer) != null;
}
public void updateSpawner()
{
if (this.canRun())
{
double d0;
if (this.getSpawnerWorld().isRemote)
{
double d1 = (double)((float)this.getSpawnerX() + this.getSpawnerWorld().rand.nextFloat());
double d2 = (double)((float)this.getSpawnerY() + this.getSpawnerWorld().rand.nextFloat());
d0 = (double)((float)this.getSpawnerZ() + this.getSpawnerWorld().rand.nextFloat());
this.getSpawnerWorld().spawnParticle("smoke", d1, d2, d0, 0.0D, 0.0D, 0.0D);
this.getSpawnerWorld().spawnParticle("flame", d1, d2, d0, 0.0D, 0.0D, 0.0D);
if (this.spawnDelay > 0)
{
--this.spawnDelay;
}
this.field_98284_d = this.field_98287_c;
this.field_98287_c = (this.field_98287_c + (double)(1000.0F / ((float)this.spawnDelay + 200.0F))) % 360.0D;
}
else
{
if (this.spawnDelay == -1)
{
this.func_98273_j();
}
if (this.spawnDelay > 0)
{
--this.spawnDelay;
return;
}
boolean flag = false;
for (int i = 0; i < this.spawnCount; ++i)
{
Entity entity = EntityList.createEntityByName(this.getEntityNameToSpawn(), this.getSpawnerWorld());
if (entity == null)
{
return;
}
int j = this.getSpawnerWorld().getEntitiesWithinAABB(entity.getClass(), AxisAlignedBB.getAABBPool().getAABB((double)this.getSpawnerX(), (double)this.getSpawnerY(), (double)this.getSpawnerZ(), (double)(this.getSpawnerX() + 1), (double)(this.getSpawnerY() + 1), (double)(this.getSpawnerZ() + 1)).expand((double)(this.spawnRange * 2), 4.0D, (double)(this.spawnRange * 2))).size();
if (j >= this.maxNearbyEntities)
{
this.func_98273_j();
return;
}
d0 = (double)this.getSpawnerX() + (this.getSpawnerWorld().rand.nextDouble() - this.getSpawnerWorld().rand.nextDouble()) * (double)this.spawnRange;
double d3 = (double)(this.getSpawnerY() + this.getSpawnerWorld().rand.nextInt(3) - 1);
double d4 = (double)this.getSpawnerZ() + (this.getSpawnerWorld().rand.nextDouble() - this.getSpawnerWorld().rand.nextDouble()) * (double)this.spawnRange;
EntityLiving entityliving = entity instanceof EntityLiving ? (EntityLiving)entity : null;
entity.setLocationAndAngles(d0, d3, d4, this.getSpawnerWorld().rand.nextFloat() * 360.0F, 0.0F);
if (entityliving == null || entityliving.getCanSpawnHere())
{
this.func_98265_a(entity);
this.getSpawnerWorld().playAuxSFX(2004, this.getSpawnerX(), this.getSpawnerY(), this.getSpawnerZ(), 0);
if (entityliving != null)
{
entityliving.spawnExplosionParticle();
}
flag = true;
}
}
if (flag)
{
this.func_98273_j();
}
}
}
}
public Entity func_98265_a(Entity par1Entity)
{
if (this.getRandomMinecart() != null)
{
NBTTagCompound nbttagcompound = new NBTTagCompound();
par1Entity.addEntityID(nbttagcompound);
Iterator iterator = this.getRandomMinecart().field_98222_b.getTags().iterator();
while (iterator.hasNext())
{
NBTBase nbtbase = (NBTBase)iterator.next();
nbttagcompound.setTag(nbtbase.getName(), nbtbase.copy());
}
par1Entity.readFromNBT(nbttagcompound);
if (par1Entity.worldObj != null)
{
par1Entity.worldObj.spawnEntityInWorld(par1Entity);
}
NBTTagCompound nbttagcompound1;
for (Entity entity1 = par1Entity; nbttagcompound.hasKey("Riding"); nbttagcompound = nbttagcompound1)
{
nbttagcompound1 = nbttagcompound.getCompoundTag("Riding");
Entity entity2 = EntityList.createEntityByName(nbttagcompound1.getString("id"), this.getSpawnerWorld());
if (entity2 != null)
{
NBTTagCompound nbttagcompound2 = new NBTTagCompound();
entity2.addEntityID(nbttagcompound2);
Iterator iterator1 = nbttagcompound1.getTags().iterator();
while (iterator1.hasNext())
{
NBTBase nbtbase1 = (NBTBase)iterator1.next();
nbttagcompound2.setTag(nbtbase1.getName(), nbtbase1.copy());
}
entity2.readFromNBT(nbttagcompound2);
entity2.setLocationAndAngles(entity1.posX, entity1.posY, entity1.posZ, entity1.rotationYaw, entity1.rotationPitch);
this.getSpawnerWorld().spawnEntityInWorld(entity2);
entity1.mountEntity(entity2);
}
entity1 = entity2;
}
}
else if (par1Entity instanceof EntityLiving && par1Entity.worldObj != null)
{
((EntityLiving)par1Entity).initCreature();
this.getSpawnerWorld().spawnEntityInWorld(par1Entity);
}
return par1Entity;
}
private void func_98273_j()
{
if (this.maxSpawnDelay <= this.minSpawnDelay)
{
this.spawnDelay = this.minSpawnDelay;
}
else
{
int i = this.maxSpawnDelay - this.minSpawnDelay;
this.spawnDelay = this.minSpawnDelay + this.getSpawnerWorld().rand.nextInt(i);
}
if (this.minecartToSpawn != null && this.minecartToSpawn.size() > 0)
{
this.setRandomMinecart((WeightedRandomMinecart)WeightedRandom.getRandomItem(this.getSpawnerWorld().rand, this.minecartToSpawn));
}
this.func_98267_a(1);
}
public void readFromNBT(NBTTagCompound par1NBTTagCompound)
{
this.mobID = par1NBTTagCompound.getString("EntityId");
this.spawnDelay = par1NBTTagCompound.getShort("Delay");
if (par1NBTTagCompound.hasKey("SpawnPotentials"))
{
this.minecartToSpawn = new ArrayList();
NBTTagList nbttaglist = par1NBTTagCompound.getTagList("SpawnPotentials");
for (int i = 0; i < nbttaglist.tagCount(); ++i)
{
this.minecartToSpawn.add(new WeightedRandomMinecart(this, (NBTTagCompound)nbttaglist.tagAt(i)));
}
}
else
{
this.minecartToSpawn = null;
}
if (par1NBTTagCompound.hasKey("SpawnData"))
{
this.setRandomMinecart(new WeightedRandomMinecart(this, par1NBTTagCompound.getCompoundTag("SpawnData"), this.mobID));
}
else
{
this.setRandomMinecart((WeightedRandomMinecart)null);
}
if (par1NBTTagCompound.hasKey("MinSpawnDelay"))
{
this.minSpawnDelay = par1NBTTagCompound.getShort("MinSpawnDelay");
this.maxSpawnDelay = par1NBTTagCompound.getShort("MaxSpawnDelay");
this.spawnCount = par1NBTTagCompound.getShort("SpawnCount");
}
if (par1NBTTagCompound.hasKey("MaxNearbyEntities"))
{
this.maxNearbyEntities = par1NBTTagCompound.getShort("MaxNearbyEntities");
this.activatingRangeFromPlayer = par1NBTTagCompound.getShort("RequiredPlayerRange");
}
if (par1NBTTagCompound.hasKey("SpawnRange"))
{
this.spawnRange = par1NBTTagCompound.getShort("SpawnRange");
}
if (this.getSpawnerWorld() != null && this.getSpawnerWorld().isRemote)
{
this.field_98291_j = null;
}
}
public void writeToNBT(NBTTagCompound par1NBTTagCompound)
{
par1NBTTagCompound.setString("EntityId", this.getEntityNameToSpawn());
par1NBTTagCompound.setShort("Delay", (short)this.spawnDelay);
par1NBTTagCompound.setShort("MinSpawnDelay", (short)this.minSpawnDelay);
par1NBTTagCompound.setShort("MaxSpawnDelay", (short)this.maxSpawnDelay);
par1NBTTagCompound.setShort("SpawnCount", (short)this.spawnCount);
par1NBTTagCompound.setShort("MaxNearbyEntities", (short)this.maxNearbyEntities);
par1NBTTagCompound.setShort("RequiredPlayerRange", (short)this.activatingRangeFromPlayer);
par1NBTTagCompound.setShort("SpawnRange", (short)this.spawnRange);
if (this.getRandomMinecart() != null)
{
par1NBTTagCompound.setCompoundTag("SpawnData", (NBTTagCompound)this.getRandomMinecart().field_98222_b.copy());
}
if (this.getRandomMinecart() != null || this.minecartToSpawn != null && this.minecartToSpawn.size() > 0)
{
NBTTagList nbttaglist = new NBTTagList();
if (this.minecartToSpawn != null && this.minecartToSpawn.size() > 0)
{
Iterator iterator = this.minecartToSpawn.iterator();
while (iterator.hasNext())
{
WeightedRandomMinecart weightedrandomminecart = (WeightedRandomMinecart)iterator.next();
nbttaglist.appendTag(weightedrandomminecart.func_98220_a());
}
}
else
{
nbttaglist.appendTag(this.getRandomMinecart().func_98220_a());
}
par1NBTTagCompound.setTag("SpawnPotentials", nbttaglist);
}
}
/**
* Sets the delay to minDelay if parameter given is 1, else return false.
*/
public boolean setDelayToMin(int par1)
{
if (par1 == 1 && this.getSpawnerWorld().isRemote)
{
this.spawnDelay = this.minSpawnDelay;
return true;
}
else
{
return false;
}
}
@SideOnly(Side.CLIENT)
public Entity func_98281_h()
{
if (this.field_98291_j == null)
{
Entity entity = EntityList.createEntityByName(this.getEntityNameToSpawn(), (World)null);
entity = this.func_98265_a(entity);
this.field_98291_j = entity;
}
return this.field_98291_j;
}
public WeightedRandomMinecart getRandomMinecart()
{
return this.randomMinecart;
}
public void setRandomMinecart(WeightedRandomMinecart par1WeightedRandomMinecart)
{
this.randomMinecart = par1WeightedRandomMinecart;
}
public abstract void func_98267_a(int i);
public abstract World getSpawnerWorld();
public abstract int getSpawnerX();
public abstract int getSpawnerY();
public abstract int getSpawnerZ();
}