xdh
2019-06-10 c3bb4072a13fc6e9541c971dec3f2865184136cd
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_FamilyParty.py
@@ -25,6 +25,8 @@
import IpyGameDataPY
import GameWorldProcess
import PlayerFairyCeremony
import PlayerNewFairyCeremony
import PlayerActLogin
import EventReport
import PyGameData
import ItemCommon
@@ -39,7 +41,6 @@
) = range(3)
#---战盟副本---
Map_FamilyPartyFB_FamilyID = "FamilyPartyFB_FamilyID"  # 对应的家族id
Map_FamilyPartyFB_StartTick = "Map_FamilyPartyFB_StartTick"  # 副本开始时间
GameFBDict_LastEnterFbDay = 'LastEnterFbDay_%s'  #上次进入活动的开服天
FBPlayerDict_TotalExp = 'XMYH_TotalExp%s'  # 获得的总经验
@@ -48,7 +49,7 @@
FBPlayerDict_HasCollect = 'XMYH_HasCollect%s'  # 是否已采集
FBPlayerDict_HasSit = 'XMYH_HasSit%s'  # 是否已传功
g_familyMapPlayerIDDict = {}#{lineid:[playerid,..]}
def OnFBPlayerOnDay(curPlayer):
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyAnswerCnt, 0)
    return
@@ -60,7 +61,6 @@
# @remarks 开启副本
def OnOpenFB(tick):
    gameFB = GameWorld.GetGameFB()
    gameFB.SetGameFBDict(Map_FamilyPartyFB_FamilyID, 0)
    gameFB.ClearAllPlayerGameFBDict()  # 清除所有玩家对应的副本字典信息
    gameFB.SetGameFBDict(ChConfig.Map_FBDict_NotifyStart, 0)
    return
@@ -146,6 +146,7 @@
# @return 无意义
# @remarks 玩家进入副本
def DoEnterFB(curPlayer, tick):
    global g_familyMapPlayerIDDict
    mapID = GameWorld.GetGameWorld().GetMapID()
    playerID = curPlayer.GetPlayerID()
    if not __CheckEnter(curPlayer, mapID):
@@ -160,8 +161,6 @@
        return
    curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, closeFB_RemainTick, True) 
    GameWorld.DebugLog('closeFB_RemainTick=%s' % closeFB_RemainTick)
    if not gameFB.GetGameFBDictByKey(Map_FamilyPartyFB_FamilyID):
        gameFB.SetGameFBDict(Map_FamilyPartyFB_FamilyID, curPlayer.GetFamilyID())
       
    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
    if gameWorld.GetGameWorldDictByKey(GameFBDict_LastEnterFbDay % playerID) != openServerDay + 1:
@@ -178,8 +177,21 @@
        PlayerFamily.AddFamilyActivity(curPlayer, ShareDefine.FamilyActive_Party)
        EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_FamilyParty, 0, ChConfig.CME_Log_Start)
        PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FamilyParty, 1)
        PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FamilyParty, 1)
        PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_FamilyParty, 1)
    lineID = GameWorld.GetGameWorld().GetLineID()
    if lineID not in g_familyMapPlayerIDDict:
        g_familyMapPlayerIDDict[lineID] = []
    if playerID not in g_familyMapPlayerIDDict[lineID]:
        g_familyMapPlayerIDDict[lineID].append(playerID)
    
    DoFBHelp(curPlayer, tick)
    playerManager = GameWorld.GetMapCopyPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(index)
        if not curPlayer:
            continue
        DoFBHelp(curPlayer, tick, True)
    return
@@ -196,8 +208,12 @@
# @return 返回值无意义
# @remarks 副本定时器
def OnProcess(tick):
    familyID = GameWorld.GetGameWorld().GetPropertyID()
    if not familyID:
        return
    gameFB = GameWorld.GetGameFB()
    fbStep = gameFB.GetFBStep()
    #GameWorld.DebugLog("    OnProcess...")
    if fbStep == FB_Step_Open:
        if FBCommon.GetFBFuncOpenState(ChConfig.Def_FBMapID_FamilyParty):
@@ -211,7 +227,7 @@
            GameWorldProcess.CloseFB(tick)
        else:
            #FBCommon.DoLogicAreaReward("FamilyPartyAreaAward", tick)
            #FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 10000)
            FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 5000)
            
            mapID = GameWorld.GetMap().GetMapID()
            notifyIndex = gameFB.GetGameFBDictByKey(ChConfig.Map_FBDict_NotifyStart)
@@ -221,7 +237,7 @@
                remaindTick = max(0, __GetRemainTick(tick) - 1000)
                if remaindTick <= (notifySecond + 1) * 1000:   
                    #remaindSecond = remaindTick / 1000
                    familyID = gameFB.GetGameFBDictByKey(Map_FamilyPartyFB_FamilyID)
                    PlayerControl.FamilyNotify(familyID, "Party_OverTime", [notifySecond])
                     
                    GameWorld.GetGameFB().SetGameFBDict(ChConfig.Map_FBDict_NotifyStart, notifyIndex + 1)
@@ -240,7 +256,7 @@
    #仙盟贡献度
    PlayerFamily.AddPlayerFamilyActiveValue(curPlayer, addPoint, True, ShareDefine.Def_AddFAVReason_FamilyParty, True)
    #答题经验更新
    PlayerControl.PlayerControl(curPlayer).AddExp(addExp)
    PlayerControl.PlayerControl(curPlayer).AddExp(addExp, ShareDefine.Def_ViewExpType_SysEx)
    
    curAnswerCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyAnswerCnt)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyAnswerCnt, curAnswerCnt + 1)
@@ -268,9 +284,11 @@
    if mapID != ChConfig.Def_FBMapID_FamilyParty:
        return
    if state == 1:
        GameWorld.GetGameWorld().SetGameWorldDict(Map_FamilyPartyFB_StartTick, tick)
    if state:
        if not GameWorld.GetGameWorld().GetGameWorldDictByKey(Map_FamilyPartyFB_StartTick):
            GameWorld.GetGameWorld().SetGameWorldDict(Map_FamilyPartyFB_StartTick, tick)
    else:
        GameWorld.GetGameWorld().SetGameWorldDict(Map_FamilyPartyFB_StartTick, 0)
    return
#
@@ -317,7 +335,7 @@
# @param tick 时间戳
# @return 无意义
# @remarks 用于通知阵营比分条
def DoFBHelp(curPlayer, tick):
def DoFBHelp(curPlayer, tick, isSyncPlayerID=False):
    #gameFB = GameWorld.GetGameFB()
    gameWorld = GameWorld.GetGameWorld()
    playerID = curPlayer.GetPlayerID()
@@ -336,16 +354,17 @@
    hasCollect = gameWorld.GetGameWorldDictByKey(FBPlayerDict_HasCollect % playerID)
    hasSit = gameWorld.GetGameWorldDictByKey(FBPlayerDict_HasSit % playerID)
    
    getCnt = gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetCnt % playerID)
    isFull = 1 if getCnt >= IpyGameDataPY.GetFuncCfg('FamilyPartyAreaAward', 3) else 0
    helpDict = {FBCommon.Help_exp:exp, FBCommon.Help_expPoint:expPoint, FBCommon.Help_score:totalPoint, "hasCollect":hasCollect, "isFullExp":isFull, "hasSit":hasSit}
    helpDict = {FBCommon.Help_exp:exp, FBCommon.Help_expPoint:expPoint, FBCommon.Help_score:totalPoint, "hasCollect":hasCollect, "hasSit":hasSit}
    if PyGameData.g_familyPartyInfo:
        rankList = []
        for i, info in enumerate(PyGameData.g_familyPartyInfo[0], 1):
            rankList.append({"rank":i, "name":info[1], "cnt":info[2]})
        helpDict['familyPartyRank'] = rankList
        helpDict['familyPartyTop'] = {'name':PyGameData.g_familyPartyInfo[1], "cnt":PyGameData.g_familyPartyInfo[2]}
    if isSyncPlayerID:
        lineID = GameWorld.GetGameWorld().GetLineID()
        helpDict['familyPartyPlayer'] = g_familyMapPlayerIDDict.get(lineID, [])
    GameWorld.DebugLog("DoFBHelp %s" % helpDict, playerID)
    FBCommon.Notify_FBHelp(curPlayer, helpDict)
    return
@@ -393,7 +412,7 @@
    #给奖励
    itemAward = IpyGameDataPY.GetFuncEvalCfg('FamilyPartyDesk', 3)
    for itemID, itemCount, isBind in itemAward:
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem])
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem])
    addPoint = IpyGameDataPY.GetFuncCfg('FamilyPartyDesk')
    PlayerControl.NotifyCode(curPlayer, 'Party_CollectSuccess', [addPoint])
    PlayerFamily.AddPlayerFamilyActiveValue(curPlayer, addPoint, True, ShareDefine.Def_AddFAVReason_FamilyParty)
@@ -404,6 +423,47 @@
    DoFBHelp(curPlayer, 0)
    return
## 获得经验
#  @param curPlayer 当前玩家
#  @param addExp 获得的经验
#  @param expViewType 经验类型
#  @return True or False
def OnGetExp(curPlayer, addExp, expViewType):
    if expViewType != ShareDefine.Def_ViewExpType_SysEx:
        return
    gameWorld = GameWorld.GetGameWorld()
    playerID = curPlayer.GetID()
    exp = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalExp % playerID)
    expPoint = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalExpPoint % playerID)
    newTotalExp = expPoint*ChConfig.Def_PerPointValue+exp+addExp
    gameWorld.SetGameWorldDict(FBPlayerDict_TotalExp % playerID, newTotalExp%ChConfig.Def_PerPointValue)
    gameWorld.SetGameWorldDict(FBPlayerDict_TotalExpPoint % playerID, newTotalExp/ChConfig.Def_PerPointValue)
    GameWorld.DebugLog("OnGetExp() addExp=%s,updTotalExp=%s"
                       % (addExp, newTotalExp), playerID)
    return
##玩家退出副本
# @param curPlayer 玩家实例
# @param tick 时间戳
# @return 无意义
def DoExitFB(curPlayer, tick):
    global g_familyMapPlayerIDDict
    __GiveSitAward(curPlayer)
    lineID = GameWorld.GetGameWorld().GetLineID()
    playerID = curPlayer.GetID()
    if playerID in g_familyMapPlayerIDDict.get(lineID, []):
        g_familyMapPlayerIDDict[lineID].remove(playerID)
        if g_familyMapPlayerIDDict[lineID]:
            playerManager = GameWorld.GetMapCopyPlayerManager()
            for index in xrange(playerManager.GetPlayerCount()):
                curPlayer = playerManager.GetPlayerByIndex(index)
                if not curPlayer:
                    continue
                DoFBHelp(curPlayer, tick, True)
    return
## 副本行为
#  @param curPlayer 玩家
@@ -428,32 +488,52 @@
        tagPlayer = copyMapPlayerManager.FindPlayerByID(tagPlayerID)
        if not tagPlayer:
            GameWorld.DebugLog('邀请%s打坐,该玩家不在副本里' % tagPlayerID, playerID)
            PlayerControl.NotifyCode(curPlayer, 'PartySitFail')
            return
        curPlayer.StopMove()
        curPlayer.Sit()
        if tagPlayer.GetPlayerAction() not in [IPY_GameWorld.paSit, IPY_GameWorld.paPreparing]:
            tagPlayer.StopMove()
            tagPlayer.Sit()
#        if not gameWorld.GetGameWorldDictByKey(FBPlayerDict_HasSit % tagPlayerID):
#            if tagPlayer.GetPlayerAction() not in [IPY_GameWorld.paSit, IPY_GameWorld.paPreparing]:
#                tagPlayer.StopMove()
#                tagPlayer.Sit()
    elif actionType == 1:  #打坐结束给奖励
        reLV = curPlayer.GetLV()
        worldlv = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
        giveLV = eval(IpyGameDataPY.GetFuncCompileCfg('FamilyPartySitAward', 2))
        if giveLV:
            Item_AddLV.DoAddLVEx(curPlayer, giveLV, True, True, 0)
        reLV = curPlayer.GetLV()
        reExp = PlayerControl.GetPlayerReExp(curPlayer)
        giveExp = eval(IpyGameDataPY.GetFuncCompileCfg('FamilyPartySitAward'))
        if giveExp:
            PlayerControl.PlayerControl(curPlayer).AddExp(giveExp)
            exp = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalExp % playerID)
            expPoint = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalExpPoint % playerID)
            newTotalExp = expPoint*ChConfig.Def_PerPointValue+exp+giveExp
            gameWorld.SetGameWorldDict(FBPlayerDict_TotalExp % playerID, newTotalExp%ChConfig.Def_PerPointValue)
            gameWorld.SetGameWorldDict(FBPlayerDict_TotalExpPoint % playerID, newTotalExp/ChConfig.Def_PerPointValue)
        gameWorld.SetGameWorldDict(FBPlayerDict_HasSit % playerID, 1)
        if not __GiveSitAward(curPlayer):
            return
        DoFBHelp(curPlayer, 0)
        if curPlayer.GetPlayerAction() == IPY_GameWorld.paSit:
            curPlayer.Stand()
        GameWorld.DebugLog('    传功结束,giveLV=%s, giveExp=%s, worldlv=%s' % (giveLV, giveExp, worldlv))
    return
def __GiveSitAward(curPlayer):
    #给打坐奖励
    gameWorld = GameWorld.GetGameWorld()
    playerID = curPlayer.GetID()
    hasSit = gameWorld.GetGameWorldDictByKey(FBPlayerDict_HasSit % playerID)
    if hasSit:
        GameWorld.Log('打坐结束给奖励,玩家已打坐过一次', playerID)
        return
    if curPlayer.GetPlayerAction() != IPY_GameWorld.paSit:
        GameWorld.Log('打坐结束给奖励,玩家不在打坐状态', playerID)
        return
    curPlayer.Stand()
    reLV = curPlayer.GetLV()
    worldlv = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
    giveLV = eval(IpyGameDataPY.GetFuncCompileCfg('FamilyPartySitAward', 2))
    addExp = 0
    if giveLV:
        addExp = Item_AddLV.DoAddLVEx(curPlayer, giveLV, True, True, 0)
    reLV = curPlayer.GetLV()
    reExp = PlayerControl.GetPlayerReExp(curPlayer)
    giveExp = eval(IpyGameDataPY.GetFuncCompileCfg('FamilyPartySitAward'))
    if giveExp:
        giveExp = PlayerControl.PlayerControl(curPlayer).AddExp(giveExp)
        exp = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalExp % playerID)
        expPoint = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalExpPoint % playerID)
        newTotalExp = expPoint*ChConfig.Def_PerPointValue+exp+giveExp+addExp
        gameWorld.SetGameWorldDict(FBPlayerDict_TotalExp % playerID, newTotalExp%ChConfig.Def_PerPointValue)
        gameWorld.SetGameWorldDict(FBPlayerDict_TotalExpPoint % playerID, newTotalExp/ChConfig.Def_PerPointValue)
    gameWorld.SetGameWorldDict(FBPlayerDict_HasSit % playerID, 1)
    GameWorld.DebugLog('    传功结束,giveLV=%s, giveExp=%s, worldlv=%s' % (giveLV, giveExp, worldlv))
    return True