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(); // Обязательно после изменения
Minebot написал(а):Nikitatik написал(а):Единственное что мне не понятно это юзать как. Т.е. создал объект этой даты, а вот дальше я не знаю что делать.
Дальше, если до этого в мир не сохранял, сохраняешь в мир с помощью world.setData. Данный объект в любое время можно легко достать из мира с помощью world.loadData, прочекать что там тебе надо, изменить его. После изменения обязательно прописать markDirty(), что бы изменения сохранились. Сохранение переменных в nbt надо прописывать вручную в классе даты. Если и сейчас не понял, то прости, я тут не помогу
Если у WSD есть конструктор с 1им параметром строкой, то все создастся само.Minebot написал(а):Дальше, если до этого в мир не сохранял, сохраняешь в мир с помощью world.setData.
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 написал(а):Если у WSD есть конструктор с 1им параметром строкой, то все создастся само.Minebot написал(а):Дальше, если до этого в мир не сохранял, сохраняешь в мир с помощью world.setData.
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 написал(а):Если у WSD есть конструктор с 1им параметром строкой, то все создастся само.Minebot написал(а):Дальше, если до этого в мир не сохранял, сохраняешь в мир с помощью world.setData.
Да? Не знал. Буду знать
Оно его будет юзать при сохранении мираNikitatik написал(а):Т.е когда тыкаешь markDirty(); оно юзает твой метод writeToNBT?
ДаNikitatik написал(а):Таким способом можно воротить любые данные?(как с простым NBT)
То есть чтоб мне подстроить под себя мне просто нужно сделать больше полей в NBT?
nbt.setString :-/Nikitatik написал(а):А в NBT можно строки записать?
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; } }
Оооо...! Мой сурсы)) gtoeNikitatik написал(а):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; } }
Попытался вставить - мне эклипс столько ошибок навыдавал.
Nikitatik написал(а):Попытался вставить - мне эклипс столько ошибок навыдавал.
Nikitatik написал(а):Не только они там были
Ещё куча разной фигни.
Minebot написал(а):Nikitatik написал(а):Не только они там были
Ещё куча разной фигни.
Всё почему? Потому что не импортировал код
Пишет что list в цикле не моет быть ибо он не Iterable.@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"));
}
}
Пишет что этот метод должен быть без этого@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;
}
Были ещё мелкие ошибки не совпадали имена полей подобрал правильные для моей версии.NBTTagCompound nbt
Nikitatik написал(а):Minebot написал(а):Nikitatik написал(а):Не только они там были
Ещё куча разной фигни.
Всё почему? Потому что не импортировал код
Я импортировал и остались ошибки, я их исправил но вот например это:
Пишет что list в цикле не моет быть ибо он не Iterable.@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"));
}
}
А тут:
Пишет что этот метод должен быть без этого@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;
}
Были ещё мелкие ошибки не совпадали имена полей подобрал правильные для моей версии.NBTTagCompound nbt
А также у меня не было класса ChunkPos нашёл ему замену класс ChunkPosition
И ещё метод доставания из мира воролдсейвед дату у меня называется не world.loadData, а world.loadItemData, аналогично и с world.setData.
И ещё я не совсем понимаю зачем метод getNotNullData().
Попробую по другому, в чанковые nbt.