任务系统解析

前言

任务有主线,日常,也有和活动相连的活动任务,很多项目用得到,例如饿了吗接单,消费等任务

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.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值