ActuallyAdditions/src/main/java/de/ellpeck/actuallyadditions/mod/data/WorldData.java

179 lines
6.7 KiB
Java
Raw Normal View History

/*
* This file ("WorldData.java") is part of the Actually Additions mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://ellpeck.de/actaddlicense
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
*
* © 2015-2016 Ellpeck
*/
package de.ellpeck.actuallyadditions.mod.data;
2016-08-02 13:08:22 +02:00
import de.ellpeck.actuallyadditions.api.laser.Network;
import de.ellpeck.actuallyadditions.mod.data.PlayerData.PlayerSave;
import de.ellpeck.actuallyadditions.mod.misc.LaserRelayConnectionHandler;
import de.ellpeck.actuallyadditions.mod.util.ModUtil;
import io.netty.util.internal.ConcurrentSet;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.DimensionType;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraft.world.storage.ISaveHandler;
import net.minecraftforge.common.WorldSpecificSaveHandler;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class WorldData{
public static final String DATA_TAG = ModUtil.MOD_ID+"data";
private static final ConcurrentHashMap<Integer, WorldData> WORLD_DATA = new ConcurrentHashMap<Integer, WorldData>();
2016-06-05 12:52:59 +02:00
public final ConcurrentSet<Network> laserRelayNetworks = new ConcurrentSet<Network>();
public final ArrayList<PlayerSave> playerSaveData = new ArrayList<PlayerSave>();
2016-06-17 23:50:38 +02:00
private final ISaveHandler handler;
private final int dimension;
public WorldData(ISaveHandler handler, int dimension){
this.handler = handler;
this.dimension = dimension;
}
public static WorldData getWorldUnspecificData(){
return getDataForWorld(DimensionType.OVERWORLD.getId());
}
2016-06-04 14:38:20 +02:00
public static WorldData getDataForWorld(World world){
return getDataForWorld(world.provider.getDimension());
}
public static WorldData getDataForWorld(int dim){
2016-06-17 23:50:38 +02:00
WorldData data = WORLD_DATA.get(dim);
2016-06-04 14:38:20 +02:00
if(data == null){
2016-06-04 14:38:20 +02:00
data = new WorldData(null, dim);
WORLD_DATA.put(dim, data);
2016-06-04 14:38:20 +02:00
}
return data;
}
public static void load(World world){
if(!world.isRemote && world instanceof WorldServer){
WorldData data = new WorldData(new WorldSpecificSaveHandler((WorldServer)world, world.getSaveHandler()), world.provider.getDimension());
2016-06-17 23:50:38 +02:00
WORLD_DATA.put(data.dimension, data);
try{
File dataFile = data.handler.getMapFileFromName(DATA_TAG+data.dimension);
if(dataFile != null && dataFile.exists()){
FileInputStream stream = new FileInputStream(dataFile);
NBTTagCompound compound = CompressedStreamTools.readCompressed(stream);
stream.close();
data.readFromNBT(compound);
ModUtil.LOGGER.info("Successfully received WorldData for world "+data.dimension+"!");
}
else{
ModUtil.LOGGER.info("No WorldData found for world "+data.dimension+", creating...");
}
}
catch(Exception e){
ModUtil.LOGGER.error("Something went wrong trying to load WorldData for world "+data.dimension+"!", e);
}
}
}
public static void save(World world){
if(!world.isRemote){
2016-06-17 23:50:38 +02:00
WorldData data = WORLD_DATA.get(world.provider.getDimension());
if(data != null && data.handler != null){
try{
File dataFile = data.handler.getMapFileFromName(DATA_TAG+data.dimension);
if(dataFile != null){
if(!dataFile.exists()){
dataFile.createNewFile();
2016-06-04 14:20:38 +02:00
ModUtil.LOGGER.info("Creating new WorldData file for world "+data.dimension+"!");
}
NBTTagCompound compound = new NBTTagCompound();
data.writeToNBT(compound);
FileOutputStream stream = new FileOutputStream(dataFile);
CompressedStreamTools.writeCompressed(compound, stream);
stream.close();
}
}
catch(Exception e){
ModUtil.LOGGER.error("Something went wrong trying to save WorldData for world "+data.dimension+"!", e);
}
}
else{
ModUtil.LOGGER.error("Tried to save WorldData for "+world.provider.getDimension()+" without any data handler being present!?");
}
}
}
public static void unload(World world){
if(!world.isRemote){
2016-06-17 23:50:38 +02:00
WORLD_DATA.remove(world.provider.getDimension());
2016-06-04 14:38:20 +02:00
ModUtil.LOGGER.info("Unloading WorldData for world "+world.provider.getDimension()+"!");
}
}
2016-06-05 12:52:59 +02:00
private void readFromNBT(NBTTagCompound compound){
//Laser World Data
this.laserRelayNetworks.clear();
NBTTagList networkList = compound.getTagList("Networks", 10);
for(int i = 0; i < networkList.tagCount(); i++){
Network network = LaserRelayConnectionHandler.readNetworkFromNBT(networkList.getCompoundTagAt(i));
this.laserRelayNetworks.add(network);
}
//Player Data
this.playerSaveData.clear();
NBTTagList playerList = compound.getTagList("PlayerData", 10);
for(int i = 0; i < playerList.tagCount(); i++){
NBTTagCompound player = playerList.getCompoundTagAt(i);
UUID id = player.getUniqueId("UUID");
NBTTagCompound data = player.getCompoundTag("Data");
PlayerSave save = new PlayerSave(id);
save.readFromNBT(data);
this.playerSaveData.add(save);
2016-06-05 12:52:59 +02:00
}
}
private void writeToNBT(NBTTagCompound compound){
//Laser World Data
NBTTagList networkList = new NBTTagList();
for(Network network : this.laserRelayNetworks){
networkList.appendTag(LaserRelayConnectionHandler.writeNetworkToNBT(network));
}
compound.setTag("Networks", networkList);
//Player Data
NBTTagList playerList = new NBTTagList();
for(PlayerSave save : this.playerSaveData){
NBTTagCompound player = new NBTTagCompound();
player.setUniqueId("UUID", save.id);
NBTTagCompound data = new NBTTagCompound();
save.writeToNBT(data);
player.setTag("Data", data);
playerList.appendTag(player);
2016-06-05 12:52:59 +02:00
}
compound.setTag("PlayerData", playerList);
2016-06-05 12:52:59 +02:00
}
}