英雄遠征Erlang源碼分析(10)-隊伍相關

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章