45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:英雄远征Erlang源码分析(10)-队伍相关

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

2019-03-30 19:05:42 来源:www.45fan.com 【

组队相关模块有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),将玩家加入副本进程
副本进程不存在:
判断是否队长,是队长则创建副本进程,给队员发消息,通知队员进入副本
 

 
 

本文地址:http://www.45fan.com/a/question/100063.html
Tags: Erlang 英雄 远征
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部