- 5,149
- 49
- 899
Как вы знаете в ванили есть тотальное время жизни мира, время жизни мира при заходе в него, а также смена дня и ночи. Было бы неплохо до конца систематизировать это и сделать не только день\ночь, но и полноценный календарь. С помощью @Dahaka мне удалось слепить что то такое, и этот код работает на версии 1.7.10. То есть счетчик крутится, нбтшки сохраняются.
На версии 1.12.2 это не работает - я проверил, просто не вызываются методы ни write, ни соотвественно, read. В чем может быть проблема, кто подскажет?
На версии 1.12.2 это не работает - я проверил, просто не вызываются методы ни write, ни соотвественно, read. В чем может быть проблема, кто подскажет?
Java:
public class TimeHundler {
private static class TimeTicker extends WorldSavedData {
private static String name = Realism.MODID + "wsdName";
public TimeTicker(String name) {
super(name);
}
public TimeTicker() {
super(name);
}
public int year = 0;
public int month = 0;
public int day = 0;
@Override
public void readFromNBT(NBTTagCompound nbt) {
day = nbt.getInteger("day");
month = nbt.getInteger("month");
year = nbt.getInteger("year");
System.out.println("readFromNBT");
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
nbt.setInteger("day", day);
nbt.setInteger("month", month);
nbt.setInteger("year", year);
System.out.println("writeToNBT");
return nbt;
}
private static boolean IS_GLOBAL = true;
private static TimeTicker get(World world) {
MapStorage storage = IS_GLOBAL ? world.getMapStorage() : world.getPerWorldStorage();
TimeTicker instance = (TimeTicker) storage.getOrLoadData(TimeTicker.class, name);
if (instance == null) {
instance = new TimeTicker(name);
storage.setData(name, instance);
instance.markDirty();
}
return instance;
}
}
private static TimeTicker tt;
@SubscribeEvent
public void converterTime(TickEvent.WorldTickEvent event) {
if (event.phase != event.phase.END) {
return;
}
if (tt == null) {
tt = TimeTicker.get(event.world);
}
tt.day++;
tt.markDirty();
System.out.println(tt.day);
}
@SubscribeEvent
public void loadWorld(WorldEvent.Load event) {
tt = TimeTicker.get(event.getWorld());
}
}