xdh
2018-11-23 4a5b10c5ca95f49cf3700619e1033da645c9de89
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -83,6 +83,7 @@
import PlayerFamilyTech
import PlayerCostRebate
import PlayerFairyCeremony
import FunctionNPCCommon
import ChNetSendPack
import PlayerState
import QuestCommon
@@ -1453,6 +1454,24 @@
#        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()
    
@@ -1479,12 +1498,33 @@
        #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()
@@ -1494,7 +1534,7 @@
    #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)
@@ -1507,7 +1547,7 @@
    #    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():
@@ -3356,8 +3396,7 @@
    
    __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 类实例
@@ -3465,21 +3504,10 @@
        #其他需作为公式参数的系数
        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:
@@ -3898,7 +3926,8 @@
            FBLogic.OnPlayerLVUp(curPlayer)
            # 记录开服活动冲级数据
            OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_LV, curPlayer.GetLV())
            #神秘限购
            FunctionNPCCommon.MysticalShopOpen(curPlayer, befLV, aftLV)
        #不需要做升级任务, 设置玩家经验
        SetPlayerTotalExp(curPlayer, curTotalExp) 
        return
@@ -5071,6 +5100,7 @@
    index = 0
    buffSkillIDList = []
    
    passiveEff = PassiveBuffEffMng.GetPassiveEffManager().GetPassiveEff(curPlayer)
    while index < buffState.GetBuffCount():
        curBuff = buffState.GetBuff(index)
        #异常
@@ -5085,10 +5115,16 @@
            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
@@ -5595,6 +5631,9 @@
# 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)
@@ -5602,6 +5641,8 @@
#
# ֪ͨGsmeServer; 
# SendGameServerRefreshState(int inputType, int inputValue)
# SetExAttr15 ~ 18 对应神兵类型等级,场景特效用
# 禁言 通知gameServer
def SetGMForbidenTalk(curPlayer, value):
@@ -5640,6 +5681,10 @@
##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
@@ -5836,7 +5881,6 @@
#  @param value: 威望值
#  @return: 
def SetMergeWarRank(curPlayer, value):
    curPlayer.SetExAttr10(value, True, True)
    return
    
@@ -5844,7 +5888,7 @@
#  @param curPlayer: 玩家实例
#  @return: 威望值
def GetMergeWarRank(curPlayer):
    return curPlayer.GetExAttr10()
    return 0
## 设置玩家官爵星级
@@ -6613,12 +6657,24 @@
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
## 刷属性时累加功能事先计算好的属性值