代码初始化
This commit is contained in:
1 parent
8160eca074
commit
dffebce01d
43 files changed
+6383
No files matched your search
@@ -0,0 +1,172 @@
|
||||
# coding=utf-8
|
||||
import copy
|
||||
|
||||
from ToolsConfig import *
|
||||
|
||||
|
||||
def IsItemDict(itemDict):
|
||||
"""
|
||||
是否为有效的物品字典
|
||||
:param itemDict:
|
||||
:return:
|
||||
"""
|
||||
if itemDict and (
|
||||
not isinstance(itemDict, dict) or itemDict.get('newItemName') is None or
|
||||
itemDict.get('newAuxValue') is None or itemDict['newItemName'] == 'minecraft:air'
|
||||
):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def GetItemUserData(itemDict, *args):
|
||||
"""
|
||||
获取物品的userData,若不含有相应的键,则创建
|
||||
:param itemDict: 物品字典
|
||||
:param args: 键值key
|
||||
:return:
|
||||
"""
|
||||
itemDict['userData'] = itemDict.get('userData', {})
|
||||
if itemDict.get('userData') is None:
|
||||
itemDict['userData'] = {}
|
||||
ver = itemDict['userData']
|
||||
for key in args:
|
||||
ver[key] = ver.get(key, {})
|
||||
ver = ver[key]
|
||||
return ver
|
||||
|
||||
|
||||
def CreateItemDict(itemName, aux=0, count=1):
|
||||
"""
|
||||
快速生成最基本的物品字典
|
||||
"""
|
||||
itemInfo = GetItemBaseInfoSafely({'newItemName': itemName, 'newAuxValue': aux})
|
||||
return {
|
||||
'newItemName': itemName, 'newAuxValue': aux, 'count': count, 'durability': itemInfo.get('maxDurability', 0)
|
||||
}
|
||||
|
||||
|
||||
def GetItemBaseInfoSafely(itemDict):
|
||||
"""
|
||||
安全获取物品基本信息,网易接口对于不存在的物品ID_AUX获取为None
|
||||
:param itemDict:
|
||||
:return:
|
||||
"""
|
||||
default = None
|
||||
try:
|
||||
if itemDict:
|
||||
default = clientCompFactory.CreateItem(LevelId).GetItemBasicInfo(
|
||||
itemDict['newItemName'], itemDict['newAuxValue'],
|
||||
(itemDict.get('enchantData', []) + itemDict.get('modEnchantData', [])).__len__() > 0
|
||||
) or serverCompFactory.CreateItem(LevelId).GetItemBasicInfo(
|
||||
itemDict['newItemName'], itemDict['newAuxValue'],
|
||||
(itemDict.get('enchantData', []) + itemDict.get('modEnchantData', [])).__len__() > 0
|
||||
)
|
||||
except:
|
||||
pass
|
||||
default = default if default else {
|
||||
'foodNutrition': 0, 'maxDurability': 0, 'armorDefense': 0, 'tierDict': None,
|
||||
'itemType': '', 'fuelDuration': 0.0, 'foodSaturation': 0.0,
|
||||
'armorKnockbackResistance': 0.0, 'customItemType': '', 'itemTierLevel': -1,
|
||||
'maxStackSize': 64, 'weaponDamage': 0, 'itemName': '',
|
||||
'itemCategory': 'construction', 'id_aux': 0, 'armorToughness': 0
|
||||
}
|
||||
return default
|
||||
|
||||
|
||||
def DeclareItem(itemDict):
|
||||
# type:(Dict) -> Tuple[Dict,Dict]
|
||||
"""
|
||||
减少物品一个,如果个数为0则会返回空dict
|
||||
:return:减少后的物品字典,独立出来的物品
|
||||
"""
|
||||
if not itemDict:
|
||||
return itemDict, {}
|
||||
itemDict['count'] -= 1
|
||||
newItem = copy.deepcopy(itemDict)
|
||||
newItem['count'] = 1
|
||||
if itemDict['count'] > 0:
|
||||
return itemDict, newItem
|
||||
else:
|
||||
return {}, newItem
|
||||
|
||||
|
||||
def DeclareItemAnyNum(itemDict, num):
|
||||
# type:(Dict,int) -> Tuple[Dict,Dict]
|
||||
"""
|
||||
减少物品多个,如果个数为0则会返回空dict
|
||||
:return:减少后的物品字典,独立出来的物品
|
||||
"""
|
||||
if not isinstance(itemDict, dict): return {}, {}
|
||||
if not IsItemDict(itemDict): return {}, {}
|
||||
if not itemDict: return {}, itemDict
|
||||
if itemDict['count'] < num: return {}, itemDict
|
||||
itemDict['count'] -= num
|
||||
newItem = copy.deepcopy(itemDict)
|
||||
newItem['count'] = num
|
||||
if itemDict['count'] > 0:
|
||||
return itemDict, newItem
|
||||
else:
|
||||
return {}, newItem
|
||||
|
||||
|
||||
def StackItems(item1, item2):
|
||||
# type:(Dict,Dict) -> Dict
|
||||
"""
|
||||
使item1与item2堆叠在一起,返回多余的物品
|
||||
"""
|
||||
if not item1 or not item2: return {}
|
||||
if not IsSameItemAndCanStack(item1, item2): return {}
|
||||
itemInfo = GetItemBaseInfoSafely(item1)
|
||||
maxCount = itemInfo['maxStackSize']
|
||||
count1 = item1['count']
|
||||
count2 = item2['count']
|
||||
t_count = count1 + count2 - maxCount
|
||||
t_item = {}
|
||||
if t_count > 0:
|
||||
t_item = copy.deepcopy(item1)
|
||||
t_item['count'] = t_count
|
||||
item1['count'] = maxCount
|
||||
else:
|
||||
item1['count'] += item2['count']
|
||||
return t_item
|
||||
|
||||
|
||||
def IsSameItemAndCanStack(item1, item2):
|
||||
# type:(Dict,Dict) -> bool
|
||||
"""
|
||||
判断item1是否能与item2堆叠在一起
|
||||
"""
|
||||
if not item1 or not item2:
|
||||
return True
|
||||
if IsSameItem(item1, item2):
|
||||
itemInfo = GetItemBaseInfoSafely(item1)
|
||||
return item1['count'] + item2['count'] <= itemInfo['maxStackSize']
|
||||
return False
|
||||
|
||||
|
||||
def IsSameItem(item1, item2, args=('newItemName', 'newAuxValue', 'durability')):
|
||||
"""
|
||||
判断item1是否与item2相同.目前判断物品ID,AUX,耐久度
|
||||
"""
|
||||
if item1 and item2:
|
||||
same = True
|
||||
for key in args: same = same and item1.get(key, 0) == item2.get(key, 0)
|
||||
return same
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def GetItemDurabilityPercent(itemDict, itemInfo=None):
|
||||
"""
|
||||
获取耐久值百分比与总值
|
||||
:param itemDict:物品信息字典
|
||||
:param itemInfo:物品基础信息字典
|
||||
:return:
|
||||
"""
|
||||
if itemInfo is None:
|
||||
itemInfo = GetItemBaseInfoSafely(itemDict)
|
||||
return (
|
||||
(itemDict.get('durability', 0.0) / float(itemInfo['maxDurability']))
|
||||
if itemInfo['maxDurability'] != 0 else 0.0,
|
||||
1.0 if itemInfo['maxDurability'] != 0 else 0.0
|
||||
)
|
||||
Reference in new issue
Block a user