From 97fef842ed56dfd7c7dd73f9c7acf20df55b9a23 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 05 九月 2025 11:35:20 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(优化主线掉落装备:改为按Boss类型掉落,祝福树区分不同的Boss类型掉落概率;分解装备按消耗的战锤进行均分计算分解所得;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/MainLevel.py | 9 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py | 4 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py | 244 +++++++++++++++++++++++----------- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 62 ++++---- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 2 PySysDB/PySysDBPY.h | 8 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 24 ++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 10 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 2 9 files changed, 237 insertions(+), 128 deletions(-) diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h index 5300ab1..d19eff1 100644 --- a/PySysDB/PySysDBPY.h +++ b/PySysDB/PySysDBPY.h @@ -37,6 +37,7 @@ BYTE AtkDistType; //远近类型;1-近战;2-远程 BYTE Sex; //性别;1-男,2-女 WORD LV; //等级 + BYTE BossType; //Boss类型 DWORD Atk; //攻击力 DWORD Def; //防御值 DWORD MaxHP; //最大生命值,可超过20E @@ -632,7 +633,6 @@ struct EquipColor { BYTE _ItemColor; //装备品质 - DWORD MoneyBase; //分解货币 DWORD AtkStep; //攻击步长 DWORD DefStep; //防御步长 DWORD HPStep; //生命步长 @@ -3249,14 +3249,16 @@ list AwardItemList; //奖励物品列表 }; -//仙树等级表 +//祝福树 struct tagTreeLV { BYTE _TreeLV; //仙树等级 DWORD LVUPNeedMoney; //升到下一级所需货币数 DWORD LVUPNeedTime; //升级下一级所需所需秒 - list EquipColorRateList; //产出装备品质概率列表,[0品质万分率, 1品质万分率, ...] + list EquipColorRateList; //小怪产出装备品质概率列表,[0品质万分率, 1品质万分率, ...] + list EquipColorRateList1; //精英产出装备品质概率列表,[0品质万分率, 1品质万分率, ...] + list EquipColorRateList2; //boss产出装备品质概率列表,[0品质万分率, 1品质万分率, ...] }; //淘金营地表 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py index 3a5998d..a915e37 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py @@ -4160,7 +4160,7 @@ #主线 Def_PDict_UnXiantaoCntExp = "UnXiantaoCntExp" # 累计未结算经验的战锤数 -Def_PDict_UnXiantaoCntEquip = "UnXiantaoCntEquip" # 累计未结算装备掉落的战锤数 +Def_PDict_UnXiantaoCntEquip = "UnXiantaoCntEquip" # 累计未结算装备掉落的战锤数,有3位小数,即 1234 实际为 1.234 Def_PDict_UnXiantaoCntBooty = "UnXiantaoCntBooty_%s" # 累计未结算战利品掉落的战锤数,参数(itemID) Def_PDict_BootyDropToday = "BootyDropToday_%s" # 今日已累计掉落战利品数量,参数(itemID) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/MainLevel.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/MainLevel.py index 62016fd..70916dc 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/MainLevel.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/MainLevel.py @@ -28,13 +28,18 @@ if not gmList: GameWorld.DebugAnswer(curPlayer, "重置主线: MainLevel 0") GameWorld.DebugAnswer(curPlayer, "设置主线: MainLevel 章节 关卡 波") - GameWorld.DebugAnswer(curPlayer, "测试掉落: MainLevel d 战锤数") + GameWorld.DebugAnswer(curPlayer, "测试击杀: MainLevel k 消耗战锤数") GameWorld.DebugAnswer(curPlayer, "重置掉落: MainLevel d 0 [是否清掉落背包]") GameWorld.DebugAnswer(curPlayer, "重置战利: MainLevel b 0") GameWorld.DebugAnswer(curPlayer, "设置战利: MainLevel b 战利品ID 已掉落个数") return value = gmList[0] + + if value == "k": + useXiantao = gmList[1] if len(gmList) > 1 else 1 + GameLogic_MainLevel.GMTestKill(curPlayer, useXiantao) + return if value == "d": unXiantao = gmList[1] if len(gmList) > 1 else 1 @@ -47,8 +52,6 @@ ClearPack.__DoLogic_Clear_Pack(curPlayer, IPY_GameWorld.rptIdentify) GameWorld.DebugAnswer(curPlayer, "重置未结算战锤掉落OK!") return - - GameLogic_MainLevel.GMTestKillDrop(curPlayer, unXiantao) return if value == "b": diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py index 8aa2f91..5d3fe75 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py @@ -2400,14 +2400,14 @@ return callFunc(curPlayer, mapID, funcLineID) -def OnPlayerLineupAttackResult(curPlayer, atkObj, killObjIDList, useSkill, mapID, funcLineID): +def OnPlayerLineupAttackResult(curPlayer, atkObj, killObjList, useSkill, mapID, funcLineID): ## 回合战斗主动发起的玩家阵容攻击结果额外处理 ,一般处理副本相关的掉落、奖励等 do_FBLogic_ID = __GetFBLogic_MapID(mapID) callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnPlayerLineupAttackResult")) if callFunc: - callFunc(curPlayer, atkObj, killObjIDList, useSkill, mapID, funcLineID) + callFunc(curPlayer, atkObj, killObjList, useSkill, mapID, funcLineID) return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py index cef5c8b..123be33 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py @@ -28,6 +28,7 @@ import ItemCommon import PlayerTask import NPCCommon +import BattleObj import ChEquip import ObjPool @@ -66,17 +67,17 @@ ipyData = ipyDataMgr.GetMainChapterByIndex(chapterCount - 1) return [booty[0] for booty in ipyData.GetDailyBootyUpperList()] -def OnPlayerLineupAttackResult(curPlayer, atkObj, killObjIDList, useSkill, mapID, funcLineID): +def OnPlayerLineupAttackResult(curPlayer, atkObj, killObjList, useSkill, mapID, funcLineID): ## 回合战斗主动发起的玩家阵容攻击结果额外处理 ,一般处理副本相关的掉落、奖励等 if mapID == ChConfig.Def_FBMapID_Main: - __doKillAward(curPlayer, atkObj, killObjIDList) + __doKillAward(curPlayer, atkObj, killObjList) return -def __doKillAward(curPlayer, atkObj, killObjIDList): +def __doKillAward(curPlayer, atkObj, killObjList): ## 计算击杀奖励 - if not killObjIDList: + if not killObjList: GameWorld.DebugLog("没有击杀不需要处理!") return # 结算经验 @@ -88,12 +89,12 @@ GameWorld.DebugLog("增加经验: totalExp=%s,unXiantaoCntExp=%s" % (totalExp, unXiantaoCntExp)) PlayerControl.PlayerControl(curPlayer).AddExp(totalExp, ShareDefine.Def_ViewExpType_KillNPC) - __doMainDrop(curPlayer) + __doMainDrop(curPlayer, killObjList) return -def __doMainDrop(curPlayer): +def __doMainDrop(curPlayer, killObjList): # 装备掉落 - if __doDropEquip(curPlayer) == -1: + if __doDropEquip(curPlayer, killObjList) == -1: return playerID = curPlayer.GetPlayerID() @@ -161,15 +162,36 @@ return -def __doDropEquip(curPlayer): +def __doDropEquip(curPlayer, killObjList): ## 主线掉落装备 playerID = curPlayer.GetPlayerID() - unXiantaoCntEquip = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntEquip) - dropOneNeed = IpyGameDataPY.GetFuncCfg("MainEquipDrop", 1) # 每消耗X个战锤掉落一件装备 - dropEquipCnt = unXiantaoCntEquip / dropOneNeed + unXiantaoCntEquip = PlayerControl.GetUnXiantaoCntEquip(curPlayer) + bossTypeDropInfo = IpyGameDataPY.GetFuncCfg("MainEquipDrop", 1) # 每消耗X个战锤掉落一件装备 + fightPoint = max(curPlayer.GetFightPoint(), 1) # 消耗倍率也是掉落倍率 + dropEquipCnt = 0 + objDropCntDict = {} + for tagObj in killObjList: + tagID = tagObj.GetID() + npcID = tagObj.GetNPCID() + if not npcID: + continue + npcData = NPCCommon.GetNPCDataPy(npcID) + if not npcData: + continue + bossType = npcData.GetBossType() + if bossType not in bossTypeDropInfo: + continue + dropCnt = GameWorld.GetResultByRandomList(bossTypeDropInfo[bossType]) + if not dropCnt: + continue + dropCnt *= fightPoint # 多倍掉落 + objDropCntDict[tagID] = [tagObj, dropCnt, bossType] + dropEquipCnt += dropCnt + if dropEquipCnt <= 0: - GameWorld.DebugLog("主线暂不能掉落! unXiantaoCntEquip=%s,dropOneNeed=%s,dropEquipCnt=%s" % (unXiantaoCntEquip, dropOneNeed, dropEquipCnt), playerID) + GameWorld.DebugLog("主线暂不能掉落! unXiantaoCntEquip=%s,dropEquipCnt=%s" % (unXiantaoCntEquip, dropEquipCnt), playerID) return + # 根据掉落背包空间修正最终可掉落装备数 dropEquipCnt = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptIdentify, dropEquipCnt) if not dropEquipCnt: GameWorld.DebugLog("掉落背包已满!", playerID) @@ -179,52 +201,101 @@ ipyData = IpyGameDataPY.GetIpyGameData("TreeLV", treeLV) if not ipyData: return - equipColorRateList = ipyData.GetEquipColorRateList() - GameWorld.DebugLog("主线掉落装备: unXiantaoCntEquip=%s,dropEquipCnt=%s,treeLV=%s,equipColorRateList=%s" % (unXiantaoCntEquip, dropEquipCnt, treeLV, equipColorRateList), playerID) + GameWorld.DebugLog("主线掉落装备: unXiantaoCntEquip=%s,dropEquipCnt=%s,treeLV=%s,objDropCntDict=%s" + % (unXiantaoCntEquip, dropEquipCnt, treeLV, objDropCntDict), playerID) - maxRate = 10000 - totalRate = 0 - colorRateList = [] - for equipColor, colorRate in enumerate(equipColorRateList, 1): - if not colorRate: - continue - totalRate += colorRate - colorRateList.append([totalRate, equipColor]) - - if totalRate != maxRate: - GameWorld.SendGameError("GameWarning", "CutTreeTotalRateError:%s!=%s,treeLV=%s" % (totalRate, maxRate, treeLV)) - if not colorRateList: - return - GameWorld.DebugLog(" colorRateList=%s,totalRate=%s" % (colorRateList, totalRate), playerID) - - for _ in range(dropEquipCnt): - itemColor = GameWorld.GetResultByRandomList(colorRateList) - if not itemColor: - continue - equipIDList = NPCCommon.__GetEquipIDList(0, color=itemColor, placeList=ChConfig.Def_MainEquipPlaces, findType="MainEquipDrop") - if not equipIDList: - continue - randEquipID = random.choice(equipIDList) - - curItem = ItemControler.GetOutPutItemObj(randEquipID, 1, False, curPlayer=curPlayer) - if curItem == None: - continue - curItem.SetIsBind(1) # 为1时代表是掉落 - - #GameWorld.DebugLog("掉落装备: randEquipID=%s,%s" % (randEquipID, curItem.GetGUID()), playerID) - if not ItemControler.DoLogic_PutItemInPack(curPlayer, curItem, packIndexList=[IPY_GameWorld.rptIdentify]): + for tagID, dropInfo in objDropCntDict.items(): + tagObj, dropCnt, bossType = dropInfo + if hasattr(ipyData, "GetEquipColorRateList%s" % bossType): + equipColorRateList = getattr(ipyData, "GetEquipColorRateList%s" % bossType)() + else: + equipColorRateList = ipyData.GetEquipColorRateList() + + GameWorld.DebugLog("tagID=%s,bossType=%s,dropCnt=%s,treeLV=%s,equipColorRateList=%s" + % (tagID, bossType, dropCnt, treeLV, equipColorRateList), playerID) + if not equipColorRateList: continue - unXiantaoCntEquip -= dropOneNeed - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntEquip, unXiantaoCntEquip) + totalRate = 0 + colorRateList = [] + for equipColor, colorRate in enumerate(equipColorRateList, 1): + if not colorRate: + continue + totalRate += colorRate + colorRateList.append([totalRate, equipColor]) + + #maxRate = 10000 + #if totalRate != maxRate: + # GameWorld.SendGameError("GameWarning", "CutTreeTotalRateError:%s!=%s,treeLV=%s" % (totalRate, maxRate, treeLV)) + if not colorRateList: + return + GameWorld.DebugLog(" colorRateList=%s,totalRate=%s" % (colorRateList, totalRate), playerID) + for _ in range(dropCnt): + if dropEquipCnt <= 0: + break + itemColor = GameWorld.GetResultByRandomList(colorRateList) + if not itemColor: + continue + equipIDList = NPCCommon.__GetEquipIDList(0, color=itemColor, placeList=ChConfig.Def_MainEquipPlaces, findType="MainEquipDrop") + if not equipIDList: + continue + randEquipID = random.choice(equipIDList) + + curItem = ItemControler.GetOutPutItemObj(randEquipID, 1, False, curPlayer=curPlayer) + if curItem == None: + continue + curItem.SetIsBind(1) # 为1时代表是掉落 + #GameWorld.DebugLog("掉落装备: randEquipID=%s,%s" % (randEquipID, curItem.GetGUID()), playerID) + if not ItemControler.DoLogic_PutItemInPack(curPlayer, curItem, packIndexList=[IPY_GameWorld.rptIdentify]): + continue + + dropEquipCnt -= 1 + return -def GMTestKillDrop(curPlayer, unXiantao): - ## GM测试掉落 - unXiantaoCntEquip = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntEquip) + unXiantao - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntEquip, unXiantaoCntEquip) - GameWorld.DebugAnswer(curPlayer, "未结算装备战锤数: %s" % unXiantaoCntEquip) +def GMTestKill(curPlayer, useXiantao): + ## GM测试击杀 + + mainFightMgr = TurnAttack.GetMainFightMgr(curPlayer) + turnFight = mainFightMgr.turnFight + if not turnFight.isInFight(): + GameWorld.DebugAnswer(curPlayer, "非主线战斗中!") + return + + useSkill = None + batObjMgr = BattleObj.GetBatObjMgr() + + # 随便取一个武将击杀对方所有怪物即可 + atkObj = None + batFactionA = turnFight.getBatFaction(ChConfig.Def_FactionA) + batLineup = batFactionA.getBatlineup(1) + for objID in batLineup.posObjIDDict.values(): + atkObj = batObjMgr.getBatObj(objID) + if atkObj.IsAlive(): + break + + if not atkObj: + GameWorld.DebugAnswer(curPlayer, "主阵容没有存活武将!") + return + + clientPack = ChPyNetSendPack.tagSCTurnFightReportSign() + clientPack.Sign = 0 + NetPackCommon.SendFakePack(curPlayer, clientPack) # 标记开始 + + killObjList = [] + batFactionB = turnFight.getBatFaction(ChConfig.Def_FactionB) + batLineup = batFactionB.getBatlineup(1) + for objID in batLineup.posObjIDDict.values(): + tagObj = batObjMgr.getBatObj(objID) + if tagObj.IsAlive(): + killObjList.append(tagObj) + TurnAttack.SetObjKilled(turnFight, tagObj, atkObj, useSkill) + + unXiantaoCntExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntExp) + useXiantao + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntExp, unXiantaoCntExp) + GameWorld.DebugAnswer(curPlayer, "未结算经验战锤数: %s" % unXiantaoCntExp) + GameWorld.DebugAnswer(curPlayer, "未结算装备战锤数: %s" % PlayerControl.AddUnXiantaoCntEquip(curPlayer, useXiantao)) chapterID = PlayerControl.GetMainLevelNowInfo(curPlayer)[0] chapterIpyData = IpyGameDataPY.GetIpyGameData("MainChapter", chapterID) if chapterIpyData: @@ -232,11 +303,16 @@ for itemID, upperCnt in DailyBootyUpperList: if upperCnt <= 0: continue - unXiantaoCntBooty = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntBooty % itemID) + unXiantao + unXiantaoCntBooty = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntBooty % itemID) + useXiantao PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntBooty % itemID, unXiantaoCntBooty) GameWorld.DebugAnswer(curPlayer, "未结算战利品(%s)战锤数: %s" % (itemID, unXiantaoCntBooty)) - __doMainDrop(curPlayer) + OnPlayerLineupAttackResult(curPlayer, atkObj, killObjList, useSkill, turnFight.mapID, turnFight.funcLineID) + turnFight.checkOverByKilled() + + # 标记结束 + clientPack.Sign = 1 + NetPackCommon.SendFakePack(curPlayer, clientPack) return #// B4 15 主线掉落物品操作 #tagCSMainDropItemOP @@ -316,50 +392,58 @@ def __doDecomposeMainEquip(curPlayer, itemIndexList): playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("分解主线装备: itemIndexList=%s" % (itemIndexList), playerID) - IdentifyPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptIdentify) - - moneyType = IpyGameDataPY.GetFuncCfg("MainEquipDrop", 2) - if not moneyType: + moneyType, moneyBase = IpyGameDataPY.GetFuncEvalCfg("MainEquipDrop", 2) + if not moneyType or not moneyBase: return + + equipDict = {} + IdentifyPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptIdentify) + for index in range(IdentifyPack.GetCount()): + curEquip = IdentifyPack.GetAt(index) + if not ItemCommon.CheckItemCanUse(curEquip): + #GameWorld.DebugLog("物品为空或不可用: index=%s" % index, playerID) + continue + if not ItemCommon.GetIsMainEquip(curEquip): + #GameWorld.DebugLog("非主线装备: index=%s" % index, playerID) + continue + equipDict[index] = curEquip + + if not equipDict: + return + + equipCnt = len(equipDict) + unXiantaoCntEquip = PlayerControl.GetUnXiantaoCntEquip(curPlayer) + perEquipXiantao = unXiantaoCntEquip / float(equipCnt) if equipCnt > 1 else unXiantaoCntEquip + decomposeMoney = max(1, moneyBase * perEquipXiantao) # 至少1个 + GameWorld.DebugLog("unXiantaoCntEquip=%s,equipCnt=%s,perEquipXiantao=%s,equipIndexList=%s" + % (unXiantaoCntEquip, equipCnt, perEquipXiantao, equipDict.keys()), playerID) + GameWorld.DebugLog("moneyBase=%s,decomposeMoney=%s" % (moneyBase, decomposeMoney), playerID) moneyTotal = 0 decomposeCnt = 0 decomposeIndexList = [] for itemIndex in itemIndexList: - if itemIndex < 0 or itemIndex >= IdentifyPack.GetCount(): + if itemIndex not in equipDict: continue - curEquip = IdentifyPack.GetAt(itemIndex) - if not ItemCommon.CheckItemCanUse(curEquip): - GameWorld.DebugLog("物品为空或不可用: itemIndex=%s" % itemIndex, playerID) - continue - - if not ItemCommon.GetIsMainEquip(curEquip): - GameWorld.DebugLog("非主线装备: itemIndex=%s" % itemIndex, playerID) - continue - itemColor = curEquip.GetItemColor() - - colorIpyData = IpyGameDataPY.GetIpyGameData("EquipColor", itemColor) - if not colorIpyData: - return - moneyBase = colorIpyData.GetMoneyBase() # 分解货币基础 - if not moneyBase: - return - # 可以处理一些加成 - - decomposeMoney = moneyBase + curEquip = equipDict[itemIndex] moneyTotal += decomposeMoney - GameWorld.DebugLog(" itemIndex=%s,itemColor=%s,moneyBase=%s,decomposeMoney=%s,%s" - % (itemIndex, itemColor, moneyBase, decomposeMoney, moneyTotal), playerID) + GameWorld.DebugLog(" itemIndex=%s,moneyBase=%s,perEquipXiantao=%s,decomposeMoney=%s,总:%s" + % (itemIndex, moneyBase, perEquipXiantao, decomposeMoney, moneyTotal), playerID) ItemCommon.DelItem(curPlayer, curEquip, curEquip.GetCount(), True, ChConfig.ItemDel_EquipDecompose) decomposeIndexList.append(itemIndex) decomposeCnt += 1 + unXiantaoCntEquip -= perEquipXiantao if not moneyTotal: return + moneyTotal = int(round(moneyTotal)) # 四舍五入取整 + unXiantaoCntEquip = PlayerControl.SetUnXiantaoCntEquip(curPlayer, unXiantaoCntEquip) + GameWorld.DebugLog("moneyTotal=%s,unXiantaoCntEquip=%s" % (moneyTotal, unXiantaoCntEquip), playerID) + PlayerControl.GiveMoney(curPlayer, moneyType, moneyTotal, "DecomposeMainEquip", isSysHint=False) PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_EquipDecompose, decomposeCnt) return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py index e9a3861..861ba0c 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py @@ -64,6 +64,7 @@ ("BYTE", "AtkDistType", 0), ("BYTE", "Sex", 0), ("WORD", "LV", 0), + ("BYTE", "BossType", 0), ("DWORD", "Atk", 0), ("DWORD", "Def", 0), ("DWORD", "MaxHP", 0), @@ -545,7 +546,6 @@ "EquipColor":( ("BYTE", "ItemColor", 1), - ("DWORD", "MoneyBase", 0), ("DWORD", "AtkStep", 0), ("DWORD", "DefStep", 0), ("DWORD", "HPStep", 0), @@ -2540,6 +2540,8 @@ ("DWORD", "LVUPNeedMoney", 0), ("DWORD", "LVUPNeedTime", 0), ("list", "EquipColorRateList", 0), + ("list", "EquipColorRateList1", 0), + ("list", "EquipColorRateList2", 0), ), "GoldRushCamp":( @@ -2616,25 +2618,26 @@ def GetAtkDistType(self): return self.attrTuple[4] # 远近类型;1-近战;2-远程 BYTE def GetSex(self): return self.attrTuple[5] # 性别;1-男,2-女 BYTE def GetLV(self): return self.attrTuple[6] # 等级 WORD - def GetAtk(self): return self.attrTuple[7] # 攻击力 DWORD - def GetDef(self): return self.attrTuple[8] # 防御值 DWORD - def GetMaxHP(self): return self.attrTuple[9] # 最大生命值,可超过20E DWORD - def GetSkillIDList(self): return self.attrTuple[10] # 技能ID列表 list - def GetFinalDamPer(self): return self.attrTuple[11] # 最终增伤 DWORD - def GetFinalDamPerDef(self): return self.attrTuple[12] # 最终减伤 DWORD - def GetMissRate(self): return self.attrTuple[13] # 闪避概率 DWORD - def GetMissRateDef(self): return self.attrTuple[14] # 抗闪避概率 DWORD - def GetSuperHitRate(self): return self.attrTuple[15] # 暴击概率 DWORD - def GetSuperHitRateDef(self): return self.attrTuple[16] # 抗暴击概率 DWORD - def GetStunRate(self): return self.attrTuple[17] # 击晕概率 DWORD - def GetStunRateDef(self): return self.attrTuple[18] # 抗击晕概率 DWORD - def GetComboRate(self): return self.attrTuple[19] # 连击概率 DWORD - def GetComboRateDef(self): return self.attrTuple[20] # 抗连击概率 DWORD - def GetParryRate(self): return self.attrTuple[21] # 格挡概率 DWORD - def GetParryRateDef(self): return self.attrTuple[22] # 抗格挡概率 DWORD - def GetSuckHPPer(self): return self.attrTuple[23] # 吸血比率 DWORD - def GetSuckHPPerDef(self): return self.attrTuple[24] # 抗吸血比率 DWORD - def GetSpecAttrInfo(self): return self.attrTuple[25] # 特殊属性信息 {"属性ID":值, ...} dict + def GetBossType(self): return self.attrTuple[7] # Boss类型 BYTE + def GetAtk(self): return self.attrTuple[8] # 攻击力 DWORD + def GetDef(self): return self.attrTuple[9] # 防御值 DWORD + def GetMaxHP(self): return self.attrTuple[10] # 最大生命值,可超过20E DWORD + def GetSkillIDList(self): return self.attrTuple[11] # 技能ID列表 list + def GetFinalDamPer(self): return self.attrTuple[12] # 最终增伤 DWORD + def GetFinalDamPerDef(self): return self.attrTuple[13] # 最终减伤 DWORD + def GetMissRate(self): return self.attrTuple[14] # 闪避概率 DWORD + def GetMissRateDef(self): return self.attrTuple[15] # 抗闪避概率 DWORD + def GetSuperHitRate(self): return self.attrTuple[16] # 暴击概率 DWORD + def GetSuperHitRateDef(self): return self.attrTuple[17] # 抗暴击概率 DWORD + def GetStunRate(self): return self.attrTuple[18] # 击晕概率 DWORD + def GetStunRateDef(self): return self.attrTuple[19] # 抗击晕概率 DWORD + def GetComboRate(self): return self.attrTuple[20] # 连击概率 DWORD + def GetComboRateDef(self): return self.attrTuple[21] # 抗连击概率 DWORD + def GetParryRate(self): return self.attrTuple[22] # 格挡概率 DWORD + def GetParryRateDef(self): return self.attrTuple[23] # 抗格挡概率 DWORD + def GetSuckHPPer(self): return self.attrTuple[24] # 吸血比率 DWORD + def GetSuckHPPerDef(self): return self.attrTuple[25] # 抗吸血比率 DWORD + def GetSpecAttrInfo(self): return self.attrTuple[26] # 特殊属性信息 {"属性ID":值, ...} dict # NPC成长表 class IPY_NPCStronger(): @@ -3312,13 +3315,12 @@ return def GetItemColor(self): return self.attrTuple[0] # 装备品质 BYTE - def GetMoneyBase(self): return self.attrTuple[1] # 分解货币 DWORD - def GetAtkStep(self): return self.attrTuple[2] # 攻击步长 DWORD - def GetDefStep(self): return self.attrTuple[3] # 防御步长 DWORD - def GetHPStep(self): return self.attrTuple[4] # 生命步长 DWORD - def GetAttrLibCntList(self): return self.attrTuple[5] # 库属性条数列表 list - def GetAttrRange(self): return self.attrTuple[6] # 通用属性范围,下限|上限 list - def GetAttrRangeDict(self): return self.attrTuple[7] # 指定属性范围字典,{指定属性ID:[范围下限, 上限], ...} dict + def GetAtkStep(self): return self.attrTuple[1] # 攻击步长 DWORD + def GetDefStep(self): return self.attrTuple[2] # 防御步长 DWORD + def GetHPStep(self): return self.attrTuple[3] # 生命步长 DWORD + def GetAttrLibCntList(self): return self.attrTuple[4] # 库属性条数列表 list + def GetAttrRange(self): return self.attrTuple[5] # 通用属性范围,下限|上限 list + def GetAttrRangeDict(self): return self.attrTuple[6] # 指定属性范围字典,{指定属性ID:[范围下限, 上限], ...} dict # 装备部位表 class IPY_EquipPlace(): @@ -6336,7 +6338,7 @@ def GetNeedQiyun(self): return self.attrTuple[1] # 所需气运值 DWORD def GetAwardItemList(self): return self.attrTuple[2] # 奖励物品列表 list -# 仙树等级表 +# 祝福树 class IPY_TreeLV(): def __init__(self): @@ -6346,7 +6348,9 @@ def GetTreeLV(self): return self.attrTuple[0] # 仙树等级 BYTE def GetLVUPNeedMoney(self): return self.attrTuple[1] # 升到下一级所需货币数 DWORD def GetLVUPNeedTime(self): return self.attrTuple[2] # 升级下一级所需所需秒 DWORD - def GetEquipColorRateList(self): return self.attrTuple[3] # 产出装备品质概率列表,[0品质万分率, 1品质万分率, ...] list + def GetEquipColorRateList(self): return self.attrTuple[3] # 小怪产出装备品质概率列表,[0品质万分率, 1品质万分率, ...] list + def GetEquipColorRateList1(self): return self.attrTuple[4] # 精英产出装备品质概率列表,[0品质万分率, 1品质万分率, ...] list + def GetEquipColorRateList2(self): return self.attrTuple[5] # boss产出装备品质概率列表,[0品质万分率, 1品质万分率, ...] list # 淘金营地表 class IPY_GoldRushCamp(): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py index e20ab95..f8a8fff 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py @@ -806,6 +806,8 @@ # 那么在DoPlayerLogin 中设置的数据将不会被保存, 如会导致第一个任务重复触发问题,记录多次发送 EventReport.WriteEvent_Entry(curPlayer, 4) #EventReport.EventReport(ShareDefine.Def_UserAction_FirstLogin, "", curPlayer) + + curPlayer.SetFightPoint(1) # 初始化为1倍消耗 #---补满血满魔--- GameObj.SetHP(curPlayer, GameObj.GetMaxHP(curPlayer)) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py index b74e0cb..d35a1a2 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py @@ -2499,6 +2499,20 @@ NetPackCommon.SendFakePack(curPlayer, clientPack) return +def GetUnXiantaoCntEquip(curPlayer): + '''因为战锤对应装备是1个战锤可能对应多个装备掉落,所以分解装备的时候1个战锤需要支持可拆分 + 所以需要支持小数存储,暂定以支持3位小数存储 + ''' + return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntEquip) / 1000.0 +def AddUnXiantaoCntEquip(curPlayer, addCnt): + unXiantaoCntEquip = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntEquip) + addCnt * 1000 + return NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntEquip, unXiantaoCntEquip) +def SetUnXiantaoCntEquip(curPlayer, unXiantaoCntEquip): + ## 保存装备未结算战锤数,保留3位小数 + # @param unXiantaoCntEquip: 实际的未结算数量,支持小数 + unXiantaoCntEquip = int(round(unXiantaoCntEquip, 3) * 1000) # 保留3为小数 + return NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntEquip, unXiantaoCntEquip) + ##玩家是否有钱款 # @param curPlayer 玩家实例 # @param TYPE_Price ,货币类型 @@ -2789,8 +2803,7 @@ unXiantaoCntExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntExp) NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntExp, unXiantaoCntExp + price) # 累加未结算战锤 - 装备 - unXiantaoCntEquip = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntEquip) - NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntEquip, unXiantaoCntEquip + price) + AddUnXiantaoCntEquip(curPlayer, price) # 累加未结算战锤 - 战利品 chapterID = GetMainLevelNowInfo(curPlayer)[0] chapterIpyData = IpyGameDataPY.GetIpyGameData("MainChapter", chapterID) @@ -4950,10 +4963,11 @@ if value == 0: curPlayer.NomalDictDelProperty(key, dType) - return + return 0 # 2^31 - 1 - curPlayer.NomalDictAddProperty(key, min(value, ChConfig.Def_UpperLimit_DWordEx), dType) - return + value = max(0, min(value, ChConfig.Def_UpperLimit_DWordEx)) + curPlayer.NomalDictAddProperty(key, value, dType) + return value ## 通知祝福值 def Sync_BlessValue(curPlayer, blessType, value, multiple=0): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py index a5e2276..e9f1b23 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py @@ -692,13 +692,13 @@ TurnBuff.SyncBuffRefresh(turnFight, buffObj, buff, relatedSkillID) # 统计击杀 - killObjIDList = [] # 击杀的目标ID列表 + killObjList = [] # 击杀其他阵营目标列表 for tagObj in useSkill.GetTagObjList(): tagID = tagObj.GetID() - if tagObj.IsAlive() and tagObj.GetHP() <= 0: - killObjIDList.append(tagID) + if tagObj.IsAlive() and tagObj.GetHP() <= 0 and tagObj.GetFaction() != curObj.GetFaction(): + killObjList.append(tagObj) TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill) - if curObj and curObj.IsAlive() and curObj.GetHP() <= 0: + if curObj.IsAlive() and curObj.GetHP() <= 0: TurnAttack.SetObjKilled(turnFight, curObj) # 统计伤血,可能单个技能对同一目标造成多次伤害 @@ -716,7 +716,7 @@ # 结算副本相关的攻击结果,仅主动发起玩家阵容武将触发 curPlayer = turnFight.curPlayer if curPlayer and curObj and curObj.GetOwnerID() == curPlayer.GetPlayerID(): - FBLogic.OnPlayerLineupAttackResult(curPlayer, curObj, killObjIDList, useSkill, turnFight.mapID, turnFight.funcLineID) + FBLogic.OnPlayerLineupAttackResult(curPlayer, curObj, killObjList, useSkill, turnFight.mapID, turnFight.funcLineID) # 优先触发本技能额外效果,注:仅该技能释放后该技能的额外效果视为主技能的效果,优先级最高 if isUseSkill: -- Gitblit v1.8.0