package game.tileentity; import java.util.List; import game.block.Block; import game.color.DyeColor; import game.entity.types.EntityLiving; import game.init.Blocks; import game.nbt.NBTTagCompound; import game.network.Packet; import game.packet.S35PacketUpdateTileEntity; import game.potion.Potion; import game.potion.PotionEffect; import game.world.BlockPos; import game.world.BoundingBox; import game.world.State; import game.world.World; import game.world.WorldServer; public class TileEntityBeacon extends TileEntity implements ITickable { /** List of effects that Beacon can apply */ public static final Potion[][] effectsList = new Potion[][] {{Potion.moveSpeed, Potion.digSpeed}, {Potion.resistance, Potion.jump}, {Potion.damageBoost}, {Potion.regeneration}}; // private final List beamSegments = Lists.newArrayList(); // private long lastRenderUpdate; // private float charge; private boolean isComplete; /** Level of this beacon's pyramid. */ private int levels = -1; /** Primary potion effect given by this beacon. */ private int primaryEffect; /** Secondary potion effect given by this beacon. */ private int secondaryEffect; /** Item given to this beacon as payment. */ // private ItemStack payment; private String customName; private DyeColor beamColor = DyeColor.WHITE; /** * Like the old updateEntity(), except more generic. */ public void update() { if (!this.worldObj.client && ((WorldServer)this.worldObj).getTime() % 80L == 0L) { this.updateBeacon(); } // else if (this.worldObj.client && this.worldObj.getDayTime() % 20L == 0L) // { // this.updateBeacon(); // } } public void updateBeacon() { if(!this.worldObj.client) // this.updateSegmentColors(); // else this.updateSegment(); } private void addEffectsToPlayers() { if (this.isComplete && this.levels > 0 && this.primaryEffect > 0) { double d0 = (double)(this.levels * 10 + 10); int i = 0; if (this.levels >= 4 && this.primaryEffect == this.secondaryEffect) { i = 1; } int j = this.pos.getX(); int k = this.pos.getY(); int l = this.pos.getZ(); BoundingBox axisalignedbb = (new BoundingBox((double)j, (double)k, (double)l, (double)(j + 1), (double)(k + 1), (double)(l + 1))).expand(d0, d0, d0).addCoord(0.0D, (double)World.HEIGHT, 0.0D); List list = this.worldObj.getEntitiesWithinAABB(EntityLiving.class, axisalignedbb); for (EntityLiving entityplayer : list) { entityplayer.addEffect(new PotionEffect(this.primaryEffect, 180, i, true, true)); } if (this.levels >= 4 && this.primaryEffect != this.secondaryEffect && this.secondaryEffect > 0) { for (EntityLiving entityplayer1 : list) { entityplayer1.addEffect(new PotionEffect(this.secondaryEffect, 180, 0, true, true)); } } } } private void calculateLevels() { int j = this.pos.getX(); int k = this.pos.getY(); int l = this.pos.getZ(); if (this.isComplete) { for (int l1 = 1; l1 <= 4; this.levels = l1++) { int i2 = k - l1; if (i2 < 0) { break; } boolean flag1 = true; for (int j1 = j - l1; j1 <= j + l1 && flag1; ++j1) { for (int k1 = l - l1; k1 <= l + l1; ++k1) { Block block = this.worldObj.getState(new BlockPos(j1, i2, k1)).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.levels == 0) { this.isComplete = false; } } } private void updateSegment() { // int i = this.levels; int j = this.pos.getX(); int k = this.pos.getY(); int l = this.pos.getZ(); this.levels = 0; this.isComplete = true; BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); for (int i1 = k + 1; i1 < 512; ++i1) { State iblockstate = this.worldObj.getState(blockpos$mutableblockpos.set(j, i1, l)); if (iblockstate.getBlock() != Blocks.stained_glass && iblockstate.getBlock() != Blocks.stained_glass_pane && iblockstate.getBlock().getLightOpacity() >= 15 && iblockstate.getBlock() != Blocks.bedrock) { this.isComplete = false; break; } } this.calculateLevels(); // if (this.levels == 4 && i < this.levels) // { // for (EntityNPC entityplayer : this.worldObj.getEntitiesWithinAABB(EntityNPC.class, (new AxisAlignedBB((double)j, (double)k, (double)l, (double)j, (double)(k - 4), (double)l)).expand(10.0D, 5.0D, 10.0D))) // { // entityplayer.triggerAchievement(AchievementList.fullBeacon); // } // } this.addEffectsToPlayers(); } // private void updateSegmentColors() // { // int i = this.levels; // int j = this.pos.getX(); // int k = this.pos.getY(); // int l = this.pos.getZ(); // this.levels = 0; // this.beamSegments.clear(); // this.isComplete = true; // TileEntityBeacon.BeamSegment tileentitybeacon$beamsegment = new TileEntityBeacon.BeamSegment(EntitySheep.getDyeRgb(DyeColor.WHITE)); // this.beamSegments.add(tileentitybeacon$beamsegment); // boolean flag = true; // BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); // // for (int i1 = k + 1; i1 < 512; ++i1) // { // State iblockstate = this.worldObj.getState(blockpos$mutableblockpos.set(j, i1, l)); // float[] afloat; // // if (iblockstate.getBlock() == Blocks.stained_glass) // { // afloat = EntitySheep.getDyeRgb((DyeColor)iblockstate.getValue(BlockStainedGlass.COLOR)); // } // else // { // if (iblockstate.getBlock() != Blocks.stained_glass_pane) // { // if (iblockstate.getBlock().getLightOpacity() >= 15 && iblockstate.getBlock() != Blocks.bedrock) // { // this.isComplete = false; // this.beamSegments.clear(); // break; // } // // tileentitybeacon$beamsegment.incrementHeight(); // continue; // } // // afloat = EntitySheep.getDyeRgb((DyeColor)iblockstate.getValue(BlockStainedGlassPane.COLOR)); // } // // if (!flag) // { // afloat = new float[] {(tileentitybeacon$beamsegment.getColors()[0] + afloat[0]) / 2.0F, (tileentitybeacon$beamsegment.getColors()[1] + afloat[1]) / 2.0F, (tileentitybeacon$beamsegment.getColors()[2] + afloat[2]) / 2.0F}; // } // // if (Arrays.equals(afloat, tileentitybeacon$beamsegment.getColors())) // { // tileentitybeacon$beamsegment.incrementHeight(); // } // else // { // tileentitybeacon$beamsegment = new TileEntityBeacon.BeamSegment(afloat); // this.beamSegments.add(tileentitybeacon$beamsegment); // } // // flag = false; // } // // this.calculateLevels(); // } // public List getBeamSegments() // { // return this.beamSegments; // } // public float shouldBeamRender() // { // if (!this.isComplete) // { // return 0.0F; // } // else // { // int delta = (int)(this.worldObj.getTime() - this.lastRenderUpdate); // this.lastRenderUpdate = this.worldObj.getTime(); // // if (delta > 1) // { // this.charge -= (float)delta / 40.0F; // // if (this.charge < 0.0F) // { // this.charge = 0.0F; // } // } // // this.charge += 0.025F; // // if (this.charge > 1.0F) // { // this.charge = 1.0F; // } // // return this.charge; // return 1.0F; // } // } /** * Allows for a specialized description packet to be created. This is often used to sync tile entity data from the * server to the client easily. For example this is used by signs to synchronise the text to be displayed. */ public Packet getDescriptionPacket() { return new S35PacketUpdateTileEntity(this); } public double getMaxRenderDistanceSquared() { return 65536.0D; } private int getEffect(int id) { if (id >= 0 && id < Potion.POTION_TYPES.length && Potion.POTION_TYPES[id] != null) { Potion potion = Potion.POTION_TYPES[id]; return potion != Potion.moveSpeed && potion != Potion.digSpeed && potion != Potion.resistance && potion != Potion.jump && potion != Potion.damageBoost && potion != Potion.regeneration ? 0 : id; } else { return 0; } } public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); this.primaryEffect = this.getEffect(compound.getInteger("Primary")); this.secondaryEffect = this.getEffect(compound.getInteger("Secondary")); this.levels = compound.getInteger("Levels"); // try { this.beamColor = DyeColor.getByName(compound.getString("Color")); // } // catch(IllegalArgumentException e) { // this.beamColor = DyeColor.WHITE; // } } public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); compound.setInteger("Primary", this.primaryEffect); compound.setInteger("Secondary", this.secondaryEffect); compound.setInteger("Levels", this.levels); compound.setString("Color", this.beamColor.getName()); } /** * Returns the number of slots in the inventory. */ // public int getSizeInventory() // { // return 1; // } /** * Returns the stack in the given slot. */ // public ItemStack getStackInSlot(int index) // { // return index == 0 ? this.payment : null; // } /** * Removes up to a specified number of items from an inventory slot and returns them in a new stack. */ // public ItemStack decrStackSize(int index, int count) // { // if (index == 0 && this.payment != null) // { // if (count >= this.payment.stackSize) // { // ItemStack itemstack = this.payment; // this.payment = null; // return itemstack; // } // else // { // this.payment.stackSize -= count; // return new ItemStack(this.payment.getItem(), count, this.payment.getMetadata()); // } // } // else // { // return null; // } // } // // /** // * Removes a stack from the given slot and returns it. // */ // public ItemStack removeStackFromSlot(int index) // { // if (index == 0 && this.payment != null) // { // ItemStack itemstack = this.payment; // this.payment = null; // return itemstack; // } // else // { // return null; // } // } // // /** // * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections). // */ // public void setInventorySlotContents(int index, ItemStack stack) // { // if (index == 0) // { // this.payment = stack; // } // } /** * Get the name of this object. For players this returns their username */ // public String getName() // { // return this.hasCustomName() ? this.customName : "Leuchtfeuer"; // } /** * Returns true if this thing is named */ // public boolean hasCustomName() // { // return this.customName != null && this.customName.length() > 0; // } // // public void setName(String name) // { // this.customName = name; // } /** * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. */ // public int getInventoryStackLimit() // { // return 1; // } /** * Do not make give this method the name canInteractWith because it clashes with Container */ // public boolean isUseableByPlayer(EntityNPC player) // { // return this.worldObj.getTileEntity(this.pos) != this ? false : player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D; // } // // public void openInventory(EntityNPC player) // { // } // // public void closeInventory(EntityNPC player) // { // } /** * Returns true if automation is allowed to insert the given stack (ignoring stack size) into the given slot. */ // public boolean isItemValidForSlot(int index, ItemStack stack) // { // return stack.getItem() == Items.emerald || stack.getItem() == Items.diamond || stack.getItem() == Items.gold_ingot || stack.getItem() == Items.iron_ingot; // } // // public String getGuiID() // { // return "beacon"; // } // // public Container createContainer(InventoryPlayer playerInventory, EntityNPC playerIn) // { // return new ContainerBeacon(playerInventory, this); // } // // public int getField(int id) // { // switch (id) // { // case 0: // return this.levels; // // case 1: // return this.primaryEffect; // // case 2: // return this.secondaryEffect; // // default: // return 0; // } // } // // public void setField(int id, int value) // { // switch (id) // { // case 0: // this.levels = value; // break; // // case 1: // this.primaryEffect = this.func_183001_h(value); // break; // // case 2: // this.secondaryEffect = this.func_183001_h(value); // } // } // // public int getFieldCount() // { // return 3; // } // // public void clear() // { // this.payment = null; // } public boolean receiveClientEvent(int id, int type) { if (id == 1) { this.beamColor = DyeColor.byMetadata(type); return true; } else { return super.receiveClientEvent(id, type); } } public int getColor() { return 0xff00ff; } public int getBeamColor() { return this.beamColor.getColor(); } public void setBeamColor(DyeColor color) { this.beamColor = color; if(!this.worldObj.client) this.worldObj.addBlockEvent(this.pos, this.getBlockType(), 1, color.getMetadata()); } // public static class BeamSegment // { // private final float[] colors; // private int height; // // public BeamSegment(float[] p_i45669_1_) // { // this.colors = p_i45669_1_; // this.height = 1; // } // // protected void incrementHeight() // { // ++this.height; // } // // public float[] getColors() // { // return this.colors; // } // // public int getHeight() // { // return this.height; // } // } }