package openblocks.common.tileentity;
import com.google.common.base.Strings;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.monster.EntitySkeleton;
import net.minecraft.entity.monster.IMob;
import net.minecraft.entity.passive.EntityBat;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IChatComponent;
import net.minecraft.world.EnumDifficulty;
import net.minecraft.world.storage.WorldInfo;
import net.minecraftforge.common.util.FakePlayer;
import openblocks.Config;
import openmods.api.IActivateAwareTile;
import openmods.api.IAddAwareTile;
import openmods.api.INeighbourAwareTile;
import openmods.api.IPlacerAwareTile;
import openmods.inventory.GenericInventory;
import openmods.inventory.IInventoryProvider;
import openmods.sync.SyncableBoolean;
import openmods.sync.SyncableString;
import openmods.tileentity.SyncedTileEntity;
import openmods.utils.BlockUtils;
public class TileEntityGrave extends SyncedTileEntity implements IPlacerAwareTile, IInventoryProvider, INeighbourAwareTile, IActivateAwareTile, IAddAwareTile {
private static final String TAG_MESSAGE = "Message";
private SyncableString perishedUsername;
public SyncableBoolean onSoil;
private IChatComponent deathMessage;
private GenericInventory inventory = registerInventoryCallback(new GenericInventory("grave", false, 1));
public TileEntityGrave() {}
@Override
protected void createSyncedFields() {
perishedUsername = new SyncableString();
onSoil = new SyncableBoolean(true);
}
@Override
@SuppressWarnings("unchecked")
public void updateEntity() {
super.updateEntity();
if (!worldObj.isRemote) {
if (Config.spawnSkeletons && worldObj.difficultySetting != EnumDifficulty.PEACEFUL && worldObj.rand.nextDouble() < Config.skeletonSpawnRate) {
List<Entity> mobs = worldObj.getEntitiesWithinAABB(IMob.class, getBB().expand(7, 7, 7));
if (mobs.size() < 5) {
double chance = worldObj.rand.nextDouble();
EntityLiving living = chance < 0.5? new EntitySkeleton(worldObj) : new EntityBat(worldObj);
living.setPositionAndRotation(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, worldObj.rand.nextFloat() * 360, 0);
if (living.getCanSpawnHere()) {
worldObj.spawnEntityInWorld(living);
}
}
}
}
}
public String getUsername() {
return perishedUsername.getValue();
}
public void setDeathMessage(IChatComponent msg) {
deathMessage = msg.createCopy();
}
public void setUsername(String username) {
this.perishedUsername.setValue(username);
}
public void setLoot(IInventory invent) {
inventory.clearAndSetSlotCount(invent.getSizeInventory());
inventory.copyFrom(invent);
}
public boolean isOnSoil() {
return onSoil.get();
}
@Override
public void onBlockPlacedBy(EntityLivingBase placer, ItemStack stack) {
if (!worldObj.isRemote) {
if ((placer instanceof EntityPlayer) && !(placer instanceof FakePlayer)) {
EntityPlayer player = (EntityPlayer)placer;
if (stack.hasDisplayName()) setUsername(stack.getDisplayName());
else setUsername(player.getGameProfile().getName());
if (player.capabilities.isCreativeMode) setLoot(player.inventory);
updateBlockBelow();
sync();
}
}
}
@Override
public void writeToNBT(NBTTagCompound tag) {
super.writeToNBT(tag);
inventory.writeToNBT(tag);
if (deathMessage != null) {
String serialized = IChatComponent.Serializer.func_150696_a(deathMessage);
tag.setString(TAG_MESSAGE, serialized);
}
}
@Override
public void readFromNBT(NBTTagCompound tag) {
super.readFromNBT(tag);
inventory.readFromNBT(tag);
String serializedMsg = tag.getString(TAG_MESSAGE);
if (!Strings.isNullOrEmpty(serializedMsg)) {
deathMessage = IChatComponent.Serializer.func_150699_a(serializedMsg);
}
}
@Override
public IInventory getInventory() {
return inventory;
}
protected void updateBlockBelow() {
Block block = worldObj.getBlock(xCoord, yCoord - 1, zCoord);
onSoil.set(block == Blocks.dirt || block == Blocks.grass);
}
@Override
public void onAdded() {
updateBlockBelow();
}
@Override
public void onNeighbourChanged(Block block) {
updateBlockBelow();
sync();
}
@Override
@SideOnly(Side.CLIENT)
public AxisAlignedBB getRenderBoundingBox() {
return AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 1, zCoord + 1);
}
@Override
public boolean onBlockActivated(EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
if (player.worldObj.isRemote) return false;
ItemStack held = player.getHeldItem();
if (held != null && held.getItem().getToolClasses(held).contains("shovel")) {
robGrave(player, held);
return true;
}
if (deathMessage != null) player.addChatMessage(deathMessage);
return true;
}
protected void robGrave(EntityPlayer player, ItemStack held) {
boolean dropped = false;
for (int i = 0; i < inventory.getSizeInventory(); i++) {
final ItemStack stack = inventory.getStackInSlot(i);
if (stack != null) {
dropped = true;
BlockUtils.dropItemStackInWorld(worldObj, xCoord, yCoord, zCoord, stack);
}
}
inventory.clearAndSetSlotCount(0);
if (dropped) {
worldObj.playAuxSFXAtEntity(null, 2001, xCoord, yCoord, zCoord, Block.getIdFromBlock(Blocks.dirt));
if (worldObj.rand.nextDouble() < Config.graveSpecialAction) ohNoes(player);
held.damageItem(2, player);
}
}
private void ohNoes(EntityPlayer player) {
worldObj.playSoundAtEntity(player, "openblocks:grave.rob", 1, 1);
final WorldInfo worldInfo = worldObj.getWorldInfo();
worldInfo.setThunderTime(35 * 20);
worldInfo.setRainTime(35 * 20);
worldInfo.setThundering(true);
worldInfo.setRaining(true);
}
}