Сохранение

svk

1,185
3
Как мне сохранить данные, после выключения сервера? (Несколько переменных в коде)

Понятно, что можно записывать/считывать txt файл, но как мне писать путь до него, если он в моде?
 
Не совсем понял, что ты хочешь. Может просто будешь делать как нормальные люди PlayerData.dat где нибудь в saves?
Опять же - не совсем хорошо тебя понял.
 
svk написал(а):
Понятно, что можно записывать/считывать txt файл, но как мне писать путь до него, если он в моде?
Что-либо хранить и менять в самой jar-ке не стоит. Можно просто создать в папке ./config/modid/modid.cfg, а чтение и запись в него производить по событиям.

Я храню в JSON.

Чтение :
Код:
public static String readFromFile(String par1FileName)
{
    StackMeMod.log.info("Reading from " + par1FileName);
    String filePath = "./config/" + StackMeMod.MODID + "/" + par1FileName;
    StringBuilder jsonfull = new StringBuilder();
    BufferedReader bufReader = null;

    if (new File(filePath).exists())
    {
        try
        {
            bufReader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), Charset.forName("UTF-8")));
            jsonfull = new StringBuilder();
            String tempstring;
            while ((tempstring = bufReader.readLine()) != null) { jsonfull.append(tempstring + "\n"); }
            bufReader.close();
        }
        catch (FileNotFoundException e) { e.printStackTrace(); }
        catch (IOException e) { e.printStackTrace(); }
    }
    else
    {
        try { new File(filePath).createNewFile(); }
        catch (IOException e) { e.printStackTrace(); }
    }
    
    return jsonfull.toString();
}

Запись :
Код:
public static void writeToFile(String par1FileName, String par2String)
{
    StackMeMod.log.info("Writing into " + par1FileName);
    File configFolder = new File("./config/" + StackMeMod.MODID + "/");
    configFolder.mkdir();
    try
    {
        FileWriter writer = new FileWriter("./config/" + StackMeMod.MODID + "/" + par1FileName, false);
        writer.write(par2String);
        writer.close();
    }
    catch (IOException e) { e.printStackTrace(); }
}

За качество этого кода не отвечаю. Был бы рад, если кто-нибудь выложит грамотные методы для чтения и записи строки.

Либо как советует FanKar - хранить в NBT.
 
Планы поменялись, теперь всё надо прикрутить к миру :D
Пойду разбираться с WorldStorageData или как там...

Я просто мод на мини-игру делаю, и мне надо данные арен сохранить (название, параметры, координаты и т.п.) :)
 
Не до конца разобрался.
Код:
package com.svk.WarMod.miniGame;

import java.util.HashMap;

import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraft.world.WorldSavedData;
import net.minecraft.world.storage.MapStorage;

public class MGData extends WorldSavedData 
{
    final static String key = "MGData";

    public static MGData forWorld(World world)
    {
        MapStorage storage = world.perWorldStorage;

        MGData result = (MGData)storage.loadData(MGData.class, key);
        if (result == null) {
            result = new MGData();
            storage.setData(key, result);
        }
        return result;
    }

    public MGData() {
        super(key);
    }

    public MGData(String key){
        super(key);
    }

    @Override
    public void readFromNBT(NBTTagCompound nbttagcompound) 
    {
        System.out.println("readNBTData");
    }

    @Override
    public void writeToNBT(NBTTagCompound nbttagcompound)
    {
        System.out.println("writeNBTData");
    }

}
Код:
package com.svk.WarMod.miniGame.events;

import java.util.EnumSet;

import com.svk.WarMod.miniGame.MGData;

import net.minecraft.world.World;
import net.minecraftforge.event.world.WorldEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;

public class EventLoadMGData 
{

    @SubscribeEvent
    public void WorldEvent(WorldEvent.Load e) 
    {    
        World world = e.world;

        if(!world.isRemote)
        {
            MGData worldData = MGData.forWorld(world);
            worldData.markDirty();
        }
    }
}

writeNBTData срабатывает, а readNBTData - нет.
Как исправить?
И 2 - как мне проверить, нормальный ли это мир? (Не ад, не край, не любой другой кроме основного)
[merge_posts_bbcode]Добавлено: 07.12.2015 15:05:27[/merge_posts_bbcode]

Насчёт проверки откопал:
world.provider.dimensionId
+ Новый вопрос: Какой ID у нормального мира?)
 
Agravaine написал(а):
markDirty - метод-оповещатель. Говорит, что данные были изменены и их нужно сохранить.
Айди у нормального мира - 0.
Я уже знаю что такое markDirty, я говорю, метод readFromNBT не работает, и я не могу загрузить мои данные.
 
Я уже голову сломал, пытаясь запустить readFromNBT вручную...
Откуда мне этот чёртов нбт достать...
 
Не знаю, не получается, всё сбивается при перезаходе :(
Что я делаю не так...
[merge_posts_bbcode]Добавлено: 07.12.2015 18:06:08[/merge_posts_bbcode]

Код:
package com.svk.WarMod.miniGame.events;

import java.util.Calendar;
import java.util.EnumSet;

import com.svk.WarMod.miniGame.MGData;

import net.minecraft.world.World;
import net.minecraft.world.storage.MapStorage;
import net.minecraftforge.event.world.WorldEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;

public class EventLoadMGData 
{
    public static MGData worldData = null;

    @SubscribeEvent
    public void WorldEvent(WorldEvent.Load e) 
    {    
        World world = e.world;

        worldData = MGData.forWorld(world);
    }
}
Код:
package com.svk.WarMod.miniGame;

import java.util.HashMap;

import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraft.world.WorldSavedData;
import net.minecraft.world.storage.MapStorage;

public class MGData extends WorldSavedData 
{
    final static String key = "MGData";
    private NBTTagCompound worldData = new NBTTagCompound();
    
    public int debil = 0;
    
    public static MGData forWorld(World world)
    {
        MapStorage storage = world.perWorldStorage;

        MGData result = (MGData)storage.loadData(MGData.class, key);
        if (result == null) 
        {
            result = new MGData();
            storage.setData(key, result);
        }
        
        return result;
    }

    public MGData() {
        super(key);
    }

    public MGData(String key){
        super(key);
    }

    @Override
    public void readFromNBT(NBTTagCompound compound) 
    {
        System.out.println("LOAD!");
        worldData = compound.getCompoundTag("MGData");
    }

    @Override
    public void writeToNBT(NBTTagCompound compound)
    {
        System.out.println("WRITE!");
        compound.setTag("MGData", worldData);
    }
    
    public NBTTagCompound getNBT()
    {
        return worldData;
    }
}

Редактирую так:
Код:
        EventLoadMGData.worldData.getNBT().setInteger("team", 1);
        EventLoadMGData.worldData.setDirty(true);

Особенности:
Захожу в мир - консоль молчит. Выключаю мир, захожу обратно, при загрузке пишет LOAD!

Нажимаю эскейт, пишет WRITE! На второй раз уже ничего не пишет...

При перезаходе в мир, всё стирается к чертям.

Надеюсь на вашу помощь, софорумчани :D

[merge_posts_bbcode]Добавлено: 07.12.2015 18:06:51[/merge_posts_bbcode]

если setDirty заменить на markDirty(); - все равно не работает.
 
Назад
Сверху