前言
任务有主线,日常,也有和活动相连的活动任务,很多项目用得到,例如饿了吗接单,消费等任务
TaskParser任务解析类
这里和活动有区别,任务实现类统一管理任务,各任务解析器触发任务事件
public interface TaskParser {
/**
* 初始化
* @param task
* @param taskConfig
*/
void init(Task task, TaskConfig taskConfig);
/**
* 解析
* @param t
* @param task
* @param taskConfig
*/
boolean parser(GameEvent event, Task task, TaskConfig taskConfig);
}
AbstractTaskParser实现类
public abstract class AbstractTaskParser<T> implements TaskParser {
protected final Logger LOGGER = LoggerFactory.getLogger(getClass());
@Autowired
private TaskContext taskContext;
@Autowired
protected GlobalConfigService globalConfigService;
@PostConstruct
private void init() {
taskContext.register(getType(), this);
}
protected abstract TaskConditionType getType();
@Override
public boolean parser(GameEvent event, Task task, TaskConfig taskConfig) {
T t = event.convert();
return this.parseCondition(t, task, taskConfig);
}
protected abstract boolean parseCondition(T event, Task task, TaskConfig taskConfig);
}
具体任务实现
添加好友任务
添加好友时触发事件
DispatchHelper.postEvent(new FriendAddEvent(actorId));
任务解析,如果条件达到则完成
@Component
public class FriendAddTaskParser extends AbstractTaskParser<FriendAddEvent> {
@Override
public void init(Task task, TaskConfig taskConfig) {
}
@Override
protected TaskConditionType getType() {
return TaskConditionType.FRIEND_ADD;
}
@Override
protected boolean parseCondition(FriendAddEvent event, Task task, TaskConfig taskConfig) {
task.setValue(task.getValue() + 1);
if (task.getValue() >= taskConfig.getValue()) {
task.setStatus(TaskStatus.FINISH);
}
return true;
}
}
TaskParser解析方法parser,具体解析方式任务类实现
@Override
public void onEvent(GameEvent event) {
Collection<Task> refreshTaskList = Lists.newArrayList();
this.refreshTaskOpenStatus(event, refreshTaskList);
long actorId = event.getUniqueId();
Collection<TaskConditionType> types = taskContext.getTypes(event.name);
if (types != null) {
for (TaskConditionType conditionType : types) {
TaskParser parser = taskContext.getParser(conditionType);
if (parser == null) {
LOGGER.error("TaskParser not found, conditionType:{}", conditionType);
continue;
}
TaskFacade任务接口
public interface TaskFacade {
/**
* 获取任务列表
* @param actorId
* @return
*/
Collection<Task> getTaskList(long actorId);
/**
* 获取活跃值
* @param actorId
* @return
*/
TResult<Active> getActive(long actorId);
/**
* 领取任务奖励
* @param actorId
* @param taskId
* @return
*/
TResult<RewardResult> receiveTask(long actorId, int taskId);
/**
* 领取活跃值奖励
* @param actorId
* @param value
* @return
*/
TResult<RewardResult> receiveActive(long actorId, int value);
/**
* 创建任务
* @param actorId
* @param taskConfig
*/
TResult<Task> creatTask(long actorId, TaskConfig taskConfig);
/**
* 创建任务(不会初始化)
* @param actorId
* @param taskIds
*/
void createTask(long actorId, Collection<Integer> taskIds);
/**
* 一键领取任务奖励
* @param actorId
* @return
*/
TResult<RewardResult> quickReceiveTask(long actorId, int taskType);
}
TaskFacadeImpl任务实现类
这里和活动有区别,任务实现类统一管理任务,各任务解析器触发任务事件,直接贴代码看吧
@Component
public class TaskFacadeImpl extends GameBaseFacade implements TaskFacade, OnEventListener {
@Autowired
private TaskDao taskDao;
@Autowired
private TaskContext taskContext;
@Autowired
private ActiveDao activeDao;
@Autowired
private ActivityGlobalDao activityGlobalDao;
@Override
public Collection<Task> getTaskList(long actorId) {
Collection<Task> taskList = taskDao.getTaskList(actorId);
if (taskList.isEmpty()) {
Collection<TaskConfig> taskConfigList = TaskConfigService.getInitTaskConfigList();
TResult<Active> activeResult = this.getActive(actorId);
Active active = activeResult.item;
Map<Integer, Integer> titleTaskDiffcultMap = globalConfigService.findGlobalObject(GlobalConfigKey.TITLE_DIFFCULT_NUM, IntMapConfig.class)
.getMap();
if (!DateUtils.isToday(active.getLastResetTitleTaskTime())) {
Collection<TaskConfig> titleTaskList = TaskConfigService.randomTask(titleTaskDiffcultMap, getExcludeTaskGroupIdList(actorId));
if (!titleTaskList.isEmpty()) {
taskConfigList.addAll(titleTaskList);
active.setLastResetTitleTaskTime(System.currentTimeMillis());
dbQueue.updateQueue(active);
}
}
for (TaskConfig taskConfig : taskConfigList) {
this.creatTask(actorId, taskConfig);
}
taskList = taskDao.getTaskList(actorId);
}
return taskList;
}
private List<Integer> getExcludeTaskGroupIdList(long actorId) {
int titleId = ActorHelper.getTitleId(actorId);
ActorTitleConfig actorTitleConfig = globalConfigService.findConfig(IdentiyKey.build(titleId), ActorTitleConfig.class);
if (actorTitleConfig == null) {
List<Integer> initExcludeGroupIdList = globalConfigService
.findGlobalObject(GlobalConfigKey.TITLE_INIT_EXCLUDE_TASK_GROUP_LIST, IntListConfig.class).getVs();
return initExcludeGroupIdList;
}
return actorTitleConfig.getExcludeTaskGroupIdList();
}
/**
* 创建任务
* @param actorId
* @param taskConfig
* @return
*/
@Override
public TResult<Task> creatTask(long actorId, TaskConfig taskConfig) {
if (taskConfig.getTaskType() == TaskType.CARNIVAL
&& SettingsHelper.getServerStartDays() > globalConfigService.findGlobalConfig(GlobalConfigKey.CARNIVAL_DURATION_DAYS).findInt()) {
return TResult.fail();
}
if (taskConfig.getTaskType() == TaskType.HALF_MONTH_FESTIVAL && (SettingsHelper.getServerStartDays() > globalConfigService
.findGlobalConfig(GlobalConfigKey.HALF_MONTH_DAYS).findInt()
|| SettingsHelper.getServerStartDays() <= globalConfigService.findGlobalConfig(GlobalConfigKey.CARNIVAL_DURATION_DAYS).findInt())) {
return TResult.fail();
}
if (taskConfig.getTaskType() == TaskType.TREASURE_GIFT
&& ActivityOpenConfigService.getActivityOpenConfigList(ActivityType.ACTIVITY_TYPE_41).isEmpty()) {
return TResult.fail();
} else if (taskConfig.getTaskType() == TaskType.HAPPY_CELEBRATION
&& ActivityOpenConfigService.getActivityOpenConfigList(ActivityType.ACTIVITY_TYPE_75).isEmpty()) {
return TResult.fail();
} else if (taskConfig.getTaskType() == TaskType.ACTIVITY_85
&& ActivityOpenConfigService.