@Override protected void renderTileEntity(@Nonnull T te, @Nonnull IBlockState blockState, float partialTicks, int destroyStage) { World world = te.getWorld(); renderItemStack(te, world, 0, 0, 0, partialTicks); }
@Override public final void update() { if (!hasWorld() || isInvalid() || !world.isBlockLoaded(getPos()) || world.getTileEntity(getPos()) != this) { // we can get ticked after being removed from the world, ignore this return; } if (ConfigHandler.allowExternalTickSpeedup || world.getTotalWorldTime() != lastUpdate) { lastUpdate = world.getTotalWorldTime(); doUpdate(); sendProgressIf(); } }
@Override public @Nonnull TileEntity createTileEntity(@Nonnull World world, @Nonnull IBlockState state) { if (teClass != null) { try { T te = teClass.newInstance(); te.setWorldCreate(world); te.init(); return te; } catch (Exception e) { throw new RuntimeException("Could not create tile entity for block " + getLocalizedName() + " for class " + teClass, e); } } throw new RuntimeException( "Cannot create a TileEntity for a block that doesn't have a TileEntity. This is not a problem with EnderCore, this is caused by the caller."); }
@SuppressWarnings({ "null", "unused" }) @Override public final void render(@Nonnull T te, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { if (te != null && te.hasWorld() && !te.isInvalid()) { final IBlockState blockState = te.getWorld().getBlockState(te.getPos()); final int renderPass = MinecraftForgeClient.getRenderPass(); if ((block == null || block == blockState.getBlock()) && shouldRender(te, blockState, renderPass)) { GlStateManager.disableLighting(); if (renderPass == 0) { GlStateManager.disableBlend(); GlStateManager.depthMask(true); } else { GlStateManager.enableBlend(); GlStateManager.depthMask(false); GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); } RenderUtil.bindBlockTexture(); GlStateManager.pushMatrix(); GlStateManager.translate(x, y, z); renderTileEntity(te, blockState, partialTicks, destroyStage); GlStateManager.popMatrix(); } } else if (te == null) { renderItem(); } }
/** * SERVER: Called when block data is sent (client receiving blocks from server, via notifyBlockUpdate). No need for x/y/z tags. */ @Override public final SPacketUpdateTileEntity getUpdatePacket() { NBTTagCompound tag = new NBTTagCompound(); writeCustomNBT(NBTAction.CLIENT, tag); if (isProgressTile) { // TODO: nicer way to do this? This is needed so players who enter a chunk get a correct progress. tag.setFloat("tileprogress", ((IProgressTile) this).getProgress()); } return new SPacketUpdateTileEntity(getPos(), 1, tag); }
protected void renderItemStack(T te, @Nonnull World world, double x, double y, double z, float tick) { EntityItem ei = this.enityItem; if (ei == null) { this.enityItem = ei = new EntityItem(world, 0, 0, 0, getFloatingItem(te)); } ei.setItem(getFloatingItem(te)); ei.hoverStart = (float) ((EnderIO.proxy.getTickCount() * 0.05f + (tick * 0.05f)) % (Math.PI * 2)); RenderUtil.bindBlockTexture(); GlStateManager.pushMatrix(); glTranslated(x + 0.5, y + 0.7, z + 0.5); glScalef(1.1f, 1.1f, 1.1f); BlockPos p; if (te != null) { p = te.getPos(); } else { p = new BlockPos(0, 0, 0); } rand.setSeed(p.getX() + p.getY() + p.getZ()); rand.nextBoolean(); if (Minecraft.getMinecraft().gameSettings.fancyGraphics) { GlStateManager.rotate(rand.nextFloat() * 360f, 0, 1, 0); } ei.hoverStart += rand.nextFloat(); GlStateManager.translate(0, -0.15f, 0); if (rei == null) { rei = new InnerRenderEntityItem(Minecraft.getMinecraft().getRenderManager(), Minecraft.getMinecraft().getRenderItem()); } rei.doRender(ei, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); GlStateManager.popMatrix(); }
@Override public void detectAndSendChanges() { super.detectAndSendChanges(); if (inv instanceof TileEntityBase) { // keep in sync with ContainerEnderCap#detectAndSendChanges() final SPacketUpdateTileEntity updatePacket = ((TileEntityBase) inv).getUpdatePacket(); if (updatePacket != null) { for (IContainerListener containerListener : listeners) { if (containerListener instanceof EntityPlayerMP) { ((EntityPlayerMP) containerListener).connection.sendPacket(updatePacket); } } } } }
@Override public void onChunkUnload() { super.onChunkUnload(); if (DiagnosticsConfig.debugTraceTELivecycleExtremelyDetailed.get()) { StringBuilder sb = new StringBuilder("TE ").append(this).append(" unloaded"); for (StackTraceElement elem : new Exception("Stacktrace").getStackTrace()) { sb.append(" at ").append(elem); } Log.warn(sb); } }
@Override public void invalidate() { super.invalidate(); if (DiagnosticsConfig.debugTraceTELivecycleExtremelyDetailed.get()) { StringBuilder sb = new StringBuilder("TE ").append(this).append(" invalidated"); for (StackTraceElement elem : new Exception("Stacktrace").getStackTrace()) { sb.append(" at ").append(elem); } Log.warn(sb); } }
updatePacket = getUpdatePacket(); if (updatePacket == null) { return;
@Override public void markDirty() { if (hasWorld() && world.isBlockLoaded(getPos())) { // we need the loaded check to make sure we don't trigger a chunk load while the chunk is loaded world.markChunkDirty(pos, this); IBlockState state = world.getBlockState(pos); if (state.hasComparatorInputOverride()) { world.updateComparatorOutputLevel(pos, state.getBlock()); } } }
@Override public IMessage onMessage(PacketPassword msg, MessageContext ctx) { TileEntityBase te = msg.getTileEntity(ctx.getServerHandler().player.world); if (te instanceof ITravelAccessable) { if (((ITravelAccessable) te).canUiBeAccessed(ctx.getServerHandler().player)) { if (Prep.isValid(msg.stack)) { msg.stack.setCount(1); } if (msg.setLabel) { ((ITravelAccessable) te).setItemLabel(msg.stack); } else { ((ITravelAccessable) te).getPassword().set(msg.slot, msg.stack); ((ITravelAccessable) te).clearAuthorisedUsers(); } BlockPos pos = msg.getPos(); IBlockState bs = te.getWorld().getBlockState(pos); te.getWorld().notifyBlockUpdate(pos, bs, bs, 3); } } return null; } }