黄豆 饮料 冰棍 实现2

This commit is contained in:
wenhe committed 2026-09-04 16:51:47 +08:00
1 parent f89b95fb99
commit bae1755069
11 files changed
+193 -132

No files matched your search

@@ -96,13 +96,19 @@ POPSICLE_FRUITS = {
# 冰棍盒方块 → (水果物品名, 冰棍方块, 口味名) 反向表(取冰棍用)
POPSICLE_BOX_INFO = {v[0]: (k, v[1], v[2]) for k, v in POPSICLE_FRUITS.items()}
# 冰棍堆组合:
# popsiclepile_2(橙子+西瓜) + 苹果冰棍 → popsiclepile_3(橙子+西瓜+苹果)
# popsiclepile_3 空手取回 → 苹果冰棍, 退回 popsiclepile_2
# 冰棍堆组合(顺序无关, 空手取回按方块状态固定, 不存数据):
# 单根 橙子冰棍/西瓜冰棍 放在地上, 手持另一根右键 → 冰棍堆(橙子+西瓜 popsiclepile_2)
# (先放橙子再放西瓜 == 先放西瓜再放橙子, 都会变成 冰棍堆(橙子+西瓜))
# 冰棍堆 + 苹果冰棍 → 冰棍堆2(橙子+西瓜+苹果 popsiclepile_3)
# 空手右键(按方块状态固定, 无需记录):
# - 冰棍堆2 取出 苹果冰棍 → 退回 冰棍堆
# - 冰棍堆 取出 西瓜冰棍 → 变回 单根橙子冰棍
# (其他口味组合暂无对应堆方块, 不支持堆叠)
POPSICLE_PILE_ADD = "rtdd:apple_popsicleplace" # 能插上堆的冰棍
POPSICLE_PILE_2 = "rtdd:popsiclepile_2" # 2根堆(基础)
POPSICLE_PILE_3 = "rtdd:popsiclepile_3" # 3根堆
POPSICLE_SINGLE_ORANGE = "rtdd:orange_popsicle_place" # 单根橙子冰棍(放地上)
POPSICLE_SINGLE_MELON = "rtdd:melon_popsicleplace" # 单根西瓜冰棍(放地上)
POPSICLE_PILE_2 = "rtdd:popsiclepile_2" # 冰棍堆(橙子+西瓜)
POPSICLE_PILE_3 = "rtdd:popsiclepile_3" # 冰棍堆2(橙子+西瓜+苹果)
POPSICLE_PILE_ADD = "rtdd:apple_popsicleplace" # 第三根(苹果冰棍)
# ============================================================================
# 四、炒冰盒(冰棍盒·炒冰盒 分组)
@@ -7,7 +7,7 @@
1) 榨汁机(果汁·榨汁饮品): 全流程右键
空(juicer) + 水果 → 放入水果(juicer_0, 记录水果类型)
→ 榨汁中1/2/3(juicer_1/2/3) → 完成(juicer_4)
→ 空手右键取出对应果汁, 还原空
→ 手持玻璃杯(fruitjuice_0)右键取出对应果汁, 还原空
【水果类型持久化】放入水果时把水果写进方块实体数据(rtdd_jf), 之后每次
换态(SetBlockNew 会清空方块实体)都【先读旧→替换→写回新】, 因此玩家
在 榨汁2→榨汁3 过程中退出游戏, 重进后取出的果汁仍是第一步放入的水果。
@@ -18,10 +18,13 @@
3) 炒冰盒(冰棍盒·炒冰盒):
空(frytheicebox) + 冰块 → 放冰(frytheicebox_1)
放冰 + 水果 → 各水果炒冰盒(appleicebox 等)
各水果炒冰盒(除西瓜) 空手右键 → 取出1个冰沙, 还原空
4) 冰棍堆(组合, 同厨具架逻辑):
popsiclepile_2(橙子+西瓜) + 苹果冰棍 → popsiclepile_3(橙子+西瓜+苹果)
popsiclepile_3 空手右键 → 取出苹果冰棍(LIFO), 退回 popsiclepile_2
各水果炒冰盒 空手右键 → 取出1个冰沙, 还原空
4) 冰棍堆(组合, 顺序无关, 空手取回按方块状态固定, 不存数据):
单根 橙子冰棍/西瓜冰棍 放地上 + 手持另一根右键 → 冰棍堆(橙子+西瓜 popsiclepile_2)
(先放橙子再放西瓜 == 先放西瓜再放橙子, 都会变成 冰棍堆)
冰棍堆 + 苹果冰棍 → 冰棍堆2(橙子+西瓜+苹果 popsiclepile_3)
空手右键: 冰棍堆2 取出 苹果冰棍 → 退回 冰棍堆;
冰棍堆 取出 西瓜冰棍 → 变回 单根橙子冰棍
【与计时转换解耦】
冰棍盒"未定型→定型"的 30 秒计时拆到独立类 YinliaoTimerService。
@@ -34,11 +37,11 @@
【本类怎么做(自上而下的方法系列)】
handleBlockUse ← 入口:分发器转发右键方块事件
├─ _handleJuicer ← 榨汁机: 放入水果/逐级榨汁/取出果汁
├─ _handleJuicer ← 榨汁机: 放入水果/逐级榨汁/手持玻璃杯取出果汁
│ ├─ _readFruit / _writeFruit ← 水果类型 读/写(持久化)
├─ _handleLollyBox ← 冰棍盒: 加冰块(启动计时)/加水果/取冰棍
├─ _handleFryIceBox ← 炒冰盒: 加冰块/加水果/取冰沙
└─ _handlePopsiclePile ← 冰棍堆: 插苹果冰棍/取回
└─ _handlePopsiclePile ← 冰棍堆: 单根+另一根叠堆/插苹果冰棍/空手取回
(通用工具) getCarriedItem / consumeItem / replaceBlock / dropItems / checkCooldown
================================================================================
"""
@@ -63,6 +66,7 @@ from ..YinliaoData import (
ICE_ITEMS,
JUICE_FRUITS, JUICER_CHAIN, JUICER_ADVANCE_TIPS,
ICE_LOLLY_TIMER, POPSICLE_FRUITS, POPSICLE_BOX_INFO,
POPSICLE_SINGLE_ORANGE, POPSICLE_SINGLE_MELON,
POPSICLE_PILE_ADD, POPSICLE_PILE_2, POPSICLE_PILE_3,
FRYICE_FRUITS, FRYICE_BOX_INFO,
)
@@ -96,7 +100,9 @@ class YinliaoService(BlueFoxServerSystem):
self.featureBlocks.add("rtdd:frytheicebox_1")
for _f, info in FRYICE_FRUITS.items(): # 各水果炒冰盒
self.featureBlocks.add(info[0])
self.featureBlocks.add(POPSICLE_PILE_2) # 冰棍堆
self.featureBlocks.add(POPSICLE_SINGLE_ORANGE) # 单根橙子冰棍(冰棍堆底)
self.featureBlocks.add(POPSICLE_SINGLE_MELON) # 单根西瓜冰棍(冰棍堆底)
self.featureBlocks.add(POPSICLE_PILE_2) # 冰棍堆
self.featureBlocks.add(POPSICLE_PILE_3)
# ---- 右键冷却表 ----
@@ -146,8 +152,9 @@ class YinliaoService(BlueFoxServerSystem):
if blockName == "rtdd:frytheicebox" or blockName == "rtdd:frytheicebox_1" \
or blockName in FRYICE_BOX_INFO:
return self._handleFryIceBox(blockName, playerId, pos, dim, itemDict, itemName, key)
# ---- 冰棍堆 ----
if blockName == POPSICLE_PILE_2 or blockName == POPSICLE_PILE_3:
# ---- 冰棍堆(含单根橙子/西瓜冰棍作底) ----
if blockName == POPSICLE_SINGLE_ORANGE or blockName == POPSICLE_SINGLE_MELON \
or blockName == POPSICLE_PILE_2 or blockName == POPSICLE_PILE_3:
return self._handlePopsiclePile(blockName, playerId, pos, dim, itemDict, itemName, key)
return False
@@ -186,10 +193,10 @@ class YinliaoService(BlueFoxServerSystem):
comp.CreateMsg(playerId).NotifyOneMessage(playerId, tip)
return True
# ---- 完成(juicer_4) 空手右键 → 取出果汁, 还原空 ----
# ---- 完成(juicer_4) 手持玻璃杯右键 → 取出果汁, 还原空 ----
if blockName == "rtdd:juicer_4":
if itemName and itemName != "minecraft:air":
return False # 必须空手取出, 手持其他物品不处理
if itemName != "rtdd:fruitjuice_0":
return False # 必须手持玻璃杯(fruitjuice_0)取出, 手持其他物品不处理
if not self.checkCooldown(key, 0.5):
return True
fruit = self._readFruit(pos, dim)
@@ -197,6 +204,7 @@ class YinliaoService(BlueFoxServerSystem):
if not juiceInfo:
return False # 无水果记录(创造直接放置的完成态) → 不反应
juiceBlock, juiceName = juiceInfo
self.consumeItem(playerId, itemDict, 1) # 消耗玻璃杯(果汁成品自带杯)
self.dropItems(dim, pos, [{"name": juiceBlock, "count": 1}])
self.replaceBlock(pos, dim, "rtdd:juicer", playerId) # 还原空, 记录随方块清除
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a取出了" + juiceName)
@@ -306,28 +314,55 @@ class YinliaoService(BlueFoxServerSystem):
# ============================================================================
def _handlePopsiclePile(self, blockName, playerId, pos, dim, itemDict, itemName, key):
# ---- 堆(橙子+西瓜) + 苹果冰棍 → 堆2(橙子+西瓜+苹果) ----
if blockName == POPSICLE_PILE_2:
if itemName != POPSICLE_PILE_ADD:
return False
# ---- 单根橙子冰棍(地上) + 手持西瓜冰棍 → 冰棍堆(橙子+西瓜) ----
if blockName == POPSICLE_SINGLE_ORANGE and itemName == POPSICLE_SINGLE_MELON:
if not self.checkCooldown(key, 0.5):
return True
self.consumeItem(playerId, itemDict, 1)
self.replaceBlock(pos, dim, POPSICLE_PILE_3, playerId)
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a把苹果冰棍插到冰棍堆上")
self.replaceBlock(pos, dim, POPSICLE_PILE_2, playerId)
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a把西瓜冰棍叠到橙子冰棍上,变成冰棍堆")
return True
# ---- 堆2 空手右键 → 取出苹果冰棍(后放先取), 退回堆 ----
if blockName == POPSICLE_PILE_3:
if itemName and itemName != "minecraft:air":
return False
# ---- 单根西瓜冰棍(地上) + 手持橙子冰棍 → 冰棍堆(橙子+西瓜), 顺序无关 ----
if blockName == POPSICLE_SINGLE_MELON and itemName == POPSICLE_SINGLE_ORANGE:
if not self.checkCooldown(key, 0.5):
return True
self.dropItems(dim, pos, [{"name": POPSICLE_PILE_ADD, "count": 1}])
self.consumeItem(playerId, itemDict, 1)
self.replaceBlock(pos, dim, POPSICLE_PILE_2, playerId)
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a取走了苹果冰棍")
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a把橙子冰棍叠到西瓜冰棍上,变成冰棍堆")
return True
# ---- 冰棍堆(橙子+西瓜) ----
if blockName == POPSICLE_PILE_2:
# + 苹果冰棍 → 冰棍堆2(橙子+西瓜+苹果)
if itemName == POPSICLE_PILE_ADD:
if not self.checkCooldown(key, 0.5):
return True
self.consumeItem(playerId, itemDict, 1)
self.replaceBlock(pos, dim, POPSICLE_PILE_3, playerId)
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a把苹果冰棍插到冰棍堆上,叠成三层")
return True
# 空手右键 → 取出西瓜冰棍(按方块状态固定), 变回 单根橙子冰棍
if not itemName or itemName == "minecraft:air":
if not self.checkCooldown(key, 0.5):
return True
self.dropItems(dim, pos, [{"name": POPSICLE_SINGLE_MELON, "count": 1}])
self.replaceBlock(pos, dim, POPSICLE_SINGLE_ORANGE, playerId)
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a取走了西瓜冰棍,剩下一根橙子冰棍")
return True
return False
# ---- 冰棍堆2(橙子+西瓜+苹果) ----
if blockName == POPSICLE_PILE_3:
# 空手右键 → 取出苹果冰棍, 退回 冰棍堆
if not itemName or itemName == "minecraft:air":
if not self.checkCooldown(key, 0.5):
return True
self.dropItems(dim, pos, [{"name": POPSICLE_PILE_ADD, "count": 1}])
self.replaceBlock(pos, dim, POPSICLE_PILE_2, playerId)
comp.CreateMsg(playerId).NotifyOneMessage(playerId, "§a取走了苹果冰棍")
return True
return False
return False
# ============================================================================