ActuallyAdditions/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityPhantomPlacer.java
Shadows_of_Fire 1fe930b395 switch to new getDrops method
If this causes issues, its on other people's end to resolve it.  They
should stop overriding the old one.  But, this is basically asking for
trouble.
2017-09-17 02:47:04 -04:00

229 lines
7.9 KiB
Java

/*
* This file ("TileEntityPhantomPlacer.java") is part of the Actually Additions mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://ellpeck.de/actaddlicense
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
*
* © 2015-2017 Ellpeck
*/
package de.ellpeck.actuallyadditions.mod.tile;
import de.ellpeck.actuallyadditions.api.tile.IPhantomTile;
import de.ellpeck.actuallyadditions.mod.inventory.GuiHandler;
import de.ellpeck.actuallyadditions.mod.network.gui.IButtonReactor;
import de.ellpeck.actuallyadditions.mod.util.StackUtil;
import de.ellpeck.actuallyadditions.mod.util.WorldUtil;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class TileEntityPhantomPlacer extends TileEntityInventoryBase implements IPhantomTile, IButtonReactor{
public static final int RANGE = 3;
public BlockPos boundPosition;
public int currentTime;
public int range;
public boolean isBreaker;
public int side;
private int oldRange;
public TileEntityPhantomPlacer(int slots, String name){
super(slots, name);
}
public TileEntityPhantomPlacer(){
super(9, "phantomPlacer");
this.isBreaker = false;
}
@Override
public void writeSyncableNBT(NBTTagCompound compound, NBTType type){
super.writeSyncableNBT(compound, type);
if(type != NBTType.SAVE_BLOCK){
compound.setInteger("Range", this.range);
if(this.boundPosition != null){
compound.setInteger("xOfTileStored", this.boundPosition.getX());
compound.setInteger("yOfTileStored", this.boundPosition.getY());
compound.setInteger("zOfTileStored", this.boundPosition.getZ());
}
if(!this.isBreaker){
compound.setInteger("Side", this.side);
}
}
}
@Override
public void readSyncableNBT(NBTTagCompound compound, NBTType type){
super.readSyncableNBT(compound, type);
if(type != NBTType.SAVE_BLOCK){
int x = compound.getInteger("xOfTileStored");
int y = compound.getInteger("yOfTileStored");
int z = compound.getInteger("zOfTileStored");
this.range = compound.getInteger("Range");
if(!(x == 0 && y == 0 && z == 0)){
this.boundPosition = new BlockPos(x, y, z);
this.markDirty();
}
if(!this.isBreaker){
this.side = compound.getInteger("Side");
}
}
}
@Override
public void updateEntity(){
super.updateEntity();
if(!this.world.isRemote){
this.range = TileEntityPhantomface.upgradeRange(RANGE, this.world, this.pos);
if(!this.hasBoundPosition()){
this.boundPosition = null;
}
if(this.isBoundThingInRange()){
if(!this.isRedstonePowered && !this.isPulseMode){
if(this.currentTime > 0){
this.currentTime--;
if(this.currentTime <= 0){
this.doWork();
}
}
else{
this.currentTime = 30;
}
}
}
if(this.oldRange != this.range){
this.oldRange = this.range;
this.sendUpdate();
}
}
else{
if(this.boundPosition != null){
this.renderParticles();
}
}
}
@Override
public boolean hasBoundPosition(){
if(this.boundPosition != null){
if(this.world.getTileEntity(this.boundPosition) instanceof IPhantomTile || (this.getPos().getX() == this.boundPosition.getX() && this.getPos().getY() == this.boundPosition.getY() && this.getPos().getZ() == this.boundPosition.getZ() && this.world.provider.getDimension() == this.world.provider.getDimension())){
this.boundPosition = null;
return false;
}
return this.world.provider.getDimension() == this.world.provider.getDimension();
}
return false;
}
private void doWork(){
if(this.isBoundThingInRange()){
if(this.isBreaker){
Block blockToBreak = this.world.getBlockState(this.boundPosition).getBlock();
if(blockToBreak != null && this.world.getBlockState(this.boundPosition).getBlockHardness(this.world, this.boundPosition) > -1.0F){
NonNullList<ItemStack> drops = NonNullList.create();
blockToBreak.getDrops(drops, world, pos, this.world.getBlockState(this.boundPosition), 0);
if(WorldUtil.addToInventory(this.slots, drops, false)){
this.world.playEvent(2001, this.boundPosition, Block.getStateId(this.world.getBlockState(this.boundPosition)));
this.world.setBlockToAir(this.boundPosition);
WorldUtil.addToInventory(this.slots, drops, true);
this.markDirty();
}
}
}
else{
int theSlot = WorldUtil.findFirstFilledSlot(this.slots);
this.slots.setStackInSlot(theSlot, WorldUtil.useItemAtSide(WorldUtil.getDirectionBySidesInOrder(this.side), this.world, this.boundPosition, this.slots.getStackInSlot(theSlot)));
if(!StackUtil.isValid(this.slots.getStackInSlot(theSlot))){
this.slots.setStackInSlot(theSlot, StackUtil.getNull());
}
}
}
}
@SideOnly(Side.CLIENT)
public void renderParticles(){
if(this.world.rand.nextInt(2) == 0){
double d1 = (double)((float)this.boundPosition.getY()+this.world.rand.nextFloat());
int i1 = this.world.rand.nextInt(2)*2-1;
int j1 = this.world.rand.nextInt(2)*2-1;
double d4 = ((double)this.world.rand.nextFloat()-0.5D)*0.125D;
double d2 = (double)this.boundPosition.getZ()+0.5D+0.25D*(double)j1;
double d5 = (double)(this.world.rand.nextFloat()*1.0F*(float)j1);
double d0 = (double)this.boundPosition.getX()+0.5D+0.25D*(double)i1;
double d3 = (double)(this.world.rand.nextFloat()*1.0F*(float)i1);
this.world.spawnParticle(EnumParticleTypes.PORTAL, d0, d1, d2, d3, d4, d5);
}
}
@Override
public boolean isBoundThingInRange(){
return this.hasBoundPosition() && this.boundPosition.distanceSq(this.pos) <= this.range*this.range;
}
@Override
public BlockPos getBoundPosition(){
return this.boundPosition;
}
@Override
public void setBoundPosition(BlockPos pos){
this.boundPosition = pos;
}
@Override
public int getGuiID(){
return GuiHandler.GuiTypes.PHANTOM_PLACER.ordinal();
}
@Override
public int getRange(){
return this.range;
}
@Override
public boolean isItemValidForSlot(int i, ItemStack stack){
return !this.isBreaker;
}
@Override
public boolean canExtractItem(int slot, ItemStack stack){
return this.isBreaker;
}
@Override
public boolean isRedstoneToggle(){
return true;
}
@Override
public void activateOnPulse(){
this.doWork();
}
@Override
public void onButtonPressed(int buttonID, EntityPlayer player){
if(this.side+1 >= EnumFacing.values().length){
this.side = 0;
}
else{
this.side++;
}
this.sendUpdate();
}
}