Skip to content

家园、领地与建造权限 ​

Category ​

system / 玩法系统(空间玩法件)。节点定位:家园与领地把「一块属于玩家/公会的空间」变成「可建造、可授权、可参观」的容器——地块模型、放置校验、权限矩阵、访问与参观四件事。空间底座是 AOI 与地图与空间管理——调研结论(BigWorld/KBEngine 空间触发件可借鉴)的落点就是本页:家园领地以 AOI/地图为底座搭建造层,不另起一套空间管理。

Definition ​

家园(Housing)是个人或公会私有的建造空间:格子上摆家具、摆套装、挂功能建筑。领地(Territory)是开放世界里的圈地声明:公会圈一块地,权属与产出绑定。建造(Building)分两种放置模型:格子制(对齐网格,校验简单)与自由放置(位置/旋转任意,校验复杂)。权限是三维矩阵:身份(所有者/成员/访客)× 对象(建筑/家具/门)× 动作(放置/移动/使用/进入)。

Problem ​

空间玩法的坑按出现顺序:

  • 建造数据膨胀:自由放置一摆几百件,全量序列化又大又慢——存储与同步没做增量,参观一次拉全量。
  • 放置校验只做一半:客户端判了碰撞就落库,外挂直接发「悬空家具」包——服务端不重放校验,建造区变广告牌。
  • 领地边界重叠:圈地判定用实时计算而非落库的边界数据,两个公会同时圈同一块地,谁先谁后说不清。
  • 权限粒度失控:「访客能不能开我箱子」这类问题没有矩阵,靠代码里一串 if,加一种身份改一遍。
  • 参观加载拖垮主城:参观他人家园按主城方式常驻加载,家园一多,服务器被不活跃的空间占满内存。

Algorithm ​

地块模型:定义 + 物件列表,增量同步 ​

text
plot_state:                        # 一块家园/领地
  plot_id:    h-88123
  owner:      u1001               # 或 guild:g201
  grid:       32x32               # 格子制才有;自由放置无 grid
  objects:    [ {uid: o-1, def: sofa-a, pos: [3,4], rot: 0},
                {uid: o-2, def: lamp-b, pos: [3,5], rot: 90} ]
  version:    47                  # 版本号,增量同步的基准

同步口径:
  在园玩家: 收 objects 的增量(增/删/改按 uid)
  进园玩家: 先拉 version 快照,再追增量
  • 家园是低频修改、低频访问的空间:与主城不同,不活跃家园不驻留内存,按需加载、超时卸载——空间的生命周期口径与地图与空间管理的动态地图一致
  • 物件以 uid 为增量单位,version 做快照与增量的分界——重连/换线用版本比对补差
  • 建造数据与玩家档案分库存:家园数据体积远大于常规玩家档案,独立存储与独立加载(玩家数据存储的冷热分层口径)

放置校验:服务端重放,客户端只是预览 ​

放置的权威判定在服务端,客户端的碰撞预览只是体验优化:

text
服务端收到放置请求 {plot, def, pos, rot}:
  1. 权限:发送者对该地块有 build 权(查权限矩阵)
  2. 归属:plot 属于该玩家/其公会
  3. 合法:def 存在、pos 在界内、rot 合法档位
  4. 碰撞:与已有 objects 不重叠(格子制查格占位;自由放置查包围盒)
  5. 消耗:材料/货币扣除(走[结算](./settlement.md)凭证)
  6. 落库 + version+1 + 广播增量给在园玩家
  • 六步顺序即校验链,消耗放在合法性之后:校验不过不扣料,扣了料放不下是客诉源
  • 自由放置的碰撞校验用简化包围盒(服务端不做精细物理),穿模类问题由客户端表现层自纠——服务端管「能不能放」,不管「好不好看」

权限矩阵:身份 × 动作,一张表 ​

身份 \ 动作建造/移动使用功能建筑开箱/拿取进入
所有者✓✓✓✓
公会成员(领地)✗(或按职位)✓✗✓
授权访客✗✓✗✓
陌生访客✗按口径✗✓(参观区)
  • 权限存矩阵配置而非硬编码:加一种身份(如「租客」)是加一行配置
  • 授权是显式动作:玩家把某人加进访客名单,权限才有变化——「好友自动可拿取」这类隐式授权容易变成偷窃纠纷,口径上宁可麻烦
  • 公会领地的权限按公会职位解析(会长/官员/成员),公会组织口径见 system 树的社交服务

参观与领地:按需加载 + 只读副本 ​

  • 参观他人家园:加载只读副本(或只读视图),访客的任何写操作被权限矩阵拒绝;家园主不在线也可参观(数据在库里,不需主人进程在线)
  • 领地圈地:边界在申请时刻落库定案(时间戳定序),重叠校验在落库事务内完成——两个申请同时到达,事务的先后即圈地的先后
  • 进入家园/领地触发事件(每日首次进入、参观任务)走空间触发件:AOI/地图层的进入区域事件,任务系统与成就与图鉴订阅——家园不自己造事件源

Used By ​

  • Minecraft(商业游戏,服务端实现公开可查):方块放置的服务端权威校验(合法性、权限、边界)是「服务端重放校验」的最直接参照;多人权限(领地插件生态)是权限矩阵的实践面。
  • 集合啦!动物森友会(商业游戏,任天堂公开资料):岛屿与访客(只读参观 + 有限交互)是家园参观口径的参照。
  • 原神(商业手游):尘歌壶(洞天)的摆设、套装与信任等阶、访客参观,是手游家园「建造 + 收集 + 访客」的公开参照。
  • 梦幻西游(商业端游网易):家园系统(房屋、家具、庭院)的长期运营形态,是「家园承载社交与生产」的参照。
  • 率土之滨 / 三国志·战略版(商业 SLG):领地权属与产出绑定,是「领地 = 权属声明」的参照。
  • BigWorld / KBEngine(开源引擎,源码事实见 server 树引擎档案):空间管理与区域触发件是家园空间层的底座参照(commit 锚定事实已织入 server 树各节点)。

可参考分析:Minecraft 放置校验=可参考(服务端权威放置直接落放置校验一节);动森访客=可借鉴(只读参观与有限交互落参观口径);原神尘歌壶=可参考(套装与信任等阶,落点 design 树收集设计);率土领地=可借鉴(权属与产出绑定,落领地圈地一节);BigWorld/KBEngine 空间件=可借鉴(以 AOI/地图为底座,空间触发件承接事件源)。

关系链:地块模型 → 放置校验 → 权限矩阵 → 参观与领地。逐段回答「为什么需要下一个」:

  • 地块模型定了数据形态,才谈放置——增量同步与版本比对都建立在物件列表上。
  • 放置权威了才谈权限——校验链的第一步就是查权限,没有矩阵就没有「谁有权放」。
  • 权限矩阵清楚了才敢开放参观——访客能做什么是矩阵的一行,不是特判。
  • 参观通了才谈领地——两者共用按需加载与落库定序,领地只是把私有空间换成权属声明。

上游:AOI 与地图与空间管理(空间底座)、结算(建造材料消耗凭证)、玩家数据存储(建造数据的冷热分层);下游:任务系统与成就与图鉴(空间触发事件订阅)、外观、皮肤与装扮(家具装扮是外观机制的空间变体)。

Reference ​

  • 本页为机制归纳;Minecraft 服务端实现、动森/原神/梦幻西游家园规则以各自官方公开信息为准。
  • BigWorld/KBEngine 的源码级事实以 server 树引擎档案的 commit 锚定记录为准,本页不重复引行号。
  • 术语对照:Housing(家园)、Territory(领地)、Plot(地块)、Placement Validation(放置校验)、Permission Matrix(权限矩阵)、Read-only Replica(只读副本)。

游戏知识体系