加入榨汁机 冰棍盒,炒冰盒 厨具架小bug

This commit is contained in:
wenhe committed 2026-09-29 17:14:43 +08:00
1 parent a7b56aec7d
commit 9d12baf1b2
25 files changed
+354 -227

No files matched your search

@@ -764,6 +764,81 @@ class BlueFoxServerSystem(serverBaseSystem):
serverCompFactory.CreateActorMotion(dropItemEntityId).SetMotion((x * 0.3, y * 0.5, z * 0.3))
return dropItemEntityId
def getCarriedItem(self, playerId):
"""获取玩家主手物品(统一实现)。子服务可覆写, 缺省走这里"""
itemComp = serverCompFactory.CreateItem(playerId)
return itemComp.GetPlayerItem(
serverApi.GetMinecraftEnum().ItemPosType.CARRIED, 0, True)
# ============================================================================
# 统一"主动获得物品"接口(任务一):
# 所有给玩家的物品一律按优先级分发, 而非直接掉落:
# 1) 背包(非主手)存在同类可叠加 -> +1 合并
# 2) 主手为空 -> 放到主手
# 3) 主手有物 -> 放入背包(同类叠加/空位)
# 4) 背包满且主手有物 -> 掉落物形式(在 pos 上方生成)
# 死亡生物屠宰 / 稻谷 需要保持"纯掉落"时请勿调用本方法(仍用 CreateEngineItemEntity)。
# ============================================================================
def giveItemToPlayer(self, playerId, itemName, count=1, pos=None, dim=None, aux=0, userData=None):
"""按统一优先级把物品给玩家。pos/dim 只在最终"掉落物"兜底时用(可为空)。
返回 True = 已成功放入(合并/主手/背包); False = 最终只能掉落或调用方无上下文。"""
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
if userData:
itemDict["userData"] = userData
try:
# 1) 背包同类合并
if self._mergeSameStackInv(playerId, itemName, count):
return True
# 2) 主手为空 -> 放主手
cur = self.getCarriedItem(playerId)
hand = (cur or {}).get("newItemName")
if not hand or hand == "minecraft:air":
try:
if serverCompFactory.CreateItem(playerId).SpawnItemToPlayerCarried(
itemDict, playerId):
return True
except Exception:
pass
# 3) 放入背包(同类叠加/空位)
try:
if serverCompFactory.CreateItem(playerId).SpawnItemToPlayerInv(
itemDict, playerId):
return True
except Exception:
pass
except Exception:
pass
# 4) 掉落物兜底
if pos and dim:
try:
self.CreateEngineItemEntity(
itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
except Exception:
pass
return False
def _mergeSameStackInv(self, playerId, itemName, count=1):
"""背包(主手除外)存在可叠加同种物品 -> 数量+count 合并。
返回 True=已合并; False=没有可合并的同种堆叠(不新增物品)。"""
itemComp = serverCompFactory.CreateItem(playerId)
enum = serverApi.GetMinecraftEnum().ItemPosType
try:
for i in range(0, 36):
d = itemComp.GetPlayerItem(enum.INVENTORY, i, True)
if not d:
continue
if d.get("newItemName") == itemName and (d.get("count") or 0) < 64:
newCount = (d.get("count") or 0) + count
itemComp.SetEntityItem(
enum.INVENTORY, i,
{"itemName": itemName, "count": newCount,
"auxValue": d.get("newAuxValue", 0),
"userData": d.get("userData", {})})
return True
except Exception:
return False
return False
@BlueFoxClientListener
def RucksackScreenClosed(self, args):
"""
@@ -359,11 +359,10 @@ allCookRecipe = [
# 第19页 汤锅·锅底=汤锅(加水) —— 米饭/饭团/碗装
# =============================================================
{
'publicResult': 'rtdd:rawricepot', # 锅底(首产物) = 生米锅
'publicResult': 'rtdd:stewedsoupwater', # 锅底(首产物) = 生米锅
'publicStep': [
{'itemName': 'rtdd:stewedsoup', 'count': 1}, # 汤锅(空)
{'itemName': 'minecraft:water_bucket', 'count': 1}, # 水桶
{'itemName': 'rtdd:brownrice', 'count': 64}, # 大米
{'itemName': 'minecraft:water_bucket', 'count': 1} # 水桶
], # 锅底步骤: 汤锅(空)+水桶+大米x64 -> 生米锅 -> 计时 -> 熟米饭
'splitStep': [
{'result': 'rtdd:ricepot_1', 'items': [{'itemName': 'rtdd:brownrice', 'count': 64}, {}, {}]},
@@ -372,27 +372,13 @@ class ChaoguoService(BlueFoxServerSystem):
# ============================================================================
def dropItem(self, dim, pos, itemName, count=1, aux=0, playerId=None):
"""取成品/返容器: playerId 给出时【优先入包】—— 主手空->放主手;
否则入背包(同类叠加/空位); 背包满(返回False)->落回地面掉落物。
不传 playerId(无玩家上下文, 如破坏掉落) 保持原掉落物, 零影响。"""
"""取成品/返容器: playerId 给出时走统一优先级(同类合并->主手->背包->掉落);
不传 playerId(无玩家上下文, 如破坏掉落) 保持原掉落物。"""
if playerId is not None:
self.giveItemToPlayer(playerId, itemName, count, pos, dim)
return
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
if playerId is not None:
# 1) 主手空 -> 放主手
cur = self.getCarriedItem(playerId)
handItem = (cur or {}).get("newItemName")
if not handItem or handItem == "minecraft:air":
try:
if comp.CreateItem(playerId).SpawnItemToPlayerCarried(itemDict, playerId):
return
except Exception:
pass
# 2) 否则入包(同类叠加/空位); 失败(满)->掉落
try:
if comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId):
return
except Exception:
pass
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
except Exception:
pass
@@ -340,7 +340,7 @@ class ChujuService(BlueFoxServerSystem):
# 掉落物
if recipe.get("dropItem"):
self.dropItems(dim, pos, recipe["dropItem"])
self.dropItems(dim, pos, recipe["dropItem"], playerId)
# 给背包物品
if recipe.get("giveItem"):
@@ -399,7 +399,7 @@ class ChujuService(BlueFoxServerSystem):
meat = self._readMeat(pos, dim)
meatball = MEAT_ITEMS.get(meat) if meat else None
if meatball:
self.dropItems(dim, pos, [{"name": meatball, "count": 1}])
self.dropItems(dim, pos, [{"name": meatball, "count": 1}], playerId)
self.replaceBlock(pos, dim, "rtdd:beater", playerId)
return True
return False
@@ -442,7 +442,7 @@ class ChujuService(BlueFoxServerSystem):
if not self.checkCooldown(key, 0.5):
return True
self.consumeItem(playerId, itemDict, 1)
self.dropItems(dim, pos, [{"name": CREAM_ITEM, "count": 1}])
self.dropItems(dim, pos, [{"name": CREAM_ITEM, "count": 1}], playerId)
self.replaceBlock(pos, dim, "rtdd:beater", playerId)
return True
if itemName == MILK_ITEM:
@@ -471,7 +471,7 @@ class ChujuService(BlueFoxServerSystem):
if not self.checkCooldown(key, 0.5):
return True
self.consumeItem(playerId, itemDict, 1)
self.dropItems(dim, pos, [{"name": EGG_CUSTARD_ITEM, "count": 1}])
self.dropItems(dim, pos, [{"name": EGG_CUSTARD_ITEM, "count": 1}], playerId)
self.replaceBlock(pos, dim, "rtdd:beater", playerId)
return True
return False
@@ -569,7 +569,7 @@ class ChujuService(BlueFoxServerSystem):
return False
if not self.checkCooldown(key, 0.5):
return True
self.dropItems(dim, pos, [{"name": FLOUR_ITEM, "count": 1}])
self.dropItems(dim, pos, [{"name": FLOUR_ITEM, "count": 1}], playerId)
self._clearMill(dim, pos)
return True
# 黄豆: + 玻璃罐 -> 油罐
@@ -577,7 +577,7 @@ class ChujuService(BlueFoxServerSystem):
if not self.checkCooldown(key, 0.5):
return True
self.consumeItem(playerId, itemDict, 1)
self.dropItems(dim, pos, [{"name": OIL_CAN_ITEM, "count": 1}])
self.dropItems(dim, pos, [{"name": OIL_CAN_ITEM, "count": 1}], playerId)
self._clearMill(dim, pos)
return True
return False
@@ -708,11 +708,8 @@ class ChujuService(BlueFoxServerSystem):
# ============================================================================
def giveItem(self, playerId, itemName, count=1, aux=0):
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId)
except Exception:
pass
""""给玩家物品": 统一走优先级(同类合并->主手->背包->掉落)"""
self.giveItemToPlayer(playerId, itemName, count)
# ============================================================================
# 十、工具方法,消耗物品
@@ -755,14 +752,19 @@ class ChujuService(BlueFoxServerSystem):
# 十二、工具方法,以掉落物形式生成物品
# ============================================================================
def dropItems(self, dim, pos, dropList):
def dropItems(self, dim, pos, dropList, playerId=None):
for d in dropList:
itemDict = {
"itemName": d["name"],
"count": d.get("count", 1),
"auxValue": d.get("aux", 0),
}
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
if playerId is not None:
# 任务一: 玩家主动获得 -> 统一优先级(同类合并->主手->背包->掉落)
self.giveItemToPlayer(playerId, d["name"], d.get("count", 1), pos, dim,
aux=d.get("aux", 0))
else:
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
# ============================================================================
# 十三、工具方法,冷却检查
@@ -206,7 +206,7 @@ class AnimalService(BlueFoxServerSystem):
# ---- 逆向操作:取东西/清理 ----
# 掉落物形式生成(取蛋、取下物品等),优先于 giveItem
if recipe.get("dropItem"):
self.dropItems(dim, pos, recipe["dropItem"])
self.dropItems(dim, pos, recipe["dropItem"], playerId)
elif recipe.get("giveItem"):
self.giveItem(playerId, recipe["giveItem"], recipe.get("giveCount", 1))
@@ -274,17 +274,17 @@ class AnimalService(BlueFoxServerSystem):
# ============================================================================
def giveItem(self, playerId, itemName, count=1, auxValue=0):
comp.CreateItem(playerId).SpawnItemToPlayerInv(
{"itemName": itemName, "count": count, "auxValue": auxValue}, playerId)
""""给玩家物品": 统一走优先级(同类合并->主手->背包->掉落)"""
self.giveItemToPlayer(playerId, itemName, count, aux=auxValue)
# ============================================================================
# 九、工具方法:以掉落物形式生成物品(取蛋/取下物品等,符合"获得"体验)
# ============================================================================
def dropItems(self, dim, pos, dropList):
def dropItems(self, dim, pos, dropList, playerId=None):
"""
dropList 格式:[{"name": "minecraft:egg", "count": 5}, ...]
在方块上方生成掉落物实体,让它自然掉到地上。
playerId 给出时走统一优先级(任务一: 同类合并->主手->背包->掉落)。
"""
for d in dropList:
itemDict = {
@@ -292,7 +292,11 @@ class AnimalService(BlueFoxServerSystem):
"count": d.get("count", 1),
"auxValue": d.get("aux", 0),
}
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
if playerId is not None:
self.giveItemToPlayer(playerId, d["name"], d.get("count", 1), pos, dim,
aux=d.get("aux", 0))
else:
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
# ============================================================================
# 十、工具方法:冷却检查
@@ -67,6 +67,9 @@ from ..FurnitureData import (FURNITURE_SWITCHES,
# ---- 统一分发器 ----
from ...service.FeatureDispatcher import FeatureDispatcher
# ---- 声音播放(垃圾桶开关, 任务四) ----
from ....ModUtil.ServerUtil import PlaySoundToAllClient
class FurnitureService(BlueFoxServerSystem):
"""
@@ -132,11 +135,15 @@ class FurnitureService(BlueFoxServerSystem):
itemDict = self.getCarriedItem(playerId)
itemName = itemDict.get("newItemName") if itemDict else None
# 厨具架: 通用组合逻辑(顺序无关, 后放先取), 单独处理
# 厨具架: 通用组合逻辑(点左拿左, 点右拿右), 单独处理
if blockName in self.kitchenrackBlockSet:
if not self.checkCooldown(key, 0.5):
return True
self._handleKitchenRack(playerId, pos, dim, itemDict, itemName, blockName)
click = {
"cx": args.get("clickX"), "cz": args.get("clickZ"),
"face": args.get("face"), "aux": args.get("aux"),
}
self._handleKitchenRack(playerId, pos, dim, itemDict, itemName, blockName, click)
return True
recipe = self.findRecipe(blockName, itemDict)
@@ -343,34 +350,53 @@ class FurnitureService(BlueFoxServerSystem):
# 四、厨具架通用逻辑(组合由 stack 记录计算, 与放入顺序无关, 取回后放先取)
# ============================================================================
def _handleKitchenRack(self, playerId, pos, dim, itemDict, itemName, blockName):
def _handleKitchenRack(self, playerId, pos, dim, itemDict, itemName, blockName, click=None):
"""
厨具架:放入/取回通用处理。
厨具架:放入/取回通用处理(任务五: 点哪边拿哪个)。
放入: 手持 锅铲/锅勺/菜刀/炒锅 右键空架/单件架 -> 按组合(顺序无关)成型
取回: 空手右键 -> 弹出最后放入的厨具并返还, 形态退回剩余单件/空
无记录时(如创造模式直接放置带厨具的厨具架)按方块状态推断厨具。
取回: 空手右键 -> 按点击位置(clickX/clickZ/face)判断点在左槽还是右槽,
取下该槽对应厨具, 形态退回剩余单件/空。
槽位固定布局: 组合块模型的左槽 = KITCHENRACK_BLOCK_ITEMS[blockName][0],
右槽 = [1] (与放入顺序无关, 以方块固态布局为准)。
[注意] 左右判定依赖朝向, 若实测相反, 调 _rackSideFlip 即可翻转。
"""
click = click or {}
# 槽位固定布局(左=index0, 右=index1); 单件=1个
layout = list(KITCHENRACK_BLOCK_ITEMS.get(blockName, []))
record = self._loadRecord(pos, dim)
if record and record.get("stack"):
stack = record["stack"] # 有记录: 物品对象列表
stackNames = [s.get("itemName") for s in stack]
else:
stack = [] # 无记录: 按方块状态推断
stackNames = list(KITCHENRACK_BLOCK_ITEMS.get(blockName, []))
stackNames = list(layout)
# ---- 取回: 空手 ----
if not itemName or itemName == "minecraft:air":
if not stackNames:
return
poppedName = stackNames.pop() # 后放先取, 弹最后一件
if stack:
topItem = stack.pop()
self._dropItemObj(dim, pos, topItem) # 掉落物返还(根因C)
# 点左/点右 决定取哪个厨具(单件时无论点左右都取那一个)
side = self._rackSideByClick(click.get("face"), click.get("cx"), click.get("cz"))
if len(layout) >= 2:
idx = 0 if side == "left" else 1
else:
self._dropItemDict(dim, pos,
{"itemName": poppedName, "count": 1, "auxValue": 0})
# 计算剩余 -> 目标方块, 并保存剩余记录(保证后续取回一致)
idx = 0
picked = layout[idx] if idx < len(layout) else stackNames[-1]
if picked not in stackNames:
picked = stackNames[-1] # 槽位与记录不一致时兜底取最后一件
idx = stackNames.index(picked)
# 移除被取走的那件, 计算剩余 -> 目标方块, 并保存剩余记录
stackNames.remove(picked)
target = self._rackTarget(stackNames)
pickedObj = None
for _s in stack:
if _s.get("itemName") == picked:
pickedObj = _s
break
if pickedObj is not None:
self.giveItemObj(playerId, pickedObj) # 按持久化对象给(附魔保留)
else:
self.giveItemToPlayer(playerId, picked, 1, pos, dim, aux=0)
self.replaceBlock(pos, dim, target, playerId)
if stackNames:
self._saveRecordDelayed(pos, dim, {"stack": self._namesToObjs(stackNames)})
@@ -396,6 +422,17 @@ class FurnitureService(BlueFoxServerSystem):
self.replaceBlock(pos, dim, target, playerId)
self._saveRecordDelayed(pos, dim, {"stack": self._namesToObjs(stackNames)})
def _rackSideByClick(self, face, cx, cz):
"""根据点击的面 + 命中比例位置, 判断点的是左槽还是右槽。
顶面/南北面(法线沿Z): 沿X分左右; 东西面(法线沿X): 沿Z分左右。
返回 'left' / 'right'。若实测与实际相反, 直接翻转本方法即可。"""
if face in (4, 5): # 东/西面: 沿 Z 分
v = cz
else: # 顶/北/南面(默认): 沿 X 分
v = cx
v = float(v) if v is not None else 0
return "left" if v < 0.5 else "right"
def _rackTarget(self, itemNames):
"""根据厨具物品名列表计算厨具架目标方块(0件=空, 1件=单件, 2件=组合, 顺序无关)"""
if not itemNames:
@@ -451,6 +488,14 @@ class FurnitureService(BlueFoxServerSystem):
if recipe.get("target"):
self.replaceBlock(pos, dim, recipe["target"], playerId)
# ---- 垃圾桶开关声音(任务四) ----
_src = recipe.get("source")
_tgt = recipe.get("target")
if _tgt == "rtdd:rubbish_bin_2" and _src == "rtdd:storage_buckets":
PlaySoundToAllClient((pos[0], pos[1], pos[2], dim), "block.barrel.open", 1.0)
elif _tgt == "rtdd:storage_buckets" and _src in ("rtdd:rubbish_bin_2", "rtdd:b_160"):
PlaySoundToAllClient((pos[0], pos[1], pos[2], dim), "block.barrel.close", 1.0)
# ---- 替换后把堆栈写回新方块(此时写才不会被清掉) ----
if bookStack is not None:
if bookStack:
@@ -700,14 +745,8 @@ class FurnitureService(BlueFoxServerSystem):
# ============================================================================
def giveItem(self, playerId, itemName, count=1, aux=0, userData=None):
"""往玩家背包塞一个物品, 背包满则掉地上"""
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
if userData:
itemDict["userData"] = userData
comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId)
except Exception:
pass
""""给玩家物品": 统一走优先级(同类合并->主手->背包->掉落)"""
self.giveItemToPlayer(playerId, itemName, count, aux=aux, userData=userData)
def giveItemObj(self, playerId, itemObj):
"""按持久化物品对象给玩家(厨具架取回; 附魔书按扁平ench重建附魔)"""
@@ -196,7 +196,7 @@ class MianshiService(BlueFoxServerSystem):
if not self.checkCooldown(key, 0.4):
return True
self.clearBlock(pos, dim)
self.dropItem(dim, pos, blockName)
self.dropItem(dim, pos, blockName, playerId=playerId)
return True
# ---- 空手右键"蒸笼计时源"(蒸X_生): 计时已改自动(tick 判定下方点燃炉灶),
@@ -339,7 +339,7 @@ class MianshiService(BlueFoxServerSystem):
action = recipe.get("action")
# 掉落物(切分/递减/取出) —— 无特殊动作时才走通用掉落
if recipe.get("dropItem") and not action:
self.dropItem(dim, pos, recipe["dropItem"])
self.dropItem(dim, pos, recipe["dropItem"], playerId=playerId)
# 给背包物品(水桶变空桶/擀面杖返还)
if recipe.get("give"):
self.giveItem(playerId, recipe["give"])
@@ -347,33 +347,33 @@ class MianshiService(BlueFoxServerSystem):
if action == "chop_smalldough":
self.clearBlock(pos, dim)
for _ in range(8):
self.dropItem(dim, pos, "rtdd:smalldough_0")
self.dropItem(dim, pos, "rtdd:smalldough_0", playerId=playerId)
elif action == "chop_noodles":
self.clearBlock(pos, dim)
self.dropItem(dim, pos, "rtdd:noodles")
self.dropItem(dim, pos, "rtdd:noodles", playerId=playerId)
elif action == "drop_dumpling_skin":
# 擀好的小面团压成饺子皮: 面团消失, 掉落1个饺子皮物品(地上不留方块)
self.clearBlock(pos, dim)
self.dropItem(dim, pos, recipe["dropItem"])
self.dropItem(dim, pos, recipe["dropItem"], playerId=playerId)
elif action == "drop_result":
# 捏合/塑形完成(生饺子/生肉包子): 方块消失, 成品以掉落物形式出现
self.clearBlock(pos, dim)
self.dropItem(dim, pos, recipe["dropItem"])
self.dropItem(dim, pos, recipe["dropItem"], playerId=playerId)
elif action == "unmold_cake":
# 蛋糕面糊(烤熟) 脱模 -> 蛋糕胚(方块) + 掉落 1 木碗
self.replaceBlock(pos, dim, "rtdd:cakebase", playerId)
self.dropItem(dim, pos, BOWL)
self.dropItem(dim, pos, BOWL, playerId=playerId)
elif action == "split_cake":
# 半块蛋糕 菜刀拆分: 半块消失 -> 掉落两个对应小块
self.clearBlock(pos, dim)
for _ in range(2):
self.dropItem(dim, pos, recipe["dropItem"])
self.dropItem(dim, pos, recipe["dropItem"], playerId=playerId)
elif action == "take_steamer":
# 蒸笼取出: 蒸食物块 -> 变回空蒸笼 + 掉落成品(数量按 dropCount, 默认1)
self.replaceBlock(pos, dim, "rtdd:steamer", playerId)
if recipe.get("dropItem"):
for _ in range(recipe.get("dropCount", 1)):
self.dropItem(dim, pos, recipe["dropItem"])
self.dropItem(dim, pos, recipe["dropItem"], playerId=playerId)
# 转换后启动计时(发酵等, 记录玩家以便完成提示送达)
if recipe.get("startTimer"):
FeatureDispatcher.startTimerFor(recipe["startTimer"], dim, pos, playerId)
@@ -432,11 +432,8 @@ class MianshiService(BlueFoxServerSystem):
# ============================================================================
def giveItem(self, playerId, itemName, count=1, aux=0):
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId)
except Exception:
pass
""""给玩家物品": 统一走优先级(同类合并->主手->背包->掉落)"""
self.giveItemToPlayer(playerId, itemName, count)
# ============================================================================
# 八、工具方法,消耗物品
@@ -463,7 +460,11 @@ class MianshiService(BlueFoxServerSystem):
# 九、工具方法,以掉落物形式生成物品
# ============================================================================
def dropItem(self, dim, pos, itemName, count=1, aux=0):
def dropItem(self, dim, pos, itemName, count=1, aux=0, playerId=None):
if playerId is not None:
# 任务一: 玩家主动获得 -> 统一优先级(同类合并->主手->背包->掉落)
self.giveItemToPlayer(playerId, itemName, count, pos, dim, aux=aux)
return
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
@@ -52,6 +52,9 @@ from ..siwangshengwu.service.DeadmobGeneratorService import DeadmobGeneratorServ
# ---- 钓鱼掉落: 螃蟹/龙虾(普通逻辑类, 由本分发器转发 PlayerFishingServerEvent) ----
from ..yuanbanfangzhi.service.YuanbanFishing import YuanbanFishingService
# ---- 右键摆动动画(任务二): 服务器广播给该玩家客户端 -> Swing() ----
from ...ModUtil.ServerUtil import PlayAttackToClient
# ---- 乡野自然·水稻: 踩踏耕地等下方方块变化时 清理作物+掉稻谷 ----
from ..ziran.NaturalData import RICE_BLOCKS, RICE_SEED_ITEM, RICE_CROP_ITEM
@@ -358,6 +361,7 @@ class FeatureDispatcher(BlueFoxServerSystem):
args['cancel'] = True
# 记录时间戳(带窗口), 只取消同一右键配套的放置/吃; 过期残留自动放行
self._cancelItemUse[playerId] = time.time()
PlayAttackToClient(playerId) # 任务二: 右键动作播放摆动
print "[FD-BlockUse-DONE]", "player:", playerId, "hand:", _handItem, "block:", blockName, "svc:", service.__class__.__name__, "-> cancel=True, _cancelItemUse=ts"
return
print "[FD-BlockUse-NOMATCH]", "player:", playerId, "hand:", _handItem, "block:", blockName, "-> 无匹配规则, 放行"
@@ -437,6 +441,7 @@ class FeatureDispatcher(BlueFoxServerSystem):
args['ret'] = True
# 时间戳(带窗口): itemUseOn 转换成功后, 同右手的后续 TryUse/放置也取消
self._cancelItemUse[playerId] = time.time()
PlayAttackToClient(playerId) # 任务二: 右键动作播放摆动
return
# ============================================================================
@@ -516,6 +521,7 @@ class FeatureDispatcher(BlueFoxServerSystem):
# 在客户端吞掉, 服务端不再设 _cancelItemUse(否则标记残留会吞掉玩家
# 下一次真实的 ServerItemUseOnEvent, 影响其它操作)。
service.handleTakeoutRequest(playerId, blockName, itemName, dim, (x, y, z))
PlayAttackToClient(playerId) # 任务二: 右键动作播放摆动
return
print "[FD-TakeoutRequest-NO-HANDLER]", blockName
@@ -549,6 +555,7 @@ class FeatureDispatcher(BlueFoxServerSystem):
# 因此不设 _cancelItemUse —— 否则标记残留会吞掉玩家下一次真实的 itemUseOn.
handled = service.handleItemUseOn(useOnArgs)
if handled:
PlayAttackToClient(playerId) # 任务二: 右键动作播放摆动
return
print "[FD-GaifanRequest-NO-HANDLER]", itemName
@@ -585,6 +592,7 @@ class FeatureDispatcher(BlueFoxServerSystem):
if hasattr(service, "handleItemUseOn"):
handled = service.handleItemUseOn(useOnArgs)
if handled:
PlayAttackToClient(playerId) # 任务二: 右键动作播放摆动
return
print "[FD-ItemUseOnRequest-NO-HANDLER]", itemName
@@ -618,6 +626,7 @@ class FeatureDispatcher(BlueFoxServerSystem):
if hasattr(service, "handleBlockUse"):
handled = service.handleBlockUse(useArgs)
if handled:
PlayAttackToClient(playerId) # 任务二: 右键动作播放摆动
return
print "[FD-BlockUseRequest-NO-HANDLER]", blockName
@@ -644,6 +653,7 @@ class FeatureDispatcher(BlueFoxServerSystem):
service = self.tryUseOwner.get(itemName)
if service and service.handleItemTryUse(args):
args['cancel'] = True
PlayAttackToClient(playerId) # 任务二: 手持右键动作播放摆动
# ============================================================================
# 主入口4:计时方块 tick → 按 timerOwner 路由到计时服务(持久化计时)
@@ -225,7 +225,7 @@ class BarbecueService(BlueFoxServerSystem):
# ---- 逆向操作 ----
# 掉落物形式生成(取下整只成品等),优先于 giveItem
if recipe.get("dropItem"):
self.dropItems(dim, pos, recipe["dropItem"])
self.dropItems(dim, pos, recipe["dropItem"], playerId)
elif recipe.get("giveItem"):
self.giveItem(playerId, recipe["giveItem"], recipe.get("giveCount", 1))
@@ -310,17 +310,17 @@ class BarbecueService(BlueFoxServerSystem):
# ============================================================================
def giveItem(self, playerId, itemName, count=1, auxValue=0):
comp.CreateItem(playerId).SpawnItemToPlayerInv(
{"itemName": itemName, "count": count, "auxValue": auxValue}, playerId)
""""给玩家物品": 统一走优先级(同类合并->主手->背包->掉落)"""
self.giveItemToPlayer(playerId, itemName, count, aux=auxValue)
# ============================================================================
# 十、工具方法:以掉落物形式生成物品(取下烤鸡/烤乳猪等)
# ============================================================================
def dropItems(self, dim, pos, dropList):
def dropItems(self, dim, pos, dropList, playerId=None):
"""
dropList 格式:[{"name": "xxx", "count": N}, ...]
在方块上方生成掉落物实体,让它自然掉到地上。
playerId 给出时走统一优先级(任务一: 同类合并->主手->背包->掉落)。
"""
for d in dropList:
itemDict = {
@@ -328,7 +328,11 @@ class BarbecueService(BlueFoxServerSystem):
"count": d.get("count", 1),
"auxValue": d.get("aux", 0),
}
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
if playerId is not None:
self.giveItemToPlayer(playerId, d["name"], d.get("count", 1), pos, dim,
aux=d.get("aux", 0))
else:
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
# ============================================================================
# 十一、工具方法:冷却检查
@@ -245,7 +245,7 @@ class ShicaiService(BlueFoxServerSystem):
else:
# 最后一级再切 -> 掉碎 + 变空气
self.clearBlock(pos, dim)
self.dropItems(dim, pos, [chain["drop"]])
self.dropItems(dim, pos, [chain["drop"]], playerId)
return True
# ============================================================================
@@ -261,7 +261,7 @@ class ShicaiService(BlueFoxServerSystem):
n = self.garlicChop.get(gkey, 0) + 1
if n >= GARLIC_CHOP_COUNT:
self.clearBlock(pos, dim)
self.dropItems(dim, pos, [GARLIC_DROP])
self.dropItems(dim, pos, [GARLIC_DROP], playerId)
self.garlicChop.pop(gkey, None)
else:
self.garlicChop[gkey] = n
@@ -284,7 +284,7 @@ class ShicaiService(BlueFoxServerSystem):
return True
self.consumeItem(playerId, itemDict, need)
self.clearBlock(pos, dim)
self.dropItems(dim, pos, [rule["drop"]])
self.dropItems(dim, pos, [rule["drop"]], playerId)
return True
# ============================================================================
@@ -343,14 +343,19 @@ class ShicaiService(BlueFoxServerSystem):
# 八、工具方法:以掉落物形式生成物品
# ============================================================================
def dropItems(self, dim, pos, dropList):
def dropItems(self, dim, pos, dropList, playerId=None):
for d in dropList:
itemDict = {
"itemName": d["name"],
"count": d.get("count", 1),
"auxValue": d.get("aux", 0),
}
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
if playerId is not None:
# 任务一: 玩家主动获得 -> 统一优先级(同类合并->主手->背包->掉落)
self.giveItemToPlayer(playerId, d["name"], d.get("count", 1), pos, dim,
aux=d.get("aux", 0))
else:
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
# ============================================================================
# 九、工具方法:冷却检查
@@ -156,7 +156,7 @@ class MarketService(BlueFoxServerSystem):
# ---- 取出:掉落物 ----
if recipe.get("dropItem"):
self.dropItems(dim, pos, recipe["dropItem"])
self.dropItems(dim, pos, recipe["dropItem"], playerId)
# ---- 替换方块 ----
if recipe.get("target"):
@@ -232,10 +232,10 @@ class MarketService(BlueFoxServerSystem):
# 八、工具方法:以掉落物形式生成物品(取出)
# ============================================================================
def dropItems(self, dim, pos, dropList):
def dropItems(self, dim, pos, dropList, playerId=None):
"""
dropList 格式:[{"name": "xxx", "count": N}, ...]
在方块上方生成掉落物实体, 让它自然掉到地上。
playerId 给出时走统一优先级(任务一: 同类合并->主手->背包->掉落)。
"""
for d in dropList:
itemDict = {
@@ -243,7 +243,11 @@ class MarketService(BlueFoxServerSystem):
"count": d.get("count", 1),
"auxValue": d.get("aux", 0),
}
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
if playerId is not None:
self.giveItemToPlayer(playerId, d["name"], d.get("count", 1), pos, dim,
aux=d.get("aux", 0))
else:
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
# ============================================================================
# 九、工具方法:冷却检查
@@ -26,6 +26,9 @@ comp = serverApi.GetEngineCompFactory() # 组件工厂
from ....BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxServerSystem
from ..ShiyongfoodData import EAT_RULE_MAP, TRY_USE_RULES
# ---- 吃的声音 random.eat(任务三) ----
from ....ModUtil.ServerUtil import PlaySoundToAllClient
class ShiyongfoodService(BlueFoxServerSystem):
"""总食用服务: 所有成品右键吃(方块吃 + 手持物品直接吃)"""
@@ -85,11 +88,14 @@ class ShiyongfoodService(BlueFoxServerSystem):
# 方块转换成下一级(半份/下一份)
self._replaceBlock(playerId, pos, dim, target)
else:
# 完全消耗消失 + 掉落容器
self._clearBlock(playerId, pos, dim)
# 任务三: 不再掉落容器, 而是把容器(脏盘子/木碗/玻璃杯/支杆)原地留在方块位置
drop = rule.get("drop")
if drop:
self.dropItem(dim, pos, drop)
self._replaceBlock(playerId, pos, dim, drop)
else:
self._clearBlock(playerId, pos, dim)
# 吃的声音(任务三)
PlaySoundToAllClient((pos[0], pos[1], pos[2], dim), "random.eat", 1.0)
return True
# ====================================================================
@@ -133,6 +139,13 @@ class ShiyongfoodService(BlueFoxServerSystem):
"auxValue": itemDict.get("newAuxValue", 0),
"userData": itemDict.get("userData", {})})
self._applyFood(playerId, rule.get("hunger", 0), rule.get("effects", []))
# 吃的声音(任务三, 手持吃)
try:
_fp = comp.CreatePos(playerId).GetFootPos()
_fd = comp.CreateDimension(playerId).GetEntityDimensionId()
PlaySoundToAllClient((_fp[0], _fp[1], _fp[2], _fd), "random.eat", 1.0)
except Exception:
pass
return True
# ============================================================================
@@ -134,7 +134,7 @@ class ShoubanService(BlueFoxServerSystem):
# 盒子变为"开过"
self.replaceBlock(pos, dim, BLIND_BOX_TARGET, playerId)
# 掉落手办
self.dropItems(dim, pos, [{"name": fig, "count": 1}])
self.dropItems(dim, pos, [{"name": fig, "count": 1}], playerId)
# 提示开出内容
name = FIGURINE_NAMES.get(fig, "手办")
@@ -174,10 +174,10 @@ class ShoubanService(BlueFoxServerSystem):
# 五、工具方法:以掉落物形式生成物品(开出/取下等)
# ============================================================================
def dropItems(self, dim, pos, dropList):
def dropItems(self, dim, pos, dropList, playerId=None):
"""
dropList 格式:[{"name": "xxx", "count": N}, ...]
在方块上方生成掉落物实体, 让它自然掉到地上。
playerId 给出时走统一优先级(任务一: 同类合并->主手->背包->掉落)。
"""
for d in dropList:
itemDict = {
@@ -185,7 +185,11 @@ class ShoubanService(BlueFoxServerSystem):
"count": d.get("count", 1),
"auxValue": d.get("aux", 0),
}
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
if playerId is not None:
self.giveItemToPlayer(playerId, d["name"], d.get("count", 1), pos, dim,
aux=d.get("aux", 0))
else:
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
# ============================================================================
# 六、工具方法:冷却检查
@@ -270,7 +270,7 @@ class ShousiService(BlueFoxServerSystem):
self.replaceBlock(pos, dim, recipe["target"], playerId)
# 递减取走: 以掉落物形式返还卷寿司
if recipe.get("drop"):
self.dropItem(dim, pos, recipe["drop"])
self.dropItem(dim, pos, recipe["drop"], playerId=playerId)
# ============================================================================
# 四、切块(手持菜刀右键卷寿司两次 -> 寿司块(三个))
@@ -301,7 +301,11 @@ class ShousiService(BlueFoxServerSystem):
# 六、工具方法:以掉落物形式生成物品(递减取走返还)
# ============================================================================
def dropItem(self, dim, pos, itemName, count=1, aux=0):
def dropItem(self, dim, pos, itemName, count=1, aux=0, playerId=None):
if playerId is not None:
# 任务一: 玩家主动获得 -> 统一优先级(同类合并->主手->背包->掉落)
self.giveItemToPlayer(playerId, itemName, count, pos, dim, aux=aux)
return
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
@@ -316,11 +316,8 @@ class TangguoService(BlueFoxServerSystem):
# ============================================================================
def giveItem(self, playerId, itemName, count=1, aux=0):
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId)
except Exception:
pass
""""给玩家物品": 统一走优先级(同类合并->主手->背包->掉落)"""
self.giveItemToPlayer(playerId, itemName, count)
# ============================================================================
# 五、工具方法,消耗物品
@@ -351,24 +348,11 @@ class TangguoService(BlueFoxServerSystem):
"""取成品/返容器: playerId 给出时【优先入包】—— 主手空->放主手;
否则入背包(同类叠加/空位); 背包满(返回False)->落回地面掉落物。
不传 playerId(无玩家上下文, 如破坏掉落) 保持原掉落物, 零影响。"""
if playerId is not None:
self.giveItemToPlayer(playerId, itemName, count, pos, dim)
return
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
if playerId is not None:
# 1) 主手空 -> 放主手
cur = self.getCarriedItem(playerId)
handItem = (cur or {}).get("newItemName")
if not handItem or handItem == "minecraft:air":
try:
if comp.CreateItem(playerId).SpawnItemToPlayerCarried(itemDict, playerId):
return
except Exception:
pass
# 2) 否则入包(同类叠加/空位); 失败(满)->掉落
try:
if comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId):
return
except Exception:
pass
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
except Exception:
pass
@@ -204,7 +204,7 @@ class YinliaoService(BlueFoxServerSystem):
return False # 无水果记录(创造直接放置的完成态) → 不反应
juiceBlock, juiceName = juiceInfo
self.consumeItem(playerId, itemDict, 1) # 消耗玻璃杯(果汁成品自带杯)
self.dropItems(dim, pos, [{"name": juiceBlock, "count": 1}])
self.dropItems(dim, pos, [{"name": juiceBlock, "count": 1}], playerId)
self.replaceBlock(pos, dim, "rtdd:juicer", playerId) # 还原空, 记录随方块清除
return True
@@ -254,7 +254,7 @@ class YinliaoService(BlueFoxServerSystem):
if not self.checkCooldown(key, 0.5):
return True
_fruit, popsicle, flavor = info
self.dropItems(dim, pos, [{"name": popsicle, "count": 2}])
self.dropItems(dim, pos, [{"name": popsicle, "count": 2}], playerId)
self.replaceBlock(pos, dim, "rtdd:icelollybox_1", playerId) # 还原未定型
return True
@@ -296,7 +296,7 @@ class YinliaoService(BlueFoxServerSystem):
return False
if not self.checkCooldown(key, 0.5):
return True
self.dropItems(dim, pos, [{"name": icecream, "count": 1}])
self.dropItems(dim, pos, [{"name": icecream, "count": 1}], playerId)
self.replaceBlock(pos, dim, "rtdd:frytheicebox", playerId) # 还原空
return True
@@ -333,7 +333,7 @@ class YinliaoService(BlueFoxServerSystem):
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.dropItems(dim, pos, [{"name": POPSICLE_SINGLE_MELON, "count": 1}], playerId)
self.replaceBlock(pos, dim, POPSICLE_SINGLE_ORANGE, playerId)
return True
return False
@@ -344,7 +344,7 @@ class YinliaoService(BlueFoxServerSystem):
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.dropItems(dim, pos, [{"name": POPSICLE_PILE_ADD, "count": 1}], playerId)
self.replaceBlock(pos, dim, POPSICLE_PILE_2, playerId)
return True
return False
@@ -441,10 +441,10 @@ class YinliaoService(BlueFoxServerSystem):
# 十、工具方法:以掉落物形式生成物品(取果汁/冰棍/冰沙)
# ============================================================================
def dropItems(self, dim, pos, dropList):
def dropItems(self, dim, pos, dropList, playerId=None):
"""
dropList 格式:[{"name": "xxx", "count": N}, ...]
在方块上方生成掉落物实体, 让它自然掉到地上。
playerId 给出时走统一优先级(任务一: 同类合并->主手->背包->掉落)。
"""
for d in dropList:
itemDict = {
@@ -452,7 +452,11 @@ class YinliaoService(BlueFoxServerSystem):
"count": d.get("count", 1),
"auxValue": d.get("aux", 0),
}
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
if playerId is not None:
self.giveItemToPlayer(playerId, d["name"], d.get("count", 1), pos, dim,
aux=d.get("aux", 0))
else:
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
# ============================================================================
# 十一、工具方法:冷却检查
@@ -277,11 +277,8 @@ class YouguoService(BlueFoxServerSystem):
# ============================================================================
def giveItem(self, playerId, itemName, count=1, aux=0):
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId)
except Exception:
pass
""""给玩家物品": 统一走优先级(同类合并->主手->背包->掉落)"""
self.giveItemToPlayer(playerId, itemName, count)
# ============================================================================
# 六、工具方法,消耗物品
@@ -312,24 +309,11 @@ class YouguoService(BlueFoxServerSystem):
"""取成品/返容器: playerId 给出时【优先入包】—— 主手空->放主手;
否则入背包(同类叠加/空位); 背包满(返回False)->落回地面掉落物。
不传 playerId(无玩家上下文, 如破坏掉落) 保持原掉落物, 零影响。"""
if playerId is not None:
self.giveItemToPlayer(playerId, itemName, count, pos, dim)
return
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
if playerId is not None:
# 1) 主手空 -> 放主手
cur = self.getCarriedItem(playerId)
handItem = (cur or {}).get("newItemName")
if not handItem or handItem == "minecraft:air":
try:
if comp.CreateItem(playerId).SpawnItemToPlayerCarried(itemDict, playerId):
return
except Exception:
pass
# 2) 否则入包(同类叠加/空位); 失败(满)->掉落
try:
if comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId):
return
except Exception:
pass
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
except Exception:
pass
@@ -207,11 +207,8 @@ class NaturalService(BlueFoxServerSystem):
# ============================================================================
def giveItem(self, playerId, itemName, count=1, aux=0):
try:
itemDict = {"itemName": itemName, "count": count, "auxValue": aux}
comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId)
except Exception:
pass
""""给玩家物品": 统一走优先级(同类合并->主手->背包->掉落)"""
self.giveItemToPlayer(playerId, itemName, count, aux=aux)
# ============================================================================
# 六、工具方法:消耗物品
@@ -3,8 +3,8 @@
"minecraft:block": {
"description": {
"identifier": "rtdd:fruitjuice_0",
"register_to_creative_menu": false,
"category": "xy_drink"
"register_to_creative_menu": true,
"category": "xy_kitchenware"
},
"components": {
"netease:aabb": {
@@ -3,8 +3,8 @@
"minecraft:block": {
"description": {
"identifier": "rtdd:frytheicebox",
"register_to_creative_menu": false,
"category": "xy_drink"
"register_to_creative_menu": true,
"category": "xy_kitchenware"
},
"components": {
"netease:aabb": {
@@ -3,8 +3,8 @@
"minecraft:block": {
"description": {
"identifier": "rtdd:icelollybox_1",
"register_to_creative_menu": false,
"category": "xy_drink"
"register_to_creative_menu": true,
"category": "xy_kitchenware"
},
"components": {
"netease:aabb": {
@@ -3,8 +3,8 @@
"minecraft:block": {
"description": {
"identifier": "rtdd:juicer",
"register_to_creative_menu": false,
"category": "xy_drink"
"register_to_creative_menu": true,
"category": "xy_kitchenware"
},
"components": {
"netease:aabb": {
@@ -22,12 +22,20 @@
"item": "minecraft:stick",
"data": 0
},
"7": {
"8": {
"item": "minecraft:stick",
"data": 0
},
"8": {
"item": "minecraft:stick",
"1": {
"item": "rtdd:b_34",
"data": 0
},
"4": {
"item": "rtdd:b_34",
"data": 0
},
"7": {
"item": "rtdd:b_34",
"data": 0
}
},
@@ -35,9 +43,9 @@
"identifier": "rtdd:xy_b_57"
},
"pattern": [
"0 2",
"3 5",
"678"
"010",
"343",
"636"
],
"result": {
"data": 0,
+53 -53
View File
@@ -5,7 +5,7 @@ tile.rtdd:juicer_4.name=榨汁机(完成)
tile.rtdd:chickencoop_4.name=鸡窝_5(4蛋)
tile.rtdd:juicer_3.name=榨汁机(榨汁中3)
tile.rtdd:juicer_2.name=榨汁机(榨汁中2)
tile.rtdd:trayracks_1.name=盘子架_1(空)
tile.rtdd:trayracks_1.name=盘子架
tile.rtdd:chickencoop_1.name=鸡窝_2(1蛋)
tile.rtdd:chickencoop_0.name=鸡窝_1(0蛋)
tile.rtdd:trayracks_3.name=盘子架_3(俩个)
@@ -54,7 +54,7 @@ tile.rtdd:manger_1.name=饲料槽_4(少量小麦)
tile.rtdd:manger_0.name=饲料槽_1(空)
tile.rtdd:b_3.name=鲑鱼架_禁用
tile.rtdd:peachbarrel.name=货桶(桃子)
tile.rtdd:peachbarrel.name=桃子货桶
tile.rtdd:b_4.name=摊位台
tile.rtdd:carrotlegoflamb.name=炒锅_13(胡萝卜羊腿_生)
@@ -173,7 +173,7 @@ tile.rtdd:plate_19.name=辣炒兔肉(全份)
tile.rtdd:plate_10.name=胡萝卜炒羊里脊(全份)
tile.rtdd:dead_villagera.name=烤村民
tile.rtdd:vegetablesstew_2.name=汤锅_110(蔬菜乱炖_八分熟)
tile.rtdd:fishingnet.name=网(渔网)
tile.rtdd:fishingnet.name=渔网
tile.rtdd:vegetablesstew_1.name=汤锅_109(蔬菜乱炖_四分熟)
tile.rtdd:plate_13.name=胡萝卜炒猪排骨(全份)
tile.rtdd:plate_14.name=炒土豆
@@ -181,13 +181,13 @@ tile.rtdd:vegetablesstew_3.name=汤锅_111(蔬菜乱炖_熟)
tile.rtdd:plate_11.name=胡萝卜炒羊排
tile.rtdd:plate_12.name=小炒五花肉(全份)
tile.rtdd:cookingpotato.name=炒锅_47(炒土豆_生)
tile.rtdd:orangebox.name=售卖盒(橘子)
tile.rtdd:orangebox.name=橙子售卖盒
tile.rtdd:bowlaeggcodsoup.name=蛋花鳕鱼汤
tile.rtdd:hot_water_bucket.name=热水
tile.rtdd:wok.name=炒锅(空)
tile.rtdd:stewedsoup.name=汤锅(空锅)
tile.rtdd:wok.name=炒锅
tile.rtdd:stewedsoup.name=汤锅
tile.rtdd:mushroom_fried_chicken_1.name=炒锅_68(香菇滑鸡_生)
tile.rtdd:fishmonsushi_6.name=热带鱼寿司块(三个)
tile.rtdd:roastpignew_5.name=烤乳猪(2/6只)
@@ -202,7 +202,7 @@ tile.rtdd:sunshade_cloth_yellow.name=淡黄色遮阳布
tile.rtdd:sunshade_cloth_lime.name=深绿色遮阳布
tile.rtdd:brown_norieggsoup.name=瘦肉蛋花汤
tile.rtdd:sales_box_cod.name=售卖盒(鳕鱼盒)
tile.rtdd:sales_box_cod.name=鳕鱼售卖盒
tile.rtdd:cookingmeat.name=炒锅_44(炒碎肉_生)
tile.rtdd:plate_40a.name=章鱼小丸子_半份
tile.rtdd:bread_2b.name=吐司3(3份)
@@ -244,7 +244,7 @@ tile.rtdd:b_102.name=烟囱
tile.rtdd:carrotandbeef.name=炒锅_1(黑椒牛排_生)
tile.rtdd:b_103.name=烟道
tile.rtdd:cod_pile.name=鳕鱼堆
tile.rtdd:b_108.name=古式唱片机(无碟)
tile.rtdd:b_108.name=古式唱片机
tile.rtdd:balance.name=天平
tile.rtdd:b_109.name=古式唱片机(有碟)
tile.rtdd:plate_53.name=胡萝卜炒猪肉
@@ -291,7 +291,7 @@ tile.rtdd:lotion_1.name=药水架_2(药水_一瓶)
tile.rtdd:lotion_2.name=药水架_3(药水_两瓶)
tile.rtdd:rollingpin.name=擀面杖
tile.rtdd:plate_24.name=炒碎肉
tile.rtdd:lotion_0.name=药水架_1(药水_空)
tile.rtdd:lotion_0.name=药水架
tile.rtdd:wheel.name=车轮
tile.rtdd:plate_25.name=煎鲑鱼
@@ -312,7 +312,7 @@ tile.rtdd:coverthepan.name=炒锅(盖锅)
tile.rtdd:plate_1a.name=清炒猪排(半份)
tile.rtdd:cookedanymeat.name=炒锅_16(小炒鸡肉_熟)
tile.rtdd:plate_39.name=盘装炸鱼
tile.rtdd:cabinet.name=橱柜(盘子+调料瓶)
tile.rtdd:cabinet.name=餐具橱柜
tile.rtdd:cake_2a.name=浆果蛋糕(3/4块)
tile.rtdd:plate_37.name=炸薯条
tile.rtdd:plate_38.name=盘装鸡块
@@ -357,9 +357,9 @@ tile.rtdd:peach_popsicleplace.name=桃子冰棍
tile.rtdd:roastpig_1.name=烤乳猪(熟)
tile.rtdd:fishtank.name=鱼缸_禁用
tile.rtdd:carrotandpotatosoup.name=汤锅_8(胡萝卜土豆汤)
tile.rtdd:bountypaper_2.name=悬赏纸_2
tile.rtdd:bountypaper_2.name=悬赏纸
tile.rtdd:bountypaper_1.name=悬赏纸_1
tile.rtdd:bountypaper_1.name=公告
tile.rtdd:plate_33a.name=炒蟹(半份)
tile.rtdd:vegetableleanbroth_3.name=汤锅_105(蔬菜瘦肉汤_熟)
tile.rtdd:vegetableleanbroth_2.name=汤锅_104(蔬菜瘦肉汤_八分熟)
@@ -403,7 +403,7 @@ tile.rtdd:b_127.name=地图台
tile.rtdd:cooking_pepper.name=炒锅_19(炒胡萝卜_熟)
tile.rtdd:noodle_soup.name=熟面条
tile.rtdd:sales_box_carrot.name=售卖盒(胡萝卜)
tile.rtdd:sales_box_carrot.name=胡萝卜售卖盒
tile.rtdd:apple_fruit_1.name=苹果(形态1)_自然
tile.rtdd:apple_fruit_3.name=苹果(形态2)_自然
@@ -426,18 +426,18 @@ tile.rtdd:bookcase_4.name=书柜_10(9本)
tile.rtdd:egg_pile.name=鸡蛋堆
tile.rtdd:bookcase_3.name=书柜_12(11本)
tile.rtdd:sellingboxes.name=售卖盒
tile.rtdd:flag_red_orange_oblique.name=红橙旗子(斜向)
tile.rtdd:flag_red_orange_oblique.name=斜向红橙旗子
tile.rtdd:plate_12a.name=小炒五花肉(半份)
tile.rtdd:cupboard_2.name=碗柜(两个碗)
tile.rtdd:cupboard_3.name=碗柜(三个碗)
tile.rtdd:cupboard_0.name=碗柜(空)
tile.rtdd:cupboard_0.name=碗柜
tile.rtdd:cupboard_1.name=碗柜(一个碗)
tile.rtdd:squid_sushi.name=手握鱿鱼寿司(一个)
tile.rtdd:fishsushicubes_2.name=热带鱼寿司块(两个)
tile.rtdd:fishsushicubes_1.name=热带鱼寿司块(一个)
tile.rtdd:bamboo_7.name=蒸笼(竹筒饭_熟)
tile.rtdd:bamboo_6.name=蒸笼(竹筒饭_生)
tile.rtdd:bountypaper.name=农贸清单(悬赏纸)
tile.rtdd:bountypaper.name=农贸清单
tile.rtdd:bamboo_5.name=熟竹筒饭
tile.rtdd:bamboo_4.name=竹筒(加入肉)
tile.rtdd:nigirisushisalnom_2.name=手握鲑鱼寿司(两个)
@@ -554,7 +554,7 @@ tile.rtdd:nigirisushicod_3.name=手握鳕鱼寿司(三个)
tile.rtdd:spicy_fish_0.name=炒锅_90(辣炒鲑鱼_生)
tile.rtdd:spicy_fish_1.name=炒锅_91(辣炒鲑鱼_熟)
tile.rtdd:plate_19a.name=辣炒兔肉(半份)
tile.rtdd:wine_barrel.name=酒桶!
tile.rtdd:wine_barrel.name=酒桶
tile.rtdd:cookingsheeploin.name=炒锅_52(胡萝卜炒羊里脊_生)
tile.rtdd:cow_3.name=挂肉钩(牛_去肉)
tile.rtdd:cow_2.name=挂肉钩(牛_去四肢)
@@ -587,7 +587,7 @@ tile.rtdd:beater_custard_2.name=搅拌器(蛋_3)
tile.rtdd:beater_custard_1.name=搅拌器(蛋_2)
tile.rtdd:beater_custard_0.name=搅拌器(蛋_1)
tile.rtdd:medicinetank.name=玻璃罐
tile.rtdd:storage_buckets.name=垃圾桶(关闭)
tile.rtdd:storage_buckets.name=垃圾桶
tile.rtdd:jewelrybox_1.name=盲盒(开过)
tile.rtdd:jewelrybox_0.name=盲盒
tile.rtdd:oilpotporkchop.name=油锅(禁用)
@@ -595,7 +595,7 @@ tile.rtdd:rubbish_bin_2.name=垃圾桶(打开)
tile.rtdd:peachpile.name=土豆堆_3(桃子堆)_禁用
tile.rtdd:vegetableleanbroth.name=汤锅_102(蔬菜瘦肉汤_生)
tile.rtdd:warehousebox.name=Warehousebox(仓库箱)
tile.rtdd:oilpot_0.name=油锅(空锅)
tile.rtdd:oilpot_0.name=油锅
tile.rtdd:baozilong_2.name=蒸笼(包子_熟)
tile.rtdd:baozilong_1.name=蒸笼(包子_生)
tile.rtdd:appleicebox.name=炒冰盒_1(苹果炒冰盒)
@@ -609,7 +609,7 @@ tile.rtdd:killcod_0.name=死鳕鱼
tile.rtdd:killcod_1.name=死鳕鱼(切一刀)
tile.rtdd:killcod_2.name=死鳕鱼(切两刀)
tile.rtdd:lambstew_2.name=汤锅_52(土豆胡萝卜炖羊肉_八分熟)
tile.rtdd:sales_box_bread.name=售卖盒(面包)
tile.rtdd:sales_box_bread.name=面包售卖盒
tile.rtdd:lambstew_1.name=汤锅_51(土豆胡萝卜炖羊肉_四分熟)
tile.rtdd:mug.name=酒杯_10(酒杯)
tile.rtdd:lambstew_3.name=汤锅_53(土豆胡萝卜炖羊肉_熟)
@@ -632,8 +632,8 @@ tile.rtdd:roujiamo_1.name=馍(切开)
tile.rtdd:carrotbeefsoup_2.name=汤锅_11(胡萝卜牛肉汤_八分熟)
tile.rtdd:carrotbeefsoup_3.name=汤锅_12(胡萝卜牛肉汤_熟)
tile.rtdd:bowlofmushroomsoup.name=蘑菇炖鸡
tile.rtdd:cabinet_1.name=橱柜(仅调料瓶)
tile.rtdd:peachbox.name=售卖盒(桃子)
tile.rtdd:cabinet_1.name=调料瓶橱柜
tile.rtdd:peachbox.name=桃子售卖盒
tile.rtdd:bowlofrice.name=米饭_1(熟米饭_形态1)
tile.rtdd:bowlabeefbonebroth.name=胡萝卜土豆牛骨汤
tile.rtdd:carrotandbeef_1.name=炒锅_2(黑椒牛排_熟)
@@ -644,24 +644,24 @@ tile.rtdd:dead_squid_1.name=死鱿鱼(切掉鱿鱼须)
tile.rtdd:cookedeggsoup.name=汤锅_32(煮鸡蛋_熟)
tile.rtdd:oven.name=烤炉
tile.rtdd:ingotpile.name=铁锭堆_禁用
tile.rtdd:sales_box_pumpkin.name=售卖盒(南瓜)
tile.rtdd:sales_box_pumpkin.name=南瓜售卖盒
tile.rtdd:carrotribs_3.name=汤锅_24(胡萝卜排骨汤_熟)
tile.rtdd:mushroomnoodles.name=香菇面
tile.rtdd:carrotribs_1.name=汤锅_22(胡萝卜排骨汤_四分熟)
tile.rtdd:carrotribs_2.name=汤锅_23(胡萝卜排骨汤_八分熟)
tile.rtdd:menus.name=餐牌(菜单)
tile.rtdd:menus.name=餐牌
tile.rtdd:carrotandmutton_1.name=炒锅_8(清炒羊肉_熟)
tile.rtdd:stonemill.name=石磨
tile.rtdd:cloth_red.name=淡红色布料
tile.rtdd:meathook.name=挂肉钩(空钩)
tile.rtdd:meathook.name=挂肉钩
tile.rtdd:meathookcoddry.name=鳕鱼干挂肉钩(两条)
tile.rtdd:woodenbox_0.name=条箱
tile.rtdd:woodenbox_3.name=条箱(土豆)
tile.rtdd:woodenbox_3.name=土豆条箱
tile.rtdd:tent.name=帐篷_1(帐篷)禁用
tile.rtdd:woodenbox_4.name=条箱(桃子)
tile.rtdd:woodenbox_4.name=桃子条箱
tile.rtdd:steamermilkandegg.name=蒸笼(蒸牛奶鸡蛋_生)_禁用
tile.rtdd:woodenbox_1.name=条箱(苹果)
tile.rtdd:woodenbox_2.name=条箱(胡萝卜)
tile.rtdd:woodenbox_1.name=苹果条箱
tile.rtdd:woodenbox_2.name=胡萝卜条箱
tile.rtdd:breaddough_4d.name=甜甜圈胚(生)
tile.rtdd:chickenstewwithmushrooms_3.name=汤锅_29(蘑菇炖鸡_熟)
tile.rtdd:chickenstewwithmushrooms_1.name=汤锅_27(蘑菇炖鸡_四分熟)
@@ -738,7 +738,7 @@ tile.rtdd:cakebatterblock_0.name=蛋糕面糊(生)
tile.rtdd:salmonsushi_1.name=鲑鱼寿司(加鲑鱼)
tile.rtdd:soybeanseedling_0.name=豆苗_1(豆苗_0)
tile.rtdd:soybeanseedling_1.name=豆苗_2(豆苗_1)
tile.rtdd:barbecuegrill_0.name=烧烤架_1(烧烤架无火)
tile.rtdd:barbecuegrill_0.name=烧烤架
tile.rtdd:codsushi_1.name=鳕鱼寿司(加鳕鱼)
tile.rtdd:cookingscallions.name=炒锅_51(葱花锅底)
tile.rtdd:codsushi_6.name=鳕鱼寿司块(三个)
@@ -747,10 +747,10 @@ tile.rtdd:codsushi_5.name=鳕鱼寿司(卷_4)
tile.rtdd:barbecuegrill_1.name=烧烤架_2(烧烤架点燃)
tile.rtdd:codsushi_2.name=鳕鱼寿司(卷_1)
tile.rtdd:codsushi_3.name=鳕鱼寿司(卷_2)
tile.rtdd:fishbucket_1.name=货桶(鳕鱼)
tile.rtdd:fishbucket_1.name=鳕鱼货桶
tile.rtdd:fishbucket_0.name=货桶
tile.rtdd:salmon_pile.name=鲑鱼堆
tile.rtdd:carrotbarrel.name=货桶(胡萝卜)
tile.rtdd:carrotbarrel.name=胡萝卜货桶
tile.rtdd:bread_1.name=法棍
tile.rtdd:meathookcod_2.name=鳕鱼挂肉钩(两条)
tile.rtdd:meathookcod_1.name=鳕鱼挂肉钩(一条)
@@ -759,7 +759,7 @@ tile.rtdd:roujiamosoup_1.name=汤锅_78(羊肉泡馍汤_熟)
tile.rtdd:bandage_2.name=绷带
tile.rtdd:orange_leaves.name=橘树树叶
tile.rtdd:potatobarrel.name=货桶(土豆)
tile.rtdd:potatobarrel.name=土豆货桶
tile.rtdd:pepperplant_3.name=辣椒(辣椒_3)
tile.rtdd:pepperplant_1.name=辣椒苗_1(辣椒_1)
tile.rtdd:pepperplant_2.name=辣椒苗_2(辣椒_2)
@@ -782,7 +782,7 @@ tile.rtdd:statueofadeity.name=神像
tile.rtdd:popsiclepile_3.name=冰棍堆2(橙子+西瓜+苹果)
tile.rtdd:popsiclepile_2.name=冰棍堆(橙子+西瓜)
tile.rtdd:b_225.name=浴缸_1
tile.rtdd:fishbucket_2.name=货桶(鲑鱼)
tile.rtdd:fishbucket_2.name=鲑鱼货桶
tile.rtdd:bowlacarrotribs.name=胡萝卜排骨汤
tile.rtdd:squidwhiskersincooking_0.name=炒锅_92(炒鱿鱼须_生)
tile.rtdd:ricepot_1.name=汤锅_74(熟米饭_形态1)
@@ -794,12 +794,12 @@ tile.rtdd:cookingpotato_1.name=炒锅_48(炒土豆_熟)
tile.rtdd:browncarrotfishsoupsoup.name=胡萝卜鲑鱼汤
tile.rtdd:dough_1.name=生面团(擀面_1)
tile.rtdd:dough_0.name=生面团(发酵后)
tile.rtdd:dough_0.name=发酵后的生面团
tile.rtdd:plate_30a.name=美味饺子(全份)盘装
tile.rtdd:cloth_orange.name=橙色布料
tile.rtdd:fried_porkwith_carrots.name=炒锅_63(胡萝卜炒猪肉_生)
tile.rtdd:sales_box_potato.name=售卖盒(土豆)
tile.rtdd:sales_box_potato.name=土豆售卖盒
tile.rtdd:roasted_vegetables_1.name=烤蔬菜串(半熟)
tile.rtdd:carrotfishsoup_1.name=汤锅_18(胡萝卜鲑鱼汤_三分熟)
tile.rtdd:roasted_vegetables_0.name=烤蔬菜串(生)
@@ -837,7 +837,7 @@ tile.rtdd:pig_2.name=挂肉钩(猪_去四肢)
tile.rtdd:pig_1.name=挂肉钩(猪_去皮)
tile.rtdd:pig_0.name=挂肉钩(整只猪)
tile.rtdd:arrowbarrel_1.name=箭桶_1(箭桶有箭)
tile.rtdd:arrowbarrel_0.name=箭桶_0(箭桶无箭)
tile.rtdd:arrowbarrel_0.name=箭桶
tile.rtdd:cutvegetable_3.name=切青菜(切三刀)
tile.rtdd:cutvegetable_2.name=切青菜(切两刀)
tile.rtdd:cutvegetable_1.name=切青菜(切一刀)
@@ -874,10 +874,10 @@ tile.rtdd:vegetablefishsoup_3.name=汤锅_97(蔬菜鱼片汤_熟)
tile.rtdd:melon_popsicleplace.name=西瓜冰棍
tile.rtdd:plate_46a.name=鸡肉番茄意面(半份)
tile.rtdd:b_241.name=深绿色布料
tile.rtdd:firewood.name=柴火_1(柴火)
tile.rtdd:firewood.name=柴火
tile.rtdd:flume_2.name=水槽_3(水槽_一个脏盘子)
tile.rtdd:flume_1.name=水槽_2(水槽_满水)
tile.rtdd:flume_0.name=水槽_1(水槽_空)
tile.rtdd:flume_0.name=水槽
tile.rtdd:flume_5.name=水槽_6(水槽_四个脏盘子)
tile.rtdd:flume_4.name=水槽_5(水槽_三个脏盘子)
tile.rtdd:cookingsheeprack_1.name=炒锅_55(胡萝卜炒羊排_熟)
@@ -965,7 +965,7 @@ tile.rtdd:b_40.name=胡萝卜堆
tile.rtdd:goldingotpile.name=金锭堆_禁用
tile.rtdd:bookcase.name=书柜_1(空)
tile.rtdd:bookcase.name=书柜
tile.rtdd:cookingbeeftenderloin1.name=炒锅_24(胡萝卜牛里脊_熟)
tile.rtdd:red_mushroomsoup.name=汤锅_73(红蘑菇汤)
tile.rtdd:carrotandsalmon.name=炒锅_11(胡萝卜鲑鱼_生)
@@ -988,9 +988,9 @@ tile.rtdd:lambstew.name=汤锅_50(土豆胡萝卜炖羊肉_生)
tile.rtdd:deadsquida.name=死鱿鱼
tile.rtdd:friedchicken.name=炒锅_66(小炒鸡肉_半熟)
itemGroup.tabrfood=乡野-市场与农业
tile.rtdd:woodenbox_7.name=条箱(鲑鱼)
tile.rtdd:woodenbox_5.name=条箱(橘子)
tile.rtdd:woodenbox_6.name=条箱(鳕鱼)
tile.rtdd:woodenbox_7.name=鲑鱼条箱
tile.rtdd:woodenbox_5.name=橙子条箱
tile.rtdd:woodenbox_6.name=鳕鱼条箱
tile.rtdd:plate_2.name=黑椒牛排(全份)
tile.rtdd:plate_3.name=清炒羊肉
tile.rtdd:plate_0.name=盘子
@@ -1003,7 +1003,7 @@ tile.rtdd:carrotbeefsoup.name=汤锅_9(胡萝卜牛肉汤_生)
tile.rtdd:applebox.name=货桶(苹果)
tile.rtdd:applebox.name=苹果货桶
tile.rtdd:kitchenwarerackb_2.name=厨具架(双锅勺)
tile.rtdd:kitchenwarerackb_1.name=厨具架(单锅勺)
tile.rtdd:plate_6.name=胡萝卜牛排骨
@@ -1019,12 +1019,12 @@ tile.rtdd:b_68.name=吊锅_14
tile.rtdd:b_67.name=吊锅_13
tile.rtdd:plate_8.name=胡萝卜牛里脊
tile.rtdd:plate_9.name=胡萝卜羊腿(全份)
tile.rtdd:flag_brown_blue.name=橙蓝旗子(正向)
tile.rtdd:sales_box_apple.name=售卖盒(苹果)
tile.rtdd:flag_brown_blue.name=正向橙蓝旗子
tile.rtdd:sales_box_apple.name=苹果售卖盒
tile.rtdd:cloth_blue.name=淡蓝色布料
tile.rtdd:sales_box_watermelon.name=售卖盒(西瓜)
tile.rtdd:sales_box_watermelon.name=西瓜售卖盒
tile.rtdd:rawnoodlesoup.name=汤锅_65(生面汤)
tile.rtdd:stove.name=炉灶(空)
tile.rtdd:stove.name=炉灶
tile.rtdd:b_16.name=土豆盒_1_禁用
tile.rtdd:b_15.name=木条
@@ -1039,7 +1039,7 @@ tile.rtdd:norieggsoup_3.name=汤锅_59(瘦肉蛋花汤_熟)
tile.rtdd:norieggsoup_2.name=汤锅_58(瘦肉蛋花汤_全熟)
tile.rtdd:cookingcookedporkloin_1.name=炒锅_31(小炒五花肉_熟)
tile.rtdd:b_31.name=稻草人1
tile.rtdd:b_30.name=售卖盒(鲑鱼)
tile.rtdd:b_30.name=鲑鱼售卖盒
tile.rtdd:cookingdought.name=炒锅_38(煎面饼_生)_禁用
tile.rtdd:b_35.name=双人床
@@ -1047,12 +1047,12 @@ tile.rtdd:b_34.name=支杆
tile.rtdd:cream_caramel.name=焦糖布丁
tile.rtdd:creampastry_0.name=舒芙蕾半成品
tile.rtdd:carrotandporkchop_1.name=炒锅_10(清炒猪排_熟)
tile.rtdd:flag.name=黄绿旗子(正向)
tile.rtdd:flag.name=正向黄绿旗子
tile.rtdd:raweggsoup.name=汤锅_62(煮鸡蛋_生)
tile.rtdd:icelollybox_2.name=冰棍盒(冰棍定型)
tile.rtdd:kitchenwarerackd_4.name=厨具架(菜刀+锅勺)
tile.rtdd:flag_blue_lime_oblique.name=蓝绿旗子(斜向)
tile.rtdd:flag_blue_lime_oblique.name=斜向蓝绿旗子
tile.rtdd:kitchenwarerackd_3.name=厨具架(双菜刀)
tile.rtdd:kitchenwarerackd_2.name=厨具架(菜刀+锅铲)
tile.rtdd:wokcarrot_1.name=炒锅_95(炒胡萝卜_半熟)
@@ -1067,10 +1067,10 @@ tile.rtdd:icelollybox_1.name=冰棍盒(冰棍未定型)
tile.rtdd:roastedmushrooms_0.name=烤香菇串(生)
tile.rtdd:orangebarrel.name=货桶(橘子)
tile.rtdd:orangebarrel.name=橙子货桶
tile.rtdd:roastedmushrooms_3.name=烤香菇串(熟)
tile.rtdd:tonkotsu_ramen.name=猪排蔬菜面加水煮蛋
tile.rtdd:flag_red_orange.name=红橙旗子(正向)
tile.rtdd:flag_red_orange.name=正向红橙旗子
tile.rtdd:roastedmushrooms_1.name=烤香菇串(半熟)
itemGroup.name.tangguo_01_basic=基础工具
itemGroup.name.tangguo_02_ingredients=食材汤锅
+3 -3
View File
@@ -415,9 +415,9 @@ todo 补充
木棍 木棍 木棍
【空】 木棍 【空】
● 梯子(b_57)【有序】
木棍 【空】 木棍
木棍 【空】 木棍
木棍 木棍 木棍
木棍 支杆 木棍
木棍 支杆 木棍
木棍 支杆 木棍
● 木尖桩(b_215)【有序】
【设计】木尖桩(b_215)【有序】
木棍 【空】 木棍