掉落规则补全

This commit is contained in:
wenhe committed 2026-09-30 11:32:40 +08:00
1 parent ba44cc738f
commit 1df1e9291a
6 files changed
+70 -39

No files matched your search

@@ -786,8 +786,8 @@ class BlueFoxServerSystem(serverBaseSystem):
if userData:
itemDict["userData"] = userData
try:
# 1) 背包同类合并
if self._mergeSameStackInv(playerId, itemName, count):
# 1) 背包同类合并(带 userData 的物品不合并, 避免附魔/药水数据被并错)
if not userData and self._mergeSameStackInv(playerId, itemName, count):
return True
# 2) 主手为空 -> 放主手
cur = self.getCarriedItem(playerId)
@@ -354,11 +354,10 @@ class FurnitureService(BlueFoxServerSystem):
"""
厨具架:放入/取回通用处理(任务五: 点哪边拿哪个)。
放入: 手持 锅铲/锅勺/菜刀/炒锅 右键空架/单件架 -> 按组合(顺序无关)成型
取回: 空手右键 -> 按点击位置(clickX/clickZ/face)判断点在左槽还是右槽,
取下该槽对应厨具, 形态退回剩余单件/空。
槽位固定布局: 组合块模型的左槽 = KITCHENRACK_BLOCK_ITEMS[blockName][0],
右槽 = [1] (与放入顺序无关, 以方块固态布局为准)。
[注意] 左右判定依赖朝向, 若实测相反, 调 _rackSideFlip 即可翻转。
取回: 空手右键 -> 按方块朝向(aux)+命中坐标(clickX/clickZ)判断点在左槽还是右槽,
取下该槽对应厨具, 形态退回剩余单件/空(与玩家站哪一侧无关)。
槽位固定布局: 组合块按 KITCHENRACK_BLOCK_ITEMS 的顺序 左=index0, 右=index1
(以方块模型摆放为准, 与放入顺序无关)。左右映射见 _rackSideByClick。
"""
click = click or {}
# 槽位固定布局(左=index0, 右=index1); 单件=1个
@@ -394,7 +393,7 @@ class FurnitureService(BlueFoxServerSystem):
pickedObj = _s
break
if pickedObj is not None:
self.giveItemObj(playerId, pickedObj) # 按持久化对象给(附魔保留)
self.giveItemObj(playerId, pickedObj, pos, dim) # 按持久化对象给(附魔保留)
else:
self.giveItemToPlayer(playerId, picked, 1, pos, dim, aux=0)
self.replaceBlock(pos, dim, target, playerId)
@@ -509,23 +508,23 @@ class FurnitureService(BlueFoxServerSystem):
if recipe.get("discPut") and itemDict:
self._writeDiscData(dim, pos, itemDict)
# ---- 掉落物(书柜取书/唱片取回) ----
# ---- 掉落物(书柜取书/唱片取回): 走统一优先级(任务一) ----
if droppedBook is not None:
self._dropItemObj(dim, pos, droppedBook)
self._dropItemObj(dim, pos, droppedBook, playerId)
if discToDrop:
self._dropItemDict(dim, pos, discToDrop)
self._dropItemDict(dim, pos, discToDrop, playerId)
if recipe.get("dropItem"):
self.dropItems(dim, pos, recipe["dropItem"])
self.dropItems(dim, pos, recipe["dropItem"], playerId)
# ---- 掉落物形式(水槽取水/取脏盘子/盘子架取回等) ----
# 【根因C】获得物品一律改掉落物形式, 不再直接塞进背包
# ---- 给物品(水槽取水/取脏盘子/盘子架取回/碗柜取碗等): 走统一优先级(任务一) ----
if recipe.get("giveItem"):
_gItem = recipe["giveItem"]
if isinstance(_gItem, dict):
self._dropItemDict(dim, pos, _gItem)
self._dropItemDict(dim, pos, _gItem, playerId)
else:
self._dropItemDict(dim, pos,
{"itemName": _gItem, "count": recipe.get("giveCount", 1), "auxValue": 0})
{"itemName": _gItem, "count": recipe.get("giveCount", 1), "auxValue": 0},
playerId)
# ============================================================================
# 五、方块记录:count/stack 读写(箭桶/书柜, 字段 rtdd_sw*)
@@ -703,8 +702,8 @@ class FurnitureService(BlueFoxServerSystem):
except Exception:
pass
def _dropItemDict(self, dim, pos, itemDict):
"""以掉落物形式生成一个物品(唱片取回 / 箭桶取回等)"""
def _dropItemDict(self, dim, pos, itemDict, playerId=None):
"""给出一个物品(唱片取回/箭桶取回等)。playerId 给出时走统一优先级(任务一)。"""
try:
outDict = {"itemName": itemDict["itemName"],
"count": itemDict.get("count", 1),
@@ -713,12 +712,17 @@ class FurnitureService(BlueFoxServerSystem):
# 药水箭等带 userData(item额外数据, 如药水NBT)的物品: 一并重建到掉落物
if itemDict.get("userData"):
outDict["userData"] = itemDict["userData"]
if playerId is not None:
self.giveItemToPlayer(playerId, outDict["itemName"], outDict["count"],
pos, dim, aux=outDict["auxValue"],
userData=outDict.get("userData"))
return
self.CreateEngineItemEntity(outDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
except Exception:
pass
def _dropItemObj(self, dim, pos, itemObj):
"""以掉落物形式生成一个物品(书柜取书, 按扁平ench重建附魔)"""
def _dropItemObj(self, dim, pos, itemObj, playerId=None):
"""给出一个物品(书柜取书, 按扁平ench重建附魔)。playerId 给出时走统一优先级(任务一)。"""
try:
itemDict = {
"itemName": itemObj["itemName"],
@@ -728,6 +732,11 @@ class FurnitureService(BlueFoxServerSystem):
ench = itemObj.get("ench")
if ench:
itemDict["userData"] = self._buildEnchUserData(ench)
if playerId is not None:
self.giveItemToPlayer(playerId, itemDict["itemName"], itemDict["count"],
pos, dim, aux=itemDict["auxValue"],
userData=itemDict.get("userData"))
return
self.CreateEngineItemEntity(itemDict, dim, (pos[0], pos[1] + 0.5, pos[2]))
except Exception:
pass
@@ -750,18 +759,21 @@ class FurnitureService(BlueFoxServerSystem):
""""给玩家物品": 统一走优先级(同类合并->主手->背包->掉落)"""
self.giveItemToPlayer(playerId, itemName, count, aux=aux, userData=userData)
def giveItemObj(self, playerId, itemObj):
"""按持久化物品对象给玩家(厨具架取回; 附魔书按扁平ench重建附魔)"""
def giveItemObj(self, playerId, itemObj, pos=None, dim=None):
"""按持久化物品对象给玩家(厨具架取回; 附魔书按扁平ench重建附魔)。
统一优先级(任务一): 同类合并->主手->背包->掉落。"""
try:
itemDict = {"itemName": itemObj["itemName"],
"count": itemObj.get("count", 1),
"auxValue": itemObj.get("aux", 0)}
itemName = itemObj["itemName"]
count = itemObj.get("count", 1)
aux = itemObj.get("aux", 0)
userData = None
ench = itemObj.get("ench")
if ench:
itemDict["userData"] = self._buildEnchUserData(ench)
userData = self._buildEnchUserData(ench)
elif itemObj.get("userData"):
itemDict["userData"] = itemObj["userData"]
comp.CreateItem(playerId).SpawnItemToPlayerInv(itemDict, playerId)
userData = itemObj["userData"]
self.giveItemToPlayer(playerId, itemName, count, pos, dim,
aux=aux, userData=userData)
except Exception:
pass
@@ -836,10 +848,10 @@ class FurnitureService(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 = {
@@ -847,7 +859,11 @@ class FurnitureService(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]))
# ============================================================================
# 十二、工具方法:冷却检查
@@ -200,6 +200,16 @@ try:
except Exception:
pass
# 家具家私(碗柜放碗/水槽/盘子架/唱片机/垃圾桶/壁炉加柴 等): FurnitureData.FURNITURE_SWITCHES。
# 手持 木碗/唱片/木条/打火石 等右键这些家具方块时, 原版会先播放放置/使用预览再被服务端取消
# -> "闪一下"。纳入 BLOCKUSE_CANCEL 后由客户端提前 ret 并走 BlockUseRequest 到
# FurnitureService.handleBlockUse, 消除闪动。item=None(取回) 会被派生自动过滤。
try:
from ..jiaju.FurnitureData import FURNITURE_SWITCHES as FURNITURE_RS
_BLOCK_USE_TABLES.append(FURNITURE_RS)
except Exception:
pass
# ---- 原版放置/盘子转换 (itemUseOn, surface=相邻放置 / source=盘子) ----
try:
from ..yuanbanfangzhi.YuanbanData import (
@@ -174,9 +174,9 @@ class NaturalService(BlueFoxServerSystem):
# 替换方块
if recipe.get("target"):
self.replaceBlock(pos, dim, recipe["target"], playerId)
# 掉落物
# 掉落物(任务一: 玩家主动获得 -> 统一优先级)
if recipe.get("dropItem"):
self.dropItems(dim, pos, recipe["dropItem"])
self.dropItems(dim, pos, recipe["dropItem"], playerId)
# 给背包物品
if recipe.get("giveItem"):
self.giveItem(playerId, recipe["giveItem"])
@@ -251,14 +251,19 @@ class NaturalService(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]))
# ============================================================================
# 九、工具方法:冷却检查
+1 -1
View File
@@ -776,7 +776,7 @@ tile.rtdd:eggcodsoup_1.name=汤锅_39(蛋花鳕鱼汤_四分熟)
tile.rtdd:roujiamosoup_0.name=汤锅_77(羊肉泡馍汤_生)
tile.rtdd:carrot_pile.name=胡萝卜堆_禁用
tile.rtdd:carrotsoup.name=汤锅_25(胡萝卜汤)
tile.rtdd:firewood_2.name=柴火_2
tile.rtdd:firewood_2.name=半捆柴火
tile.rtdd:rawricepot.name=汤锅_71(生米锅)
tile.rtdd:statueofadeity.name=神像
tile.rtdd:popsiclepile_3.name=冰棍堆2(橙子+西瓜+苹果)
+3 -3
View File
@@ -44,9 +44,9 @@ todo 后续实现
转换条件:[空手 右键 取出]
机制: 成熟葡萄藤右键取出 3 个葡萄(grape), 变回葡萄藤_1
5. 柴火_2 -> 柴火_1(堆放)
转换条件:[手持 柴火(rtdd:firewood) 右键 进行堆叠]
机制: 手持柴火右键柴火_2,消耗1个,堆叠成柴火_1(堆放)
5. 半捆柴火 -> 柴火
转换条件:[手持 半捆柴火(rtdd:firewood_2) 右键 进行堆叠]
机制: 手持半捆柴火右键半捆柴火,消耗1个,堆叠成柴火
5a. 柴火_1(堆放) -> 柴火_2
转换条件:[空手 右键 进行转换,取走柴火]