From fbf3fe5655d97c67db3bf07706ab5af232dcc9a5 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 18 九月 2025 19:17:48 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(甘夫人技能;增加连击、追击增伤减伤属性;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py | 525 ++++++++++++++++++++++++----------------------------------
1 files changed, 219 insertions(+), 306 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 8e688c2..f4d4cca 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
@@ -309,7 +306,7 @@
GameWorld.DebugLog("物品过期时间" + timeStr)
return GameWorld.ChangeTimeStrToNum(timeStr)
-def CreateSingleItem(itemID, itemCount=1, isAuctionItem=False, expireTime=0):
+def CreateSingleItem(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, setAttrDict=None):
''' 创建物品
@param isAuctionItem: 是否拍品,默认非拍品
@param expireTime: 有效时间,时间单位由时效类型决定
@@ -364,9 +361,180 @@
# 英雄
if curSingleItem.GetType() == ChConfig.Def_ItemType_Hero:
PlayerHero.InitHeroItem(curSingleItem)
-
+ elif GetIsEquip(curSingleItem):
+ setAttrDict = GetCreateEquipAttr(curSingleItem, curPlayer, setAttrDict)
+ if setAttrDict == None:
+ curSingleItem.Clear()
+ return
+ AddCreateItemAttr(curSingleItem, setAttrDict)
+
#这里返回的是SingleItem , 如果创建了,未使用,会找出C++内存泄露!!!
return curSingleItem
+
+def AddCreateItemAttr(curItem, setAttrDict):
+ ## 设置生成装备所有属性
+ if not setAttrDict:
+ return
+ for key, value in setAttrDict.items():
+ key = GameWorld.ToIntDef(key, key)
+ # 需支持
+ # 1. UserData格式: {'19': ['1889', '2034', '893', '927'], '50': ['1702622046'], '17': ['39', '33', '34', '9']}
+ # 2. 自定义字典: {"key":value, ...} key支持自定义或与UserData的key,value支持数值或列表,列表元素支持字符串或数值,均默认转为数值
+ # 数值类型的默认为UserData属性
+ if isinstance(key, int):
+ if key % 2 == 0: # 偶数是单数值
+ v = 0
+ if isinstance(value, int):
+ v = value
+ elif (isinstance(value, list) or isinstance(value, tuple)) and value:
+ v = GameWorld.ToIntDef(value[0], 0)
+ curItem.SetUserAttr(key, v)
+ elif isinstance(value, list) or isinstance(value, tuple): # 单数一定是要列表
+ curItem.ClearUserAttr(key)
+ for v in value:
+ v = GameWorld.ToIntDef(v, 0)
+ curItem.AddUserAttr(key, v)
+ # 其他指定字符串类型属性
+ else:
+ GameWorld.Log("###AddCreateItemAttr unknown key:%s, value:%s, itemID=%s" % (key, value, curItem.GetItemTypeID()))
+
+ #MakeEquipGS(curItem)
+ return
+
+def GetCreateEquipAttr(curItem, curPlayer=None, setAttrDict=None):
+ '''获取生成装备所有属性
+ @param curPlayer: 可能为None
+ @param setAttrDict: 直接设置物品的属性 {key:value, ...} key支持 ShareDefine.Def_IudetXXX字符串 或 自定key
+ @return: None - 异常情况,物品实例需要clear
+ equipAttrDict - 生成后的最新属性k:v字典,可直接用于 SetCreateEquipAttr
+ '''
+ if setAttrDict == None:
+ setAttrDict = {}
+ equipAttrDict = {}
+ playerID = 0 if not curPlayer else curPlayer.GetPlayerID()
+ itemID = curItem.GetItemTypeID()
+
+ appointID = setAttrDict.get(ShareDefine.Def_CItemKey_AppointID)
+ # 定制属性ID
+ if appointID > 0:
+ ipyData = IpyGameDataPY.GetIpyGameData("AppointItem", appointID)
+ if not ipyData:
+ return
+ if ipyData.GetCancelUseLimit():
+ equipAttrDict[str(ShareDefine.Def_IudetCancelUseLimit)] = 1
+ equipAttrDict[str(ShareDefine.Def_IudetItemLV)] = ipyData.GetItemLV()
+ equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = ipyData.GetBaseAttrID()
+ equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = ipyData.GetBaseAttrValue()
+ equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = ipyData.GetLegendAttrID()
+ equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = ipyData.GetLegendAttrValue()
+ GameWorld.DebugLog(" 装备定制属性: itemID=%s,appointID=%s,equipAttrDict=%s,setAttrDict=%s" % (itemID, appointID, equipAttrDict, setAttrDict), playerID)
+ return equipAttrDict
+
+ # 主线装备
+ if GetIsMainEquip(curItem):
+ return GetCreateMainEquipAttr(curItem, curPlayer, setAttrDict)
+
+ return equipAttrDict
+
+def GetCreateMainEquipAttr(curItem, curPlayer, setAttrDict=None):
+ ## 生成主线装备属性
+
+ equipAttrDict = {}
+ itemID = curItem.GetItemTypeID()
+ itemColor = curItem.GetItemColor()
+ equipPlace = curItem.GetEquipPlace()
+
+ if not curPlayer:
+ return equipAttrDict
+
+ colorIpyData = IpyGameDataPY.GetIpyGameData("EquipColor", itemColor)
+ placeIpyData = IpyGameDataPY.GetIpyGameData("EquipPlace", equipPlace)
+ if not colorIpyData or not placeIpyData:
+ return equipAttrDict
+
+ playerLV = curPlayer.GetLV()
+ playerID = curPlayer.GetPlayerID()
+ randfloat = random.uniform # 随机一个ab区间的数 [a, b],ab支持小数
+
+ itemLV = setAttrDict.get(str(ShareDefine.Def_IudetItemLV), 0)
+ if not itemLV:
+ # 随机等级
+ lowLV, highLV = IpyGameDataPY.GetFuncEvalCfg("MainEquipDrop", 3)
+ randLVList = range(max(playerLV + lowLV, 1), playerLV + highLV)
+ itemLV = random.choice(randLVList)
+ equipAttrDict[str(ShareDefine.Def_IudetItemLV)] = itemLV
+
+ GameWorld.DebugLog("生成主线装备: itemID=%s,itemLV=%s,itemColor=%s,equipPlace=%s" % (itemID, itemLV, itemColor, equipPlace), playerID)
+
+ # 基础三维
+ baseAttrIDList = setAttrDict.get(str(ShareDefine.Def_IudetBaseAttrID))
+ baseAttrValueList = setAttrDict.get(str(ShareDefine.Def_IudetBaseAttrValue))
+ # 这里注意None为未指定,支持当空列表[]时为不给该属性
+ if baseAttrIDList != None and baseAttrValueList != None and len(baseAttrIDList) == len(baseAttrValueList):
+ equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = baseAttrIDList
+ equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = baseAttrValueList
+ else:
+ attrProportion = placeIpyData.GetBaseAttrProportion()
+ attrInfoList = [
+ [ChConfig.AttrID_Atk, colorIpyData.GetAtkStep()],
+ [ChConfig.AttrID_Def, colorIpyData.GetDefStep()],
+ [ChConfig.AttrID_MaxHP, colorIpyData.GetHPStep()],
+ ]
+ baseAttrIDList, baseAttrValueList = [], []
+ for attrID, attrStep in attrInfoList:
+ attrValue = eval(IpyGameDataPY.GetFuncCompileCfg("MainEquipDrop", 4))
+ # int(itemLV*attrStep*attrProportion*randfloat(0.9,1.1))
+ if not attrValue:
+ continue
+ baseAttrIDList.append(attrID)
+ baseAttrValueList.append(attrValue)
+
+ if baseAttrIDList:
+ equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = baseAttrIDList
+ equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = baseAttrValueList
+ GameWorld.DebugLog(" baseAttrIDList=%s,baseAttrValueList=%s" % (baseAttrIDList, baseAttrValueList), 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:
+ legendAttrIDList = []
+ legendAttrValueList = []
+
+ attrRangeDefault = colorIpyData.GetAttrRange()
+ attrRangeDict = colorIpyData.GetAttrRangeDict()
+ libCntList = colorIpyData.GetAttrLibCntList()
+ GameWorld.DebugLog(" libCntList=%s,attrRangeDict=%s, %s" % (libCntList, attrRangeDict, attrRangeDefault), playerID)
+ for num, attrCnt in enumerate(libCntList, 1):
+ if not hasattr(placeIpyData, "GetAttrLib%s" % num):
+ continue
+ libAttrList = getattr(placeIpyData, "GetAttrLib%s" % num)()
+ if not libAttrList:
+ continue
+ random.shuffle(libAttrList)
+ randAttrList = libAttrList[:attrCnt]
+ for attrID in randAttrList:
+ if attrID in legendAttrIDList:
+ continue
+ attrRange = attrRangeDict.get(attrID, attrRangeDefault)
+ if not attrRange or len(attrRange) != 2:
+ continue
+ attrMin, attrMax = attrRange
+ attrValue = random.randint(attrMin, attrMax)
+ legendAttrIDList.append(attrID)
+ legendAttrValueList.append(attrValue)
+ GameWorld.DebugLog(" libNum=%s,attrID=%s,attrValue=%s(%s~%s)" % (num, attrID, attrValue, attrMin, attrMax), playerID)
+
+ if legendAttrIDList:
+ equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = legendAttrIDList
+ equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = legendAttrValueList
+ GameWorld.DebugLog(" legendAttrIDList=%s,legendAttrValueList=%s" % (legendAttrIDList, legendAttrValueList), playerID)
+
+ GameWorld.DebugLog(" 装备最终属性: equipAttrDict=%s,setAttrDict=%s" % (equipAttrDict, setAttrDict), playerID)
+ return equipAttrDict
def SetItemUserData(curItem, dataInfo):
if isinstance(dataInfo, dict):
@@ -379,182 +547,8 @@
curItem.SetUserData(UserData, len(UserData))
return
-def UpdateItemUserData(curItem, updateDict={}, delKeyList=[], isUpdateGS=False):
- ''' 更新物品UserData数据
- @param curItem: IPY_SingleItem 或 IPY_RoleItem
- @param updateDict: 需要更新的数据 {key:value, key:valueList, ...}
- @param delKeyList: 需要删除的数据 key列表[key, ...]
- @param isUpdateGS: 是否更新评分
- @note: UserData格式举例 {'17':['65','7','52'],'50':['0'],'19':['420','380','50'],'50':['1552728662']}
- '''
-
- isRoleItem = False
- if not hasattr(curItem, "SetUserData"):
- item = curItem.GetItem()
- isRoleItem = True
- else:
- item = curItem
- userData = item.GetUserData()
- if not userData:
- userDataDict = {}
- else:
- userDataDict = eval(userData)
-
- for delKey in delKeyList:
- userDataDict.pop(str(delKey), None)
-
- for key, value in updateDict.items():
- if type(value) == int:
- valueList = ['%s' % value]
- elif type(value) == list:
- valueList = ['%s' % v for v in value]
- else:
- continue
- userDataDict['%s' % key] = valueList
-
- SetItemUserData(item, userDataDict)
- if isUpdateGS:
- MakeEquipGS(curItem)
- elif isRoleItem:
- curItem.SetCount(curItem.GetCount()) # 为了触发物品同步
- return
-
def MakeEquipGS(curItem):
- if not CheckNoteEquipGS(curItem):
- #GameWorld.DebugLog("不设置装备评分")
- return
- value = CalcEquipGS(curItem)
- #GameWorld.DebugLog("设置装备评分: ItemID=%s,attrDict=%s,value=%s" % (curItem.GetItemTypeID(), attrDict, value))
- SetEquipGearScore(curItem, value)
return
-
-def CalcEquipGS(curItem):
- '''计算装备评分
- 评分组成:装备基础 + 传奇属性
- '''
- if not CheckNoteEquipGS(curItem):
- #GameWorld.DebugLog("不设置装备评分")
- return 0
-
- attrDict = {}
- #基础属性效果
- for i in xrange(curItem.GetEffectCount()):
- curEffect = curItem.GetEffectByIndex(i)
- if not curEffect:
- break
- effectID = curEffect.GetEffectID()
- if effectID == 0:
- break
- attrDict[effectID] = attrDict.get(effectID, 0) + curEffect.GetEffectValue(0)
-
- gsValueEx = 0
- skillGSDict = IpyGameDataPY.GetFuncCfg("EquipGSFormula", 4)
- itemSkillIDList = GetItemSkillIDList(curItem)
- for addSkillID in itemSkillIDList:
- gsValueEx += skillGSDict.get(str(addSkillID), 0)
-
- itemID = curItem.GetItemTypeID()
- classLV = GetItemClassLV(curItem)
- color = curItem.GetItemColor()
- itemQuality = curItem.GetItemQuality()
- isSuit = 1 if curItem.GetSuiteID() > 0 else 0
- gsParamIpyData = IpyGameDataPY.GetIpyGameDataNotLog("EquipGSParam", classLV, color, isSuit, itemQuality)
- # 传奇属性
- legAttrIDList, legAttrValueList = ItemControler.GetEquipLegendAttrAll(curItem)
- for i, legendAttrID in enumerate(legAttrIDList):
- legendAttrValue = legAttrValueList[i]
- attrDict[legendAttrID] = attrDict.get(legendAttrID, 0) + legendAttrValue
-
- lingQiIpyData = IpyGameDataPY.GetIpyGameDataNotLog("LingQiAttr", itemID)
- if lingQiIpyData:
- gsValueEx += lingQiIpyData.GetLingQiAttrScore()
-
- Atk = attrDict.get(ShareDefine.Def_Effect_Atk, 0)
- MinAtk = attrDict.get(ShareDefine.Def_Effect_MinAtk, 0) + Atk
- MaxAtk = attrDict.get(ShareDefine.Def_Effect_MaxAtk, 0) + Atk
- MaxHP = attrDict.get(ShareDefine.Def_Effect_MaxHP, 0)
- Def = attrDict.get(ShareDefine.Def_Effect_Def, 0)
- ArmorDefPer = 0
- IceAtk = attrDict.get(ShareDefine.Def_Effect_IceAtk, 0)
- IceDef = attrDict.get(ShareDefine.Def_Effect_IceDef, 0)
- FabaoHurt = attrDict.get(ShareDefine.Def_Effect_FabaoHurt, 0)
- AtkBackHP = attrDict.get(ShareDefine.Def_Effect_AtkBackHP, 0)
-
- FinalHurt = attrDict.get(ShareDefine.Def_Effect_FinalHurt, 0)
- FinalHurtReduce = attrDict.get(ShareDefine.Def_Effect_FinalHurtReduce, 0)
-
- BaseEquipMaxHPAddPer = attrDict.get(ShareDefine.Def_Effect_BaseEquipMaxHPAddPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetBaseEquipMaxHPAddPerC())
- BaseEquipAtkAddPer = attrDict.get(ShareDefine.Def_Effect_BaseEquipAtkAddPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetBaseEquipAtkAddPerC())
- AtkPer = attrDict.get(ShareDefine.Def_Effect_AddAtkByPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetAtkPerC())
- DamagePer = 0#attrDict.get(ShareDefine.Def_Effect_DamagePer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDamagePerC())
- SuperHitRate = attrDict.get(ShareDefine.Def_Effect_SuperHitRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSuperHitRateC())
- SuperHit = attrDict.get(ShareDefine.Def_Effect_SuperHit, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSuperHitC())
- SuperHitPer = attrDict.get(ShareDefine.Def_Effect_SuperHitPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSuperHitPerC())
- DamReducePer = 0#attrDict.get(ShareDefine.Def_Effect_DamReducePer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDamReducePerC())
- MaxHPPer = attrDict.get(ShareDefine.Def_Effect_MaxHPPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetMaxHPPerC())
- DefPer = 0#attrDict.get(ShareDefine.Def_Effect_DefPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDefPerC())
- LuckyHitRate = attrDict.get(ShareDefine.Def_Effect_LuckyHitRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetLuckyHitRateC())
- LuckyHitRateReduce = attrDict.get(ShareDefine.Def_Effect_LuckyHitRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetLuckyHitRateReduceC())
- LuckyHitPer = attrDict.get(ShareDefine.Def_Effect_LuckyHitPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetLuckyHitPerC())
- LuckyHit = attrDict.get(ShareDefine.Def_Effect_LuckyHit, 0)
- LuckyHitReduce = attrDict.get(ShareDefine.Def_Effect_LuckyHitReduce, 0)
- LuckPer = attrDict.get(ShareDefine.Def_Effect_LuckPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetLuckPerC())
- PetDamPer = attrDict.get(ShareDefine.Def_Effect_PetDamPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetPetDamPerC())
- PerLVAtk = attrDict.get(ShareDefine.Def_Effect_PerLVAtk, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetPerLVAtkC())
- MissRate = 0#attrDict.get(ShareDefine.Def_Effect_MissRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetMissRateC())
- HitRate = 0#attrDict.get(ShareDefine.Def_Effect_HitRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetHitRateC())
- DamBackPer = 0#attrDict.get(ShareDefine.Def_Effect_DamBackPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDamBackPerC())
- PerLVMaxHP = attrDict.get(ShareDefine.Def_Effect_PerLVMaxHP, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetPerLVMaxHPC())
- DropEquipPer = attrDict.get(ShareDefine.Def_Effect_DropEquipPer, 0)# * (1 if not gsParamIpyData else gsParamIpyData.GetDropEquipPerC())
- DropMoneyPer = attrDict.get(ShareDefine.Def_Effect_DropMoneyPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDropMoneyPerC())
- IgnoreDefRateReduce = 0#attrDict.get(ShareDefine.Def_Effect_IgnoreDefRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetIgnoreDefRateReduceC())
- DamChanceDef = 0#attrDict.get(ShareDefine.Def_Effect_DamChanceDef, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDamChanceDefC())
- SuperHitReduce = attrDict.get(ShareDefine.Def_Effect_SuperHitReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSuperHitReduceC())
- SuperHitRateReduce = attrDict.get(ShareDefine.Def_Effect_SuperHitRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSuperHitRateReduceC())
- SkillAtkRate = attrDict.get(ShareDefine.Def_Effect_SkillAtkRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAtkRateC())
- SpeedPer = 0#attrDict.get(ShareDefine.Def_Effect_SpeedPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSpeedPerC())
- SkillAtkRateReduce = attrDict.get(ShareDefine.Def_Effect_SkillAtkRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAtkRateReduceC())
- Hit = attrDict.get(ShareDefine.Def_Effect_Hit, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetHitC())
- Miss = attrDict.get(ShareDefine.Def_Effect_Miss, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetMissC())
- SkillAddPerA = attrDict.get(ShareDefine.Def_Effect_SkillAddPer1, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer1C())
- SkillAddPerB = attrDict.get(ShareDefine.Def_Effect_SkillAddPer2, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer2C())
- SkillAddPerC = attrDict.get(ShareDefine.Def_Effect_SkillAddPer3, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer3C())
- SkillAddPerD = attrDict.get(ShareDefine.Def_Effect_SkillAddPer4, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer4C())
- SkillAddPerE = attrDict.get(ShareDefine.Def_Effect_SkillAddPer5, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer5C())
- SkillAddPerF = attrDict.get(ShareDefine.Def_Effect_SkillAddPer6, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer6C())
- SkillAddPerG = attrDict.get(ShareDefine.Def_Effect_SkillAddPer7, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer7C())
- SkillReducePerA = attrDict.get(ShareDefine.Def_Effect_SkillReducePer1, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer1C())
- SkillReducePerB = attrDict.get(ShareDefine.Def_Effect_SkillReducePer2, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer2C())
- SkillReducePerC = attrDict.get(ShareDefine.Def_Effect_SkillReducePer3, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer3C())
- SkillReducePerD = attrDict.get(ShareDefine.Def_Effect_SkillReducePer4, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer4C())
- SkillReducePerE = attrDict.get(ShareDefine.Def_Effect_SkillReducePer5, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer5C())
- SkillReducePerF = attrDict.get(ShareDefine.Def_Effect_SkillReducePer6, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer6C())
- SkillReducePerG = attrDict.get(ShareDefine.Def_Effect_SkillReducePer7, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer7C())
-
- ReduceSkillCDPer = attrDict.get(ShareDefine.Def_Effect_ReduceSkillCDPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetReduceSkillCDPerC())
-
- FaintDefRate = attrDict.get(ShareDefine.Def_Effect_FaintDefRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetFaintDefRateC())
-
- IgnoreDefRate = attrDict.get(ShareDefine.Def_Effect_IgnoreDefRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetIgnoreDefRateC())
- IgnoreDefRateReduce = attrDict.get(ShareDefine.Def_Effect_IgnoreDefRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetIgnoreDefRateReduceC())
- ProDefPer = attrDict.get(ShareDefine.Def_Effect_ProDefHPPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetProDefPerC())
- FinalHurtPerC = attrDict.get(ShareDefine.Def_Effect_FinalHurtPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetFinalHurtPerC())
- FinalHurtReducePerC = attrDict.get(ShareDefine.Def_Effect_FinalHurtReducePer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetFinalHurtReducePerC())
-
- # 攻速不默认乘,仅作为参数提供策划使用
- AtkSpeed = 0#attrDict.get(ShareDefine.Def_Effect_AtkSpeed, 0)
- AtkSpeedC = 1#1 if not gsParamIpyData else gsParamIpyData.GetAtkSpeedC()
-
- OnlyFinalHurt = attrDict.get(ShareDefine.Def_Effect_OnlyFinalHurt, 0)
- PVPAtkBackHP = attrDict.get(ShareDefine.Def_Effect_PVPAtkBackHP, 0)
-
- if GetIsDogzEquip(curItem):
- # 神兽装备用不同公式
- value = eval(FormulaControl.GetCompileFormula("EquipGSFormula3", IpyGameDataPY.GetFuncCfg("EquipGSFormula", 3)))
- else:
- value = eval(FormulaControl.GetCompileFormula("EquipGSFormula", IpyGameDataPY.GetFuncCfg("EquipGSFormula")))
- value += gsValueEx
- return value
#---------------------------------------------------------------------
## 通过效果ID,检查是否为指定物品
@@ -779,6 +773,7 @@
def GetPackInitCount(packType):
## 获取背包类型对应初始格子数
+ initCount = 0
if packType == IPY_GameWorld.rptItem:
initCount = IpyGameDataPY.GetFuncCfg("InitBagCellCount", 1)
elif packType == IPY_GameWorld.rptWarehouse:
@@ -789,11 +784,48 @@
initCount = IpyGameDataPY.GetFuncCfg("DogzPack", 1)
elif packType == ShareDefine.rptDogzEquip:
initCount = IpyGameDataPY.GetFuncCfg("DogzPack", 2)
- else:
+
+ if not initCount:
bagInitCntDict = IpyGameDataPY.GetFuncEvalCfg("InitBagCellCount", 2, {})
initCount = bagInitCntDict.get(str(packType), 0)
GameWorld.DebugLog("背包类型初始格子数: packType=%s,initCount=%s" % (packType, initCount))
return initCount
+
+def GetPackOpenItemCnt(curPlayer, packType):
+ ## 获取对应背包已购买的格子数
+ openCntDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 3, {})
+ if str(packType) not in openCntDict:
+ return 0
+ openCntList = openCntDict[str(packType)]
+ if not openCntList:
+ return 0
+
+ buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PackBuyCnt % packType)
+ openCnt = sum(openCntList[:buyCnt])
+ if buyCnt > len(openCntList):
+ addCnt = (buyCnt - len(openCntList)) * openCntList[-1]
+ openCnt += addCnt
+
+ return openCnt
+
+def SyncPackBuyCnt(curPlayer, packType=None):
+ ## 同步已购买格子次数信息
+ openCntDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 3, {})
+ if not openCntDict:
+ return
+ syncTypeList = [str(packType)] if packType else openCntDict.keys()
+
+ clientPack = ChPyNetSendPack.tagSCPackBuyInfo()
+ clientPack.BuyInfoList = []
+ for packTypeStr in syncTypeList:
+ packType = int(packTypeStr)
+ buy = ChPyNetSendPack.tagSCPackBuy()
+ buy.PackType = packType
+ buy.BuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PackBuyCnt % packType)
+ clientPack.BuyInfoList.append(buy)
+ clientPack.Count = len(clientPack.BuyInfoList)
+ NetPackCommon.SendFakePack(curPlayer, clientPack)
+ return
## 获得虚拟背包格子数
# @param packindex 背包索引
@@ -804,65 +836,6 @@
return 0
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 当前玩家
@@ -1120,13 +1093,7 @@
return True
def CheckNoteEquipGS(curItem):
- if not CheckItemCanUse(curItem):
- return False
-
- if curItem.GetType() not in IpyGameDataPY.GetFuncEvalCfg("EquipGSTypeForSort", 1):
- return False
-
- return True
+ return False
#---------------------------------------------------------------------
## 通过背包查找指定效果ID的指定数量物品
@@ -1805,6 +1772,10 @@
def GetIsEquip(curItem):
return curItem.GetType() in ChConfig.Def_EquipItemType
+def GetIsMainEquip(curItem):
+ ## 是否主线装备
+ return curItem.GetType() in ChConfig.Def_MainEquipType
+
def GetIsDogzEquip(curItem):
## 返回是否神兽装备
return curItem.GetType() in ChConfig.Def_DogzEquiipType
@@ -1953,13 +1924,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:
@@ -1967,40 +1931,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):
@@ -2106,37 +2040,16 @@
@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
## =======================================================================================
-def SyncMakeItemAnswer(curPlayer, makeType, isSuccess, makeItemID):
+def SyncMakeItemAnswer(curPlayer, makeType, isSuccess, makeValue):
makeItemAnswer = ChPyNetSendPack.tagMCMakeItemAnswer()
makeItemAnswer.Clear()
makeItemAnswer.MakeType = makeType
makeItemAnswer.Result = isSuccess
- makeItemAnswer.MakeItemID = makeItemID
+ makeItemAnswer.MakeValue = makeValue
NetPackCommon.SendFakePack(curPlayer, makeItemAnswer)
return
--
Gitblit v1.8.0