Планирование работы в игре! Фреймворк
В настоящее время я занимаюсь разработкой игрового приложения (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 энергию,
проверить, если энергия полна, если это так, конец
если нет, сделайте паузу на 5 минут
вернуться к 2