与玩家任务相关的模块有:lib_task.erl(玩家任务相关操作),mod_task.erl(定时回写任务数据)

玩家任务的初始化:

在登录的时候调用lib_task:flush_role_task(PS),从数据库中加载玩家角色数据

玩家任务数据分为可接的任务,已接取的任务(task_bag)和已完成的任务(task_log)

任务的基本操作:

1.获取可接任务(接取任务条件),已接任务(任务完成进度)列表:
    lib_task:get_player_active_task(PlayerStatus)
    lib_task:get_task_tips(active, TaskId, PlayerStatus)
2.接取任务:lib_task:trigger_task(TaskId, PlayerStatus)
3.触发任务事件:lib_task:task_event/3
4.放弃任务:lib_task:abnegate_task(TaskId, PlayerStatus)
5.完成任务:lib_task:finish_task(TaskId, SelectItemList, PlayerStatus)

任务配置结构:包含了任务的基本信息,任务开启的前提条件,任务内容,任务奖励等

%% 任务数据
-record(task,{id,class = 0,                        %% 任务分类,0普通任务,1运镖任务,2帮会任务prev = 0,                         %% 上一个必须完成的任务id%% 任务内容condition = [],                   %% 条件内容    [{task, 任务id}, {item, 物品id, 物品数量}]content = [],                     %% 任务内容 state = 0,                        %% 完成任务需要的状态值 state = length(content)award_item = [],                  %% 奖励物品...}
).

玩家保存的任务结构:包括了任务的id,任务接取的时间,任务的进度等。

%% 角色任务记录
-record(role_task_bag,{id,role_id=0,task_id=0,trigger_time=0,state=0,        %% 当前任务阶段end_state=0,    %% 任务结束阶段mark=[]         %% 同#task.content}
).

其中#task.content为任务内容列表,主要有三种形式:
[State, IsFinished, kill, NpcId, Num, NowNum]    击杀指定数量怪物
[State, IsFinished, talk, NpcId, TalkId]            与指定NPC对话
[State, IsFinished, item, ItemId, Num, NowNum]    收集指定数量道具

其他还有诸如装备物品,购买物品,学习技能等事件。

一些任务相关的其他操作:

刷新任务面板:调用lib_task:refresh_can_receive_task,遍历所有任务,查看可接任务。用于玩家接取或者提交任务后更新任务面板。

任务相关的事件发生后,调用lib_task:task_event/3,更新修改相应任务状态,具体为更新玩家#role_task_bag.mark的任务进度列表。

任务完成:逐一检查任务每一阶段完成条件(检查#role_task_bag.mark列表),确认完成后,给玩家发放物品,刷新任务面板。

任务定时回写进程:

当游戏服务器启动的时候,会在sd_networking:start_task()中开启任务定时回写进程。调用mod_task:start_link(),启动任务定时回写进程,其中的初始化函数:

init([])->erlang:send_after(10000, self(), syn_db),Timeout = 60000Limit = 100,{ok, #state{id = 1, interval = Timeout, limit = Limit, cache = []}}.handle_info(syn_db, State) ->%% 开始异步回写spawn(fun() -> NewCache = compress(State#state.cache, []), %% 将数据回存数据库的方法syn_db(NewCache)end),%% 再次启动闹钟erlang:send_after(State#state.interval, self(), syn_db),{noreply, State#state{cache = []}};

可知该进程会每隔60s将缓存数据压缩并写回数据库,并清空缓存

可对进程内任务缓存做五种操作:

添加任务完成日志:    add_finish_log
删除任务完成日志:    del_finish_log
添加任务触发日志:    add_trigger_log
更新已触发任务状态:upd_trigger_task_state
删除已触发任务:    del_trigger_task

英雄远征Erlang源码分析(12)-任务模块解析相关推荐

  1. 英雄远征Erlang源码分析(1)-源码结构解析

    偶然得到了一份英雄远征的Erlang服务端源代码,想着通过对源代码的分析,来熟悉使用Erlang编程语言的游戏服务器的设计,游戏中关键逻辑的实现. 解压压缩文件后,在Idea内导入文件夹创建相关工程, ...

  2. 英雄远征Erlang源码分析(13)-总结 附上可执行的服务端和客户端代码

    总结:其实也没有什么好总结的......英雄远征这套源码虽然说体积并不大,麻雀虽小五脏俱全,对于MMORPG网游的一些基本系统都有完备的实现,虽然实现方法不一定是最好的.除去场景,战斗,组队,任务等那 ...

  3. 英雄远征Erlang源码分析(2)-网关服务器的启动

    上一篇文章解析了游戏源码的结构,我们知道该源码包含两个服务器的启动脚本:网关服务器和游戏服务器,其中网关服务器用于在玩家选择进入游戏服务器之前获取服务器列表,游戏服务器则处理玩家进入游戏服务器后的登录 ...

  4. 英雄远征Erlang源码分析(5)-协议解析与玩家登录处理

    现在,客户端与服务器的连接算是正式建立了,此时用户需要做的第一件事就是登陆.不过在登录之前,我们要先研究下前后端通信的协议. 客户端与服务端建立连接后,通过提前制定好的协议进行交互.具体的协议文档在d ...

  5. 英雄远征Erlang源码分析(3)-游戏服务器的启动

    上一篇文件介绍了网关服务器的启动,其功能主要用于给客户端返回可选的游戏服务器列表,让客户端去连接.其实有些游戏的网关部分使用的是PHP搭建,代码的维护和Erlang是分开的.现在让我们来看游戏服务器的 ...

  6. 英雄远征Erlang源码分析(6)-玩家进程初始化和玩家模块相关方法

    客户端发送登录请求后,服务器检查玩家登录需求,创建玩家进程以及进行相关的初始化工作,只有这些做完后,客户端操控的角色才算是和服务器的玩家进程建立了关联. 创建玩家进程调用mod_player:star ...

  7. 英雄远征Erlang源码分析(9)-战斗流程解析

    和战斗相关的模块有mod_battle.erl 当玩家进程和怪物进程被创建的时候都会通过mod_battle:start_link()创建一个战斗进程. 该战斗进程的state,用于保存玩家上次出手或 ...

  8. 英雄远征Erlang源码分析(10)-队伍相关

    组队相关模块有mod_team.erl和lib_team.erl 通过24000协议请求,调用mod_team:start(Uid,Pid,Nick,TeamName)开启组队进程,创建队伍 组队st ...

  9. 英雄远征Erlang源码分析(8)-怪物相关

    与怪物相关的模块有三个:mod_mon_create.erl,mod_mon_active.erl,lib_mon.erl mod_mon_create:创建负责创建怪物的进程,通过mod_mon_c ...

最新文章

  1. 一场由金山词霸引起的车祸 Process finished with exit code -1073741819 (0xC0000005)
  2. 美团智能问答技术探索与实践
  3. RedHat开机启动流程
  4. chm 能插入公式吗_批量提取表格名称、插入空列,教你三下五除二秒速完成!...
  5. vb.net2019-读取定宽文本文件-比如日志
  6. Activity功能控件
  7. 计算结构体、数组、指针的sizeof
  8. 一键多功能按键识别c语言,单片机一键多功能按键识别设计
  9. 1.3、Bootstrap V4自学之路------起步---浏览器支持
  10. 静态注册fragment_Fragment的静态和动态添加方式以及Fragment和Activity之间的通信方式...
  11. .config文件与.xml文件的关系
  12. Linux网络-MAC协议
  13. 正大国际琪貨:为什么资深交易者更倾向于裸K?
  14. 苹果库乐队怎么玩_iPhone实用技巧:怎么将抖音上的背景音乐制作成手机铃声
  15. ES7241D低功耗音频ADC芯片##小爱音响
  16. 粉笔公考——错题集——行测
  17. leetcode 区间问题
  18. 2019年工作总结——没有岁月可回首,珍惜当下不负流年
  19. 算法珠玑-变位词的四种解法
  20. 《轩辕剑4》最新秘籍

热门文章

  1. EveryThing下载链接
  2. rocksdb性能mysql_mysql rocksdb使用报告
  3. 到处都是Unix的胎记
  4. linux局域网连接网络打印机驱动,柯尼卡美能达网络打印驱动程序安装方法
  5. 基于localStorage开发的前端缓存jquery插件,jquery.cache.js [修改]
  6. 什么是换热器,换热器的种类有哪些QY-RG33
  7. Windows XP \Windows 2003启动过程的学习及故障分析处理(六c)
  8. 最新!2022全球大学学术影响力排名发布!清华、北大、浙大位居内地前三!
  9. oracle查看表扩展,求助:如何查询oracle表空间允许自动扩展的最大值? - Oracle论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  10. 联想微型计算机开机出现省电模式怎么解除,联想电脑开机出现节电模式怎么处理...