10019 【砍树】回合战斗(与玩家基础回合战斗)
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 03 03 玩家缓存信息同步 #tagGMPlayerCache
|
| | |
|
| | | class tagGMPlayerCache(Structure):
|
| | | Head = tagHead()
|
| | | PlayerID = 0 #(DWORD PlayerID)//玩家ID
|
| | | FindPlayerID = 0 #(DWORD FindPlayerID)//要查询的玩家ID
|
| | | PropDataSize = 0 #(WORD PropDataSize)
|
| | | PropData = "" #(String PropData)//属性记录
|
| | | PlusDataSize = 0 #(WORD PlusDataSize)
|
| | | PlusData = "" #(String PlusData)//扩展记录
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0x03
|
| | | self.Head.SubCmd = 0x03
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FindPlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.PropDataSize,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.PropData,_pos = CommFunc.ReadString(_lpData, _pos,self.PropDataSize)
|
| | | self.PlusDataSize,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.PlusData,_pos = CommFunc.ReadString(_lpData, _pos,self.PlusDataSize)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0x03
|
| | | self.Head.SubCmd = 0x03
|
| | | self.PlayerID = 0
|
| | | self.FindPlayerID = 0
|
| | | self.PropDataSize = 0
|
| | | self.PropData = ""
|
| | | self.PlusDataSize = 0
|
| | | self.PlusData = ""
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 4
|
| | | length += 2
|
| | | length += len(self.PropData)
|
| | | length += 2
|
| | | length += len(self.PlusData)
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.PlayerID)
|
| | | data = CommFunc.WriteDWORD(data, self.FindPlayerID)
|
| | | data = CommFunc.WriteWORD(data, self.PropDataSize)
|
| | | data = CommFunc.WriteString(data, self.PropDataSize, self.PropData)
|
| | | data = CommFunc.WriteWORD(data, self.PlusDataSize)
|
| | | data = CommFunc.WriteString(data, self.PlusDataSize, self.PlusData)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | PlayerID:%d,
|
| | | FindPlayerID:%d,
|
| | | PropDataSize:%d,
|
| | | PropData:%s,
|
| | | PlusDataSize:%d,
|
| | | PlusData:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.PlayerID,
|
| | | self.FindPlayerID,
|
| | | self.PropDataSize,
|
| | | self.PropData,
|
| | | self.PlusDataSize,
|
| | | self.PlusData
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagGMPlayerCache=tagGMPlayerCache()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGMPlayerCache.Head.Cmd,m_NAtagGMPlayerCache.Head.SubCmd))] = m_NAtagGMPlayerCache
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #03 02 玩家领取补偿结果#tagGMRequestCompensationResult
|
| | |
|
| | | class tagGMCompensationItem(Structure):
|
| | |
| | | ("PlayerID", c_int), #玩家ID
|
| | | ("FindPlayerID", c_int), #要查询的玩家ID
|
| | | ("EquipClassLV", c_ubyte), #大于0为查看指定境界阶装备信息, 0为查看默认信息
|
| | | ("CallMap", c_ubyte), #是否需要通知地图
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.PlayerID = 0
|
| | | self.FindPlayerID = 0
|
| | | self.EquipClassLV = 0
|
| | | self.CallMap = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | SubCmd:%s,
|
| | | PlayerID:%d,
|
| | | FindPlayerID:%d,
|
| | | EquipClassLV:%d
|
| | | EquipClassLV:%d,
|
| | | CallMap:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.PlayerID,
|
| | | self.FindPlayerID,
|
| | | self.EquipClassLV
|
| | | self.EquipClassLV,
|
| | | self.CallMap
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | | import NetPackCommon
|
| | | import GameWorldArena
|
| | | import ChPyNetSendPack
|
| | | import ChGameToMapPyPack
|
| | | import PlayerFBHelpBattle
|
| | | import GameWorldSkyTower
|
| | | import CrossChampionship
|
| | |
| | | # DWORD PlayerID; //玩家ID
|
| | | # DWORD FindPlayerID; //要查询的玩家ID
|
| | | # BYTE EquipClassLV; //大于0为查看指定境界阶装备信息, 0为查看默认信息
|
| | | # BYTE CallMap; //是否需要通知地图
|
| | | #};
|
| | | def OnMGQueryPlayerCache(routeIndex, mapID, curPackData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPackData.PlayerID)
|
| | | findPlayerID = curPackData.FindPlayerID
|
| | | equipClassLV = curPackData.EquipClassLV
|
| | | callMap = curPackData.CallMap
|
| | | curCache = FindViewCache(findPlayerID)
|
| | | if not curCache:
|
| | | PlayerControl.NotifyCode(curPlayer, "ViewPlayer_OffLine")
|
| | | if callMap:
|
| | | sendPack = ChGameToMapPyPack.tagGMPlayerCache()
|
| | | sendPack.PlayerID = curPlayer.GetPlayerID()
|
| | | sendPack.FindPlayerID = findPlayerID
|
| | | sendPack.PropData = ""
|
| | | sendPack.PropDataSize = len(sendPack.PropData)
|
| | | sendPack.PlusData = ""
|
| | | sendPack.PlusDataSize = len(sendPack.PlusData)
|
| | | NetPackCommon.SendPyPackToMapServer(routeIndex, mapID, sendPack) |
| | | return
|
| | | Sync_PlayerCache(curPlayer, curCache, equipClassLV)
|
| | | if callMap:
|
| | | sendPack = ChGameToMapPyPack.tagGMPlayerCache()
|
| | | sendPack.PlayerID = curPlayer.GetPlayerID()
|
| | | sendPack.FindPlayerID = findPlayerID
|
| | | sendPack.PropData = curCache.PropData
|
| | | sendPack.PropDataSize = len(sendPack.PropData)
|
| | | sendPack.PlusData = curCache.PlusData
|
| | | sendPack.PlusDataSize = len(sendPack.PlusData)
|
| | | NetPackCommon.SendPyPackToMapServer(routeIndex, mapID, sendPack) |
| | | return
|
| | |
|
| | | def Sync_PlayerCache(curPlayer, curCache, equipClassLV=0):
|
| | |
| | | PacketSubCMD_1=0x02
|
| | | PacketCallFunc_1=OnGMRequestCompensationResult
|
| | |
|
| | | [PlayerViewCacheTube]
|
| | | ScriptName = Player\PlayerViewCacheTube
|
| | | Writer = hxp
|
| | | Releaser = hxp
|
| | | RegType = 0
|
| | | RegisterPackCount = 1
|
| | |
|
| | | PacketCMD_1=0x03
|
| | | PacketSubCMD_1=0x03
|
| | | PacketCallFunc_1=OnGMPlayerCache
|
| | |
|
| | | [PlayerFriend]
|
| | | ScriptName = Player\PlayerFriend.py
|
| | |
| | | def IsPVPNPC(obj):
|
| | | if not obj:
|
| | | return False
|
| | | return obj.GetGameObjType() == IPY_GameWorld.gotNPC and obj.GetType() in [ChConfig.ntPriWoodPilePVP]
|
| | | return obj.GetGameObjType() == IPY_GameWorld.gotNPC and obj.GetType() in ChConfig.PVPNPCTypeList
|
| | |
|
| | | ## 获取攻击类型
|
| | | # @param attack 攻击方对象
|
| | |
| | | aDamagePVP = 0 # PVP固定伤害
|
| | | aDamagePVE = 0 # PVE固定伤害
|
| | | aFinalHurt = NPCCommon.GetFinalHurt(atkObj) # 最终固定伤害
|
| | | aOnlyFinalHurt = 0 # 额外固定伤害
|
| | | aFightPower = NPCCommon.GetSuppressFightPower(atkObj)
|
| | |
|
| | | #防守方的类型
|
| | |
| | | return "Robot"
|
| | | if obj.GetType() == ChConfig.ntHelpBattleRobot:
|
| | | return "HelpRobot"
|
| | | if obj.GetType() == ChConfig.ntPriWoodPilePVP:
|
| | | if obj.GetType() in ChConfig.PVPNPCTypeList:
|
| | | return "P"
|
| | |
|
| | | objType = obj.GetGameNPCObjType()
|
| | |
| | | import IpyGameDataPY |
| | | import IPY_GameWorld |
| | | import ChPyNetSendPack |
| | | import PlayerViewCacheTube |
| | | import NetPackCommon |
| | | import PlayerControl |
| | | import SkillCommon |
| | |
| | | |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Start) |
| | | |
| | | if tagPlayerID: |
| | | PlayerViewCacheTube.GetPlayerPropDataCall(curPlayer, tagPlayerID, DoTrunFightVSPlayer, [mapID, funcLineID]) |
| | | return |
| | | |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick) |
| | | |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) |
| | | return |
| | | |
| | | def DoTrunFightVSPlayer(curPlayer, tagPlayerID, callData, PropDict): |
| | | mapID, funcLineID = callData |
| | | if PropDict: |
| | | tick = GameWorld.GetGameWorld().GetTick() |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) |
| | | return |
| | | |
| | |
| | | playerID = curPlayer.GetPlayerID() |
| | | tagObj = None |
| | | if tagPlayerID: |
| | | pass |
| | | |
| | | npcID = ChConfig.Def_NPCID_PVP |
| | | tagObj = NPCCommon.SummonMapNpc(npcID, curPlayer.GetPosX(), curPlayer.GetPosY(), sightLevel=playerID, pvpPlayerID=tagPlayerID) |
| | | else: |
| | | ipyData = IpyGameDataPY.GetIpyGameData("FBTurn", mapID, funcLineID) |
| | | if not ipyData: |
| | |
| | | Def_NPC_Dict_SummonMapNPCPlayerID = 'SummonMapNPCPlayerID'
|
| | | Def_NPC_Dict_SummonRefreshID = 'SummonRefreshID'
|
| | | Def_NPC_Dict_PriWoodPilePlayerID = 'PriWoodPilePlayerID'
|
| | | Def_NPC_Dict_PVPPlayerID = 'PVPPlayerID'
|
| | | #NPC技能已使用次数
|
| | | Def_NPC_Dict_SkillUseCnt = 'NPCSkillUseCnt_%s' # 参数skillTypeID
|
| | | #不死的boss
|
| | |
| | | ntMonsterTime, #按时间掉血的怪物 22 废弃,以是否有配置在时间掉血怪物表为准
|
| | | ntPriWoodPilePVE, #专属私有木桩 - PVE 23
|
| | | ntPriWoodPilePVP, #专属私有木桩 - PVP 24
|
| | | ntPVP, # PVP玩家战斗镜像,有相互PK逻辑,不同于木桩(木桩仅被打) 25
|
| | | ntMax
|
| | | ) = range(26)
|
| | | ) = range(27)
|
| | |
|
| | | #视为PVP的NPC类型
|
| | | PVPNPCTypeList = [ntPriWoodPilePVP, ntPVP]
|
| | |
|
| | | #写死的NPCID
|
| | | Def_NPCID_PVP = 50000
|
| | |
|
| | | (Def_SkillFuncType_Common, #0为通用技能
|
| | | Def_SkillFuncType_FbSkill, #1为法宝功能获得的主动技能
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 03 03 玩家缓存信息同步 #tagGMPlayerCache
|
| | |
|
| | | class tagGMPlayerCache(Structure):
|
| | | Head = tagHead()
|
| | | PlayerID = 0 #(DWORD PlayerID)//玩家ID
|
| | | FindPlayerID = 0 #(DWORD FindPlayerID)//要查询的玩家ID
|
| | | PropDataSize = 0 #(WORD PropDataSize)
|
| | | PropData = "" #(String PropData)//属性记录
|
| | | PlusDataSize = 0 #(WORD PlusDataSize)
|
| | | PlusData = "" #(String PlusData)//扩展记录
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0x03
|
| | | self.Head.SubCmd = 0x03
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FindPlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.PropDataSize,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.PropData,_pos = CommFunc.ReadString(_lpData, _pos,self.PropDataSize)
|
| | | self.PlusDataSize,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.PlusData,_pos = CommFunc.ReadString(_lpData, _pos,self.PlusDataSize)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0x03
|
| | | self.Head.SubCmd = 0x03
|
| | | self.PlayerID = 0
|
| | | self.FindPlayerID = 0
|
| | | self.PropDataSize = 0
|
| | | self.PropData = ""
|
| | | self.PlusDataSize = 0
|
| | | self.PlusData = ""
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 4
|
| | | length += 2
|
| | | length += len(self.PropData)
|
| | | length += 2
|
| | | length += len(self.PlusData)
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.PlayerID)
|
| | | data = CommFunc.WriteDWORD(data, self.FindPlayerID)
|
| | | data = CommFunc.WriteWORD(data, self.PropDataSize)
|
| | | data = CommFunc.WriteString(data, self.PropDataSize, self.PropData)
|
| | | data = CommFunc.WriteWORD(data, self.PlusDataSize)
|
| | | data = CommFunc.WriteString(data, self.PlusDataSize, self.PlusData)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | PlayerID:%d,
|
| | | FindPlayerID:%d,
|
| | | PropDataSize:%d,
|
| | | PropData:%s,
|
| | | PlusDataSize:%d,
|
| | | PlusData:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.PlayerID,
|
| | | self.FindPlayerID,
|
| | | self.PropDataSize,
|
| | | self.PropData,
|
| | | self.PlusDataSize,
|
| | | self.PlusData
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagGMPlayerCache=tagGMPlayerCache()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGMPlayerCache.Head.Cmd,m_NAtagGMPlayerCache.Head.SubCmd))] = m_NAtagGMPlayerCache
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #03 02 玩家领取补偿结果#tagGMRequestCompensationResult
|
| | |
|
| | | class tagGMCompensationItem(Structure):
|
| | |
| | | ("PlayerID", c_int), #玩家ID
|
| | | ("FindPlayerID", c_int), #要查询的玩家ID
|
| | | ("EquipClassLV", c_ubyte), #大于0为查看指定境界阶装备信息, 0为查看默认信息
|
| | | ("CallMap", c_ubyte), #是否需要通知地图
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.PlayerID = 0
|
| | | self.FindPlayerID = 0
|
| | | self.EquipClassLV = 0
|
| | | self.CallMap = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | SubCmd:%s,
|
| | | PlayerID:%d,
|
| | | FindPlayerID:%d,
|
| | | EquipClassLV:%d
|
| | | EquipClassLV:%d,
|
| | | CallMap:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.PlayerID,
|
| | | self.FindPlayerID,
|
| | | self.EquipClassLV
|
| | | self.EquipClassLV,
|
| | | self.CallMap
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | | return
|
| | | if curNPC.GetCurAction() == IPY_GameWorld.laNPCDie:
|
| | | return
|
| | | if curNPC.GetType() not in [IPY_GameWorld.ntMonster, ChConfig.ntPriWoodPilePVE, ChConfig.ntPriWoodPilePVP]:
|
| | | if curNPC.GetType() not in [IPY_GameWorld.ntMonster, ChConfig.ntPriWoodPilePVE, ChConfig.ntPriWoodPilePVP, ChConfig.ntPVP]:
|
| | | return
|
| | | if not curNPC.GetVisible():
|
| | | return
|
| | |
| | | import PlayerNewFairyCeremony
|
| | | import GameLogic_CrossGrassland
|
| | | import PlayerActGarbageSorting
|
| | | import PlayerViewCacheTube
|
| | | import PlayerActBossTrial
|
| | | import PlayerTongTianLing
|
| | | import CrossPlayerData
|
| | |
| | | # @param aiType: AI类型
|
| | | # @return 如果召唤失败返回None 否则返回召唤的NPC的实例
|
| | | # @remarks 在地图里召唤NPC 根据NPCID 出生点 AI类型 和TICK
|
| | | def SummonMapNpc(npcId, rebornX, rebornY, aiType=0, lastTime=0, playerID=0, sightLevel=0, refreshID=0):
|
| | | def SummonMapNpc(npcId, rebornX, rebornY, aiType=0, lastTime=0, playerID=0, sightLevel=0, refreshID=0, pvpPlayerID=0):
|
| | | curSummon = GameWorld.GetNPCManager().AddPlayerSummonNPC()
|
| | | if not curSummon:
|
| | | return
|
| | |
| | |
|
| | | if curSummon.GetType() == ChConfig.ntRobot:
|
| | | __OnFBRobotReborn(curSummon, curSummon.GetLV())
|
| | | |
| | | if curSummon.GetType() == ChConfig.ntPVP and pvpPlayerID:
|
| | | curSummon.SetDict(ChConfig.Def_NPC_Dict_PVPPlayerID, pvpPlayerID)
|
| | |
|
| | | curSummon.Reborn(rebornX, rebornY, False)
|
| | | NPCControl(curSummon).DoNPCRebornCommLogic(tick)
|
| | |
| | | summonPlayerID = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_SummonMapNPCPlayerID)
|
| | | if summonPlayerID > 0:
|
| | | curNPC.SetDict(ChConfig.Def_NPC_Dict_SummonMapNPCPlayerID, 0)
|
| | | |
| | | if curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_PVPPlayerID):
|
| | | curNPC.SetDict(ChConfig.Def_NPC_Dict_PVPPlayerID, 0)
|
| | |
|
| | | refreshObj = NPCRealmRefresh.GetTagNPCRefresh(curNPC)
|
| | | if refreshObj:
|
| | |
| | | PetControl.RefurbishPetAttr(curNPC, canSyncClient)
|
| | | return
|
| | |
|
| | | DoNPCAttrStrengthen(curNPC, isReborn)
|
| | |
|
| | | pvpPlayerID = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_PVPPlayerID)
|
| | | if pvpPlayerID:
|
| | | self.SetPVPNPCPlayerAttr(pvpPlayerID)
|
| | | else:
|
| | | DoNPCAttrStrengthen(curNPC, isReborn)
|
| | | |
| | | #计算buf对战斗属性的改变
|
| | | allAttrList = SkillShell.CalcBuffer_NPCBattleEffect(curNPC)
|
| | |
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def SetPVPNPCPlayerAttr(self, pvpPlayerID):
|
| | | PropDict = PlayerViewCacheTube.GetPlayerPropData(pvpPlayerID)
|
| | | if not PropDict:
|
| | | return
|
| | | curNPC = self.__Instance
|
| | | curNPC.SetCurLV(PropDict["LV"], False)
|
| | | curNPC.SetMinAtk(PropDict["MinAtk"])
|
| | | curNPC.SetMaxAtk(PropDict["MaxAtk"])
|
| | | curNPC.SetDef(PropDict["Def"])
|
| | | GameObj.SetMaxHP(curNPC, PropDict["MaxHP"])
|
| | | curNPC.SetHit(PropDict["Hit"])
|
| | | curNPC.SetMiss(PropDict["Miss"])
|
| | | |
| | | # curPlayerPropDict["SkillAtkRate"] = curPlayer.GetSkillAtkRate() # 技能攻击比例加成
|
| | | # curPlayerPropDict["SkillAtkRateReduce"] = PlayerControl.GetSkillAtkRateReduce(curPlayer) # 技能攻击比例减少
|
| | | # curPlayerPropDict["LuckyHitRate"] = curPlayer.GetLuckyHitRate() # 会心一击几率
|
| | | # curPlayerPropDict["LuckyHitVal"] = curPlayer.GetLuckyHitVal() # 会心一击伤害固定值
|
| | | # curPlayerPropDict["LuckyHitRateReduce"] = PlayerControl.GetLuckyHitRateReduce(curPlayer) # 会心一击概率抗性
|
| | | # curPlayerPropDict["LuckyHitReduce"] = PlayerControl.GetLuckyHitReduce(curPlayer) # 会心一击伤害减免固定值
|
| | | # curPlayerPropDict["SuperHitRate"] = curPlayer.GetSuperHitRate() # 暴击概率
|
| | | # curPlayerPropDict["SuperHit"] = curPlayer.GetSuperHit() # 暴击伤害固定值
|
| | | # curPlayerPropDict["SuperHitRateReduce"] = PlayerControl.GetSuperHitRateReduce(curPlayer) # 暴击概率抗性
|
| | | # curPlayerPropDict["SuperHitReduce"] = PlayerControl.GetSuperHitReduce(curPlayer) # 暴击伤害抗性固定值
|
| | | # curPlayerPropDict["IceAtk"] = curPlayer.GetIceAtk() # 真实伤害 固定值
|
| | | # curPlayerPropDict["IceDef"] = curPlayer.GetIceDef() # 真实伤害防御 固定值
|
| | | # curPlayerPropDict["IgnoreDefRate"] = curPlayer.GetIgnoreDefRate() # 无视防御几率
|
| | | # curPlayerPropDict["IgnoreDefRateReduce"] = PlayerControl.GetIgnoreDefRateReduce(curPlayer) # 无视防御概率抗性
|
| | | # curPlayerPropDict["IgnoreDefReducePer"] = PlayerControl.GetIgnoreDefReducePer(curPlayer) # 无视防御伤害减免
|
| | | # curPlayerPropDict["DamagePVE"] = PlayerControl.GetDamagePVE(curPlayer) # 伤害输出计算固定值PVE
|
| | | # curPlayerPropDict["DamagePerPVP"] = PlayerControl.GetDamagePerPVP(curPlayer) # 伤害输出计算百分比PVP
|
| | | # curPlayerPropDict["DamagePerPVPReduce"] = PlayerControl.GetDamagePerPVPReduce(curPlayer) # 伤害输出计算百分比PVP减少
|
| | | # curPlayerPropDict["DamagePVP"] = PlayerControl.GetDamagePVP(curPlayer) # PVP固定伤害
|
| | | # curPlayerPropDict["DamagePVPReduce"] = PlayerControl.GetDamagePVPReduce(curPlayer) # PVP固定减伤
|
| | | # curPlayerPropDict["FinalHurt"] = PlayerControl.GetFinalHurt(curPlayer) # 最终固定伤害增加
|
| | | # curPlayerPropDict["FinalHurtReduce"] = PlayerControl.GetFinalHurtReduce(curPlayer) # 最终固定伤害减少
|
| | | # curPlayerPropDict["FinalHurtPer"] = PlayerControl.GetFinalHurtPer(curPlayer) # 最终伤害百分比
|
| | | # curPlayerPropDict["FinalHurtReducePer"] = PlayerControl.GetFinalHurtReducePer(curPlayer) # 最终伤害减少百分比
|
| | | # curPlayerPropDict["OnlyFinalHurt"] = PlayerControl.GetOnlyFinalHurt(curPlayer) # 额外输出伤害
|
| | | # curPlayerPropDict["DamChanceDef"] = PlayerControl.GetDamChanceDef(curPlayer) # 20%的概率抵御伤害比率
|
| | | # curPlayerPropDict["NPCHurtAddPer"] = PlayerControl.GetNPCHurtAddPer(curPlayer) # 对怪物伤害加成
|
| | | # curPlayerPropDict["AtkBackHPPer"] = PlayerControl.GetAtkBackHPPer(curPlayer) # 攻击回复血量固定值
|
| | | # curPlayerPropDict["PVPAtkBackHP"] = PlayerControl.GetPVPAtkBackHP(curPlayer) # PVP攻击回血
|
| | | # curPlayerPropDict["FaintRate"] = PlayerControl.GetFaintRate(curPlayer) # 触发击晕
|
| | | # curPlayerPropDict["FaintDefRate"] = PlayerControl.GetFaintDefRate(curPlayer) # 击晕抵抗
|
| | | return
|
| | | |
| | | def SetHelpBattleRobotRebornAttr(self, fightPower):
|
| | | '''助战机器人只设置血量属性
|
| | | 血量算法,(助战玩家=助战机器人):每个副本配置伤害*(助战玩家战力/副本规定战力)*系数值 系数值暂定为50
|
| | |
| | | def OnKillNPCDrop(curPlayer, curNPC):
|
| | | ## 击杀NPC掉字逻辑
|
| | |
|
| | | if curNPC.GetType() in [ChConfig.ntPriWoodPilePVP]:
|
| | | if curNPC.GetType() in ChConfig.PVPNPCTypeList:
|
| | | return
|
| | |
|
| | | for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CollectWords, {}).values():
|
| | |
| | |
|
| | | return json.dumps(classItemDataDict, ensure_ascii=False).replace(" ", "")
|
| | |
|
| | | def GetPlayerPropPlusCache(curPlayer):
|
| | | #玩家属性缓存
|
| | | def UpdPlayerPropPlusCache(curPlayer):
|
| | | curPlayerPropDict = {}
|
| | | curPlayerPropDict["AccID"] = curPlayer.GetAccID()
|
| | | curPlayerPropDict["LV"] = curPlayer.GetLV()
|
| | |
| | | #魂石、丹药使用个数
|
| | | curPlayerPlusDict["Fruit"] = PlayerAttrFruit.GetAttrFruitEatCntDict(curPlayer)
|
| | |
|
| | | PyGameData.g_playerViewCache[curPlayer.GePlayerID()] = {"PropData":curPlayerPropDict, "PlusData":curPlayerPlusDict}
|
| | | return
|
| | |
|
| | | def GetPlayerPropPlusCache(curPlayer):
|
| | | #玩家属性缓存
|
| | | UpdPlayerPropPlusCache(curPlayer)
|
| | | return GetPlayerPropPlusCacheByID(curPlayer.GePlayerID())
|
| | |
|
| | | def GetPlayerPropPlusCacheByID(playerID):
|
| | | #玩家属性缓存
|
| | | viewCache = PyGameData.g_playerViewCache.get(playerID, {})
|
| | | curPlayerPropDict = viewCache.get("PropData", {})
|
| | | curPlayerPlusDict = viewCache.get("PlusData", {})
|
| | | PropData = json.dumps(curPlayerPropDict, ensure_ascii=False).replace(" ", "")
|
| | | PlusData = json.dumps(curPlayerPlusDict, ensure_ascii=False).replace(" ", "")
|
| | | return PropData, PlusData
|
| | |
| | | NetPackCommon.SendPyPackToGameServer(sendPack)
|
| | | return
|
| | |
|
| | | def GetPlayerPropData(findPlayerID):
|
| | | ## 获取玩家战斗属性数据 UpdPlayerPropPlusCache
|
| | | viewCache = PyGameData.g_playerViewCache.get(findPlayerID, {})
|
| | | return viewCache.get("PropData", {})
|
| | |
|
| | | def GetPlayerPropDataCall(curPlayer, findPlayerID, callFunc, callData=None, syncClient=True):
|
| | | ## 获取玩家战斗属性数据 - 支持callback,因为地图可能暂时没有离线玩家缓存数据
|
| | | |
| | | playerID = curPlayer.GetPlayerID()
|
| | | dataDict = GetPlayerPropData(findPlayerID)
|
| | | if dataDict:
|
| | | if syncClient:
|
| | | Sync_PlayerCache(curPlayer, findPlayerID)
|
| | | callFunc(curPlayer, findPlayerID, callData, dataDict)
|
| | | return dataDict
|
| | | PyGameData.g_viewCacheCallback[playerID] = [callFunc, callData]
|
| | | |
| | | #发送到GameServer去查询
|
| | | sendPack = ChMapToGamePyPack.tagMGQueryPlayerCache()
|
| | | sendPack.PlayerID = playerID
|
| | | sendPack.FindPlayerID = findPlayerID
|
| | | sendPack.EquipClassLV = 0
|
| | | sendPack.CallMap = 1
|
| | | NetPackCommon.SendPyPackToGameServer(sendPack) |
| | | return
|
| | |
|
| | | def Sync_PlayerCache(curPlayer, tagPlayerID):
|
| | | #回包客户端
|
| | | PropData, PlusData = GetPlayerPropPlusCacheByID(tagPlayerID)
|
| | | if not PropData:
|
| | | return
|
| | | sendPack = ChPyNetSendPack.tagSCQueryPlayerCacheResult()
|
| | | sendPack.PlayerID = tagPlayerID
|
| | | sendPack.PropData = PropData
|
| | | sendPack.PropDataSize = len(sendPack.PropData)
|
| | | sendPack.PlusData = PlusData
|
| | | sendPack.PlusDataSize = len(sendPack.PlusData)
|
| | | NetPackCommon.SendFakePack(curPlayer, sendPack)
|
| | | return
|
| | |
|
| | | #// 03 03 玩家缓存信息同步 #tagGMPlayerCache
|
| | | def OnGMPlayerCache(curPackData, tick):
|
| | | playerID = curPackData.PlayerID
|
| | | findPlayerID = curPackData.FindPlayerID
|
| | | PropData = curPackData.PropData
|
| | | PlusData = curPackData.PlusData
|
| | | |
| | | #GameWorld.DebugLog("玩家缓存信息同步到地图: playerID=%s,findPlayerID=%s" % (playerID, findPlayerID), playerID)
|
| | | #GameWorld.DebugLog(" PropData=%s" % PropData, playerID)
|
| | | #GameWorld.DebugLog(" PlusData=%s" % PlusData, playerID)
|
| | | |
| | | curPlayerPropDict = {}
|
| | | if PropData and PlusData:
|
| | | curPlayerPropDict = eval(PropData)
|
| | | curPlayerPlusDict = eval(PlusData)
|
| | | PyGameData.g_playerViewCache[findPlayerID] = {"PropData":curPlayerPropDict, "PlusData":curPlayerPlusDict}
|
| | | |
| | | if not playerID:
|
| | | return
|
| | | callback = PyGameData.g_viewCacheCallback.pop(playerID, None)
|
| | | if not callback:
|
| | | return
|
| | | callFunc, callData = callback
|
| | | curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
| | | if not curPlayer:
|
| | | return
|
| | | callFunc(curPlayer, findPlayerID, callData, curPlayerPropDict)
|
| | | return
|
| | |
|
| | |
| | | g_needRefreshMapServerState = True # 常规地图分线人数是否有变更需要通知
|
| | | g_mapLastProcess_Minute = -1 # 地图上次处理的分钟
|
| | |
|
| | | g_playerViewCache = {} # {playerID:{k:v, ...}, ...} # 查看玩家数据缓存
|
| | | g_viewCacheCallback = {} # {playerID:any, ...} # 玩家数据缓存回调
|
| | |
|
| | | InitPyItem = False # 是否加载过物品表所需要的Py数据, 每张地图只在启动时执行一次
|
| | | DailyUseCountLimitItemIDList = [] # 每日有使用个数限制的物品ID列表
|
| | | EquipItemSkillIDList = [] # 装备技能ID列表
|