Спаун моба в определенное время

Версия Minecraft
1.7.10
355
2
17
Добро. Чет совсем голову сломал. Необходимо заспунить моба в определенное время, если он мертв, к примеру в 15:30, если он мертв - призвать, и начать отсчет к следующим 15:30.

Но тут возникло несколько проблема, первая, это определение времени, к примеру можно получить так:

Java:
    Calendar calendar = Calendar.getInstance();
    long respawnTime = TimeUnit.HOURS.toMillis(15) + TimeUnit.MINUTES.toMillis(30);
    long currentTime = TimeUnit.HOURS.toMillis(calendar.get(Calendar.HOUR_OF_DAY)) + TimeUnit.MINUTES.toMillis(calendar.get(Calendar.MINUTE)) + TimeUnit.SECONDS.toMillis(calendar.get(Calendar.SECOND));
    
    long left = respawnTime - currentTime;
    log("Time left %02d:%02d:%02d (%s)",
        TimeUnit.MILLISECONDS.toHours(left),
        TimeUnit.MILLISECONDS.toMinutes(left) -
            TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(left)),
        TimeUnit.MILLISECONDS.toSeconds(left) -
            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(left)), left);


И к примеру, как только left становится ниже или равно 0 = спаунить.
Но в этом же и идёт проблема, что на сегодняшний день, если его убьют, то время так и будет в минусе. Можно было бы булом проверять спаун на сегодня, но это тоже не оптимально, хочется какое-то универсальное решение.
 
Решение
Java:
Date now = new Date();
            LocalTime time = LocalTime.of(15, 30, 0);

            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, time.getHour());
            calendar.set(Calendar.MINUTE, time.getMinute());
            calendar.set(Calendar.SECOND, time.getSecond());
            Date spawn = calendar.getTime();
            if(now.after(spawn)){
                calendar.add(Calendar.DAY_OF_YEAR, 1);
                spawn = calendar.getTime();
            }

long timeLeft = spawn.getTime() - System.currentTimeMillis();[/ICODE]
30
4
12
Что то на вроде такого...?
Java:
long respawnTime; //Не надо ее переопределять каждый раз при проверке времени до спавна, обновлять только пока моб жив, либо в момент смерти.
//Но с последним сомнительно, мало ли в каком порядке будет проверяться или будет пролаг и моб сразу после смерти воскреснет.
...
public void onEntityAlive() {
    if (entity.isDead) return; //Если мертв то даже не суемся дальше
    this.respawnTime = getCurTime() + TimeUnit.HOURS.toMillis(24);
}

public void tryRespawn() {
    if (!entity.isDead) return; //Если жив то даже не суемся дальше
    if (this.respawnTime <= getCurTime()) {
    //Спавн
    }
}

private long getCurTime() {
    Calendar calendar = Calendar.getInstance();
    return TimeUnit.HOURS.toMillis(calendar.get(Calendar.HOUR_OF_DAY)) + TimeUnit.MINUTES.toMillis(calendar.get(Calendar.MINUTE)) + TimeUnit.SECONDS.toMillis(calendar.get(Calendar.SECOND));
}
 
Последнее редактирование:

tox1cozZ

aka Agravaine
8,456
598
2,892
Java:
Date now = new Date();
            LocalTime time = LocalTime.of(15, 30, 0);

            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, time.getHour());
            calendar.set(Calendar.MINUTE, time.getMinute());
            calendar.set(Calendar.SECOND, time.getSecond());
            Date spawn = calendar.getTime();
            if(now.after(spawn)){
                calendar.add(Calendar.DAY_OF_YEAR, 1);
                spawn = calendar.getTime();
            }

long timeLeft = spawn.getTime() - System.currentTimeMillis();[/ICODE]
 
7,099
324
1,510
Юзай нечеткие условия, типо, <=
 
355
2
17
Java:
01:05:58 Time left 00:00:01 (1931)
01:05:59 Time left 00:00:00 (931)
01:06:00 Time left 00:00:00 (-70)
01:06:00 Spawn Entity
01:06:01 Time left 00:00:00 (-999)
01:06:01 Spawn Entity
01:06:02 Time left 23:59:58 (86398000)
01:06:03 Time left 23:59:57 (86397000)

Вынес в отдельные методы, и вот так иногда выходит.


Java:
    private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private static Date spawn = calculateNextSpawnDate();

    public static void main(String[] args) throws Exception
    {
        scheduler.scheduleAtFixedRate(new Runnable()
        {
            @Override
            public void run()
            {

                long left = spawn.getTime() - System.currentTimeMillis();

                log("Time left %02d:%02d:%02d (%s)",
                        TimeUnit.MILLISECONDS.toHours(left),
                        TimeUnit.MILLISECONDS.toMinutes(left) -
                                TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(left)),
                        TimeUnit.MILLISECONDS.toSeconds(left) -
                                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(left)), left);


                if(left <= 0)
                {
                    spawn = calculateNextSpawnDate();
                    log("Spawn Entity");
                }
            }
        }, 1, 1, TimeUnit.SECONDS);

    }

    private static Date calculateNextSpawnDate()
    {
        Date now = new Date();
        LocalTime time = LocalTime.of(13, 6, 0);

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, time.getHour());
        calendar.set(Calendar.MINUTE, time.getMinute());
        calendar.set(Calendar.SECOND, time.getSecond());
        Date spawn = calendar.getTime();

        if(now.after(spawn))
        {
            calendar.add(Calendar.DAY_OF_YEAR, 1);
            spawn = calendar.getTime();
        }

        return spawn;
    }
 
Сверху