xdh
2019-06-10 c3bb4072a13fc6e9541c971dec3f2865184136cd
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -105,6 +105,7 @@
import PlayerNewFairyCeremony
import PlayerFeastRedPacket
import PlayerLuckyTreasure
import Item_ResetAttrPoint
import CrossRealmPlayer
import ChNetSendPack
import FamilyRobBoss
@@ -115,6 +116,9 @@
import PlayerDogz
import PlayerCoat
import PlayerQuDaoDoubleBill
import PlayerFB
import SkillShell
import PlayerYinji
import datetime
import time
@@ -225,60 +229,6 @@
    
    return
#// A2 31 前端开始自定义场景 #tagCMClientStartCustomScene
#
#struct    tagCMClientStartCustomScene
#{
#    tagHead        Head;
#    DWORD        MapID;
#    WORD        FuncLineID;
#};
def OnClientStartCustomScene(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    DoEnterCustomScene(curPlayer, clientData.MapID, clientData.FuncLineID)
    return
#// A2 33 前端退出自定义场景 #tagCMClientExitCustomScene
#
#struct    tagCMClientExitCustomScene
#{
#    tagHead        Head;
#};
def OnClientExitCustomScene(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    DoExitCustomScene(curPlayer)
    return
def DoEnterCustomScene(curPlayer, mapID, lineID):
    ## 进入自定义场景状态
    curPlayer.SetCanAttack(False)
    curPlayer.SetVisible(False)
    curPlayer.SetSight(0)
    curPet = curPlayer.GetPetMgr().GetFightPet()
    if curPet:
        curPet.SetVisible(False)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomScene, 1)
    GameWorld.Log("玩家开始自定义场景!", curPlayer.GetPlayerID())
    if mapID:
        FBLogic.OnEnterCustomScene(curPlayer, mapID, lineID)
    return
def DoExitCustomScene(curPlayer):
    ## 退出自定义场景状态
    curPlayer.SetCanAttack(True)
    curPlayer.SetVisible(True)
    curPlayer.SetSight(1)
    curPlayer.RefreshView()
    curPlayer.SetSight(ChConfig.Def_PlayerSight_Default)
    curPlayer.RefreshView()
    curPet = curPlayer.GetPetMgr().GetFightPet()
    if curPet:
        curPet.SetVisible(True)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomScene, 0)
    GameWorld.Log("玩家退出自定义场景!", curPlayer.GetPlayerID())
    return
#// A1 08 刷新主服角色信息 #tagCMRefreshMainServerRole
#
#struct tagCMRefreshMainServerRole
@@ -308,8 +258,10 @@
        CrossRealmPlayer.DoExitCrossRealm(curPlayer)
        
    if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
        DoExitCustomScene(curPlayer)
        PlayerFB.DoExitCustomScene(curPlayer)
        
    PetControl.DoLogic_PetLoadMapOK(curPlayer)
    msgInfo = ""
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetPlayerID(), 0, 0, "RefreshMainServerRole", msgInfo, len(msgInfo))
    return
@@ -489,7 +441,6 @@
        # 离线过久恢复为非跨服状态
        if PlayerControl.GetCrossMapID(curPlayer):
            PlayerControl.SetCrossMapID(curPlayer, 0)
        PyGameData.g_customFBPrizeInfo.pop(curPlayer.GetPlayerID(), None)
        
    SyncGuideState(curPlayer)
    
@@ -543,14 +494,8 @@
    #PKģʽ
    SyncPKModel(curPlayer)
        
    #通用强化星级信息
    ChEquip.NotifyEquipPartPlusLV(curPlayer)
    ChEquip.NotifyEquipPartStar(curPlayer)
    Operate_EquipWash.OnEquipWashLogin(curPlayer)
    #通知套装信息
    #ChEquip.SyncAllEquipAttrActiveInfo(curPlayer)
    #装备位宝石镶嵌通知
    Operate_EquipStone.OnLogin(curPlayer)
    #装备相关信息
    ChEquip.OnPlayerEquipLoginLogic(curPlayer)
    
    #大师
    PlayerGreatMaster.MasterOnLogin(curPlayer)
@@ -763,6 +708,9 @@
    PlayerGatherSoul.PlayerLogin(curPlayer)
    #缥缈仙域
    PlayerFairyDomain.OnLogin(curPlayer)
    PlayerFB.OnLogin(curPlayer)
    #技能专精信息
    SkillShell.NotifyElementSkillInfo(curPlayer)
    
    curPlayer.SetState(0)   # 脱机挂恢复为正常上线
    curPlayer.SetFacePic(0) # 通知数据库是否保存还是下线,做一次恢复,1为保存 0为正常下线
@@ -1085,15 +1033,16 @@
        PlayerGameEvent.TakeoffFishermanEquipment(curPlayer)
    #切地图要清除的buff
    __CheckClearBuffOnMapChange(curPlayer, tick)
    #上线和切地图加有限无敌Buff
    SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer, ChConfig.Def_SkillID_LimitSuperBuff, tick)
    if curPlayer.GetLV() > 50:
        SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer, ChConfig.Def_SkillID_LimitSuperBuff, tick)
            
    #刷新玩家的视野
    if not GameWorld.IsCrossServer() and PlayerControl.GetCrossMapID(curPlayer):
        GameWorld.DebugLog("===登录本服地图时,处于跨服状态,不刷新视野!", curPlayer.GetPlayerID())
        curPlayer.SetSight(0)
    else:
        PlayerState.ChangePlayerSigh(curPlayer, tick)
    if not GameWorld.IsCrossServer() and (PlayerControl.GetCrossMapID(curPlayer) or PlayerControl.GetCustomMapID(curPlayer)):
        GameWorld.DebugLog("===登录本服地图时,处于跨服或自定义场景状态,不刷新视野!", curPlayer.GetPlayerID())
        PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
    PlayerState.ChangePlayerSigh(curPlayer, tick)
    
    if GameWorld.IsCrossServer():
        curPlayer.SetForbiddenSyncClientState(False)
@@ -1437,6 +1386,7 @@
    #if not __CheckGMCanLoadMapOK(curPlayer):
    #    return
    
    #检测账号是否锁定
    if not __CheckForbidLogin(curPlayer):
        return
@@ -1453,12 +1403,12 @@
    firstMission = QuestCommon.GetCommonMission(curPlayer)
    if not (firstMission and firstMission.GetProperty(QuestCommon.Def_NewGuyNoSight) == 1):
        #刷新自己的视野
        if not GameWorld.IsCrossServer() and PlayerControl.GetCrossMapID(curPlayer):
            GameWorld.DebugLog("===本服LoadMapOK时玩家处于跨服状态,不设置可见!", curPlayer.GetPlayerID())
        else:
            curPlayer.RefreshView()
            curPlayer.SetVisible(True)
        if not GameWorld.IsCrossServer() and (PlayerControl.GetCrossMapID(curPlayer) or curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene)):
            GameWorld.DebugLog("===本服LoadMapOK时玩家处于跨服或自定义场景状态,不设置可见!", curPlayer.GetPlayerID())
            PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
        curPlayer.RefreshView()
        curPlayer.SetVisible(True)
    #如果玩家hp为0,设置玩家为死亡状态
    if curPlayer.GetHP() <= 0:
        curPlayer.SetPlayerAction(IPY_GameWorld.paDie)
@@ -1467,10 +1417,12 @@
    #把玩家设置为初始化成功状态
    curPlayer.SetInitOK(True)
    
    #bug:GM号反隐形在玩家切换地图之后,脚本未设置玩家属性之前,C++通知合并封包导致客户端死B
    #将反隐形开启转移到脚本
    if curPlayer.GetGMLevel():
        curPlayer.SetIsDefVisible(True)
    #===========================================================================
    # #bug:GM号反隐形在玩家切换地图之后,脚本未设置玩家属性之前,C++通知合并封包导致客户端死B
    # #将反隐形开启转移到脚本
    # if curPlayer.GetGMLevel():
    #    curPlayer.SetIsDefVisible(True)
    #===========================================================================
    
    #有限无敌Buff
    if not __CheckLimitSuperBuff(curPlayer):
@@ -1512,11 +1464,6 @@
    PlayerTeam.PlayerLoginSetTeam(curPlayer, tick)
    
    #要求数据库得到邮件状态
    #curPlayer.DataServer_GetPlayerMailState()
    #curPlayer.EndLoadMap()
    #激活玩家(保证持续性Buff处理间隔)
    PlayerControl.SetIsNeedProcess(curPlayer, True)
@@ -1569,7 +1516,7 @@
            GameWorld.Log('玩家登录重置位置失败, 设置附近点 nearPosX = %s nearPosY = %s' % (nearPosX, nearPosY) , curPlayer.GetPlayerID())
    #申请得到奖励物品
    curPlayer.DataServer_CheckPrizeItem()
    #curPlayer.DataServer_CheckPrizeItem()
    
    #===========================================================================
    # #if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_Frist_Lock) == 1 \
@@ -1606,12 +1553,11 @@
        GameWorld.DebugLog("进入地图强制切换PK模式: %s" % initAttackModel)
    
    PassiveBuffEffMng.OnLoadMapGFPassive(curPlayer)
    PlayerYinji.OnLoadMap(curPlayer)
    ItemControler.PlayerItemControler(curPlayer).RefreshStartEquipCount()   # 刷新装备珍品星级
    
    #EndLoadMap需放在最后
    curPlayer.EndLoadMap()
    # 渠道返利
    #PlayerQuDaoDoubleBill.OnMapQDDoubleBill(curPlayer)
    return True
## 切换地图同步一次PK模式
@@ -1770,6 +1716,64 @@
    NotifyPlayerBasePoint(curPlayer, pointAttrIDList)
    playerControl = PlayerControl.PlayerControl(curPlayer)
    playerControl.RefreshPlayerAttrState()
    EventShell.EventRespons_AddPoint(curPlayer)
    return
#// B2 07 重置加点 #tagCMResetAttrPoint
#struct    tagCMResetAttrPoint
#{
#    tagHead         Head;
#};
def OnResetAttrPoint(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    canResetIDList = [ipyDataMgr.GetRolePointByIndex(index).GetAttrID() for index in xrange(ipyDataMgr.GetRolePointCount())]
    canReset = False
    for attrID in canResetIDList:
        curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AddPointValue % attrID)
        if curPoint:
            canReset = True
            break
    if not canReset:
        GameWorld.DebugLog('重置加点 没有点数需要重置')
        return
    isFree = curPlayer.GetLV() < IpyGameDataPY.GetFuncCfg('LVUPAddPoint', 4)
    if not isFree:
        #优先使用剩余时间最短的时效物品
        needItemIDList = IpyGameDataPY.GetFuncEvalCfg('LVUPAddPoint', 5)
        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
        delIndex = -1
        expireTime = 0
        for itemID in needItemIDList:
            hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(itemID, itemPack, 1)
            if not hasEnough:
                #GameWorld.DebugLog("重置加点 item(%s) isn't enough" % (needItemID))
                continue
            for itemIndex in itemIndexList:
                curItem = itemPack.GetAt(itemIndex)
                if not ItemCommon.CheckItemCanUse(curItem):
                    continue
                isExpireItem, remainingTime = ItemCommon.GetItemRemainingTime(curItem)
                if isExpireItem:
                    if remainingTime <= 0:
                        #过期
                        continue
                    if remainingTime < expireTime:
                        expireTime = remainingTime
                        delIndex = itemIndex
                else:
                    delIndex = itemIndex
                    break
            if delIndex != -1:
                break
        if delIndex is -1:
            return
        ItemCommon.ReduceItem(curPlayer, itemPack, [delIndex], 1, False, ChConfig.ItemDel_ResetAttrPoint)
    Item_ResetAttrPoint.DoResetAttrPoint(curPlayer, 0, 0, 0)
    EventShell.EventRespons_LingGenReset(curPlayer)
    return
def NotifyPlayerBasePoint(curPlayer, syncAttrIDList=[]):
@@ -2475,7 +2479,7 @@
        GameWorld.DebugLog("当前无跨服地图!")
        return
    
    if not __CheckCanReborn(curPlayer, rebornType):
    if not __CheckCanReborn(curPlayer, rebornType, checkHPState=False):
        return
    
    msgDict = {"PlayerID":curPlayer.GetPlayerID(), "RebornType":rebornType}
@@ -4110,10 +4114,17 @@
#---------------------------------------------------------------------
def __CheckCanReborn(curPlayer, rebornType, gameMap=None):
def __CheckCanReborn(curPlayer, rebornType, gameMap=None, checkHPState=True):
    ''' 检查可否复活,为了逻辑统一,这里不适用玩家所在的地图,支持跨服状态下判断跨服地图
                本函数不验证玩家死亡状态等,因为有可能前后端复活状态不一致,如果这里拦住可能导致前端躺尸复活不了
    '''
    if checkHPState and curPlayer.GetHP() > 0 and curPlayer.GetPlayerAction() != IPY_GameWorld.paDie:
        # 当血量大于0收到复活请求时,一般是前后端复活状态不一致的情况下导致的
        # 由于前端需要根据复活状态判断复活界面相关逻辑,所以这里需要做一些特殊处理,防止某些情况下前后端复活状态不一致导致的一些异常问题
        # 后端非死亡状态的情况,补同步一次复活包给前端
        SyncPlayerReborn(curPlayer, rebornType)
        return
    
    if rebornType not in ChConfig.Def_RebornTypeList:
        return
@@ -4172,13 +4183,6 @@
def __DoPlayerReborn(curPlayer, rebornType, tick, mapBornPlace=0, isAddSuperBuff=True):
    ## 执行玩家复活逻辑,该函数没有执行验证是否可复活等,不可直接调用
    if curPlayer.GetHP() > 0 and curPlayer.GetPlayerAction() != IPY_GameWorld.paDie:
        # 当血量大于0收到复活请求时,一般是前后端复活状态不一致的情况下导致的
        # 由于前端需要根据复活状态判断复活界面相关逻辑,所以这里需要做一些特殊处理,防止某些情况下前后端复活状态不一致导致的一些异常问题
        # 后端非死亡状态的情况,补同步一次复活包给前端
        SyncPlayerReborn(curPlayer, rebornType)
        return
    
    resetHpPercent = ChConfig.Def_MaxRateValue
    isFBReborn = False
@@ -5840,3 +5844,24 @@
    sendPack.NPCID = npcID
    NetPackCommon.SendFakePack(curPlayer, sendPack)
    return
#// B4 0E 玩家掉血 #tagCMRoleLostHP
#
#struct    tagCMRoleLostHP
#{
#    tagHead        Head;
#    DWORD        LostHP;
#};
def OnRoleLostHP(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    lostHP = clientData.LostHP
    curHP = curPlayer.GetHP()
    updHP = curHP - lostHP
    if updHP <= 0:
        #玩家已经死亡
        playerControl = PlayerControl.PlayerControl(curPlayer)
        playerControl.SetDead()
    else:
        curPlayer.SetHP(updHP)
    return