From 7a88478e06c7384d90b6808a317a1dbc2bb98710 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 19 一月 2026 19:27:06 +0800
Subject: [PATCH] 423 【内政】命格系统-服务端(命格额外属性条数修改为由感悟层级决定;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py | 290 +++++++++++++++++++++++++++++----------------------------
1 files changed, 147 insertions(+), 143 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
index 057f614..427b682 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
@@ -29,9 +29,6 @@
import EventReport
import ChItem
import IpyGameDataPY
-import Operate_EquipStone
-import Operate_EquipWash
-import FormulaControl
import ChPyNetSendPack
import NetPackCommon
import PyGameData
@@ -61,6 +58,7 @@
PyGameData.EquipItemSkillIDList = []
PyGameData.DailyUseCountLimitItemIDList = []
PyGameData.AutoTransformCountItemIDList = []
+ PyGameData.MoneyItemIDDict = {}
gameData = GameWorld.GetGameData()
for i in range(0, gameData.GetItemCount()):
@@ -71,12 +69,13 @@
itemEff = findItemData.GetEffectByIndex(0)
curEffID = itemEff.GetEffectID()
- if curEffID == ChConfig.Def_Effect_EquipStone:
- stoneEffType = itemEff.GetEffectValue(0)
- stoneLevel = itemEff.GetEffectValue(1)
- PyGameData.g_stoneLevelIDDict[(stoneEffType, stoneLevel)] = itemID
- elif curEffID == ChConfig.Def_Effect_ItemCount:
+ if curEffID == ChConfig.Def_Effect_ItemCount:
PyGameData.AutoTransformCountItemIDList.append(itemID)
+ elif curEffID == ChConfig.Def_Effect_ItemGiveMoney:
+ moneyValue = itemEff.GetEffectValue(0)
+ moneyType = itemEff.GetEffectValue(1)
+ if moneyValue == 1 and moneyType:
+ PyGameData.MoneyItemIDDict[moneyType] = itemID
if GetIsEquip(findItemData):
for skillIndex in xrange(findItemData.GetAddSkillCount()):
@@ -94,9 +93,18 @@
if PyGameData.AutoTransformCountItemIDList:
GameWorld.Log("自动转化为物品个数的物品ID列表: %s" % PyGameData.AutoTransformCountItemIDList)
-
+ GameWorld.Log("货币类型1个数量对应物品ID: %s" % PyGameData.MoneyItemIDDict)
+ if not PyGameData.MoneyItemIDDict:
+ GameWorld.SendGameErrorEx("InitPyItemError", "启动加载物品数据异常! itemCount=%s" % gameData.GetItemCount())
PyGameData.InitPyItem = True
return
+
+def GetMoneyItemID(moneyType):
+ ## 获取货币类型对应的物品ID
+ if moneyType not in PyGameData.MoneyItemIDDict:
+ GameWorld.ErrLog("没有该货币类型对应的物品ID! moneyType=%s" % moneyType)
+ return 0
+ return PyGameData.MoneyItemIDDict[moneyType]
## 物品触发技能增加buff
# @param curPlayer 当前玩家
@@ -314,7 +322,7 @@
@param isAuctionItem: 是否拍品,默认非拍品
@param expireTime: 有效时间,时间单位由时效类型决定
'''
- if itemCount < 1:
+ if itemCount < 1 or not itemID:
GameWorld.ErrLog("创建物品个数不能少于1! itemID=%s,itemCount=%s" % (itemID, itemCount))
return
curSingleItem = GameWorld.GetItemFactory().CreateItem(itemID)
@@ -350,11 +358,11 @@
return
curSingleItem.SetRemainHour(outTimeServerDay)
- if isAuctionItem:
- if IpyGameDataPY.GetIpyGameDataNotLog("AuctionItem", itemID):
- ItemControler.SetIsAuctionItem(curSingleItem, isAuctionItem)
- else:
- GameWorld.DebugLog("拍卖物品表不存在该ID!创建拍品失败,默认转为非拍品!itemID=%s" % itemID)
+ #if isAuctionItem:
+ # if IpyGameDataPY.GetIpyGameDataNotLog("AuctionItem", itemID):
+ # ItemControler.SetIsAuctionItem(curSingleItem, isAuctionItem)
+ # else:
+ # GameWorld.DebugLog("拍卖物品表不存在该ID!创建拍品失败,默认转为非拍品!itemID=%s" % itemID)
ItemControler.SetItemCount(curSingleItem, itemCount)
@@ -366,6 +374,11 @@
PlayerHero.InitHeroItem(curSingleItem)
elif GetIsEquip(curSingleItem):
setAttrDict = GetCreateEquipAttr(curSingleItem, curPlayer, setAttrDict)
+ if setAttrDict == None:
+ curSingleItem.Clear()
+ return
+ elif GetIsMGGuayu(curSingleItem):
+ setAttrDict = GetCreateMGGuayuAttr(curSingleItem, curPlayer, setAttrDict)
if setAttrDict == None:
curSingleItem.Clear()
return
@@ -409,7 +422,7 @@
@param curPlayer: 可能为None
@param setAttrDict: 直接设置物品的属性 {key:value, ...} key支持 ShareDefine.Def_IudetXXX字符串 或 自定key
@return: None - 异常情况,物品实例需要clear
- equipAttrDict - 生成后的最新属性k:v字典,可直接用于 SetCreateEquipAttr
+ equipAttrDict - 生成后的最新属性k:v字典,可直接用于 AddCreateItemAttr
'''
if setAttrDict == None:
setAttrDict = {}
@@ -537,6 +550,118 @@
GameWorld.DebugLog(" legendAttrIDList=%s,legendAttrValueList=%s" % (legendAttrIDList, legendAttrValueList), playerID)
GameWorld.DebugLog(" 装备最终属性: equipAttrDict=%s,setAttrDict=%s" % (equipAttrDict, setAttrDict), playerID)
+ return equipAttrDict
+
+def GetCreateMGGuayuAttr(curItem, curPlayer=None, setAttrDict=None):
+ '''获取生成命格卦玉所有属性
+ @param curPlayer: 可能为None
+ @param setAttrDict: 直接设置物品的属性 {key:value, ...} key支持 ShareDefine.Def_IudetXXX字符串 或 自定key
+ @return: None - 异常情况,物品实例需要clear
+ equipAttrDict - 生成后的最新属性k:v字典,可直接用于 AddCreateItemAttr
+ '''
+ if setAttrDict == None:
+ setAttrDict = {}
+ playerID = 0 if not curPlayer else curPlayer.GetPlayerID()
+ itemID = curItem.GetItemTypeID()
+ itemType = curItem.GetType()
+ itemColor = curItem.GetItemColor()
+ equipAttrDict = {}
+
+ # 定制属性,如有需要可扩展
+
+ if not curPlayer:
+ return
+
+ gwLV = max(1, curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MGGanwuLV))
+ gwIpyData = IpyGameDataPY.GetIpyGameData("MGGanwuLV", gwLV)
+ colorIpyData = IpyGameDataPY.GetIpyGameData("MGGuayuQuality", itemColor)
+ typeIpyData = IpyGameDataPY.GetIpyGameData("MGGuayuType", itemType)
+ if not gwIpyData or not colorIpyData or not typeIpyData:
+ return
+
+ # 四维基础值、加成值
+ baseAttrDict = {ChConfig.AttrID_Atk:[gwIpyData.GetAtkBase(), colorIpyData.GetAtkPlus()],
+ ChConfig.AttrID_Def:[gwIpyData.GetDefBase(), colorIpyData.GetDefPlus()],
+ ChConfig.AttrID_MaxHP:[gwIpyData.GetHPBase(), colorIpyData.GetHPPlus()],
+ ChConfig.AttrID_AtkSpeed:[gwIpyData.GetAtkSpeedBase(), colorIpyData.GetAtkSpeedPlus()],
+ }
+ batAttrBaseDict = gwIpyData.GetBatAttrBaseDict() # 其他战斗属性基础值字典,{属性ID:基础值, ...}
+
+ # 四维占比
+ attrProportion = typeIpyData.GetBaseAttrProportion()
+
+ randfloat = random.uniform # 随机一个ab区间的数 [a, b],ab支持小数
+
+ itemLV = setAttrDict.get(str(ShareDefine.Def_IudetItemLV), 0)
+ if not itemLV:
+ # 随机等级
+ lowLV, highLV = IpyGameDataPY.GetFuncEvalCfg("MinggeTY", 2)
+ randLVList = range(max(gwLV + lowLV, 1), gwLV + highLV)
+ itemLV = random.choice(randLVList)
+ equipAttrDict[str(ShareDefine.Def_IudetItemLV)] = itemLV
+
+ GameWorld.DebugLog("生成命格卦玉: gwLV=%s,itemID=%s,itemLV=%s,itemColor=%s,itemType=%s" % (gwLV, itemID, itemLV, itemColor, itemType), playerID)
+ legendAttrIDList = setAttrDict.get(str(ShareDefine.Def_IudetLegendAttrID))
+ legendAttrValueList = setAttrDict.get(str(ShareDefine.Def_IudetLegendAttrValue))
+ if legendAttrIDList != None and legendAttrValueList != None and len(legendAttrIDList) == len(legendAttrValueList):
+ equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = legendAttrIDList
+ equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = legendAttrValueList
+ else:
+ fixedAttrID = typeIpyData.GetFixedAttrID() # 固定属性
+ attrIDLib = typeIpyData.GetAttrIDLib() # 随机属性库
+ libAttrCnt = 0 # 随机属性个数
+ libAttrCntNeedLVList = IpyGameDataPY.GetFuncEvalCfg("MinggeCfg", 1)
+ for needGWLV in libAttrCntNeedLVList:
+ if gwLV >= needGWLV:
+ libAttrCnt += 1
+ else:
+ break
+ attrRangeDefault = colorIpyData.GetAttrRange()
+ attrRangeDict = colorIpyData.GetAttrRangeDict()
+
+ random.shuffle(attrIDLib)
+ randAttrList = attrIDLib[:libAttrCnt]
+ attrIDList = [fixedAttrID] + randAttrList
+ GameWorld.DebugLog(" attrIDList=%s,libAttrCnt=%s,%s" % (attrIDList, libAttrCnt, attrIDLib), playerID)
+
+ legendAttrIDList = []
+ legendAttrValueList = []
+ for attrID in attrIDList:
+
+ # 基础四维计算
+ if attrID in baseAttrDict:
+ baseValue, plusValue = baseAttrDict[attrID]
+ attrValue = eval(IpyGameDataPY.GetFuncCompileCfg("MinggeTY", 3))
+ GameWorld.DebugLog(" attrID=%s,attrValue=%s,baseValue=%s,plusValue=%s,attrProportion=%s"
+ % (attrID, attrValue, baseValue, plusValue, attrProportion), playerID)
+
+ # 其他战斗属性
+ else:
+ baseValue = batAttrBaseDict.get(attrID, 0)
+ attrRange = attrRangeDict.get(attrID, attrRangeDefault)
+ if not attrRange or len(attrRange) != 2:
+ continue
+ attrMin, attrMax = attrRange
+ plusValue = random.randint(attrMin, attrMax)
+ attrValue = baseValue + plusValue
+ GameWorld.DebugLog(" attrID=%s,attrValue=%s,baseValue=%s,plusValue=%s,(%s~%s)" % (attrID, attrValue, baseValue, plusValue, attrMin, attrMax), playerID)
+
+ legendAttrIDList.append(attrID)
+ legendAttrValueList.append(attrValue)
+
+ if legendAttrIDList:
+ equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = legendAttrIDList
+ equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = legendAttrValueList
+
+ # 意象技能
+ if itemType in IpyGameDataPY.GetFuncEvalCfg("MinggeTY", 4):
+ yxSkillTypeIDList = IpyGameDataPY.GetFuncEvalCfg("MinggeTY", 5)
+ randSkillTypeID = random.choice(yxSkillTypeIDList) if yxSkillTypeIDList else 0
+ if randSkillTypeID:
+ equipAttrDict[str(ShareDefine.Def_IudetAddSkillID)] = [randSkillTypeID]
+ GameWorld.DebugLog(" itemType=%s,randSkillTypeID=%s" % (itemType, randSkillTypeID), playerID)
+
+ GameWorld.DebugLog(" 卦玉最终属性: equipAttrDict=%s,setAttrDict=%s" % (equipAttrDict, setAttrDict), playerID)
return equipAttrDict
def SetItemUserData(curItem, dataInfo):
@@ -840,65 +965,6 @@
keyStr = ChConfig.Def_VPackCnt_Dict[packindex]
return IpyGameDataPY.GetFuncCfg(keyStr)
-
-## 杀怪掉落提示
-# @param curPlayer 当前玩家
-# @return None
-def NotifyItemDropByKill(curPlayer, curItem, npcID, notifyMark='', mapID=0):
- return #吕超说此处屏蔽
-
-def CacheNotifyEquipDetailInfo(curPlayer, curEquip):
- ''' 缓存装备广播信息中的装备明细信息
- 因为本版本需要的查看的内容相对较多,为了减少全服广播流量消耗,所以先进行缓存,玩家点击查看时再进行查询
- '''
-
- guid = curEquip.GetGUID()
- packType = curEquip.GetItemPlaceType()
- packIndex = curEquip.GetItemPlaceIndex()
- if packType != IPY_GameWorld.rptEquip:
- return guid
-
- classLV = GetItemClassLV(curEquip)
- if not classLV:
- return guid
-
- itemID = curEquip.GetItemTypeID()
- #部位星级
- equipStar = ChEquip.GetEquipPartStarByRank(curPlayer, packIndex, curEquip)
-
- #部位强化数据
- plusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, packIndex)
- plusEvolveLV = ChEquip.GetEquipPartPlusEvolveLV(curPlayer, packType, packIndex)
-
- #部位洗练数据
- washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % packIndex)
- washValueList = []
- for attrNum in xrange(1, Operate_EquipWash.Def_EquipWashMaxAttrCount + 1):
- value = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (packIndex, attrNum))
- washValueList.append(value)
-
- #部位宝石数据
- stoneIDList = Operate_EquipStone.GetEquipIndexStoneIDList(curPlayer, packIndex)
-
- #本阶已穿装备ID [[itemID,star], ...]
- classItems = []
- ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'ClassLV':classLV}, True)
- if ipyDataList:
- equipPack = curPlayer.GetItemManager().GetPack(packType)
- for ipyData in ipyDataList:
- index = ipyData.GetGridIndex()
- classEquip = equipPack.GetAt(index)
- if not classEquip or classEquip.IsEmpty():
- continue
- equipID = classEquip.GetItemTypeID()
- star = ChEquip.GetEquipPartStarByRank(curPlayer, index, classEquip)
- classItems.append([equipID, star])
-
- cacheInfo = [guid, itemID, equipStar, plusLV, plusEvolveLV, washLV, washValueList, stoneIDList, classItems]
- cacheInfo = json.dumps(cacheInfo, ensure_ascii=False)
- GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "NotifyEquipDetailInfo", cacheInfo, len(cacheInfo))
- return guid
-
## 使用物品的特殊提示
# @param curPlayer 当前玩家
# @param useItemID 使用物品
@@ -1101,7 +1167,7 @@
# 记录玩家背包获得物品
if packType in [IPY_GameWorld.rptItem, ShareDefine.rptTreasure] or packType in ShareDefine.Def_VPack_TypeList:
- EventReport.WriteEvent_item_record(curPlayer, 1, operateType, itemNoteDict, noteDict)
+ pass
return
@@ -1120,16 +1186,8 @@
# 记录玩家背包物品删除
if packType in [IPY_GameWorld.rptItem, ShareDefine.rptTreasure] or packType in ShareDefine.Def_VPack_TypeList:
- EventReport.WriteEvent_item_record(curPlayer, 0, operateType, itemNoteDict, noteDict)
+ pass
- return
-
-def DR_EquipItemChange(curPlayer, curEquip, eventName, addDict={}):
- # 记录装备物品属性变更
- noteDict = GetItemNoteDict(curEquip, 1)
- noteDict.update(addDict)
- noteDict["packType"] = curEquip.GetItemPlaceType()
- DataRecordPack.DR_EquipMachining(curPlayer, eventName, noteDict)
return
#===============================================================================
@@ -1842,6 +1900,10 @@
## 返回是否神兽装备
return curItem.GetType() in ChConfig.Def_DogzEquiipType
+def GetIsMGGuayu(curItem):
+ ## 是否命格卦玉
+ return curItem.GetType() in ChConfig.Def_MGGuayuType
+
#---------------------------------------------------------------------
##遍历数据库查找合适的物品, 通过 效果ID + 效果A值确定物品
# @param itemType 物品类型
@@ -1986,13 +2048,6 @@
itemName = str(itemID) if not curItemData else curItemData.GetName()
itemName = "%s LV%s" % (itemName, plusLV + 1)
isNeedRecord = curItemData and ItemControler.IsRuneItemNeedRecord(curItemData, plusLV)
- if packIndex == ShareDefine.rptGatherSoul:
- itemID = ItemControler.GetGatherSoulItemID(itemKeyData)
- plusLV = ItemControler.GetGatherSoulItemPlusLV(itemKeyData)
- curItemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
- itemName = str(itemID) if not curItemData else curItemData.GetName()
- itemName = "%s LV%s" % (itemName, plusLV + 1)
- isNeedRecord = curItemData and ItemControler.IsGatherSoulItemNeedRecord(curItemData, plusLV)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_VPackItem % (packIndex, place), 0)
if isNeedRecord:
@@ -2000,40 +2055,10 @@
DR_DelItem(curPlayer, packIndex, "VPack_%s" % packIndex if not eventName else eventName, dataDict)
ItemControler.Sync_VPackItem_Clear(curPlayer, packIndex, placeList)
return
-
-
-## 获取物品最高强化进化等级
-# @param itemType: 物品类型
-# @return 最大星级,0为不可强化
-def GetItemMaxPlusEvolveLV(curPlayer, equipPackindex, curItem):
- packType = IPY_GameWorld.rptEquip
- curPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, equipPackindex)
- equipPlace = curItem.GetEquipPlace()
- ipyData = IpyGameDataPY.InterpolationSearch('EquipPlusEvolve', 'NeedPlusLV', curPlusLV, {'EquipPlace':equipPlace})
- if not ipyData:
- return 0
- return ipyData.GetEvolveLV()
-
-## 获取物品最高星数
-# @param itemType: 物品类型
-# @return 最大星级,0为不可强化
-def GetItemMaxStar(curItem):
- itemColor = curItem.GetItemColor()
- maxStarDict = IpyGameDataPY.GetFuncEvalCfg('EquipPartStar', 1)
- if str(itemColor) not in maxStarDict:
- return 0
- classLV = GetItemClassLV(curItem)
- return maxStarDict[str(itemColor)].get(str(classLV), 0)
-
## 获取物品阶级或品级
def GetItemClassLV(curItem):
return curItem.GetLV()
-
-def GetWingLV(curItem):
- ## 获取翅膀代数等级
- wingLVDict = IpyGameDataPY.GetFuncEvalCfg("WingLV", 1)
- return wingLVDict.get(str(curItem.GetLV()), 0)
## 装备评分
def GetEquipGearScore(curItem):
@@ -2139,27 +2164,6 @@
@param alchemyDiffLV: 是否过滤掉大于X级的炼丹等级物品,0-不过滤,1-过滤且读默认配置,>1-特殊功能指定的过滤等级
'''
resultWeightList = []
- itemNeedPlayerLVDict = IpyGameDataPY.GetFuncEvalCfg("AlchemyDiffLV", 2, {})
- if alchemyDiffLV or itemNeedPlayerLVDict:
- playerLV = curPlayer.GetLV()
- # 如果有指定大于1的等级则取指定等级,没有的话取默认等级差
- if alchemyDiffLV == 1:
- alchemyDiffLV = IpyGameDataPY.GetFuncCfg("AlchemyDiffLV", 1)
- curAlchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)
- for itemInfo in weightList:
- itemID = itemInfo[1][0]
- if itemID: # 支持配置ID为0时代表不产出
- itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
- if not itemData:
- continue
- if GetItemClassLV(itemData) > curAlchemyLV + alchemyDiffLV:
- continue
- if itemID in itemNeedPlayerLVDict:
- if playerLV < itemNeedPlayerLVDict[itemID]:
- continue
- resultWeightList.append(itemInfo)
- else:
- resultWeightList = weightList
return resultWeightList
## =======================================================================================
--
Gitblit v1.8.0