Сохранение инфы в чанке. Приват

Версия Minecraft
1.7.10
Решение
Код:
public class SimpleSaveData extends WorldSavedData {
    public int number; // Тут будет наше число

    public SimpleSaveData(String name) {
        super(name);
    }

    // Считываем с NBT
    @Override
    public void readFromNBT(NBTTagCompound nbt) {
        number = nbt.getInteger("number");
    }

    // Записываем в NBT
    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
        nbt.setInteger("number", number);
        return nbt;
    }
}

Код:
       String name = "simpleData";

        SimpleSaveData data = (SimpleSaveData) world.loadData(SimpleSaveData.class, name); // Загружаем дату из мира
        data.number = 5; // Изменяем наше число
        data.markDirty(); // Обязательно после изменения
...
699
9
53
Minebot написал(а):
Nikitatik написал(а):
Единственное что мне не понятно это юзать как. Т.е. создал объект этой даты, а вот дальше я не знаю что делать.

Дальше, если до этого в мир не сохранял, сохраняешь в мир с помощью world.setData. Данный объект в любое время можно легко достать из мира с помощью world.loadData, прочекать что там тебе надо, изменить его. После изменения обязательно прописать markDirty(), что бы изменения сохранились. Сохранение переменных в nbt надо прописывать вручную в классе даты. Если и сейчас не понял, то прости, я тут не помогу

Моя не понял.
Можешь дать пример без лишних наворочек?(просто ворлдсайведдата с сохранением одного числа к примеру, если можешь объясни комментариями в коде)
Заранее спасибо!(третий раз)
 
1,015
9
102
Код:
public class SimpleSaveData extends WorldSavedData {
    public int number; // Тут будет наше число

    public SimpleSaveData(String name) {
        super(name);
    }

    // Считываем с NBT
    @Override
    public void readFromNBT(NBTTagCompound nbt) {
        number = nbt.getInteger("number");
    }

    // Записываем в NBT
    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
        nbt.setInteger("number", number);
        return nbt;
    }
}

Код:
       String name = "simpleData";

        SimpleSaveData data = (SimpleSaveData) world.loadData(SimpleSaveData.class, name); // Загружаем дату из мира
        data.number = 5; // Изменяем наше число
        data.markDirty(); // Обязательно после изменения


Dahaka написал(а):
Minebot написал(а):
Дальше, если до этого в мир не сохранял, сохраняешь в мир с помощью world.setData.
Если у WSD есть конструктор с 1им параметром строкой, то все создастся само.

Да? Не знал. Буду знать
 
699
9
53
Minebot написал(а):
Код:
public class SimpleSaveData extends WorldSavedData {
    public int number; // Тут будет наше число

    public SimpleSaveData(String name) {
        super(name);
    }

    // Считываем с NBT
    @Override
    public void readFromNBT(NBTTagCompound nbt) {
        number = nbt.getInteger("number");
    }

    // Записываем в NBT
    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
        nbt.setInteger("number", number);
        return nbt;
    }
}

Код:
       String name = "simpleData";

        SimpleSaveData data = (SimpleSaveData) world.loadData(SimpleSaveData.class, name); // Загружаем дату из мира
        data.number = 5; // Изменяем наше число
        data.markDirty(); // Обязательно после изменения


Dahaka написал(а):
Minebot написал(а):
Дальше, если до этого в мир не сохранял, сохраняешь в мир с помощью world.setData.
Если у WSD есть конструктор с 1им параметром строкой, то все создастся само.

Да? Не знал. Буду знать



Огромное спасибо!
Т.е когда тыкаешь markDirty(); оно юзает твой метод writeToNBT?
Таким способом можно воротить любые данные?(как с простым NBT)
То есть чтоб мне подстроить под себя мне просто нужно сделать больше полей в NBT?
А в NBT можно строки записать?
 
1,015
9
102
Nikitatik написал(а):
Т.е когда тыкаешь markDirty(); оно юзает твой метод writeToNBT?
Оно его будет юзать при сохранении мира

Nikitatik написал(а):
Таким способом можно воротить любые данные?(как с простым NBT)
То есть чтоб мне подстроить под себя мне просто нужно сделать больше полей в NBT?
Да

Nikitatik написал(а):
А в NBT можно строки записать?
nbt.setString :-/
 
699
9
53
Minebot написал(а):
У меня в моде реализовано это через WorldSaveData (т.к. в эвенте у меня вся NBT дата стиралась при перезаходе в мир)
Вот простой пример привата через WorldSaveData:
Код:
public class PrivateSaveData extends WorldSavedData {
    public static final String NAME = "chunkPrivateData";

    public HashMap<ChunkPos, int> map = new HashMap<>();

    public PrivateSaveData(){
        super(NAME);
    }

    public PrivateSaveData(String name) {
        super(name);
    }

    @Override
    public void readFromNBT(NBTTagCompound nbt) {
        map = new HashMap<>();
        NBTTagList list = (NBTTagList) nbt.getTag("chunk");
        for (NBTBase base : list){
            NBTTagCompound tag = (NBTTagCompound)base;
            map.put(new ChunkPos(tag.getInteger("x"), tag.getInteger("z")), tag.getInteger("hashCode"));
        }
    }

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
        NBTTagList list = new NBTTagList();
        for (ChunkPos pos : map.keySet()){
            NBTTagCompound tag = new NBTTagCompound();
            tag.setInteger("x", pos.chunkXPos);
            tag.setInteger("z", pos.chunkZPos);
            tag.setInteger("hashCode", map.get(pos));
            list.appendTag(tag);
        }
        nbt.setTag("chunk", list);
        return nbt;
    }

    // Приват определенного чанка на какого-либо игрока
    public static void privateChunk(ChunkPos pos, EntityPlayer player){
        PrivateSaveData data = PrivateSaveData.getNotNullData(player.world);
        data.map.put(pos, player.getUniqueID().hashCode());
        data.markDirty();
    }

    // Удаление привата из чанка
    public static void removePrivateFromChunk(ChunkPos pos, World world){
        PrivateSaveData data = PrivateSaveData.getNotNullData(world);
        if (data.map.containsKey(pos)){
            data.map.remove(pos);
            data.markDirty();
        }
    }

    // Может ли данный игрок строить в этом чанке?
    public static boolean canPlayerBuild(ChunkPos pos, EntityPlayer player){
        PrivateSaveData data = PrivateSaveData.getNotNullData(player.world);
        if (data.map.containsKey(pos)){
            int code = player.getUniqueID().hashCode();
            return data.map.get(pos) == code;
        }
        else
            return true;
    }

    // Получение даты
    public static PrivateSaveData getNotNullData(World world){
        WorldSavedData data = world.loadData(PrivateSaveData.class, NAME);
        if (data == null){
            data = new PrivateSaveData();
            world.setData(NAME, data);
        }
        return (PrivateSaveData) data;
    }

}

Попытался вставить - мне эклипс столько ошибок навыдавал.
 
691
1
5
Nikitatik написал(а):
Minebot написал(а):
У меня в моде реализовано это через WorldSaveData (т.к. в эвенте у меня вся NBT дата стиралась при перезаходе в мир)
Вот простой пример привата через WorldSaveData:
Код:
public class PrivateSaveData extends WorldSavedData {
    public static final String NAME = "chunkPrivateData";

    public HashMap<ChunkPos, int> map = new HashMap<>();

    public PrivateSaveData(){
        super(NAME);
    }

    public PrivateSaveData(String name) {
        super(name);
    }

    @Override
    public void readFromNBT(NBTTagCompound nbt) {
        map = new HashMap<>();
        NBTTagList list = (NBTTagList) nbt.getTag("chunk");
        for (NBTBase base : list){
            NBTTagCompound tag = (NBTTagCompound)base;
            map.put(new ChunkPos(tag.getInteger("x"), tag.getInteger("z")), tag.getInteger("hashCode"));
        }
    }

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
        NBTTagList list = new NBTTagList();
        for (ChunkPos pos : map.keySet()){
            NBTTagCompound tag = new NBTTagCompound();
            tag.setInteger("x", pos.chunkXPos);
            tag.setInteger("z", pos.chunkZPos);
            tag.setInteger("hashCode", map.get(pos));
            list.appendTag(tag);
        }
        nbt.setTag("chunk", list);
        return nbt;
    }

    // Приват определенного чанка на какого-либо игрока
    public static void privateChunk(ChunkPos pos, EntityPlayer player){
        PrivateSaveData data = PrivateSaveData.getNotNullData(player.world);
        data.map.put(pos, player.getUniqueID().hashCode());
        data.markDirty();
    }

    // Удаление привата из чанка
    public static void removePrivateFromChunk(ChunkPos pos, World world){
        PrivateSaveData data = PrivateSaveData.getNotNullData(world);
        if (data.map.containsKey(pos)){
            data.map.remove(pos);
            data.markDirty();
        }
    }

    // Может ли данный игрок строить в этом чанке?
    public static boolean canPlayerBuild(ChunkPos pos, EntityPlayer player){
        PrivateSaveData data = PrivateSaveData.getNotNullData(player.world);
        if (data.map.containsKey(pos)){
            int code = player.getUniqueID().hashCode();
            return data.map.get(pos) == code;
        }
        else
            return true;
    }

    // Получение даты
    public static PrivateSaveData getNotNullData(World world){
        WorldSavedData data = world.loadData(PrivateSaveData.class, NAME);
        if (data == null){
            data = new PrivateSaveData();
            world.setData(NAME, data);
        }
        return (PrivateSaveData) data;
    }

}

Попытался вставить - мне эклипс столько ошибок навыдавал.
Оооо...! Мой сурсы)) gtoe
 
699
9
53
Minebot написал(а):
Nikitatik написал(а):
Не только они там были


Ещё куча разной фигни.



Всё почему? Потому что не импортировал код



Я импортировал и остались ошибки, я их исправил но вот например это:
@Override
  public void readFromNBT(NBTTagCompound nbt) {
      map = new HashMap<ChunkPosition, Integer>();
      NBTTagList list = (NBTTagList) nbt.getTag("chunk");
      for (NBTBase base : list){
          NBTTagCompound tag = (NBTTagCompound)base;
          map.put(new ChunkPosition(tag.getInteger("x"), tag.getInteger("z"), 0), tag.getInteger("hashCode"));
      }
  }
Пишет что list в цикле не моет быть ибо он не Iterable.
А тут:
@Override
  public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
      NBTTagList list = new NBTTagList();
      for (ChunkPosition pos : map.keySet()){
          NBTTagCompound tag = new NBTTagCompound();
          tag.setInteger("x", pos.chunkPosX);
          tag.setInteger("z", pos.chunkPosZ);
          tag.setInteger("hashCode", map.get(pos));
          list.appendTag(tag);
      }
      nbt.setTag("chunk", list);
      return nbt;
  }
Пишет что этот метод должен быть без этого

Были ещё мелкие ошибки не совпадали имена полей подобрал правильные для моей версии.
А также у меня не было класса ChunkPos нашёл ему замену класс ChunkPosition
И ещё метод доставания из мира воролдсейвед дату у меня называется не world.loadData, а world.loadItemData, аналогично и с world.setData.
И ещё я не совсем понимаю зачем метод getNotNullData().

Попробую по другому, в чанковые nbt.
 
1,015
9
102
Nikitatik написал(а):
Minebot написал(а):
Nikitatik написал(а):
Не только они там были


Ещё куча разной фигни.



Всё почему? Потому что не импортировал код



Я импортировал и остались ошибки, я их исправил но вот например это:
@Override
  public void readFromNBT(NBTTagCompound nbt) {
      map = new HashMap<ChunkPosition, Integer>();
      NBTTagList list = (NBTTagList) nbt.getTag("chunk");
      for (NBTBase base : list){
          NBTTagCompound tag = (NBTTagCompound)base;
          map.put(new ChunkPosition(tag.getInteger("x"), tag.getInteger("z"), 0), tag.getInteger("hashCode"));
      }
  }
Пишет что list в цикле не моет быть ибо он не Iterable.
А тут:
@Override
  public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
      NBTTagList list = new NBTTagList();
      for (ChunkPosition pos : map.keySet()){
          NBTTagCompound tag = new NBTTagCompound();
          tag.setInteger("x", pos.chunkPosX);
          tag.setInteger("z", pos.chunkPosZ);
          tag.setInteger("hashCode", map.get(pos));
          list.appendTag(tag);
      }
      nbt.setTag("chunk", list);
      return nbt;
  }
Пишет что этот метод должен быть без этого

Были ещё мелкие ошибки не совпадали имена полей подобрал правильные для моей версии.
А также у меня не было класса ChunkPos нашёл ему замену класс ChunkPosition
И ещё метод доставания из мира воролдсейвед дату у меня называется не world.loadData, а world.loadItemData, аналогично и с world.setData.
И ещё я не совсем понимаю зачем метод getNotNullData().

Попробую по другому, в чанковые nbt.



А да, эт я не для 1.7.10 написал :) Но суть та же


Все итерации в for можно заменить на другую конструкцию: int i = 0; i < size; i++
 
Сверху