package choonster.testmod3.capability.chunkenergy; import choonster.testmod3.TestMod3; import choonster.testmod3.api.capability.chunkenergy.IChunkEnergy; import choonster.testmod3.network.MessageUpdateChunkEnergyValue; import net.minecraft.nbt.NBTTagInt; import net.minecraft.server.management.PlayerChunkMapEntry; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.energy.EnergyStorage; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; /** * Default implementation of {@link IChunkEnergy}. * * @author Choonster */ public class ChunkEnergy extends EnergyStorage implements IChunkEnergy, INBTSerializable<NBTTagInt> { /** * The {@link World} containing this instance's chunk. */ private final World world; /** * The {@link ChunkPos} of this instance's chunk. */ private final ChunkPos chunkPos; public ChunkEnergy(final int capacity, final World world, final ChunkPos chunkPos) { super(capacity); this.world = world; this.chunkPos = chunkPos; energy = capacity; } @Override public NBTTagInt serializeNBT() { return new NBTTagInt(getEnergyStored()); } @Override public void deserializeNBT(final NBTTagInt nbt) { energy = nbt.getInt(); } @Override public World getWorld() { return world; } @Override public ChunkPos getChunkPos() { return chunkPos; } @Override public int receiveEnergy(final int maxReceive, final boolean simulate) { final int energyReceived = super.receiveEnergy(maxReceive, simulate); if (!simulate && energyReceived != 0) { onEnergyChanged(); } return energyReceived; } @Override public int extractEnergy(final int maxExtract, final boolean simulate) { final int energyExtracted = super.extractEnergy(maxExtract, simulate); if (!simulate && energyExtracted != 0) { onEnergyChanged(); } return energyExtracted; } /** * Set the energy value. For internal use only. * * @param energy The new energy value */ public void setEnergy(final int energy) { this.energy = energy; onEnergyChanged(); } /** * Called when the energy value changes. */ protected void onEnergyChanged() { final World world = getWorld(); final ChunkPos chunkPos = getChunkPos(); if (world.isRemote) return; final PlayerChunkMapEntry playerChunkMapEntry = ((WorldServer) world).getPlayerChunkMap().getEntry(chunkPos.chunkXPos, chunkPos.chunkZPos); if (playerChunkMapEntry == null) return; final IMessage message = new MessageUpdateChunkEnergyValue(this); playerChunkMapEntry.sendPacket(TestMod3.network.getPacketFrom(message)); } }