package hunternif.mc.atlas.network.client;
import hunternif.mc.atlas.client.BiomeTextureMap;
import hunternif.mc.atlas.client.TextureSet;
import hunternif.mc.atlas.ext.ExtTileIdMap;
import hunternif.mc.atlas.ext.ExtTileTextureMap;
import hunternif.mc.atlas.ext.TileIdRegisteredEvent;
import hunternif.mc.atlas.network.AbstractMessage.AbstractClientMessage;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.PacketBuffer;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
/**
* Used to send pairs (unique tile name)-(pseudo-biome ID) from the server
* to clients.
* @author Hunternif
*/
public class TileNameIDPacket extends AbstractClientMessage<TileNameIDPacket>
{
private final Map<String, Integer> nameToIdMap;
public TileNameIDPacket() {
nameToIdMap = new HashMap<>();
}
public TileNameIDPacket(Map<String, Integer> nameToIdMap) {
this.nameToIdMap = nameToIdMap;
}
public TileNameIDPacket put(String name, int biomeID) {
nameToIdMap.put(name, biomeID);
return this;
}
@Override
public void read(PacketBuffer buffer) throws IOException {
int size = buffer.readVarInt();
for (int i = 0; i < size; i++) {
String name = ByteBufUtils.readUTF8String(buffer);
// Reading negative value to save on traffic, because custom biome
// IDs are always negative.
int biomeID = -buffer.readVarInt();
nameToIdMap.put(name, biomeID);
}
}
@Override
public void write(PacketBuffer buffer) throws IOException {
buffer.writeVarInt(nameToIdMap.size());
for (Entry<String, Integer> entry : nameToIdMap.entrySet()) {
ByteBufUtils.writeUTF8String(buffer, entry.getKey());
// Writing negative value to save on traffic, because custom biome
// IDs are always negative.
buffer.writeVarInt(-entry.getValue());
}
}
@Override
@SideOnly(Side.CLIENT)
protected void process(EntityPlayer player, Side side) {
for (Entry<String, Integer> entry : nameToIdMap.entrySet()) {
String tileName = entry.getKey();
int id = entry.getValue();
// Remove old texture mapping
int oldID = ExtTileIdMap.instance().getPseudoBiomeID(tileName);
if (oldID != ExtTileIdMap.NOT_FOUND && oldID != id) {
BiomeTextureMap.instance().setTexture(oldID, null);
}
ExtTileIdMap.instance().setPseudoBiomeID(tileName, id);
// Register new texture mapping
TextureSet texture = ExtTileTextureMap.instance().getTexture(tileName);
BiomeTextureMap.instance().setTexture(id, texture);
}
MinecraftForge.EVENT_BUS.post(new TileIdRegisteredEvent(nameToIdMap));
}
}