Планирование работы в игре! Фреймворк

В настоящее время я занимаюсь разработкой игрового приложения (v. 1.2.4), где пользователи могут выполнять определенные задачи и получать за это вознаграждение. Эти задачи требуют некоторой энергии, которая будет пополняться с течением времени. Основные настройки следующие:

public class User extends Model {
    public Long energy;
    public Long maxenergy;
    public Long cooldown = Long.valueOf(300);
}

public class Task extends Controller {
    public static void perform(Long id) {
        User user = User.findById(id).first();

        // do some complex task here...

        user.energy--;
        user.save();
        Task.list();
    }
}

Теперь я хочу пополнить энергию пользователя после восстановления (5 минут). Предполагая, что у пользователя есть 10/10 энергетических баллов, и я хочу пополнить балл через 5 минут после его использования, я мог бы легко использовать работу для этого:

public class EnergyHealer extends Job {
    public Long id;

    public EnergyHealer(Long id) {
        this.id = id;
    }

    public void doJob() throws Exception {
        User user = User.findById(id);
        user.energy++;
        if (user.energy > user.maxenergy) {
            user.energy = user.maxenergy;
        }
        user.save()
    }
}

... и вызовите его в моем контроллере сразу после выполнения задания:

new EnergyHealer(user.id).in(user.cooldown);

Моя проблема здесь в том, что в этом случае задания планируются одновременно, поэтому, если пользователь выполняет задание через 2 секунды после выполнения предыдущего задания, первая точка энергии пополняется через 5 минут, а последующая точка заполняется только через 2 секунды.

Итак, мне нужно сериализовать задания, например, если у меня 8 из 10 энергетических точек, это займет ровно 10 минут, пока все энергетические точки не будут пополнены.

Примечание: пользователи имеют разные уровни и получают опыт для выполнения задач, как только достигнут определенный порог. Их уровень повышается, и все точки энергии пополняются, независимо от того, сколько из них использовалось на предыдущем уровне, поэтому некоторые задания могут устареть к моменту их выполнения.

Принимая во внимание несколько тысяч пользователей, рабочие места могут вообще не быть идеальным выбором, поэтому, если у кого-то есть идея о том, как достичь описанного сценария, я рад любой помощи!

1 ответ

Решение

Я думаю, что у вас просто неправильное расписание работы. Вместо того, чтобы запускать вашу работу каждый раз, когда они выполняют какое-либо действие, вы должны просто иметь фасад или что-то, что будет запускать работу, только если она еще не существует для пользователя.

  1. Если работа еще не создана, создайте ее, иначе ничего не делайте

  2. тогда это должно добавить 1 энергию,

  3. проверить, если энергия полна, если это так, конец

  4. если нет, сделайте паузу на 5 минут

  5. вернуться к 2

Другие вопросы по тегам