游戏中,玩家物品的管理是通过每个玩家独有的物品管理进程,结合ETS缓存表实现的。

物品相关模块有mod_goods.erl,lib_goods.erl,goods_util.erl和lib_make.erl

mod_goods.erl:物品管理进程模块,负责创建进程,进程内接收消息并调用相关操作。
lib_goods.erl:负责物品的发放和删除,物品属性修改,背包内物品更改(物品堆叠处理),掉落管理,
goods_util.erl:负责服务器启动时和用户登录时物品数据的初始化;通过指定id或者属性获取对应的物品
lib_make.erl:负责物品品质升级,强化,打洞,镶嵌,洗练的计算

游戏中的物品主要分为两种:物品原型(type_goods)和玩家所属物品(goods)。当玩家获得物品的时候,需要根据物品原型生成相应的玩家所属物品,将一些未确定的物品属性确定下来,将其和玩家id进行关联,并将物品id记录到玩家背包中。

物品的初始化分为两个步骤:
1.服务器启动时的初始化:在mod_kenel.erl中调用init_goods(),将数据库中的物品原型数据和物品属性加载进ETS缓存。
2.玩家登录时的初始化:玩家登录时调用mod_goods:start(PlayerId,CellNum,Equip)创建物品管理进程,并返回Pid,保存在#player_status.goods_pid中。

物品管理进程初始化方法:

init([PlayerId,CellNum, Equip]) ->ok = goods_util:init_goods_online(PlayerId),    %% 从数据库中加载玩家物品信息,放入ETS缓存NullCells = goods_util:get_null_cells(PlayerId, CellNum),    %% 计算背包空格EquipSuit = goods_util:count_equip_suit_list(PlayerId, Equip),    %% 计算套装GoodsStatus = #goods_status{ player_id = PlayerId, null_cells = NullCells, equip_current = [0,0,0], equip_suit_list=EquipSuit },    %% 生成物品管理进程stateNewStatus = goods_util:get_current_equip(GoodsStatus, Equip),    %% 获取武器,坐骑,衣服列表{ok, NewStatus}.

进程state:

-record(goods_status, {player_id = 0,              % 用户ID            (REF:player-player_id)null_cells = [],            % 背包空格子位置equip_current = [0,0,0],    % 当前装备类型ID - [武器, 衣服, 坐骑]equip_suit = [],            % 套装属性ct_time = 0                 % 使用药品的冷却时间}).

玩家5个放放物品的位置:套装1,套装2,套装3,套装4,套装5

物品的相关操作,试着使用思维导图整理了一些,初学思维导图,感觉整理还不是很到位,当做一次练手吧:


除去基本的物品增删改查,主要还有物品的属性强化(品质升级,装备强化,洗练等),背包整理,掉落管理的操作。所有的都罗列出来有流水账的嫌疑,这里选取一些比较关键的方法进行解析:

背包内物品的叠加计算:如果是可叠加的物品,加入背包时需要和原有的同类型物品进行叠加,减少背包格子的占用

%% 更新原有的可叠加物品
%% 返回叠加现有物品后剩余的物品数量
update_overlap_goods(GoodsInfo, [Num, MaxOverlap]) ->case Num > 0 oftrue when GoodsInfo#goods.num =/= MaxOverlap andalso MaxOverlap > 0 ->{LapHasNum, RestNum} = case Num + GoodsInfo#goods.num > MaxOverlap of%% 总数超出可叠加数true ->{MaxOverlap, Num + GoodsInfo#goods.num - MaxOverlap};false ->{Num + GoodsInfo#goods.num, 0}end,%% 更新现有物品数量change_goods_num(GoodsInfo, LapHasNum);true ->RestNum = Num;false ->RestNum = 0end,[RestNum, MaxOverlap].

怪物掉落的随机系统:

%% 随机一条掉落规则,规则内包含相关的掉落物品
rand_drop_num_rule(MonId) ->Pattern1 = #ets_goods_drop_num{ mon_id=MonId, _='_' },%% 获取掉落配置NumRuleList = goods_util:get_goods_list_from_ets(?ETS_GOODS_DROP_NUM, Pattern1),case length(NumRuleList) > 0 oftrue ->%% 总权重TotalRatio1 = lists:foldl(fun(R, Sum) -> R#ets_goods_drop_num.ratio + Sum end, 0, NumRuleList),Ratio1 = util:rand(1, TotalRatio1),%% 根据随机数从权重中选取掉落规则F1 = fun(Rule, [Ratio, First, Result]) ->End = First + Rule#ets_goods_drop_num.ratio,case Ratio > First andalso Ratio =< End oftrue -> [Ratio, End, Rule];false -> [Ratio, End, Result]endend,[Ratio1, _, NumRule] = lists:foldl(F1, [Ratio1, 0, {}], NumRuleList);false ->NumRule = {}end,NumRule.

人物装备属性的计算:

%% 人物装备属性重新计算
count_role_equip_attribute(PlayerStatus, GoodsStatus, GoodsInfo) ->%% 装备属性Effect = get_equip_attribute(PlayerStatus#player_status.id, PlayerStatus#player_status.equip, GoodsStatus#goods_status.equip_suit_list),%% 检查武器、衣服[NewGoodsStatus, _] = count_current_equip_by_info(GoodsInfo, [GoodsStatus, on]),%% 更新人物属性PlayerStatus1 = PlayerStatus#player_status{equip_current = NewGoodsStatus#goods_status.equip_current,equip_attribute = Effect},%% 人物属性重新计算NewPlayerStatus = lib_player:count_player_attribute(PlayerStatus1),{ok, NewPlayerStatus, NewGoodsStatus}.

英雄远征Erlang源码分析(11)-物品相关操作解析相关推荐

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

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

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

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

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

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

  4. 英雄远征Erlang源码分析(12)-任务模块解析

    与玩家任务相关的模块有:lib_task.erl(玩家任务相关操作),mod_task.erl(定时回写任务数据) 玩家任务的初始化: 在登录的时候调用lib_task:flush_role_task ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. CSS3选择器 :read-only选择器 CSS3选择器 :read-write选择器
  2. 探测电磁波就能揪出恶意软件,网友:搁这给电脑把脉呢?
  3. 不要使用字符串常量作为对象锁去同步代码
  4. 零售商的“基因改造”浪潮
  5. leetcode 1038. 从二叉搜索树到更大和树
  6. 高效的企业测试-结论(6/6)
  7. FreeMarker 集合遍历
  8. 线程,进程,并发,并行
  9. 2013年4月管理计算机应用,全国2013年4月高等教育自学考试管理系统中计算机应用试题及答案...
  10. mysql sql汇总查询将两个结果集合并一行展示
  11. hub设备_ORICO|DIY玩家需要一款高性能的HUB,犹如王者需要一把利器一样
  12. bzoj 3895: 取石子(博弈)
  13. 3dmax卸载工具_3Dmax软件无法安装?3Dmax软件正确卸载方法,重装无忧
  14. Vue 编写(preventReClick)防暴点 +防抖(debounce)和节流(throttle)函数
  15. JavaScript屏蔽Backspace键
  16. 2021年中国彩电行业发展现状分析,零售量首度跌破4000万大关,行业迎来艰难时刻「图」
  17. 后缀为.epub的是什么格式的文件
  18. [附源码]Python计算机毕业设计SSM基于java学科竞赛管理系统(程序+LW)
  19. 一文搞懂css中精灵图如何使用
  20. 你真的理解函数式编程吗?

热门文章

  1. stm dfu_如何在Windows上修复dfu-util,STM,WinUSB,Zadig,Bootloader和其他固件刷新问题
  2. 好用的mac录屏软件推荐:白菜录屏mac中文免费版
  3. 地球系统官方承认的(superman)超人-钢铁之躯的氪星钻石符号和超人的形象
  4. UE——导航系统(NavigationSystem)
  5. kettle调优之读写速度
  6. 手机软件开发入门 - 中国象棋(2)090311
  7. 过去挖煤,现在挖什么?李彦宏的家乡正在发生这些变化
  8. 安卓手机使用Termux搭建web服务器(含frp内网穿透、wake on lan远程唤醒)
  9. iOS 名片识别代码
  10. Python的pdfminer的字体下载