mirror of
https://github.com/Ellpeck/ActuallyAdditions.git
synced 2024-05-25 02:23:37 +02:00
1fe930b395
If this causes issues, its on other people's end to resolve it. They should stop overriding the old one. But, this is basically asking for trouble.
157 lines
5.5 KiB
Java
157 lines
5.5 KiB
Java
/*
|
|
* 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-2017 Ellpeck
|
|
*/
|
|
|
|
package de.ellpeck.actuallyadditions.mod.data;
|
|
|
|
import de.ellpeck.actuallyadditions.api.laser.Network;
|
|
import de.ellpeck.actuallyadditions.mod.data.PlayerData.PlayerSave;
|
|
import de.ellpeck.actuallyadditions.mod.misc.apiimpl.LaserRelayConnectionHandler;
|
|
import de.ellpeck.actuallyadditions.mod.util.ModUtil;
|
|
import io.netty.util.internal.ConcurrentSet;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.nbt.NBTTagList;
|
|
import net.minecraft.world.World;
|
|
import net.minecraft.world.WorldServer;
|
|
import net.minecraft.world.storage.ISaveHandler;
|
|
import net.minecraft.world.storage.WorldSavedData;
|
|
import net.minecraftforge.common.WorldSpecificSaveHandler;
|
|
|
|
import java.io.File;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.UUID;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
public class WorldData extends WorldSavedData{
|
|
|
|
public static final String DATA_TAG = ModUtil.MOD_ID+"data";
|
|
//TODO Remove this as well
|
|
public static List<File> legacyLoadWorlds = new ArrayList<File>();
|
|
private static WorldData data;
|
|
public final ConcurrentSet<Network> laserRelayNetworks = new ConcurrentSet<Network>();
|
|
public final ConcurrentHashMap<UUID, PlayerSave> playerSaveData = new ConcurrentHashMap<UUID, PlayerSave>();
|
|
|
|
public WorldData(String name){
|
|
super(name);
|
|
}
|
|
|
|
public static WorldData get(World world, boolean forceLoad){
|
|
WorldData w = getInternal(world, forceLoad);
|
|
if(w == null) ModUtil.LOGGER.error("What the hell how is this stupid thing null again AEWBFINCEMR");
|
|
return w == null ? new WorldData(DATA_TAG) : w;
|
|
}
|
|
|
|
private static WorldData getInternal(World world, boolean forceLoad){
|
|
if(forceLoad || data == null){
|
|
if(!world.isRemote){
|
|
WorldSavedData savedData = world.loadData(WorldData.class, DATA_TAG);
|
|
|
|
if(!(savedData instanceof WorldData)){
|
|
ModUtil.LOGGER.info("No WorldData found, creating...");
|
|
|
|
WorldData newData = new WorldData(DATA_TAG);
|
|
world.setData(DATA_TAG, newData);
|
|
data = newData;
|
|
}
|
|
else{
|
|
data = (WorldData) savedData;
|
|
ModUtil.LOGGER.info("Successfully loaded WorldData!");
|
|
}
|
|
}
|
|
else{
|
|
data = new WorldData(DATA_TAG);
|
|
ModUtil.LOGGER.info("Created temporary WorldData to cache data on the client!");
|
|
}
|
|
}
|
|
return data;
|
|
}
|
|
|
|
public static void clear(){
|
|
if(data != null){
|
|
data = null;
|
|
ModUtil.LOGGER.info("Unloaded WorldData!");
|
|
}
|
|
}
|
|
|
|
public static WorldData get(World world){
|
|
return get(world, false);
|
|
}
|
|
|
|
//TODO Remove old loading mechanic after a while because it's legacy
|
|
public static void loadLegacy(World world){
|
|
if(!world.isRemote && world instanceof WorldServer){
|
|
int dim = world.provider.getDimension();
|
|
ISaveHandler handler = new WorldSpecificSaveHandler((WorldServer)world, world.getSaveHandler());
|
|
File dataFile = handler.getMapFileFromName(DATA_TAG+dim);
|
|
legacyLoadWorlds.add(dataFile);
|
|
}
|
|
}
|
|
|
|
//TODO Remove merging once removing old save handler
|
|
private void readFromNBT(NBTTagCompound compound, boolean merge){
|
|
//Laser World Data
|
|
if(!merge){
|
|
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
|
|
if(!merge){
|
|
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, true);
|
|
this.playerSaveData.put(id, save);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void readFromNBT(NBTTagCompound compound){
|
|
this.readFromNBT(compound, false);
|
|
}
|
|
|
|
@Override
|
|
public NBTTagCompound 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.values()){
|
|
NBTTagCompound player = new NBTTagCompound();
|
|
player.setUniqueId("UUID", save.id);
|
|
|
|
NBTTagCompound data = new NBTTagCompound();
|
|
save.writeToNBT(data, true);
|
|
player.setTag("Data", data);
|
|
|
|
playerList.appendTag(player);
|
|
}
|
|
compound.setTag("PlayerData", playerList);
|
|
|
|
return compound;
|
|
}
|
|
}
|