领地、物资搬运与掠夺
本页于 2026-10-15 整合现有功能稿、飞书内容及客户端 origin/develop@7f0636c9 的功能资料。原 draft/unknown 不因整理自动变为批准;设计规则、源配置与运行结果分别说明。本次只做文档及源码审阅,没有执行游戏功能测试。
入口、前提与状态
从家园领地建筑进入自己的领地,达到主角等级或主线条件后开放。玩家用载具搬运物资、访问他人领地掠夺,设计要求按主角攻击力判定驱逐;当前后端未执行这个比较。领地、载具和主角攻击力是三个不同数值,不能互相替代。
完整规则、配置与界面
玩法规则设计
领地偷菜玩法
领地主体功能
- 归属于玩家的个人领地,可升级,不同等级有对应效果,可被其他玩家访问
功能解锁
- 主线关通关x关,或主角等级x级,任选其一(配),达到后,玩家可打开领地界面,进入领地
领地等级
- 默认1级,消耗领地材料(配)升级,升级后,解锁新的等级效果(配)
领地等级效果如下(配)
-
刷出的物资不同
-
可用的载具数量
-
每个载具的攻击
-
主角属性加成
领地等级效果示例
| 等级 | 载具数量 | 载具攻击 | 主角属性加成 |
|---|---|---|---|
| lv1 | 3 | 100 | 攻击+5、生命+50 |
| lv2 | 3 | 200 | 攻击+10、生命+100 |
| lv3 | 4 | 300 | 攻击+6、生命+60 |
| lv4 | 4 | 400 | 攻击+12、生命+120 |
| lv5 | 5 | 500 | 攻击+18、生命+180 |
| lv6 | 5 | 600 | 攻击+24、生命+240 |
| lv7 | 6 | 700 | 攻击+30、生命+300 |
| lv8 | 6 | 800 | 攻击+30、生命+300 |
| lv9 | 7 | 900 | 攻击+30、生命+300 |
领地访问
-
玩家可前往其他玩家的领地进行访问,自己领地也可被其他玩家访问
-
玩家可对自己领地进行领地升级,科技升级,设置留言,搬运等操作,在他人领地,仅可进行搬运(掠夺)操作
-
1、邻近玩家访问
-
由系统推荐可访问的领地,优先推荐领地等级在-1~+1的,不足时扩大,如最高-4~+4(配),优先真实玩家,无真实时再推机器人
-
按条件寻找推荐的领地,满3个即停(配),可手动刷新,刷新后立即重新推荐,每次刷新间隔5分钟(配)
推荐范围示例(与正文不同)
| 推荐范围 | 优先级 |
|---|---|
| -5~+5 | 玩家>机器人 |
-
具体推荐范围,数值自定
-
2、仇人玩家访问
-
系统记录成功掠夺过自己的玩家信息,并将其放入仇人访问列表进行推荐
-
最多推荐10人,按掠夺发生时间排,近的在前
-
访问仅以打开领地界面的形式即可,获取对方的玩家信息,领地等级,留言,只可浏览不可操作
-
机器人需求后续补
领地物资
-
物资数量上限:5个
-
1、物资刷新
-
物资刷出后一直存在,玩家可对自己领地的物资进行搬运获取,可访问其他玩家领地掠夺,也可被其他访问的玩家掠夺
-
当物资数量不足上限时,立即开始自动计时刷新
-
自动刷新时间:1小时刷出1个(配),物资需一个个按顺序计时刷,直到数量达到上限后,停止自动刷新
-
主动刷新
-
玩家可通过,免费刷新(每日3次,配),消耗道具刷新(配),看广告刷新(配)等方式进行物资刷新
-
先免费>广告,消耗道具(花费钻石,每次消耗递增,无限)
-
主动刷新是立即刷满上限数量的物资,已刷出的也要重新刷
-
注意:搬运中(含被其他玩家搬运中)的物资不消失不被刷新
-
2、物资细节设计
-
物资以包裹形式,刷出在领地中,获取后打开可得到多个道具奖励
-
需先根据领地等级决定可刷出的物资类型,再根据权重概率单次随机刷出
-
如主动刷新要刷5个物资,也是连随5次,允许随出相同的物资
-
领地等级限制(配)
领地物资开放示例
| 领地等级 | 金币 | 养成材料 | 领地材料 | 抽奖券 | 装备 | 符文 |
|---|---|---|---|---|---|---|
| lv1 | 金币包lv1 | 养成材料包lv1 | 领地材料包lv1 | 抽奖券包lv1 | ||
| lv2 | 金币包lv2 | 养成材料包lv1 | 领地材料包lv1 | 抽奖券包lv1 | 装备包lv1 | 符文包lv1 |
| lv3 | 金币包lv2 | 养成材料包lv2 | 领地材料包lv2 | 抽奖券包lv1 | 装备包lv1 | 符文包lv1 |
- 物资类型、奖励和刷出权重示例(配)
物资权重、奖励与载具上限示例
| 道具类型 | 等级 | 权重 | 奖励 | 可用载具上限 | 品质 | 搬运效率 |
|---|---|---|---|---|---|---|
| 金币包lv1 | 1 | 100 | 金币 1000-1500 | 1 | 绿 | |
| 金币包lv2 | 2 | 120 | 金币 2000-3000 | 1 | 蓝 | |
| 金币包lv3 | 3 | 130 | 金币 4000-6000 | 2 | 紫 | |
| 养成材料包lv1 | 1 | 100 | 英雄材料 10-15 | 2 | 绿 | |
| 养成材料包lv2 | 2 | 120 | 英雄材料 20-25 | 2 | 蓝 | |
| 养成材料包lv3 | 3 | 130 | 英雄材料 30-35 | 2 | 紫 | |
| 领地材料包lv1 | 1 | 100 | 等级材料 10-15 | 1 | 绿 | |
| 领地材料包lv2 | 2 | 120 | 等级材料 20-25 | 2 | 蓝 | |
| 领地材料包lv3 | 3 | 130 | 等级材料 30-35 | 2 | 紫 | |
| 抽奖券包lv1 | 1 | 100 | 抽奖券 10-15 | 2 | 绿 | |
| 抽奖券包lv2 | 2 | 120 | 抽奖券 20-25 | 2 | 蓝 | |
| 抽奖券包lv3 | 3 | 130 | 抽奖券 30-35 | 3 | 紫 | |
| 装备包lv1 | 1 | 130 | 图纸 10-15 | 1 | 绿 | |
| 装备包lv2 | 2 | 130 | 图纸 20-25 | 2 | 蓝 | |
| 装备包lv3 | 3 | 130 | 图纸 30-35 | 3 | 紫 | |
| 符文包lv1 | 1 | 130 | 随机符文 10-15 | 1 | 绿 | |
| 符文包lv2 | 2 | 130 | 随机符文 20-25 | 2 | 蓝 | |
| 符文包lv3 | 3 | 130 | 随机符文 30-35 | 3 | 紫 |
-
每个物资刷出点要在预设的范围中取(非固定点),界面中划定刷出的范围
-
因为起始点到搬运终点的距离,会决定搬运时间,该距离需标记为1个系数a
载具
-
不管掠夺或搬运,获取物资都需使用载具
-
载具数量
-
默认:3,领地等级增加可增加数量(配)
-
使用中的(搬运/掠夺中)标记为,占用状态
-
未被使用的载具标记为,空闲状态
-
载具攻击力
-
按领地等级增加,搬运或掠夺时取值用
-
载具管理
-
需记录使用中的车辆状态信息,用于玩家进行统一管理
-
1、记录车辆在哪个领地使用,搬运的物资信息,车辆的总攻击力,搬运的时长,对手的信息
-
2、可对其立即使用放弃操作,前往所在地操作
搬运/掠夺流程
搬运/掠夺定义
-
物资需使用空闲的载具,通过搬运或掠夺的流程进行获取
-
物资仅可被两名玩家(自己与其他1名玩家)发起搬运操作,第3名玩家再发起时无效
-
在自己领地获取物资,定义为搬运,其他玩家的领地获取物资,定义为掠夺
-
均需手动选择物资,发起操作,自动搬运则是特权卡额外功能,暂不考虑
流程细节
-
1、搬运条件:
-
有空闲状态的载具
-
2、掠夺条件:
-
有空闲状态的载具
-
玩家未处于被驱逐后的5分钟保护时间内
-
物资非两人争夺状态
-
争夺状态:物资被除自己外的两名玩家争夺搬运中,视为争夺状态
-
争夺状态下的物资,无法再进行掠夺
-
物资非保护状态
-
保护状态:当该物资是领地内最后一个物资时,且未被搬运中时,自动将该物资置为保护状态
-
保护状态下的物资,不可被掠夺
-
当领地内物资数量>1时,保护状态自动取消
-
每日掠夺次数:100次,0点重置(配)
-
次数扣除方式
-
对他人物资获得搬运权一次,即消耗一次掠夺次数,没次数时不可掠夺
-
符合条件者,发起搬运/掠夺成功,可进入下一阶段——载具选择步骤,发起失败者,返回提示
-
3、选择载具步骤
-
物资根据属性配置,可使用多个载具一起搬运
-
玩家自行选择载具数量
-
载具总攻击力=所有载具累加,标记为系数b
-
最小选择:0,最多选择:上限数
-
可随时更改,更改则重新计算战力和时间
-
选择0时,视为不搬运或放弃搬运
-
放弃搬运:物资如在搬运中,则立即中断,物资停留在原地
-
物资在搬运的过程中,当载具数量发生变化时,需重新计算搬运双方的攻击力,重新再走一次搬运/掠夺流程
-
以下情况均会导致数值发生变化:
-
载具攻击变化
-
玩家自己重选载具数量
-
其他玩家重选载具数量
-
一旦发生变化,都需重新计算攻击力,重新判定搬运权的归属
-
4、搬运权归属判定规则
-
当有两名玩家对同一个物资发起搬运时,则需对比载具总攻击力,总攻击力数值高者获得搬运权
-
夺得搬运权者开始搬运,失去搬运权的玩家中断搬运,但载具不会自动取消
-
暂不做两名以上玩家的搬运争夺
-
5、计算搬运时长
-
获得搬运权的一方,开始计算物资从起点到终点的搬运时间
-
注意,起点是物资当前所在位置的点(617)
-
由物资起点到终点的距离系数a与总攻击力系数b一起决定,公式待定
-
己方领地与他人领地的搬运终点相反,计算时,记得区分
-
总攻击力越高,时间越短
-
距离终点越近,时间越短
-
搬运时间,可控制在1-30分钟以内,不宜超过30分钟,不宜低于1分钟,当然,物质距离终点很近时除外
-
6、进入搬运持续时间,此时物资状态切换为搬运中
-
物资到终点,搬运成功,有搬运权者自动结算该物资并获取对应的道具奖励
-
物资未到达终点,失去搬运权即为搬运失败,均为搬运失败,无法获取道具奖励
-
如物资在搬运期间,玩家离开了界面,后台应根据结果,自动进行结算记录,玩家下一次打开界面时,可合并一起展示再获取
-
物资在搬运期间,玩家停留在界面,时间结束后,需展示并获取道具
-
注意,搬运跟掠夺的结果展示是一致的(617)
防守和驱逐
主角即为领地防守者,无需设置
-
主角总攻击力即为防守战力
-
当有其他玩家进入己方领地,且已经掠夺物资时,可对其进行驱逐,对比双方的主角总攻击力,高者,驱逐成功,低者,驱逐失败
-
驱逐成功,对方立即失去所有的搬运权(对方掠夺多个物资时有效),其5分钟内不可再对本方任意物资进行掠夺
-
同理,掠夺他人时,被驱逐成功,立即失去所有的搬运权(对方掠夺多个物资时有效),5分钟内不可再对任意物资进行掠夺
-
注意,驱逐不会自动发生,需要玩家手动操作,且需在物资在搬运中状态时操作
次留版本,前端判断
留言
玩家可设置留言,拜访领地的玩家可见
留言最多30个字符,需有屏蔽字库
日志
- 当符合以下条件时,触发日志记录,所有记录均需记录日志产生时间
1、当领地任意物资被他人掠夺成功时
-
标题:物资被抢走啦
-
日志内容:XXX(掠夺人名) 明目张胆从你领地抢走了 YYY(物资名)
-
需快捷前往,快速访问对方的领地
2、玩家在他人领地掠夺成功时
-
标题:掠夺成功
-
日志内容:你从 XXX(被抢人名) 领地抢走了 YYY(物资名)
3、玩家在他人领地被驱逐成功时
-
标题:你被驱逐了
-
日志内容:你被 XXX 赶出了领地,掠夺失败
-
需快捷前往,可快速访问对方的领地
-
记录规则,总数量上限100条(后台可以只记100条,界面会要求显示前30条),按触发时间记录,且每条信息仅保留3天
领地科技
暂不做
领地商店
暂不做
辅助卡牌
暂不做
自动托管
暂不做
界面需求
界面总览
分界面说明
-
领地主体界面
-
1、领地主体部分
-
包含留言展示,领地升级,领地科技三个功能入口和图标展示
-
领地科技图标,显示锁定图标,不开放。点击文本提示:暂未开放
-
领地升级图标,显示当前等级。点击打开领地详情界面
-
留言区,显示当前留言内容。点击留言按钮,打开设置留言界面
-
2、领地物资区域部分
-
界面划分3个区域,分别是我方终点,他人终点,物资刷出区3个部分
-
我方终点线:玩家自己搬运物资时,成功到达终点即可获得道具奖励
-
他人终点线:玩家/他人掠夺时,成功到达他人终点即可获得道具奖励
-
物资刷出区:界面中划出5个刷出区给物资刷出用,每个区可刷1个物资,位置在区域内随机
-
3、物资部分
-
物资刷出后,需显示以下内容:物资图标,等级,品质底框-绿蓝紫金红。点击物资可打开物资详情界面
-
物资状态:分为未搬运,搬运中,保护中,3个
-
未搬运状态:默认状态,显示预设内容即可
-
保护中状态:物资是领地内最后一个,且未搬运中时,自动置为保护中状态。额外显示一个护罩特效。此时物资无法被掠夺,掠夺玩家点击物资不打开详情,而是文本提示:物资被保护中
-
搬运中状态:物资被任意玩家选择并开始搬运后,进入搬运中状态。物资会往有搬运权的一方终点移动(持续播放搬运中动效)。掠夺同理。
-
此时物资需显示剩余搬运时长,搬运双方玩家的信息
-
剩余搬运时长:倒计时形式,我方有搬运权时显示为绿色字,对方有搬运权时显示为红色字
-
搬运的玩家信息:显示载具动画,载具数量,搬运者头像,我方标识,搬运权箭头(有搬运权一方显示)
-
以上信息,有变化时,尽量同步更新显示。
-
如只有一方在搬运/掠夺,则只显示单方的即可
-
如有两方在搬运/掠夺,则需显示两方的信息
-
物资搬运/掠夺成功后,播放一次搬运完成动效(美术提供,玩家停留在界面中搬完时播放,如在离开界面时搬完,不播也可),再弹出一次获得道具奖励界面
-
4、操作入口区域
-
包含刷新操作入口,载具详情入口,掠夺入口
-
刷新操作入口:点击打开刷新提示界面
-
载具详情入口:显示当前载具的状态总览—空闲状态数量/总数量,点击打开载具详情界面
-
掠夺入口:点击打开掠夺界面
领地详情界面,升级入口打开
-
领地详情界面
-
1、领地等级
-
显示当前等级——>下一等级
-
2、物资等级变化
-
显示领地当前等级可刷出的所有物资,显示物资名,图标,等级。取配置,做成列表,最多显示4个,上下划动查看
-
等级需要显示变化
-
当前值——>下一级值
-
下一级物资类型增加或减少,无需显示或提示
-
3、载具变化
-
显示数量变化,攻击力变化
-
当前值——>下一级值
-
4、主角属性变化
-
显示各项属性名,取配置,做成列表,最多显示2项,上下划动查看
-
当前值——>下一级值
-
5、升级操作按钮
-
显示升级所需道具图标,数量,取配置
-
数量显示:当前有的数量/所需数量
-
升级成功后,弹出升级成功界面(可通用角色升级成功的动画),如有攻击力增加需播放一次攻击力提升动画
物资详情界面,点物资打开
-
物资详情界面
-
1、物资显示区域
-
区分状态进行显示
-
无人搬运状态:
-
仅中间默认显示当前选中的物资详情,需显示物资图标,等级,奖励描述。
-
搬运中/掠夺中状态:
-
获取物资所有搬运者的信息。在物资图标左右两侧,分别显示搬运方的信息,需显示搬运者的名字,头像,载具数量,载具总攻击力
-
有搬运权一方多显示归属箭头图标,搬运时间(倒计时)
-
注意几个显示区分:
-
如在我方领地打开时,我方信息总是出现在左侧,并有我方小标识图标,且对方名字下有驱逐按钮,点击可对其发起驱逐。
-
如在他人领地打开时,我方信息总是出现在右侧,并有我方小标识图标,无驱逐按钮
-
驱逐操作:
-
点击驱逐按钮,发起驱逐。显示比拼界面,并播放一次动效,设计要求主角攻击力更高成功、更低失败;当前后端只核验正在掠夺就驱逐,没有战力比较,详见实现差异
-
成功后即可让对方立即放弃所有掠夺中的物资
-
2、选择载具区域(玩家自己的载具情况)
-
显示载具数量:当前选择数/最大数
-
显示载具总攻击力:当前攻击力/最大攻击力
-
都取配置
-
显示我方载具的状态:闲置数,总数
-
数量操作栏
-
默认1——最大数
-
注意:玩家在操作选择时,需在物资显示区域显示对应的信息预览变化。
-
3、确认按钮区域
-
如在我方领地打开,按钮名显示为搬运
-
如在他人领地打开,按钮名显示为掠夺,且多显示今日剩余的掠夺次数
刷新物资界面,点击刷新按钮打开
-
刷新弹窗界面
-
1、文本区域,显示固定文本即可
-
2、按钮区域
-
免费按钮,按钮上显示文本:免费(剩余次数/今日总次数),广告的次数多显示广告图标
-
今日免费>广告免费,都用完后,按钮置灰,点击显示文本:今日免费次数已用完。
-
道具刷新按钮,按钮上显示文本和当前刷新所需费用,费用形式:已有道具/本次所需
载具详情界面,点击载具入口打开
-
载具详情界面
-
1、取当前领地内的载具状态和数量,闲置状态的数量,总数量
-
2、取今日剩余的掠夺次数
-
3、载具使用管理区域
-
获取使用中状态的载具信息,并以列表显示,最多显示3条信息,上下划动查看。
-
无使用中信息时,显示暂无记录或空状态图标
-
有使用中信息时,获取载具如图需要显示的内容:使用中的领地,搬运/抢夺中的物资,物资等级,该物资的搬运时长,搬运双方的信息—需显示搬运者的头像,载具数量
-
有搬运权一方多显示归属箭头图标,搬运时间(倒计时,己方有权为绿字,对方有权为红字)
-
注意几个显示区分:
-
如在我方领地使用中,我方信息总是出现在左侧,并有我方小标识图标,且信息栏中的按钮,显示为召回载具,驱逐访客
-
如在他人领地使用中,我方信息总是出现在右侧,并有我方小标识图标,且信息栏中的按钮,显示为召回载具,前往领地
-
4、信息栏中按钮
-
召回载具:相当于取消载具选择操作,将会立即中断搬运/掠夺
-
驱逐访客:相当于对对方发起驱逐操作,并走一次驱逐流程
-
前往:立即访问车辆所在的领地
日志界面,点击日志按钮打开
-
日志界面
-
1、显示最近的30条日志信息
-
按时间排序,显示前30条日志信息
-
显示内容:根据日志类别,显示标题,文本,对方头像
-
头像要取,掠夺你的玩家头像,驱逐你的玩家头像,你掠夺的对方头像
-
2、信息只有3大类
-
物资被他人掠夺成功的信息,标题用红字,有前往按钮
-
在他人领地掠夺成功的信息,标题用绿字,无按钮
-
在他人领地被驱逐的信息,标题用红字,有前往按钮
-
3、最底处固定显示文本:仅保留最近30条信息且只保留3天
掠夺界面,点击掠夺按钮打开
-
掠夺详情界面
-
1、相邻领地推荐区域
-
由系统筛选出的可访问的领地,需取得以下信息并显示,打开页面请求的即可,过程有变化也无需跟着变化。固定3人。
-
显示内容:领地玩家名,领地等级,玩家头像,领地内的物资信息—物资图标,等级,品质
-
刷新按钮:主动请求再次推荐,点击后系统重新推荐3个领地,cd5分钟,按钮置灰,倒计时5分钟。5分钟后可再次刷新
-
前往按钮:点击都进入该玩家领地
-
2、仇人领地区域
-
有系统筛出的前10个掠夺过自己的玩家领地。做成列表,上下划动查看,按掠夺时间排序。
-
显示内容:领地玩家名,领地等级,玩家头像,领地内的物资信息—物资图标,等级,品质
-
前往按钮:点击都进入该玩家领地
设置留言界面,点击留言入口按钮打开
-
设置留言界面
-
1、留言文本显示,右下角显示已用字符/总字符
-
2、文本输入框,点击后可自行输入留言文本,点击发布后,显示到文本框显示区域内
-
3、在领地主界面也要显示留言文本内容。可被访问的其他玩家看见
红点需求
红点需求
红点路径
| 功能 | 触发条件 | 路径 | 备注 |
|---|---|---|---|
| 领地升级 | 领地升下一级级材料全部足够时 | 领地升级按钮(红点)-主界面领地图标(红点)--家园界面领地建筑名称(红点) | 升级后消失 |
| 刷新 | 有免费刷新次数时 | 刷新按钮(红点)-主界面领地图标(红点)--家园界面领地建筑名称(红点) | 次数用完后消失 |
| 日志 | 有任意新日志产生时 | 日志按钮(红点)-主界面领地图标(红点)--家园界面领地建筑名称(红点) | 点击日志按钮后消失 |
| 搬运成功 | 有任意物资搬运成功时(非在领地界面内) | 主界面领地图标(红点)--家园界面领地建筑名称(红点) | 点击主界面领地图标后消失 |
| 掠夺成功 | 有任意物资掠夺成功时(非在领地界面内) | 主界面领地图标(红点)--家园界面领地建筑名称(红点) | 点击主界面领地图标后消失 |
埋点需求
机器人需求
机器人基础规则
存在不同的领地等级机器人
机器人会抢夺玩家、被玩家抢夺物资
机器人之间不会互相抢夺和被抢夺
-
若玩家随机到机器人,可进入机器人的领地进行查看
-
领地中的物资信息,也是根据对应的领地等级随机出来
-
机器人的领地信息展示和正常玩家一致
-
当有其他玩家在抢该机器人的奖励时,也会展示出来
机器人抢夺
-
机器人只会抢夺介于自身等级【-1,1】级的玩家的领地
-
每个玩家最多每天被机器人抢夺X次(配置)
-
达到次数上限后,不会再被机器人抢夺物资
-
不管机器人最终是否抢夺成功,都计算抢夺次数
-
抢夺次数每天重置
-
PS:可每隔一段时间执行一次脚本批量抢夺玩家(别同一时间把服务器的所有玩家都抢,要分开几个批次)
机器人被抢夺
-
当刷新随机出来的玩家数量不足3个时,把机器人补满到3个
-
机器人补满的领地等级范围在【-1,1】
每个机器人每天最多被抢Y次(配置)
- 达到次数上限后,该机器人不会再出现在玩家的列表中
发起搬运操作
选择载具数
计算载具总攻击力
开始搬运
持续到时长结束
计算搬运时长
判断搬运权
归属
中断搬运
有载具
有搬运权
无搬运权
获得道具奖励
己方重选/
他人重选/
他人加入抢夺/
他人被驱逐
判断是否
符合条件
符合
发起失败
不符合
不搬运/放弃搬运
无载具
实现证据、差异与未知
当前客户端接入
Fief模块具备访问/掠夺/召回、护盾保护、本地运输快照、离线PendingItems奖励汇总;服务端数据由VO转为ViewModel,调用成功后再合并奖励。乐观本地展示不是奖励权威。领地科技、领地商店和代理入口在EntryModel仍为FeatureNotImplemented,不因设计表出现就标为已开放。
具体未知
双方载具攻击相等时搬运权归属、设计中的主角攻击相等判定、距离系数到1–30分钟的公式未明确。邻居等级扩大规则正文±4、表格±5不同;机器人只在±1范围补满3个。推荐中的真实玩家优先与机器人补位各自边界待确认。物资权利变化时失去权利载具仍占用,不能视为自动召回。留言30字符与共享敏感词服务接线仍需分别核实。
4. 数据流
4.1 访问他人领地并掠夺物资
1. OpenFiefVisitCommand.Execute
├─ FiefVisitTerritoryReq → Server → FiefVisitTerritoryResp
│ └─ model.ApplyVisitTerritory(resp)
│ ├─ Mode=Visit, 填充 VisitMaterials / VisitMyTransport
│ └─ MergeCarTasks 合并到 CarTasks
└─ FiefSettleVisitRewardsReq → Server → FiefSettleVisitRewardsResp
└─ ApplyCallbackItems(resp.CallbackItems) → 道具入包 + 通用奖励弹窗
2. ViewFiefMainLogic.OnOpen → RefreshAll()
└─ model.BuildMaterialItemVM(i) → item.SetData(vm)
3. 用户点击物资 → OpenFiefMaterialPanelCommand(slotIndex)
└─ PanelFiefHaulerDispatchLogic.OnOpen → BuildHaulerDispatchVM(slotIndex, 0)
4. 用户确认 → FiefStartRobCommand(slot, carNum, strength) → CloseSelf
5. FiefStartRobResp
└─ model.DeductVisitFreeCar + ApplyStartRobOptimistically (hasRight=true 时写入 Speed/EndTime/RobRoleId)
└─ RequestRefreshFiefData → FiefVisitTerritoryReq → 服务端权威数据覆盖
6. FiefDataChangedEvent → ViewFiefMainLogic.RefreshAll()
4.2 召回载具
1. ComFiefHaulerStatusItem.OnClickRecall
└─ FiefRecallResolveCommand(targetRoleId, materialSlot, strength)
2. FiefAdjustCarReq(carNum=0) → SCFiefHandler → ApplyRecallAdjustCar
→ 按 targetRoleId 清理 CarTask / VisitMaterial / SelfMaterial
4.3 离线登录后补发搬运奖励
1. 玩家登录 → FiefGetInfoReq
└─ 服务端在 FiefGetInfo 内结算离线期间完成的搬运,将奖励物品放入 CallbackItems
2. SCFiefHandler.HandleSuccess(FiefGetInfoResp)
├─ model.ApplyGetInfo(resp) → 检测 CallbackItems 非空 → 设置 HasPendingTransportReward / HasPendingRobReward
└─ ApplyCallbackItems(resp.CallbackItems) → 道具入包(增量累加) + 弹出通用奖励界面
3. FiefDataChangedEvent → FiefRedDotHandler.Refresh() → 红点可见
5. 核心数据模型
5.1 状态容器 FiefModelVO
FiefModelVO
├── Mode: Self | Visit
├── [Self] FiefLevel, RefreshCount, RobCount, Message
│ NextRefreshTime, IdleCarCount, DiamondRefreshCount
│ Materials, CarTasks, EvictProtects
├── [Visit] VisitPlayerInfo, VisitFiefLevel, VisitMessage
│ VisitMyRobRemain, VisitMyDeportProtect, VisitMyDeportProtectEndTime
│ VisitMyFreeCar, VisitMaterials, VisitMyTransport
├── [Recommend] RecommendList, EnemyList, RecommendCdRemain
├── [Logs] Logs, LogTotal, LastLogTotalOnView
└── [RedDot] HasPendingTransportReward, HasPendingRobReward, IsViewingSelfTerritory
5.2 运输状态快照 FiefSlotTransportSnapshot
FiefSlotTransportSnapshot (静态工厂 Build)
├── SlotIndex
├── IsTransporting: bool (hasOwner || hasRobber) && EffectiveEndTime > 0
├── EffectiveEndTime: long 取 CarTask.EndTime 和 MaterialInfo.EndTime 中较大值
├── EffectiveStartTime: long 同上逻辑取 StartTime
├── Speed: float 来自 MaterialInfo.Speed
├── [领主方] HasOwnerTransport, OwnerCarNum, OwnerStrength
├── [掠夺方] HasRobberTransport, RobRoleId, RobCarNum, RobStrength
│ RobNickName, RobAvatar, RobFiefLevel
└── IsOwnerLeading => Speed <= 0f
不依赖 MaterialInfo.EndTime 作为运输判定的唯一依据。运输身份(谁在搬)由 MaterialInfo 判定,时效(多久)优先取 CarTask,MaterialInfo.EndTime 作为乐观更新后的兜底。
5.3 ViewModel 类
| 类 | 对应 UI | 构建方法 |
|---|---|---|
FiefMaterialItemVM | ComFiefMaterialMainItem | FiefModel.BuildMaterialItemVM(slotIndex) |
FiefHaulerDispatchVM | PanelFiefHaulerDispatchLogic | FiefModel.BuildHaulerDispatchVM(slot, selectedNum, override?) |
FiefHaulerStatusItemVM | ComFiefHaulerStatusItem | FiefModel.BuildHaulerStatusItemVM(taskView) |
FiefHaulerShowInfoVM | FiefHaulerShowInfo | FiefModel.BuildHaulerVM(...) (内部收口) |
5.4 MaterialInfo 关键字段
| 字段 | 说明 |
|---|---|
| MaterialId | 物资配置 ID |
| Level | 物资等级 |
| StartPos | 起始位置 (0=领主侧, 1=原点, 2=掠夺者侧) |
| Speed | 速度 (≤0=向领主, >0=向掠夺者, =0=静止) |
| StartTime / EndTime | 运输时间戳 |
| OwnerCarNum / OwnerStrength | 领主方载具数 / 战力 |
| RobRoleId / RobCarNum / RobStrength | 掠夺者 ID / 载具数 / 战力 |
| RobFiefLevel / RobNickName / RobAvatar | 掠夺者领地等级 / 昵称 / 头像 |
| IsProtected | 服务端维护的保护状态(粘性,由 reevaluateProtectedStatus 维护)。客户端直接读取,不做本地推测。 |
6. 网络协议清单
| 协议 | 请求/响应 | 客户端处理 |
|---|---|---|
FiefGetInfo | Req{} → Resp | model.ApplyGetInfo + 离线奖励补发(CallbackItems 入包 + 红点标记) |
FiefUpgrade | Req{} → Resp | model.ApplyUpgrade + SyncCallbackItems + 刷新 |
FiefRefreshMaterial | Req{refreshType} → Resp{materials} | model.ApplyRefreshMaterial + SyncCallbackItems |
FiefStartTransport | Req{slot,carNum,strength} → Resp{currentSpeed} | 乐观扣车 + ApplyStartTransportOptimistically + 刷新 |
FiefStartRob | Req{targetId,slot,carNum,strength} → Resp{hasRight,currentSpeed,transporter} | 乐观扣车 + ApplyStartRobOptimistically (hasRight=false 跳过) + 刷新 |
FiefAdjustCar | Req{targetId,slot,carNum,strength} → Resp{} | ApplyRecallAdjustCar (carNum=0 时清理本地) + 刷新 |
FiefAbandonTransport | Req{targetId,slot} → Resp{} | 刷新 |
FiefVisitTerritory | Req{targetId} → Resp{playerInfo,materials,myTransport,...} | model.ApplyVisitTerritory + MergeCarTasks |
FiefDeport | Req{targetId} → Resp{} | 刷新 |
FiefSettleVisitRewards | Req{targetRoleId} → Resp{callbackItems} | ApplyCallbackItems (道具入包 + 弹窗) |
FiefSetMessage | Req{message} → Resp{} | model.ApplySetMessage |
FiefGetRecommend | Req{} → Resp{recommendList,enemyList,cd} | model.ApplyRecommend |
FiefRefreshRecommend | Req{} → Resp{recommendList,cd} | model.ApplyRefreshRecommend |
FiefGetLogs | Req{page,pageSize} → Resp{logs,total} | model.ApplyLogs |
NoticeFiefTransportRight | 推送 → Msg{targetId,materialId,hasRight,speed,transporter,ownerId} | 更新 Speed/RobRoleId + 刷新 |
NoticeFiefTransportComplete | 推送 → Msg{winnerId,materialId,slot,ownerId,rewards} | 胜/败/旁观三种分支处理 + 红点 + 刷新 |
NoticeFiefEvicted | 推送 → Msg{evictorId,protectEndTime,ownerId} | 驱逐保护标记 + 刷新 |
8. 设计说明与注意事项
8.1 数据整理收口
所有展示数据由 FiefModel 的 ViewModel 构建方法统一预计算,UI 组件仅做 SetData(vm) 纯绑定:
BuildHaulerVM()— 搬运者展示数据唯一入口,haulerA / haulerB 均通过此方法构建BuildMaterialItemVM(slotIndex)— 主界面物资项完整数据(含倒计时、护盾、动画参数),通过BuildSlotTransportSnapshot取运输状态BuildHaulerDispatchVM(slotIndex, selectedCarNum)— 派遣面板完整数据(含预览时间估算、攻击力预览)BuildHaulerStatusItemVM(taskView)— 载具状态项完整数据(跨自身/他人列表查找 MaterialInfo)
8.2 护盾保护机制
MaterialInfo.IsProtected 是服务端维护的粘性状态字段(由 reevaluateProtectedStatus 维护),在 FiefGetInfo / FiefVisitTerritory / FiefRefreshMaterial 等回包中下发。客户端直接读取 material.IsProtected 驱动 FiefMaterialItemVM.ShowShield 和 UI 护盾显隐,不再做本地推测计算。
调用链:material.IsProtected → IsMaterialProtected(material) → GetMaterialState(slotIndex, material) → FiefMaterialItemVM.ShowShield → ComFiefMaterialMainItem.objShield.SetActive()
8.3 乐观本地更新
FiefStartRobResp / FiefStartTransportResp 的响应字段被充分利用:
has_right:只有获得搬运权时才乐观写入 RobRoleIdcurrent_speed:写入 Speed,确保 IsTransporting 立即生效EndTime:按now + configTime/carNum估算,让倒计时立即可见- 后续
RequestRefreshFiefData会用服务端权威数据覆盖
8.4 运输状态快照
FiefSlotTransportSnapshot.Build() 将运输身份(MaterialInfo 的 OwnerCarNum / RobRoleId)和时效(CarTask 优先,MaterialInfo 兜底)合并为统一快照,解决了"CarTask 已完成但 MaterialInfo.EndTime 还在未来"导致误判为搬运中的问题。
8.5 CallbackItems 处理
SCFiefHandler 中两种处理模式:
- ApplyCallbackItems:增量累加到 ItemModel + 弹出通用奖励界面(用于离线补发、访问结算)
- SyncCallbackItems:仅增量累加,不弹窗(用于升级、刷新等操作的消耗/产出同步)
两者都是增量累加(itemModel.AddItem),不覆盖背包数据。
8.6 客户端界面行为与服务端差异
客户端README记录以下接入边界。驱逐的客户端展示判定与本页后端不比较战力的事实不同;界面显示不等于服务端执行对应比较:
| 项 | 说明 |
|---|---|
| Expel 判定 | 驱逐胜负仍使用客户端预判(ExpelSuccess 属性),最终结果由 FiefExpelCommand 按客户端结果打开对应结算界面 |
| PositionAnimator | 位置动画参数在 VM 中预计算但 ComFiefMaterialMainItem 仍直接操作 transform |
| CloseSelf 行为 | ViewFiefMainLogic.CloseSelf 在 Visit 模式下不关闭而是切回 Self |
| 红点双模切换 | FiefRedDotHandler 在 HasServerData 前使用服务端推送值,之后切换为 Model 驱动;日志红点完全由服务端推送驱动 |
原型与图示









来源
旧territory-steal;飞书WyNNbu9UvodkTlxzZqBc8uu6nGg的正文、表格、图示与UI标注;客户端HomeMain/frontend-brief.md及Features/Fief/README.md。当前源码边界不等同运行验收。
后端当前差异(88b24abe)
model/fief/recommend.go推荐等级范围依次±5、±10、±15,不足全服随机,排除自己最多3人,与设计的±1起步、±4/±5扩大不同。handler/fief/visit_handler.go的FiefDeport/deportRobotRobber仅核验对方正在掠夺就执行DeportRobber,没有比较主角战力。这是当前明确实现缺口,不能写成仅“相等如何判定”未知;前端动画或预判不能代替服务端比较。