ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_FamilyParty.py
@@ -14,7 +14,8 @@
# 详细描述: 战盟盛宴
#
#---------------------------------------------------------------------
"""Version = 2018-04-16 17:20"""
#"""Version = 2018-04-16 17:20"""
#---------------------------------------------------------------------
import ShareDefine
import FBCommon
import ChConfig
@@ -23,44 +24,39 @@
import GameWorld
import PlayerFamily
import IpyGameDataPY
import GameWorldProcess
import PlayerFairyCeremony
import PlayerNewFairyCeremony
import PlayerActLogin
import EventReport
import PyGameData
import ItemCommon
import ItemControler
import Item_AddLV
#当前副本地图的状态
(
FB_Step_Open,  # 地图开启
FB_Step_Fighting,  # 战斗中
FB_Step_Over,  # 副本关闭
) = range(3)
import PlayerTalk
import PlayerActivity
#---战盟副本---
Map_FamilyPartyFB_StartTick = "Map_FamilyPartyFB_StartTick"  # 副本开始时间
GameFBDict_LastEnterFbDay = 'LastEnterFbDay_%s'  #上次进入活动的开服天
FBPlayerDict_TotalExp = 'XMYH_TotalExp%s'  # 获得的总经验
FBPlayerDict_TotalExpPoint = 'XMYH_TotalExpPoint%s'  # 获得的总经验点
FBPlayerDict_TotalPoint = 'XMYH_TotalPoint%s'  # 获得的总仙盟贡献值
FBPlayerDict_HasCollect = 'XMYH_HasCollect%s'  # 是否已采集
FBPlayerDict_HasSit = 'XMYH_HasSit%s'  # 是否已传功
FBPlayerDict_TagPlayerID = 'XMYH_TagPlayerID%s'  # 邀请传功目标玩家ID
g_familyMapPlayerIDDict = {}#{lineid:[playerid,..]}
def OnFBPlayerOnDay(curPlayer):
g_familyMapPlayerIDDict = {}#{lineID:[playerID,..]}
def OnDayFamilyPartyPlayer(curPlayer):
    GameWorld.DebugLog("重置仙盟宴会相关数据,含传功!", curPlayer.GetPlayerID())
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyJoinSign, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyAnswerCnt, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartySitState, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyHelpSitCount, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyCollectState, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyTotalExp, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyTotalExpPoint, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyTotalPoint, 0)
    return
##开启副本
# @param tick 时间戳
# @return 返回值无意义
# @remarks 开启副本
def OnOpenFB(tick):
    gameFB = GameWorld.GetGameFB()
    gameFB.ClearAllPlayerGameFBDict()  # 清除所有玩家对应的副本字典信息
    gameFB.SetGameFBDict(ChConfig.Map_FBDict_NotifyStart, 0)
    return
@@ -69,8 +65,9 @@
# @return 无意义
# @remarks 
def OnCloseFB(tick):
    #副本踢出玩家
    FBCommon.DoLogic_FBKickAllPlayer()
    global g_familyMapPlayerIDDict
    lineID = GameWorld.GetGameWorld().GetLineID()
    g_familyMapPlayerIDDict.pop(lineID, None)
    return
@@ -115,26 +112,6 @@
# @param tick 时间戳
# @return
def OnChangeMapAsk(ask, tick):
    GameWorld.DebugLog("OnChangeMapAsk  CopyMapID=%s" % (ask.GetCopyMapID()))
    playerIDStr = ask.GetMsg()
    GameWorld.DebugLog("OnChangeMapAsk playerIDStr=%s" % playerIDStr)
    #携带玩家ID入场
    if playerIDStr in ['', '0']:
        return IPY_GameWorld.cmeCustom
    playerID = int(playerIDStr)
#
#    # 判断是否已经进场过
#    gameFB = GameWorld.GetGameFB()
#    fbStep = gameFB.GetFBStep()
#
#    GameWorld.DebugLog("OnChangeMapAsk fbStep=%s" % fbStep)
#    # 超过准备阶段,如果已经进去过不让再进
#    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
#    isEnter = GameWorld.GetGameWorld().GetGameWorldDictByKey(GameFBDict_LastEnterFbDay % playerID) == openServerDay + 1
#    GameWorld.DebugLog("OnChangeMapAsk isEnter=%s" % isEnter)
#    if isEnter:
#        return IPY_GameWorld.cmeCustom, "GeRen_liubo_676165"
    #可进入
    return IPY_GameWorld.cmeAccept
@@ -150,31 +127,13 @@
    if not __CheckEnter(curPlayer, mapID):
        PlayerControl.PlayerLeaveFB(curPlayer)
        return
    gameFB = GameWorld.GetGameFB()
    gameWorld = GameWorld.GetGameWorld()
    
    closeFB_RemainTick = __GetRemainTick(tick)
    if not closeFB_RemainTick:
        PlayerControl.PlayerLeaveFB(curPlayer)
        return
    curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, closeFB_RemainTick, True)
    GameWorld.DebugLog('closeFB_RemainTick=%s' % closeFB_RemainTick)
    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
    if gameWorld.GetGameWorldDictByKey(GameFBDict_LastEnterFbDay % playerID) != openServerDay + 1:
        gameWorld.SetGameWorldDict(GameFBDict_LastEnterFbDay % playerID, openServerDay + 1)
        gameWorld.SetGameWorldDict(FBPlayerDict_TotalExp % playerID, 0)
        gameWorld.SetGameWorldDict(FBPlayerDict_TotalExpPoint % playerID, 0)
        gameWorld.SetGameWorldDict(FBPlayerDict_TotalPoint % playerID, 0)
        gameWorld.SetGameWorldDict(FBPlayerDict_HasCollect % playerID, 0)
        gameWorld.SetGameWorldDict(FBPlayerDict_HasSit % playerID, 0)
    gameWorld = GameWorld.GetGameWorld()
    partyActionState = gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyParty)
    if partyActionState:
        remainSeconds = PlayerActivity.GetDailyActionRemainSeconds(ShareDefine.DailyActionID_FamilyParty)
        __DoEnterJoinFamilyParty(curPlayer, remainSeconds)
        
        FBCommon.ClearAreaRewardRecord(playerID)
        FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_FamilyParty)
        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)
    lineID = GameWorld.GetGameWorld().GetLineID()
    if lineID not in g_familyMapPlayerIDDict:
        g_familyMapPlayerIDDict[lineID] = []
@@ -187,17 +146,33 @@
        if not curPlayer:
            continue
        DoFBHelp(curPlayer, tick, True)
    return
def __DoEnterJoinFamilyParty(curPlayer, remainSeconds):
    ## 玩家正式开始参与仙盟宴会,因为多个仙盟活动可能共用该地图,玩家可能活动开始时已经在该地图
    GameWorld.DebugLog("玩家参加仙盟宴会!remainSeconds=%s" % remainSeconds, curPlayer.GetPlayerID())
    if remainSeconds:
        curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, remainSeconds * 1000, True)
    if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyJoinSign):
        return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyJoinSign, 1)
    #FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_FamilyParty)
    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_FamilyParty)
    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)
    return
def __GetRemainTick(tick):
    ##活动剩余毫秒
    mapID = GameWorld.GetMap().GetMapID()
    startTick = GameWorld.GetGameWorld().GetGameWorldDictByKey(Map_FamilyPartyFB_StartTick)
    closeFB_RemainTick = max(0, FBCommon.GetFBLineStepTime(mapID)[0] * 1000 - (tick - startTick))
    return closeFB_RemainTick
## 是否可以获得副本地图区域经验
def OnCanGetAreaExp(curPlayer):
    gameWorld = GameWorld.GetGameWorld()
    partyActionState = gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyParty)
    return partyActionState
##副本定时器
# @param tick 时间戳
@@ -207,56 +182,49 @@
    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):
            FBCommon.SetFBStep(FB_Step_Fighting, tick)
    elif fbStep == FB_Step_Fighting:
        if not FBCommon.GetFBFuncOpenState(ChConfig.Def_FBMapID_FamilyParty):
            FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
            PyGameData.g_familyPartyInfo = []
            FBCommon.SetFBStep(FB_Step_Over, tick)
            FBCommon.DoLogic_FBKickAllPlayer()
            GameWorldProcess.CloseFB(tick)
        else:
            #FBCommon.DoLogicAreaReward("FamilyPartyAreaAward", tick)
            FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 10000)
            mapID = GameWorld.GetMap().GetMapID()
            notifyIndex = gameFB.GetGameFBDictByKey(ChConfig.Map_FBDict_NotifyStart)
            notifySecondList = FBCommon.GetFBLineStepTime(mapID)[1]
            if notifyIndex < len(notifySecondList):
                notifySecond = notifySecondList[notifyIndex]
                remaindTick = max(0, __GetRemainTick(tick) - 1000)
                if remaindTick <= (notifySecond + 1) * 1000:
                    #remaindSecond = remaindTick / 1000
                    PlayerControl.FamilyNotify(familyID, "Party_OverTime", [notifySecond])
                    GameWorld.GetGameFB().SetGameFBDict(ChConfig.Map_FBDict_NotifyStart, notifyIndex + 1)
    gameWorld = GameWorld.GetGameWorld()
    partyActionState = gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyParty)
    if partyActionState:
        FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 5000)
    return
def FamilyPartyAnswerRight(curPlayer):
def FamilyPartyAnswerRight(curPlayer, answerInfo):
    #回答正确,给奖励
#    mapID = GameWorld.GetMap().GetMapID()
#    if mapID != ChConfig.Def_FBMapID_FamilyParty:
#        return
#
    rightPlayerID = answerInfo[0]
    #给本题答题奖励,本地图中的家族成员才给
    answerRWItemReward = IpyGameDataPY.GetFuncEvalCfg('PartyReward2', 1)
    rightItemID, wrongItemID = answerRWItemReward
    playerManager = GameWorld.GetMapCopyPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        player = playerManager.GetPlayerByIndex(index)
        if not player:
            continue
        if player.GetFamilyID() != curPlayer.GetFamilyID():
            continue
        if player.GetPlayerID() == rightPlayerID:
            giveItemID = rightItemID
        else:
            giveItemID = wrongItemID
        itemCount, isAuctionItem = 1, False
        ItemControler.GivePlayerItem(player, giveItemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
    if curPlayer.GetPlayerID() != rightPlayerID:
        return
    addPoint, addExp = IpyGameDataPY.GetFuncEvalCfg('PartyReward', 2)
    #仙盟贡献度
    PlayerFamily.AddPlayerFamilyActiveValue(curPlayer, addPoint, True, ShareDefine.Def_AddFAVReason_FamilyParty, True)
    #答题经验更新
    PlayerControl.PlayerControl(curPlayer).AddExp(addExp)
    PlayerControl.PlayerControl(curPlayer).AddExp(addExp, ShareDefine.Def_ViewExpType_SysEx)
    PlayerControl.FamilyNotify(curPlayer.GetFamilyID(), 'Party_Answer', [curPlayer.GetName(), rightItemID])
    curAnswerCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyAnswerCnt)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyAnswerCnt, curAnswerCnt + 1)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyAnswerCnt, curAnswerCnt + 1)
    if GameWorld.GetMap().GetMapID() == ChConfig.Def_FBMapID_FamilyParty:
        DoFBHelp(curPlayer, 0)
    return
@@ -264,47 +232,23 @@
def OnFamilyPartyStateChange(state, tick):
    #活动状态变更
    GameWorld.DebugLog('    仙盟宴会活动状态变更 state=%s' % state)
#    if state == 0:
#        playerManager = GameWorld.GetPlayerManager()
#        for i in xrange(playerManager.GetPlayerCount()):
#            curPlayer = playerManager.GetPlayerByIndex(i)
#            if not curPlayer or curPlayer.IsEmpty():
#                continue
#            #答对题或者进过图的给参与奖励
#            curAnswerCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyAnswerCnt)
#            if FBCommon.GetEnterFBCount(curPlayer, ChConfig.Def_FBMapID_FamilyParty) or curAnswerCnt:
#                GiveJoinPrize(curPlayer)
    mapID = GameWorld.GetMap().GetMapID()
    if mapID != ChConfig.Def_FBMapID_FamilyParty:
        return
    if state:
        if not GameWorld.GetGameWorld().GetGameWorldDictByKey(Map_FamilyPartyFB_StartTick):
            GameWorld.GetGameWorld().SetGameWorldDict(Map_FamilyPartyFB_StartTick, tick)
    GameWorld.DebugLog('仙盟宴会活动状态变更 state=%s' % state)
    if state == 1:
        remainSeconds = PlayerActivity.GetDailyActionRemainSeconds(ShareDefine.DailyActionID_FamilyParty)
        playerManager = GameWorld.GetPlayerManager()
        for i in xrange(playerManager.GetPlayerCount()):
            curPlayer = playerManager.GetPlayerByIndex(i)
            if not curPlayer or curPlayer.IsEmpty():
                continue
            __DoEnterJoinFamilyParty(curPlayer, remainSeconds)
    else:
        GameWorld.GetGameWorld().SetGameWorldDict(Map_FamilyPartyFB_StartTick, 0)
        PyGameData.g_familyPartyInfo = []
    return
#
#def GiveJoinPrize(curPlayer):
#    #参与奖
#    joinAward = IpyGameDataPY.GetFuncCfg('PartyReward')
#    if not joinAward:
#        return
#
#    PlayerFamily.AddPlayerFamilyActiveValue(curPlayer, joinAward, True, ShareDefine.Def_AddFAVReason_FamilyParty)
#    return
##获得玩家传入副本需要携带的信息
# @param curPlayer 玩家实例
# @param lineId 分线ID
# @return 字符串
# @remarks
def GetPlayerResetWorldPosFBMsg(curPlayer, lineId):
    return '%s' % (curPlayer.GetPlayerID())
##玩家退出家族处理
@@ -313,17 +257,8 @@
# @return 返回值无意义
def OnLeaveFamily(curPlayer, tick):
    #GameWorld.DebugLog("OnLeaveFamily...")
    curPlayerID = curPlayer.GetPlayerID()
    PlayerControl.PlayerLeaveFB(curPlayer)
    return
## 是否副本复活
#  @param None
#  @return 是否副本复活
def OnPlayerReborn():
    return True
##获得副本帮助信息
@@ -332,27 +267,26 @@
# @return 无意义
# @remarks 用于通知阵营比分条
def DoFBHelp(curPlayer, tick, isSyncPlayerID=False):
    #gameFB = GameWorld.GetGameFB()
    gameWorld = GameWorld.GetGameWorld()
    chuangongActionState = gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyChuanGong)
    partyActionState = gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyParty)
    playerID = curPlayer.GetPlayerID()
    totalExp = FBCommon.GetFBAreaRewardExp(gameWorld, playerID)
    curAnswerCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyAnswerCnt)
    addPoint, addExp = IpyGameDataPY.GetFuncEvalCfg('PartyReward', 2)
    exp = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalExp % playerID)
    expPoint = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalExpPoint % playerID)
    totalExp = totalExp + expPoint * ChConfig.Def_PerPointValue + exp + addExp * curAnswerCnt
    exp = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyTotalExp)
    expPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyTotalExpPoint)
    totalExp = expPoint * ChConfig.Def_PerPointValue + exp + addExp * curAnswerCnt
    exp = totalExp % ChConfig.Def_PerPointValue
    expPoint = totalExp / ChConfig.Def_PerPointValue
    
    totalPoint = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalPoint % playerID)
    totalPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyTotalPoint)
    #totalPoint += IpyGameDataPY.GetFuncCfg('PartyReward') #加参与奖
    totalPoint += addPoint * curAnswerCnt
    hasCollect = gameWorld.GetGameWorldDictByKey(FBPlayerDict_HasCollect % playerID)
    hasSit = gameWorld.GetGameWorldDictByKey(FBPlayerDict_HasSit % playerID)
    hasCollect = int(curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyCollectState) or not partyActionState) # 非活动期间也同步已采集,前端根据此状态控制按钮显隐
    hasSit = int(curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartySitState) or not chuangongActionState) # 非活动期间也同步已传功,前端根据此状态控制按钮显隐
    
    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):
@@ -375,7 +309,11 @@
# @return 无意义
# @remarks
def OnCanCollect(curPlayer, curNPC, tick):
    hasCollect = GameWorld.GetGameWorld().GetGameWorldDictByKey(FBPlayerDict_HasCollect % curPlayer.GetID())
    partyActionState = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyParty)
    if not partyActionState:
        PlayerControl.NotifyCode(curPlayer, 'Party_NotInPartyTime')
        return
    hasCollect = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyCollectState)
    if hasCollect:
        PlayerControl.NotifyCode(curPlayer, 'Party_HadCollected')
        return
@@ -403,22 +341,38 @@
# @remarks
def OnCollectOK(curPlayer, npcID, tick):
    playerID = curPlayer.GetID()
    gameWorld = GameWorld.GetGameWorld()
    gameWorld.SetGameWorldDict(FBPlayerDict_HasCollect % playerID, 1)
    #gameWorld = GameWorld.GetGameWorld()
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyCollectState, 1)
    
    GameWorld.DebugLog('    宴会采集成功!', playerID)
    #给奖励
    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)
    
    totalPoint = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TotalPoint % playerID)
    totalPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyTotalPoint)
    updPoint = totalPoint + addPoint
    gameWorld.SetGameWorldDict(FBPlayerDict_TotalPoint % playerID, updPoint)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyTotalPoint, updPoint)
    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
    exp = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyTotalExp)
    expPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyTotalExpPoint)
    newTotalExp = expPoint * ChConfig.Def_PerPointValue + exp + addExp
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyTotalExp, newTotalExp % ChConfig.Def_PerPointValue)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyTotalExpPoint, newTotalExp / ChConfig.Def_PerPointValue)
    return
##玩家退出副本
@@ -455,7 +409,7 @@
        if curPlayer.GetPlayerAction() in [IPY_GameWorld.paSit, IPY_GameWorld.paPreparing]:
            GameWorld.DebugLog('邀请打坐,玩家已处于打坐或采集状态', playerID)
            return
        hasSit = gameWorld.GetGameWorldDictByKey(FBPlayerDict_HasSit % playerID)
        hasSit = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartySitState)
        if hasSit:
            GameWorld.Log('邀请打坐,玩家已打坐过一次', playerID)
            return
@@ -466,6 +420,7 @@
            GameWorld.DebugLog('邀请%s打坐,该玩家不在副本里' % tagPlayerID, playerID)
            PlayerControl.NotifyCode(curPlayer, 'PartySitFail')
            return
        gameWorld.SetGameWorldDict(FBPlayerDict_TagPlayerID % playerID, tagPlayerID)
        curPlayer.StopMove()
        curPlayer.Sit()
#        if not gameWorld.GetGameWorldDictByKey(FBPlayerDict_HasSit % tagPlayerID):
@@ -478,14 +433,14 @@
        DoFBHelp(curPlayer, 0)
        
    return
def __GiveSitAward(curPlayer):
    #给打坐奖励
    gameWorld = GameWorld.GetGameWorld()
    playerID = curPlayer.GetID()
    hasSit = gameWorld.GetGameWorldDictByKey(FBPlayerDict_HasSit % playerID)
    hasSit = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartySitState)
    if hasSit:
        GameWorld.Log('打坐结束给奖励,玩家已打坐过一次', playerID)
        return
@@ -503,13 +458,39 @@
    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+addExp
        gameWorld.SetGameWorldDict(FBPlayerDict_TotalExp % playerID, newTotalExp%ChConfig.Def_PerPointValue)
        gameWorld.SetGameWorldDict(FBPlayerDict_TotalExpPoint % playerID, newTotalExp/ChConfig.Def_PerPointValue)
        PlayerControl.PlayerControl(curPlayer).AddExp(giveExp, ShareDefine.Def_ViewExpType_SysEx)
        
    gameWorld.SetGameWorldDict(FBPlayerDict_HasSit % playerID, 1)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartySitState, 1)
    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_FamilyChuanGong)
    DoFBHelp(curPlayer, 0)
    #帮助传功奖励
    helpSitActivityAward = IpyGameDataPY.GetFuncEvalCfg('FamilyPartySitAward', 3)
    if helpSitActivityAward and len(helpSitActivityAward) == 2:
        helpFamilyActivity, maxHelpAwardCount = helpSitActivityAward
        helpThanks = IpyGameDataPY.GetFuncCfg('FamilyPartySitAward', 4) % (helpFamilyActivity, maxHelpAwardCount)
        sitThanks = helpThanks.decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding())
        tagPlayerID = gameWorld.GetGameWorldDictByKey(FBPlayerDict_TagPlayerID % playerID)
        PlayerTalk.TalkPrivateByID(curPlayer, tagPlayerID, sitThanks)
        tagPlayer = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(tagPlayerID)
        if tagPlayer:
            helpCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyPartyHelpSitCount) + 1
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyPartyHelpSitCount, helpCount)
            GameWorld.DebugLog("帮助传功奖励: sitPlayerID=%s,tagPlayerID=%s,helpCount=%s" % (playerID, tagPlayerID, helpCount))
            if helpCount <= maxHelpAwardCount:
                PlayerControl.GiveMoney(tagPlayer, ShareDefine.TYPE_Price_FamilyActivity, helpFamilyActivity)
    GameWorld.DebugLog('    传功结束,giveLV=%s, giveExp=%s, worldlv=%s' % (giveLV, giveExp, worldlv))
    return True
def DoAddFamilyMemberFamilyActivity(familyID, addFamilyActivity):
    playerManager = GameWorld.GetPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(index)
        if not curPlayer:
            continue
        if curPlayer.GetFamilyID() != familyID:
            continue
        PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_FamilyActivity, addFamilyActivity)
        GameWorld.DebugLog("增加本仙盟成员答题活跃令, playerID=%s,addFamilyActivity=%s" % (curPlayer.GetPlayerID(), addFamilyActivity))
    return