| | |
| | |
|
| | | };
|
| | |
|
| | | //副本功能线路表
|
| | | //副本表
|
| | |
|
| | | struct tagFBLine
|
| | | struct FBLine
|
| | | {
|
| | | DWORD _DataMapID; //数据地图ID
|
| | | BYTE _LineID; //功能线路ID
|
| | |
| | | list PassAwardList; //过关奖励
|
| | | list SweepAwardList; //扫荡奖励
|
| | | list LineupIDList; //阵容ID列表
|
| | | WORD NPCLV; //NPC等级
|
| | | float Difficulty; //难度系数
|
| | | };
|
| | |
|
| | | //天子考验
|
| | |
|
| | | struct Tianzi
|
| | | {
|
| | | DWORD _BossID;
|
| | | BYTE HPNum;
|
| | | DWORD Atk;
|
| | | DWORD Def;
|
| | | DWORD MaxHP;
|
| | | dict OtherAttrDict; //其他属性 {attrID:attrValue, ...}
|
| | | list RandWeightItemList; //宝箱随机物品权重列表,[[权重,物品ID,数量], ...]
|
| | | };
|
| | |
|
| | | //广告奖励表
|
| | |
| | | ## 回合重置
|
| | | self._skillTurnUseCntDict = {}
|
| | |
|
| | | def UpdInitBatAttr(self, initAttrDict, skillIDList):
|
| | | def UpdInitBatAttr(self, initAttrDict, skillIDList=None):
|
| | | ## 更新战斗属性,一般只有主阵容需要更新,战斗中养成、装备变化等引起的主阵容属性变更时需要实时更新
|
| | | self._initAttrDict = initAttrDict
|
| | | learnNewSkill = False
|
| | | for skillID in skillIDList:
|
| | | if self._skillMgr.LearnSkillByID(skillID):
|
| | | learnNewSkill = True
|
| | | if skillIDList:
|
| | | for skillID in skillIDList:
|
| | | if self._skillMgr.LearnSkillByID(skillID):
|
| | | learnNewSkill = True
|
| | | TurnBuff.RefreshBuffAttr(self)
|
| | | if learnNewSkill: # 有学新技能时重刷技能被动
|
| | | self._passiveEffMgr.RefreshSkillPassiveEffect()
|
| | |
| | | ## 统计承伤
|
| | | self.defStat += lostHP
|
| | | return self.defStat
|
| | | def GetStatDefValue(self): return self.defStat # 获取累计总承伤
|
| | |
|
| | | def StatCureValue(self, cureValue):
|
| | | ## 统计治疗
|
| | |
| | | self.lingshouObjIDDict = {} # 灵兽战斗单位 {位置编号:batObjID, ...}
|
| | | self.beautyObjIDDict = {} # 红颜战斗单位 {位置编号:batObjID, ...}
|
| | | self.actionNum = ActionNumStart # 行动位置,从1开始
|
| | | self.totalHurt = 0 # 阵容总输出
|
| | | return
|
| | |
|
| | | def getPlayerID(self): return self.turnFight.playerID # 发起的玩家ID
|
| | |
| | | self.lingshouObjIDDict = {}
|
| | | self.beautyObjIDDict = {}
|
| | | self.fightPower = 0
|
| | | self.totalHurt = 0
|
| | | return
|
| | |
|
| | | class BatFaction():
|
| | |
| | | self.turnFight = turnFight # TurnFight
|
| | | self.faction = faction
|
| | | self.lineupDict = {} # 该阵营所有阵容信息 {编号:BatLineup, ...}
|
| | | self.totalHurt = 0 # 阵营总输出
|
| | | return
|
| | |
|
| | | def getBatlineup(self, num=1):
|
| | |
| | | lineup = BatLineup(self.faction, num, self.turnFight)
|
| | | self.lineupDict[num] = lineup
|
| | | return lineup
|
| | | |
| | | def getTotalHurt(self): return self.totalHurt # 阵营总输出
|
| | |
|
| | | def clearLineups(self):
|
| | | ## 清除所有战斗阵容
|
| | |
| | | self.batBuffer = "" # 战报buffer,战报暂时只保留最后一个小队的
|
| | | self.isNeedReport = isNeedReport # 是否需要战报
|
| | | self.msgDict = {} # 扩展信息字典,一般由MapID绑定的功能决定信息内容 {k:v, ...}
|
| | | self._kvDict = {} # 自定义信息字典,不会被重置 {k:v, ...}
|
| | |
|
| | | self.factionDict = {} # 战斗阵营 {faction:BatFaction, ...},一般是只有两个阵营,faction为1或2,每个阵营支持多个阵容
|
| | | self.actionSortList = [] # 阵容行动顺序 [[faction, num], ...]
|
| | |
| | | self.setPVE()
|
| | | self.setPVP()
|
| | | self.msgDict = {}
|
| | | self._kvDict = {}
|
| | | self.nextTurnFight(msgDict)
|
| | | return
|
| | |
|
| | |
| | | self.tagPlayerID = tagPlayerID
|
| | | self.tagViewCache = tagViewCache
|
| | | return
|
| | | |
| | | def isFBMap(self):
|
| | | ## 是否副本地图中,非主线的均视为副本
|
| | | return self.mapID not in [ChConfig.Def_FBMapID_Main, ChConfig.Def_FBMapID_MainBoss]
|
| | | |
| | | def GetDictByKey(self, key): return self._kvDict.get(key, 0)
|
| | | def SetDict(self, key, value): self._kvDict[key] = value
|
| | |
|
| | | #def setPVPTeam(self):
|
| | | # return
|
| | |
| | | clientPack.FactionList.append(tfFaction)
|
| | | clientPack.FactionCnt = len(clientPack.FactionList)
|
| | | self.addBatPack(clientPack)
|
| | | return
|
| | | |
| | | def syncHelp(self, msgDict):
|
| | | ## 通知帮助信息,一般是副本用
|
| | | self.syncState(self.state, msgDict)
|
| | | return
|
| | |
|
| | | def syncState(self, state, msgDict={}):
|
| | |
| | | if not curPlayer:
|
| | | return
|
| | |
|
| | | tfGUID = batLineup.turnFight.guid
|
| | | turnFight = batLineup.turnFight
|
| | | tfGUID = turnFight.guid
|
| | | lineupPlayerID = lineupInfo.get("PlayerID", 0) # 阵容所属玩家ID
|
| | | heroDict = lineupInfo.get("Hero", {})
|
| | |
|
| | |
| | |
|
| | | batLineup.posObjIDDict[posNum] = objID
|
| | | GameWorld.DebugLog("AddBatObj %s,skill=%s" % (GetObjName(batObj), skillManager.GetSkillIDList()))
|
| | | if npcID:
|
| | | #副本指定NPC属性
|
| | | fbNPCInitAttrDict = FBLogic.GetFBNPCInitAttr(curPlayer, turnFight, batObj)
|
| | | if fbNPCInitAttrDict:
|
| | | GameWorld.DebugLog("副本指定NPC初始化属性: npcID=%s, %s" % (npcID, fbNPCInitAttrDict))
|
| | | attrDict = {str(k):v for k, v in fbNPCInitAttrDict.items()} # 统一格式
|
| | | batObj.InitBatAttr({int(k):v for k, v in attrDict.items()}, initXP)
|
| | |
|
| | | return
|
| | |
| | | npcLineupIDList, strongerLV, difficulty = [], 0, 0
|
| | | if fbLineIpyData:
|
| | | npcLineupIDList = fbLineIpyData.GetLineupIDList()
|
| | | strongerLV = fbLineIpyData.GetNPCLV()
|
| | | difficulty = fbLineIpyData.GetDifficulty()
|
| | |
|
| | | if not npcLineupIDList:
|
| | | ret = FBLogic.GetFBNPCLineupInfo(curPlayer, mapID, funcLineID)
|
| | |
| | | return True
|
| | |
|
| | | def SetObjKilled(turnFight, gameObj, killer=None, useSkill=None):
|
| | | curPlayer = turnFight.curPlayer
|
| | | npcID = gameObj.GetNPCID()
|
| | | |
| | | # 非主线的PVE目标怪物
|
| | | if npcID and curPlayer and turnFight.isFBMap() and gameObj.GetFaction() != ChConfig.Def_FactionA:
|
| | | if not FBLogic.OnFBNPCKilledBefore(curPlayer, turnFight, gameObj, killer):
|
| | | return
|
| | | |
| | | objID = gameObj.GetID()
|
| | | killerObjID = killer.GetID() if killer else 0
|
| | | skillID = useSkill.GetSkillID() if useSkill else 0
|
| | |
| | | clientPack.SkillID = skillID
|
| | | turnFight.addBatPack(clientPack)
|
| | |
|
| | | curPlayer = turnFight.curPlayer
|
| | | # 暂时只算主线小怪
|
| | | if curPlayer and turnFight.mapID == ChConfig.Def_FBMapID_Main and gameObj.GetFaction() != ChConfig.Def_FactionA:
|
| | | PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_KillNPC, 1)
|
| | |
| | | statInfo[str(faction)] = {}
|
| | | facStatInfo = statInfo[str(faction)]
|
| | | batFaction = turnFight.getBatFaction(faction)
|
| | | batFaction.totalHurt = 0
|
| | | for num in batFaction.lineupDict.keys():
|
| | | if str(num) not in facStatInfo:
|
| | | facStatInfo[str(num)] = {}
|
| | | lineupStatInfo = facStatInfo[str(num)]
|
| | | batLineup = batFaction.getBatlineup(num)
|
| | | batLineup.totalHurt = 0
|
| | | GameWorld.DebugLog("阵容明细: faction=%s,num=%s" % (faction, num))
|
| | | for posNum, objID in batLineup.posObjIDDict.items():
|
| | | batObj = batObjMgr.getBatObj(objID)
|
| | |
| | | atkHurt = batObj.hurtStat
|
| | | defHurt = batObj.defStat
|
| | | cureHP = batObj.cureStat
|
| | | batLineup.totalHurt += atkHurt
|
| | | batFaction.totalHurt += atkHurt
|
| | | GameWorld.DebugLog(" Pos:%s ID=%s,npcID=%s,heroID=%s,HP=%s/%s, 输出=%s,承伤=%s,治疗=%s"
|
| | | % (posNum, objID, npcID, heroID, batObj.GetHP(), batObj.GetMaxHP(), atkHurt, defHurt, cureHP))
|
| | | lineupStatInfo[str(posNum)] = {"ObjID":objID, "HeroID":heroID, "NPCID":npcID, "AtkHurt":atkHurt, "DefHurt":defHurt, "CureHP":cureHP}
|
| | |
| | | Def_FBMapID_Tianzi = 30020 # 天子考验
|
| | |
|
| | | #线路未过关时免费的地图
|
| | | UnPassFreeMapIDList = [Def_FBMapID_ArenaBattle]
|
| | | UnPassFreeMapIDList = [Def_FBMapID_Zhanchui]
|
| | | #按星级记录过关的地图
|
| | | PassByStarMapIDList = []
|
| | | #扫荡不需要检查是否已过关的地图
|
| | | SweepUnCheckPassMapIDList = [Def_FBMapID_Tianzi]
|
| | |
|
| | | #注册上传跨服服务器数据后直接进入跨服服务器的地图
|
| | | RegisterEnter_CrossServerMapIDList = []
|
| | |
| | | Def_PDict_UnXiantaoCntBooty = "UnXiantaoCntBooty_%s" # 累计未结算战利品掉落的战锤数,参数(itemID)
|
| | | Def_PDict_BootyDropToday = "BootyDropToday_%s" # 今日已累计掉落战利品数量,参数(itemID)
|
| | |
|
| | | #天子考验
|
| | | Def_PDict_TianziHisHurt = "TianziHisHurt_%s" # 历史最高伤害,求余亿部分,参数(bossID)
|
| | | Def_PDict_TianziHisHurtEx = "TianziHisHurtEx_%s" # 历史最高伤害,整除亿部分,参数(bossID)
|
| | | Def_PDict_TianziTodayHurt = "TianziTodayHurt" # 今日最高伤害,求余亿部分
|
| | | Def_PDict_TianziTodayHurtEx = "TianziTodayHurtEx" # 今日最高伤害,整除亿部分
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | #物品效果(ID或指定类型)对应的属性计算信息 {效果(ID/指定类型):[[属性索引, ...], 是否基础属性,(非)线性]}
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B2 08 获得仙缘币信息 #tagMCAddXianyuanCoinMsg
|
| | | # B2 01 天子考验信息 #tagSCTianziKYInfo
|
| | |
|
| | | class tagMCAddXianyuanCoinMsg(Structure):
|
| | | Head = tagHead()
|
| | | MapID = 0 #(DWORD MapID)
|
| | | FuncLineID = 0 #(BYTE FuncLineID)
|
| | | Relation = 0 #(BYTE Relation)// 当时的关系:0-无,1-好友,2-盟友
|
| | | RelationCoinAdd = 0 #(BYTE RelationCoinAdd)// 社交关系总加成
|
| | | XianyuanCoinAdd = 0 #(WORD XianyuanCoinAdd)// 实际增加的仙缘币
|
| | | Reason = 0 #(BYTE Reason)//仙缘币为0时的原因:1-助战次数上限;2-每日获得上限
|
| | | CallPlayerID = 0 #(DWORD CallPlayerID)// 助战的玩家ID,有值时代表真实助战,没有值时为自己打的
|
| | | NameLen = 0 #(BYTE NameLen)
|
| | | CallPlayerName = "" #(String CallPlayerName)// 助战的玩家名,size = NameLen
|
| | | IsSweep = 0 #(BYTE IsSweep)// 是否扫荡
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xB2
|
| | | self.Head.SubCmd = 0x08
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FuncLineID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.Relation,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.RelationCoinAdd,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.XianyuanCoinAdd,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.Reason,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.CallPlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.CallPlayerName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
|
| | | self.IsSweep,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xB2
|
| | | self.Head.SubCmd = 0x08
|
| | | self.MapID = 0
|
| | | self.FuncLineID = 0
|
| | | self.Relation = 0
|
| | | self.RelationCoinAdd = 0
|
| | | self.XianyuanCoinAdd = 0
|
| | | self.Reason = 0
|
| | | self.CallPlayerID = 0
|
| | | self.NameLen = 0
|
| | | self.CallPlayerName = ""
|
| | | self.IsSweep = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 1
|
| | | length += 1
|
| | | length += 1
|
| | | length += 2
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | length += len(self.CallPlayerName)
|
| | | length += 1
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.MapID)
|
| | | data = CommFunc.WriteBYTE(data, self.FuncLineID)
|
| | | data = CommFunc.WriteBYTE(data, self.Relation)
|
| | | data = CommFunc.WriteBYTE(data, self.RelationCoinAdd)
|
| | | data = CommFunc.WriteWORD(data, self.XianyuanCoinAdd)
|
| | | data = CommFunc.WriteBYTE(data, self.Reason)
|
| | | data = CommFunc.WriteDWORD(data, self.CallPlayerID)
|
| | | data = CommFunc.WriteBYTE(data, self.NameLen)
|
| | | data = CommFunc.WriteString(data, self.NameLen, self.CallPlayerName)
|
| | | data = CommFunc.WriteBYTE(data, self.IsSweep)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | MapID:%d,
|
| | | FuncLineID:%d,
|
| | | Relation:%d,
|
| | | RelationCoinAdd:%d,
|
| | | XianyuanCoinAdd:%d,
|
| | | Reason:%d,
|
| | | CallPlayerID:%d,
|
| | | NameLen:%d,
|
| | | CallPlayerName:%s,
|
| | | IsSweep:%d
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.MapID,
|
| | | self.FuncLineID,
|
| | | self.Relation,
|
| | | self.RelationCoinAdd,
|
| | | self.XianyuanCoinAdd,
|
| | | self.Reason,
|
| | | self.CallPlayerID,
|
| | | self.NameLen,
|
| | | self.CallPlayerName,
|
| | | self.IsSweep
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCAddXianyuanCoinMsg=tagMCAddXianyuanCoinMsg()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCAddXianyuanCoinMsg.Head.Cmd,m_NAtagMCAddXianyuanCoinMsg.Head.SubCmd))] = m_NAtagMCAddXianyuanCoinMsg
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B2 01 通知封魔坛双倍击杀状态 #tagMCFMTDoubleState
|
| | |
|
| | | class tagMCFMTDoubleState(Structure):
|
| | | class tagSCTianziKYInfo(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("IsDouble", c_ubyte), #是否双倍
|
| | | ("OldDouble", c_ubyte), #是否曾经允许双倍
|
| | | ("LineID", c_ubyte), #今日是哪个lineID,对应副本表的功能线路ID
|
| | | ("HistoryHurt", c_int), #本考验历史最大伤害,求余亿部分
|
| | | ("HistoryHurtEx", c_int), #本考验历史最大伤害,整除亿部分
|
| | | ("TodayHurt", c_int), #本考验今日最大伤害,求余亿部分
|
| | | ("TodayHurtEx", c_int), #本考验今日最大伤害,整除亿部分
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | def Clear(self):
|
| | | self.Cmd = 0xB2
|
| | | self.SubCmd = 0x01
|
| | | self.IsDouble = 0
|
| | | self.OldDouble = 0
|
| | | self.LineID = 0
|
| | | self.HistoryHurt = 0
|
| | | self.HistoryHurtEx = 0
|
| | | self.TodayHurt = 0
|
| | | self.TodayHurtEx = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCFMTDoubleState)
|
| | | return sizeof(tagSCTianziKYInfo)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// B2 01 通知封魔坛双倍击杀状态 //tagMCFMTDoubleState:
|
| | | DumpString = '''// B2 01 天子考验信息 //tagSCTianziKYInfo:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | IsDouble:%d,
|
| | | OldDouble:%d
|
| | | LineID:%d,
|
| | | HistoryHurt:%d,
|
| | | HistoryHurtEx:%d,
|
| | | TodayHurt:%d,
|
| | | TodayHurtEx:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.IsDouble,
|
| | | self.OldDouble
|
| | | self.LineID,
|
| | | self.HistoryHurt,
|
| | | self.HistoryHurtEx,
|
| | | self.TodayHurt,
|
| | | self.TodayHurtEx
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCFMTDoubleState=tagMCFMTDoubleState()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFMTDoubleState.Cmd,m_NAtagMCFMTDoubleState.SubCmd))] = m_NAtagMCFMTDoubleState
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #B2 02 推送提醒设置通知 #tagMCPushNotificationsSetting
|
| | |
|
| | | class tagMCPushNotificationsSetting(Structure):
|
| | | Head = tagHead()
|
| | | OnoffBit = 0 #(DWORD OnoffBit)// 按位约定开关
|
| | | TimeLen = 0 #(BYTE TimeLen)
|
| | | TimeStr = "" #(String TimeStr)// 时间字符串 01:02-05:00
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xB2
|
| | | self.Head.SubCmd = 0x02
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.OnoffBit,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.TimeLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TimeStr,_pos = CommFunc.ReadString(_lpData, _pos,self.TimeLen)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xB2
|
| | | self.Head.SubCmd = 0x02
|
| | | self.OnoffBit = 0
|
| | | self.TimeLen = 0
|
| | | self.TimeStr = ""
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 1
|
| | | length += len(self.TimeStr)
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.OnoffBit)
|
| | | data = CommFunc.WriteBYTE(data, self.TimeLen)
|
| | | data = CommFunc.WriteString(data, self.TimeLen, self.TimeStr)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | OnoffBit:%d,
|
| | | TimeLen:%d,
|
| | | TimeStr:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.OnoffBit,
|
| | | self.TimeLen,
|
| | | self.TimeStr
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCPushNotificationsSetting=tagMCPushNotificationsSetting()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCPushNotificationsSetting.Head.Cmd,m_NAtagMCPushNotificationsSetting.Head.SubCmd))] = m_NAtagMCPushNotificationsSetting
|
| | | m_NAtagSCTianziKYInfo=tagSCTianziKYInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCTianziKYInfo.Cmd,m_NAtagSCTianziKYInfo.SubCmd))] = m_NAtagSCTianziKYInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | |
|
| | | return callFunc(curPlayer, addExp, expViewType)
|
| | |
|
| | | ## 副本扫荡询问
|
| | | def OnPlayerFBSweepAsk(curPlayer, mapID, lineID, cnt, dataEx):
|
| | | ## 副本扫荡询问
|
| | | # @return: None - 不可扫荡
|
| | | # @return: 非None - 可以扫荡,且返回值直接传给 OnPlayerFBSweepResult
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(mapID)
|
| | |
|
| | | callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnPlayerFBSweepAsk"))
|
| | |
| | |
|
| | | return callFunc(curPlayer, mapID, lineID, cnt, dataEx)
|
| | |
|
| | | ## 副本扫荡结果
|
| | | def OnPlayerFBSweepResult(curPlayer, mapID, lineID, cnt, dataEx):
|
| | | def OnPlayerFBSweepResult(curPlayer, mapID, lineID, cnt, dataEx, askRet):
|
| | | ## 副本扫荡结果
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(mapID)
|
| | |
|
| | | callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnPlayerFBSweepResult"))
|
| | |
| | | if callFunc == None:
|
| | | return False
|
| | |
|
| | | return callFunc(curPlayer, mapID, lineID, cnt, dataEx)
|
| | | return callFunc(curPlayer, mapID, lineID, cnt, dataEx, askRet)
|
| | |
|
| | | ## 开始公共CD副本扫荡
|
| | | def OnStartPubCDFBSweep(curPlayer, mapID, lineID, cnt, dataEx):
|
| | |
| | |
|
| | | return callFunc(curPlayer, mapID, funcLineID)
|
| | |
|
| | | def GetFBNPCInitAttr(curPlayer, turnFight, npcObj):
|
| | | ## 获取副本指定NPC初始化属性
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(turnFight.mapID)
|
| | | |
| | | callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "GetFBNPCInitAttr"))
|
| | | if callFunc == None:
|
| | | return
|
| | | |
| | | return callFunc(curPlayer, turnFight, npcObj)
|
| | |
|
| | | def OnFBNPCKilledBefore(curPlayer, turnFight, gameObj, killer):
|
| | | ## 副本NPC被击杀前处理,一般用于处理一些不被击杀的副本NPC逻辑
|
| | | # @return: 可否被正常击杀
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(turnFight.mapID)
|
| | | |
| | | callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnFBNPCKilledBefore"))
|
| | | if callFunc == None:
|
| | | # 不需要逻辑时默认可被正常击杀
|
| | | return True
|
| | | |
| | | return callFunc(curPlayer, turnFight, gameObj, killer)
|
| | |
|
| | | def OnPlayerLineupAttackResult(curPlayer, atkObj, killObjList, useSkill, mapID, funcLineID):
|
| | | ## 回合战斗主动发起的玩家阵容攻击结果额外处理 ,一般处理副本相关的掉落、奖励等
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(mapID)
|
| New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package GameWorldLogic.FBProcess.GameLogic_Tianzi
|
| | | #
|
| | | # @todo:天子考验
|
| | | # @author hxp
|
| | | # @date 2025-09-30
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 天子考验
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-09-30 19:30"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import FBCommon
|
| | | import GameWorld
|
| | | import ItemControler
|
| | | import PlayerControl
|
| | | import PlayerBillboard
|
| | | import ChPyNetSendPack
|
| | | import NetPackCommon
|
| | | import IpyGameDataPY
|
| | | import ShareDefine
|
| | | import PlayerMail
|
| | | import DBDataMgr
|
| | | import ObjPool
|
| | |
|
| | | def OnDay():
|
| | | ## 结算昨日奖励
|
| | | __DoGiveTianziDayAward()
|
| | | return
|
| | |
|
| | | def OnFBPlayerOnDay(curPlayer):
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TianziTodayHurt, 0)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TianziTodayHurtEx, 0)
|
| | | SyncTianziInfo(curPlayer)
|
| | | return
|
| | |
|
| | | def OnFBPlayerOnLogin(curPlayer):
|
| | | SyncTianziInfo(curPlayer)
|
| | | return
|
| | |
|
| | | def GetTianziTodayInfo(curPlayer):
|
| | | ## 获取今日天子考验信息
|
| | | # @return: lineID, bossID
|
| | | |
| | | lineList = []
|
| | | for lineID in range(10):
|
| | | ipyData = IpyGameDataPY.GetIpyGameDataNotLog("FBLine", ChConfig.Def_FBMapID_Tianzi, lineID)
|
| | | if ipyData:
|
| | | lineList.append(ipyData)
|
| | | elif lineID > 0:
|
| | | break
|
| | | if not lineList:
|
| | | return 0, 0
|
| | | |
| | | ServerDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay)
|
| | | todayIpyData = lineList[ServerDay % len(lineList)]
|
| | | lineID = todayIpyData.GetLineID()
|
| | | bossID = 0
|
| | | for lineupID in todayIpyData.GetLineupIDList():
|
| | | lineupIpyData = IpyGameDataPY.GetIpyGameData("NPCLineup", lineupID)
|
| | | if not lineupIpyData:
|
| | | continue
|
| | | bossID = lineupIpyData.GetBossID()
|
| | | if bossID:
|
| | | break
|
| | | |
| | | return lineID, bossID
|
| | |
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
|
| | | ## 回合战斗请求 |
| | | |
| | | lineID, bossID = GetTianziTodayInfo(curPlayer)
|
| | | if funcLineID != lineID:
|
| | | GameWorld.DebugLog("非今日天子考验! mapID=%s,funcLineID=%s != %s,bossID=%s" % (mapID, funcLineID, lineID, bossID))
|
| | | return
|
| | | |
| | | return True
|
| | |
|
| | | def GetFBNPCInitAttr(curPlayer, turnFight, npcObj):
|
| | | ## 获取副本指定NPC初始化属性
|
| | | bossID = npcObj.GetNPCID()
|
| | | ipyDataList = IpyGameDataPY.GetIpyGameDataList("Tianzi", bossID)
|
| | | if not ipyDataList:
|
| | | return {}
|
| | | return __getBossAttrDict(ipyDataList[0])
|
| | |
|
| | | def OnFBNPCKilledBefore(curPlayer, turnFight, gameObj, killer):
|
| | | ## 副本NPC被击杀前处理,一般用于处理一些不被击杀的副本NPC逻辑
|
| | | # @return: 可否被正常击杀
|
| | | |
| | | # 本副本不可被击杀,直到所有血条抵扣完
|
| | | bossID = gameObj.GetNPCID()
|
| | | ipyDataList = IpyGameDataPY.GetIpyGameDataList("Tianzi", bossID)
|
| | | if not ipyDataList:
|
| | | return True
|
| | | |
| | | statDefValueTotal = gameObj.GetStatDefValue() # 当前总承伤
|
| | | hpNum = 1
|
| | | totalHPMax = 0
|
| | | ipyDataNow = None
|
| | | for ipyData in ipyDataList:
|
| | | hpNum = ipyData.GetHPNum()
|
| | | maxHP = ipyData.GetMaxHP()
|
| | | ipyDataNow = ipyData
|
| | | totalHPMax += maxHP
|
| | | if statDefValueTotal < totalHPMax:
|
| | | break
|
| | | |
| | | if not ipyDataNow:
|
| | | return True
|
| | | |
| | | hp = max(0, totalHPMax - statDefValueTotal)
|
| | | if hp <= 0:
|
| | | GameWorld.Log("天子考验全部血条被击杀! totalHPMax=%s,statDefValueTotal=%s" % (totalHPMax, statDefValueTotal))
|
| | | return True
|
| | | |
| | | gameObj.SetMaxHP(ipyDataNow.GetMaxHP(), True)
|
| | | gameObj.SetHP(hp, True)
|
| | | GameWorld.DebugLog("更新NPC血条: hpNum=%s,hp=%s/%s, statDefValueTotal=%s" % (hpNum, gameObj.GetHP(), gameObj.GetMaxHP(), statDefValueTotal))
|
| | | turnFight.SetDict("hpNum", hpNum)
|
| | | turnFight.syncHelp({"hpNum":hpNum})
|
| | | gameObj.UpdInitBatAttr(__getBossAttrDict(ipyDataNow))
|
| | | return False
|
| | |
|
| | | def __getBossAttrDict(ipyData):
|
| | | attrDict = {ChConfig.AttrID_Atk:ipyData.GetAtk(),
|
| | | ChConfig.AttrID_Def:ipyData.GetDef(),
|
| | | ChConfig.AttrID_MaxHP:ipyData.GetMaxHP(),
|
| | | }
|
| | | attrDict.update(ipyData.GetOtherAttrDict())
|
| | | return attrDict
|
| | |
|
| | | def OnTurnFightOver(curPlayer, turnFight, mapID, funcLineID, overMsg):
|
| | | ## 回合战斗结束
|
| | | |
| | | if not curPlayer:
|
| | | return
|
| | | |
| | | #isWin = turnFight.isWin
|
| | | lineID, bossID = GetTianziTodayInfo(curPlayer)
|
| | | if lineID != funcLineID:
|
| | | GameWorld.ErrLog("结算时非今日天子考验! mapID=%s,funcLineID=%s != %s,bossID=%s" % (mapID, funcLineID, lineID, bossID))
|
| | | return
|
| | | |
| | | hpNum = turnFight.GetDictByKey("hpNum")
|
| | | batFaction = turnFight.getBatFaction(ChConfig.Def_FactionA)
|
| | | totalHurt = batFaction.getTotalHurt()
|
| | | |
| | | historyHurt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziHisHurt % bossID)
|
| | | historyHurtEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziHisHurtEx % bossID)
|
| | | historyHurtTotal = historyHurtEx * ChConfig.Def_PerPointValue + historyHurt
|
| | | todayHurt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziTodayHurt)
|
| | | todayHurtEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziTodayHurtEx)
|
| | | todayHurtTotal = todayHurtEx * ChConfig.Def_PerPointValue + todayHurt
|
| | | |
| | | GameWorld.DebugLog("天子考验结算: lineID=%s,bossID=%s,hpNum=%s,totalHurt=%s,todayHurtTotal=%s,historyHurtTotal=%s" |
| | | % (lineID, bossID, hpNum, totalHurt, todayHurtTotal, historyHurtTotal))
|
| | | if totalHurt > historyHurtTotal:
|
| | | historyHurtTotal = totalHurt
|
| | | historyHurt = historyHurtTotal % ChConfig.Def_PerPointValue
|
| | | historyHurtEx = historyHurtTotal / ChConfig.Def_PerPointValue
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TianziHisHurt % bossID, historyHurt)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TianziHisHurtEx % bossID, historyHurtEx)
|
| | | GameWorld.DebugLog("更新历史最高伤害: %s" % historyHurtTotal)
|
| | | |
| | | if totalHurt > todayHurtTotal:
|
| | | todayHurtTotal = totalHurt
|
| | | todayHurt = todayHurtTotal % ChConfig.Def_PerPointValue
|
| | | todayHurtEx = todayHurtTotal / ChConfig.Def_PerPointValue
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TianziTodayHurt, todayHurt)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TianziTodayHurtEx, todayHurtEx)
|
| | | GameWorld.DebugLog("更新今日最高伤害: %s" % todayHurtTotal)
|
| | | #更新榜单
|
| | | PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_Tianzi, todayHurtEx, todayHurt)
|
| | | |
| | | itemList = __getTianziAwardList(todayHurt, bossID)
|
| | | FBCommon.AddEnterFBCount(curPlayer, mapID)
|
| | | ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["Tianzi", False, {}], isNotifyAward=False)
|
| | | overMsg.update({FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(itemList), "totalHurt":totalHurt, "todayHurtTotal":todayHurtTotal})
|
| | | SyncTianziInfo(curPlayer, lineID, bossID)
|
| | | return
|
| | |
|
| | | def __getTianziAwardList(todayHurt, bossID, sweepCnt=1):
|
| | | ## 获取结算奖励
|
| | | GameWorld.DebugLog("天子考验结算奖励: hurtValue=%s,bossID=%s" % (todayHurt, bossID))
|
| | | ipyDataList = IpyGameDataPY.GetIpyGameDataList("Tianzi", bossID)
|
| | | if not ipyDataList:
|
| | | return []
|
| | | awardDict = {}
|
| | | totalHPMax = 0
|
| | | for ipyData in ipyDataList:
|
| | | hpNum = ipyData.GetHPNum()
|
| | | maxHP = ipyData.GetMaxHP()
|
| | | totalHPMax += maxHP
|
| | | if todayHurt < totalHPMax:
|
| | | break
|
| | | randWeightItemList = ipyData.GetRandWeightItemList()
|
| | | randItemInfo = GameWorld.GetResultByWeightList(randWeightItemList)
|
| | | if not randItemInfo or len(randItemInfo) < 2:
|
| | | continue
|
| | | itemID = randItemInfo[0]
|
| | | itemCount = randItemInfo[1]
|
| | | awardDict[itemID] = awardDict.get(itemID, 0) + itemCount * sweepCnt
|
| | | GameWorld.DebugLog("血条编号: %s,itemID=%s,itemID=%s,%s" % (hpNum, itemID, itemCount, awardDict))
|
| | | |
| | | itemList = [[itemID, itemCount] for itemID, itemCount in awardDict.items()]
|
| | | GameWorld.DebugLog("最终奖励: %s" % itemList)
|
| | | return itemList
|
| | |
|
| | | def OnPlayerFBSweepAsk(curPlayer, mapID, lineID, sweepCnt, dataEx):
|
| | | ## 可否扫荡
|
| | | |
| | | _, bossID = GetTianziTodayInfo(curPlayer)
|
| | | todayHurt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziTodayHurt)
|
| | | todayHurtEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziTodayHurtEx)
|
| | | todayHurtTotal = todayHurtEx * ChConfig.Def_PerPointValue + todayHurt
|
| | | |
| | | if not bossID or not todayHurtTotal:
|
| | | GameWorld.DebugLog("天子考验今日还没有伤害无法扫荡!")
|
| | | return
|
| | | |
| | | return bossID, todayHurtTotal
|
| | |
|
| | | def OnPlayerFBSweepResult(curPlayer, mapID, lineID, sweepCnt, dataEx, askRet):
|
| | | ## 扫荡结果,次数消耗已在外层处理扣除
|
| | | |
| | | bossID, todayHurtTotal = askRet
|
| | | GameWorld.DebugLog("天子考验扫荡: mapID=%s,lineID=%s,sweepCnt=%s,todayHurtTotal=%s,bossID=%s" |
| | | % (mapID, lineID, sweepCnt, todayHurtTotal, bossID))
|
| | | itemList = __getTianziAwardList(todayHurtTotal, bossID, sweepCnt)
|
| | | ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["Tianzi", False, {}], isNotifyAward=False)
|
| | | |
| | | isPass = 1
|
| | | overDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(itemList), FBCommon.Over_isSweep:1, |
| | | "totalHurt":todayHurtTotal, "todayHurtTotal":todayHurtTotal}
|
| | | FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict)
|
| | | return True
|
| | |
|
| | | def SyncTianziInfo(curPlayer, lineID=None, bossID=None):
|
| | | if lineID == None:
|
| | | lineID, bossID = GetTianziTodayInfo(curPlayer)
|
| | | clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCTianziKYInfo)
|
| | | clientPack.LineID = lineID
|
| | | clientPack.HistoryHurt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziHisHurt % bossID)
|
| | | clientPack.HistoryHurtEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziHisHurtEx % bossID)
|
| | | clientPack.TodayHurt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziTodayHurt)
|
| | | clientPack.TodayHurtEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziTodayHurtEx)
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
|
| | | def __DoGiveTianziDayAward(): |
| | | GameWorld.Log("=== 天子考验结算排行奖励! ===")
|
| | | |
| | | billboardMgr = DBDataMgr.GetBillboardMgr()
|
| | | billBoard = billboardMgr.GetBillboard(ShareDefine.Def_BT_Tianzi)
|
| | | if not billBoard:
|
| | | return
|
| | | billBoard.SortDelayDo()
|
| | | |
| | | billboradAwardDict = IpyGameDataPY.GetFuncEvalCfg("TianziBillboradAward", 1, {})
|
| | | |
| | | orderList = [int(orderStr) for orderStr in billboradAwardDict.keys()]
|
| | | orderList.sort()
|
| | | GameWorld.Log(" 奖励名次列表: %s" % orderList)
|
| | | |
| | | awardOrder = orderList[0]
|
| | | orderPlayerIDDict = {}
|
| | | billboardCount, billboardMaxCount = billBoard.GetCount(), billBoard.GetMaxCount()
|
| | | GameWorld.Log(" 榜单数据数! billboardCount=%s,billboardMaxCount=%s" % (billboardCount, billboardMaxCount))
|
| | | for index in xrange(billboardCount):
|
| | | billBoardData = billBoard.At(index)
|
| | | if not billBoardData:
|
| | | continue
|
| | | order = index + 1
|
| | | |
| | | if order > awardOrder:
|
| | | nextOrderIndex = orderList.index(awardOrder) + 1
|
| | | if nextOrderIndex >= len(orderList):
|
| | | break
|
| | | awardOrder = orderList[nextOrderIndex]
|
| | | |
| | | playerID = billBoardData.GetID()
|
| | | if playerID < ShareDefine.RealPlayerIDStart:
|
| | | # 非真人不处理
|
| | | continue
|
| | | |
| | | orderPlayerIDDict[playerID] = [order, awardOrder]
|
| | | |
| | | paramList = [order]
|
| | | awardList = billboradAwardDict[str(awardOrder)]
|
| | | PlayerMail.SendMailByKey("TianziBillboardAward", playerID, awardList, paramList)
|
| | | |
| | | GameWorld.Log(" 奖励玩家名次信息: %s" % orderPlayerIDDict)
|
| | | return
|
| | |
| | |
|
| | | return True
|
| | |
|
| | | def OnPlayerFBSweepResult(curPlayer, mapID, lineID, sweepCnt, dataEx):
|
| | | def OnPlayerFBSweepResult(curPlayer, mapID, lineID, sweepCnt, dataEx, askRet):
|
| | | ## 扫荡结果,次数消耗已在外层处理扣除
|
| | |
|
| | | itemList = FBCommon.GetSweepAwardList(mapID, lineID, sweepCnt)
|
| | |
| | | ("list", "PassAwardList", 0),
|
| | | ("list", "SweepAwardList", 0),
|
| | | ("list", "LineupIDList", 0),
|
| | | ("WORD", "NPCLV", 0),
|
| | | ("float", "Difficulty", 0),
|
| | | ),
|
| | |
|
| | | "Tianzi":(
|
| | | ("DWORD", "BossID", 1),
|
| | | ("BYTE", "HPNum", 0),
|
| | | ("DWORD", "Atk", 0),
|
| | | ("DWORD", "Def", 0),
|
| | | ("DWORD", "MaxHP", 0),
|
| | | ("dict", "OtherAttrDict", 0),
|
| | | ("list", "RandWeightItemList", 0),
|
| | | ),
|
| | |
|
| | | "ADAward":(
|
| | |
| | | def GetPayMoneyType(self): return self.attrTuple[3] # 消耗货币类型 BYTE
|
| | | def GetPayMoneyValues(self): return self.attrTuple[4] # 消耗货币值列表 list |
| | | |
| | | # 副本功能线路表 |
| | | # 副本表 |
| | | class IPY_FBLine(): |
| | | |
| | | def __init__(self): |
| | |
| | | def GetLVLimitMin(self): return self.attrTuple[2] # 最低等级限制, 0为不限制 WORD
|
| | | def GetPassAwardList(self): return self.attrTuple[3] # 过关奖励 list
|
| | | def GetSweepAwardList(self): return self.attrTuple[4] # 扫荡奖励 list
|
| | | def GetLineupIDList(self): return self.attrTuple[5] # 阵容ID列表 list |
| | | def GetLineupIDList(self): return self.attrTuple[5] # 阵容ID列表 list
|
| | | def GetNPCLV(self): return self.attrTuple[6] # NPC等级 WORD
|
| | | def GetDifficulty(self): return self.attrTuple[7] # 难度系数 float |
| | | |
| | | # 天子考验 |
| | | class IPY_Tianzi(): |
| | | |
| | | def __init__(self): |
| | | self.attrTuple = None |
| | | return |
| | | |
| | | def GetBossID(self): return self.attrTuple[0] # DWORD
|
| | | def GetHPNum(self): return self.attrTuple[1] # BYTE
|
| | | def GetAtk(self): return self.attrTuple[2] # DWORD
|
| | | def GetDef(self): return self.attrTuple[3] # DWORD
|
| | | def GetMaxHP(self): return self.attrTuple[4] # DWORD
|
| | | def GetOtherAttrDict(self): return self.attrTuple[5] # 其他属性 {attrID:attrValue, ...} dict
|
| | | def GetRandWeightItemList(self): return self.attrTuple[6] # 宝箱随机物品权重列表,[[权重,物品ID,数量], ...] list |
| | | |
| | | # 广告奖励表 |
| | | class IPY_ADAward(): |
| | |
| | | self.__LoadFileData("ChinMap", onlyCheck)
|
| | | self.__LoadFileData("FBFunc", onlyCheck)
|
| | | self.__LoadFileData("FBLine", onlyCheck)
|
| | | self.__LoadFileData("Tianzi", onlyCheck)
|
| | | self.__LoadFileData("ADAward", onlyCheck)
|
| | | self.__LoadFileData("FBGeneralTrain", onlyCheck)
|
| | | self.__LoadFileData("DailyAction", onlyCheck)
|
| | |
| | | self.CheckLoadData("FBLine") |
| | | return self.ipyFBLineCache[index]
|
| | | |
| | | def GetTianziCount(self): |
| | | self.CheckLoadData("Tianzi") |
| | | return self.ipyTianziLen
|
| | | def GetTianziByIndex(self, index): |
| | | self.CheckLoadData("Tianzi") |
| | | return self.ipyTianziCache[index]
|
| | | |
| | | def GetADAwardCount(self): |
| | | self.CheckLoadData("ADAward") |
| | | return self.ipyADAwardLen
|
| | |
| | | else:
|
| | | return
|
| | |
|
| | | billBoard.SortDelayDo()
|
| | | orderList = [int(orderStr) for orderStr in billboradAwardDict.keys()]
|
| | | orderList.sort()
|
| | | GameWorld.Log(" 奖励名次列表: %s" % orderList)
|
| | |
| | | import PlayerSuccess
|
| | | import PlayerFreeGoods
|
| | | import ChItem
|
| | | import GameLogic_Tianzi
|
| | | import PlayerGoldInvest
|
| | | import PlayerCrossRealmPK
|
| | | import PlayerCrossChampionship
|
| | |
| | | def DoLogic_OnDay(tick):
|
| | | GameWorld.Log("MapServer -> OnDay!")
|
| | | #副本OnDay事件响应
|
| | | FBLogic.OnDay(tick)
|
| | | #FBLogic.OnDay(tick)
|
| | |
|
| | | #仙盟
|
| | | PlayerFamily.FamilyOnDay()
|
| | | PlayerArena.OnDay()
|
| | | GameLogic_Tianzi.OnDay()
|
| | |
|
| | | PlayerOfflineSupport.OnDay()
|
| | | playerManager = GameWorld.GetPlayerManager()
|
| | |
| | | import IpyGameDataPY
|
| | | import ShareDefine
|
| | | import NPCCommon
|
| | | import ChConfig
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | | def OnLogin(curPlayer):
|
| | |
| | | GameWorld.DebugLog("不存在该副本或线路无法扫荡!mapID=%s, lineID=%s" % (mapID, lineID))
|
| | | return
|
| | |
|
| | | if not FBCommon.IsFBPass(curPlayer, mapID, lineID):
|
| | | if mapID not in ChConfig.SweepUnCheckPassMapIDList and not FBCommon.IsFBPass(curPlayer, mapID, lineID):
|
| | | GameWorld.DebugLog("未过关无法扫荡!mapID=%s, lineID=%s" % (mapID, lineID))
|
| | | return
|
| | |
|
| | |
| | | return
|
| | |
|
| | | # 副本是否可扫荡, 这里只判断副本自身的特殊条件, 公共条件上面已经判断
|
| | | if not FBLogic.OnPlayerFBSweepAsk(curPlayer, mapID, lineID, cnt, dataEx):
|
| | | askRet = FBLogic.OnPlayerFBSweepAsk(curPlayer, mapID, lineID, cnt, dataEx)
|
| | | if not askRet:
|
| | | GameWorld.DebugLog("该副本当前无法扫荡!mapID=%s, lineID=%s" % (mapID, lineID))
|
| | | return
|
| | |
|
| | |
| | | FBCommon.AddEnterFBCount(curPlayer, mapID, cnt)
|
| | |
|
| | | #扫荡结果给奖励等
|
| | | FBLogic.OnPlayerFBSweepResult(curPlayer, mapID, lineID, cnt, dataEx)
|
| | | FBLogic.OnPlayerFBSweepResult(curPlayer, mapID, lineID, cnt, dataEx, askRet)
|
| | | return
|
| | |
|
| | | #// B1 08 快速一键过关副本 #tagCMFBQuickPass
|
| | |
| | | BillboardTypeList = (
|
| | | Def_BT_MainLevel, # 主线关卡过关榜 0
|
| | | Def_BT_Arena, # 演武场积分周榜 1
|
| | | ) = range(0, 2) |
| | | Def_BT_Tianzi, # 天子考验伤害榜 2
|
| | | ) = range(0, 3) |
| | |
|
| | | ''' 跨服排行榜类型, 从 150 开始,最大条数在功能配置表 CrossBillboardSet 配置,没配默认100
|
| | | 与本服榜单存储的是不一样的数据库表格,理论上类型可以和本服榜单类型重复,为了做下区分防误导,跨服榜单从 150 开始
|
| | |
| | |
|
| | | BillboardTypeAllList = BillboardTypeList + CrossBillboardTypeList
|
| | |
|
| | | BillboardNameDict = {Def_BT_MainLevel:"主线过关榜", Def_BT_Arena:"演武场积分周榜"}
|
| | | BillboardNameDict = {Def_BT_MainLevel:"主线过关榜", Def_BT_Arena:"演武场积分周榜", Def_BT_Tianzi:"天子考验伤害榜"}
|
| | |
|
| | | #仙盟榜单类型
|
| | | FamilyBillboardList = []
|