组队相关模块有mod_team.erl和lib_team.erl

通过24000协议请求,调用mod_team:start(Uid,Pid,Nick,TeamName)开启组队进程,创建队伍

组队state为
%%队伍资料 -record(team,      {         leaderid = 0,       %% 队长id        
leaderpid= none,    %% 队长pid         teamname = [],      %% 队名         member =
[],        %% 队员列表         dungeon_pid=none    %% 副本进程id     } ). %%队员数据
-record(mb,      {         id = 0,         %%队员id         pid = none,    
%%队员pid         nickname = []   %%队员名字     } ).
队伍进程初始化代码:
init([Uid, Pid, Nick, TeamName]) ->     {ok, #team{leaderid = Uid, leaderpid =
Pid, teamname = TeamName, member = [#mb{id = Uid, pid = Pid, nickname =
Nick}]}}.
队伍创建后有几种操作:
1.玩家申请加入队伍 - 队长处理玩家申请
2.玩家主动退出队伍 - 队长将玩家踢出队伍
3.队长邀请玩家加入队伍 - 玩家回应邀请
4.获取队伍信息
5.队长解散队伍
6.队伍成员聊天

1.玩家申请加入队伍:
    handle_call('JOIN_TEAM_REQ', _From, State) 向队伍进程发送请求
    返回:    {ok,mb_max,_LeaderId} ->    队伍成员数达上线
            {ok,in_dungeon,_} ->        队伍在副本中
            {ok,1,LeaderId} ->            向队长发送请求
            
2.队长回应请求:
    handle_call({'JOIN_TEAM_RES', Res, Uid}, {From, _}, State)
    检查队长身份,队伍是否在副本中...,检查通过,则
        gen_server:cast(R#ets_online.pid, {'SET_TEAM_PID', self()}),  
 %%更新玩家状态
        NewMemberList = State#team.member ++ [#mb{id = Uid, pid =
R#ets_online.pid, nickname = R#ets_online.nickname}],        %%更新队伍进程玩家列表
        NewState = State#team{member = NewMemberList},        %%更新活动状态
        gen_server:cast(self(), {'UPDATE_TEAM_INFO', NewState}),    %%刷新队伍信息
        {ok, BinData} = pt_11:write(11004,
lists:concat([R#ets_online.nickname, "加入了队伍"])),
        send_team(State, BinData),    %%告知队伍成员有人加入
        
3.玩家主动离开队伍
    handle_call({'QUIT_TEAM', Type}, {From, _}, State)
    检查是否能退出队伍(是否队伍成员,是否在副本中)
    检查该玩家退出队伍后成员人数:
        成员为0,解散队伍
        成员大于0,检查是否队长退队
            队长退队:重新任命队长,重设队伍名称,通知成员,通知场景
            非队长退队:通知成员,通知场景

4.队长踢出队伍
    handle_call({'KICK_OUT', Uid}, {From, _}, State)
    检查操作者是否队长
    从组队进程state中去掉该玩家并回写
    如果被踢出者在线,则对其发送被踢出通知
    通知队伍成员
    
5.邀请他人加入队伍
    handle_call({'INVITE_REQ', Uid}, {From, _}, State)
    判断是否队长操作,是否在副本中,检查队伍人数,检查被邀请人是否在线,检查被邀请人是否加入了其他队伍,检查被邀请人是否已经加入我们队伍
    向被邀请人发出信息
    
6.邀请人回应邀请请求
    handle_call({'INVITE_RES', Uid, Pid, Nick}, _From, State)
    检查是否在副本中,是否达到人数上限
    更改新队员的pid_team,和队伍进程的state,给其他队员广播队伍信息
    
7.获取队伍信息
    handle_call('GET_TEAM_INFO', _From, State)
    返回队伍进程state
    
8.解散队伍
    handle_cast('DISBAND', State)
    将队伍内每个成员的pid_team设为0,停止队伍进程
    
9.队伍聊天
    handle_cast({'TEAM_MSG', Id, Nickname, Color, Data}, State)
    调用send_team(Team, Bin)方法,给队伍内成员发送消息
    
10.队伍创建副本进程
    handle_call({create_dungeon, From, RoleInfo}, _From, State)
    判断副本进程是否已存在
        副本进程已存在:调用mod_dungeon:join(DungeonPid,Id),将玩家加入副本进程
        副本进程不存在:
            判断是否队长,是队长则创建副本进程,给队员发消息,通知队员进入副本
            
    

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信