hxp
2025-08-28 8ad500e682b83c0b78c3f527c66fad529c0db5fd
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -19,7 +19,6 @@
import ChConfig
import BuffSkill
import PlayerEventCounter
import PlayerTeam
import PlayerHorse
import NPCCommon
import SkillCommon
@@ -34,11 +33,8 @@
import PetControl
import OperControlManager
import ShareDefine
import PlayerAutoCheckOnline
import PlayerGameWallow
import NetPackCommon
import ChPyNetSendPack
import Operate_PlayerBuyZhenQi
import DataRecordPack
import PlayerBillboard
import UpdatePlayerName
@@ -51,33 +47,18 @@
import PlayerFamily
import PlayerLoginDayAward
import PlayerGodWeapon
import PlayerWorldAverageLv
import PlayerGoldInvest
import PlayerActivity
import FBCommon
import PlayerBindJadeWheel
import BossHurtMng
import PlayerWishingWell
import PlayerAttrFruit
import PlayerSuccess
import PlayerDienstgrad
import PlayerFreeGoods
import PlayerRecover
import GameLogic_IceLode
import GameLogic_SkyTower
import PlayerEquipDecompose
import PlayerGreatMaster
import PlayerGatherSoul
import PlayerGatherTheSoul
import PlayerFairyDomain
import PlayerCrossRealmPK
import PlayerCrossChampionship
import PlayerCrossBattlefield
import GameFuncComm
import PlayerMagicWeapon
import GameLogic_FamilyBoss
import GameLogic_TrialTower
import GameLogic_FamilyWar
import PlayerBossReborn
import PlayerWeekParty
import PlayerFeastWeekParty
@@ -86,17 +67,12 @@
import PlayerFeastWish
import PlayerActLogin
import PlayerTreasure
import GameLogic_GodArea
import PlayerRune
import PlayerFamilyRedPacket
import IpyGameDataPY
import EventReport
import OpenServerCampaign
import PlayerVip
import PlayerRefineStove
import PassiveBuffEffMng
import PlayerDiceEx
import GameLogic_XMZZ
import PlayerFlashSale
import PlayerFlashGiftbag
import PlayerDailyGiftbag
@@ -119,8 +95,6 @@
import PlayerActHorsePetFeast
import PlayerActBossTrial
import PlayerSpringSale
import PlayerFairyCeremony
import PlayerNewFairyCeremony
import GY_Query_BossFirstKill
import PlayerCrossYaomoBoss
import PlayerFeastRedPacket
@@ -134,9 +108,6 @@
import PlayerTongTianLing
import CrossRealmPlayer
import ChNetSendPack
import FamilyRobBoss
import FBHelpBattle
import PlayerAssist
import PlayerArena
import PyGameData
import PlayerCoin
@@ -174,7 +145,11 @@
import IPY_ServerDefine
import CommFunc
from PyMongoDB import RecvPackToMapDB
import PyMongoMain
import PlayerTalk
import PlayerHero
import PlayerOnline
import TurnAttack
import datetime
import time
@@ -198,6 +173,7 @@
#@return 返回值无意义
#@remarks 玩家登陆游戏初始化
def InitLoginPlayer(curPlayer, tick):
    PlayerOnline.OnPlayerLogin(curPlayer)
    #初始化玩家的时钟个数
    if curPlayer.GetTickTypeCount() == 0:
        curPlayer.SetTickTypeCount(ChConfig.TYPE_Player_Tick_Count)
@@ -481,11 +457,9 @@
    curPlayer.SetLoginTime(GameWorld.GetCurrentDataTimeStr())
    #初始化玩家背包
    InitPlayerPack(curPlayer)
    #通知玩家物品信息
    __Sync_PackDetel(curPlayer)
    
    if GameWorld.IsCrossServer():
        SkillCommon.PlayerLoginMergeServerSkillLogic(curPlayer, tick)
        #SkillCommon.PlayerLoginMergeServerSkillLogic(curPlayer, tick)
        # 重置所有技能CD
        
        DoPlayerLoginInMap(curPlayer, tick)
@@ -493,9 +467,7 @@
        DataRecordPack.DR_PlayerLogin(curPlayer)
        EventReport.WriteEvent_login(curPlayer)
        #---玩家上线, 宠物逻辑处理---
        PetControl.DoLogic_PetInfo_OnLogin(curPlayer, tick)
        PlayerTeam.OnPlayerLoginCrossServer(curPlayer)
        #PetControl.DoLogic_PetInfo_OnLogin(curPlayer, tick)
        return
    
    leaveServerSecond = PlayerControl.GetPlayerLeaveServerSecond(curPlayer)
@@ -508,7 +480,10 @@
        # 离线过久恢复为非跨服状态
        if PlayerControl.GetCrossMapID(curPlayer):
            PlayerControl.SetCrossMapID(curPlayer, 0)
    __FirstLoginOnEnter(curPlayer)
    TurnAttack.OnPlayerLogin(curPlayer)
    SyncGuideState(curPlayer)
    
    #上线检查一次装备属性
@@ -517,23 +492,18 @@
    PlayerControl.UpdPlayerServerGroupID(curPlayer)
    
    #上线学习技能
    SkillCommon.PlayerLoginCheckLearnSkill(curPlayer)
    #SkillCommon.PlayerLoginCheckLearnSkill(curPlayer)
    
    #刷新技能CD
    SkillCommon.PlayerLoginUpdateSkillCD(curPlayer, tick)
    #SkillCommon.PlayerLoginUpdateSkillCD(curPlayer, tick)
    
    #通知玩家技能信息
    __Sync_ClientSkill(curPlayer)
    #清除国家答题Buff
    #PlayerExam.DoLogic_ExitExam(curPlayer, tick, needRefresh = False)
    #__Sync_ClientSkill(curPlayer)
    #清除VIPbuff
    #BuffSkill.DelBuffBySkillID(curPlayer, ChConfig.Def_VIPExp_SkillTypeID, tick)
    
    #通知玩家的buff
    __Sync_ClientBuff(curPlayer)
    #初始化现实时间物品
    InitRealityTimeItem(curPlayer, tick)
    #__Sync_ClientBuff(curPlayer)
    
    #---刷新了玩家属性, 登陆只刷新一次,其他地方不用刷
    DoPlayerLoginInMap(curPlayer, tick)
@@ -546,14 +516,9 @@
    #DataRecordPack.DR_PlayerLogin(curPlayer)
    EventReport.WriteEvent_login(curPlayer)
    
    __FirstLoginOnEnter(curPlayer)
    # 合服首登处理
    __DoMixServerFirstLogin(curPlayer)
    PlayerBillboard.BillboardOnLogin(curPlayer)
    #上线时通知脱机挂时被击杀的离线时间
    __Sync_PlayerOffline(curPlayer, tick)
    
    #玩家扩展信息
    __SyncPlayerInfoEx(curPlayer)
@@ -562,31 +527,11 @@
    GiveDownloadPatchAward(curPlayer)
    
    #PKģʽ
    SyncPKModel(curPlayer)
    #装备相关信息
    ChEquip.OnPlayerEquipLoginLogic(curPlayer)
    #大师
    PlayerGreatMaster.MasterOnLogin(curPlayer)
    #֪ͨVIP
    PlayerVip.DoOnLogin(curPlayer, tick)
    #通知法宝精炼等级
    PlayerRefineStove.DoOnLogin(curPlayer, tick)
    #SyncPKModel(curPlayer)
    
    #---玩家上线, 宠物逻辑处理---
    PetControl.DoLogic_PetInfo_OnLogin(curPlayer, tick)
    PlayerPet.OnPlayerPetLogin(curPlayer)
    #清空玩家万能背包中的任务物品
    ItemControler.ClearPackEventItem(curPlayer, IPY_GameWorld.rptAnyWhere)
    #PlayerLoginNotify(curPlayer, tick)
    #防沉迷计算下线累积时间
    PlayerGameWallow.Calc_Wallow_OfflineTime(curPlayer, tick)
    #PetControl.DoLogic_PetInfo_OnLogin(curPlayer, tick)
    #PlayerPet.OnPlayerPetLogin(curPlayer)
    
    # 通知等级奖励领取记录
    PlayerLVAward.Sync_LVAwardGetRecordInfo(curPlayer)
@@ -595,27 +540,17 @@
    # 首充/天天首充/充值豪礼
    PlayerGoldGift.OnLogin(curPlayer)
    
    #通知购买功能中各购买类型的已购买和可购买次数
    Operate_PlayerBuyZhenQi.DoPlayerLogin(curPlayer)
#
#    #通知功能首次触发情况
    #通知功能首次触发情况
    GameFuncComm.Sync_FuncOpenState(curPlayer)
#
#    #通知客户端签到信息
    #通知客户端签到信息
    PlayerSignDay.SignDayOnLogin(curPlayer)
    
    #通知玩家死亡时间
    PlayerControl.PlayerControl(curPlayer).NotifyPlayerDeadTime(curPlayer)
    #ClearPlayerDeadInfo(curPlayer)
    #充值活动玩家登入处理
    #PlayerGoldAction.DoLogic_PlayerOnLogin(curPlayer)
    # 提示贵宾俱乐部信息
    #PlayerVip.NoteVIPClubInfo(curPlayer)
    #PlayerControl.PlayerControl(curPlayer).NotifyPlayerDeadTime(curPlayer)
    
    #角色改名次数
    UpdatePlayerName.Sync_UpdatePlayerNameCount(curPlayer)
    #UpdatePlayerName.Sync_UpdatePlayerNameCount(curPlayer)
    
    # 坐骑相关通知
    PlayerHorse.PlayerHorseLogin(curPlayer)
@@ -633,13 +568,9 @@
    
    # 开服活动奖励信息
    OpenServerCampaign.OnOpenServerCampaignLogin(curPlayer)
    # 试炼之塔
    GameLogic_TrialTower.OnFBPlayerLogin(curPlayer)
    # 古神禁地
    GameLogic_GodArea.GodAreaOnLogin(curPlayer)
    # 采集NPC次数通知
    NPCCommon.SyncCollNPCTime(curPlayer)
    #NPCCommon.SyncCollNPCTime(curPlayer)
    
    # 每日活跃度
    PlayerActivity.OnLogin(curPlayer)
@@ -647,14 +578,8 @@
    # 副本进入时间
    FBCommon.FBOnLogin(curPlayer)
    
    #世界等级
    PlayerWorldAverageLv.OnLogin(curPlayer)
    # 投资理财
    PlayerGoldInvest.OnLogin(curPlayer)
    #属性果实使用情况
    PlayerAttrFruit.AttrFruitOnLogin(curPlayer)
    
    #成就
    PlayerSuccess.SuccOnLogin(curPlayer)
@@ -682,7 +607,6 @@
    # 跨服PK
    PlayerCrossRealmPK.DoPlayerLogin(curPlayer)
    PlayerCrossChampionship.DoPlayerLogin(curPlayer)
    PlayerCrossBattlefield.DoPlayerLogin(curPlayer)
    
    # 幸运云购
    PlayerLuckyCloudBuy.OnPlayerLogin(curPlayer)
@@ -694,7 +618,7 @@
    PlayerControl.NotifyPlayerAllCurrency(curPlayer)
    PlayerControl.NotifyUseMoneyTotal(curPlayer)
    #通知基础属性
    NotifyPlayerBasePoint(curPlayer)
    #NotifyPlayerBasePoint(curPlayer)
    
    #跨服充值排行
    CrossActCTGBillboard.OnPlayerLogin(curPlayer)
@@ -724,31 +648,19 @@
    PlayerActFamilyCTGAssist.OnPlayerLogin(curPlayer)
    #集字活动
    PlayerActCollectWords.OnPlayerLogin(curPlayer)
    # 世界boss
    BossHurtMng.OnLogin(curPlayer)
    ChItem.Sync_ItemDayUseCnt(curPlayer)
    # 符印登录通知
    PlayerRune.PlayerRuneLogin(curPlayer)
    # 仙盟红包登录通知
    PlayerFamilyRedPacket.OnPlayerLogin(curPlayer)
    PlayerFeastRedPacket.DoPlayerOnLogin(curPlayer)
    # 法宝登录通知
    PlayerMagicWeapon.PlayerMagicWeaponLogin(curPlayer)
    # 商店物品购买次数登录通知
    FunctionNPCCommon.ShopItemOnLogin(curPlayer)
    # 通知设置的被动功法
    #PassiveBuffEffMng.OnLoginGFPassive(curPlayer)
    #我要太极
    PlayerDiceEx.DiceExOnLogin(curPlayer)
    #仙魔之争
    GameLogic_XMZZ.OnXMZZLogin(curPlayer)
    PlayerOnlinePrize.OnPlayerLogin(curPlayer)
    #装备分解
    PlayerEquipDecompose.PlayerLogin(curPlayer)
    #防沉迷
    PlayerGameWallow.DoLogic_CheckWallow(curPlayer, tick)
    # 协助
    PlayerAssist.OnPlayerLogin(curPlayer)
    #PlayerEquipDecompose.PlayerLogin(curPlayer)
    # 极品白拿
    PlayerFreeGoods.OnLogin(curPlayer)
    # BOSS复活活动
@@ -797,36 +709,21 @@
    PlayerActSingleRecharge.OnPlayerLogin(curPlayer)
    # 转盘活动
    PlayerActTurntable.OnPlayerLogin(curPlayer)
    # 仙界盛典活动
    PlayerFairyCeremony.OnLogin(curPlayer)
    # 新仙界盛典活动
    PlayerNewFairyCeremony.OnLogin(curPlayer)
    # 分支下载奖励记录通知
    SyncPackDownloadAward(curPlayer)
    # 登录触发功能开启(老号处理)
    GameFuncComm.DoFuncOpenLogic(curPlayer)
    # 神兽
    PlayerDogz.OnPlayerLogin(curPlayer)
    # 骑宠
    FamilyRobBoss.OnPlayerLogin(curPlayer)
    # 绑玉转盘
    PlayerBindJadeWheel.OnLogin(curPlayer)
    # 许愿池
    PlayerWishingWell.OnLogin(curPlayer)
    #幸运鉴宝
    PlayerLuckyTreasure.OnLogin(curPlayer)
    # 小助手
    SyncLittleHelper(curPlayer)
    # 副本助战
    FBHelpBattle.DoPlayerLogin(curPlayer)
    # 聚魂
    PlayerGatherSoul.PlayerLogin(curPlayer)
    PlayerGatherTheSoul.OnPlayerLogin(curPlayer)
    #缥缈仙域
    PlayerFairyDomain.OnLogin(curPlayer)
    PlayerFB.OnLogin(curPlayer)
    #技能专精信息
    SkillShell.NotifyElementSkillInfo(curPlayer)
    #SkillShell.NotifyElementSkillInfo(curPlayer)
    #Boss首杀
    GY_Query_BossFirstKill.OnPlayerLogin(curPlayer)
    #通天令
@@ -880,6 +777,8 @@
        pass
    
    else:
        PyMongoMain.GetUserCtrlDB().OnPlayerLogin(curPlayer)
        PlayerHero.OnPlayerLogin(curPlayer)
        PlayerMail.OnPlayerLogin(curPlayer)
        PlayerChatBox.OnPlayerLogin(curPlayer)
        PlayerFace.OnPlayerLogin(curPlayer)
@@ -930,19 +829,19 @@
    
    #---补满血满魔---
    GameObj.SetHP(curPlayer, GameObj.GetMaxHP(curPlayer))
    curPlayer.SetMP(curPlayer.GetMaxMP())
    #curPlayer.SetMP(curPlayer.GetMaxMP())
    
    #默认触发一次功能开启
    if curPlayer.GetLV() == 1:
        GameFuncComm.DoFuncOpenLogic(curPlayer)
        
    #初始化组队状态
    autoJoinReqCheck = IpyGameDataPY.GetFuncCfg("TeamCheckSet", 1)
    autoInviteCheck = IpyGameDataPY.GetFuncCfg("TeamCheckSet", 2)
    PlayerControl.SetTeamCheckStateEx(curPlayer, int(not autoJoinReqCheck), int(not autoInviteCheck))
    #autoJoinReqCheck = IpyGameDataPY.GetFuncCfg("TeamCheckSet", 1)
    #autoInviteCheck = IpyGameDataPY.GetFuncCfg("TeamCheckSet", 2)
    #PlayerControl.SetTeamCheckStateEx(curPlayer, int(not autoJoinReqCheck), int(not autoInviteCheck))
    
    #玩家默认恶名值
    curPlayer.SetInfamyValue(ChConfig.Def_FirstLogin_InfamyValue)
    #curPlayer.SetInfamyValue(ChConfig.Def_FirstLogin_InfamyValue)
    
    #curPlayer.SetDict("ThunderLogin", 1)
    #记录第一次登陆
@@ -953,6 +852,8 @@
    for mailTypeKey, mailItemList in mailList:
        PlayerControl.SendMailByKey(mailTypeKey, [curPlayer.GetPlayerID()], mailItemList)
        
    PlayerHero.OnPlayerFirstLogin(curPlayer)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FirstLogin, 1)
    return
@@ -1017,9 +918,6 @@
    # 同步排行榜
    PlayerBillboard.UpdatePlayerBillboardOnLeaveServer(curPlayer, isAll=True)
    
    # 天星塔全服过关记录
    GameLogic_SkyTower.OnMixFirstLogin(curPlayer)
    # bossƾ֤
    PlayerActBossTrial.OnMixFirstLogin(curPlayer)
    # 仙匣秘境
@@ -1042,51 +940,6 @@
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_DeadTime, 0)
    return
##玩家登陆, 相关活动通知
#@param curPlayer 玩家实例
#@param tick 时间戳
#@return 返回值无意义
#@remarks 玩家登陆, 相关活动通知
def PlayerLoginNotify(curPlayer, tick):
    curTime = GameWorld.GetCurrentTime()
    #读取上线提示表
    notifyByTimeSect = ReadChConfig.GetEvalChConfig('PlayerLoginNotify_TimeSect')     #某时间段内上线提示
    notifyByDict = ReadChConfig.GetEvalChConfig('PlayerLoginNotify_Dict')             #根据字典值给提示
    #在规定时间段内上线给提示
    DoNotifyByTimeSect(curPlayer, curTime, notifyByTimeSect)
    #指定字典值内提示
    DoNotifyByDict(curPlayer, notifyByDict)
    return
#---------------------------------------------------------------------
##在活动规定时间段内上线给提示
#@param curPlayer 玩家索引
#@param curTime 传入时间
#@param notifyInfo 提示信息
#@return 返回值无意义
#@remarks 在活动规定时间段内上线给提示
def DoNotifyByTimeSect(curPlayer, curTime, notifyInfo):
    for curNotify in notifyInfo:
        #有时间段限制,验证时间段
        if not GameWorld.IsAtActTime(curTime, curNotify[0]):
            continue
        PlayerControl.NotifyCode(curPlayer, curNotify[1], curNotify[2])
#---------------------------------------------------------------------
##指定字典值内提示
#@param curPlayer 玩家实例
#@param notifyInfo 提示信息
#@return 返回值无意义
#@remarks 指定字典值内提示
def DoNotifyByDict(curPlayer, notifyInfo):
    gameWorld = GameWorld.GetGameWorld()
    for curNotify in notifyInfo:
        if gameWorld.GetGameWorldDictByKey(curNotify[0]) in curNotify[1]:
            PlayerControl.NotifyCode(curPlayer, curNotify[2], curNotify[3])
#---------------------------------------------------------------------
##通知背包详细信息
#@param curPlayer 玩家实例
@@ -1099,18 +952,6 @@
        rolePack = itemManager.GetPack(packIndex)
        rolePack.Sync_Refresh()
        
        # 刷下装备评分,仓库可以暂不处理,取出装备后登录触发刷新
        for i in xrange(rolePack.GetCount()):
            curItem = rolePack.GetAt(i)
            if curItem.IsEmpty():
                continue
            newScore = ItemCommon.CalcEquipGS(curItem)
            hisScore = ItemCommon.GetEquipGearScore(curItem)
            if hisScore != newScore:
                ItemCommon.SetEquipGearScore(curItem, newScore)
                GameWorld.Log("登录更新装备评分: packType=%s,i=%s,hisScore=%s,newScore=%s,itemID=%s,guid=%s"
                              % (packIndex, i, hisScore, newScore, curItem.GetItemTypeID(), curItem.GetGUID()), curPlayer.GetPlayerID())
    for packIndex in ChConfig.Def_VPackCnt_Dict.keys():
        ItemControler.Sync_VPackItem_Refresh(curPlayer, packIndex)
        
@@ -1141,16 +982,6 @@
#    #itemManager.GetPack(IPY_GameWorld.rptBreakPrepare).Sync_Refresh()
#    #itemManager.GetPack(IPY_GameWorld.rptBreakItem).Sync_Refresh()
#===============================================================================
    return
#---------------------------------------------------------------------
##初始化现实时间物品
#@param curPlayer 玩家实例
#@param tick 时间戳
#@return 返回值无意义
#@remarks 初始化现实时间物品
def InitRealityTimeItem(curPlayer, tick):
    PlayerState.ProcessTimeEquip(curPlayer, tick)
    return
#---------------------------------------------------------------------
@@ -1202,54 +1033,6 @@
    return
#---------------------------------------------------------------------
##上线时通知离线时间(离线挂机功能)
# @param curPlayer 玩家实例
# @param tick 时间戳
# @return 返回值无意义
# @remarks 上线时通知离线时间(离线挂机功能)
def __Sync_PlayerOffline(curPlayer, tick):
    #---等级限制---
    if GameWorld.IsCrossServer():
        return
#===============================================================================
#    #---等级限制---
#    lvLimit = ReadChConfig.GetEvalChConfig('OfflineSys_LVLimit')
#    if curPlayer.GetLV() < lvLimit:
#        return
#
#    if GameWorld.IsCrossServer():
#        return
#
#    #当前离线时间(分)
#    curOfflineMinutes = min(PlayerControl.GetPlayerLeaveServerMinute(curPlayer),
#                            ChConfig.Def_UpperLimit_DWord)
#
#    #防止服务器时间修改到过去得到负值
#    if curOfflineMinutes < 0:
#        GameWorld.ErrLog("Login Time Error, outTime: %s - loginTime :%s" %
#                         (curPlayer.GetLogoffTime(), GameWorld.GetCurrentDataTimeStr()),
#                         curPlayer.GetPlayerID())
#        curOfflineMinutes = 0
#
#    #时间为分钟
#    minTimeLimit, maxTimeLimit = ReadChConfig.GetEvalChConfig("OfflineSys_AllTimeUpperLimit")
#    if curOfflineMinutes >= minTimeLimit:
#        #总离线时间(分)
#        allOfflineMinutes = min(curPlayer.GetOfflineMinutes() + curOfflineMinutes, maxTimeLimit)
#        #记录离线总时间
#        curPlayer.SetOfflineMinutes(int(allOfflineMinutes))
#        GameWorld.DebugLog("设置离线奖励时间 %s,curOfflineMinutes=%s" % (allOfflineMinutes, curOfflineMinutes), curPlayer.GetPlayerID())
#    else:
#        GameWorld.DebugLog("离线时间过短,不计入离线奖励!curOfflineMinutes=%s" % curOfflineMinutes, curPlayer.GetPlayerID())
#
#    #通知客户端离线时间
# #    curPlayer.Syn_OfflineTimeRefresh(int(curOfflineMinutes))
#    curPlayer.Syn_OfflineTimeQueryResult()
#===============================================================================
    return
#---------------------------------------------------------------------
##玩家在地图服务器中登录ok,初始化自己
#@param curPlayer 玩家实例
#@param tick 时间戳
@@ -1272,25 +1055,29 @@
    if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
        #副本地图上线切换才加无敌buff
        SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer, ChConfig.Def_SkillID_LimitSuperBuff, tick)
    #刷新玩家的视野
    if not GameWorld.IsCrossServer() and (PlayerControl.GetCrossMapID(curPlayer) or PlayerControl.GetCustomMapID(curPlayer)):
        GameWorld.DebugLog("===登录本服地图时,处于跨服或自定义场景状态,不刷新视野!", curPlayer.GetPlayerID())
    #卡牌改为0视野
    if curPlayer.GetSightLevel() != curPlayer.GetID():
        PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
    elif not GameWorld.IsCrossServer():
        realmDifficulty = PlayerControl.GetMapRealmDifficulty(curPlayer)
        if realmDifficulty:
            GameWorld.DebugLog("===登录本服地图时,处于境界难度地图,自动设置难度! realmDifficulty=%s" % realmDifficulty, curPlayer.GetPlayerID())
            PlayerControl.SetRealmDifficulty(curPlayer, realmDifficulty)
    if curPlayer.GetSight() != 0:
        PlayerControl.SetSight(curPlayer, 0)
    #刷新玩家的视野
    #if not GameWorld.IsCrossServer() and (PlayerControl.GetCrossMapID(curPlayer) or PlayerControl.GetCustomMapID(curPlayer)):
    #    GameWorld.DebugLog("===登录本服地图时,处于跨服或自定义场景状态,不刷新视野!", curPlayer.GetPlayerID())
    #    PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
    #elif not GameWorld.IsCrossServer():
    #    realmDifficulty = PlayerControl.GetMapRealmDifficulty(curPlayer)
    #    if realmDifficulty:
    #        GameWorld.DebugLog("===登录本服地图时,处于境界难度地图,自动设置难度! realmDifficulty=%s" % realmDifficulty, curPlayer.GetPlayerID())
    #        PlayerControl.SetRealmDifficulty(curPlayer, realmDifficulty)
    PlayerState.ChangePlayerSigh(curPlayer, tick)
    
    if GameWorld.IsCrossServer():
        curPlayer.SetForbiddenSyncClientState(False)
        
    playerControl = PlayerControl.PlayerControl(curPlayer)
    #刷新所有状态
    playerControl.ReCalcAllState()
    olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
    olPlayer.ReCalcAllAttr()
    
    if GameWorld.IsCrossServer():
        curPlayer.SetForbiddenSyncClientState(True)
@@ -1476,54 +1263,63 @@
#@return 返回值无意义
#@remarks 初始化玩家背包
def InitPlayerPack(curPlayer) :
    itemManager = curPlayer.GetItemManager()
    #设置装备实际个数,默认最大个数
    PlayerControl.Init_PackCount(curPlayer, IPY_GameWorld.rptEquip, defaultMax=True, isSync=False)
    
    #初始化玩家背包
    PlayerControl.Init_ItemPack(curPlayer)
    PlayerControl.Init_PackCount(curPlayer, IPY_GameWorld.rptItem)
    
    #初始化玩家仓库
    PlayerControl.Init_Warehouse(curPlayer)
    #PlayerControl.Init_Warehouse(curPlayer)
    #初始化鉴定背包,默认最大个数用于存放主线掉落
    PlayerControl.Init_PackCount(curPlayer, IPY_GameWorld.rptIdentify, defaultMax=True)
    #初始化英雄背包
    PlayerControl.Init_PackCount(curPlayer, ShareDefine.rptHero)
    #初始化临时交换背包,默认最大个数
    PlayerControl.Init_PackCount(curPlayer, ShareDefine.rptTempSwap, defaultMax=True, isSync=False)
    #初始化临时存放背包,默认最大个数
    PlayerControl.Init_PackCount(curPlayer, ShareDefine.rptTempItem, defaultMax=True, isSync=False)
    
    #初始化寻宝背包
    PlayerControl.Init_TreasurePack(curPlayer)
    PlayerControl.Init_PackCount(curPlayer, ShareDefine.rptTreasure)
    
    #初始化神兽物品背包
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzItem)
    curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptDogzItem))
    curPack.Sync_PackCanUseCount()
    #curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzItem)
    #curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptDogzItem))
    #curPack.Sync_PackCanUseCount()
    #初始化神兽装备背包
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
    curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptDogzEquip))
    curPack.Sync_PackCanUseCount()
    #curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
    #curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptDogzEquip))
    #curPack.Sync_PackCanUseCount()
    #初始化垃圾分类背包
    curPack = itemManager.GetPack(ShareDefine.rptGarbage)
    curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptGarbage))
    curPack.Sync_PackCanUseCount()
    #初始化临时交换背包
    curPack = itemManager.GetPack(ShareDefine.rptTempSwap)
    curPack.SetCount(ChConfig.Def_PackCnt_TempSwap)
    #初始化临时存放背包
    curPack = itemManager.GetPack(ShareDefine.rptTempItem)
    curPack.SetCount(ChConfig.Def_PackCnt_TempItem)
    #设置装备实际个数
    curPack = itemManager.GetPack(IPY_GameWorld.rptEquip)
    curPack.SetCount(ItemCommon.GetPackInitCount(IPY_GameWorld.rptEquip))
    #curPack = itemManager.GetPack(ShareDefine.rptGarbage)
    #curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptGarbage))
    #curPack.Sync_PackCanUseCount()
    
    #初始化垃圾桶
    #curPack = itemManager.GetPack(IPY_GameWorld.rptRecycle)
    #curPack.SetCount(ChConfig.Def_PackCnt_Recycle)
        
    #初始化万能背包
    curPack = itemManager.GetPack(IPY_GameWorld.rptAnyWhere)
    curPack.SetCount(IPY_GameWorld.Def_AnyWherePackCount)
    #curPack = itemManager.GetPack(IPY_GameWorld.rptAnyWhere)
    #curPack.SetCount(IPY_GameWorld.Def_AnyWherePackCount)
    #初始化宠物背包
    curPack = itemManager.GetPack(ShareDefine.rptPet)
    curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptPet))
    #curPack = itemManager.GetPack(ShareDefine.rptPet)
    #curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptPet))
    #curPack.Sync_PackCanUseCount()
    ItemCommon.SyncPackBuyCnt(curPlayer)
    #通知玩家物品信息
    __Sync_PackDetel(curPlayer)
    ItemControler.CheckGiveBindMoneyTypeItem(curPlayer)
    return
#---------------------------------------------------------------------
@@ -1612,16 +1408,21 @@
    #将玩家放置在这个地图上
    curPlayer.InitPos(curPlayer.GetPosX(), curPlayer.GetPosY())
    
    #刷新自己的视野
    if not GameWorld.IsCrossServer() and (PlayerControl.GetCrossMapID(curPlayer) or curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene)):
        GameWorld.DebugLog("===本服LoadMapOK时玩家处于跨服或自定义场景状态,不设置可见!", curPlayer.GetPlayerID())
    #卡牌改为0视野
    if curPlayer.GetSightLevel() != curPlayer.GetID():
        PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
    elif not GameWorld.IsCrossServer():
        realmDifficulty = PlayerControl.GetMapRealmDifficulty(curPlayer)
        if realmDifficulty:
            GameWorld.DebugLog("===本服LoadMapOK时玩家处于境界难度地图,自动设置难度!realmDifficulty=%s" % realmDifficulty, curPlayer.GetPlayerID())
            PlayerControl.SetRealmDifficulty(curPlayer, realmDifficulty)
    if curPlayer.GetSight() != 0:
        PlayerControl.SetSight(curPlayer, 0)
    #刷新自己的视野
    #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())
    #elif not GameWorld.IsCrossServer():
    #    realmDifficulty = PlayerControl.GetMapRealmDifficulty(curPlayer)
    #    if realmDifficulty:
    #        GameWorld.DebugLog("===本服LoadMapOK时玩家处于境界难度地图,自动设置难度!realmDifficulty=%s" % realmDifficulty, curPlayer.GetPlayerID())
    #        PlayerControl.SetRealmDifficulty(curPlayer, realmDifficulty)
    curPlayer.RefreshView()
    curPlayer.SetVisible(True)
        
@@ -1671,9 +1472,7 @@
        #=======================================================================
            #此时已经是下马状态不需要刷状态 但是需要通知客户端下马
            PlayerHorse.PlayerRideHorseDown(curPlayer, False)
    PlayerTeam.PlayerLoginSetTeam(curPlayer, tick)
    #激活玩家(保证持续性Buff处理间隔)
    PlayerControl.SetIsNeedProcess(curPlayer, True)
@@ -1732,13 +1531,7 @@
        curPlayer.SetFaction(ChConfig.CampType_Neutral)
        BuffSkill.DelBuffBySkillID(curPlayer, ChConfig.Def_SkillID_Justice, tick)
        BuffSkill.DelBuffBySkillID(curPlayer, ChConfig.Def_SkillID_Evil, tick)
    #再次请求双倍经验是否领取
    #PlayerDoubleExpSys.ChangeMapAfter_CalcDoubleExpTime(curPlayer, tick)
    #PlayerVip.SetStartCalcVIPTick(curPlayer, tick)
    #强制切换PK模式
    initAttackModel = curMap.GetInitAttackModel()
    if curPlayer.GetAttackMode() != initAttackModel:
@@ -1748,7 +1541,6 @@
    
    PassiveBuffEffMng.OnLoadMapGFPassive(curPlayer)
    PlayerYinji.OnLoadMap(curPlayer)
    ItemControler.PlayerItemControler(curPlayer).RefreshStartEquipCount()   # 刷新装备珍品星级
    
    #EndLoadMap需放在最后, 0403 tagPlayerLoginLoadOK
    curPlayer.EndLoadMap()
@@ -1840,7 +1632,7 @@
    NotifyPlayerBasePoint(curPlayer, pointAttrIDList)
    playerControl = PlayerControl.PlayerControl(curPlayer)
    playerControl.RefreshPlayerAttrState()
    PlayerControl.SetLingGenMaxIndex(curPlayer)
    #PlayerControl.SetLingGenMaxIndex(curPlayer)
    return
#// B2 07 重置加点 #tagCMResetAttrPoint
@@ -2398,8 +2190,6 @@
    #流向记录玩家下线
    DataRecordPack.DR_PlayerDisconnect(curPlayer)
    
    #VIP时间
    #PlayerVip.CalcVIPTimeByTick(curPlayer, tick, False)
    #在线时间
    PlayerOnlinePrize.CalcOnlineTime(curPlayer)
    #首充提示时间
@@ -2426,6 +2216,9 @@
    
    #离线session
    EventReport.WriteEvent_session(curPlayer)
    #需放最后
    PlayerOnline.OnPlayerLogoff(curPlayer)
    return
#---------------------------------------------------------------------
@@ -3002,11 +2795,7 @@
                    return
                
    elif rebornType == ChConfig.rebornType_UseItem:
        if crossMapID == ChConfig.Def_FBMapID_CrossBattlefield:
            rebornItemID = IpyGameDataPY.GetFuncCfg("CrossBattlefieldReborn", 1)
            rebornItem = ItemCommon.FindItemInPackByItemID(curPlayer, rebornItemID, IPY_GameWorld.rptItem)
        else:
            rebornItem = ItemCommon.FindItemInPackByEffectEx(curPlayer, ChConfig.Def_Effect_Reborn)
        rebornItem = ItemCommon.FindItemInPackByEffectEx(curPlayer, ChConfig.Def_Effect_Reborn)
        if not rebornItem:
            GameWorld.ErrLog("复活道具不足,无法原地复活! ", playerID)                
            return
@@ -3341,7 +3130,7 @@
#  @param transportType 传送类型
#  @return 是否vip等级限制
def TransportVipLvRestrict(curPlayer, transportType):
    return PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_FreeTransport)
    return 0
@@ -3413,7 +3202,7 @@
    #参考经验
    rExp = PlayerControl.GetPlayerReExp(curPlayer)
    reLV = curPlayer.GetLV()                    #参考等级
    worldLvExpRate = PlayerWorldAverageLv.GetWorldAverageLvExpRate(curPlayer) #世界等级经验加成
    worldLvExpRate = 0
    
    #经验公式
    redeemExp = int(eval(recList[1]))
@@ -3464,34 +3253,6 @@
#  @param tick: 时间戳
#  @return: None
def ReceiveFamilyArrestAward(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    arrestID = clientData.ArrestID
    bit = ShareDefine.Def_ArrestOverState_BitDic.get(arrestID)
    if bit == None:
        #没有这个家族悬赏任务
        GameWorld.DebugLog("没有这个家族悬赏任务 arrestID=%s" % arrestID)
        return
    receiveState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyArrestAwardState)
    if receiveState & pow(2, bit):
        #该任务奖励已经领取
        GameWorld.DebugLog("该任务奖励已经领取 arrestID=%s" % arrestID)
        return
    if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_FamilyArrestQueryState) == 1:
        #已经在查询中, 不重复查询
        GameWorld.DebugLog("已经在查询中, 不重复查询 arrestID=%s" % arrestID)
        return
    sendMsg = '%s' % arrestID
    #向GameServer请求该悬赏任务是否已经完成
    curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_FamilyArrest, 0, 'FamilyArrestAward', sendMsg, len(sendMsg))
    #设置状态查询中
    curPlayer.SetDict(ChConfig.Def_PlayerKey_FamilyArrestQueryState, 1)
    return
@@ -3525,26 +3286,6 @@
    NetPackCommon.SendFakePack(curPlayer, awardReceiveState)
    return
## 领取奖励表奖励
#  @param None None
#  @return None
def ClientPlayerGetReward(index, clientData, tick):
    playerManager = GameWorld.GetPlayerManager()
    curPlayer = playerManager.GetPlayerByIndex(index)
    # 背包空间不足
    if not ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem):
        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [IPY_GameWorld.rptItem])
        return
    rewardType = clientData.RewardType
    #通知GameServer领取奖励
    resultName = str(rewardType)
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'PlayerGetReward',
                                                                  resultName, len(resultName))
    return
#//A5 04 玩家领取奖励 #tagCMPlayerGetReward
#
#struct    tagCMPlayerGetReward
@@ -3575,24 +3316,18 @@
    # 挂机奖励
    elif rewardType == ChConfig.Def_RewardType_Guaji:
        PlayerGuaji.OnGetGuajiAward(curPlayer, dataEx)
    # 仙树免费减时
    elif rewardType == ChConfig.Def_RewardType_TreeFreeTime:
        PlayerTree.FreeReduceTreeLVTime(curPlayer)
    # 每日免费直购礼包
    elif rewardType == ChConfig.Def_RewardType_DayFreeGoldGift:
        PlayerDailyGiftbag.OnGetDailyFreeGiftbag(curPlayer)
    # 仙盟联赛冠军仙盟每日俸禄奖励
    elif rewardType == ChConfig.Def_RewardType_ChampionFamilyDailyReward:
        GameLogic_FamilyWar.GetChampionFamilyDailyReward(curPlayer)
    # 仙魔之争胜利场数奖励
    elif rewardType == ChConfig.Def_RewardType_XMZZWinCnt:
        GameLogic_XMZZ.GetXMZZWinPrize(curPlayer, dataEx)
    # 仙盟每日福利奖励
    elif rewardType == ChConfig.Def_RewardType_FamilyDayAward:
        PlayerFamily.GetFamilyDayAward(curPlayer)
    # 玩家等级奖励
    elif rewardType == ChConfig.Def_RewardType_LVAward:
        PlayerLVAward.GetPlayerLVAward(curPlayer, dataEx)
    # 仙宝寻主奖励
    elif rewardType == ChConfig.Def_RewardType_XBXZ:
        PlayerMagicWeapon.OnGetXBXZAward(curPlayer, dataEx)
    # 首充礼包奖励
    elif rewardType == ChConfig.Def_RewardType_GoldGiftFirst:
        PlayerGoldGift.GetPlayerGoldGiftFirst(curPlayer, dataEx)
@@ -3614,12 +3349,6 @@
    # 领取boss复活活动奖励
    elif rewardType == ChConfig.Def_RewardType_BossReborn:
        PlayerBossReborn.GetBossRebornActionAward(curPlayer, dataEx)
    # 领取仙界盛典充值大礼
    elif rewardType == ChConfig.Def_RewardType_FCRecharge:
        PlayerFairyCeremony.GetFCRechargeAward(curPlayer)
    # 领取仙界盛典全民来嗨
    elif rewardType == ChConfig.Def_RewardType_FCParty:
        PlayerFairyCeremony.GetFCPartyAward(curPlayer, dataEx)
    # 领取分包下载奖励
    elif rewardType == ChConfig.Def_RewardType_DownLoad:
        GetDownloadAward(curPlayer, dataEx)
@@ -3629,9 +3358,6 @@
    # 功能开启奖励
    elif rewardType == ChConfig.Def_RewardType_OpenFunc:
        GameFuncComm.GetFuncOpenAward(curPlayer, dataEx)
    # 冰晶矿脉星级奖励
    elif rewardType == ChConfig.Def_RewardType_IceLodeStar:
        GameLogic_IceLode.GetIceLodeStarAward(curPlayer, dataEx)
    # 领取周狂欢活动奖励
    elif rewardType == ChConfig.Def_RewardType_WeekPartyAct:
        PlayerWeekParty.GetWeekPartyActionAward(curPlayer, dataEx, dataExStr)
@@ -3641,12 +3367,6 @@
    # 领取登录奖励活动奖励
    elif rewardType == ChConfig.Def_RewardType_ActLoginAwardAct:
        PlayerActLogin.GetLoginAwardActionAward(curPlayer, dataEx, dataExStr)
    # 领取新仙界盛典充值大礼
    elif rewardType == ChConfig.Def_RewardType_NewFairyCRecharge:
        PlayerNewFairyCeremony.GetFCRechargeAward(curPlayer)
    # 领取新仙界盛典全民来嗨
    elif rewardType == ChConfig.Def_RewardType_NewFairyCParty:
        PlayerNewFairyCeremony.GetFCPartyAward(curPlayer, dataEx)
    # 领取节日巡礼活动奖励
    elif rewardType == ChConfig.Def_RewardType_FeastWeekPartyAct:
        PlayerFeastWeekParty.GetFeastWeekPartyActionAward(curPlayer, dataEx, dataExStr)
@@ -3701,18 +3421,12 @@
    # 轮回殿奖励
    elif rewardType == ChConfig.Def_RewardType_LunhuidianAward:
        PlayerActLunhuidian.GetLunhuidianAward(curPlayer, dataEx, dataExStr)
    #缥缈奇遇领取
    elif rewardType == ChConfig.Def_RewardType_FairyAdventuresAward:
        PlayerFairyDomain.GetFairyAdventuresAward(curPlayer, dataEx, dataExStr)
    #历史累计充值领取
    elif rewardType == ChConfig.Def_RewardType_HistoryChargeAward:
        PlayerGoldGift.OnGetHistoryRechargeAward(curPlayer, dataEx)
    #在线特惠充值额外奖励
    elif rewardType == ChConfig.Def_RewardType_OnlineRechargeTH:
        PlayerCoin.OnGetOnlineRechargeTH(curPlayer)
    #天星塔全服挑战层领奖
    elif rewardType == ChConfig.Def_RewardType_SkyTowerServerChallengeReward:
        GameLogic_SkyTower.OnGetSkyTowerServerChallengeReward(curPlayer, dataEx, dataExStr)
    #创角奖励
    elif rewardType == ChConfig.Def_RewardType_CreateRole:
        OnGetCreateRoleAward(curPlayer)
@@ -3722,9 +3436,6 @@
    #境界渡劫任务条件奖励
    elif rewardType == ChConfig.Def_RewardType_RealmLVUpTask:
        PlayerPrestigeSys.GetRealmLVUpTaskAward(curPlayer, dataEx)
    #仙盟boss伤害奖励
    elif rewardType == ChConfig.Def_RewardType_FamilyBossHurt:
        GameLogic_FamilyBoss.GetFamilyBossHurtAward(curPlayer, dataEx, dataExStr)
    #打包直购礼包奖励
    elif rewardType == ChConfig.Def_RewardType_DailyPackBuyGift:
        PlayerGoldGift.GetDailyPackBuyGift(curPlayer, dataEx)
@@ -3902,7 +3613,6 @@
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    if not curPlayer:
        return
    BossHurtMng.OnQueryBossHurtList(curPlayer, clientData)
    return
@@ -4372,7 +4082,7 @@
#    WORD        RealmDifficulty;    //境界难度 = 1000 + 所选境界等级,如境界13,则发1013
#};
def OnSelectRealmDifficulty(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    PlayerControl.SetRealmDifficulty(curPlayer, clientData.RealmDifficulty)
    #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    #PlayerControl.SetRealmDifficulty(curPlayer, clientData.RealmDifficulty)
    return