package net.minecraft.tileentity;
import com.google.common.collect.Lists;
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.entity.EntityLivingBase;
import net.minecraft.entity.IEntityLivingData;
import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.WeightedRandom;
import net.minecraft.world.World;
public abstract class MobSpawnerBaseLogic
{
/** The delay to spawn. */
private int spawnDelay = 20;
private String mobID = "Pig";
/** List of minecart to spawn. */
private final List minecartToSpawn = Lists.newArrayList();
private MobSpawnerBaseLogic.WeightedRandomMinecart randomEntity;
private double field_98287_c;
private double field_98284_d;
private int minSpawnDelay = 200;
private int maxSpawnDelay = 800;
private int spawnCount = 4;
/** Cached instance of the entity to render inside the spawner. */
private Entity cachedEntity;
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;
private static final String __OBFID = "CL_00000129";
/**
* Gets the entity name that should be spawned.
*/
private String getEntityNameToSpawn()
{
if (this.getRandomEntity() == null)
{
if (this.mobID.equals("Minecart"))
{
this.mobID = "MinecartRideable";
}
return this.mobID;
}
else
{
return this.getRandomEntity().entityType;
}
}
public void setEntityName(String p_98272_1_)
{
this.mobID = p_98272_1_;
}
/**
* Returns true if there's a player close enough to this mob spawner to activate it.
*/
private boolean isActivated()
{
BlockPos var1 = this.func_177221_b();
return this.getSpawnerWorld().func_175636_b((double)var1.getX() + 0.5D, (double)var1.getY() + 0.5D, (double)var1.getZ() + 0.5D, (double)this.activatingRangeFromPlayer);
}
public void updateSpawner()
{
if (this.isActivated())
{
BlockPos var1 = this.func_177221_b();
double var6;
if (this.getSpawnerWorld().isRemote)
{
double var2 = (double)((float)var1.getX() + this.getSpawnerWorld().rand.nextFloat());
double var4 = (double)((float)var1.getY() + this.getSpawnerWorld().rand.nextFloat());
var6 = (double)((float)var1.getZ() + this.getSpawnerWorld().rand.nextFloat());
this.getSpawnerWorld().spawnParticle(EnumParticleTypes.SMOKE_NORMAL, var2, var4, var6, 0.0D, 0.0D, 0.0D, new int[0]);
this.getSpawnerWorld().spawnParticle(EnumParticleTypes.FLAME, var2, var4, var6, 0.0D, 0.0D, 0.0D, new int[0]);
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.resetTimer();
}
if (this.spawnDelay > 0)
{
--this.spawnDelay;
return;
}
boolean var13 = false;
for (int var3 = 0; var3 < this.spawnCount; ++var3)
{
Entity var14 = EntityList.createEntityByName(this.getEntityNameToSpawn(), this.getSpawnerWorld());
if (var14 == null)
{
return;
}
int var5 = this.getSpawnerWorld().getEntitiesWithinAABB(var14.getClass(), (new AxisAlignedBB((double)var1.getX(), (double)var1.getY(), (double)var1.getZ(), (double)(var1.getX() + 1), (double)(var1.getY() + 1), (double)(var1.getZ() + 1))).expand((double)this.spawnRange, (double)this.spawnRange, (double)this.spawnRange)).size();
if (var5 >= this.maxNearbyEntities)
{
this.resetTimer();
return;
}
var6 = (double)var1.getX() + (this.getSpawnerWorld().rand.nextDouble() - this.getSpawnerWorld().rand.nextDouble()) * (double)this.spawnRange + 0.5D;
double var8 = (double)(var1.getY() + this.getSpawnerWorld().rand.nextInt(3) - 1);
double var10 = (double)var1.getZ() + (this.getSpawnerWorld().rand.nextDouble() - this.getSpawnerWorld().rand.nextDouble()) * (double)this.spawnRange + 0.5D;
EntityLiving var12 = var14 instanceof EntityLiving ? (EntityLiving)var14 : null;
var14.setLocationAndAngles(var6, var8, var10, this.getSpawnerWorld().rand.nextFloat() * 360.0F, 0.0F);
if (var12 == null || var12.getCanSpawnHere() && var12.handleLavaMovement())
{
this.func_180613_a(var14, true);
this.getSpawnerWorld().playAuxSFX(2004, var1, 0);
if (var12 != null)
{
var12.spawnExplosionParticle();
}
var13 = true;
}
}
if (var13)
{
this.resetTimer();
}
}
}
}
private Entity func_180613_a(Entity p_180613_1_, boolean p_180613_2_)
{
if (this.getRandomEntity() != null)
{
NBTTagCompound var3 = new NBTTagCompound();
p_180613_1_.writeToNBTOptional(var3);
Iterator var4 = this.getRandomEntity().field_98222_b.getKeySet().iterator();
while (var4.hasNext())
{
String var5 = (String)var4.next();
NBTBase var6 = this.getRandomEntity().field_98222_b.getTag(var5);
var3.setTag(var5, var6.copy());
}
p_180613_1_.readFromNBT(var3);
if (p_180613_1_.worldObj != null && p_180613_2_)
{
p_180613_1_.worldObj.spawnEntityInWorld(p_180613_1_);
}
NBTTagCompound var12;
for (Entity var11 = p_180613_1_; var3.hasKey("Riding", 10); var3 = var12)
{
var12 = var3.getCompoundTag("Riding");
Entity var13 = EntityList.createEntityByName(var12.getString("id"), p_180613_1_.worldObj);
if (var13 != null)
{
NBTTagCompound var7 = new NBTTagCompound();
var13.writeToNBTOptional(var7);
Iterator var8 = var12.getKeySet().iterator();
while (var8.hasNext())
{
String var9 = (String)var8.next();
NBTBase var10 = var12.getTag(var9);
var7.setTag(var9, var10.copy());
}
var13.readFromNBT(var7);
var13.setLocationAndAngles(var11.posX, var11.posY, var11.posZ, var11.rotationYaw, var11.rotationPitch);
if (p_180613_1_.worldObj != null && p_180613_2_)
{
p_180613_1_.worldObj.spawnEntityInWorld(var13);
}
var11.mountEntity(var13);
}
var11 = var13;
}
}
else if (p_180613_1_ instanceof EntityLivingBase && p_180613_1_.worldObj != null && p_180613_2_)
{
((EntityLiving)p_180613_1_).func_180482_a(p_180613_1_.worldObj.getDifficultyForLocation(new BlockPos(p_180613_1_)), (IEntityLivingData)null);
p_180613_1_.worldObj.spawnEntityInWorld(p_180613_1_);
}
return p_180613_1_;
}
private void resetTimer()
{
if (this.maxSpawnDelay <= this.minSpawnDelay)
{
this.spawnDelay = this.minSpawnDelay;
}
else
{
int var10003 = this.maxSpawnDelay - this.minSpawnDelay;
this.spawnDelay = this.minSpawnDelay + this.getSpawnerWorld().rand.nextInt(var10003);
}
if (this.minecartToSpawn.size() > 0)
{
this.setRandomEntity((MobSpawnerBaseLogic.WeightedRandomMinecart)WeightedRandom.getRandomItem(this.getSpawnerWorld().rand, this.minecartToSpawn));
}
this.func_98267_a(1);
}
public void readFromNBT(NBTTagCompound p_98270_1_)
{
this.mobID = p_98270_1_.getString("EntityId");
this.spawnDelay = p_98270_1_.getShort("Delay");
this.minecartToSpawn.clear();
if (p_98270_1_.hasKey("SpawnPotentials", 9))
{
NBTTagList var2 = p_98270_1_.getTagList("SpawnPotentials", 10);
for (int var3 = 0; var3 < var2.tagCount(); ++var3)
{
this.minecartToSpawn.add(new MobSpawnerBaseLogic.WeightedRandomMinecart(var2.getCompoundTagAt(var3)));
}
}
if (p_98270_1_.hasKey("SpawnData", 10))
{
this.setRandomEntity(new MobSpawnerBaseLogic.WeightedRandomMinecart(p_98270_1_.getCompoundTag("SpawnData"), this.mobID));
}
else
{
this.setRandomEntity((MobSpawnerBaseLogic.WeightedRandomMinecart)null);
}
if (p_98270_1_.hasKey("MinSpawnDelay", 99))
{
this.minSpawnDelay = p_98270_1_.getShort("MinSpawnDelay");
this.maxSpawnDelay = p_98270_1_.getShort("MaxSpawnDelay");
this.spawnCount = p_98270_1_.getShort("SpawnCount");
}
if (p_98270_1_.hasKey("MaxNearbyEntities", 99))
{
this.maxNearbyEntities = p_98270_1_.getShort("MaxNearbyEntities");
this.activatingRangeFromPlayer = p_98270_1_.getShort("RequiredPlayerRange");
}
if (p_98270_1_.hasKey("SpawnRange", 99))
{
this.spawnRange = p_98270_1_.getShort("SpawnRange");
}
if (this.getSpawnerWorld() != null)
{
this.cachedEntity = null;
}
}
public void writeToNBT(NBTTagCompound p_98280_1_)
{
p_98280_1_.setString("EntityId", this.getEntityNameToSpawn());
p_98280_1_.setShort("Delay", (short)this.spawnDelay);
p_98280_1_.setShort("MinSpawnDelay", (short)this.minSpawnDelay);
p_98280_1_.setShort("MaxSpawnDelay", (short)this.maxSpawnDelay);
p_98280_1_.setShort("SpawnCount", (short)this.spawnCount);
p_98280_1_.setShort("MaxNearbyEntities", (short)this.maxNearbyEntities);
p_98280_1_.setShort("RequiredPlayerRange", (short)this.activatingRangeFromPlayer);
p_98280_1_.setShort("SpawnRange", (short)this.spawnRange);
if (this.getRandomEntity() != null)
{
p_98280_1_.setTag("SpawnData", this.getRandomEntity().field_98222_b.copy());
}
if (this.getRandomEntity() != null || this.minecartToSpawn.size() > 0)
{
NBTTagList var2 = new NBTTagList();
if (this.minecartToSpawn.size() > 0)
{
Iterator var3 = this.minecartToSpawn.iterator();
while (var3.hasNext())
{
MobSpawnerBaseLogic.WeightedRandomMinecart var4 = (MobSpawnerBaseLogic.WeightedRandomMinecart)var3.next();
var2.appendTag(var4.func_98220_a());
}
}
else
{
var2.appendTag(this.getRandomEntity().func_98220_a());
}
p_98280_1_.setTag("SpawnPotentials", var2);
}
}
/**
* Sets the delay to minDelay if parameter given is 1, else return false.
*/
public boolean setDelayToMin(int p_98268_1_)
{
if (p_98268_1_ == 1 && this.getSpawnerWorld().isRemote)
{
this.spawnDelay = this.minSpawnDelay;
return true;
}
else
{
return false;
}
}
private MobSpawnerBaseLogic.WeightedRandomMinecart getRandomEntity()
{
return this.randomEntity;
}
public void setRandomEntity(MobSpawnerBaseLogic.WeightedRandomMinecart p_98277_1_)
{
this.randomEntity = p_98277_1_;
}
public abstract void func_98267_a(int p_98267_1_);
public abstract World getSpawnerWorld();
public abstract BlockPos func_177221_b();
public class WeightedRandomMinecart extends WeightedRandom.Item
{
private final NBTTagCompound field_98222_b;
private final String entityType;
private static final String __OBFID = "CL_00000130";
public WeightedRandomMinecart(NBTTagCompound p_i1945_2_)
{
this(p_i1945_2_.getCompoundTag("Properties"), p_i1945_2_.getString("Type"), p_i1945_2_.getInteger("Weight"));
}
public WeightedRandomMinecart(NBTTagCompound p_i1946_2_, String p_i1946_3_)
{
this(p_i1946_2_, p_i1946_3_, 1);
}
private WeightedRandomMinecart(NBTTagCompound p_i45757_2_, String p_i45757_3_, int p_i45757_4_)
{
super(p_i45757_4_);
if (p_i45757_3_.equals("Minecart"))
{
if (p_i45757_2_ != null)
{
p_i45757_3_ = EntityMinecart.EnumMinecartType.func_180038_a(p_i45757_2_.getInteger("Type")).func_180040_b();
}
else
{
p_i45757_3_ = "MinecartRideable";
}
}
this.field_98222_b = p_i45757_2_;
this.entityType = p_i45757_3_;
}
public NBTTagCompound func_98220_a()
{
NBTTagCompound var1 = new NBTTagCompound();
var1.setTag("Properties", this.field_98222_b);
var1.setString("Type", this.entityType);
var1.setInteger("Weight", this.itemWeight);
return var1;
}
}
}