У меня есть игра, в которой я пытаюсь реализовать функцию счастливого часа, в которой, если вы зарабатываете определенное количество баллов, в течение определенного периода времени каждый день вы что-то зарабатываете. Событие должно срабатывать только один раз в час, как только игрок выполнит требование очков.
Я испробовал несколько разных решений:
create context HappyHourContext
context InitCtx start (0, 16, *, *, *) end pattern[timer:at(0, 17, *, *, *) or TerminationEvent],
context PartitionCtx partition by playerId from EarnPointsEvent, playerId from TerminationEvent;
context HappyHourContext
insert into TerminationEvent select playerId from EarnPointsEvent having sum(points) >= 100;
Это работает только для первого игрока из-за того, что TerminationEvent не учитывает раздел.
Следующий запрос, кажется, работает правильно, однако он выглядит довольно неэффективным, поскольку он обрабатывает события даже после его вывода.
create context HappyHourContext
context InitCtx start (0, 16, *, *, *) end (0, 17, *, *, *),
context PartitionCtx partition by playerId from EarnPointsEvent);
context HappyHourContext
select playerId from EarnPointsEvent having sum(points) >= 100 output first every 1 hours
Есть ли способ завершить контекст после вывода первого события? или лучший способ сделать это?
Редактировать:
Я также пытался
create context HappyHourContext
context InitCtx start (0, 16, *, *, *) end (0, 17, *, *, *),
context PartitionCtx partition by playerId from EarnPointsEvent, playerId from TerminationEvent terminated by TerminationEvent;
context HappyHourContext
insert into TerminationEvent select playerId from EarnPointsEvent having sum(points) >= 100;
К сожалению, это выводит несколько событий на игрока из-за того, что InitCtx не завершается когда PartitionCtx равен.