組隊相關模塊有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),將玩家加入副本進程
副本進程不存在:
判斷是否隊長,是隊長則創建副本進程,給隊員發消息,通知隊員進入副本