From a388abb4b97782c1c694a8d28d8a1e73e03a35c0 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期一, 10 六月 2019 16:33:25 +0800
Subject: [PATCH] 7155 【后端】【2.0】新增仙盟创建规则(通知修改)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStone.py | 664 +++++++++++++++++++++++++++++++-----------------------
1 files changed, 383 insertions(+), 281 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStone.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStone.py
index 4d898b8..e6cff6f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStone.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipStone.py
@@ -1,6 +1,6 @@
#!/usr/bin/python
# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
#
##@package Event.EventSrc.Operate_EquipStone
#
@@ -11,9 +11,9 @@
#
# 详细描述: 装备宝石
#
-#-------------------------------------------------------------------------------
-#"""Version = 2017-07-29 12:00"""
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+# """Version = 2017-07-29 12:00"""
+# -------------------------------------------------------------------------------
import GameWorld
import ItemCommon
@@ -28,143 +28,207 @@
import NetPackCommon
import DataRecordPack
import PlayerSuccess
+import PlayerWeekParty
import ShareDefine
+import EventShell
+
+# import EquipZhuXian
+
+g_stoneCanPlaceList = [] # 可镶嵌的位置
-
-def OnLogin(curPlayer):
- ###登录发包同步客户端宝石信息
- Sycn_StoneHoleInfo(curPlayer)
- return
+# def OnLogin(curPlayer):
+# ###登录发包同步客户端宝石信息
+# Sycn_StoneHoleInfo(curPlayer)
+# return
def GetAllStoneEquipIndexList():
###得到所有可镶嵌宝石装备位列表
-
- #获得宝石类型数量
+ global g_stoneCanPlaceList
+ if g_stoneCanPlaceList:
+ return g_stoneCanPlaceList
+ # 获得宝石类型数量
GemTypeCount = IpyGameDataPY.GetFuncCfg("GemTypeCount")
- #获得所有可镶嵌宝石装备位
- stoneCanPlaceList = []
+ # 获得所有可镶嵌宝石装备位
+ g_stoneCanPlaceList = []
for stoneTypeIndex in xrange(1, GemTypeCount + 1):
- #循环宝石类型对应的装备位
- stoneCanPlaceList += IpyGameDataPY.GetFuncEvalCfg("GemType%s" % stoneTypeIndex, 1)
-
- return stoneCanPlaceList
+ # 循环宝石类型对应的装备位
+ placeList = IpyGameDataPY.GetFuncEvalCfg("GemType%s" % stoneTypeIndex, 1)
+ for place in placeList:
+ ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'EquipPlace': place}, True)
+ if not ipyDataList:
+ continue
+ for ipyData in ipyDataList:
+ gridIndex = ipyData.GetGridIndex()
+ if gridIndex not in g_stoneCanPlaceList:
+ g_stoneCanPlaceList.append(gridIndex)
+ return g_stoneCanPlaceList
+
def GetAllEquipPlaceHoleIndex():
### 得到装备位所有孔位
- gemOpenClassLVList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
- maxEquipHoleCnt = len(gemOpenClassLVList) # 最大装备阶级开放孔数
-
+ gemOpenNeedStarList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
+ maxEquipHoleCnt = len(gemOpenNeedStarList) # 最大装备阶级开放孔数
+
gemOpenVipList = IpyGameDataPY.GetFuncEvalCfg("GemOpenVip", 1)
- maxHoleVipCnt = len(gemOpenVipList)# 最大Vip开放孔数
-
+ maxHoleVipCnt = len(gemOpenVipList) # 最大Vip开放孔数
+
return range(maxEquipHoleCnt) + range(ChConfig.Def_Stone_VipHole, ChConfig.Def_Stone_VipHole + maxHoleVipCnt)
+
def GetEquipIndexStoneIDList(curPlayer, equipIndex):
### 装备位孔位宝石ID列表
-
+
holeIndexList = GetAllEquipPlaceHoleIndex()
holeStoneIDList = []
for holeIndex in holeIndexList:
- stoneID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex) [0]
+ stoneID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)[0]
holeStoneIDList.append(stoneID)
return holeStoneIDList
+
def GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex):
'''获得装备位孔位宝石ID和绑定信息
@return: stoneID, stoneIsBind
'''
- #获得装备位孔索引宝石存储信息
- stoneInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartStoneID % (equipIndex, holeIndex))
- #获取装备位孔位上宝石ID
+ # 获得装备位孔索引宝石存储信息
+ stoneInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartStoneID % (equipIndex, holeIndex))
+ # 获取装备位孔位上宝石ID
stoneID = stoneInfo / ChConfig.Def_Stone_SaveStoneInfoXNumber
- #获取装备位孔位上宝石是否绑定状态
- stoneIsBind = stoneInfo % ChConfig.Def_Stone_SaveStoneInfoXNumber
+ # 获取装备位孔位上宝石是否绑定状态
+ stoneIsBind = stoneInfo % ChConfig.Def_Stone_SaveStoneInfoXNumber
return stoneID, stoneIsBind
+
def SetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex, changeStoneID, isBind):
### 保存装备位孔位宝石ID和绑定信息
+ befStoneID, befIsBind = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)
+ if befStoneID == changeStoneID and befIsBind == isBind:
+ return
+
+ isBind = 0 # 现绑定无用,默认存0
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartStoneID % (equipIndex, holeIndex),
- changeStoneID * ChConfig.Def_Stone_SaveStoneInfoXNumber + isBind)
+ changeStoneID * ChConfig.Def_Stone_SaveStoneInfoXNumber + isBind)
+
+ # 同步更新宝石总等级
+ gameData = GameWorld.GetGameData()
+ befStoneLV = 0
+ if befStoneID:
+ befGem = gameData.GetItemByTypeID(befStoneID)
+ befStoneLV = 0 if not befGem else befGem.GetEffectByIndex(0).GetEffectValue(1)
+
+ aftStoneLV = 0
+ if changeStoneID:
+ aftGem = gameData.GetItemByTypeID(changeStoneID)
+ aftStoneLV = 0 if not aftGem else aftGem.GetEffectByIndex(0).GetEffectValue(1)
+
+ befTotalStoneLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalStoneLV)
+ updTotalStoneLV = max(0, befTotalStoneLV + aftStoneLV - befStoneLV)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalStoneLV, updTotalStoneLV)
+ GameWorld.DebugLog(
+ "设置宝石等级: equipIndex=%s,holeIndex=%s,befStoneLV=%s,aftStoneLV=%s,befTotalStoneLV=%s,updTotalStoneLV=%s"
+ % (equipIndex, holeIndex, befStoneLV, aftStoneLV, befTotalStoneLV, updTotalStoneLV))
return
-#//A3 04 宝石镶嵌或替换 #tagCMEquipEnchase
-#struct tagCMEquipEnchase
-#{
+def GetPackTypeByEquipPlace(equipPlace):
+ ##目前支持镶嵌普通装备、诛仙装备
+ # if equipPlace in ShareDefine.ZhuXianEquipPlace:
+ # equipPackType = ShareDefine.rptZhuXianEquip
+ # stonePackType = ShareDefine.rptZhuXianItem
+ # placeIndex = EquipZhuXian.GetZhuXianEquipIndexByPlace(equipPlace)
+ # else:
+ equipPackType = IPY_GameWorld.rptEquip
+ stonePackType = IPY_GameWorld.rptItem
+ placeIndex = equipPlace
+ return equipPackType, stonePackType, placeIndex
+
+
+# //A3 04 宝石镶嵌或替换 #tagCMEquipEnchase
+# struct tagCMEquipEnchase
+# {
# tagHead Head;
# BYTE EquipIndex; //装备位索引
# BYTE StoneIndex; //宝石所在玩家物品背包索引
# BYTE HoleIndex; //选择的孔索引
-#};
+# };
def OnEquipEnchase(playerIndex, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
playerID = curPlayer.GetPlayerID()
-
+
# 验证背包类型合法性
- equipIndex = clientData.EquipIndex
+ equipPackIndex = clientData.EquipIndex
stoneIndex = clientData.StoneIndex
holeIndex = clientData.HoleIndex
-
- GameWorld.DebugLog("宝石镶嵌: equipIndex=%s,stoneIndex=%s,holeIndex=%s" % (equipIndex, stoneIndex, holeIndex), playerID)
-
- #获得装备位装备实例
- equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
- curEquip = equipPack.GetAt(equipIndex)
-
+
+ GameWorld.DebugLog("宝石镶嵌: equipPackIndex=%s,stoneIndex=%s,holeIndex=%s" % (equipPackIndex, stoneIndex, holeIndex),
+ playerID)
+ equipPackType, stonePackType, placeIndex = GetPackTypeByEquipPlace(equipPackIndex)
+
+ # 获得装备位装备实例
+ equipPack = curPlayer.GetItemManager().GetPack(equipPackType)
+ curEquip = equipPack.GetAt(placeIndex)
+
if not ItemCommon.CheckItemCanUse(curEquip):
GameWorld.Log("目标装备为空或不可用,无法镶嵌!", playerID)
return
-
- #获得宝石实例
- itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+
+ # 获得宝石实例
+ itemPack = curPlayer.GetItemManager().GetPack(stonePackType)
curStone = itemPack.GetAt(stoneIndex)
-
- if not ItemCommon.CheckItemCanUse(curStone):
+
+ if not ItemCommon.CheckItemCanUse(curStone) or ItemControler.GetIsAuctionItem(curStone):
GameWorld.Log("目标宝石为空或不可用,无法镶嵌!", playerID)
return
-
+
stoneItemID = curStone.GetItemTypeID()
isBind = curStone.GetIsBind()
curStoneEff = curStone.GetEffectByIndex(0)
curEffID = curStoneEff.GetEffectID()
if curEffID != ChConfig.Def_Effect_EquipStone:
- GameWorld.Log("不是宝石,无法镶嵌!stoneIndex=%s,stoneItemID=%s,curEffID=%s != %s"
+ GameWorld.Log("不是宝石,无法镶嵌!stoneIndex=%s,stoneItemID=%s,curEffID=%s != %s"
% (stoneIndex, stoneItemID, curEffID, ChConfig.Def_Effect_EquipStone), playerID)
return
-
+
stoneEffType = curStoneEff.GetEffectValue(0)
stoneCanPlaceList = IpyGameDataPY.GetFuncEvalCfg("GemType%s" % stoneEffType, 1)
-
- if equipIndex not in stoneCanPlaceList:
- GameWorld.Log("该宝石不可镶嵌在该装备位!stoneItemID=%s,stoneEffType=%s,stoneCanPlaceList=%s,equipPlace=%s"
- % (stoneItemID, stoneEffType, stoneCanPlaceList, equipIndex), playerID)
+ ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex': equipPackIndex})
+ if not ipyData:
return
-
- equipClassLV = ItemCommon.GetItemClassLV(curEquip)
- if not __CheckStoneHoleCanUse(curPlayer, equipClassLV, holeIndex):
+ classLV = ipyData.GetClassLV()
+ if ipyData.GetEquipPlace() not in stoneCanPlaceList:
+ GameWorld.Log("该宝石不可镶嵌在该装备位!stoneItemID=%s,stoneEffType=%s,stoneCanPlaceList=%s,equipPackIndex=%s"
+ % (stoneItemID, stoneEffType, stoneCanPlaceList, equipPackIndex), playerID)
return
-
+
+ equipStar = ChEquip.GetEquipPartStarByRank(curPlayer, placeIndex, curEquip)
+ if not __CheckStoneHoleCanUse(curPlayer, equipStar, holeIndex, equipPackType):
+ return
+
# 扣除宝石
- ItemCommon.DelItem(curPlayer, curStone, 1, True, ChConfig.ItemDel_EquipEnchase, {"EquipPlace":equipIndex, "HoleIndex":holeIndex})
-
+ ItemCommon.DelItem(curPlayer, curStone, 1, True, ChConfig.ItemDel_EquipEnchase,
+ {"equipPackIndex": equipPackIndex, "HoleIndex": holeIndex})
+
isBind = 1 if isBind else 0
-
+
# 变更宝石孔宝石信息
- __DoChangeEquipHoleStone(curPlayer, equipIndex, holeIndex, stoneItemID, isBind, "EquipStone", True)
-
-# #镶嵌成功
-# if not curEquip.GetIsBind():
-# ItemControler.SetItemIsBind(curEquip, True)
-
+ __DoChangeEquipHoleStone(curPlayer, equipPackIndex, holeIndex, stoneItemID, isBind, "EquipStone", True)
+
+ # #镶嵌成功
+ # if not curEquip.GetIsBind():
+ # ItemControler.SetItemIsBind(curEquip, True)
+
# 刷新属性
- RefreshAttrByStoneAction(curPlayer, IPY_GameWorld.rptEquip, True)
-
- #同步客户端
- Sycn_StoneHoleInfo(curPlayer, [equipIndex])
- #成就
+ RefreshAttrByStoneAction(curPlayer, equipPackType, True, classLV)
+
+ # 同步客户端
+ Sycn_StoneHoleInfo(curPlayer, [equipPackIndex])
+ # 成就
DoStoneSuccess(curPlayer)
+
+ EventShell.EventRespons_InlayStone(curPlayer)
return
+
def DoStoneSuccess(curPlayer):
PlayerSuccess.ResetSuccessByType(curPlayer, ShareDefine.SuccType_InlayStone1)
@@ -175,80 +239,100 @@
packType = IPY_GameWorld.rptEquip
playerEquip = curPlayer.GetItemManager().GetPack(packType)
for equipIndex in xrange(playerEquip.GetCount()):
- if equipIndex not in ShareDefine.RoleEquipType :
+ if equipIndex not in ShareDefine.RoleEquipType:
continue
for holeIndex in holeIndexList:
-
+
curGemID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)[0]
if curGemID == 0:
continue
curGem = gameData.GetItemByTypeID(curGemID)
if not curGem:
- continue
-
+ continue
+
gemEffect = curGem.GetEffectByIndex(0)
gemType, gemLV = gemEffect.GetEffectValue(0), gemEffect.GetEffectValue(1)
- if gemType == 1:#生命宝石
+ if gemType == 1: # 生命宝石
PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_InlayStone1, 1, [gemLV])
- elif gemType == 2:#毁灭宝石
+ elif gemType == 2: # 毁灭宝石
PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_InlayStone2, 1, [gemLV])
-
+
totalStoneLV += gemLV
-
+
# 记录开服活动宝石总等级
OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_StoneLV, totalStoneLV)
PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_StoneTotalLV, totalStoneLV)
+ PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Stone, totalStoneLV, False, True)
return
-#//A3 05 宝石摘取 #tagCMEquipStonePick
-#struct tagCMEquipStonePick
-#{
+
+# //A3 05 宝石摘取 #tagCMEquipStonePick
+# struct tagCMEquipStonePick
+# {
# tagHead Head;
# BYTE EquipIndex; //装备位在背包中索引
# BYTE HoleIndex; //装备位的孔索引
-#};
+# };
def OnEquipStonePick(playerIndex, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
playerID = curPlayer.GetPlayerID()
# 验证背包类型合法性
- equipIndex = clientData.EquipIndex
+ equipPackIndex = clientData.EquipIndex
holeIndex = clientData.HoleIndex
- GameWorld.DebugLog("宝石摘除: equipIndex=%s,holeIndex=%s" % (equipIndex, holeIndex), playerID)
-
- #获得装备位装备实例
- equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
- curEquip = equipPack.GetAt(equipIndex)
-
+ GameWorld.DebugLog("宝石摘除: equipPackIndex=%s,holeIndex=%s" % (equipPackIndex, holeIndex), playerID)
+
+ equipPackType, stonePackType, placeIndex = GetPackTypeByEquipPlace(equipPackIndex)
+ # 获得装备位装备实例
+ equipPack = curPlayer.GetItemManager().GetPack(equipPackType)
+ curEquip = equipPack.GetAt(placeIndex)
+
if not ItemCommon.CheckItemCanUse(curEquip):
GameWorld.Log("目标装备为空或不可用,无法镶嵌!", playerID)
return
-
- #验证背包空间
- if not ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem, True):
+
+ # 验证背包空间
+ if not ItemCommon.CheckPackHasSpace(curPlayer, stonePackType, True):
return
-
+
# 验证宝石
- stoneID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)[0]
-
+ stoneID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex)[0]
+
if not stoneID:
GameWorld.DebugLog("孔为空或不存在宝石!")
return
-
- __DoChangeEquipHoleStone(curPlayer, equipIndex, holeIndex, 0, 0, "StonePick", True)
-
+
+ ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex': equipPackIndex})
+ if not ipyData:
+ return
+ classLV = ipyData.GetClassLV()
+
+ __DoChangeEquipHoleStone(curPlayer, equipPackIndex, holeIndex, 0, 0, "StonePick", True)
+
# 刷新属性
- RefreshAttrByStoneAction(curPlayer, IPY_GameWorld.rptEquip, False)
-
- #同步客户端
- Sycn_StoneHoleInfo(curPlayer, [equipIndex])
-
- totalStoneLV = 0
+ RefreshAttrByStoneAction(curPlayer, equipPackType, False, classLV)
+
+ # 同步客户端
+ Sycn_StoneHoleInfo(curPlayer, [equipPackIndex])
+
+ totalStoneLV = GetTotalStoneLV(curPlayer)
+ # 记录开服活动宝石总等级
+ OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_StoneLV, totalStoneLV)
+ PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Stone, totalStoneLV, False, True)
+ return
+
+
+def GetTotalStoneLV(curPlayer):
+ ##宝石总等级
+ return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalStoneLV)
+
+
+def GetStoneCntByLV(curPlayer, stoneLV):
+ ##指定等级的宝石数量
+ cnt = 0
holeIndexList = GetAllEquipPlaceHoleIndex()
+ equipIndexList = GetAllStoneEquipIndexList()
gameData = GameWorld.GetGameData()
- playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
- for equipIndex in xrange(playerEquip.GetCount()):
- if equipIndex not in ShareDefine.RoleEquipType :
- continue
+ for equipIndex in equipIndexList:
for holeIndex in holeIndexList:
curGemID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)[0]
if curGemID == 0:
@@ -257,311 +341,330 @@
if not curGem:
continue
gemLV = curGem.GetEffectByIndex(0).GetEffectValue(1)
- totalStoneLV += gemLV
-
- # 记录开服活动宝石总等级
- OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_StoneLV, totalStoneLV)
- return
+ if gemLV >= stoneLV:
+ cnt += 1
+ return cnt
-#// A3 06 宝石升级 #tagCMEquipStoneUpgrade
-#struct tagCMEquipStoneUpgrade
-#{
+# // A3 06 宝石升级 #tagCMEquipStoneUpgrade
+# struct tagCMEquipStoneUpgrade
+# {
# tagHead Head;
# BYTE EquipIndex; //装备位在装备背包中的索引
# BYTE HoleIndex; //装备位中宝石孔索引
# BYTE UpWay; //升级方式 0:仙玉 1:宝石
-#};
+# };
def OnEquipStoneUpgrade(playerIndex, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
playerID = curPlayer.GetPlayerID()
-
+
# 验证背包类型合法性
- equipIndex = clientData.EquipIndex
+ equipPackIndex = clientData.EquipIndex
holeIndex = clientData.HoleIndex
upWay = clientData.UpWay
- GameWorld.DebugLog("宝石升级: equipPlace=%s,holeIndex=%s" % (equipIndex, holeIndex), playerID)
-
- #获得装备位装备实例
- equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
- curEquip = equipPack.GetAt(equipIndex)
-
+ GameWorld.DebugLog("宝石升级: equipPackIndex=%s,holeIndex=%s" % (equipPackIndex, holeIndex), playerID)
+ equipPackType, stonePackType, placeIndex = GetPackTypeByEquipPlace(equipPackIndex)
+ # 获得装备位装备实例
+ equipPack = curPlayer.GetItemManager().GetPack(equipPackType)
+ curEquip = equipPack.GetAt(placeIndex)
+
if not ItemCommon.CheckItemCanUse(curEquip):
GameWorld.Log("目标装备为空或不可用,无法镶嵌!", playerID)
return
-
- #升级宝石ID
- stoneID, stoneIsBind = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)
+
+ # 升级宝石ID
+ stoneID, stoneIsBind = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex)
if stoneID == 0:
- GameWorld.DebugLog("孔为空或不存在宝石!")
- return
- stoneItemData = GameWorld.GetGameData().GetItemByTypeID(stoneID)
+ GameWorld.DebugLog("孔为空或不存在宝石!")
+ return
+ stoneItemData = GameWorld.GetGameData().GetItemByTypeID(stoneID)
stoneItemID = stoneItemData.GetItemTypeID()
curStoneEff = stoneItemData.GetEffectByIndex(0)
curEffID = curStoneEff.GetEffectID()
if curEffID != ChConfig.Def_Effect_EquipStone:
- GameWorld.Log("不是宝石,无法升级!stoneIndex=%s,stoneItemID=%s,curEffID=%s"
+ GameWorld.Log("不是宝石,无法升级!stoneIndex=%s,stoneItemID=%s,curEffID=%s"
% (holeIndex, stoneItemID, curEffID), playerID)
- return
+ return
stoneEffType = curStoneEff.GetEffectValue(0)
level = curStoneEff.GetEffectValue(1)
upgradeStoneID = curStoneEff.GetEffectValue(2)
-
- stoneTypeItemIDDict = IpyGameDataPY.GetFuncEvalCfg("GemUpCostFormula", 1)
- GameWorld.DebugLog("stoneEffType=%s,stoneTypeItemIDDict=%s,level=%s,upgradeStoneID=%s"
- % (stoneEffType, stoneTypeItemIDDict, level, upgradeStoneID))
- if stoneEffType not in stoneTypeItemIDDict:
- return
- stoneTypeItemID = stoneTypeItemIDDict[stoneEffType]
-
+
+ GameWorld.DebugLog("stoneEffType=%s,level=%s,upgradeStoneID=%s" % (stoneEffType, level, upgradeStoneID))
+
if not upgradeStoneID:
GameWorld.Log("该宝石已是最大级,不能升级!stoneIndex=%s,stoneItemID=%s,curEffID=%s,upgradeStoneID=%s"
% (holeIndex, stoneItemID, curEffID, upgradeStoneID), playerID)
return
- needCount = IpyGameDataPY.GetFuncCfg("GemUpCostFormula", 2) # 合成下一级所需宝石个数
+ needCount = IpyGameDataPY.GetFuncCfg("GemUpCostFormula", 2) # 合成下一级所需宝石个数
if not needCount:
return
- if upWay == 0: #仙玉
+ ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex': equipPackIndex})
+ if not ipyData:
+ return
+ # 额外材料
+ extraItemInfoDict = IpyGameDataPY.GetFuncEvalCfg("GemUpCostFormula", 3, {})
+ classLV = ipyData.GetClassLV()
+ if upWay == 0: # 仙玉
+ stoneTypeItemIDDict = IpyGameDataPY.GetFuncEvalCfg("GemUpCostFormula", 1)
+ if stoneEffType not in stoneTypeItemIDDict:
+ return
+ stoneTypeItemID = stoneTypeItemIDDict[stoneEffType]
unitPrice = ItemCommon.GetShopItemPrice(stoneTypeItemID, IPY_GameWorld.TYPE_Price_Gold_Money)
if not unitPrice:
return
costCount = pow(needCount, level - 1) * (needCount - 1)
costGold = costCount * unitPrice
+ # 额外材料
+ costExtraItemDict = {}
+ i, cnt =0, 1
+ for lv in xrange(level+1, 1, -1):
+ cnt =1 if i is 0 else pow(needCount, i-1)
+ i+=1
+ extraItemInfo = extraItemInfoDict.get(str(lv))
+ if extraItemInfo:
+ extraItemID, extraItemCnt = extraItemInfo
+ extraItemPrice = ItemCommon.GetShopItemPrice(extraItemID, IPY_GameWorld.TYPE_Price_Gold_Money)
+ if not extraItemPrice:
+ return
+ costGold += extraItemPrice * extraItemCnt * cnt
+ costExtraItemDict[extraItemID] = costExtraItemDict.get(extraItemID, 0) + extraItemCnt * cnt
if costGold <= 0:
return
- infoDict = {"StoneItemID":stoneItemID, "CurStoneIDLV":level, "UpgradeStoneID":upgradeStoneID, "CostCount":costCount, "UnitPrice":unitPrice}
- if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold, ChConfig.Def_Cost_EquipStone, infoDict):
+ infoDict = {"StoneItemID": stoneItemID, "CurStoneIDLV": level, "UpgradeStoneID": upgradeStoneID,
+ "CostCount": costCount, "UnitPrice": unitPrice, 'costExtraItemDict':costExtraItemDict}
+
+ if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold,
+ ChConfig.Def_Cost_EquipStone, infoDict):
GameWorld.DebugLog("仙玉不足!costGold=%s" % costGold)
return
else:
- #同级宝石
- costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, stoneItemID)
- if bindCnt + unBindCnt < needCount-1:
- GameWorld.DebugLog("同级宝石不足 %s!" % (needCount-1))
- return
- if stoneIsBind:
- costIndexList = (costItemIndexList[0]+costItemIndexList[1])[:2]
- else:
- costIndexList = (costItemIndexList[1]+costItemIndexList[0])[:2]
- itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
- hasBind = ItemCommon.ReduceItem(curPlayer, itemPack, costIndexList, needCount-1, False, ChConfig.ItemDel_StoneUpgrade,
- {"EquipPlace":equipIndex, "HoleIndex":holeIndex})
- if hasBind:
- stoneIsBind = True
-
-
- __DoChangeEquipHoleStone(curPlayer, equipIndex, holeIndex, upgradeStoneID, stoneIsBind, "StoneUpgrade", False)
-
+ costItemDict = {stoneItemID:needCount - 1}
+ if str(level + 1) in extraItemInfoDict:
+ extraItemID, extraItemCnt = extraItemInfoDict[str(level + 1)]
+ costItemDict[extraItemID] = extraItemCnt
+ itemPack = curPlayer.GetItemManager().GetPack(stonePackType)
+ delItemList = []
+ for itemID, itemCnt in costItemDict.items():
+ hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(itemID, itemPack, itemCnt)
+ if not hasEnough:
+ GameWorld.DebugLog("材料不足 itemID=%s!,needCnt=%s" % (itemID, itemCnt))
+ return
+ delItemList.append([itemIndexList, itemCnt])
+ for delItemIndexList, delCnt in delItemList:
+ ItemCommon.ReduceItem(curPlayer, itemPack, delItemIndexList, delCnt, False,
+ ChConfig.ItemDel_StoneUpgrade,
+ {"equipPackIndex": equipPackIndex, "HoleIndex": holeIndex})
+
+
+ __DoChangeEquipHoleStone(curPlayer, equipPackIndex, holeIndex, upgradeStoneID, False, "StoneUpgrade", False)
+
# 刷新属性
- RefreshAttrByStoneAction(curPlayer, IPY_GameWorld.rptEquip, False)
-
- #同步客户端
- Sycn_StoneHoleInfo(curPlayer, [equipIndex])
-
+ RefreshAttrByStoneAction(curPlayer, equipPackType, False, classLV)
+
+ # 同步客户端
+ Sycn_StoneHoleInfo(curPlayer, [equipPackIndex])
+
DoStoneSuccess(curPlayer)
return
-def __CheckStoneHoleCanUse(curPlayer, equipClassLV, holeIndex):
+def __CheckStoneHoleCanUse(curPlayer, equipStar, holeIndex, equipPackType):
##验证孔合法性
-
+
holeIndexList = GetAllEquipPlaceHoleIndex()
if holeIndex not in holeIndexList:
GameWorld.Log("镶嵌孔索引错误!holeIndex=%s, holeIndexList=%s" % (holeIndex, holeIndexList))
return False
-
- openCommHoleCnt = 0 # 已经开放装备常规孔数
- gemOpenClassLVList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
- for holeCnt, openClassLV in enumerate(gemOpenClassLVList, 1):
- if equipClassLV >= openClassLV:
+
+ openCommHoleCnt = 0 # 已经开放装备常规孔数
+
+ gemOpenNeedStarList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
+ for holeCnt, openStar in enumerate(gemOpenNeedStarList, 1):
+ if equipStar >= openStar:
openCommHoleCnt = holeCnt
-
+
# VIP孔
if holeIndex >= ChConfig.Def_Stone_VipHole:
-
+
if openCommHoleCnt <= 0:
- GameWorld.Log("装备未开启任何普通宝石孔,无法开启VIP孔位! equipClassLV=%s,openCommHoleCnt=%s" % (equipClassLV, openCommHoleCnt))
+ GameWorld.Log("装备未开启任何普通宝石孔,无法开启VIP孔位! equipStar=%s,openCommHoleCnt=%s" % (equipStar, openCommHoleCnt))
return False
gemOpenVipList = IpyGameDataPY.GetFuncEvalCfg("GemOpenVip", 1)
-
- openVIPHoleCnt = 0 # 已经开放装备VIP孔数
+
+ openVIPHoleCnt = 0 # 已经开放装备VIP孔数
curVipLV = curPlayer.GetVIPLv()
- for holeCnt, vipLv in enumerate(gemOpenVipList, 1):
- if curVipLV >= vipLv:
+ for holeCnt, vipLv in enumerate(gemOpenVipList, 1):
+ if curVipLV >= vipLv:
openVIPHoleCnt = holeCnt
-
+
if holeIndex >= openVIPHoleCnt + ChConfig.Def_Stone_VipHole:
- GameWorld.Log("装备VIP宝石孔未开放!curVipLV=%s,holeIndex=%s,openVIPHoleCnt=%s"
+ GameWorld.Log("装备VIP宝石孔未开放!curVipLV=%s,holeIndex=%s,openVIPHoleCnt=%s"
% (curVipLV, holeIndex, openVIPHoleCnt), curPlayer.GetPlayerID())
return False
-
- #不限制是否过期
- #if not PlayerVip.GetCurVIPTime(curPlayer):
+
+ # 不限制是否过期
+ # if not PlayerVip.GetCurVIPTime(curPlayer):
# GameWorld.Log("VIP已过期,无法使用VIP宝石孔!", curPlayer.GetPlayerID())
# return False
-
+
# 常规孔
elif holeIndex >= openCommHoleCnt:
- GameWorld.Log("该装备宝石孔为开放!equipClassLV=%s,holeIndex=%s,openCommHoleCnt=%s"
- % (equipClassLV, holeIndex, openCommHoleCnt), curPlayer.GetPlayerID())
+ GameWorld.Log("该装备宝石孔为开放!equipStar=%s,holeIndex=%s,openCommHoleCnt=%s"
+ % (equipStar, holeIndex, openCommHoleCnt), curPlayer.GetPlayerID())
return False
-
+
return True
-def __DoChangeEquipHoleStone(curPlayer, equipIndex, holeIndex, changeStoneID, isBind, eventName, isPickoff):
+
+def __DoChangeEquipHoleStone(curPlayer, equipPackIndex, holeIndex, changeStoneID, isBind, eventName, isPickoff):
## 变更玩家装备孔宝石
-
- #获得装备位孔索引宝石存储信息
- stoneID, stoneIsBind = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)
- #保存装备位孔位上宝石ID和绑定状态
- SetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex, changeStoneID, isBind)
-
+
+ # 获得装备位孔索引宝石存储信息
+ stoneID, stoneIsBind = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex)
+ # 保存装备位孔位上宝石ID和绑定状态
+ SetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex, changeStoneID, isBind)
+
if isPickoff and stoneID:
+ equipPackType, stonePackType, placeIndex = GetPackTypeByEquipPlace(equipPackIndex)
itemCount = 1
# 摘除的宝石都绑定
- if ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem):
- ItemControler.GivePlayerItem(curPlayer, stoneID, itemCount, True if stoneIsBind else False,
- [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere],
- event=[ChConfig.ItemGive_StonePickoff, False, {"EquipPlace":equipIndex, "HoleIndex":holeIndex}])
+ if ItemCommon.CheckPackHasSpace(curPlayer, stonePackType):
+ ItemControler.GivePlayerItem(curPlayer, stoneID, itemCount, 0,
+ [stonePackType],
+ event=[ChConfig.ItemGive_StonePickoff, False,
+ {"equipPackIndex": equipPackIndex, "HoleIndex": holeIndex}])
else:
PlayerControl.SendMailByKey("GemToPlayer", [curPlayer.GetPlayerID()], [[stoneID, 1, stoneIsBind]])
-
- DataRecordPack.DR_StoneItemChange(curPlayer, eventName, {"holeIndex":holeIndex, "stoneID":stoneID})
+
+ DataRecordPack.DR_StoneItemChange(curPlayer, eventName,
+ {'equipPackIndex': equipPackIndex, "holeIndex": holeIndex, "stoneID": stoneID,
+ 'changeStoneID': changeStoneID})
+ EventShell.EventRespons_StoneChange(curPlayer)
return
-def RefreshAttrByStoneAction(curPlayer, packType, isNeedNotify):
+def RefreshAttrByStoneAction(curPlayer, packType, isNeedNotify, classLV):
## 宝石刷新属性
# 装备等级改变,判断是否为玩家身上的装备,如果是的话刷新玩家属性
- if packType in [IPY_GameWorld.rptEquip, IPY_GameWorld.rptHorseEquip]:
- #先刷装备BUFF 再计算属性
+ if packType in [IPY_GameWorld.rptEquip]:
+ # 先刷装备BUFF 再计算属性
if isNeedNotify:
curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrActivatyNotify, ChConfig.Def_AttrActivatyNotify_Stone)
- ChEquip.RefreshPlayerEquipAttribute(curPlayer)
-
- #刷新所有属性
+ ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV)
+
+ # 刷新所有属性
playControl = PlayerControl.PlayerControl(curPlayer)
playControl.RefreshPlayerAttrState()
-
+ # elif packType == ShareDefine.rptZhuXianEquip:
+ # EquipZhuXian.RefreshZhuXianAttr(curPlayer)
return
-def DoMoveEquipStone(curPlayer, equipIndex):
+def DoMoveEquipStone(curPlayer, equipPackIndex):
###替换装备时宝石转移
- equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
- curEquip = equipPack.GetAt(equipIndex)
+ equipPackType, stonePackType, placeIndex = GetPackTypeByEquipPlace(equipPackIndex)
+ equipPack = curPlayer.GetItemManager().GetPack(equipPackType)
+ curEquip = equipPack.GetAt(placeIndex)
if not ItemCommon.CheckItemCanUse(curEquip):
return
-
- #获得装备阶级孔信息
- gemOpenClassLVList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
- maxEquipHoleCnt = len(gemOpenClassLVList) # 最大装备阶级开放孔数
-
- openEquipHoleCnt = 0 # 已经开放孔数
- equipClassLV = ItemCommon.GetItemClassLV(curEquip)
- for holeCnt, openClassLV in enumerate(gemOpenClassLVList, 1):
- if equipClassLV >= openClassLV:
+
+ # 获得装备星级孔信息
+ gemOpenNeedStarList = IpyGameDataPY.GetFuncEvalCfg("GemOpen", 1)
+ maxEquipHoleCnt = len(gemOpenNeedStarList) # 最大装备星级开放孔数
+
+ openEquipHoleCnt = 0 # 已经开放孔数
+ partStar = ChEquip.GetEquipPartStarByRank(curPlayer, equipPackIndex, curEquip)
+ for holeCnt, openStar in enumerate(gemOpenNeedStarList, 1):
+ if partStar >= openStar:
openEquipHoleCnt = holeCnt
-
- #需要拆卸宝石的孔列表
+
+ # 需要拆卸宝石的孔列表
pickoffHoleList = []
-
- #判断装备阶级宝石是否拆卸
- for holeIndex in xrange(maxEquipHoleCnt):
+
+ # 判断装备阶级宝石是否拆卸
+ for holeIndex in xrange(maxEquipHoleCnt):
if holeIndex < openEquipHoleCnt:
continue
- curGemID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)[0]
+ curGemID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex)[0]
if curGemID == 0:
- continue
- pickoffHoleList.append([equipIndex, holeIndex])
-
- #没有开启普通装备孔,需摘除VIP孔
+ continue
+ pickoffHoleList.append([equipPackIndex, holeIndex])
+
+ # 没有开启普通装备孔,需摘除VIP孔
if not openEquipHoleCnt:
- #获得VIP等级孔信息
+ # 获得VIP等级孔信息
gemOpenVipList = IpyGameDataPY.GetFuncEvalCfg("GemOpenVip", 1)
- maxVipHoleCnt = len(gemOpenVipList)# 最大VIP开放孔数
- #判断VIP等级孔信息
- for holeIndex in xrange(ChConfig.Def_Stone_VipHole, ChConfig.Def_Stone_VipHole + maxVipHoleCnt):
- curGemID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)[0]
- if curGemID == 0:
+ maxVipHoleCnt = len(gemOpenVipList) # 最大VIP开放孔数
+ # 判断VIP等级孔信息
+ for holeIndex in xrange(ChConfig.Def_Stone_VipHole, ChConfig.Def_Stone_VipHole + maxVipHoleCnt):
+ curGemID = GetEquipIndexStoneIDAndIsBand(curPlayer, equipPackIndex, holeIndex)[0]
+ if curGemID == 0:
continue
- pickoffHoleList.append([equipIndex, holeIndex])
-
+ pickoffHoleList.append([equipPackIndex, holeIndex])
+
# 脱装备的外层刷属性, 这里不刷
- __DoSysPickoffEquipStone(curPlayer, pickoffHoleList, "EquipChange", False)
+ __DoSysPickoffEquipStone(curPlayer, equipPackType, stonePackType, pickoffHoleList, "EquipChange", False)
return
+
def OnVIPTimeOut(curPlayer):
## VIP到期处理
- #过期一样有效,屏蔽该逻辑
- #===============================================================================================
- # #获得vip等级孔信息
- # gemOpenVipList = IpyGameDataPY.GetFuncEvalCfg("GemOpenVip", 1)
- # maxVipHoleCnt = len(gemOpenVipList)# 最大Vip开放孔数
- #
- # #获得所有可镶嵌宝石装备位
- # stoneCanPlaceList = GetAllStoneEquipIndexList()
- # #需要拆卸宝石的孔列表
- # pickoffHoleList = []
- # for equipIndex in stoneCanPlaceList:
- # for holeIndex in xrange(ChConfig.Def_Stone_VipHole, ChConfig.Def_Stone_VipHole + maxVipHoleCnt):
- # stoneInfo = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)
- # if not stoneInfo[0]:
- # continue
- # pickoffHoleList.append([equipIndex, holeIndex])
- #
- # __DoSysPickoffEquipStone(curPlayer, pickoffHoleList, "VIPChange", True)
- #===============================================================================================
- return
+ # 过期一样有效,屏蔽该逻辑
+ return
-def __DoSysPickoffEquipStone(curPlayer, pickoffHoleList, eventName, isRefreshAttr):
+
+def __DoSysPickoffEquipStone(curPlayer, equipPackType, stonePackType, pickoffHoleList, eventName, isRefreshAttr):
## 系统摘除宝石
-
+
if not pickoffHoleList:
return
-
+
GameWorld.DebugLog("系统摘除宝石: %s,pickoffHoleList=%s" % (eventName, pickoffHoleList), curPlayer.GetPlayerID())
-
+
equipIndexList = []
stoneCount = len(pickoffHoleList)
- packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, stoneCount)
+ packSpace = ItemCommon.GetItemPackSpace(curPlayer, stonePackType, stoneCount)
if packSpace >= stoneCount:
for equipIndex, holeIndex in pickoffHoleList:
__DoChangeEquipHoleStone(curPlayer, equipIndex, holeIndex, 0, 0, eventName, True)
if equipIndex not in equipIndexList:
equipIndexList.append(equipIndex)
else:
- #邮件物品信息列表
+ # 邮件物品信息列表
mailItemInfoList = []
for equipIndex, holeIndex in pickoffHoleList:
stoneInfo = GetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex)
mailItemInfoList.append([stoneInfo[0], 1, stoneInfo[1]])
SetEquipIndexStoneIDAndIsBand(curPlayer, equipIndex, holeIndex, 0, 0)
- DataRecordPack.DR_StoneItemChange(curPlayer, eventName, {"holeIndex":holeIndex, "stoneID":stoneInfo[0]})
+ DataRecordPack.DR_StoneItemChange(curPlayer, eventName,
+ {'changeStoneID': 0, 'equipIndex': equipIndex, "holeIndex": holeIndex,
+ "stoneID": stoneInfo[0]})
if equipIndex not in equipIndexList:
equipIndexList.append(equipIndex)
PlayerControl.SendMailByKey("GemToPlayer", [curPlayer.GetPlayerID()], mailItemInfoList)
-
- if isRefreshAttr:
- RefreshAttrByStoneAction(curPlayer, IPY_GameWorld.rptEquip, False)
-
+
+ # 目前只有脱装备会触发,暂时屏蔽,由脱装备触发刷属性
+ # if isRefreshAttr:
+ # RefreshAttrByStoneAction(curPlayer, equipPackType, False)
+
if equipIndexList:
Sycn_StoneHoleInfo(curPlayer, equipIndexList)
return
+
def Sycn_StoneHoleInfo(curPlayer, equipIndexList=[]):
###同步客户端宝石信息
- #装备位所有孔位
+ # 装备位所有孔位
holeIndexList = GetAllEquipPlaceHoleIndex()
maxHoleCount = len(holeIndexList)
if not equipIndexList:
equipIndexList = GetAllStoneEquipIndexList()
-
+
sendPack = ChPyNetSendPack.tagMCStoneInfo()
sendPack.InfoList = []
for equipIndex in equipIndexList:
stoneMsg = ChPyNetSendPack.tagMCStoneMsg()
stoneMsg.EquipPlace = equipIndex
- stoneMsg.MaxStoneCount = maxHoleCount
+ stoneMsg.MaxStoneCount = maxHoleCount
stoneMsg.StoneInfo = GetEquipIndexStoneIDList(curPlayer, equipIndex)
holeStoneBindList = []
for holeIndex in holeIndexList:
@@ -569,7 +672,6 @@
holeStoneBindList.append(isBind)
stoneMsg.StoneBind = holeStoneBindList
sendPack.InfoList.append(stoneMsg)
- sendPack.EquipCount = len(sendPack.InfoList)
+ sendPack.EquipCount = len(sendPack.InfoList)
NetPackCommon.SendFakePack(curPlayer, sendPack)
return
-
--
Gitblit v1.8.0