场景和副本是玩家活动的区域,场景在服务器启动的时候由mod_scene进程创建,场景信息保存在?ETS_SCENE中,并一直存在;副本在玩家请求进入的时候会创建副本服务进程,当玩家离开的时候会撤销进程。
场景:
场景相关的模块为mod_scene.erl和lib_scene.erl,
场景的基本要素:怪物,NPC,mask(包含场景可移动坐标信息),它们在场景初始化的时候被加载。
场景初始化过程:
1.服务器启动的时候,通过mod_scene.erl启动一个场景管理进程,将所有场景id载入
2.使用load_scene(SceneId)初始化场景:
load_scene(SceneId) ->
S = data_scene:get(SceneId),
case S#ets_scene.type =:= 2 orelse S#ets_scene.type =:= 3 of
true -> %% 副本、帮会的原始场景,就不加载
ok;
false ->
load_npc(S#ets_scene.npc, SceneId),
load_mon(S#ets_scene.mon, SceneId),
ets:insert(?ETS_SCENE, S#ets_scene{id = SceneId, mon=[], npc=[], mask=[]}),
case data_mask:get(SceneId) of
"" -> ?ERR("场景的坐标MASK为空:~w", [SceneId]);
Mask1 -> load_mask(Mask1, 0, 0, SceneId)
end
end.
场景加载过程:
1.获取对应的配置信息,根据配置信息创建NPC和怪物,将场景插入ETS_SCENE表中。
2.获取每一个NPC配置信息,插入ETS_NPC表中
3.获取每一个怪物配置信息,开启一个怪物进程(gen_fsm),并打开怪物的战斗进程,将怪物信息保存到ETS_MON中。
4.获取场景坐标mask配置信息并加载,将可移动的坐标写入ETS_CENEN_POSES中
场景管理进程state:
-record(state, {auto_sid, auto_eid}).
其中auto_sid负责生成并返回每一个副本的唯一Id
九宫格广播系统:
当玩家状态发生变化时,需要将玩家状态的改变广播给场景中的其他玩家,(例如玩家进入新场景,需要告知旧场景的人玩家已离