开头
好友系统几乎是每个网络游戏都有的系统,以下分享一种好友系统的具体实现方式。
存储
存在公共ETS中,以RoleId为key,好友列表为value。
假设好友相关的信息存在角色的私有数据里面,在添加好友时,就需要修改对方已加载的数据和数据库中的数据,过程非常麻烦,因此存储在公共的ETS表中。
数据结构
%% 好友列表结构
-record(friend_list, {
role_id = 0,
list = [],
}).
%% 好友的数据结构
-record(friend_data, {
role_id = 0, %% 好友RoleID
type = 0, %% 类型
data = #{} %% 扩展数据
}).
好友类型
-define(STRANGER,0).%% 陌生人
-define(GOOD, 1). %% 好友
-define(BLACK, 2). %% 黑名单
-define(APPLY, 3). %% 申请列表
每种类型都存在同一份好友列表,取出来的时候再进行分类。
操作
1、好友列表
根据RoleId获取在公共ETS中存储的好友列表信息,进行好友列表,申请列表,黑名单的简单分类。
2、申请好友
根据自己和对方的RoleId在公共ETS中获得对应的好友列表,
进行以下检测:
#1、RoleId是否合法(双方的RoleId是否相等,格式非法等)
#2、双方是否存在对方的黑名单中
#3、双方是否存在对方的好友列表中
#4、好友数量是否已到达上限
检测通过后,组成#friend_data{role_id=自己id, type=3}存入对方的好友列表,存公共ETS表。
3、删除好友
根据自己和对方的RoleId在公共ETS中获得对应的好友列表,
进行以下检测:
#1、双方是否存在对方的好友列表中
检测通过后,在双方列表互相删除对方好友,存公共ETS。
4、同意/拒绝好友申请
根据请方和对方的RoleId在公共ETS中获得对应的好友列表,
进行下检测:
#1、双方是否存在对方的申请列表中
#2、双方是否存在对方的黑名单中
#3、好友数量是否已到达上限
检测通过后,判断标志位是同意还是拒绝
#同意:组成#friend_data{role_id=双方id, type=1}以取代的方式存入各自的好友列表
#拒绝: 删除在自己在对方好友列表中的数据。
处理完成后,存公共ETS表。
5、加入黑名单
根据请方和对方的RoleId在公共ETS中获得对应的好友列表,
进行下检测:
#1、RoleId是否合法(双方的RoleId是否相等,格式非法等)
#2、对方是否在自己的黑名单中
#3、黑名单是否已到上限
检测通过后,将对方加入自己的好友列表,type为2;如果自己在对方的好友列表,则删除。
存公共ETS表。
6、取消黑名单
根据请方和对方的RoleId在公共ETS中获得对应的好友列表,
进行下检测:
#1、对方是否在自己的黑名单
检测通过后,自己的好友列表中移除对方。
7、查找好友
通过游戏昵称获取RoleId, 判断对方与自己的关系,返回信息。