| | |
| | | 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 类实例
|
| | |
| | | #其他需作为公式参数的系数
|
| | | 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:
|
| | |
| | | FBLogic.OnPlayerLVUp(curPlayer)
|
| | | # 记录开服活动冲级数据
|
| | | OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_LV, curPlayer.GetLV())
|
| | | |
| | | #神秘限购
|
| | | FunctionNPCCommon.MysticalShopOpen(curPlayer, befLV, aftLV)
|
| | | #不需要做升级任务, 设置玩家经验
|
| | | SetPlayerTotalExp(curPlayer, curTotalExp)
|
| | | return
|
| | |
| | | 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):
|
| | |
| | | ##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
|
| | |
| | | # @param value: 威望值
|
| | | # @return:
|
| | | def SetMergeWarRank(curPlayer, value):
|
| | | curPlayer.SetExAttr10(value, True, True)
|
| | | return
|
| | |
|
| | |
|
| | |
| | | # @param curPlayer: 玩家实例
|
| | | # @return: 威望值
|
| | | def GetMergeWarRank(curPlayer):
|
| | | return curPlayer.GetExAttr10()
|
| | | return 0
|
| | |
|
| | |
|
| | | ## 设置玩家官爵星级
|
| | |
| | | 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
|
| | |
|
| | | ## 刷属性时累加功能事先计算好的属性值
|