掉落规则补全
This commit is contained in:
1 parent
ba44cc738f
commit
1df1e9291a
6 files changed
+70
-39
No files matched your search
+2
-2
@@ -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)
|
||||
|
||||
+45
-29
@@ -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 (
|
||||
|
||||
+9
-4
@@ -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]))
|
||||
|
||||
# ============================================================================
|
||||
# 九、工具方法:冷却检查
|
||||
|
||||
@@ -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(橙子+西瓜+苹果)
|
||||
|
||||
@@ -44,9 +44,9 @@ todo 后续实现
|
||||
转换条件:[空手 右键 取出]
|
||||
机制: 成熟葡萄藤右键取出 3 个葡萄(grape), 变回葡萄藤_1
|
||||
|
||||
5. 柴火_2 -> 柴火_1(堆放)
|
||||
转换条件:[手持 柴火(rtdd:firewood) 右键 进行堆叠]
|
||||
机制: 手持柴火右键柴火_2,消耗1个,堆叠成柴火_1(堆放)
|
||||
5. 半捆柴火 -> 柴火
|
||||
转换条件:[手持 半捆柴火(rtdd:firewood_2) 右键 进行堆叠]
|
||||
机制: 手持半捆柴火右键半捆柴火,消耗1个,堆叠成柴火
|
||||
|
||||
5a. 柴火_1(堆放) -> 柴火_2
|
||||
转换条件:[空手 右键 进行转换,取走柴火]
|
||||
|
||||
Reference in new issue
Block a user