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