PySysDB/PySysDBPY.h
@@ -1580,3 +1580,14 @@ WORD SingleTimes; //单次领奖需要的次数 list Reward; //奖励物品 }; //诛仙BOSS表 struct tagZhuXianBoss { DWORD NPCID; //ID BYTE _LineID; WORD KillTime; //击杀总时间秒 WORD RealmLV; //需要境界 DWORD ZhuXianScore; //需要诛仙总评分 }; ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -532,6 +532,7 @@ ShareDefine.Def_UniversalGameRecType_FamilyRedPacketGrabRecord:10000000, #仙盟红包已抢信息记录 ShareDefine.Def_UniversalGameRecType_DujieHelpAllRecord:500, #渡劫副本护法总记录 ShareDefine.Def_UniversalGameRecType_DujieHelpRecord:10000, #渡劫副本护法详细记录 ShareDefine.Def_UniversalGameRecType_ZhuXianBossRecord:100, #诛仙BOSS结算记录 } #--------------------------------------------------------------------- #比较标识 @@ -671,6 +672,8 @@ Def_FBMapID_FamilyInvade = 31170 #封魔坛 Def_FBMapID_SealDemon = 52010 #诛仙BOSS Def_FBMapID_ZhuXianBoss = 31380 #仙魔之争 Def_FBMapID_XMZZ = 31010 #仙盟boss副本 @@ -686,6 +689,8 @@ #跨服蓬莱仙境 Def_FBMapID_CrossPenglai = 32020 #需要刷世界BOSS的副本 WorldBossFBMapIDList = [Def_FBMapID_SealDemon, Def_FBMapID_ZhuXianBoss] #跨服地图 Def_CrossMapIDList = [Def_FBMapID_CrossRealmPK, Def_FBMapID_CrossPenglai] #跨服对应分区配置表名 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -196,40 +196,60 @@ # A0 07 副本地图功能线路人数 #tagGCFBLinePlayerCnt class tagGCFBLineInfo(Structure): _pack_ = 1 _fields_ = [ ("FBLineID", c_ubyte), # 功能线路ID ("PlayerCnt", c_ushort), # 线路当前玩家数 ] FBLineID = 0 #(BYTE FBLineID)// 功能线路ID PlayerCnt = 0 #(WORD PlayerCnt)// 线路当前玩家数 ExtraStrLen = 0 #(WORD ExtraStrLen)// 长度 ExtraStr = "" #(String ExtraStr)// 额外信息 data = None def __init__(self): self.Clear() return def ReadData(self, stringData, _pos=0, _len=0): def ReadData(self, _lpData, _pos=0, _Len=0): self.Clear() memmove(addressof(self), stringData[_pos:], self.GetLength()) return _pos + self.GetLength() self.FBLineID,_pos = CommFunc.ReadBYTE(_lpData, _pos) self.PlayerCnt,_pos = CommFunc.ReadWORD(_lpData, _pos) self.ExtraStrLen,_pos = CommFunc.ReadWORD(_lpData, _pos) self.ExtraStr,_pos = CommFunc.ReadString(_lpData, _pos,self.ExtraStrLen) return _pos def Clear(self): self.FBLineID = 0 self.PlayerCnt = 0 self.ExtraStrLen = 0 self.ExtraStr = "" return def GetLength(self): return sizeof(tagGCFBLineInfo) length = 0 length += 1 length += 2 length += 2 length += len(self.ExtraStr) return length def GetBuffer(self): return string_at(addressof(self), self.GetLength()) data = '' data = CommFunc.WriteBYTE(data, self.FBLineID) data = CommFunc.WriteWORD(data, self.PlayerCnt) data = CommFunc.WriteWORD(data, self.ExtraStrLen) data = CommFunc.WriteString(data, self.ExtraStrLen, self.ExtraStr) return data def OutputString(self): DumpString = '''// A0 07 副本地图功能线路人数 //tagGCFBLinePlayerCnt: DumpString = ''' FBLineID:%d, PlayerCnt:%d PlayerCnt:%d, ExtraStrLen:%d, ExtraStr:%s '''\ %( self.FBLineID, self.PlayerCnt self.PlayerCnt, self.ExtraStrLen, self.ExtraStr ) return DumpString @@ -27341,6 +27361,58 @@ #------------------------------------------------------ # B2 12 诛仙BOSS协助次数 #tagMCZhuXianBossCnt class tagMCZhuXianBossCnt(Structure): _pack_ = 1 _fields_ = [ ("Cmd", c_ubyte), ("SubCmd", c_ubyte), ("Cnt", c_ubyte), # 剩余可协助次数 ] def __init__(self): self.Clear() self.Cmd = 0xB2 self.SubCmd = 0x12 return def ReadData(self, stringData, _pos=0, _len=0): self.Clear() memmove(addressof(self), stringData[_pos:], self.GetLength()) return _pos + self.GetLength() def Clear(self): self.Cmd = 0xB2 self.SubCmd = 0x12 self.Cnt = 0 return def GetLength(self): return sizeof(tagMCZhuXianBossCnt) def GetBuffer(self): return string_at(addressof(self), self.GetLength()) def OutputString(self): DumpString = '''// B2 12 诛仙BOSS协助次数 //tagMCZhuXianBossCnt: Cmd:%s, SubCmd:%s, Cnt:%d '''\ %( self.Cmd, self.SubCmd, self.Cnt ) return DumpString m_NAtagMCZhuXianBossCnt=tagMCZhuXianBossCnt() ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCZhuXianBossCnt.Cmd,m_NAtagMCZhuXianBossCnt.SubCmd))] = m_NAtagMCZhuXianBossCnt #------------------------------------------------------ # B4 11 新增恶意攻击玩家 #tagMCAddMaliciousAtkPlayer class tagMCAddMaliciousAtkPlayer(Structure): ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
@@ -485,7 +485,7 @@ if not isAlive: continue mapID = ipyData.GetMapID() if mapID != ChConfig.Def_FBMapID_SealDemon: if mapID not in ChConfig.WorldBossFBMapIDList: GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID, 1) return ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
@@ -899,11 +899,13 @@ fblinePack = ChPyNetSendPack.tagGCFBLinePlayerCnt() fblinePack.MapID = tagMapID fblinePack.FBLineInfoList = [] for lineID, playerCnt in fbLinePlayerCntDict.items(): for lineID, infoList in fbLinePlayerCntDict.items(): mapLineState = ChPyNetSendPack.tagGCFBLineInfo() mapLineState.Clear() mapLineState.FBLineID = lineID mapLineState.PlayerCnt = playerCnt mapLineState.PlayerCnt = infoList[0] if infoList else 0 mapLineState.ExtraStr = infoList[1] if len(infoList) > 1 else '' mapLineState.ExtraStrLen = len(mapLineState.ExtraStr) fblinePack.FBLineInfoList.append(mapLineState) fblinePack.Count = len(fblinePack.FBLineInfoList) ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py
@@ -103,7 +103,7 @@ return #封魔坛副本判断里面的BOSS是否到了刷新时间 if tagMapID == ChConfig.Def_FBMapID_SealDemon: if tagMapID in ChConfig.WorldBossFBMapIDList: bossID = mapInfo[2] if not GameWorldBoss.GetBossIsAliveOrCanReborn(bossID): return ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerZhuXianBoss.py
New file @@ -0,0 +1,45 @@ #!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package PlayerZhuXianBoss # # @todo:诛仙BOSS # @author xdh # @date 2019-01-19 # @version 1.0 # # # 详细描述: 诛仙BOSS # #--------------------------------------------------------------------- """Version = 2019-01-19 17:00""" import GameWorld import PlayerUniversalGameRec import ShareDefine import PlayerControl RecType = ShareDefine.Def_UniversalGameRecType_ZhuXianBossRecord ## 玩家登录 # @param None # @return None def OnPlayerLogin(curPlayer): universalRecMgr = GameWorld.GetUniversalRecMgr() recTypeListData = universalRecMgr.GetTypeList(RecType) for index in xrange(recTypeListData.Count()): recData = recTypeListData.At(index) playerID = recData.GetValue1() if playerID == curPlayer.GetID(): lineID = recData.GetValue2() recTypeListData.Delete(index) result = str(lineID) curPlayer.MapServer_QueryPlayerResult(0, 0, "ZhuXianBossAward", result, len(result)) return return ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -878,6 +878,7 @@ GameFuncID_LittleHelper = 146 # 小助手 GameFuncID_TJG = 147 # 脱机挂 GameFuncID_SuperGift = 150 # 超值礼包 GameFuncID_ZhuXianBoss = 163 # 诛仙BOSS # 以下为暂时无用的 GameFuncID_Truck = 33 # 运镖 GameFuncID_RunDaily = 34 # 日常跑环 @@ -962,7 +963,7 @@ Def_UniversalGameRecType_StoreServerCntRecord, #商店全服购买记录 8, Def_UniversalGameRecType_FBHelpBattleCheckInPlayer, #助战玩家登记记录9 Def_UniversalGameRecType_FBHelpBattleRecord, #助战未同步记录10 Def_UniversalGameRecType_11, Def_UniversalGameRecType_ZhuXianBossRecord, #诛仙BOSS结算记录11 Def_UniversalGameRecType_12, Def_UniversalGameRecType_13, Def_UniversalGameRecType_Reward, # 通用奖励表(TopBar)14 @@ -1521,7 +1522,8 @@ DailyActionID_IceLode, # 冰晶矿脉 DailyActionID_HelpBattleCheckIn, # 助战登记 20 DailyActionID_CrossReamPK, # 跨服PK 21 ) = range(1, 21 + 1) DailyActionID_ZhuXianBoss, # 诛仙BOSS 22 ) = range(1, 22 + 1) ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1782,7 +1782,8 @@ Def_FBMapID_SealDemon = 52010 #单人封魔坛 Def_FBMapID_SealDemonEx = 52020 #诛仙BOSS Def_FBMapID_ZhuXianBoss = 31380 #仙魔之争 Def_FBMapID_XMZZ = 31010 #神兽副本 @@ -1793,6 +1794,7 @@ Def_FBMapID_CrossRealmPK = 32010 #跨服蓬莱仙境 Def_FBMapID_CrossPenglai = 32020 #注册上传跨服服务器数据后直接进入跨服服务器的地图 RegisterEnter_CrossServerMapIDList = [Def_FBMapID_CrossPenglai] @@ -1805,7 +1807,7 @@ #副本关闭时未拾取的物品邮件发放给玩家 #这里只有需要的副本才配置,不做默认逻辑,防止某些副本实际不能给导致刷物品,如麒麟之府 Def_SendUnPickItemMailMapIDList = [Def_FBMapID_IceLode, Def_FBMapID_PersonalBoss, Def_FBMapID_MunekadoTrial, Def_FBMapID_SealDemon, Def_FBMapID_SealDemonEx] Def_FBMapID_SealDemon, Def_FBMapID_SealDemonEx, Def_FBMapID_ZhuXianBoss] #金钱不掉物品直接给玩家的地图 Def_GiveMoneyMapIDList = [] @@ -1819,7 +1821,7 @@ Def_MapID_LineIDToPropertyID = [Def_FBMapID_ElderBattlefield] # 进入副本需要发送到GameServer的地图 Def_MapID_SendToGameServer = [Def_FBMapID_FamilyInvade, Def_FBMapID_FamilyBossMap, Def_FBMapID_SealDemon, Def_FBMapID_FamilyWar] + Def_MapID_LineIDToPropertyID Def_MapID_SendToGameServer = [Def_FBMapID_FamilyInvade, Def_FBMapID_FamilyBossMap, Def_FBMapID_SealDemon, Def_FBMapID_FamilyWar, Def_FBMapID_ZhuXianBoss] + Def_MapID_LineIDToPropertyID ## 进入副本需要根据请求的功能线路处理的地图, hxp-改了进入模式,暂不需要了 180320 #Def_MapID_ReqFBFuncLine = [Def_FBMapID_KirinHome, Def_FBMapID_BZZD, Def_FBMapID_SealDemonEx, @@ -1827,10 +1829,10 @@ # + Def_FBMapID_ClearDevil # 刷新标识点在无玩家的情况下也需要刷新的地图 Def_NoPlayerNeedProcessRefreshPointMap = [Def_FBMapID_SealDemon, Def_FBMapID_GodArea, Def_FBMapID_BossHome, Def_FBMapID_GatherSoul] Def_NoPlayerNeedProcessRefreshPointMap = [Def_FBMapID_SealDemon, Def_FBMapID_GodArea, Def_FBMapID_BossHome, Def_FBMapID_GatherSoul, Def_FBMapID_ZhuXianBoss] # 可重复进的副本 Def_NoLimitEnterCntMap = [Def_FBMapID_FamilyParty, Def_FBMapID_FamilyWar, Def_FBMapID_FamilyInvade, Def_FBMapID_ElderBattlefield] Def_NoLimitEnterCntMap = [Def_FBMapID_FamilyParty, Def_FBMapID_FamilyWar, Def_FBMapID_FamilyInvade, Def_FBMapID_ElderBattlefield, Def_FBMapID_ZhuXianBoss] # 无玩家时不自动关闭的自伸缩副本 Def_NoPlayerNotCloseAutoSizeMap = [Def_FBMapID_FamilyInvade, Def_FBMapID_FamilyBossMap, Def_FBMapID_GatherSoul] @@ -1890,6 +1892,7 @@ 'XMZZ':[Def_FBMapID_XMZZ], #仙魔之争 'CrossRealmPK':[Def_FBMapID_CrossRealmPK], #跨服竞技场 'GatherSoul':[Def_FBMapID_GatherSoul],#聚魂副本 'ZhuXianBoss':[Def_FBMapID_ZhuXianBoss],#诛仙BOSS } #特殊副本ID, 由系统分配, 进入时候不验证IsMapCopyFull @@ -3725,6 +3728,9 @@ Def_PDict_LoginAwardID = "LoginAwardID" # 玩家身上的BOSS复活活动ID,唯一标识,取活动开始日期time值 Def_PDict_LoginAwardCurTimes = "LoginAwardCurTimes_%s_%s" #当前完成次数 参数(第X天,模板ID) Def_PDict_LoginAwardGotTimes = "LoginAwardGotTimes_%s_%s" #当前已领次数 参数(第X天,模板ID) #诛仙BOSS Def_PDict_ZhuXianBossHelpCnt = "ZhuXianBossHelpCnt" # 协助次数 #------------------------------------------------------------------------------- #类型 Def_PDictType_OnlinePrize Def_PDict1_OnlinePrizeCnt = "OnlinePrizeCnt" # 新手在线已领取奖励次数 @@ -4985,7 +4991,8 @@ VIPPrivilege_32, #32 封魔坛自动挑战 VIPPrivilege_XianyuanCoinUpperAdd, #33 仙缘币上限加成 VIPPrivilege_XianyuanCoinAddPer, #34 仙缘币获得倍率加成(万分比) ) = range(1, 35) VIPPrivilege_35, #35 诛仙BOSS购买次数 - 副本总表统一处理 ) = range(1, 36) ( ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -196,40 +196,60 @@ # A0 07 副本地图功能线路人数 #tagGCFBLinePlayerCnt class tagGCFBLineInfo(Structure): _pack_ = 1 _fields_ = [ ("FBLineID", c_ubyte), # 功能线路ID ("PlayerCnt", c_ushort), # 线路当前玩家数 ] FBLineID = 0 #(BYTE FBLineID)// 功能线路ID PlayerCnt = 0 #(WORD PlayerCnt)// 线路当前玩家数 ExtraStrLen = 0 #(WORD ExtraStrLen)// 长度 ExtraStr = "" #(String ExtraStr)// 额外信息 data = None def __init__(self): self.Clear() return def ReadData(self, stringData, _pos=0, _len=0): def ReadData(self, _lpData, _pos=0, _Len=0): self.Clear() memmove(addressof(self), stringData[_pos:], self.GetLength()) return _pos + self.GetLength() self.FBLineID,_pos = CommFunc.ReadBYTE(_lpData, _pos) self.PlayerCnt,_pos = CommFunc.ReadWORD(_lpData, _pos) self.ExtraStrLen,_pos = CommFunc.ReadWORD(_lpData, _pos) self.ExtraStr,_pos = CommFunc.ReadString(_lpData, _pos,self.ExtraStrLen) return _pos def Clear(self): self.FBLineID = 0 self.PlayerCnt = 0 self.ExtraStrLen = 0 self.ExtraStr = "" return def GetLength(self): return sizeof(tagGCFBLineInfo) length = 0 length += 1 length += 2 length += 2 length += len(self.ExtraStr) return length def GetBuffer(self): return string_at(addressof(self), self.GetLength()) data = '' data = CommFunc.WriteBYTE(data, self.FBLineID) data = CommFunc.WriteWORD(data, self.PlayerCnt) data = CommFunc.WriteWORD(data, self.ExtraStrLen) data = CommFunc.WriteString(data, self.ExtraStrLen, self.ExtraStr) return data def OutputString(self): DumpString = '''// A0 07 副本地图功能线路人数 //tagGCFBLinePlayerCnt: DumpString = ''' FBLineID:%d, PlayerCnt:%d PlayerCnt:%d, ExtraStrLen:%d, ExtraStr:%s '''\ %( self.FBLineID, self.PlayerCnt self.PlayerCnt, self.ExtraStrLen, self.ExtraStr ) return DumpString @@ -27341,6 +27361,58 @@ #------------------------------------------------------ # B2 12 诛仙BOSS协助次数 #tagMCZhuXianBossCnt class tagMCZhuXianBossCnt(Structure): _pack_ = 1 _fields_ = [ ("Cmd", c_ubyte), ("SubCmd", c_ubyte), ("Cnt", c_ubyte), # 剩余可协助次数 ] def __init__(self): self.Clear() self.Cmd = 0xB2 self.SubCmd = 0x12 return def ReadData(self, stringData, _pos=0, _len=0): self.Clear() memmove(addressof(self), stringData[_pos:], self.GetLength()) return _pos + self.GetLength() def Clear(self): self.Cmd = 0xB2 self.SubCmd = 0x12 self.Cnt = 0 return def GetLength(self): return sizeof(tagMCZhuXianBossCnt) def GetBuffer(self): return string_at(addressof(self), self.GetLength()) def OutputString(self): DumpString = '''// B2 12 诛仙BOSS协助次数 //tagMCZhuXianBossCnt: Cmd:%s, SubCmd:%s, Cnt:%d '''\ %( self.Cmd, self.SubCmd, self.Cnt ) return DumpString m_NAtagMCZhuXianBossCnt=tagMCZhuXianBossCnt() ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCZhuXianBossCnt.Cmd,m_NAtagMCZhuXianBossCnt.SubCmd))] = m_NAtagMCZhuXianBossCnt #------------------------------------------------------ # B4 11 新增恶意攻击玩家 #tagMCAddMaliciousAtkPlayer class tagMCAddMaliciousAtkPlayer(Structure): ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
@@ -25,6 +25,7 @@ import GameObj import NPCCommon import GameLogic_SealDemon import GameLogic_ZhuXianBoss ## GM命令执行入口 # @param curPlayer 当前玩家 @@ -38,6 +39,12 @@ lineID = gameWorld.GetPropertyID() - 1 gameWorld.SetGameWorldDict(GameLogic_SealDemon.FBDict_RemainHP % lineID, 1) return if curPlayer.GetMapID() == ChConfig.Def_FBMapID_ZhuXianBoss: #诛仙BOSS击杀怪 gameWorld = GameWorld.GetGameWorld() lineID = gameWorld.GetPropertyID() - 1 gameWorld.SetGameWorldDict(GameLogic_ZhuXianBoss.FBDict_RemainHP % lineID, 1) return isMapAllNPC = 0 if len(playerList) > 0: ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -31,7 +31,7 @@ import PlayerFamily import PlayerActivity import PlayerSuccess import PlayerMagicWeapon import GameFuncComm import PyGameData import PlayerVip import GameObj @@ -1694,6 +1694,13 @@ newEnterCnt = max(0, dayTimes - (maxCnt - enterCnt)) PlayerControl.NomalDictSetProperty(curPlayer, enterCntKey, newEnterCnt) GameWorld.DebugLog(" 特殊副本已进入次数更新: newEnterCnt=%s" % newEnterCnt) elif mapID == ChConfig.Def_FBMapID_ZhuXianBoss: if GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_ZhuXianBoss): curCnt = min(maxCnt - enterCnt + IpyGameDataPY.GetFuncCfg('ZhuXianBossCntCfg'), IpyGameDataPY.GetFuncCfg('ZhuXianBossCntCfg', 2)) if curCnt > dayTimes: PlayerControl.NomalDictSetProperty(curPlayer, itemAddCntKey, curCnt - dayTimes) elif curCnt < dayTimes: PlayerControl.NomalDictSetProperty(curPlayer, enterCntKey, dayTimes - curCnt) mapIDInfo.append(mapID) @@ -1759,6 +1766,9 @@ if mapID == ChConfig.Def_FBMapID_SealDemon and maxDayTimes and maxCnt - enterCnt >= maxDayTimes: GameWorld.DebugLog('当前次数已满,无需购买。。') return if mapID == ChConfig.Def_FBMapID_ZhuXianBoss and maxCnt - enterCnt >= IpyGameDataPY.GetFuncCfg('ZhuXianBossCntCfg', 2): return if hasBuyCnt >= canBuyCnt: GameWorld.DebugLog("购买次数已经用完mapID=%s"%mapID) return ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_ZhuXianBoss.py
New file @@ -0,0 +1,664 @@ #!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_ZhuXianBoss # # @todo:诛仙boss # @author xdh # @date 2019-01-18 # @version 1.0 # # 详细描述: 诛仙boss # #------------------------------------------------------------------------------- #"""Version = 2019-01-18 14:30""" #------------------------------------------------------------------------------- import FBCommon import GameWorld import IPY_GameWorld import GameWorldProcess import IpyGameDataPY import ChConfig import PyGameData import PlayerControl import NPCCommon import ItemCommon import ChPyNetSendPack import ShareDefine import EventShell import NPCCustomRefresh import PlayerSuccess import PlayerActivity import NetPackCommon import ItemControler import PlayerMagicWeapon import PlayerBossReborn import PlayerFairyCeremony import PlayerWeekParty import EventReport FBDict_StartTick = 'FBDict_StartTick%s' #开始时间 FBDict_Speed = 'FBDict_Speed%s' #掉血速度 /s FBDict_RemainHP = 'FBDict_RemainHP%s' #剩余时间 FBPlayerDict_EncourageLV = 'FBPlayerDict_EncourageLV' # 鼓舞等级 FBDict_IsOver = 'FBDict_IsOver' #是否已结算, 结算时的tick FBDict_IsReduceing = 'FBDict_IsReduceing%s' #是否掉血中 FBPlayerDict_Rank = "FBPlayerDict_Rank" # 玩家排名 FBDict_BossTotalHP = 'FBDict_BossTotalHP%s' #BOSS血量 g_npcHurtDict = {} def OnFBPlayerOnLogin(curPlayer): NotifyZXHelpCnt(curPlayer) return def OnFBPlayerOnDay(curPlayer): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhuXianBossHelpCnt, IpyGameDataPY.GetFuncCfg('ZhuXianBossCntCfg', 3)) NotifyZXHelpCnt(curPlayer) return def NotifyZXHelpCnt(curPlayer): ##通知协助次数 packData = ChPyNetSendPack.tagMCZhuXianBossCnt() packData.Cnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt) NetPackCommon.SendFakePack(curPlayer, packData) return ## 是否能够通过活动查询进入 # @param curPlayer 玩家实例 # @param mapID 地图ID # @param lineID 线路id # @param tick 时间戳 # @return 布尔值 def OnEnterFBEvent(curPlayer, mapID, lineID, tick): #境界要求、诛仙总评分、玩家等级、归属次数不为0或有同盟玩家在副本里协助次数不为0 ipyData = IpyGameDataPY.GetIpyGameData('ZhuXianBoss', lineID) if not ipyData: return if curPlayer.GetOfficialRank() < ipyData.GetRealmLV(): return #诛仙总评分 enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss) if enterCnt >= FBCommon.GetEnterFBMaxCnt: if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt): return if not curPlayer.GetFamilyID(): GameWorld.DebugLog(" 有归属次数为但没有进仙盟!", curPlayer.GetPlayerID()) return return True def GetHasSameFamilyMerber(curFamilyID, playerManager): ##副本里是否有同盟成员 GameWorld.Log('检查副本里是否有同盟成员 curFamilyID=%s'%curFamilyID) if not curFamilyID: return for index in range(0 , playerManager.GetPlayerCount()): player = playerManager.GetPlayerByIndex(index) if not player.GetPlayerID(): continue if player.GetFamilyID() == curFamilyID: return True return ##副本玩家进入点 # @param curPlayer 玩家实例 # @param mapID 地图ID # @param lineId 分线ID # @param ipyEnterPosInfo 功能线路IPY配置坐标信息 # @param tick 时间戳 # @return posX, posY, 随机半径(可选) def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick): return ipyEnterPosInfo ### 查询地图是否开启 ## @param tick 时间戳 ## @return 布尔值 #def OnCanOpen(tick): # return True ##查询是否可以进入地图 # @param ask:请求结构体(IPY_BMChangeMapAsk) # @param tick:时间戳 # @return IPY_GameWorld.cme 枚举 def OnChangeMapAsk(ask, tick): return IPY_GameWorld.cmeAccept ##开启副本 # @param tick 时间戳 # @return 返回值无意义 # @remarks 开启副本 def OnOpenFB(tick): lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 bossID = CurFBLineBOSSID(lineID) if not bossID: return key = ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID GameWorld.GetGameWorld().SetGameWorldDict(key, 1) GameWorld.DebugLog(' ˢBOSSbossID=%s' % bossID) ipyData = IpyGameDataPY.GetIpyGameData('ZhuXianBoss', lineID) GameWorld.GetGameWorld().SetGameWorldDict(FBDict_BossTotalHP%lineID, ipyData.GetKillTime() * 1000) return ## 进副本 # @param curPlayer # @param tick # @return None def DoEnterFB(curPlayer, tick): playerID = curPlayer.GetPlayerID() mapID = GameWorld.GetMap().GetMapID() lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 playerCnt = GameWorld.GetGameWorld().GetMapCopyPlayerManager().GetPlayerCount() GameWorld.DebugLog("DoEnterFB...playerCnt=%s,lineID=%s" % (playerCnt, lineID), playerID) if lineID < 0: PlayerControl.PlayerLeaveFB(curPlayer) return hadDelTicket = FBCommon.GetHadDelTicket(curPlayer) if not hadDelTicket: FBCommon.SetHadDelTicket(curPlayer) PyGameData.g_fbPickUpItemDict.pop(playerID, 0) # if playerCnt == 1: # posX, posY = IpyGameDataPY.GetFuncEvalCfg('ZhuXianBossFirstPos') # GameWorld.ResetPlayerPos(curPlayer, posX, posY) EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, 0, ChConfig.CME_Log_Start) UpdateHurtInfo(curPlayer, 0, True) UpdateHPReduceSpeed(tick) gameFB = GameWorld.GetGameFB() # 上鼓舞buff encourageLV = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_EncourageLV) if encourageLV > 0: FBCommon.AddFbEncourageBuff(curPlayer, FBPlayerDict_EncourageLV, tick) else: FBCommon.SendFBEncourageInfo(curPlayer, encourageLV) #DoFBHelp(curPlayer, tick) return ##关闭副本 # @param tick 时间戳 # @return 无意义 # @remarks def OnCloseFB(tick): gameWorld = GameWorld.GetGameWorld() lineID = gameWorld.GetPropertyID() - 1 gameWorld.SetGameWorldDict(FBDict_StartTick % lineID, 0) gameWorld.SetGameWorldDict(FBDict_Speed % lineID, 0) gameWorld.SetGameWorldDict(FBDict_RemainHP % lineID, 0) gameWorld.SetPropertyID(0) return ##玩家退出副本 # @param curPlayer 玩家实例 # @param tick 时间戳 # @return 无意义 def DoExitFB(curPlayer, tick): global g_npcHurtDict gameWorld = GameWorld.GetGameWorld() # 清除鼓舞buff FBCommon.ClearEncourageBuff(curPlayer, tick) #最后一人 if gameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 1: lineID = gameWorld.GetPropertyID() - 1 PyGameData.g_ZhuXianBossPlayerHurtDict[lineID] = {} g_npcHurtDict[lineID] = {} gameWorld.SetGameWorldDict(FBDict_StartTick % lineID, 0) GameWorld.GetGameFB().ClearGameFBDict() GameWorldProcess.CloseFB(tick) return UpdateHPReduceSpeed(tick, True) return ##玩家主动离开副本. # @param curPlayer 玩家实例 # @param tick 时间戳 # @return 返回值无意义 def DoPlayerLeaveFB(curPlayer, tick): FBCommon.SetHadDelTicket(curPlayer, 0) #主动退出的去掉排行榜信息 lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 playerHurtDict = PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {}) playerHurtDict.pop(curPlayer.GetPlayerID(), 0) PyGameData.g_ZhuXianBossPlayerHurtDict[lineID] = playerHurtDict if not playerHurtDict: #榜上没人,停止掉血 StopReduceHP(lineID, tick) return ##玩家切换地图 def DoPlayerChangeMapLogic(curPlayer): FBCommon.SetHadDelTicket(curPlayer, 0) return ## 是否副本复活 # @param None # @return 是否副本复活 def OnPlayerReborn(): return True ## 获得副本帮助信息 # @param curPlayer 当前玩家(被通知对象) # @param tick 当前时间 # @return None def DoFBHelp(curPlayer, tick): #伤害排行信息 hurtInfo = [] lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 playerHurtList = PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {}).items() npcHurtList = g_npcHurtDict.get(lineID, {}).items() syncHurtList = (playerHurtList + npcHurtList)[:5] syncHurtList.sort(key=lambda asd:asd[1][1], reverse=True) for i, info in enumerate(syncHurtList, 1): playerName, hurt = info[1][:2] hurtDict = {} hurtDict["rank"] = i hurtDict["playerName"] = playerName hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue hurtInfo.append(hurtDict) myRank = __GetSelfHurtRank(curPlayer) if myRank and myRank > 5: hurtDict = {} hurtDict["rank"] = myRank info = playerHurtList[myRank - 1] playerName, hurt = info[1][:2] hurtDict["playerName"] = playerName hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue hurtInfo.append(hurtDict) curSpeed = GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_Speed % lineID) isReduceing = GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_IsReduceing % lineID) remainHP = GetBossRemainHP(lineID, tick) totalHP = __GetBossTotalHP(lineID) hpReduceSpeed = curSpeed * 10000 / totalHP if totalHP else 0 remainHPPer = min(100, remainHP * 100 / totalHP) if totalHP else 0 fbHelpDict = {FBCommon.Help_lineID:lineID, "hurtInfo":hurtInfo, 'hpReduceSpeed':hpReduceSpeed, 'remainHPPer':remainHPPer, 'isReduceing':isReduceing} GameWorld.DebugLog("DoFBHelp: %s" % fbHelpDict, curPlayer.GetPlayerID()) FBCommon.Notify_FBHelp(curPlayer, fbHelpDict) return def __GetSelfHurtRank(curPlayer): #获取自己的排名 playerName = curPlayer.GetName() lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 playerHurtList = __GetSortHurtList(lineID) myRank = 0 for i, info in enumerate(playerHurtList): if playerName == info[1][0]: myRank = i + 1 break return myRank ## 副本行为 # @param curPlayer 玩家 # @param actionType 行为类型 # @param actionInfo 行为信息 # @param tick 当前时间 # @return None def DoFBAction(curPlayer, actionType, actionInfo, tick): if actionType == 0: FBCommon.FbEncourageBuff(curPlayer, FBPlayerDict_EncourageLV, actionInfo, tick) return ## 玩家对NPC造成伤害 # @param curPlayer 当前玩家 # @param curNPC # @param hurtHP # @return None def DoFB_Player_HurtNPC(curPlayer, curNPC, hurtHP): UpdateHurtInfo(curPlayer, hurtHP) return # def UpdateHurtInfo(curPlayer, hurtHP, isAdd=False): enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss) if enterCnt >= FBCommon.GetEnterFBMaxCnt: #没归属的不进伤害榜 return lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 playerName = curPlayer.GetName() playerID = curPlayer.GetPlayerID() familyID = curPlayer.GetFamilyID() playerHurtDict = PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {}) if playerID not in playerHurtDict: if not isAdd: return playerHurtDict[playerID] = [playerName, hurtHP, familyID] else: playerHurtDict[playerID][1] += hurtHP PyGameData.g_ZhuXianBossPlayerHurtDict[lineID] = playerHurtDict #有人上榜开始掉血 StartReduceHP(lineID, GameWorld.GetGameWorld().GetTick()) return ##---副本总逻辑计时器--- # @param tick:时间戳 # @return 无意义 # @remarks 副本总逻辑计时器 def OnProcess(tick): gameFB = GameWorld.GetGameFB() overTick = gameFB.GetGameFBDictByKey(FBDict_IsOver) # 结算20秒后强制关闭副本, 防止玩家不捡东西导致不结算,强关后地板上的东西会邮件发放给玩家 if overTick and tick - overTick >= ChConfig.Def_FBPickupItemTime: GameWorld.Log("强制踢出玩家关闭副本: overTick=%s,tick=%s" % (overTick, tick)) FBCommon.DoLogic_FBKickAllPlayer() return mapID = GameWorld.GetMap().GetMapID() lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 if lineID <0: return gameWorld = GameWorld.GetGameWorld() startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick % lineID) if not startTick: return FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 5000) __CheckBossHP(tick) return def __GetSortHurtList(lineID): playerHurtDict = PyGameData.g_ZhuXianBossPlayerHurtDict.get(lineID, {}) playerHurtList = sorted(playerHurtDict.iteritems(), key=lambda asd:asd[1][1], reverse=True) return playerHurtList def GetFirstOwnerName(lineID): ##获取归属者名字 playerHurtList = __GetSortHurtList(lineID) if not playerHurtList: return '' return playerHurtList[0][1][0] def __DoLogicZhuXianBossOver(isPass, tick, dropPosX, dropPosY): #结算 gameFB = GameWorld.GetGameFB() mapID = GameWorld.GetMap().GetMapID() lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 leaveTick = FBCommon.GetFBLineStepTime(mapID, lineID) * 1000 playerHurtList = __GetSortHurtList(lineID) if not playerHurtList: GameWorld.Log(' __DoLogicZhuXianBossOver, 伤害榜上没有人!!lineID=%s'%lineID) return firsthurtInfo = playerHurtList[0] firstPlayerID = firsthurtInfo[0] firstPlayerFamilyID = firsthurtInfo[1][2] playerManager = GameWorld.GetMapCopyPlayerManager()#GameWorld.GetPlayerManager() firstPlayer = playerManager.FindPlayerByID(firstPlayerID) if firstPlayer: #gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_Rank, rank) if not dropPosX or not dropPosY: dropPosX, dropPosY = firstPlayer.GetPosX(), firstPlayer.GetPosY() prizeItemList = GiveZhuXianBossAward(firstPlayer, lineID, dropItemMapInfo=[dropPosX, dropPosY, True]) if not prizeItemList: # 没有掉落时直接通知结算,防止卡副本 firstPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True) overDict = {FBCommon.Over_rank:1, FBCommon.Over_itemInfo:prizeItemList} FBCommon.NotifyFBOver(firstPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, lineID, isPass, overDict) else: firstPlayer.Sync_TimeTick(ChConfig.tttPickupItem, 0, ChConfig.Def_FBPickupItemTime, True) else: leaveServerTick = PlayerControl.GetPlayerLeaveServerTick(firstPlayerID) if leaveServerTick and tick - leaveServerTick < ChConfig.Def_PlayerOfflineProtectTime: #离线超过3分钟的不给奖励 msgStr = str([ShareDefine.Def_UniversalGameRecType_ZhuXianBossRecord, [firstPlayerID, lineID], [], 0, 0]) playerManager.GameServer_QueryPlayerResult(0, 0, 0, 'AddUniversalGameRec', msgStr, len(msgStr)) helpItemList = FBCommon.GetFBLineReward(mapID, lineID) if helpItemList: #同盟协助奖励 needSpace = len(helpItemList) jsonItemList = FBCommon.GetJsonItemList(helpItemList) for index in range(0 , playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) curPlayerID = curPlayer.GetPlayerID() if not curPlayerID: continue if curPlayerID == firstPlayerID: continue if curPlayer.GetFamilyID() != firstPlayerFamilyID: continue remainCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt) if not remainCnt: continue PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhuXianBossHelpCnt, remainCnt-1) NotifyZXHelpCnt(curPlayer) curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True) overDict = {FBCommon.Over_rank:0, FBCommon.Over_itemInfo:jsonItemList} FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, lineID, isPass, overDict) packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace) if needSpace > packSpace: PlayerControl.SendMailByKey('ZXBossHelperReward', [curPlayerID], helpItemList) else: for itemID, itemCount, isBind in helpItemList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem]) return def GiveZhuXianBossAward(curPlayer, lineID, isMail=False, dropItemMapInfo=[]): ##给归属者奖励 addCnt = 1 equipList = [] prizeItemDict ={} bossID = CurFBLineBOSSID(lineID) jsonItemList, totalExp, totalMoney = NPCCommon.GiveKillNPCDropPrize(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, {bossID:addCnt}, mailTypeKey="ZXBossBelongerReward", isMail=isMail, dropItemMapInfo=dropItemMapInfo) for jsonItem in jsonItemList: if 'UserData' in jsonItem: equipList.append(jsonItem) else: itemID, itemCnt = jsonItem['ItemID'], jsonItem.get('Count',1) prizeItemDict[itemID] = prizeItemDict.get(itemID,0)+itemCnt GameWorld.DebugLog("诛仙boss结算奖励: lineID=%s,bossID=%s,totalExp=%s,totalMoney=%s,jsonItemList=%s" % (lineID, bossID, totalExp, totalMoney, jsonItemList), curPlayer.GetPlayerID()) prizeItemList = equipList + FBCommon.GetJsonItemList(prizeItemDict.items()) #PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_ZhuXianBoss, addCnt) #击杀特定NPC成就 PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillSpecificNPC, addCnt, [bossID]) FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, addCnt) # 每日活动 PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_ZhuXianBoss, addCnt) return prizeItemList def OnPickUpItem(curPlayer, curItem, tick): mapItemType = curItem.GetType() if mapItemType == ChConfig.Def_ItemType_Money: return playerID = curPlayer.GetID() isEquip = ItemCommon.CheckItemIsEquip(curItem) jsonItem = ItemCommon.GetJsonItem(curItem) if playerID in PyGameData.g_fbPickUpItemDict: if isEquip: PyGameData.g_fbPickUpItemDict[playerID].append(jsonItem) else: isIn = False for itemInfo in PyGameData.g_fbPickUpItemDict[playerID]: if itemInfo["ItemID"] == jsonItem["ItemID"] and itemInfo.get("IsBind") == jsonItem.get("IsBind"): itemInfo["Count"] = itemInfo.get("Count", 1)+ jsonItem.get("Count", 1) isIn = True break if not isIn: PyGameData.g_fbPickUpItemDict[playerID].append(jsonItem) else: PyGameData.g_fbPickUpItemDict[playerID] = [jsonItem] playerItemCount = 0 mapItemManager = GameWorld.GetMapItemManager() for index in xrange(mapItemManager.GetMapItemCount()): mapItem = mapItemManager.GetMapItemByIndex(index) if not mapItem or mapItem.IsEmpty(): continue # 还有属于自己的东西没捡不通知结束 if mapItem.GetOwnerID() == curPlayer.GetPlayerID(): playerItemCount += 1 isItemAllPickUp = (playerItemCount <= 1) if not isItemAllPickUp: return isPass = 1 lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 leaveTick = FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_ZhuXianBoss, lineID) * 1000 gameFB = GameWorld.GetGameFB() rank = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_Rank) jsonItemList = PyGameData.g_fbPickUpItemDict.get(playerID, []) curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True) overDict = {FBCommon.Over_rank:rank, FBCommon.Over_itemInfo:jsonItemList} FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss, lineID, isPass, overDict) return def __CheckBossHP(tick): gameFB = GameWorld.GetGameFB() isOver = gameFB.GetGameFBDictByKey(FBDict_IsOver) lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 if not isOver and GetBossRemainHP(lineID, tick) == 0: bossID = CurFBLineBOSSID(lineID) curBoss = GameWorld.FindNPCByNPCID(bossID) dropPosX, dropPosY = 0, 0 if curBoss: dropPosX, dropPosY = curBoss.GetPosX(), curBoss.GetPosY() #结束 设置BOSS死亡 FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0) GameWorld.DebugLog('结束 设置BOSS死亡 lineID=%s' % lineID) playerHurtList = __GetSortHurtList(lineID) if playerHurtList: killerName, hurtValue = playerHurtList[0][1][:2] NPCCommon.GameServer_KillGameWorldBoss(bossID, killerName, hurtValue) NPCCommon.GameServe_GameWorldBossState(bossID, 0) __DoLogicZhuXianBossOver(1, tick, dropPosX, dropPosY) gameFB.SetGameFBDict(FBDict_IsOver, tick) return def UpdateHPReduceSpeed(tick, isExit=False): gameWorld = GameWorld.GetGameWorld() playerCnt = gameWorld.GetMapCopyPlayerManager().GetPlayerCount() playerCnt = playerCnt - 1 if isExit else playerCnt if playerCnt <=0: return lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 if lineID < 0: return curSpeed = int(min(1 + 0.08 * (playerCnt - 1), 1.8) * 1000) gameWorld.SetGameWorldDict(FBDict_Speed % lineID, curSpeed) if not gameWorld.GetGameWorldDictByKey(FBDict_IsReduceing%lineID): return startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick % lineID) remainHP = gameWorld.GetGameWorldDictByKey(FBDict_RemainHP % lineID) lastSpeed = gameWorld.GetGameWorldDictByKey(FBDict_Speed % lineID) if not startTick: startTick = tick lastSpeed = curSpeed remainHP = __GetBossTotalHP(lineID) remainHP = max(0, int((remainHP - (tick - startTick) / 1000.0 * lastSpeed))) gameWorld.SetGameWorldDict(FBDict_StartTick % lineID, tick) gameWorld.SetGameWorldDict(FBDict_RemainHP % lineID, remainHP) GameWorld.DebugLog(' curSpeed=%s, remainHP=%s, passTime=%s, lastSpeed=%s' % (curSpeed, remainHP, tick - startTick, lastSpeed)) FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0) return def StopReduceHP(lineID, tick): ##暂停BOSS血量减少 gameWorld = GameWorld.GetGameWorld() if not gameWorld.GetGameWorldDictByKey(FBDict_IsReduceing%lineID): return remainHP = GetBossRemainHP(lineID, tick) if not remainHP: return gameWorld.SetGameWorldDict(FBDict_IsReduceing % lineID, 0) gameWorld.SetGameWorldDict(FBDict_RemainHP % lineID, remainHP) return def StartReduceHP(lineID, tick): ##开始BOSS掉血 gameWorld = GameWorld.GetGameWorld() if gameWorld.GetGameWorldDictByKey(FBDict_IsReduceing%lineID): return gameWorld.SetGameWorldDict(FBDict_IsReduceing % lineID, 1) startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick % lineID) if not startTick: gameWorld.SetGameWorldDict(FBDict_RemainHP % lineID, __GetBossTotalHP(lineID)) gameWorld.SetGameWorldDict(FBDict_StartTick % lineID, tick) return def __GetBossTotalHP(lineID):return GameWorld.GetGameWorld().GetGameWorldDictByKey(FBDict_BossTotalHP%lineID) def GetBossRemainHP(lineID, tick): gameWorld = GameWorld.GetGameWorld() startTick = gameWorld.GetGameWorldDictByKey(FBDict_StartTick % lineID) lastSpeed = gameWorld.GetGameWorldDictByKey(FBDict_Speed % lineID) remainHP = gameWorld.GetGameWorldDictByKey(FBDict_RemainHP % lineID) if not gameWorld.GetGameWorldDictByKey(FBDict_IsReduceing%lineID): return remainHP if not startTick: startTick = tick remainHP = __GetBossTotalHP(lineID) else: remainHP = max(0, int((remainHP - (tick - startTick) / 1000.0 * lastSpeed))) return remainHP def GetBossRemainHPPer(lineID, tick): remainHP = GetBossRemainHP(lineID, tick) totalHP = __GetBossTotalHP(lineID) if not totalHP: return 0 return remainHP * 100 / totalHP def CurFBLineBOSSID(lineID= -1): #该分线刷的BOSSID if lineID == -1: lineID = GameWorld.GetGameWorld().GetPropertyID() - 1 if lineID == -1: return 0 ipyData = IpyGameDataPY.GetIpyGameData('ZhuXianBoss', lineID) if not ipyData: return 0 bossID = ipyData.GetNPCID() return bossID ##玩家死亡. # @param curPlayer:死亡的玩家 # @param tick 时间戳 # @return 返回值无意义 # @remarks 玩家主动离开副本. def DoPlayerDead(curPlayer): return ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1241,6 +1241,14 @@ ("WORD", "SingleTimes", 0), ("list", "Reward", 0), ), "ZhuXianBoss":( ("DWORD", "NPCID", 0), ("BYTE", "LineID", 1), ("WORD", "KillTime", 0), ("WORD", "RealmLV", 0), ("DWORD", "ZhuXianScore", 0), ), } @@ -3782,6 +3790,23 @@ def GetSingleTimes(self): return self.SingleTimes # 单次领奖需要的次数 def GetReward(self): return self.Reward # 奖励物品 # 诛仙BOSS表 class IPY_ZhuXianBoss(): def __init__(self): self.NPCID = 0 self.LineID = 0 self.KillTime = 0 self.RealmLV = 0 self.ZhuXianScore = 0 return def GetNPCID(self): return self.NPCID # ID def GetLineID(self): return self.LineID def GetKillTime(self): return self.KillTime # 击杀总时间秒 def GetRealmLV(self): return self.RealmLV # 需要境界 def GetZhuXianScore(self): return self.ZhuXianScore # 需要诛仙总评分 def Log(msg, playerID=0, par=0): LogUI.Msg("%s\t%s\t%s" % (par, playerID, msg)) @@ -4042,6 +4067,8 @@ self.ipyActLoginAwardLen = len(self.ipyActLoginAwardCache) self.ipyLoginAwardCache = self.__LoadFileData("LoginAward", IPY_LoginAward) self.ipyLoginAwardLen = len(self.ipyLoginAwardCache) self.ipyZhuXianBossCache = self.__LoadFileData("ZhuXianBoss", IPY_ZhuXianBoss) self.ipyZhuXianBossLen = len(self.ipyZhuXianBossCache) Log("IPY_FuncConfig count=%s" % len(self.ipyFuncConfigDict)) Log("IPY_DataMgr InitOK!") return @@ -4444,6 +4471,8 @@ def GetActLoginAwardByIndex(self, index): return self.ipyActLoginAwardCache[index] def GetLoginAwardCount(self): return self.ipyLoginAwardLen def GetLoginAwardByIndex(self, index): return self.ipyLoginAwardCache[index] def GetZhuXianBossCount(self): return self.ipyZhuXianBossLen def GetZhuXianBossByIndex(self, index): return self.ipyZhuXianBossCache[index] IPYData = IPY_DataMgr() def IPY_Data(): return IPYData ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -2068,7 +2068,7 @@ if ChConfig.IsGameBoss(curNPC): # 通知GameServer boss状态 封魔坛在副本里单独处理 ipyData = IpyGameDataPY.GetIpyGameDataNotLog('BOSSInfo', npcid) if ipyData and ipyData.GetMapID() != ChConfig.Def_FBMapID_SealDemon: if ipyData and ipyData.GetMapID() not in [ChConfig.Def_FBMapID_SealDemon, ChConfig.Def_FBMapID_ZhuXianBoss]: GameServe_GameWorldBossState(npcid, 0) #GameWorld.GetGameWorld().SetGameWorldDict(ChConfig.Map_NPC_WorldBossDeadTick % npcid, GameWorld.GetGameWorld().GetTick()) #因为存在boss分流,所以用gameFB字典,但是存活状态还是用GameWorld字典 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCustomRefresh.py
@@ -17,6 +17,7 @@ import ShareDefine import ReadChConfig import GameLogic_SealDemon import GameLogic_ZhuXianBoss import PlayerControl import IPY_GameWorld import IpyGameDataPY @@ -401,6 +402,9 @@ if mapID == ChConfig.Def_FBMapID_SealDemon: bossID = GameLogic_SealDemon.CurFBLineBOSSID() stoneNPCID = 0 elif mapID == ChConfig.Def_FBMapID_ZhuXianBoss: bossID = GameLogic_ZhuXianBoss.CurFBLineBOSSID() stoneNPCID = 0 else: ipyData = IpyGameDataPY.GetIpyGameDataByCondition('BOSSInfo', {'RefreshMark':refreshMark, 'MapID':mapID}, isLogNone=False) if not ipyData: @@ -412,7 +416,6 @@ isNeedShunt = ipyData.GetIsNeedShunt() if not bossID and not stoneNPCID: return gameFB = GameWorld.GetGameFB() gameWorldMgr = GameWorld.GetGameWorld() isActivityBoss = False # 是否活动boss @@ -463,7 +466,7 @@ NPCCommon.SetDeadEx(curNPC) # 非复活线 且 不需要分流的地图 且 不是封魔坛 不允许复活 if lineID != rebornLineID and not isNeedShunt and mapID != ChConfig.Def_FBMapID_SealDemon: if lineID != rebornLineID and not isNeedShunt and mapID not in [ChConfig.Def_FBMapID_SealDemon, ChConfig.Def_FBMapID_ZhuXianBoss]: return if isActivityBoss and activityBossRebornCount > 0: ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -76,6 +76,7 @@ import PyGameData import PlayerMagicWeapon import GameLogic_SealDemon import GameLogic_ZhuXianBoss import PlayerTJG import PlayerVip import PlayerRefineStove @@ -1699,6 +1700,14 @@ else: bossID = GameLogic_SealDemon.CurFBLineBOSSID(lineID) extendParamList = [bossID] elif mapID == ChConfig.Def_FBMapID_ZhuXianBoss: bossID = GameLogic_ZhuXianBoss.CurFBLineBOSSID(lineID) extendParamList = [bossID, -1] enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss) if enterCnt >= FBCommon.GetEnterFBMaxCnt: if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt): extendParamList = [bossID, curPlayer.GetFamilyID()] SendToGameServerEnterFB(curPlayer, mapID, lineID, tick, extendParamList) return ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
@@ -113,6 +113,10 @@ enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_SealDemon) maxCnt = FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_SealDemon) curPlayerPropDict['CntMark_%s'%ChConfig.Def_FBMapID_SealDemon] = max(maxCnt - enterCnt, 0) # 诛仙BOSS剩余次数 enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss) maxCnt = FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss) curPlayerPropDict['CntMark_%s'%ChConfig.Def_FBMapID_ZhuXianBoss] = max(maxCnt - enterCnt, 0) # 世界BOSS剩余次数 curPlayerPropDict['CntMark_%s'%ShareDefine.Def_Boss_Func_World] = BossHurtMng.GetCanKillBossCnt(curPlayer, ShareDefine.Def_Boss_Func_World) # BOSS之家剩余次数 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_EnterFB.py
@@ -24,6 +24,7 @@ #导入 import FBLogic import GameLogic_SealDemon import GameLogic_ZhuXianBoss import IPY_GameWorld import PlayerControl import GameWorld @@ -57,7 +58,7 @@ tagMapID = packCMDList[0] # 目标地图id tagMapLineID = packCMDList[1] # 目标地图线路属性,从0开始 resultLineID = -1 # 结果lineID notifyMark = 'GeRen_chenxin_500807' #不能进的提示 if tagMapID in ChConfig.Def_MapID_LineIDToPropertyID: GameWorld.Log(" DoLogic() tagMapID in ChConfig.Def_MapID_LineIDToPropertyID") tagMapPropertyID = tagMapLineID + 1 # 因为PropertyID默认是0,所以使用时从1开始 @@ -144,13 +145,14 @@ # GameWorld.DebugLog(" 创建新战盟家园: tagFamilyID=%s,tagFamilyHomeLV=%s,resultLineID=%s" # % (tagFamilyID, tagFamilyHomeLV, resultLineID)) #=================================================================================================== elif tagMapID == ChConfig.Def_FBMapID_SealDemon: elif tagMapID in [ChConfig.Def_FBMapID_SealDemon, ChConfig.Def_FBMapID_ZhuXianBoss]: tagMapPropertyID = tagMapLineID + 1 # 因为PropertyID默认是0,所以使用时从1开始 resultLineID = -1 # 结果lineID gameWorldManager = GameWorld.GetGameWorld() GameWorld.Log(" DoLogic() tagMapID=%s,tagMapLineID=%s" % (tagMapID, tagMapLineID)) findGameWord = None findPlayerManager = None for index in range(gameWorldManager.GetGameWorldCount()): gameWorld = IPY_GameWorld.IPY_GameWorld(index) playerManager = gameWorld.GetMapCopyPlayerManagerByFbIndex(index) @@ -163,13 +165,32 @@ # % (index, propertyID, playerManager.GetPlayerCount())) # 如果不是同一线路属性的,则跳过 if propertyID == tagMapPropertyID: if tagMapID == ChConfig.Def_FBMapID_SealDemon: if GameLogic_SealDemon.GetBossRemainHPPer(tagMapLineID, tick) < 15: findGameWord = None findPlayerManager = None notifyMark = "DemonJar_Text4" break elif tagMapID == ChConfig.Def_FBMapID_ZhuXianBoss: if GameLogic_ZhuXianBoss.GetBossRemainHPPer(tagMapLineID, tick) < 15: findGameWord = None findPlayerManager = None notifyMark = "DemonJar_Text4" break findGameWord = gameWorld findPlayerManager = gameWorld break if not findGameWord and propertyID == 0: findGameWord = gameWorld findPlayerManager = gameWorld if findPlayerManager and tagMapID == ChConfig.Def_FBMapID_ZhuXianBoss: if packCMDList[3] !=-1 and not GameLogic_ZhuXianBoss.GetHasSameFamilyMerber(packCMDList[3], findPlayerManager): notifyMark = "TryEnterJadeDynastyBossError_6" findGameWord = None GameWorld.DebugLog(" 归属次数为0且没有同盟玩家在副本里!") if findGameWord: if findGameWord.GetPropertyID() == 0: findGameWord.SetFBFirstOpen(1) # 开启副本 @@ -180,7 +201,7 @@ #resultLineID = tagMapLineID resultLineID = 0 return ['%s' % packCMDList, '%d' % resultLineID] return ['%s' % packCMDList, '%d' % resultLineID, notifyMark] #--------------------------------------------------------------------- @@ -196,22 +217,19 @@ #还原格式 '[]' -> [] funResult = eval(funResult) if not funResult or len(funResult) < 2: if not funResult or len(funResult) < 3: GameWorld.Log("GY_Query_EnterFB DoResult() return []") return tagMapInfo = eval(funResult[0]) backFBID = int(funResult[1]) # 返回的切图线路id(0~N) notifyMark = funResult[2] mapID = tagMapInfo[0] # 请求的切图id funcLineID = tagMapInfo[1] # 请求的场次线路id(0~6) GameWorld.Log("GY_Query_EnterFB DoResult() mapID=%s,funcLineID=%s,backFBID=%s" % (mapID, funcLineID, backFBID), curPlayer.GetPlayerID()) if backFBID == -1: # 未找到可进入的分线,则返回,提示人数已满 if mapID == ChConfig.Def_FBMapID_SealDemon: PlayerControl.NotifyCode(curPlayer, "DemonJar_Text4") else: PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_500807") PlayerControl.NotifyCode(curPlayer, notifyMark) return if curPlayer.GetMapID() == mapID: ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_FBLinePlayerCnt.py
@@ -19,7 +19,7 @@ #导入 import NPCCommon import GameLogic_ZhuXianBoss import GameWorld import IPY_GameWorld import ChConfig @@ -51,7 +51,7 @@ gameWorldManager = GameWorld.GetGameWorld() fbLinePlayerCntDict = {} if tagMapID == ChConfig.Def_FBMapID_SealDemon: for index in range(gameWorldManager.GetGameWorldCount()): for index in xrange(gameWorldManager.GetGameWorldCount()): gameWorld = IPY_GameWorld.IPY_GameWorld(index) playerManager = gameWorld.GetMapCopyPlayerManagerByFbIndex(index) fblineID = gameWorld.GetPropertyID() - 1 @@ -60,7 +60,20 @@ if not isAllLine and tagFBLineID != fblineID: continue playerCnt = playerManager.GetPlayerCount() fbLinePlayerCntDict[fblineID] = playerCnt fbLinePlayerCntDict[fblineID] = [playerCnt] elif tagMapID == ChConfig.Def_FBMapID_ZhuXianBoss: for index in xrange(gameWorldManager.GetGameWorldCount()): gameWorld = IPY_GameWorld.IPY_GameWorld(index) playerManager = gameWorld.GetMapCopyPlayerManagerByFbIndex(index) fblineID = gameWorld.GetPropertyID() - 1 if fblineID < 0: continue if not isAllLine and tagFBLineID != fblineID: continue playerCnt = playerManager.GetPlayerCount() ownerName = GameLogic_ZhuXianBoss.GetFirstOwnerName(fblineID) fbLinePlayerCntDict[fblineID] = [playerCnt, ownerName] else: return return [tagMapID, fbLinePlayerCntDict] ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_ZhuXianBossAward.py
New file @@ -0,0 +1,48 @@ #!/usr/bin/python # -*- coding: GBK -*- #--------------------------------------------------------------------- # #--------------------------------------------------------------------- ##@package GY_Query_ZhuXianBossAward # @todo: 诛仙BOSS奖励处理 # # @author: xdh # @date 2019-01-19 16:30 # @version 1.0 # # @note: 诛仙BOSS奖励处理 #--------------------------------------------------------------------- #"""Version = 2017-12-28 16:30""" #--------------------------------------------------------------------- import GameWorld import GameLogic_ZhuXianBoss #--------------------------------------------------------------------- ## XX # @param query_Type 请求类型 # @param query_ID 请求的玩家ID # @param packCMDList 发包命令 # @param tick 当前时间 # @return "True" or "False" or "" def DoLogic(query_Type, query_ID, packCMDList, tick): return '' ## 登陆信息 # @param curPlayer 发出请求的玩家 # @param callFunName 功能名称 # @param funResult 查询的结果 # @param tick 当前时间 # @return None def DoResult(curPlayer, callFunName, funResult, tick): playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("GY_Query_ZhuXianBossAward funResult=%s" % funResult, playerID) lineID = GameWorld.ToIntDef(funResult, -1) if lineID == -1: return GameLogic_ZhuXianBoss.GiveZhuXianBossAward(curPlayer, lineID, True) return ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -87,3 +87,5 @@ g_crossPlayerDienstgradChangeInfo = {} #跨服玩家称号变化信息 {playerID:{id:isAdd, ...}, ...} g_crossPlayerItemsChangeInfo = {} #跨服玩家物品变化信息 {playerID:{"背包类型-物品位":itemMD5, ...}, ...} g_crossPlayerSkillsChangeInfo = {} #跨服玩家技能变化信息 {playerID:[技能ID], ...} g_ZhuXianBossPlayerHurtDict = {} #诛仙BOSS玩家伤害排行信息 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -878,6 +878,7 @@ GameFuncID_LittleHelper = 146 # 小助手 GameFuncID_TJG = 147 # 脱机挂 GameFuncID_SuperGift = 150 # 超值礼包 GameFuncID_ZhuXianBoss = 163 # 诛仙BOSS # 以下为暂时无用的 GameFuncID_Truck = 33 # 运镖 GameFuncID_RunDaily = 34 # 日常跑环 @@ -962,7 +963,7 @@ Def_UniversalGameRecType_StoreServerCntRecord, #商店全服购买记录 8, Def_UniversalGameRecType_FBHelpBattleCheckInPlayer, #助战玩家登记记录9 Def_UniversalGameRecType_FBHelpBattleRecord, #助战未同步记录10 Def_UniversalGameRecType_11, Def_UniversalGameRecType_ZhuXianBossRecord, #诛仙BOSS结算记录11 Def_UniversalGameRecType_12, Def_UniversalGameRecType_13, Def_UniversalGameRecType_Reward, # 通用奖励表(TopBar)14 @@ -1521,7 +1522,8 @@ DailyActionID_IceLode, # 冰晶矿脉 DailyActionID_HelpBattleCheckIn, # 助战登记 20 DailyActionID_CrossReamPK, # 跨服PK 21 ) = range(1, 21 + 1) DailyActionID_ZhuXianBoss, # 诛仙BOSS 22 ) = range(1, 22 + 1)