/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.common.carts;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.ai.EntityAIArrowAttack;
import net.minecraft.entity.ai.EntityAIAttackOnCollide;
import net.minecraft.entity.monster.EntitySkeleton;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.PotionHelper;
import net.minecraft.world.World;
import mods.railcraft.common.core.RailcraftConfig;
import mods.railcraft.common.util.inventory.InvTools;
import mods.railcraft.common.util.misc.Game;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
public class EntityCartPumpkin extends EntityCartTNTWood {
private static final byte SPAWN_DIST = 2;
private static final Map<String, Integer> mobWeights = new HashMap<String, Integer>();
private static final Map<String, Integer> mobNumber = new HashMap<String, Integer>();
private static final List<String> mobs = new ArrayList<String>();
private static final List<Integer> potions = new ArrayList<Integer>();
static {
mobs.add("Skeleton");
mobs.add("Bat");
mobs.add("Witch");
mobs.add("Ghast");
mobs.add("PigZombie");
mobs.add("WitherBoss");
mobWeights.put("Skeleton", 50);
mobWeights.put("Bat", 75);
mobWeights.put("Witch", 25);
mobWeights.put("Ghast", 25);
mobWeights.put("PigZombie", 25);
mobWeights.put("WitherBoss", 5);
mobNumber.put("Skeleton", 1);
mobNumber.put("Bat", 3);
mobNumber.put("Witch", 1);
mobNumber.put("Ghast", 1);
mobNumber.put("PigZombie", 1);
mobNumber.put("WitherBoss", 1);
for (int meta = 0; meta <= 32767; ++meta) {
List effects = PotionHelper.getPotionEffects(meta, false);
if (effects != null && !effects.isEmpty())
potions.add(meta);
}
}
public EntityCartPumpkin(World world) {
super(world);
}
public EntityCartPumpkin(World world, double x, double y, double z) {
super(world, x, y, z);
}
@Override
protected void entityInit() {
super.entityInit();
setBlastRadius(1.5f);
}
@Override
public Block func_145820_n() {
return Blocks.pumpkin;
}
@Override
public List<ItemStack> getItemsDropped() {
List<ItemStack> items = new ArrayList<ItemStack>();
if (RailcraftConfig.doCartsBreakOnDrop()) {
items.add(new ItemStack(Items.minecart));
items.add(new ItemStack(Blocks.pumpkin));
} else
items.add(getCartItem());
return items;
}
@Override
protected float getMinBlastRadius() {
return 0.5f;
}
@Override
protected float getMaxBlastRadius() {
return 4;
}
@Override
public void explode() {
if (Game.isHost(getWorld())) {
worldObj.createExplosion(this, posX, posY, posZ, getBlastRadius(), true);
setDead();
spawnMob();
spawnPotion();
}
}
private String getMobToSpawn() {
while (true) {
int index = rand.nextInt(mobs.size());
String mob = mobs.get(index);
int weight = rand.nextInt(100);
if (mobWeights.get(mob) >= weight)
return mob;
}
}
private void spawnMob() {
String mobName = getMobToSpawn();
int numToSpawn = mobNumber.get(mobName);
for (int i = 0; i < numToSpawn; i++) {
Entity mob = EntityList.createEntityByName(mobName, this.worldObj);
if (mob == null)
return;
double x = posX + (rand.nextDouble() - rand.nextDouble()) * SPAWN_DIST;
double y = (double) (posY + mob.height + rand.nextInt(3));
double z = posZ + (rand.nextDouble() - rand.nextDouble()) * SPAWN_DIST;
EntityLiving living = mob instanceof EntityLiving ? (EntityLiving) mob : null;
mob.setLocationAndAngles(x, y, z, rand.nextFloat() * 360.0F, 0.0F);
if (worldObj.checkNoEntityCollision(mob.boundingBox) && worldObj.getCollidingBoundingBoxes(mob, mob.boundingBox).isEmpty() && !worldObj.isAnyLiquid(mob.boundingBox)) {
if (mob instanceof EntitySkeleton) {
EntitySkeleton skel = (EntitySkeleton) mob;
if (rand.nextInt(4) == 0) {
skel.tasks.addTask(4, new EntityAIAttackOnCollide(skel, EntityPlayer.class, 0.25F, false));
skel.setSkeletonType(1);
skel.setCurrentItemOrArmor(0, new ItemStack(Items.stone_sword));
} else {
skel.tasks.addTask(4, new EntityAIArrowAttack(skel, 0.25F, 60, 10.0F));
skel.setCurrentItemOrArmor(0, new ItemStack(Items.bow));
}
mob.setCurrentItemOrArmor(4, new ItemStack(this.rand.nextFloat() < 0.25F ? Blocks.lit_pumpkin : Blocks.pumpkin));
} else if (living != null)
living.onSpawnWithEgg(null);
this.worldObj.spawnEntityInWorld(mob);
this.worldObj.playAuxSFX(2004, (int) x, (int) y, (int) z, 0);
if (living != null)
living.spawnExplosionParticle();
}
}
}
private void spawnPotion() {
int meta = potions.get(rand.nextInt(potions.size()));
ItemStack potion = new ItemStack(Items.potionitem, 1, meta);
double x = posX + (rand.nextDouble() - rand.nextDouble()) * SPAWN_DIST;
double y = (double) (posY + 1 + rand.nextInt(3) - 1);
double z = posZ + (rand.nextDouble() - rand.nextDouble()) * SPAWN_DIST;
InvTools.dropItem(potion, worldObj, x, y, z);
}
}