From ecfe8b45ee59dcc926fec0ece5a4b6b2b583121d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 15 一月 2019 23:35:03 +0800
Subject: [PATCH] 5722 【后端】【1.5】跨服BOSS开发(跨服聊天名字默认使用跨服名字格式)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py |  140 ++++++++++++++++++++++++++++++++++------------
 1 files changed, 103 insertions(+), 37 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 d922bbe..a436f53 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,7 +29,6 @@
 import DataRecordPack
 import EventReport
 import ChItem
-import PlayerMergeEvent
 import IpyGameDataPY
 import Operate_EquipStone
 import PlayerViewCacheTube
@@ -340,7 +339,7 @@
 #  @param itemID 物品ID
 #  @return curSingleItem
 #  @remarks 函数详细说明.
-def CreateSingleItem(itemID, itemCount=1, isBind=0):
+def CreateSingleItem(itemID, itemCount=1, isBind=0, expireTime=0):
     curSingleItem = GameWorld.GetItemFactory().CreateItem(itemID)
     if not curSingleItem:
         return
@@ -378,6 +377,9 @@
         
     ItemControler.SetItemCount(curSingleItem, itemCount)
     
+    if expireTime > 0:
+        curSingleItem.SetUserAttr(ShareDefine.Def_IudetExpireTime, expireTime)
+        
     #这里返回的是SingleItem , 如果创建了,未使用,会找出C++内存泄露!!!
     return curSingleItem
 
@@ -392,7 +394,9 @@
     return
 
 def CalcEquipGS(curItem):
-    ##计算装备评分
+    '''计算装备评分
+        评分组成:装备基础 + 传奇属性 + 绝版属性
+    '''
     if not CheckNoteEquipGS(curItem):
         #GameWorld.DebugLog("不设置装备评分")
         return 0
@@ -408,25 +412,27 @@
             break
         attrDict[effectID] = attrDict.get(effectID, 0) + curEffect.GetEffectValue(0)
         
-    gsParamIpyData = None
+    classLV = GetItemClassLV(curItem)
+    color = curItem.GetItemColor()
+    itemQuality = curItem.GetItemQuality()
+    gsParamIpyData = IpyGameDataPY.GetIpyGameData("EquipGSParam", classLV, color, itemQuality)
     # 传奇属性
     legendAttrIDCnt = curItem.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrID)
     legendAttrValueCnt = curItem.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrValue)
     if legendAttrIDCnt and legendAttrIDCnt == legendAttrValueCnt:
-        classLV = GetItemClassLV(curItem)
-        color = curItem.GetItemColor()
-        itemQuality = curItem.GetItemQuality()
-        gsParamIpyData = IpyGameDataPY.GetIpyGameData("EquipGSParam", classLV, color, itemQuality)
         for i in xrange(legendAttrIDCnt):
             attrID = curItem.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrID, i)
             attrValue = curItem.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrValue, i)
             attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
             
-    MinAtk = attrDict.get(ShareDefine.Def_Effect_MinAtk, 0)
-    MaxAtk = attrDict.get(ShareDefine.Def_Effect_MaxAtk, 0)
+    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 = attrDict.get(ShareDefine.Def_Effect_ArmorDefAddPer, 0)
+    IceAtk = attrDict.get(ShareDefine.Def_Effect_IceAtk, 0)
+    IceDef = attrDict.get(ShareDefine.Def_Effect_IceDef, 0)
     
     AtkPer = attrDict.get(ShareDefine.Def_Effect_AddAtkByPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetAtkPerC())
     DamagePer = attrDict.get(ShareDefine.Def_Effect_DamagePer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDamagePerC())
@@ -449,6 +455,9 @@
     SuperHitReduce = attrDict.get(ShareDefine.Def_Effect_SuperHitReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSuperHitReduceC())
     SkillAtkRate = attrDict.get(ShareDefine.Def_Effect_SkillAtkRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAtkRateC())
     SpeedPer = 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())
     
     # 攻速不默认乘,仅作为参数提供策划使用
     AtkSpeed = attrDict.get(ShareDefine.Def_Effect_AtkSpeed, 0)
@@ -466,7 +475,11 @@
     OnlyFinalHurt = attrDict.get(ShareDefine.Def_Effect_OnlyFinalHurt, 0)
     PVPAtkBackHP = attrDict.get(ShareDefine.Def_Effect_PVPAtkBackHP, 0)  
     
-    value = eval(FormulaControl.GetCompileFormula("EquipGSFormula", IpyGameDataPY.GetFuncCfg("EquipGSFormula")))
+    if GetIsDogzEquip(curItem):
+        # 神兽装备用不同公式
+        value = eval(FormulaControl.GetCompileFormula("EquipGSFormula3", IpyGameDataPY.GetFuncCfg("EquipGSFormula", 3)))
+    else:
+        value = eval(FormulaControl.GetCompileFormula("EquipGSFormula", IpyGameDataPY.GetFuncCfg("EquipGSFormula")))
     return value
 
 #---------------------------------------------------------------------
@@ -870,24 +883,56 @@
 # 特殊判定根据时效时间判定物品是否可以使用
 # 过期物品不能使用或装备但是可以出售续费
 def CheckItemCanUseByExpireTime(curItem):
-    curItemCreateTime = curItem.GetCreateTime()
-    curItemExpireTime = curItem.GetExpireTime()
-    curItemPastTime = GameWorld.GetPastSeconds(curItemCreateTime)
+#    curItemCreateTime = curItem.GetCreateTime()
+#    curItemExpireTime = curItem.GetExpireTime()
+#    curItemPastTime = GameWorld.GetPastSeconds(curItemCreateTime)
+#    
+#    reduceType = curItem.GetEndureReduceType()
+#    if reduceType == ChConfig.Def_EquipReduceType_RTimeItem and \
+#    curItemPastTime >= curItemExpireTime:
+#        # 过期了
+#        return False
+#    
+#    if reduceType == ChConfig.Def_EquipReduceType_Time:
+#        # 开始装备时间
+#        startTime = curItem.GetUserAttr(ShareDefine.Def_IudetCreateTime)
+#        if startTime == 0:
+#            return True
+#        if time.time() - startTime > curItemExpireTime:
+#            return False
     
+    isExpireItem, expireTime = GetItemRemainingTime(curItem)
+    if isExpireItem:
+        if expireTime <= 0:
+            return False
+    return True
+
+def GetItemRemainingTime(curItem):
+    ''' 获取物品剩余时间,秒
+    @return: 是否时效物品, 剩余时间 
+    '''
+    
+    isExpireItem = False
     reduceType = curItem.GetEndureReduceType()
-    if reduceType == ChConfig.Def_EquipReduceType_RTimeItem and \
-    curItemPastTime >= curItemExpireTime:
-        # 过期了
-        return False
+    remainingTime = 0
     
-    if reduceType == ChConfig.Def_EquipReduceType_Time:
+    if reduceType in [ChConfig.Def_EquipReduceType_Time, ChConfig.Def_EquipReduceType_RTimeItem]:
+        isExpireItem = True
+        # 装备后开始计时
+        curItemExpireTime = curItem.GetUserAttr(ShareDefine.Def_IudetExpireTime)
+        if not curItemExpireTime:
+            curItemExpireTime = curItem.GetExpireTime()
+            
         # 开始装备时间
         startTime = curItem.GetUserAttr(ShareDefine.Def_IudetCreateTime)
         if startTime == 0:
-            return True
-        if time.time() - startTime > curItemExpireTime:
-            return False
-    return True
+            remainingTime = curItemExpireTime
+        else:
+            curItemPastTime = max(0, int(time.time()) - startTime)
+            remainingTime = max(0, curItemExpireTime - curItemPastTime)
+        return isExpireItem, remainingTime
+    
+    return isExpireItem, remainingTime
 
 ##检查该物品是否合法,类型验证
 # @param curItem 物品实例
@@ -1326,8 +1371,9 @@
     return hasEnough, itemIndexList, findItemIsBind, needCnt
 
 
-def GetPackItemBindStateIndexInfo(curPlayer, itemID):
+def GetPackItemBindStateIndexInfo(curPlayer, itemID, needCount=0):
     ''' 获取背包消耗道具绑定及未绑定索引情况
+    @param needCount: 所需个数, 默认绑定优先,当找到已经足够的个数后不再遍历,减少无用遍历
     @return: 可消耗物品列表[[绑定物品索引], [不绑定物品索引]], 绑定个数, 未绑定个数
     '''
     consumeItemIndexList = [[], []] # 可消耗物品列表[[绑定物品索引], [不绑定物品索引]]
@@ -1348,6 +1394,8 @@
         if curItem.GetIsBind():
             consumeItemIndexList[0].append(i)
             bindCnt += itemCount
+            if needCount > 0 and bindCnt >= needCount:
+                break
         else:
             consumeItemIndexList[1].append(i)
             unBindCnt += itemCount
@@ -1409,11 +1457,6 @@
     #系统提示 LostRes 失去物品
     #if needSysmsg:
     #    PlayerControl.NotifyCode(curPlayer, 'LostRes', [itemTypeID, totalUseCnt])
-        
-    #添加跨服服务器中使用物品事件
-    if itemTypeID in ReadChConfig.GetEvalChConfig("MergeServerCanUseItemID"):
-        eventInfo = [itemTypeID, totalUseCnt, makeItemBind, eventName, saveDataDict]
-        PlayerMergeEvent.AddMSPlayerEvent(curPlayer.GetPlayerID(), PlayerMergeEvent.Def_MSPEvent_DelItem, eventInfo)
     return makeItemBind
 
 def GetCostItemIndexList(costItemInfo, itemPack, bindFirst=True):
@@ -1502,7 +1545,18 @@
 
 def GetShopItemPrice(itemID, priceType):
     ''' 获取商城物品对应价格 '''
-    ipyData = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ItemID":itemID, "MoneyType":priceType}, isLogNone=False)
+    # 系统固定商店类型: 仙玉(2-常用道具,3-成长变强),绑玉(4-绑玉商城)
+    priceTypeShopTypeDict = {IPY_GameWorld.TYPE_Price_Gold_Money:[2, 3],
+                             IPY_GameWorld.TYPE_Price_Gold_Paper:[4],
+                             }
+    ipyData = None
+    if priceType in priceTypeShopTypeDict:
+        for shopType in priceTypeShopTypeDict[priceType]:
+            ipyData = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ShopType":shopType, "ItemID":itemID, "MoneyType":priceType}, isLogNone=False)
+            if ipyData:
+                break
+    else:
+        ipyData = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ItemID":itemID, "MoneyType":priceType}, isLogNone=False)
     if not ipyData:
         return 0
     return ipyData.GetMoneyNum()
@@ -1592,11 +1646,17 @@
 def DoLogicSwitchItemEx(curPlayer, srcBackpack, desBackPack, srcIndex, destIndex):
     
     #---物品检查---
-    srcItem = curPlayer.GetItemManager().GetPack(srcBackpack).GetAt(srcIndex)
+    srcPack = curPlayer.GetItemManager().GetPack(srcBackpack)
+    if srcIndex < 0 or srcIndex >= srcPack.GetCount():
+        return
+    srcItem = srcPack.GetAt(srcIndex)
     if not CheckItemCanUse(srcItem):
         return
     
-    destItem = curPlayer.GetItemManager().GetPack(desBackPack).GetAt(destIndex)
+    destPack = curPlayer.GetItemManager().GetPack(desBackPack)
+    if destIndex < 0 or destIndex >= destPack.GetCount():
+        return
+    destItem = destPack.GetAt(destIndex)
     #目标格子只验证锁定, 可以允许空位
     if destItem == None or destItem.GetIsLocked():
         return
@@ -1674,6 +1734,10 @@
 #  @remarks 函数详细说明.
 def GetIsEquip(curItem):
     return curItem.GetType() in ChConfig.Def_EquipItemType
+
+def GetIsDogzEquip(curItem):
+    ## 返回是否神兽装备
+    return curItem.GetType() in ChConfig.Def_DogzEquiipType
 
 ## 返回是否武器
 #  @param curItem 当前物品
@@ -1788,11 +1852,6 @@
     ItemControler.SetItemCount(curItem, curItemCnt - delCnt,
                                curPlayer.GetPlayerID(), curPlayer.GetAccID(),
                                curPlayer.GetPlayerName())
-    
-    #添加跨服服务器中使用物品事件
-    if curItemTypeID in ReadChConfig.GetEvalChConfig("MergeServerCanUseItemID"):
-        eventInfo = [curItemTypeID, delCnt, curItemBind, recordName, saveDataDict]
-        PlayerMergeEvent.AddMSPlayerEvent(curPlayer.GetPlayerID(), PlayerMergeEvent.Def_MSPEvent_DelItem, eventInfo)
     return
 
 def DelVPackItem(curPlayer, packIndex, placeList, eventName=""):
@@ -1814,6 +1873,13 @@
             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:

--
Gitblit v1.8.0