use of net.minecraft.world.storage.ISaveHandler in project Minestuck by mraof.
the class MinestuckSaveHandler method onWorldLoad.
@SubscribeEvent
public void onWorldLoad(WorldEvent.Load event) {
if (event.getWorld().provider.getDimension() != 0 || event.getWorld().isRemote)
return;
ISaveHandler saveHandler = event.getWorld().getSaveHandler();
File dataFile = saveHandler.getMapFileFromName("MinestuckData");
if (dataFile != null && dataFile.exists()) {
NBTTagCompound nbt = null;
try {
nbt = CompressedStreamTools.readCompressed(new FileInputStream(dataFile));
} catch (IOException e) {
e.printStackTrace();
}
if (nbt != null) {
ServerEditHandler.loadData(nbt);
MinestuckDimensionHandler.loadData(nbt);
SkaianetHandler.loadData(nbt.getCompoundTag("skaianet"));
MinestuckPlayerData.readFromNBT(nbt);
TileEntityTransportalizer.loadTransportalizers(nbt.getCompoundTag("transportalizers"));
ServerEventHandler.tickTasks.clear();
if (nbt.hasKey("tickTasks", 9)) {
NBTTagList list = nbt.getTagList("tickTasks", 10);
for (int i = 0; i < list.tagCount(); i++) ServerEventHandler.tickTasks.add(new PostEntryTask(list.getCompoundTagAt(i)));
}
return;
}
}
ServerEventHandler.tickTasks.clear();
SkaianetHandler.loadData(null);
MinestuckPlayerData.readFromNBT(null);
ServerEditHandler.loadData(null);
}
use of net.minecraft.world.storage.ISaveHandler in project ArsMagica2 by Mithion.
the class PowerNodeCache method getFileFromChunk.
private File getFileFromChunk(World world, ChunkCoordIntPair chunk, boolean createNew) {
File saveFolder = saveDirs.get(world.provider.dimensionId);
if (saveFolder == null) {
ISaveHandler handler = world.getSaveHandler();
if (handler instanceof SaveHandler) {
saveFolder = new File(((SaveHandler) handler).getWorldDirectory(), folder);
saveFolder.mkdirs();
saveFolder = new File(saveFolder, String.format("DIM%d", world.provider.dimensionId));
saveFolder.mkdirs();
saveDirs.put(world.provider.dimensionId, saveFolder);
} else {
return null;
}
}
int rX = (int) Math.floor(chunk.chunkXPos / 32);
int rZ = (int) Math.floor(chunk.chunkZPos / 32);
String fileName = String.format("%d_%d%s", rX, rZ, extension);
File file = saveFilesCached.get(fileName);
if (file != null)
return file;
file = new File(saveFolder, fileName);
if (!file.exists()) {
if (createNew) {
try {
file.createNewFile();
} catch (Throwable t) {
t.printStackTrace();
}
} else {
return null;
}
}
saveFilesCached.put(fileName, file);
return file;
}
use of net.minecraft.world.storage.ISaveHandler in project MinecraftForge by MinecraftForge.
the class DimensionManager method initDimension.
public static void initDimension(int dim) {
WorldServer overworld = getWorld(0);
if (overworld == null) {
throw new RuntimeException("Cannot Hotload Dim: Overworld is not Loaded!");
}
try {
DimensionManager.getProviderType(dim);
} catch (Exception e) {
System.err.println("Cannot Hotload Dim: " + e.getMessage());
// If a provider hasn't been registered then we can't hotload the dim
return;
}
MinecraftServer mcServer = overworld.getMinecraftServer();
ISaveHandler savehandler = overworld.getSaveHandler();
//WorldSettings worldSettings = new WorldSettings(overworld.getWorldInfo());
WorldServer world = (dim == 0 ? overworld : (WorldServer) (new WorldServerMulti(mcServer, savehandler, dim, overworld, mcServer.theProfiler).init()));
world.addEventListener(new ServerWorldEventHandler(mcServer, world));
MinecraftForge.EVENT_BUS.post(new WorldEvent.Load(world));
if (!mcServer.isSinglePlayer()) {
world.getWorldInfo().setGameType(mcServer.getGameType());
}
mcServer.setDifficultyForAllWorlds(mcServer.getDifficulty());
}
use of net.minecraft.world.storage.ISaveHandler in project SpongeCommon by SpongePowered.
the class WorldManager method loadAllWorlds.
public static void loadAllWorlds(String worldName, long defaultSeed, WorldType defaultWorldType, String generatorOptions) {
final MinecraftServer server = SpongeImpl.getServer();
// We cannot call getCurrentSavesDirectory here as that would generate a savehandler and trigger a session lock.
// We'll go ahead and make the directories for the save name here so that the migrator won't fail
final Path currentSavesDir = server.anvilFile.toPath().resolve(server.getFolderName());
try {
// Symlink needs special handling
if (Files.isSymbolicLink(currentSavesDir)) {
final Path actualPathLink = Files.readSymbolicLink(currentSavesDir);
if (Files.notExists(actualPathLink)) {
// TODO Need to test symlinking to see if this is even legal...
Files.createDirectories(actualPathLink);
} else if (!Files.isDirectory(actualPathLink)) {
throw new IOException("Saves directory [" + currentSavesDir + "] symlinked to [" + actualPathLink + "] is not a directory!");
}
} else {
Files.createDirectories(currentSavesDir);
}
} catch (IOException ioe) {
throw new RuntimeException(ioe);
}
WorldManager.registerVanillaDimensionPaths(currentSavesDir);
WorldMigrator.migrateWorldsTo(currentSavesDir);
registerExistingSpongeDimensions(currentSavesDir);
for (Map.Entry<Integer, DimensionType> entry : sortedDimensionMap().entrySet()) {
final int dimensionId = entry.getKey();
final DimensionType dimensionType = entry.getValue();
// Skip all worlds besides dimension 0 if multi-world is disabled
if (dimensionId != 0 && !server.getAllowNether()) {
continue;
}
// Skip already loaded worlds by plugins
if (getWorldByDimensionId(dimensionId).isPresent()) {
continue;
}
// Step 1 - Grab the world's data folder
final Path worldFolder = getWorldFolder(dimensionType, dimensionId);
if (worldFolder == null) {
SpongeImpl.getLogger().error("An attempt was made to load a world with dimension id [{}] that has no registered world folder!", dimensionId);
continue;
}
final String worldFolderName = worldFolder.getFileName().toString();
// Step 2 - See if we are allowed to load it
if (dimensionId != 0) {
final SpongeConfig<? extends GeneralConfigBase> activeConfig = SpongeHooks.getActiveConfig(((IMixinDimensionType) (Object) dimensionType).getConfigPath(), worldFolderName);
if (!activeConfig.getConfig().getWorld().isWorldEnabled()) {
SpongeImpl.getLogger().warn("World [{}] (DIM{}) is disabled. World will not be loaded...", worldFolder, dimensionId);
continue;
}
}
// Step 3 - Get our world information from disk
final ISaveHandler saveHandler;
if (dimensionId == 0) {
saveHandler = server.getActiveAnvilConverter().getSaveLoader(server.getFolderName(), true);
} else {
saveHandler = new AnvilSaveHandler(WorldManager.getCurrentSavesDirectory().get().toFile(), worldFolderName, true, SpongeImpl.getDataFixer());
}
WorldInfo worldInfo = saveHandler.loadWorldInfo();
WorldSettings worldSettings;
// If this is integrated server, we need to use the WorldSettings from the client's Single Player menu to construct the worlds
if (server instanceof IMixinIntegratedServer) {
worldSettings = ((IMixinIntegratedServer) server).getSettings();
// If this is overworld and a new save, the WorldInfo has already been made but we want to still fire the construct event.
if (dimensionId == 0 && ((IMixinIntegratedServer) server).isNewSave()) {
SpongeImpl.postEvent(SpongeEventFactory.createConstructWorldPropertiesEvent(Sponge.getCauseStackManager().getCurrentCause(), (WorldArchetype) (Object) worldSettings, (WorldProperties) worldInfo));
}
} else {
// WorldSettings will be null here on dedicated server so we need to build one
worldSettings = new WorldSettings(defaultSeed, server.getGameType(), server.canStructuresSpawn(), server.isHardcore(), defaultWorldType);
}
if (worldInfo == null) {
// Step 4 - At this point, we have either have the WorldInfo or we have none. If we have none, we'll use the settings built above to
// create the WorldInfo
worldInfo = createWorldInfoFromSettings(currentSavesDir, (org.spongepowered.api.world.DimensionType) (Object) dimensionType, dimensionId, worldFolderName, worldSettings, generatorOptions);
} else {
// create config
((IMixinWorldInfo) worldInfo).setDimensionType((org.spongepowered.api.world.DimensionType) (Object) dimensionType);
((IMixinWorldInfo) worldInfo).createWorldConfig();
((WorldProperties) worldInfo).setGenerateSpawnOnLoad(((IMixinDimensionType) (Object) dimensionType).shouldGenerateSpawnOnLoad());
}
// Safety check to ensure we'll get a unique id no matter what
if (((WorldProperties) worldInfo).getUniqueId() == null) {
setUuidOnProperties(dimensionId == 0 ? currentSavesDir.getParent() : currentSavesDir, (WorldProperties) worldInfo);
}
// Safety check to ensure the world info has the dimension id set
if (((IMixinWorldInfo) worldInfo).getDimensionId() == null) {
((IMixinWorldInfo) worldInfo).setDimensionId(dimensionId);
}
// Keep the LevelName in the LevelInfo up to date with the directory name
if (!worldInfo.getWorldName().equals(worldFolderName)) {
worldInfo.setWorldName(worldFolderName);
}
// Step 5 - Load server resource pack from dimension 0
if (dimensionId == 0) {
server.setResourcePackFromWorld(worldFolderName, saveHandler);
}
// Step 6 - Cache the WorldProperties we've made so we don't load from disk later.
registerWorldProperties((WorldProperties) worldInfo);
if (dimensionId != 0 && !((WorldProperties) worldInfo).loadOnStartup()) {
SpongeImpl.getLogger().warn("World [{}] (DIM{}) is set to not load on startup. To load it later, enable [load-on-startup] in config " + "or use a plugin", worldFolder, dimensionId);
continue;
}
// Step 7 - Finally, we can create the world and tell it to load
final WorldServer worldServer = createWorldFromProperties(dimensionId, saveHandler, worldInfo, worldSettings);
SpongeImpl.getLogger().info("Loading world [{}] ({})", ((org.spongepowered.api.world.World) worldServer).getName(), getDimensionType(dimensionId).get().getName());
}
// Set the worlds on the Minecraft server
reorderWorldsVanillaFirst();
}
use of net.minecraft.world.storage.ISaveHandler in project SpongeCommon by SpongePowered.
the class WorldManager method createWorldProperties.
public static WorldProperties createWorldProperties(String folderName, WorldArchetype archetype, Integer dimensionId) {
checkNotNull(folderName);
checkNotNull(archetype);
final Optional<WorldServer> optWorldServer = getWorld(folderName);
if (optWorldServer.isPresent()) {
return ((org.spongepowered.api.world.World) optWorldServer.get()).getProperties();
}
final Optional<WorldProperties> optWorldProperties = WorldManager.getWorldProperties(folderName);
if (optWorldProperties.isPresent()) {
return optWorldProperties.get();
}
final ISaveHandler saveHandler = new AnvilSaveHandler(WorldManager.getCurrentSavesDirectory().get().toFile(), folderName, true, SpongeImpl.getDataFixer());
WorldInfo worldInfo = saveHandler.loadWorldInfo();
if (worldInfo == null) {
worldInfo = new WorldInfo((WorldSettings) (Object) archetype, folderName);
} else {
// DimensionType must be set before world config is created to get proper path
((IMixinWorldInfo) worldInfo).setDimensionType(archetype.getDimensionType());
((IMixinWorldInfo) worldInfo).createWorldConfig();
((WorldProperties) worldInfo).setGeneratorModifiers(archetype.getGeneratorModifiers());
}
if (archetype.isSeedRandomized()) {
((WorldProperties) worldInfo).setSeed(SpongeImpl.random.nextLong());
}
setUuidOnProperties(getCurrentSavesDirectory().get(), (WorldProperties) worldInfo);
if (dimensionId != null) {
((IMixinWorldInfo) worldInfo).setDimensionId(dimensionId);
} else if (((IMixinWorldInfo) worldInfo).getDimensionId() == null || ((IMixinWorldInfo) worldInfo).getDimensionId() == Integer.MIN_VALUE || getWorldByDimensionId(((IMixinWorldInfo) worldInfo).getDimensionId()).isPresent()) {
// DimensionID is null or 0 or the dimensionID is already assinged to a loaded world
((IMixinWorldInfo) worldInfo).setDimensionId(WorldManager.getNextFreeDimensionId());
}
((WorldProperties) worldInfo).setGeneratorType(archetype.getGeneratorType());
((IMixinWorldInfo) worldInfo).getOrCreateWorldConfig().save();
registerWorldProperties((WorldProperties) worldInfo);
SpongeImpl.postEvent(SpongeEventFactory.createConstructWorldPropertiesEvent(Sponge.getCauseStackManager().getCurrentCause(), archetype, (WorldProperties) worldInfo));
saveHandler.saveWorldInfoWithPlayer(worldInfo, SpongeImpl.getServer().getPlayerList().getHostPlayerData());
return (WorldProperties) worldInfo;
}
Aggregations