| | |
| | | import PlayerFamilyTech
|
| | | import PlayerCostRebate
|
| | | import PlayerFairyCeremony
|
| | | import FunctionNPCCommon
|
| | | import ChNetSendPack
|
| | | import PlayerState
|
| | | import QuestCommon
|
| | |
| | | # summonIndex += 1
|
| | |
|
| | |
|
| | | # 更新最后一次离开的非中立常规地图, 从中立地图退出时需要回到该地方,必须在 DoResetWorldPosAndClear 之前更新
|
| | | if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull and curPlayer.GetMapID() not in IpyGameDataPY.GetFuncEvalCfg("MapLine", 4):
|
| | | mapID = curPlayer.GetMapID()
|
| | | posX = curPlayer.GetPosX()
|
| | | posY = curPlayer.GetPosY()
|
| | | lineID = curPlayer.GetClientLineID()
|
| | | NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromMapID, mapID)
|
| | | NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromPosX, posX)
|
| | | NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromPosY, posY)
|
| | | NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromLineID, lineID)
|
| | | GameWorld.DebugLog("最后一次离开的非中立常规地图更新!mapID=%s,lineID=%s,Pos(%s,%s)" % (mapID, lineID, posX, posY))
|
| | | else:
|
| | | mapID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromMapID)
|
| | | posX = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromPosX)
|
| | | posY = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromPosY)
|
| | | lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromLineID)
|
| | | GameWorld.DebugLog("最后一次离开的非中立常规地图不变!mapID=%s,lineID=%s,Pos(%s,%s)" % (mapID, lineID, posX, posY))
|
| | | |
| | | #2. 调用切换地图接口
|
| | | curPlayer.DoResetWorldPosAndClear()
|
| | |
|
| | |
| | | #RouteServer未初始化不允许切换地图, 缓存处理
|
| | | GameServerRefresh.Set_PlayerRouteServerInitOK_OnLeaveFB(curPlayer, 1)
|
| | | return
|
| | | |
| | |
|
| | | #中立地图回到上一次非中立常规地图 |
| | | if curPlayer.GetMapID() in IpyGameDataPY.GetFuncEvalCfg("MapLine", 4):
|
| | | mapID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromMapID)
|
| | | posX = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromPosX)
|
| | | posY = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromPosY)
|
| | | lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromLineID)
|
| | | # 老号支持,本来就在中立地图的,返回新手村
|
| | | if not mapID:
|
| | | # {ְҵ:[dataMapID,posX,posY], ...}
|
| | | createRoleMapDict = IpyGameDataPY.GetFuncEvalCfg("CreateRoleMap", 1, {})
|
| | | if not createRoleMapDict:
|
| | | return
|
| | | job = curPlayer.GetJob()
|
| | | lineID = 0
|
| | | if job in createRoleMapDict:
|
| | | mapID, posX, posY = createRoleMapDict[job]
|
| | | else:
|
| | | mapInfoList = createRoleMapDict.values()
|
| | | mapID, posX, posY = mapInfoList[0]
|
| | | #离开副本
|
| | | mapID = curPlayer.GetFromMapID()
|
| | | posX = curPlayer.GetFromPosX()
|
| | | posY = curPlayer.GetFromPosY()
|
| | | |
| | | else:
|
| | | mapID = curPlayer.GetFromMapID()
|
| | | posX = curPlayer.GetFromPosX()
|
| | | posY = curPlayer.GetFromPosY()
|
| | | lineID = curPlayer.GetFromLineID()
|
| | | |
| | | if mapID == curPlayer.GetMapID():
|
| | | # 如果在同一张地图, 取DB重生点, 普通地图下线重上时FromMapID会被设置为本地图
|
| | | gameMap = GameWorld.GetMap()
|
| | |
| | | #copyMapID = curPlayer.GetCopyMapID()
|
| | | GameWorld.Log("PlayerLeaveFB MapID = %d, PosX = %d, PosY = %d" % (mapID, posX, posY), curPlayer.GetPlayerID())
|
| | |
|
| | | if GameWorld.GetMap().GetAutoSize() and GameWorld.GetGameWorld().GetMapCopyPlayerManager().GetPlayerCount() == 1:
|
| | | if GameWorldProcess.IsNoPlayerNeedCloseFB() and GameWorld.GetGameWorld().GetMapCopyPlayerManager().GetPlayerCount() == 1:
|
| | | #如果副本中只有这一个人, 那么把这个副本设置为玩家安全下线, 关闭副本
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | gameFB.SetIsSafeClose(1)
|
| | |
| | | # ChangePlayerAction(curPlayer, IPY_GameWorld.paNull)
|
| | | #===============================================================================================
|
| | |
|
| | | PlayerResetWorldPosFB(curPlayer, mapID, posX, posY, False, curPlayer.GetFromLineID())
|
| | | PlayerResetWorldPosFB(curPlayer, mapID, posX, posY, False, lineID)
|
| | |
|
| | | #在空闲或者移动状态下,才能锁死玩家
|
| | | if curPlayer.GetPlayerAction() in [IPY_GameWorld.paNull] or curPlayer.IsMoving():
|
| | |
| | |
|
| | | __AttrName = "%s" # 参数为ChConfig.Def_Calc_AllAttrType_MAX对应所有属性列表索引
|
| | | __AttrNameNoline = "Noline_%s" # 参数为ChConfig.Def_Calc_AllAttrType_MAX对应所有属性列表索引
|
| | | __NolineAttrList = [ChConfig.TYPE_Calc_AttrSpeed, ChConfig.TYPE_Calc_AttrATKMin, ChConfig.TYPE_Calc_AttrATKMax, |
| | | ChConfig.TYPE_Calc_AttrMaxHP] # 需要记录的非线性战斗属性
|
| | | __NolineAttrList = [ChConfig.TYPE_Calc_AttrSpeed] # 需要记录的非线性战斗属性
|
| | |
|
| | | ## 初始化
|
| | | # @param self 类实例
|
| | |
| | | DamagePerPVPReduce = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_DamagePerPVPReduce) * fpParam.GetCftDamagePerPVPReduce() # 伤害输出计算百分比PVP减少
|
| | | ComboRate = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_ComboRate) # 连击几率
|
| | | ComboDamPer = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_ComboDamPer) # 连击伤害
|
| | | MaxProDef = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_MaxProDef) # 最大防护值
|
| | | ProDefAbsorb = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_ProDefAbsorb) # 防护值吸收伤害比率
|
| | | #MaxProDef = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_MaxProDef) # 最大防护值
|
| | | #ProDefAbsorb = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_ProDefAbsorb) # 防护值吸收伤害比率
|
| | | ProDefPer = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_ProDefHPPer) # 防护转化百分比
|
| | |
|
| | | OnlyFinalHurt = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_OnlyFinalHurt) # 额外输出伤害
|
| | | PVPAtkBackHP = getattr(self, self.__AttrName % ChConfig.TYPE_Calc_PVPAtkBackHP) # PVP攻击回血
|
| | |
| | | #其他需作为公式参数的系数
|
| | | AtkSpeedParameter = fpParam.GetCftAtkSpeed()
|
| | | LuckyHitParameter = fpParam.GetCftLuckyHit()
|
| | | |
| | | fpEx = 0
|
| | | #装备模块特殊处理
|
| | | if self.mfpType == ShareDefine.Def_MFPType_Equip:
|
| | | AtkPer = getattr(self, self.__AttrNameNoline % ChConfig.TYPE_Calc_AttrATKMax) * fpParam.GetCftAtkPer() # 攻击百分比系数
|
| | | MaxHPPer = getattr(self, self.__AttrNameNoline % ChConfig.TYPE_Calc_AttrMaxHP) * fpParam.GetCftMaxHPPer() # 生命百分比系数
|
| | | fpEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 3))
|
| | | GameWorld.DebugLog("装备模块攻击生命百分比传奇属性战力: fpEx=%s" % fpEx)
|
| | | else:
|
| | | AtkPer = 0
|
| | | MaxHPPer = 0
|
| | |
|
| | | #获取策划配置的表格
|
| | | FightpowerFormula = IpyGameDataPY.GetFuncCfg("FightpowerFormula")
|
| | | totalFightPower = eval(FormulaControl.GetCompileFormula("FightpowerFormula", FightpowerFormula)) + fpEx
|
| | | totalFightPower = eval(FormulaControl.GetCompileFormula("FightpowerFormula", FightpowerFormula))
|
| | |
|
| | | #GameWorld.DebugLog("MfpType=%s,FightPower=%s, %s" % (self.mfpType, totalFightPower, self.GetMFPAttrStr()))
|
| | | if totalFightPower > ShareDefine.Def_UpperLimit_DWord:
|
| | |
| | | # 升级需要执行的游戏功能处理
|
| | | GameFuncComm.DoFuncOpenLogic(curPlayer)
|
| | | ChEquip.CalcEquips_OutOfPrint(curPlayer) # 缓存绝版属性
|
| | | if aftLV%10 == 0:
|
| | | # 控制下刷新次数
|
| | | PlayerPet.CalcPetItemAddPlayerAttr(curPlayer) # 宠物有随等级变化的技能
|
| | | |
| | | self.RefreshPlayerAttrState(billboardFunc=PlayerBillboard.UpdatePlayerLVBillboard)
|
| | | #放在功能开启后面
|
| | | PlayerWorldAverageLv.UpdatePlayerWorldAverageLv(curPlayer)
|
| | |
| | | FBLogic.OnPlayerLVUp(curPlayer)
|
| | | # 记录开服活动冲级数据
|
| | | OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_LV, curPlayer.GetLV())
|
| | | |
| | | #神秘限购
|
| | | FunctionNPCCommon.MysticalShopOpen(curPlayer, befLV, aftLV)
|
| | | #不需要做升级任务, 设置玩家经验
|
| | | SetPlayerTotalExp(curPlayer, curTotalExp)
|
| | | return
|
| | |
| | | #beforeAtkInterval = curPlayer.GetAtkInterval()
|
| | | beforeMaxHP = curPlayer.GetMaxHP()
|
| | | beforeMoveSpeedValue = GetSpeedValue(curPlayer)
|
| | | beforeMaxProDef = GetMaxProDef(curPlayer)
|
| | | #构建玩家刷新通知客户端字典, 缓存[索引, 数值]
|
| | | playerStateDict = {}
|
| | | for index in xrange(1, ChConfig.Def_Calc_AllAttrType_MAX):
|
| | |
| | | CalcLineEffect.ChangePlayerAttrInLineEffectList(curPlayer, skillNoFightPowerAttrList[ChConfig.CalcAttr_Battle])
|
| | | #self.PrintAttr(curPlayer, "固定层级")
|
| | |
|
| | | #护盾值刷新
|
| | | self.__RefreshMaxProDef(beforeMaxProDef)
|
| | | |
| | | # 【到此所有功能属性都已刷新处理完毕,复制一份 功能属性的刷新结果,用于BUFF属性单独刷新】
|
| | | EffGetSet.CopyPlayerFuncAttr(curPlayer)
|
| | |
|
| | |
| | | GameWorld.DebugLog("End RefreshPlayerAttrStateEx!!!")
|
| | | return True
|
| | |
|
| | | |
| | | # 生命转化为防护值
|
| | | def __RefreshMaxProDef(self, beforeMaxProDef):
|
| | | curPlayer = self.__Player
|
| | | if GetProDefHPPer(curPlayer) == 0:
|
| | | return
|
| | | maxHP = curPlayer.GetMaxHP()
|
| | | proDefPer = GetProDefHPPer(curPlayer)
|
| | | |
| | | #获取策划配置的表格
|
| | | GodWeapon4 = IpyGameDataPY.GetFuncCfg("GodWeapon4", 2)
|
| | | maxProDef = eval(FormulaControl.GetCompileFormula("GodWeapon4", GodWeapon4))
|
| | | |
| | | SetMaxProDef(curPlayer, int(maxProDef))
|
| | | |
| | | afterMaxProDef = GetMaxProDef(curPlayer)
|
| | | addValue = max(0, afterMaxProDef - beforeMaxProDef)
|
| | | curProDef = GetProDef(curPlayer)
|
| | | |
| | | if beforeMaxProDef > 0 and addValue > 0 and curPlayer.GetPlayerAction() != IPY_GameWorld.paDie:
|
| | | # 同步增加 (死亡状态下不刷)
|
| | | SetProDef(curPlayer, min(curProDef + addValue, afterMaxProDef))
|
| | | elif curProDef > afterMaxProDef:
|
| | | # 做一次防范纠正
|
| | | SetProDef(curPlayer, min(curProDef, afterMaxProDef))
|
| | | |
| | | return
|
| | |
|
| | | def __RefreshBuffAttr(self):
|
| | | ## 刷新buff层属性,该层属性只会改变玩家最终属性,不会影响战力等
|
| | |
| | | index = 0
|
| | | buffSkillIDList = []
|
| | |
|
| | | passiveEff = PassiveBuffEffMng.GetPassiveEffManager().GetPassiveEff(curPlayer)
|
| | | while index < buffState.GetBuffCount():
|
| | | curBuff = buffState.GetBuff(index)
|
| | | #异常
|
| | |
| | | continue
|
| | |
|
| | | #BuffSkill.DoBuffDisApper(curPlayer, curBuff, tick)
|
| | | buffSkillIDList.append([curBuff.GetSkill().GetSkillID(), curBuff.GetOwnerID(), curBuff.GetOwnerType()])
|
| | | #buffSkillIDList.append([curBuff.GetSkill().GetSkillID(), curBuff.GetOwnerID(), curBuff.GetOwnerType()])
|
| | | buffSkillIDList.append(curBuff.GetSkill().GetSkillID())
|
| | | #GameWorld.DebugLog("死亡清理-----%s"%curBuff.GetSkill().GetSkillID())
|
| | | if passiveEff:
|
| | | passiveEff.DelBuffInfo(curBuff.GetSkill())
|
| | | |
| | | #删除这个buff
|
| | | buffState.DeleteBuffByIndex(index)
|
| | | |
| | | |
| | | |
| | | SkillShell.ClearBuffEffectBySkillIDList(curPlayer, buffState, buffSkillIDList)
|
| | | return
|
| | |
|
| | |
| | | # SetExAttr1 ~ SetExAttr14(DWORD uiExAttr10, bool bNotifyAll = false, bool bNotifyGameServer = false)
|
| | | # @param bNotifyAll: 是否广播所周围玩家,默认false,只会发给自己
|
| | | # @param bNotifyGameServer: 是否同步GameServer,默认false
|
| | | # SetExAttr15 ~ SetExAttr20(DWORD uiExAttr15) |
| | | # 15~20扩展属性同步封包:0309 选角登录简短信息、0434 周围玩家出现、0102 登录地图玩家信息;
|
| | | # 同步前端及GameServer需要自己写通知,设置函数自身不带通知参数
|
| | | #
|
| | | # 发送0418包
|
| | | # SendPropertyRefresh(int inputType, int inputValue, bool boardCast, bool includeSelf = true)
|
| | |
| | | #
|
| | | # ֪ͨGsmeServer;
|
| | | # SendGameServerRefreshState(int inputType, int inputValue)
|
| | |
|
| | | # SetExAttr15 ~ 18 对应神兵类型等级,场景特效用
|
| | |
|
| | | # 禁言 通知gameServer
|
| | | def SetGMForbidenTalk(curPlayer, value):
|
| | |
| | | curPlayer.SetExAttr6(silverPoint)
|
| | | return
|
| | |
|
| | | ## 玩家今日已获得仙缘币
|
| | | def GetTodayXianyuanCoin(curPlayer): return curPlayer.GetExAttr11()
|
| | | def SetTodayXianyuanCoin(curPlayer, value): return curPlayer.SetExAttr11(value, False, True)
|
| | | def AddTodayXianyuanCoin(curPlayer, addValue): return curPlayer.SetExAttr11(curPlayer.GetExAttr11() + addValue, False, True)
|
| | |
|
| | | ##VIP到期时间, 需要同步GameServer
|
| | | def GetVIPExpireTime(curPlayer): return curPlayer.GetExAttr9()
|
| | | def SetVIPExpireTime(curPlayer, expireTime): return curPlayer.SetExAttr9(expireTime, False, True)
|
| | |
|
| | | ##聊天气泡框
|
| | | def GetChatBubbleBox(curPlayer): return curPlayer.GetExAttr10()
|
| | | def SetChatBubbleBox(curPlayer, value): return curPlayer.SetExAttr10(value, False, True)
|
| | |
|
| | | ##获得玩家威望值
|
| | | def GetPrestige(curPlayer): return 0
|
| | |
| | | # @return: 威望值
|
| | | def GetMergeWarRank(curPlayer):
|
| | | return 0
|
| | |
|
| | |
|
| | | ## 设置玩家官爵星级
|
| | | # @param curPlayer: 玩家实例
|
| | | # @param value: 星级
|
| | | # @return: |
| | | def SetOfficeStar(curPlayer, value):
|
| | | curPlayer.SetExAttr11(value)
|
| | | return
|
| | |
|
| | | |
| | | ## 获取玩家玩家官爵星级
|
| | | # @param curPlayer: 玩家实例
|
| | | # @return: 星级
|
| | | def GetOfficeStar(curPlayer):
|
| | | return curPlayer.GetExAttr11()
|
| | |
|
| | |
|
| | | ##获取可免费开启的格子数
|
| | | # @param curPlayer 玩家对象
|
| | |
| | | def GetMaxProDef(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrMaxProDef)
|
| | | def SetMaxProDef(curPlayer, value):
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrMaxProDef, value)
|
| | | curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_MaxProDef, value, True) # 周围玩家需要通知
|
| | | curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_MaxProDef, value, False) # 周围玩家需要通知
|
| | | #---生命上限换算为防护值的百分比----
|
| | | def GetProDefHPPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrProDefHPPer)
|
| | | def SetProDefHPPer(curPlayer, value):
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrProDefHPPer, value)
|
| | | curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ProDefHPPer, value, False)
|
| | | #curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ProDefHPPer, value, False)
|
| | | #---防护值吸收伤害比率----
|
| | | def GetProDefAbsorb(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrProDefAbsorb)
|
| | | def SetProDefAbsorb(curPlayer, value):
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrProDefAbsorb, value)
|
| | | curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ProDefAbsorb, value, False)
|
| | | #curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ProDefAbsorb, value, False)
|
| | |
|
| | | #---宠物攻击提升值----
|
| | | def GetPetMinAtk(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrPetMinAtk)
|
| | |
| | | def GetCalcAttrListValue(curPlayer, funcIndex):
|
| | | ## 获取功能点预先计算的所加属性值
|
| | | attrList = [{} for _ in range(4)]
|
| | | for attrIndex, attrDict in enumerate(attrList):
|
| | | for i in xrange(Def_MaxAddAttrTypeCnt):
|
| | | attrType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CalcAddAttrType % (funcIndex, attrIndex, i))
|
| | | if attrType == 0:
|
| | | break
|
| | | attrDict[attrType] = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CalcAddAttrValue % (funcIndex, attrIndex, i))
|
| | | if isinstance(funcIndex, int):
|
| | | funcIndexList = [funcIndex]
|
| | | elif isinstance(funcIndex, list):
|
| | | funcIndexList = funcIndex
|
| | | else:
|
| | | return attrList
|
| | | |
| | | for funcIndex in funcIndexList:
|
| | | for attrIndex, attrDict in enumerate(attrList):
|
| | | for i in xrange(Def_MaxAddAttrTypeCnt):
|
| | | attrType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CalcAddAttrType % (funcIndex, attrIndex, i))
|
| | | if attrType == 0:
|
| | | break
|
| | | attrValue = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CalcAddAttrValue % (funcIndex, attrIndex, i))
|
| | | if attrType in attrDict:
|
| | | attrDict[attrType] = attrValue + attrDict[attrType]
|
| | | else:
|
| | | attrDict[attrType] = attrValue |
| | | return attrList
|
| | |
|
| | | ## 刷属性时累加功能事先计算好的属性值
|