组队相关模块有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