加入榨汁机 冰棍盒,炒冰盒 厨具架小bug
This commit is contained in:
1 parent
a7b56aec7d
commit
9d12baf1b2
25 files changed
+354
-227
No files matched your search
+61
-22
@@ -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重建附魔)"""
|
||||
|
||||
Reference in new issue
Block a user