From 63f6f44ec2a38eaec9f39bbe26edb07daed49b49 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 16 九月 2025 17:36:50 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(王元姬技能,弹射待处理;支持被动变更伤害倍值;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py | 117 +++++++++++++++++++++++++++++++++------------------------- 1 files changed, 66 insertions(+), 51 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 97a2280..6d4e4b1 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py @@ -17,10 +17,7 @@ import GameWorld import PlayerRune -import ShareDefine -import GameFuncComm import IpyGameDataPY -import IPY_GameWorld import FormulaControl import ChPyNetSendPack import PlayerControl @@ -28,16 +25,14 @@ import NetPackCommon import PlayerBossReborn import PlayerFeastTravel -import PlayerFairyCeremony -import PlayerNewFairyCeremony import PlayerActLunhuidian import PlayerActYunshi import PlayerActTask import ItemCommon +import PlayerHero import ChConfig import random -import time # 寻宝类型: >=100的为策划自行配置的自定义寻宝类型,<100的用于指定系统寻宝功能 TreasureTypeList = ( @@ -48,14 +43,11 @@ TreasureType_Gubao, # 古宝寻宝 5 ) = range(1, 1 + 5) -def DoTreasureOpen(curPlayer): - ## 寻宝开启 - Sync_TreasureInfo(curPlayer) - return +TreasureType_HeroComm = 11 # 英雄招募 - 普通 +TreasureType_HeroHigh = 12 # 英雄招募 - 高级 +TreasureType_HeroScore = 13 # 英雄招募 - 积分 def OnTreasureLogin(curPlayer): - #if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Treasure): - # return Sync_TreasureInfo(curPlayer) return @@ -222,19 +214,16 @@ GameWorld.ErrLog("找不到该等级对应寻宝库配置!treasureType=%s,curLV=%s" % (treasureType, curPlayer.GetLV()), playerID) return - luckyItemRateList = ipyData.GetLuckyItemRateList() - luckyGridNumList = [] - if luckyItemRateList: - for _, gridNum in luckyItemRateList: - luckyGridNumList.append(gridNum) - elif setIpyData.GetLuckyGridNum(): - luckyGridNumList = [setIpyData.GetLuckyGridNum()] - GameWorld.DebugLog("luckyGridNumList=%s, %s" % (luckyGridNumList, luckyItemRateList), playerID) + setLuckyGridNum = setIpyData.GetLuckyGridNum() # 标的格子 + luckyItemRateInfo = ipyData.GetLuckyItemRateInfo() + luckyItemRateDict = {int(k):v for k, v in luckyItemRateInfo.items()} + luckyValueList = sorted(luckyItemRateDict.keys()) + luckyGridNumList = [] # 幸运格子编号列表 luckFormula = setIpyData.GetLuckyRateFormat() # 幸运物品概率公式 addLuck = setIpyData.GetOnceLucky() # 增加幸运值 - maxLuck = setIpyData.GetFullLucky() # 满幸运值 - curLuck = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (treasureType)) # 当前幸运值 - updLuck = curLuck + maxLuck = max(luckyValueList) if luckyValueList else 0 # 满幸运值 + updLuck = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (treasureType)) # 当前幸运值 + GameWorld.DebugLog("updLuck=%s,maxLuck=%s,setLuckyGridNum=%s,luckyItemRateDict=%s" % (updLuck, maxLuck, setLuckyGridNum, luckyItemRateDict), playerID) curTreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (treasureType)) # 当前已寻宝次数 updTreasureCount = curTreasureCount @@ -257,41 +246,43 @@ getGridResult = [] for tIndex in range(treasureCount): updLuck = min(updLuck + addLuck, maxLuck) + stageLuck, luckItemRateList = __getLuckyRateInfo(updLuck, luckyItemRateDict, luckyValueList) + luckyGridNumList = [] + for _, gridNum in luckItemRateList: + luckyGridNumList.append(gridNum) + updTreasureCount += 1 - GameWorld.DebugLog("%s,累计次数=%s,幸运=%s" % (tIndex + 1, updTreasureCount, updLuck), playerID) + GameWorld.DebugLog("%s,累计次数=%s,幸运=%s,阶段幸运=%s,幸运饼图=%s" % (tIndex + 1, updTreasureCount, updLuck, stageLuck, luckItemRateList), playerID) if gridNumMaxLimitInfo: GameWorld.DebugLog(" gridNumMaxLimitInfo=%s,gridNumCountInfo=%s" % (gridNumMaxLimitInfo, gridNumCountInfo), playerID) baseRateList, commItemRateList = GetUpdLuckyItemRateList(ipyData, luckyGridNumList, updLuck, luckFormula, costType) # 常规产出物品格子饼图,幸运物品概率已变更 commItemRateList = GetRemoveLimitGridRateList(commItemRateList, gridNumCountInfo, gridNumMaxLimitInfo) - GameWorld.DebugLog(" 基础饼图=%s" % baseRateList, playerID) - GameWorld.DebugLog(" 常规饼图=%s" % commItemRateList, playerID) + GameWorld.DebugLog(" 基础产出饼图=%s" % baseRateList, playerID) curRateList = [] # 可能会改变饼图,每次抽奖使用新的饼图对象,不要改变配置的饼图概率 # 满幸运必出 - if updLuck >= maxLuck and luckyGridNumList: - if luckyItemRateList: - curRateList = GetRemoveLimitGridRateList(luckyItemRateList, gridNumCountInfo, gridNumMaxLimitInfo) - else: - curRateList = GetRemoveLimitGridRateList([(10000, luckyGridNumList[0])], gridNumCountInfo, gridNumMaxLimitInfo) - GameWorld.DebugLog(" 【满幸运饼图】: %s" % curRateList) + if stageLuck and updLuck >= stageLuck and luckItemRateList: + curRateList = GetRemoveLimitGridRateList(luckItemRateList, gridNumCountInfo, gridNumMaxLimitInfo) + GameWorld.DebugLog(" 【满幸运必出饼图】: %s" % curRateList, playerID) # 次数必出 if not curRateList and updTreasureCount in beSureCountDict: besureGridRateList = beSureCountDict[updTreasureCount] curRateList = GetRemoveLimitGridRateList(besureGridRateList, gridNumCountInfo, gridNumMaxLimitInfo) - GameWorld.DebugLog(" 【第%s次数必出饼图】: %s" % (updTreasureCount, curRateList)) + GameWorld.DebugLog(" 【第%s次数必出饼图】: %s" % (updTreasureCount, curRateList), playerID) # 满次数必出 if not curRateList and ensureCount and updTreasureCount % ensureCount == 0 and ensureRateList: curRateList = GetRemoveLimitGridRateList(ensureRateList, gridNumCountInfo, gridNumMaxLimitInfo) - GameWorld.DebugLog(" 【满%s次数必出饼图】: %s" % (ensureCount, curRateList)) + GameWorld.DebugLog(" 【满%s次数必出饼图】: %s" % (ensureCount, curRateList), playerID) doCount = 0 while doCount <= 50: # 限制最大次数 doCount += 1 if doCount > 1 or not curRateList: # 重新随机的默认使用常规饼图 curRateList = commItemRateList + GameWorld.DebugLog(" 使用常规饼图=%s" % curRateList, playerID) gridNum = GameWorld.GetResultByRandomList(curRateList) if gridNum in luckyGridNumList and gridNum in getGridResult: @@ -306,8 +297,11 @@ getGridResult.append(gridNum) GameWorld.DebugLog(" 本次产出: gridNum=%s, %s" % (gridNum, getGridResult), playerID) if gridNum in luckyGridNumList: - updLuck = 0 - GameWorld.DebugLog(" 【产出幸运格子】: gridNum=%s" % (gridNum), playerID) + if gridNum == setLuckyGridNum or updLuck >= maxLuck: + updLuck = 0 + else: + updLuck = stageLuck # 直接切换到下一阶段幸运 + GameWorld.DebugLog(" 【产出幸运格子】: gridNum=%s,updLuck=%s" % (gridNum, updLuck), playerID) if gridNum in gridNumCountInfo: gridNumCountInfo[gridNum] = gridNumCountInfo[gridNum] + 1 GameWorld.DebugLog(" 【更新产出次数】: gridNum=%s, %s" % (gridNum, gridNumCountInfo), playerID) @@ -340,9 +334,7 @@ canRandItemList = [] randItemIDList = randItemIDDict[itemID] for randItemID in randItemIDList: - itemData = GameWorld.GetGameData().GetItemByTypeID(randItemID) - if itemData.GetType() == ChConfig.Def_ItemType_Rune and not PlayerRune.GetIsOpenByRuneID(curPlayer, randItemID): - GameWorld.DebugLog("未解锁的符印不产出!itemID=%s,randItemID=%s" % (itemID, randItemID), playerID) + if not __checkItemCanTreasure(curPlayer, treasureType, randItemID): continue canRandItemList.append(randItemID) if not canRandItemList: @@ -359,8 +351,9 @@ itemWeightList = [] for libItem in libItemList: itemWeight, itemID, itemCount = libItem.GetItemWeight(), libItem.GetItemID(), libItem.GetItemCount() - itemData = GameWorld.GetGameData().GetItemByTypeID(itemID) - if not itemData: + if not itemWeight: + continue + if not __checkItemCanTreasure(curPlayer, treasureType, itemID): continue itemWeightList.append([itemWeight, [itemID, itemCount]]) if not itemWeightList: @@ -392,10 +385,6 @@ # 加数据 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCountToday % (treasureType), updTreasureCountToday) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType), updTreasureCount) - for luckyGridNum in luckyGridNumList: - if luckyGridNum in getGridResult: - updLuck = 0 - break PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureLuck % (treasureType), updLuck) for gridNum, updCount in gridNumCountInfo.items(): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureGridCnt % (treasureType, gridNum), updCount) @@ -403,25 +392,20 @@ addScoreType = setIpyData.GetAwardMoneyType() # 额外奖励货币类型 addScore = setIpyData.GetAwardMoneyValue() # 单次奖励货币数 if addScoreType and addScore: - PlayerControl.GiveMoney(curPlayer, addScoreType, addScore) + PlayerControl.GiveMoney(curPlayer, addScoreType, addScore * treasureCount) if treasureType == TreasureType_Rune: - PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RuneTreasure, treasureCount) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_RuneTreasure, treasureCount) PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_RuneTreasure, treasureCount) PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_TreasureRune, treasureCount) elif treasureType == TreasureType_Jipin: - PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Treasure, treasureCount) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_Treasure, treasureCount) PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_Treasure, treasureCount) PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_TreasureJipin, treasureCount) elif treasureType == TreasureType_Jueshi: - PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_JSTreasure, treasureCount) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_JSTreasure, treasureCount) PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_JSTreasure, treasureCount) PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_TreasureJueshi, treasureCount) - elif treasureType == TreasureType_GatherTheSoul: - PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_TreasureGatherTheSoul, treasureCount) elif treasureType == TreasureType_Gubao: PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_TreasureGubao, treasureCount) @@ -462,6 +446,37 @@ Sync_TreasureInfo(curPlayer, [treasureType]) return +def __getLuckyRateInfo(curLuck, luckyItemRateDict, luckyValueList): + if not luckyItemRateDict or not luckyValueList: + return 0, [] + for luck in luckyValueList: + if curLuck <= luck: + return luck, luckyItemRateDict[luck] + lastLuck = luckyValueList[-1] + return lastLuck, luckyItemRateDict[lastLuck] + +def __checkItemCanTreasure(curPlayer, treasureType, itemID): + ## 检查物品ID是否可寻宝产出 + itemData = GameWorld.GetGameData().GetItemByTypeID(itemID) + if not itemData: + return + + playerID = curPlayer.GetPlayerID() + if itemData.GetType() == ChConfig.Def_ItemType_Hero: + heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", itemID) + if not heroIpyData: + return + if heroIpyData.GetRecruitBySelf() and not PlayerHero.GetHeroActivite(curPlayer, itemID): + GameWorld.DebugLog("武将未激活不产出!itemID=%s" % itemID, playerID) + return + + elif itemData.GetType() == ChConfig.Def_ItemType_Rune: + if not PlayerRune.GetIsOpenByRuneID(curPlayer, itemID): + GameWorld.DebugLog("未解锁的符印不产出!itemID=%s" % itemID, playerID) + return + + return True + def GetRemoveLimitGridRateList(srcGridNumRateList, gridNumCountInfo, gridNumMaxLimitInfo): ## 获取移除限制产出的格子后的饼图列表 # @param srcGridNumRateList: 原始概率 [(概率, 格子编号), ...] -- Gitblit v1.8.0