# 地图插件调整(上)

# 了解与试用插件

  • 打开studio,选择【新建】-->【基岩版网络服】
  • 修改网络服名称为【地图属性插件微调】
  • 账号、用户名、机器配置等信息,请根据申请获取到的开发服务器信息填写
  • 选择【游戏配置】-->【大厅服】-->【Mod的下拉菜单】-->【获取公共Mod】
  • 选择地图属性插件,点击【全部下载】,等待下载完成后关闭此弹出界面
  • 再次点击【Mod的下拉菜单】,选中【neteaseMapAttrs】插件
  • 点击【下一步】开始配置游戏服
  • 存粹为了体验地图属性插件的部分功能,不需要部署游戏服,直接点击【下一步】,开始配置控制服
  • 地图属性插件包含控制服插件,点击【Mod的下拉菜单】,选中【neteaseMapAttrsMaster】插件
  • 控制服配置完成,点击下一步配置功能服
  • 地图属性插件不包含控制服插件,直接点击【下一步】,配置代理服
  • 代理服不支持插件功能,直接点击【完成】,结束【游戏配置】
  • 【数据库】分页的配置信息,请根据申请获取到的开发服务器信息填写
  • 【更多】分页的配置信息,在开发阶段直接使用默认即可,无需修改
  • 在studio选择【基岩版服务器】-->【网络服开发】-->选中【地图属性插件微调】-->点击【部署】,等待服务器部署完成
  • 点击【开发测试】即可启动客户端体验地图属性插件的功能

# 插件架构分析

# 获取插件的源码

  • 下载完成的插件,一般可以在[C:\MCStudioDownload\ApolloMod{开发者账号}]目录中找到
  • 此外,也可以从studio中跳转到插件下载的目录
  • 在studio选中【基岩版服务器】-->【服务器Mod】-->选中【neteaseMapAttrsMaster】or 【neteaseMapAttrs】-->点击【更多】
  • 在菜单中点击【打开目录】
  • 此时会进入到目标Mod的下载目录,点击【上一层】,即可定位到全部Mod的下载目录
  • 【neteaseMapAttrs】和【neteaseMapAttrsMaster】就是地图属性插件的源码目录
  • 把源码复制到自己本地的代码目录,方便随时添加注释与修改调试

# 从readme开始

  • 查看地图属性插件的readme文件,仔细查看实现的功能点
  • 其中并没有需要多个服务器进程协作的功能,再往下发现地图属性插件支持一个运营指令,那么大致上可以判断,【neteaseMapAttrsMaster】插件仅仅是作为运营指令的一个入口和驱动,和实际的游戏相关功能并没有特别强的联系。
地图属性插件,地图属性插件用于设置整个地图的一些通用属性,包括:
1、是否开启主城保护
2、是否禁止藤蔓生长
3、是否禁止流体流动
4、是否定时清理掉落物 与 定时清理掉落物间隔
5、在地图指定位置设置浮空文字
6、设置地图边界(玩家走出边界会被传送回最近离开的合法位置)
7、设置玩家是否可丢弃物品
8、玩家是否可捡起物品
9、可以根据针对地图编辑器导出的地图文件替换游戏地图
...
...
...
运营指令:
(1)设置指定服务器地图边界。
post url: http:masterip:masterport//mapAttrs/set-area-limit
post body:{
	"type": "gameA",      # 目标服务器类型。每种类型只有一个服务器,通过服务器类型区分不同服务器。
	"minPos" : [-50,0,-50], # 地图边界(x, y, z)坐标的最小值
	"maxPos": [50,20,50] # 地图边界(x, y, z)坐标的最大值
}
response:
{
    "message": "",
    "code": 1, #1表示成功,2表示失败
    "entity": ""
}

# 基于目录结构分析

  • 地图属性插件,从最外层看,一共有两个Mod
├─neteaseMapAttrs
├─neteaseMapAttrsMaster
  • 展开各个目录,基于插件的结构,代码文件命名和大小,以及结合地图属性插件实现的具体功能,大致可以对每个代码文件有一些定位
├─neteaseMapAttrs
  | md5         # 下载用的对比文件,与插件逻辑无关,本地代码目录中可以删除
  | readme.txt  # 功能说明文件,是非常好的信息来源
  ├─behavior_packs      # 行为包总目录
    └─neteaseMapAttrsBehavior    # 插件只有一个行为包
      | manifest.json            # 行为包的UDID
      ├─neteaseMapAttrsScript    # 客户端Mod脚本根目录
        | __init__.py
        | mapAttrsClientSys.py   # 客户端Mod的system类,具体分析见下文
        | mapAttrsConsts.py      # 客户端Mod宏定义
        | modMain.py             # 客户端Mod入口
        | textBoardMgr.py        # 客户端Mod中管理浮空文字的类,具体分析见下文
        └─util.py                # 客户端Mod的一些功能函数
      └─structures
        └─mapStructure           # 结合readme可知,此目录用来放置【功能9】需要的mcstructure文件(由编辑器生成)
  ├─developer_mods      # 服务端Mod总目录
    └─neteaseMapAttrsDev         # 插件只有一个服务端Mod
      | mod.json                 # 插件配置信息文件
      ├─neteaseMapAttrsScript    # 服务端Mod脚本根目录
        | __init__.py
        | coroutineMgrGas.py     # 服务端Mod中的利用yield实现的管理延时执行函数的类,具体分析见下文
        | mapAttrsConsts.py      # 服务端Mod宏定义
        | mapAttrsServerSys.py   # 服务端Mod的system类,具体分析见下文
        | modMain.py             # 服务端Mod入口
        | playerMgr.py           # 服务端Mod中管理玩家的类,主要用于实现【功能6】,具体分析见下文
        └─util.py                # 服务端Mod的一些功能函数
      └─mapStructureConfig       
        └─neteaseMapStructueConfig.json  # 此文件是与客户端Mod中mcstructure文件对应的配置文件(内容由编辑器生成)
  ├─resource_packs      # 资源包总目录,插件没有美术资源,所以是空的
  ├─worlds
    ├─level
      | world_behavior_packs.json   # 行为包的UDID描述
      └─world_resource_packs.json   # 资源包的UDID描述(资源包是空的,所以文件的内容也是空的)
├─neteaseMapAttrsMaster
  | md5          # 下载用的对比文件,与插件逻辑无关,本地代码目录中可以删除
  | readme.txt   # 功能说明文件,内容与【neteaseMapAttrs】中一样
  └─developer_mods         # 控制服Mod总目录
    └─neteaseMapAttrsDev   # 插件只有一个控制服Mod
      | mod.json           # 插件配置信息文件
      └─neteaseMapAttrsScript     # 控制服Mod脚本根目录
        | __init__.py
        | mapAttrsConsts.py       # 控制服Mod宏定义
        | mapAttrsMasterSys.py    # 控制服Mod,具体分析见下文
        | modMain.py              # 控制服Mod入口
        └─util.py                 # 控制Mod的一些功能函数

# 小结

  • 插件的总体结构并不复杂,每个端的Mod(客户端、服务端、控制服)都仅有一个system文件与一两个自定义的管理类
  • 结合readme的功能、运营指令描述,插件的控制服Mod功能仅仅是接收和反馈运营指令
  • 插件的客户端Mod中,仅有一个管理浮空文字的类,和【功能5】实现强相关
  • 插件的服务端Mod中,有一个使用python的yield