tcr/java/src/game/tileentity/TileEntityBeacon.java
2025-03-12 18:13:11 +01:00

557 lines
16 KiB
Java
Executable file

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<TileEntityBeacon.BeamSegment> beamSegments = Lists.<TileEntityBeacon.BeamSegment>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<EntityLiving> list = this.worldObj.<EntityLiving>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<TileEntityBeacon.BeamSegment> 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;
// }
// }
}