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