From c1c791372b63ff14d0ddd0ef85386e374603d1ff Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 15 七月 2024 19:47:37 +0800 Subject: [PATCH] 10202 【越南】【香港】【主干】【砍树】聚魂(寻宝修改:寻宝设定单独开表;去除免费寻宝x次必出逻辑,免费次数也算常规次数;免费次数去除时间恢复,改为过天重置;每x次必出改为每种类型独立配置;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py | 165 ++++++++++++++++++++++++++---------------------------- 1 files changed, 79 insertions(+), 86 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py index 2ba1cad..9f0472a 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py @@ -45,15 +45,6 @@ def DoTreasureOpen(curPlayer): ## 寻宝开启 - - # 设置免费寻宝 - treasureTypeList = GetTreasureTypeList() - for treasureType in treasureTypeList: - freeTimeCDList = IpyGameDataPY.GetFuncEvalCfg("TreasureSet1%s" % treasureType, 4) - for i, minute in enumerate(freeTimeCDList): - if not minute: - continue - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeTime % (treasureType, i), int(time.time()) - minute * 60) Sync_TreasureInfo(curPlayer) return @@ -61,6 +52,20 @@ if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Treasure): return Sync_TreasureInfo(curPlayer) + return + +def OnDay(curPlayer): + syncTypeList = [] + ipyDataMgr = IpyGameDataPY.IPY_Data() + for i in xrange(ipyDataMgr.GetTreasureSetCount()): + ipyData = ipyDataMgr.GetTreasureSetByIndex(i) + treasureType = ipyData.GetTreasureType() + if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeCount % (treasureType)): + continue + syncTypeList.append(treasureType) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeCount % (treasureType), 0) + if syncTypeList: + Sync_TreasureInfo(curPlayer, syncTypeList) return #// A5 68 请求寻宝 #tagCMRequestTreasure @@ -79,13 +84,14 @@ treasureType = clientData.TreasureType treasureIndex = clientData.TreasureIndex costType = clientData.CostType - isFreeType = 1 if costType == 1 else 0 + GameWorld.DebugLog("玩家寻宝: treasureType=%s,treasureIndex=%s,costType=%s,playerLV=%s" % (treasureType, treasureIndex, costType, playerLV), playerID) - TreasureSet1 = "TreasureSet1%s" % treasureType - TreasureSet2 = "TreasureSet2%s" % treasureType - treasureCountList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 1) # 寻宝获得个数列表 + setIpyData = IpyGameDataPY.GetIpyGameData("TreasureSet", treasureType) + if not setIpyData: + return + treasureCountList = setIpyData.GetTreasureCountList() # 寻宝获得个数列表 if not treasureCountList: GameWorld.DebugLog("没有寻宝次数列表配置!", playerID) return @@ -97,37 +103,31 @@ GameWorld.DebugLog("没有寻宝次数配置!", playerID) return - packType = ShareDefine.rptTreasure - #if treasureType == 2: - # packType = ShareDefine.rptRune - if treasureType in [TreasureType_GatherTheSoul]: - packType = IPY_GameWorld.rptItem - + packType = setIpyData.GetPackType() if not ItemCommon.CheckPackHasSpace(curPlayer, packType, True): GameWorld.DebugLog("对应寻宝背包没有空格子!packType=%s" % packType, playerID) return # 免费次数 if costType == 1: - freeCountCDList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 4) # 免费次数CD时间列表, 分 - freeCountCD = freeCountCDList[treasureIndex] * 60 - if not freeCountCD: + dailyFreeCount = setIpyData.GetDailyFreeCount() + if not dailyFreeCount: GameWorld.ErrLog("该寻宝类型索引不支持免费次数寻宝!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID) return - curTime = int(time.time()) - freeTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeTime % (treasureType, treasureIndex)) - if curTime - freeTime < freeCountCD: - GameWorld.DebugLog("免费寻宝CD时间未到,无法使用免费寻宝!curTime=%s,freeTime=%s, %s < freeCountCD(%s)" - % (curTime, freeTime, curTime - freeTime, freeCountCD), playerID) + freeCountToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeCount % (treasureType)) + updFreeCountToday = freeCountToday + treasureCount + if updFreeCountToday > dailyFreeCount: + GameWorld.DebugLog("今日免费次数不足,无法使用免费寻宝! freeCountToday=%s + %s > %s" % (freeCountToday, treasureCount, dailyFreeCount), playerID) return # 寻宝道具, 目前默认消耗1个 elif costType == 2: - costItemList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 3) # 消耗道具物品ID列表 - if not costItemList: + costItemID = setIpyData.GetCostItemID() + costItemList = setIpyData.GetCostItemCountList() # 消耗道具物品ID列表 + if not costItemID or not costItemList or treasureIndex >= len(costItemList): GameWorld.ErrLog("该寻宝类型索引不支持消耗道具寻宝!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID) return - costItemID, costItemNeedCount = costItemList[treasureIndex] + costItemNeedCount = costItemList[treasureIndex] if not costItemID or not costItemNeedCount: return costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID) @@ -148,11 +148,13 @@ # 仙玉寻宝 else: - costGoldList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 2) # 消耗货币列表 - costGoldType = IpyGameDataPY.GetFuncCfg(TreasureSet2, 4) # 消耗货币类型 + costGoldList = setIpyData.GetCostMoneyList() # 消耗货币列表 + costGoldType = setIpyData.GetCostMoneyType() # 消耗货币类型 + if not costGoldType or not costGoldList or treasureIndex >= len(costGoldList): + GameWorld.ErrLog("该寻宝类型索引不支持消耗货币寻宝!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID) + return costGold = costGoldList[treasureIndex] if not costGold: - GameWorld.ErrLog("该寻宝类型索引不支持消耗仙玉寻宝!treasureType=%s,treasureIndex=%s" % (treasureType, treasureIndex), playerID) return if not PlayerControl.HaveMoney(curPlayer, costGoldType, costGold): @@ -163,39 +165,40 @@ GameWorld.ErrLog("找不到该等级对应寻宝库配置!treasureType=%s,curLV=%s" % (treasureType, curPlayer.GetLV()), playerID) return - luckFormula = IpyGameDataPY.GetFuncCfg(TreasureSet2, 1) # 幸运物品概率公式 - addLuck = IpyGameDataPY.GetFuncEvalCfg(TreasureSet2, 2)[treasureIndex] # 增加幸运值 - maxLuck = IpyGameDataPY.GetFuncCfg(TreasureSet2, 3) # 满幸运值 + luckyGridNum = setIpyData.GetLuckyGridNum() # 幸运物品概率公式 + luckFormula = setIpyData.GetLuckyRateFormat() # 幸运物品概率公式 + addLuck = setIpyData.GetOnceLucky() * treasureCount # 增加幸运值 + maxLuck = setIpyData.GetFullLucky() # 满幸运值 curLuck = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (treasureType)) # 当前幸运值 updLuck = curLuck + addLuck - commItemRateList = GetUpdLuckyItemRateList(ipyData, curLuck, luckFormula, costType) # 常规产出物品格子饼图,幸运物品概率已变更 + commItemRateList = GetUpdLuckyItemRateList(ipyData, luckyGridNum, curLuck, luckFormula, costType) # 常规产出物品格子饼图,幸运物品概率已变更 - curTreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (treasureType, isFreeType)) # 当前已寻宝次数 + curTreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (treasureType)) # 当前已寻宝次数 updTreasureCount = curTreasureCount + treasureCount - beSureCountDict = ipyData.GetFreeGridItemRateList3() if isFreeType else ipyData.GetGridItemRateList3() # 第x次必出产出格子编号饼图 GameWorld.DebugLog("已经寻宝次数=%s,当前幸运=%s,commItemRateList=%s" % (curTreasureCount, curLuck, commItemRateList), playerID) - addScore = 0 if isFreeType else IpyGameDataPY.GetFuncEvalCfg(TreasureSet1, 5)[treasureIndex] # 增加积分 - ensureCount = IpyGameDataPY.GetFuncEvalCfg("TreasureSet", 1, {})[isFreeType] # 每多少次触发保底产出库 - ensureRateList = ipyData.GetFreeGridItemRateList2() if isFreeType else ipyData.GetGridItemRateList2() - goodGridNumList = [ipyData.GetLuckyGridNum()] # 好物品格子编号 (幸运物品 + 必出 + 保底) + + goodGridNumList = [luckyGridNum] # 好物品格子编号 (幸运物品 + 必出 + 保底) + beSureCountDict = ipyData.GetGridItemRateList3() # 第x次必出产出格子编号饼图 for gridRateList in beSureCountDict.values(): for gridRateInfo in gridRateList: goodGridNumList.append(gridRateInfo[1]) + ensureCount = setIpyData.GetEnsureCount() # 每多少次触发保底产出库 + ensureRateList = ipyData.GetGridItemRateList2() for gridRateInfo in ensureRateList: goodGridNumList.append(gridRateInfo[1]) - notifyGridNumList = IpyGameDataPY.GetFuncEvalCfg(TreasureSet2, 5) # 额外需要广播的格子,幸运必出、次数必出可不配置 + notifyGridNumList = setIpyData.GetNotifyGridNumList() # 额外需要广播的格子,幸运必出、次数必出可不配置 goodGridNumList += notifyGridNumList GameWorld.DebugLog("goodGridNumList=%s" % goodGridNumList, playerID) - + # 单抽产出优先级: 幸运物品 > 必出 > 保底 > 普通 # 连抽没有优先级限制,只要满足条件即可产出 getGridResult = [] # 1.满幸运必出 if updLuck >= maxLuck: - getGridResult.append(ipyData.GetLuckyGridNum()) - GameWorld.DebugLog("满幸运必出幸运物品: gridNum=%s" % ipyData.GetLuckyGridNum(), playerID) + getGridResult.append(luckyGridNum) + GameWorld.DebugLog("满幸运必出幸运物品: luckyGridNum=%s" % luckyGridNum, playerID) # 单抽 if treasureCount == 1: @@ -242,7 +245,7 @@ doCount -= 1 gridNum = GameWorld.GetResultByRandomList(commItemRateList) - if gridNum == ipyData.GetLuckyGridNum() and gridNum in getGridResult: + if gridNum == luckyGridNum and gridNum in getGridResult: GameWorld.DebugLog("幸运物品已经出过,不再重复产出!") continue @@ -283,7 +286,7 @@ isBind = 0 # 暂时默认不绑定 job = curPlayer.GetJob() gridItemInfoDict = ipyData.GetGridItemInfo() # 格子对应物品信息 {"格子编号":[物品ID, 数量], ...} - gridLibInfoDict = ipyData.GetGridLibInfo() # 格子对应物品信息 {"格子编号":[物品ID, 数量], ...} + gridLibInfoDict = ipyData.GetGridLibInfo() # 格子编号对应库ID {"编号":物品库ID, ...} jobItemList = ipyData.GetJobItemList() treasureResult = [] randItemIDDict = IpyGameDataPY.GetFuncEvalCfg("TreasureSet", 2) @@ -338,8 +341,8 @@ # 扣消耗 if costType == 1: - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeTime % (treasureType, treasureIndex), curTime) - GameWorld.DebugLog("消耗免费次数,更新免费CD计算时间: %s" % curTime, playerID) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureFreeCount % (treasureType), updFreeCountToday) + GameWorld.DebugLog("消耗免费次数,更新今日已使用免费次数: %s" % updFreeCountToday, playerID) elif costType == 2: ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCostItemCount, ChConfig.ItemDel_Treasure) GameWorld.DebugLog("扣除寻宝道具,costItemID=%s,delCostItemCount=%s" % (costItemID, delCostItemCount), playerID) @@ -352,12 +355,16 @@ GameWorld.DebugLog("扣除货币,costGoldType=%s,costGold=%s" % (costGoldType, costGold), playerID) # 加数据 - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType, isFreeType), updTreasureCount) - if ipyData.GetLuckyGridNum() in getGridResult: + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType), updTreasureCount) + if luckyGridNum in getGridResult: updLuck = 0 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureLuck % (treasureType), updLuck) - PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_TreasureScore, addScore) + addScoreType = setIpyData.GetAwardMoneyType() # 额外奖励货币类型 + addScore = setIpyData.GetAwardMoneyValue() # 单次奖励货币数 + if addScoreType and addScore: + PlayerControl.GiveMoney(curPlayer, addScoreType, addScore) + if treasureType == TreasureType_Rune: PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RuneTreasure, treasureCount) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_RuneTreasure, treasureCount) @@ -390,28 +397,30 @@ if mailItemList: PlayerControl.SendMailByKey("HappyXBUnEnough", [playerID], mailItemList) - GameWorld.DebugLog("寻宝成功: treasureType=%s,updTreasureCount=%s,updLuck=%s,addLuck=%s,addScore=%s" - % (treasureType, updTreasureCount, updLuck, addLuck, addScore), playerID) + GameWorld.DebugLog("寻宝成功: treasureType=%s,updTreasureCount=%s,updLuck=%s,addLuck=%s,addScoreType=%s,addScore=%s" + % (treasureType, updTreasureCount, updLuck, addLuck, addScoreType, addScore), playerID) GameWorld.DebugLog(" treasureResult=%s" % (treasureResult), playerID) GameWorld.DebugLog(" mailItemList=%s" % (mailItemList), playerID) # 通知前端 sendPack = ChPyNetSendPack.tagMCTreasureResult() sendPack.Clear() - sendPack.AddTreasureScore = addScore + sendPack.AddMoneyType = addScoreType + sendPack.AddMoneyValue = addScore sendPack.AddTreasureLuck = addLuck sendPack.TreasureResult = str(treasureResult) sendPack.TreasureResultLen = len(sendPack.TreasureResult) NetPackCommon.SendFakePack(curPlayer, sendPack) - Sync_TreasureInfo(curPlayer, treasureType) + Sync_TreasureInfo(curPlayer, [treasureType]) return -def GetUpdLuckyItemRateList(ipyData, curLuck, luckFormula, costType): +def GetUpdLuckyItemRateList(ipyData, luckyGridNum, curLuck, luckFormula, costType): # 获取幸运物品提升概率后的饼图 srcPieList = ipyData.GetGridItemRateListFree() if costType == 1 else ipyData.GetGridItemRateList1() - luckyGridNum = ipyData.GetLuckyGridNum() - + if not srcPieList: + srcPieList = ipyData.GetGridItemRateList1() + updRateList = [] for i, rateInfo in enumerate(srcPieList): rate, gridNum = rateInfo @@ -440,42 +449,26 @@ return jobItemIDList[job - 1] return itemID -def GetTreasureTypeList(): - ## 寻宝类型列表 - TreasureTypeList = IpyGameDataPY.GetConfigEx("TreasureType") - if not TreasureTypeList: - TreasureTypeList = [] +def Sync_TreasureInfo(curPlayer, syncTypeList=None): + if syncTypeList == None: + syncTypeList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() - for i in xrange(ipyDataMgr.GetTreasureHouseCount()): - ipyData = ipyDataMgr.GetTreasureHouseByIndex(i) - treasureType = ipyData.GetTreasureType() - if treasureType not in TreasureTypeList: - TreasureTypeList.append(treasureType) - IpyGameDataPY.SetConfigEx("TreasureType", TreasureTypeList) - return TreasureTypeList - -def Sync_TreasureInfo(curPlayer, treasureType=None): - if treasureType == None: - syncTypeList = GetTreasureTypeList() - else: - syncTypeList = [treasureType] - + for i in xrange(ipyDataMgr.GetTreasureSetCount()): + ipyData = ipyDataMgr.GetTreasureSetByIndex(i) + syncTypeList.append(ipyData.GetTreasureType()) + treasureInfoPack = ChPyNetSendPack.tagMCTreasureInfo() treasureInfoPack.Clear() treasureInfoPack.TreasuerInfoList = [] for tType in syncTypeList: - treasureCountList = IpyGameDataPY.GetFuncEvalCfg("TreasureSet1%s" % tType, 1) tTypeInfo = ChPyNetSendPack.tagMCTreasureTypeInfo() tTypeInfo.Clear() tTypeInfo.TreasureType = tType tTypeInfo.LuckValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (tType)) - tTypeInfo.FreeCountTime = [] - for i in xrange(len(treasureCountList)): - tTypeInfo.FreeCountTime.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeTime % (tType, i))) - tTypeInfo.IndexCount = len(tTypeInfo.FreeCountTime) + tTypeInfo.TreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (tType)) + tTypeInfo.FreeCountToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureFreeCount % (tType)) treasureInfoPack.TreasuerInfoList.append(tTypeInfo) treasureInfoPack.InfoCount = len(treasureInfoPack.TreasuerInfoList) NetPackCommon.SendFakePack(curPlayer, treasureInfoPack) return - -- Gitblit v1.8.0