All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.minecraft.server.TileEntityBeacon Maven / Gradle / Ivy

package net.minecraft.server;

import com.google.common.collect.Lists;
import org.bukkit.craftbukkit.entity.CraftHumanEntity;
import org.bukkit.entity.HumanEntity;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
// CraftBukkit end

public class TileEntityBeacon extends TileEntityContainer implements IUpdatePlayerListBox, IInventory {
	
	public static final MobEffectList[][] a = new MobEffectList[][]{{MobEffectList.FASTER_MOVEMENT, MobEffectList.FASTER_DIG}, {MobEffectList.RESISTANCE, MobEffectList.JUMP}, {MobEffectList.INCREASE_DAMAGE}, {MobEffectList.REGENERATION}};
	private final List f = Lists.newArrayList();
	// CraftBukkit start - add fields and methods
	public List transaction = new java.util.ArrayList();
	private boolean i;
	private int j = -1;
	private int k;
	private int l;
	private ItemStack inventorySlot;
	private String n;
	private int maxStack = MAX_STACK;
	
	public TileEntityBeacon() {
	}
	
	public ItemStack[] getContents() {
		return new ItemStack[]{this.inventorySlot};
	}
	
	public void onOpen(CraftHumanEntity who) {
		transaction.add(who);
	}
	
	public void onClose(CraftHumanEntity who) {
		transaction.remove(who);
	}
	
	public List getViewers() {
		return transaction;
	}
	// CraftBukkit end
	
	public void c() {
		if (this.world.getTime() % 80L == 0L) {
			this.m();
		}
		
	}
	
	public void m() {
		this.B();
		this.A();
	}
	
	private void A() {
		if (this.i && this.j > 0 && !this.world.isClientSide && this.k > 0) {
			double d0 = this.j * 10 + 10;
			byte b0 = 0;
			
			if (this.j >= 4 && this.k == this.l) {
				b0 = 1;
			}
			
			int i = this.position.getX();
			int j = this.position.getY();
			int k = this.position.getZ();
			AxisAlignedBB axisalignedbb = (new AxisAlignedBB(i, j, k, i + 1, j + 1, k + 1)).grow(d0, d0, d0).a(0.0D, this.world.getHeight(), 0.0D);
			List list = this.world.a(EntityHuman.class, axisalignedbb);
			Iterator iterator = list.iterator();
			
			EntityHuman entityhuman;
			
			while (iterator.hasNext()) {
				entityhuman = (EntityHuman) iterator.next();
				entityhuman.addEffect(new MobEffect(this.k, 180, b0, true, true));
			}
			
			if (this.j >= 4 && this.k != this.l && this.l > 0) {
				iterator = list.iterator();
				
				while (iterator.hasNext()) {
					entityhuman = (EntityHuman) iterator.next();
					entityhuman.addEffect(new MobEffect(this.l, 180, 0, true, true));
				}
			}
		}
		
	}
	
	private void B() {
		int i = this.j;
		int j = this.position.getX();
		int k = this.position.getY();
		int l = this.position.getZ();
		
		this.j = 0;
		this.f.clear();
		this.i = true;
		TileEntityBeacon.BeaconColorTracker tileentitybeacon_beaconcolortracker = new TileEntityBeacon.BeaconColorTracker(EntitySheep.a(EnumColor.WHITE));
		
		this.f.add(tileentitybeacon_beaconcolortracker);
		boolean flag = true;
		BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
		
		int i1;
		
		for (i1 = k + 1; i1 < 256; ++i1) {
			IBlockData iblockdata = this.world.getType(blockposition_mutableblockposition.c(j, i1, l));
			float[] afloat;
			
			if (iblockdata.getBlock() == Blocks.STAINED_GLASS) {
				afloat = EntitySheep.a(iblockdata.get(BlockStainedGlass.COLOR));
			} else {
				if (iblockdata.getBlock() != Blocks.STAINED_GLASS_PANE) {
					if (iblockdata.getBlock().p() >= 15 && iblockdata.getBlock() != Blocks.BEDROCK) {
						this.i = false;
						this.f.clear();
						break;
					}
					
					tileentitybeacon_beaconcolortracker.a();
					continue;
				}
				
				afloat = EntitySheep.a(iblockdata.get(BlockStainedGlassPane.COLOR));
			}
			
			if (!flag) {
				afloat = new float[]{(tileentitybeacon_beaconcolortracker.b()[0] + afloat[0]) / 2.0F, (tileentitybeacon_beaconcolortracker.b()[1] + afloat[1]) / 2.0F, (tileentitybeacon_beaconcolortracker.b()[2] + afloat[2]) / 2.0F};
			}
			
			if (Arrays.equals(afloat, tileentitybeacon_beaconcolortracker.b())) {
				tileentitybeacon_beaconcolortracker.a();
			} else {
				tileentitybeacon_beaconcolortracker = new TileEntityBeacon.BeaconColorTracker(afloat);
				this.f.add(tileentitybeacon_beaconcolortracker);
			}
			
			flag = false;
		}
		
		if (this.i) {
			for (i1 = 1; i1 <= 4; this.j = i1++) {
				int j1 = k - i1;
				
				if (j1 < 0) {
					break;
				}
				
				boolean flag1 = true;
				
				for (int k1 = j - i1; k1 <= j + i1 && flag1; ++k1) {
					for (int l1 = l - i1; l1 <= l + i1; ++l1) {
						Block block = this.world.getType(new BlockPosition(k1, j1, l1)).getBlock();
						
						if (block != Blocks.EMERALD_BLOCK && block != Blocks.GOLD_BLOCK && block != Blocks.DIAMOND_BLOCK && block != Blocks.IRON_BLOCK) {
							flag1 = false;
							break;
						}
					}
				}
				
				if (!flag1) {
					break;
				}
			}
			
			if (this.j == 0) {
				this.i = false;
			}
		}
		
		if (!this.world.isClientSide && this.j == 4 && i < this.j) {
			Iterator iterator = this.world.a(EntityHuman.class, (new AxisAlignedBB(j, k, l, j, k - 4, l)).grow(10.0D, 5.0D, 10.0D)).iterator();
			
			while (iterator.hasNext()) {
				EntityHuman entityhuman = (EntityHuman) iterator.next();
				
				entityhuman.b(AchievementList.K);
			}
		}
		
	}
	
	public Packet getUpdatePacket() {
		NBTTagCompound nbttagcompound = new NBTTagCompound();
		
		this.b(nbttagcompound);
		return new PacketPlayOutTileEntityData(this.position, 3, nbttagcompound);
	}
	
	private int h(int i) {
		if (i >= 0 && i < MobEffectList.byId.length && MobEffectList.byId[i] != null) {
			MobEffectList mobeffectlist = MobEffectList.byId[i];
			
			return mobeffectlist != MobEffectList.FASTER_MOVEMENT && mobeffectlist != MobEffectList.FASTER_DIG && mobeffectlist != MobEffectList.RESISTANCE && mobeffectlist != MobEffectList.JUMP && mobeffectlist != MobEffectList.INCREASE_DAMAGE && mobeffectlist != MobEffectList.REGENERATION ? 0 : i;
		} else {
			return 0;
		}
	}
	
	public void a(NBTTagCompound nbttagcompound) {
		super.a(nbttagcompound);
		this.k = this.h(nbttagcompound.getInt("Primary"));
		this.l = this.h(nbttagcompound.getInt("Secondary"));
		this.j = nbttagcompound.getInt("Levels");
	}
	
	public void b(NBTTagCompound nbttagcompound) {
		super.b(nbttagcompound);
		nbttagcompound.setInt("Primary", this.k);
		nbttagcompound.setInt("Secondary", this.l);
		nbttagcompound.setInt("Levels", this.j);
	}
	
	public int getSize() {
		return 1;
	}
	
	public ItemStack getItem(int i) {
		return i == 0 ? this.inventorySlot : null;
	}
	
	public ItemStack splitStack(int i, int j) {
		if (i == 0 && this.inventorySlot != null) {
			if (j >= this.inventorySlot.count) {
				ItemStack itemstack = this.inventorySlot;
				
				this.inventorySlot = null;
				return itemstack;
			} else {
				this.inventorySlot.count -= j;
				return new ItemStack(this.inventorySlot.getItem(), j, this.inventorySlot.getData());
			}
		} else {
			return null;
		}
	}
	
	public ItemStack splitWithoutUpdate(int i) {
		if (i == 0 && this.inventorySlot != null) {
			ItemStack itemstack = this.inventorySlot;
			
			this.inventorySlot = null;
			return itemstack;
		} else {
			return null;
		}
	}
	
	public void setItem(int i, ItemStack itemstack) {
		if (i == 0) {
			this.inventorySlot = itemstack;
		}
		
	}
	
	public String getName() {
		return this.hasCustomName() ? this.n : "container.beacon";
	}
	
	public boolean hasCustomName() {
		return this.n != null && this.n.length() > 0;
	}
	
	public void a(String s) {
		this.n = s;
	}
	
	public int getMaxStackSize() {
		return maxStack; // CraftBukkit
	}
	
	public void setMaxStackSize(int size) {
		maxStack = size;
	}
	
	public boolean a(EntityHuman entityhuman) {
		return this.world.getTileEntity(this.position) == this && entityhuman.getDistanceSquared((double) this.position.getX() + 0.5D, (double) this.position.getY() + 0.5D, (double) this.position.getZ() + 0.5D) <= 64.0D;
	}
	
	public void startOpen(EntityHuman entityhuman) {
	}
	
	public void closeContainer(EntityHuman entityhuman) {
	}
	
	public boolean b(int i, ItemStack itemstack) {
		return itemstack.getItem() == Items.EMERALD || itemstack.getItem() == Items.DIAMOND || itemstack.getItem() == Items.GOLD_INGOT || itemstack.getItem() == Items.IRON_INGOT;
	}
	
	public String getContainerName() {
		return "minecraft:beacon";
	}
	
	public Container createContainer(PlayerInventory playerinventory, EntityHuman entityhuman) {
		return new ContainerBeacon(playerinventory, this);
	}
	
	public int getProperty(int i) {
		switch (i) {
			case 0:
				return this.j;
			
			case 1:
				return this.k;
			
			case 2:
				return this.l;
			
			default:
				return 0;
		}
	}
	
	public void b(int i, int j) {
		switch (i) {
			case 0:
				this.j = j;
				break;
			
			case 1:
				this.k = this.h(j);
				break;
			
			case 2:
				this.l = this.h(j);
		}
		
	}
	
	public int g() {
		return 3;
	}
	
	public void l() {
		this.inventorySlot = null;
	}
	
	public boolean c(int i, int j) {
		if (i == 1) {
			this.m();
			return true;
		} else {
			return super.c(i, j);
		}
	}
	
	public static class BeaconColorTracker {
		
		private final float[] a;
		private int b;
		
		public BeaconColorTracker(float[] afloat) {
			this.a = afloat;
			this.b = 1;
		}
		
		protected void a() {
			++this.b;
		}
		
		public float[] b() {
			return this.a;
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy