破坏掉落存储物品 (keyong)

This commit is contained in:
wenhe committed 2026-09-03 17:07:41 +08:00
1 parent 0cb1da680d
commit 620500ab45
11 files changed
+373 -101

No files matched your search

+21 -3
View File
@@ -209,9 +209,21 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher)
- 取盘子: 空手右键逐个取回 [已实现]
四、书柜 (bookcase 系列, 后放先取, 至多13本)
- 放书: 手持书/附魔书右键逐个放入, 消耗1本, stack记录完整物品信息(附魔不丢,
字段 rtdd_swt=stack, 退出重进不丢) [已实现]
- 取书: 空手右键后放先取(LIFO) [已实现]
- 放书: 手持书/附魔书右键逐个放入, 消耗1本; 堆栈"替换方块前从旧方块读出→替换后写回新方块",
多本连续放入不会丢 [已实现]
- 取书: 空手右键后放先取(LIFO), 取回的书以掉落物形式掉在书柜前(不进背包) [已实现]
- 附魔书: 附魔以扁平ench字段([[附魔ID,等级],...])存方块实体(rtdd_swt=stack/rtdd_sws),
取回时重建userData; 不存含__type__/__value__的userData(引擎写不进方块实体),
退出重进词条不丢(掉落保护仍是掉落保护) [已实现]
- 健壮性: 方块实体里损坏/为None的旧堆栈数据按空堆栈处理, 不再报错(TypeError) [已实现]
四b、药水架 (lotion 系列, 后放先取, 至多3瓶)
- 从药物系统(xy_medicine)移至家具分类(xy_furniture) [已实现]
- 放药水: 手持任意药水(普通/喷溅/滞留)右键逐个放入, 消耗1瓶, 记录药水名+aux(aux决定效果) [已实现]
- 取药水: 空手右键后放先取(LIFO), 取回的药水以掉落物形式掉在架前(原样返还, 含aux效果) [已实现]
- 满架: 手持药水右键三瓶满的药水架 → 提示"已满", 拦截默认行为(防止误喝药水) [已实现]
- 方块链: 药水架_1(空)=lotion_0, 药水架_2(一瓶)=lotion_1, 药水架_3(两瓶)=lotion_2,
药水架_4(三瓶)=lotion_3 [已实现]
五、厨具架 (kitchenwarerack 系列, 组合顺序无关, 后放先取, 至多2件)
- 放入: 手持 锅铲/锅勺/菜刀/炒锅 右键空架/未满架 → 消耗1个 → 按组合成型 [已实现]
@@ -230,3 +242,9 @@ FurnitureData+FurnitureService 实现, 注册到 FeatureDispatcher)
- 扔垃圾: 打开时手持任意物品右键 → 变为 有垃圾 状态 + 清空主手物品 [已实现]
- 关闭: 右键(空手/手持均可) 打开/有垃圾 → 关闭桶盖 [已实现]
八、左键破坏存物方块掉落 (书柜/药水架/厨具架)
- 存了东西的家具方块被左键打碎时: 取消默认掉落 → 掉 空方块本体(保留朝向) + 全部存储物品 [已实现]
(书柜掉空书柜bookcase+里面的书; 药水架掉空药水架lotion_0+里面的药水; 厨具架掉空架+厨具)
- 附魔书/药水效果在掉落物中保留(取回时重建, 词条/效果不丢) [已实现]
- 与售卖盒区分: 售卖盒破坏重放仍可右键取物; 书柜这类破坏后记录随方块消失, 重放取不到 [已实现]
+22 -6
View File
@@ -2,17 +2,20 @@
【家具家私】(xy_furniture) 转化关系
========================================
说明:
- 家具家私分类方块: 箭桶、水槽、盘子架、书柜、厨具架、唱片机、垃圾桶 系列
- 家具家私分类方块: 箭桶、水槽、盘子架、书柜、药水架、厨具架、唱片机、垃圾桶 系列
- 有交互转换的: 箭桶(存/取箭)、水槽(加水/取水/放洗脏盘/取脏盘)、
盘子架(放/取盘)、书柜(放/取书)、厨具架(放/取厨具)
盘子架(放/取盘)、书柜(放/取书)、药水架(放/取药水)、厨具架(放/取厨具)
- 【方块存储物品实现】(FurnitureService 两种记录, 写入方块实体数据, 退出重进不丢):
① count记录(箭桶): 记录一种物品+数量, 字段 rtdd_swt=count / rtdd_swc=数量 /
rtdd_swi=物品名 / rtdd_swa=aux值
② stack记录(书柜): 后放先取堆栈, 记录完整物品信息(含userData, 附魔不丢),
字段 rtdd_swt=stack / rtdd_sws=堆栈列表
- 【实现状态】: 箭桶/水槽/盘子架/书柜/厨具架/古式唱片机/垃圾桶 全部已实现
② stack记录(书柜/药水架): 后放先取堆栈, 记录物品名+aux(药水)或附魔ench(书),
字段 rtdd_swt=stack / rtdd_sws=堆栈(原始扁平列表, 不存引擎NBT编码的userData)
- 【实现状态】: 箭桶/水槽/盘子架/书柜/药水架/厨具架/古式唱片机/垃圾桶 全部已实现
(统一由 xiangyemod/jiaju/FurnitureService 处理, 注册到 FeatureDispatcher;
旧 BlockSwitchService 已废弃); 唱片播放曲目 待后续实现
- 【左键破坏掉落】: 书柜/药水架/厨具架这类"存了东西"的方块被打碎时, 掉 空方块本体
+ 全部存储物品(附魔/药水效果保留); 与售卖盒不同: 售卖盒破坏重放仍可右键取物,
这类方块破坏后记录随方块消失, 重放取不到
- 其余为静态装饰家具, 无转换
========================================
@@ -147,7 +150,19 @@
-> 书柜_9(8本) -> 书柜_8(7本) -> 书柜_7(6本) -> 书柜_6(5本) -> 书柜_5(4本)
-> 书柜_4(3本) -> 书柜_3(2本) -> 书柜_2(1本) -> 书柜_1(空)
转换条件:[右键 进行转换, 后放先取, 取回书]
机制: 空手右键逐本取回, 后放先取(LIFO), 取回的书保留原物品信息(附魔等)
机制: 空手右键逐本取回, 后放先取(LIFO), 取回的书以掉落物形式掉在书柜前(不进背包),
保留附魔(附魔以扁平ench字段存方块实体, 取回时重建userData, 退出重进词条不丢)
========================================
四b、药水架(放药水/取药水, 后放先取, 至多3瓶)【已实现】
========================================
- 从药物系统(xy_medicine)移至家具分类(xy_furniture)
- 可放药水: 任意药水(普通/喷溅/滞留 minecraft:potion / splash_potion / lingering_potion)
- 放入: 手持任意药水右键 药水架(空/未满) → 消耗1瓶, 记录药水名+aux(aux决定药水效果)
- 取回: 空手右键 → 后放先取(LIFO), 取回最后放入的那瓶药水(掉落物形式, 原样返还)
- 满架: 手持药水右键三瓶满的药水架 → 提示"已满", 拦截默认行为(防止误喝药水)
- 方块链: 药水架_1(空)=lotion_0, 药水架_2(一瓶)=lotion_1,
药水架_3(两瓶)=lotion_2, 药水架_4(三瓶)=lotion_3
========================================
五、厨具架(放厨具/取厨具, 至多2件)【已实现】
@@ -156,6 +171,7 @@
- 放入: 手持厨具右键 厨具架(空/未满) → 放入该厨具, 消耗1个, 厨具架形态变为对应组合
(组合与放入顺序无关: 先放锅再放刀 == 先放刀再放锅, 都是 炒锅+菜刀)
- 取回: 空手右键 → 后放先取(LIFO), 取回最后放入的厨具, 形态退回剩余单件/空
(创造模式等直接放置的"带厨具"厨具架, 无记录时按方块状态推断厨具, 同样可右键取回)
- 厨具架方块状态(方块名称即组合, 一块最多挂2件):
kitchenwarerack = 厨具架(空)
kitchenwareracka_1 = 厨具架(单锅铲) ← 放1把锅铲
+4 -1
View File
@@ -7,8 +7,11 @@
- 【待确认】表示该步骤所需的具体操作或配方尚未最终确定
========================================
一、药水架(存/取药水,后放先取,至多3瓶)
一、药水架(存/取药水,后放先取,至多3瓶)【已移至家具分类,见 家具家私转化关系.txt 四b】
========================================
说明: 药水架(lotion_0~3)已从药物系统移至家具分类(xy_furniture), 由 FurnitureService 实现:
手持任意药水右键放入(消耗1瓶,记录药水名+aux), 空手右键后放先取取回(掉落物)。
具体规则见 家具家私转化关系.txt 四b、药水架。
1. 药水架_1(空) -> 药水架_2(一瓶药水)
转换条件:[手持 任意药水 右键 进行转换,药水数量减少,方块记录药水类型]
机制: 手持药水右键,消耗1瓶,放入药水并记录类型