TimeHundler - дни, месяцы, года.

Версия Minecraft
1.12.2
5,149
49
899
Как вы знаете в ванили есть тотальное время жизни мира, время жизни мира при заходе в него, а также смена дня и ночи. Было бы неплохо до конца систематизировать это и сделать не только день\ночь, но и полноценный календарь. С помощью @Dahaka мне удалось слепить что то такое, и этот код работает на версии 1.7.10. То есть счетчик крутится, нбтшки сохраняются.
На версии 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());
    }
}
 
Решение
Этот кусок у меня работает.
Java:
@Mod(modid = MyMod.MODID, version = MyMod.VERSION)
public class MyMod {
    public static final String MODID = "mymod";
    public static final String VERSION = "1.0";
 
    @EventHandler
    public void init(FMLInitializationEvent e) {
        MinecraftForge.EVENT_BUS.register(this);
    }
 
    @SubscribeEvent
    public void onWorldTick(TickEvent.WorldTickEvent e) {
        if (e.phase != e.phase.END) {
            return;
        }
     
        MyWsd wsd = MyWsd.get(e.world);
        wsd.myValue++;
        wsd.markDirty();
    }
 
    public static class MyWsd extends WorldSavedData {
        private static final String name = "mywsd";
     
        public int myValue = 0;
     
        public...
Твой кусок действительно работает
 
У меня все работает, как надо. Код я скинул.
Правда один вопрос остается - тикэвент срабатывает ТРИ раза в тик, что для майна вообще непонятно...
Соотвественно делая так
Java:
int getTicks = (int)e.world.getTotalWorldTime();
            if(getTicks % 20 == 0) {
                wsd.sec++;
                System.out.println("sec: " + wsd.sec);
            }
У меня раз в секунду вылетает 1-2-3 сразу. Потом 4-5-6 и тд
 
Последнее редактирование модератором:
Правда один вопрос остается - тикэвент срабатывает ТРИ раза в тик, что для майна вообще непонятно...
Соотвественно делая так
Код:
int getTicks = (int)e.world.getTotalWorldTime();
            if(getTicks % 20 == 0) {
                wsd.sec++;
                System.out.println("sec: " + wsd.sec);
            }
У меня раз в секунду вылетает 1-2-3 сразу. Потом 4-5-6 и тд
Я обычно для таких целей создаю счётчик аля "++counter % 20 == 0" после 600 тиков обнуляю.
 
не совсем понял как это связано с вопросом про то, что эвент три раза тикает?:unsure:

Можно конечно как нибудь закостылить, но у меня даже таких вариантов нет
 
Последнее редактирование:
Все таки хочу готовый ответ, но костыль подпер, в целом работает, но хочется хорошо
 
Ничего из этого не помогает...
 
Последнее редактирование:
Так где ж он неудобен-то?
А неудобен он тем, что стоит кому-нибудь через консоль прописать время жизни мира или хотя бы переключится с ночи на день, как весь ванильный счётчик обнуляется...
 
getWorldTime обнуляется
getTotalWorldTime - нет
 
Назад
Сверху