tcr/common/src/main/java/common/init/DispenserRegistry.java

412 lines
19 KiB
Java
Executable file

package common.init;
import common.block.Block;
import common.block.Material;
import common.block.liquid.BlockDynamicLiquid;
import common.block.liquid.BlockLiquid;
import common.block.tech.BlockDispenser;
import common.block.tech.BlockTNT;
import common.color.DyeColor;
import common.dispenser.BehaviorDefaultDispenseItem;
import common.dispenser.BehaviorProjectileDispense;
import common.dispenser.IBehaviorDispenseItem;
import common.dispenser.IBlockSource;
import common.dispenser.IPosition;
import common.entity.Entity;
import common.entity.item.EntityBoat;
import common.entity.item.EntityFireworks;
import common.entity.item.EntityTnt;
import common.entity.item.EntityXpBottle;
import common.entity.projectile.EntityArrow;
import common.entity.projectile.EntityDie;
import common.entity.projectile.EntityDynamite;
import common.entity.projectile.EntityEgg;
import common.entity.projectile.EntityFireCharge;
import common.entity.projectile.EntityPotion;
import common.entity.projectile.EntitySnowball;
import common.entity.types.EntityLiving;
import common.entity.types.IProjectile;
import common.item.Item;
import common.item.ItemBucket;
import common.item.ItemDie;
import common.item.ItemDye;
import common.item.ItemMonsterPlacer;
import common.item.ItemPotion;
import common.item.ItemStack;
import common.rng.Random;
import common.tileentity.TileEntityDispenser;
import common.util.BlockPos;
import common.util.ExtMath;
import common.util.Facing;
import common.util.RegistryDefaulted;
import common.world.State;
import common.world.World;
public abstract class DispenserRegistry {
public static final RegistryDefaulted<Item, IBehaviorDispenseItem> REGISTRY = new RegistryDefaulted<Item, IBehaviorDispenseItem>(new BehaviorDefaultDispenseItem());
static void register() {
REGISTRY.putObject(Items.arrow, new BehaviorProjectileDispense()
{
protected IProjectile getProjectileEntity(World worldIn, IPosition position, ItemStack item)
{
EntityArrow entityarrow = new EntityArrow(worldIn, position.getX(), position.getY(), position.getZ());
entityarrow.canBePickedUp = 1;
return entityarrow;
}
});
REGISTRY.putObject(Items.egg, new BehaviorProjectileDispense()
{
protected IProjectile getProjectileEntity(World worldIn, IPosition position, ItemStack item)
{
return new EntityEgg(worldIn, position.getX(), position.getY(), position.getZ());
}
});
REGISTRY.putObject(Items.die, new BehaviorProjectileDispense()
{
protected IProjectile getProjectileEntity(World worldIn, IPosition position, ItemStack item)
{
return new EntityDie(worldIn, position.getX(), position.getY(), position.getZ(),
ItemDie.DIE_SIDES[ExtMath.clampi(item.getMetadata(), 0, ItemDie.DIE_SIDES.length - 1)]);
}
protected float getInaccuracy()
{
return super.getInaccuracy() * 5.0F;
}
protected float getVelocity()
{
return super.getVelocity() * 0.25F;
}
});
REGISTRY.putObject(Items.dynamite, new BehaviorProjectileDispense()
{
protected IProjectile getProjectileEntity(World worldIn, IPosition position, ItemStack item)
{
return new EntityDynamite(worldIn, position.getX(), position.getY(), position.getZ(), item.getMetadata());
}
});
REGISTRY.putObject(Items.snowball, new BehaviorProjectileDispense()
{
protected IProjectile getProjectileEntity(World worldIn, IPosition position, ItemStack item)
{
return new EntitySnowball(worldIn, position.getX(), position.getY(), position.getZ());
}
});
REGISTRY.putObject(Items.experience_bottle, new BehaviorProjectileDispense()
{
protected IProjectile getProjectileEntity(World worldIn, IPosition position, ItemStack item)
{
return new EntityXpBottle(worldIn, position.getX(), position.getY(), position.getZ());
}
protected float getInaccuracy()
{
return super.getInaccuracy() * 0.5F;
}
protected float getVelocity()
{
return super.getVelocity() * 1.25F;
}
});
REGISTRY.putObject(Items.potion, new IBehaviorDispenseItem()
{
private final BehaviorDefaultDispenseItem field_150843_b = new BehaviorDefaultDispenseItem();
public ItemStack dispense(IBlockSource source, final ItemStack stack)
{
return ItemPotion.isSplash(stack.getMetadata()) ? (new BehaviorProjectileDispense()
{
protected IProjectile getProjectileEntity(World worldIn, IPosition position, ItemStack item)
{
return new EntityPotion(worldIn, position.getX(), position.getY(), position.getZ(), stack.copy());
}
protected float getInaccuracy()
{
return super.getInaccuracy() * 0.5F;
}
protected float getVelocity()
{
return super.getVelocity() * 1.25F;
}
}).dispense(source, stack): this.field_150843_b.dispense(source, stack);
}
});
IBehaviorDispenseItem disp = new BehaviorDefaultDispenseItem()
{
public ItemStack dispenseStack(IBlockSource source, ItemStack stack)
{
Facing enumfacing = BlockDispenser.getFacing(source.getBlockMetadata());
double d0 = source.getX() + (double)enumfacing.getFrontOffsetX();
double d1 = (double)((float)source.getBlockPos().getY() + 0.2F);
double d2 = source.getZ() + (double)enumfacing.getFrontOffsetZ();
Entity entity = ItemMonsterPlacer.spawnCreature(source.getWorld(), ((ItemMonsterPlacer)stack.getItem()).getSpawnedId(),
d0, d1, d2, false);
if (entity instanceof EntityLiving && stack.hasDisplayName())
{
((EntityLiving)entity).setCustomNameTag(stack.getDisplayName());
}
stack.splitStack(1);
return stack;
}
};
for(EntityInfo egg : EntityRegistry.SPAWN_EGGS.values()) {
REGISTRY.putObject(ItemRegistry.getRegisteredItem(egg.id().toLowerCase() + "_spawner"),
disp);
}
REGISTRY.putObject(Items.fireworks, new BehaviorDefaultDispenseItem()
{
public ItemStack dispenseStack(IBlockSource source, ItemStack stack)
{
Facing enumfacing = BlockDispenser.getFacing(source.getBlockMetadata());
double d0 = source.getX() + (double)enumfacing.getFrontOffsetX();
double d1 = (double)((float)source.getBlockPos().getY() + 0.2F);
double d2 = source.getZ() + (double)enumfacing.getFrontOffsetZ();
EntityFireworks entityfireworkrocket = new EntityFireworks(source.getWorld(), d0, d1, d2, stack);
source.getWorld().spawnEntityInWorld(entityfireworkrocket);
stack.splitStack(1);
return stack;
}
protected void playDispenseSound(IBlockSource source)
{
source.getWorld().playAuxSFX(1002, source.getBlockPos(), 0);
}
});
REGISTRY.putObject(Items.fire_charge, new BehaviorDefaultDispenseItem()
{
public ItemStack dispenseStack(IBlockSource source, ItemStack stack)
{
Facing enumfacing = BlockDispenser.getFacing(source.getBlockMetadata());
IPosition iposition = BlockDispenser.getDispensePosition(source);
double d0 = iposition.getX() + (double)((float)enumfacing.getFrontOffsetX() * 0.3F);
double d1 = iposition.getY() + (double)((float)enumfacing.getFrontOffsetY() * 0.3F);
double d2 = iposition.getZ() + (double)((float)enumfacing.getFrontOffsetZ() * 0.3F);
World world = source.getWorld();
Random random = world.rand;
double d3 = random.gaussian() * 0.05D + (double)enumfacing.getFrontOffsetX();
double d4 = random.gaussian() * 0.05D + (double)enumfacing.getFrontOffsetY();
double d5 = random.gaussian() * 0.05D + (double)enumfacing.getFrontOffsetZ();
world.spawnEntityInWorld(new EntityFireCharge(world, d0, d1, d2, d3, d4, d5));
stack.splitStack(1);
return stack;
}
protected void playDispenseSound(IBlockSource source)
{
source.getWorld().playAuxSFX(1009, source.getBlockPos(), 0);
}
});
REGISTRY.putObject(Items.boat, new BehaviorDefaultDispenseItem()
{
private final BehaviorDefaultDispenseItem field_150842_b = new BehaviorDefaultDispenseItem();
public ItemStack dispenseStack(IBlockSource source, ItemStack stack)
{
Facing enumfacing = BlockDispenser.getFacing(source.getBlockMetadata());
World world = source.getWorld();
double d0 = source.getX() + (double)((float)enumfacing.getFrontOffsetX() * 1.125F);
double d1 = source.getY() + (double)((float)enumfacing.getFrontOffsetY() * 1.125F);
double d2 = source.getZ() + (double)((float)enumfacing.getFrontOffsetZ() * 1.125F);
BlockPos blockpos = source.getBlockPos().offset(enumfacing);
Block block = world.getState(blockpos).getBlock();
double d3;
if (block.getMaterial().isColdLiquid())
{
d3 = 1.0D;
}
else
{
if (block != Blocks.air || !world.getState(blockpos.down()).getBlock().getMaterial().isColdLiquid())
{
return this.field_150842_b.dispense(source, stack);
}
d3 = 0.0D;
}
EntityBoat entityboat = new EntityBoat(world, d0, d1 + d3, d2);
world.spawnEntityInWorld(entityboat);
stack.splitStack(1);
return stack;
}
protected void playDispenseSound(IBlockSource source)
{
source.getWorld().playAuxSFX(1000, source.getBlockPos(), 0);
}
});
IBehaviorDispenseItem ibehaviordispenseitem = new BehaviorDefaultDispenseItem()
{
private final BehaviorDefaultDispenseItem field_150841_b = new BehaviorDefaultDispenseItem();
public ItemStack dispenseStack(IBlockSource source, ItemStack stack)
{
ItemBucket itembucket = (ItemBucket)stack.getItem();
BlockPos blockpos = source.getBlockPos().offset(BlockDispenser.getFacing(source.getBlockMetadata()));
if (itembucket.tryPlaceContainedLiquid(source.getWorld(), blockpos))
{
stack.setItem(Items.bucket);
stack.size = 1;
return stack;
}
else
{
return this.field_150841_b.dispense(source, stack);
}
}
};
// REGISTRY.putObject(Items.lava_bucket, ibehaviordispenseitem);
// REGISTRY.putObject(Items.water_bucket, ibehaviordispenseitem);
// REGISTRY.putObject(Items.fluid_bucket, ibehaviordispenseitem);
for(int z = 0; z < FluidRegistry.getNumFluids(); z++) {
REGISTRY.putObject(ItemRegistry.getRegisteredItem(BlockRegistry.getNameFromBlock(FluidRegistry.getStaticBlock(z)) +
"_bucket"), ibehaviordispenseitem);
}
REGISTRY.putObject(Items.bucket, new BehaviorDefaultDispenseItem()
{
private final BehaviorDefaultDispenseItem field_150840_b = new BehaviorDefaultDispenseItem();
public ItemStack dispenseStack(IBlockSource source, ItemStack stack)
{
World world = source.getWorld();
BlockPos blockpos = source.getBlockPos().offset(BlockDispenser.getFacing(source.getBlockMetadata()));
State iblockstate = world.getState(blockpos);
Block block = iblockstate.getBlock();
Material material = block.getMaterial();
Item item;
// int meta = 0;
// if (Material.water.equals(material) && block instanceof BlockLiquid && ((Integer)iblockstate.getValue(BlockLiquid.LEVEL)).intValue() == 0)
// {
// item = Items.water_bucket;
// }
// else if (Material.lava.equals(material) && block instanceof BlockLiquid && ((Integer)iblockstate.getValue(BlockLiquid.LEVEL)).intValue() == 0)
// {
// item = Items.lava_bucket;
// }
// else
if (material.isLiquid() && block instanceof BlockLiquid && ((Integer)iblockstate.getValue(BlockLiquid.LEVEL)).intValue() == 0)
{
item = ItemRegistry.getRegisteredItem(BlockRegistry.getNameFromBlock(block instanceof BlockDynamicLiquid
? FluidRegistry.getStaticBlock((BlockDynamicLiquid)block) : block) +
"_bucket"); // Items.fluid_bucket;
// meta = FluidRegistry.getFluidMeta((BlockLiquid)iblockstate.getBlock());
}
else
{
// if (!Material.lava.equals(material) || !(block instanceof BlockLiquid) || ((Integer)iblockstate.getValue(BlockLiquid.LEVEL)).intValue() != 0)
// {
return super.dispenseStack(source, stack);
// }
//
// item = Items.lava_bucket;
}
world.setBlockToAir(blockpos);
if (--stack.size == 0)
{
stack.setItem(item);
stack.size = 1;
}
else if (((TileEntityDispenser)source.getBlockTileEntity()).addItemStack(new ItemStack(item)) < 0)
{
this.field_150840_b.dispense(source, new ItemStack(item, 1, 0));
}
return stack;
}
});
REGISTRY.putObject(Items.flint_and_steel, new BehaviorDefaultDispenseItem()
{
private boolean field_150839_b = true;
protected ItemStack dispenseStack(IBlockSource source, ItemStack stack)
{
World world = source.getWorld();
BlockPos blockpos = source.getBlockPos().offset(BlockDispenser.getFacing(source.getBlockMetadata()));
if (world.isAirBlock(blockpos))
{
world.setState(blockpos, Blocks.fire.getState());
if (stack.attemptDamageItem(1, world.rand))
{
stack.size = 0;
}
}
else if (world.getState(blockpos).getBlock() == Blocks.tnt)
{
Blocks.tnt.onBlockDestroyedByPlayer(world, blockpos, Blocks.tnt.getState().withProperty(BlockTNT.EXPLODE, Boolean.valueOf(true)));
world.setBlockToAir(blockpos);
}
else
{
this.field_150839_b = false;
}
return stack;
}
protected void playDispenseSound(IBlockSource source)
{
if (this.field_150839_b)
{
source.getWorld().playAuxSFX(1000, source.getBlockPos(), 0);
}
else
{
source.getWorld().playAuxSFX(1001, source.getBlockPos(), 0);
}
}
});
REGISTRY.putObject(Items.dye, new BehaviorDefaultDispenseItem()
{
private boolean field_150838_b = true;
protected ItemStack dispenseStack(IBlockSource source, ItemStack stack)
{
if (DyeColor.WHITE == DyeColor.byDyeDamage(stack.getMetadata()))
{
World world = source.getWorld();
BlockPos blockpos = source.getBlockPos().offset(BlockDispenser.getFacing(source.getBlockMetadata()));
if (ItemDye.applyBonemeal(stack, world, blockpos))
{
if (!world.client)
{
world.playAuxSFX(2005, blockpos, 0);
}
}
else
{
this.field_150838_b = false;
}
return stack;
}
else
{
return super.dispenseStack(source, stack);
}
}
protected void playDispenseSound(IBlockSource source)
{
if (this.field_150838_b)
{
source.getWorld().playAuxSFX(1000, source.getBlockPos(), 0);
}
else
{
source.getWorld().playAuxSFX(1001, source.getBlockPos(), 0);
}
}
});
REGISTRY.putObject(ItemRegistry.getItemFromBlock(Blocks.tnt), new BehaviorDefaultDispenseItem()
{
protected ItemStack dispenseStack(IBlockSource source, ItemStack stack)
{
World world = source.getWorld();
BlockPos blockpos = source.getBlockPos().offset(BlockDispenser.getFacing(source.getBlockMetadata()));
EntityTnt entitytntprimed = new EntityTnt(world, (double)blockpos.getX() + 0.5D, (double)blockpos.getY(), (double)blockpos.getZ() + 0.5D, (EntityLiving)null, stack.getMetadata());
world.spawnEntityInWorld(entitytntprimed);
world.playSoundAtEntity(entitytntprimed, SoundEvent.FUSE, 1.0F);
--stack.size;
return stack;
}
});
}
}