Задание (квест) - это слушатель действий игрока. Как только игрок совершает определенное действие, меняются текущие условия задания. В Вашем движке должен быть некий middleware, который будет слушать все действия и все активные задания и когда условия задания будут выполнены, он его отметит как завершенное и больше слушать его не будет. Когда игрок будет набирать воду, у вас в коде должно изменяться состояние задания.
Через этот middleware должны будут проходить все действия пользователя, а ядро уже, по их типу, будет определять "тип" действия (набор воды) и изменять состояние задания.
Я вижу это так. Остальные могут меня поправить.