ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -17,14 +17,10 @@
import PlayerControl
import GameMap
import ChConfig
import EventShell
import BuffSkill
import PlayerEventCounter
import PlayerTeam
import PlayerHorse
import PlayerTruck
import NPCCommon
import PlayerGameEvent
import SkillCommon
import FBLogic
import ChItem
@@ -37,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
@@ -54,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
@@ -89,19 +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 QuestCommon
import PlayerTJG
import GameLogic_XMZZ
import PlayerFlashSale
import PlayerFlashGiftbag
import PlayerDailyGiftbag
@@ -111,21 +82,13 @@
import PlayerActCollectWords
import PlayerActTotalRecharge
import PlayerActRechargePrize
import PlayerActGarbageSorting
import PlayerActXianXiaMJ
import PlayerActGubao
import PlayerActHorsePetTrain
import PlayerActLianqi
import PlayerActGodGift
import PlayerActFamilyCTGAssist
import PlayerActRechargeRebateGold
import PlayerActManyDayRecharge
import PlayerActSingleRecharge
import PlayerActHorsePetFeast
import PlayerActBossTrial
import PlayerSpringSale
import PlayerFairyCeremony
import PlayerNewFairyCeremony
import GY_Query_BossFirstKill
import PlayerCrossYaomoBoss
import PlayerFeastRedPacket
@@ -139,13 +102,9 @@
import PlayerTongTianLing
import CrossRealmPlayer
import ChNetSendPack
import FamilyRobBoss
import FBHelpBattle
import PlayerAssist
import PlayerArena
import PyGameData
import PlayerCoin
import PlayerGeTui
import PlayerCharm
import PlayerDogz
import PlayerCoat
@@ -156,16 +115,17 @@
import PlayerShentong
import PlayerCustomAward
import PlayerZhanling
import PlayerTree
import PlayerLianTi
import PlayerTask
import PlayerYinji
import PlayerLove
import GameObj
import PlayerChangeJob
import PlayerGuaji
import PlayerFace
import PlayerChatBox
import PlayerXiangong
import PlayerMineArea
import PlayerGoldRush
import PlayerActLoginNew
import PlayerActBuyCountGift
import PlayerActLunhuidian
@@ -173,11 +133,22 @@
import PlayerActYunshi
import PlayerActTask
import PlayerMail
import DBDataMgr
import GameServerRefresh
import IPY_ServerDefine
import CommFunc
from PyMongoDB import RecvPackToMapDB
import PyMongoMain
import PlayerTalk
import PlayerHero
import PlayerOnline
import TurnAttack
import datetime
import time
import math
import re
import base64
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -195,34 +166,10 @@
#@return 返回值无意义
#@remarks 玩家登陆游戏初始化
def InitLoginPlayer(curPlayer, tick):
    ##初始化交易列表
    if curPlayer.GetTradeList().GetTradeItemCount() == 0:
        curPlayer.GetTradeList().SetTradeListCount(ChConfig.Def_PlayerTradeMaxItemCount)
    PlayerOnline.OnPlayerLogin(curPlayer)
    #初始化玩家的时钟个数
    if curPlayer.GetTickTypeCount() == 0:
        curPlayer.SetTickTypeCount(ChConfig.TYPE_Player_Tick_Count)
    #初始化玩家聊天频道
    if curPlayer.GetMaxChannelCount() == 0:
        curPlayer.SetMaxChannelCount(ChConfig.Def_PlayerTalkChannelMaxCount)
#===============================================================================
#    #初始化玩家鉴定管理器物品最大个数
#    identifyItemManager = curPlayer.GetIdentifyManager()
#
#    #设置最大数量
#    if identifyItemManager.GetCount() == 0:
#        identifyItemManager.SetCount(ChConfig.TYPE_Player_identifyManagerCount)
#
#    #初始化宝石挖除管理器最大个数
#    stoneBreakManager = curPlayer.GetStoneBreakManager()
#
#    if stoneBreakManager.GetCount() == 0:
#        stoneBreakManager.SetCount(ChConfig.TYPE_Player_StoneBreakManagerCount)
#===============================================================================
    #初始化物品
    #ChItem.InitPlayerLoginItem(curPlayer, tick)
    return
#---------------------------------------------------------------------
##C++封包GameServer_InitOK 处理
@@ -235,52 +182,9 @@
        #玩家是第一次登录, 并且玩家需要踢回原来地图
        return
    
    #--------------------------------通知客户端任务-------------
    #先发送所有任务, 再刷新日期, 否则会有2个相同的任务在玩家身上
    #把玩家当前的所有任务发送给客户端
    #GameWorld.Log('EventShell.NotifyAllQuestDetail')
    if not GameWorld.IsCrossServer():
        EventShell.NotifyAllQuestDetail(curPlayer, True)
    #刷新人物日期状态
    #GameWorld.Log('PlayerEventCounter.UpdatePlayerLoginTime')
    PlayerEventCounter.UpdatePlayerLoginTime(curPlayer)
    #2010/4/20 这个事件在 EventResponse_OnLogin中触发,这里重复触发了
    #GameWorld.Log('EventShell.PlayerGMEventTrig')
    #EventShell.PlayerGMEventTrig(curPlayer)
    #--------------------------------------------------------
    return
##非同一天二次登陆
# @param curPlayer 玩家实例
# @return None
def NoteOtherDayLogin(curPlayer):
    #记录过或者未登陆过 不记录
    if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_OtherDayLogin) != 1:
        return
    logoffTimeStr = curPlayer.GetLogoffTime().strip()
    loginTimeStr = curPlayer.GetLoginTime().strip()
    #curTimeStr = GameWorld.GetCurrentDataTimeStr()
    #防范外部逻辑错误,或异常情况
    if logoffTimeStr in ['', '0'] or loginTimeStr in ['', '0']:
        return
    logoffTimeDate = GameWorld.GetDateTimeByStr(logoffTimeStr.split()[0], ChConfig.TYPE_Time_Format_Day)
    #同一天不记录
    if logoffTimeDate == GameWorld.GetDateTimeByStr(loginTimeStr.split()[0], ChConfig.TYPE_Time_Format_Day):
        return
    #GameWorld.Log("OtherDayLogin offtime = %s" % logoffTimeDate)
    DataRecordPack.DR_OtherDayLogin(curPlayer.GetAccID(), curPlayer.GetIP(), curPlayer)
    #标记为已记录
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_OtherDayLogin, 2)
    return
#// A1 20 货币兑换 #tagCMMoneyExchange
@@ -482,51 +386,28 @@
#---------------------------------------------------------------------
'''
登录流程
UserCrtlDB
    onAuthentication  玩家登录 :验证账号-若没有角色则创角-返回角色信息-通知Map C++
    Map C++调用 PlayerLogin
MapServer
    ChPlayer:def PlayerLogin(index, tick)
                    DoPlayerLogin
                        curPlayer.Sync_ClientPlayerLogin()
                        curPlayer.Sync_GameServer_MapID()                #同步GameServer自己的地图ID
                        curPlayer.BalanceServer_PlayerLoginInitOK()
GameServer
    ChPlayer:def PlayerLoadMapState(index, tick)    pack.GetLoadState()=0    此时的  LoadState 为0
                    curPlayer.SetIsLoadMap(True)    设置在加载地图
    ChPlayer:def PlayerLogin(index, tick)
                    curPlayer.MapServer_InitOK()    通知地图自己OK了
MapServer
    PlayerEventCounter:def GameServer_InitOK(index, tick)
        curPlayer.SendToBServerServerInitOK()                #通知BServer自己OK了
        ChPlayer:def OnAllServerInitOK(curPlayer, tick)
        DoPlayerLogin
            curPlayer.Sync_ClientPlayerLogin()  #01 02 玩家初始化#tagCDBPlayer
            curPlayer.BalanceServer_PlayerLoginInitOK() #向route设置玩家在map中的索引
            curPlayer.SendToBServerServerInitOK()   #通知route登录成功 ,route向客户端发送//01 09 服务器准备就绪#tagServerPrepareOK
            ChPlayer:def OnAllServerInitOK(curPlayer, tick)
    ChPlayer:def LoadMapOK(curPlayer, tick)
        curPlayer.GameServer_SetLoadMapState(1)    #通知GameServer切换地图停止
        curPlayer.SetMapLoadOK(True)
        curPlayer.SetInitOK(True)
        curPlayer.EndLoadMap()
GameServer
    ChPlayer:def PlayerLoadMapState(index, tick)    pack.GetLoadState()=1    此时的  LoadState 为1
        PlayerLoginLoadMapOK
            ChPlayer:def __Func_LoadMapOK(curPlayer, tick)  #!!!直接调用不等待客户端封包 //01 07 地图读取OK#tagCInitMapOK
            curPlayer.SetMapLoadOK(True)
            curPlayer.SetInitOK(True)
        curPlayer.MapServer_GameServerRefreshOK()        #通知地图服务器玩家初始化成功
        curPlayer.SetIsLoadMap(False)
MapServer
    GameServerRefresh:GameSever_PlayerInitOK curPlayer.GetGameServerInitOK()=0
        curPlayer.SetGameServerInitOK(True)
后续补充流程
MapServer
    ChPlayer:def DoPlayerRealLoginOK(curPlayer, tick)
                    玩家真正登录成功处理,用于替换  __DoPlayerLoginServer  中的功能登录逻辑
                    通知GameServer地图最终登录成功了
GameServer
    ChPlayer:def DoPlayerRealLoginOK(curPlayer, tick)
                    玩家真正登录成功处理,用于替换  __DoPlayerLoginServer  中的功能登录逻辑
            curPlayer.EndLoadMap()  #通知客户端 04 03 玩家登录数据发送完毕OK#tagPlayerLoginLoadOK
            GameServerRefresh:GameSever_PlayerInitOK
            curPlayer.SetGameServerInitOK(True)
            ChPlayer:def DoPlayerRealLoginOK(curPlayer, tick) 玩家真正登录成功处理,用于替换  __DoPlayerLoginServer  中的功能登录逻辑
'''
##玩家登陆游戏逻辑处理
@@ -537,16 +418,12 @@
def DoPlayerLogin(curPlayer, tick):
    #这里只做初始化逻辑
    curPlayer.SetDict(ChConfig.Def_PlayerKey_LoadMapIsLogin, 1)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RealLoginOK, 0) # 每次登录重置
    
    #通知时间
    Sync_PyServerDataTimeToClient(curPlayer)
    Sync_OpenServerDay(curPlayer)
    #通知玩家基本信息
    curPlayer.Sync_ClientPlayerLogin()
    #同步GameServer自己的地图ID
    curPlayer.Sync_GameServer_MapID()
    curPlayer.Sync_ClientPlayerLogin()  #01 02 玩家初始化#tagCDBPlayer
    
    # 屏蔽跨服下关闭和子服重复的数据的发送 pushsend接口, notifyall正常发送
    # !!!必要发送的数据要注意位置
@@ -562,7 +439,7 @@
        PlayerControl.SetCrossMapID(curPlayer, curPlayer.GetMapID()) # 因为主服上传数据之前该值为0,所以登录跨服后在跨服服务器要设置为对应地图
        
    #通知运行成功
    curPlayer.BalanceServer_PlayerLoginInitOK()
    curPlayer.BalanceServer_PlayerLoginInitOK() #向route设置玩家在map中的索引
    return
def __DoPlayerLoginServer(curPlayer, tick):
@@ -573,11 +450,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)
@@ -585,9 +460,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)
@@ -600,7 +473,10 @@
        # 离线过久恢复为非跨服状态
        if PlayerControl.GetCrossMapID(curPlayer):
            PlayerControl.SetCrossMapID(curPlayer, 0)
    __FirstLoginOnEnter(curPlayer)
    TurnAttack.OnPlayerLogin(curPlayer)
    SyncGuideState(curPlayer)
    
    #上线检查一次装备属性
@@ -609,23 +485,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)
@@ -637,16 +508,10 @@
    PlayerPrestigeSys.OnLogin(curPlayer)
    #DataRecordPack.DR_PlayerLogin(curPlayer)
    EventReport.WriteEvent_login(curPlayer)
    # 合服首登处理
    __DoMixServerFirstLogin(curPlayer)
    PlayerBillboard.BillboardOnLogin(curPlayer)
    #非同一天二次登陆, 应该放在该函数中的SetLoginTime之后,EventResponse_OnEnter之前
    NoteOtherDayLogin(curPlayer)
    #上线时通知脱机挂时被击杀的离线时间
    __Sync_PlayerOffline(curPlayer, tick)
    
    #玩家扩展信息
    __SyncPlayerInfoEx(curPlayer)
@@ -655,49 +520,11 @@
    GiveDownloadPatchAward(curPlayer)
    
    #PKģʽ
    SyncPKModel(curPlayer)
    #装备相关信息
    ChEquip.OnPlayerEquipLoginLogic(curPlayer)
    #大师
    PlayerGreatMaster.MasterOnLogin(curPlayer)
    # 推送提醒
    PlayerGeTui.LoginNotifySetting(curPlayer)
    #֪ͨVIP
    PlayerVip.DoOnLogin(curPlayer, tick)
    #通知法宝精炼等级
    PlayerRefineStove.DoOnLogin(curPlayer, tick)
    #SyncPKModel(curPlayer)
    
    #---玩家上线, 宠物逻辑处理---
    PetControl.DoLogic_PetInfo_OnLogin(curPlayer, tick)
    PlayerPet.OnPlayerPetLogin(curPlayer)
    #要在SetCanMove之后做这个事情, 否则OnEnter不会卡住玩家
    EventShell.EventResponse_OnEnter(curPlayer)
    EventShell.EventResponse_OnLogin(curPlayer)
    #通知环奖励记录
    EventShell.NotifyRunEndAward(curPlayer)
    #通知玩家有补偿可以领取
    #curPlayer.DataServer_GetExpiationCount()
    #通知玩家有宠物补偿可以领取
    #curPlayer.DataServer_GetPetExpiationCount()
    #玩家离线邮件通知
    #curPlayer.DataServer_GetMailListReq()
    #清空玩家万能背包中的任务物品
    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)
@@ -706,30 +533,17 @@
    # 首充/天天首充/充值豪礼
    PlayerGoldGift.OnLogin(curPlayer)
    
    #通知购买功能中各购买类型的已购买和可购买次数
    Operate_PlayerBuyZhenQi.DoPlayerLogin(curPlayer)
#
#    #通知功能首次触发情况
    #通知功能首次触发情况
    GameFuncComm.Sync_FuncOpenState(curPlayer)
#
#    #通知客户端签到信息
    #通知客户端签到信息
    PlayerSignDay.SignDayOnLogin(curPlayer)
#
#    #通知客户端镖车AI模式
#    PlayerTruck.Sync_TruckMode(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)
@@ -747,13 +561,9 @@
    
    # 开服活动奖励信息
    OpenServerCampaign.OnOpenServerCampaignLogin(curPlayer)
    # 试炼之塔
    GameLogic_TrialTower.OnFBPlayerLogin(curPlayer)
    # 古神禁地
    GameLogic_GodArea.GodAreaOnLogin(curPlayer)
    # 采集NPC次数通知
    NPCCommon.SyncCollNPCTime(curPlayer)
    #NPCCommon.SyncCollNPCTime(curPlayer)
    
    # 每日活跃度
    PlayerActivity.OnLogin(curPlayer)
@@ -761,14 +571,8 @@
    # 副本进入时间
    FBCommon.FBOnLogin(curPlayer)
    
    #世界等级
    PlayerWorldAverageLv.OnLogin(curPlayer)
    # 投资理财
    PlayerGoldInvest.OnLogin(curPlayer)
    #属性果实使用情况
    PlayerAttrFruit.AttrFruitOnLogin(curPlayer)
    
    #成就
    PlayerSuccess.SuccOnLogin(curPlayer)
@@ -796,7 +600,6 @@
    # 跨服PK
    PlayerCrossRealmPK.DoPlayerLogin(curPlayer)
    PlayerCrossChampionship.DoPlayerLogin(curPlayer)
    PlayerCrossBattlefield.DoPlayerLogin(curPlayer)
    
    # 幸运云购
    PlayerLuckyCloudBuy.OnPlayerLogin(curPlayer)
@@ -808,7 +611,7 @@
    PlayerControl.NotifyPlayerAllCurrency(curPlayer)
    PlayerControl.NotifyUseMoneyTotal(curPlayer)
    #通知基础属性
    NotifyPlayerBasePoint(curPlayer)
    #NotifyPlayerBasePoint(curPlayer)
    
    #跨服充值排行
    CrossActCTGBillboard.OnPlayerLogin(curPlayer)
@@ -838,45 +641,23 @@
    PlayerActFamilyCTGAssist.OnPlayerLogin(curPlayer)
    #集字活动
    PlayerActCollectWords.OnPlayerLogin(curPlayer)
    # 世界boss
    BossHurtMng.OnLogin(curPlayer)
    ChItem.Sync_ItemDayUseCnt(curPlayer)
    # 悬赏登录通知
    #PlayerArrestTask.OnLogin(curPlayer)
    # 符印登录通知
    PlayerRune.PlayerRuneLogin(curPlayer)
    # 仙盟红包登录通知
    PlayerFamilyRedPacket.OnPlayerLogin(curPlayer)
    PlayerFeastRedPacket.DoPlayerOnLogin(curPlayer)
    # 法宝登录通知
    PlayerMagicWeapon.PlayerMagicWeaponLogin(curPlayer)
    # 商店物品购买次数登录通知
    FunctionNPCCommon.ShopItemOnLogin(curPlayer)
    # 通知设置的被动功法
    #PassiveBuffEffMng.OnLoginGFPassive(curPlayer)
    #我要太极
    PlayerDiceEx.DiceExOnLogin(curPlayer)
    # 剧情任务完成状态
    QuestCommon.Sync_StoryMissionState(curPlayer)
    #仙魔之争
    GameLogic_XMZZ.OnXMZZLogin(curPlayer)
    PlayerOnlinePrize.OnPlayerLogin(curPlayer)
    #装备分解
    PlayerEquipDecompose.PlayerLogin(curPlayer)
    #防沉迷
    PlayerGameWallow.DoLogic_CheckWallow(curPlayer, tick)
    # 通知脱机挂信息
    #PlayerTJG.NotifyTJGInfo(curPlayer)
    # 协助
    PlayerAssist.OnPlayerLogin(curPlayer)
    #PlayerEquipDecompose.PlayerLogin(curPlayer)
    # 极品白拿
    PlayerFreeGoods.OnLogin(curPlayer)
    # BOSS复活活动
    PlayerBossReborn.OnLogin(curPlayer)
    # boss历练
    PlayerActBossTrial.OnPlayerLogin(curPlayer)
    # 骑宠盛宴活动
    PlayerActHorsePetFeast.OnLogin(curPlayer)
    # 周狂欢活动
    PlayerWeekParty.OnLogin(curPlayer)
    # 购买次数礼包活动
@@ -899,14 +680,6 @@
    PlayerFeastTravel.OnPlayerLogin(curPlayer)
    # 登录奖励活动
    PlayerActLogin.OnLogin(curPlayer)
    # 垃圾分类活动
    PlayerActGarbageSorting.OnPlayerLogin(curPlayer)
    # 仙匣秘境活动
    PlayerActXianXiaMJ.OnPlayerLogin(curPlayer)
    # 古宝养成活动
    PlayerActGubao.OnPlayerLogin(curPlayer)
    # 骑宠养成活动
    PlayerActHorsePetTrain.OnPlayerLogin(curPlayer)
    # 炼器活动
    PlayerActLianqi.OnPlayerLogin(curPlayer)
    # 天帝礼包活动
@@ -917,36 +690,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)
    #通天令
@@ -984,10 +742,7 @@
        
    curPlayer.SetState(0)   # 脱机挂恢复为正常上线
    curPlayer.SetCountryLastWeekHornor(0) # 通知数据库是否保存还是下线,做一次恢复,1为保存 0为正常下线
    #tjgTime = PlayerTJG.GetTJGTime(curPlayer)
    #if tjgTime:
    #    PlayerControl.SendGameServerRefreshState(curPlayer, IPY_GameWorld.CDBPlayerRefresh_HappyPoint, tjgTime)
    PlayerControl.DoGMForbidenTalkOnLogin(curPlayer)
    DataRecordPack.DR_PlayerLogin(curPlayer) # 放最后,记录等级、经验等信息
    return
@@ -997,17 +752,14 @@
        该函数为地图最终登录成功才会执行到,以后一些功能类的登录处理建议均写到这里
        旧的功能先不动( __DoPlayerLoginServer 函数中的功能),如果有登录相关的bug再考虑是否移动到此函数
    '''
    if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RealLoginOK):
        #切地图的不处理,切地图的也会触发该函数
        return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RealLoginOK, 1)
    GameWorld.Log("MapServer->DoPlayerRealLoginOK", curPlayer.GetPlayerID())
    
    if GameWorld.IsCrossServer():
        pass
    
    else:
        PyMongoMain.GetUserCtrlDB().OnPlayerLogin(curPlayer)
        PlayerHero.OnPlayerLogin(curPlayer)
        PlayerMail.OnPlayerLogin(curPlayer)
        PlayerChatBox.OnPlayerLogin(curPlayer)
        PlayerFace.OnPlayerLogin(curPlayer)
@@ -1015,9 +767,11 @@
        PlayerGubao.OnPlayerLogin(curPlayer)
        PlayerShentong.OnPlayerLogin(curPlayer)
        PlayerZhanling.OnPlayerLogin(curPlayer)
        PlayerMineArea.OnPlayerLogin(curPlayer)
        PlayerGuaji.OnPlayerLogin(curPlayer)
        PlayerTask.OnPlayerLogin(curPlayer)
        PlayerTree.OnPlayerLogin(curPlayer)
        PlayerGoldRush.OnPlayerLogin(curPlayer)
        PlayerActFamilyGCZ.OnPlayerLogin(curPlayer)
        PlayerTalk.OnPlayerLogin(curPlayer)
        
        # 上线查询一次充值订单
        curPlayer.SendDBQueryRecharge()
@@ -1040,10 +794,56 @@
    NetPackCommon.SendFakePack(curPlayer, playerInfoEx)
    return
## 合服首登处理
#  @param curPlayer
#  @return None
def __FirstLoginOnEnter(curPlayer):
    ## 首登处理
    playerID = curPlayer.GetID()
    if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FirstLogin):
        return
    GameWorld.Log('玩家是第一次进入游戏', playerID)
    # 特殊说明: 如果地图没有完全初始化好,客户端断开或者异常等情况会触发RunGateGameServerMapServerKickOutPlayerNoSave
    # 那么在DoPlayerLogin 中设置的数据将不会被保存, 如会导致第一个任务重复触发问题,记录多次发送
    EventReport.WriteEvent_Entry(curPlayer, 4)
    #EventReport.EventReport(ShareDefine.Def_UserAction_FirstLogin, "", curPlayer)
    curPlayer.SetFightPoint(1) # 初始化为1倍消耗
    #---补满血满魔---
    GameObj.SetHP(curPlayer, GameObj.GetMaxHP(curPlayer))
    #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))
    #玩家默认恶名值
    #curPlayer.SetInfamyValue(ChConfig.Def_FirstLogin_InfamyValue)
    #curPlayer.SetDict("ThunderLogin", 1)
    #记录第一次登陆
    DataRecordPack.DR_FirstLogin(curPlayer.GetAccID(), curPlayer.GetIP(), curPlayer)
    #首登邮件
    mailList = IpyGameDataPY.GetFuncEvalCfg("MailLVAward", 2)
    for mailTypeKey, mailItemList in mailList:
        PlayerControl.SendMailByKey(mailTypeKey, [curPlayer.GetPlayerID()], mailItemList)
    PlayerHero.OnPlayerFirstLogin(curPlayer)
    #淘金初始化
    PlayerGoldRush.InitGoldEnergy(curPlayer)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FirstLogin, 1)
    return
def __DoMixServerFirstLogin(curPlayer):
    ## 合服首登处理
    isMixServer = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_IsMixServer)
    if not isMixServer:
        return
@@ -1103,17 +903,6 @@
    # 同步排行榜
    PlayerBillboard.UpdatePlayerBillboardOnLeaveServer(curPlayer, isAll=True)
    
    # 天星塔全服过关记录
    GameLogic_SkyTower.OnMixFirstLogin(curPlayer)
    # bossƾ֤
    PlayerActBossTrial.OnMixFirstLogin(curPlayer)
    # 仙匣秘境
    PlayerActXianXiaMJ.OnMixFirstLogin(curPlayer)
    # 古宝养成
    PlayerActGubao.OnMixFirstLogin(curPlayer)
    # 骑宠养成
    PlayerActHorsePetTrain.OnMixFirstLogin(curPlayer)
    # 重置玩家改名次数
    #UpdatePlayerName.ResetChangeNameCnt(curPlayer)
    return
@@ -1128,51 +917,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 玩家实例
@@ -1185,18 +929,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)
        
@@ -1227,16 +959,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
#---------------------------------------------------------------------
@@ -1288,55 +1010,6 @@
    return
#---------------------------------------------------------------------
##上线时通知离线时间(离线挂机功能)
# @param curPlayer 玩家实例
# @param tick 时间戳
# @return 返回值无意义
# @remarks 上线时通知离线时间(离线挂机功能)
def __Sync_PlayerOffline(curPlayer, tick):
    #---等级限制---
    if GameWorld.IsCrossServer():
        return
    #PlayerTJG.TJGDeadOffline(curPlayer)
#===============================================================================
#    #---等级限制---
#    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 时间戳
@@ -1344,7 +1017,7 @@
#@remarks 玩家在地图服务器中登录ok,初始化自己
def DoPlayerLoginInMap(curPlayer, tick):
    #通知GameServer切换地图开始
    curPlayer.GameServer_SetLoadMapState(0)
    #curPlayer.GameServer_SetLoadMapState(0)
    #在玩家切换场景的时候, 不会调用到这里
    curPlayer.SetCanMove(False)
    curPlayer.SetInitOK(False)
@@ -1352,37 +1025,36 @@
    curPlayer.SetMapLoadOK(False)
    curPlayer.SetVisible(False)
    curPlayer.SetCanAttack(False)
    #退出钓鱼清除渔夫装
    if curPlayer.GetPlayerAction() == IPY_GameWorld.paGameEvent:
        PlayerGameEvent.StopGameEvent(curPlayer, tick)
    else:
        PlayerGameEvent.TakeoffFishermanEquipment(curPlayer)
    #切地图要清除的buff
    __CheckClearBuffOnMapChange(curPlayer, tick)
            
    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)
@@ -1470,13 +1142,18 @@
        
        #锁住玩家, 等到读取地图成功, 再解锁
        curPlayer.SetCanMove(False)
        #登陆发图形验证码
        PlayerAutoCheckOnline.PlayerLoginCaptcha(curPlayer, tick)
        curPlayer.SendToBServerServerInitOK()   #通知route登录成功 ,route向客户端发送0109包
        OnAllServerInitOK(curPlayer, tick)
        #到此处已经可以保存数据,即使客户端不回包断线
        #原 //01 07 地图读取OK#tagCInitMapOK 逻辑 直接调用
        __Func_LoadMapOK(index, tick)
        GameServerRefresh.GameSever_PlayerInitOK(index, tick)
    except:
        curPlayer.Kick(IPY_GameWorld.disWaitForPlayerLoinError)
        import traceback
        GameWorld.RaiseException("玩家上线逻辑错误\r\n%s" % traceback.format_exc())
    return
    
    
@@ -1524,25 +1201,7 @@
#    ------------------------------------------------------
    #玩家切换地图成功, 初始化玩家的附加信息(骠车, 召唤兽)
    curPlayer.InitChangeMapPlayerSummonInfo()
    #通知GameServer骠车现在的地图位置
    curTruck = curPlayer.GetTruck()
    if curTruck != None:
        curTruck.GameServer_Sync_TruckMapID()
        #镖车无敌
        SkillCommon.AddBuffBySkillType_NoRefurbish(curTruck, ChConfig.Def_SkillID_LimitSuperBuff, tick)
    
        #设置镖车等级
        truckLv = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PawnTruckLV)
        curTruck.SetLV(truckLv)
        #更改镖车记录的部分主人信息
        PlayerTruck.ChangeTruckNoteInfo(curPlayer)
        #更新镖车进排行榜
        PlayerBillboard.UpdateBillboardPlayerTruck(curPlayer.GetPlayerID(), curPlayer.GetName(), curPlayer.GetOperateInfo(),
                                                   curPlayer.GetLV(), truckLv, curPlayer.GetMapID())
    #---初始化自己的召唤兽---
    #===========================================================================
    # for i in range(curPlayer.GetSummonCount()):
@@ -1562,7 +1221,7 @@
    PetControl.Sync_PetInfo_ChangeMap(curPlayer, tick)
    #通知GameServer自己现在的地图
    curPlayer.Sync_GameServer_MapID()
    #curPlayer.Sync_GameServer_MapID()
    
    #如果本地图是副本的话, 则通知GameServer玩家进入副本
    if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtTeam:
@@ -1581,54 +1240,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
#---------------------------------------------------------------------
@@ -1676,16 +1344,6 @@
#@param tick 时间戳
#@return 返回值无意义
#@remarks C++封包触发, 切换地图成功( 目标地图 )
def LoadMapOK(index, tick):
    GameWorld.GetPsycoFunc(__Func_LoadMapOK)(index, tick)
    return
#---------------------------------------------------------------------
##C++封包触发, 切换地图成功( 目标地图 )
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks C++封包触发, 切换地图成功( 目标地图 )
def __Func_LoadMapOK(index, tick):
    #在玩家切换场景/登录的时候, 会调用到这里, 地图读取成功
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
@@ -1721,26 +1379,29 @@
    GameWorld.Log("地图读取成功" , curPlayer.GetPlayerID())
    
    #通知GameServer切换地图停止
    curPlayer.GameServer_SetLoadMapState(1)
    #curPlayer.GameServer_SetLoadMapState(1)
    curPlayer.SetMapLoadOK(True)
    
    #将玩家放置在这个地图上
    curPlayer.InitPos(curPlayer.GetPosX(), curPlayer.GetPosY())
    
    firstMission = QuestCommon.GetCommonMission(curPlayer)
    if not (firstMission and firstMission.GetProperty(QuestCommon.Def_NewGuyNoSight) == 1):
        #刷新自己的视野
        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)
    #卡牌改为0视野
    if curPlayer.GetSightLevel() != curPlayer.GetID():
        PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
    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)
        
    #如果玩家hp为0,设置玩家为死亡状态
    if GameObj.GetHP(curPlayer) <= 0:
@@ -1788,15 +1449,7 @@
        #=======================================================================
            #此时已经是下马状态不需要刷状态 但是需要通知客户端下马
            PlayerHorse.PlayerRideHorseDown(curPlayer, False)
    elif playerVehicle == IPY_GameWorld.pvTruck:
        #玩家上骠车, 不重置自己的位置, 因为玩家现在还在切换地图中(强制上车,因为有可能被攻击)
        PlayerTruck.PlayerTruckUP(curPlayer, False , False , False)
    InitPlayerTruck(curPlayer, tick)
    PlayerTeam.PlayerLoginSetTeam(curPlayer, tick)
    #激活玩家(保证持续性Buff处理间隔)
    PlayerControl.SetIsNeedProcess(curPlayer, True)
@@ -1805,12 +1458,6 @@
    
    #如果登录的副本,执行进入副本逻辑, 因为有时间响应, 必须在EndLoadMap之后...
    FBLogic.DoEnterFBLogic(curPlayer, tick)
    #触发玩家进入地图的事件
    EventShell.EventResponse_OnMap(curPlayer)
    #触发玩家进入地图的事件
    EventShell.EventResponse_OnMapEx(curPlayer)
    
    #触发切换地图宠物逻辑
    PetControl.DoLogic_PetLoadMapOK(curPlayer)
@@ -1851,16 +1498,6 @@
    #申请得到奖励物品
    #curPlayer.DataServer_CheckPrizeItem()
    
    #===========================================================================
    # #if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_Frist_Lock) == 1 \
    # if PlayerAutoCheckOnline.CheckBeginEvent(curPlayer):
    #    #防外挂锁定
    #    #玩家第一次进入, 触发了OnEnter, OnEnter会锁住玩家
    #    #但是在上面会解锁玩家
    #    #所以在这里强制判定, 如果触发了OnEnter, 那么在这里加锁
    #    curPlayer.BeginEvent()
    #===========================================================================
    #防止玩家读取地图时未触发OnDay,读取地图后再次验证(2009.9.11)
    PlayerEventCounter.UpdatePlayerLoginTime(curPlayer)
    
@@ -1871,13 +1508,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:
@@ -1887,7 +1518,6 @@
    
    PassiveBuffEffMng.OnLoadMapGFPassive(curPlayer)
    PlayerYinji.OnLoadMap(curPlayer)
    ItemControler.PlayerItemControler(curPlayer).RefreshStartEquipCount()   # 刷新装备珍品星级
    
    #EndLoadMap需放在最后, 0403 tagPlayerLoginLoadOK
    curPlayer.EndLoadMap()
@@ -1941,76 +1571,6 @@
    curPlayer.Kick(IPY_GameWorld.disGMKick)
    return
#---------------------------------------------------------------------
##初始化玩家镖车
#@param curPlayer 玩家实例
#@param tick 时间戳
#@return 返回值无意义
#@remarks 初始化玩家镖车
def InitPlayerTruck(curPlayer, tick):
    curPlayer.SetTruckCalcStartTime(tick)
    #玩家骠车逻辑:
    #玩家如果有骠车:
    #1. 在本地图找寻自己的骠车
    #2. 如果没有找到, 发给GameServer要求自己骠车
    truckID = curPlayer.GetTruckID()
    GameWorld.Log("初始化骠车 ID = %d ..." % (truckID) , curPlayer.GetPlayerID())
    if truckID == 0:
        #2009.9.24 bug
        #玩家没有镖车ID, 但是有镖车状态, 强制改为0
        if curPlayer.GetTruckState() != 0:
            GameWorld.Log("###Fix Truck State!", curPlayer.GetPlayerID())
            curPlayer.SetTruckState(0)
        return
    #通知gameserver刷新自己的骠车
    curPlayer.GameServer_RefreshTruckReq()
    GameWorld.Log("通知gameserver刷新自己的骠车 id = %d" % (truckID) , curPlayer.GetPlayerID())
    curTruck = GameWorld.GetNPCManager().FindTruckByID(truckID)
    if not curTruck:
        return
    curPlayer.SetTruck(curTruck)
    #这句话一定要加, 用来通知客户端骠车开始, 显示骠车操控面板
    curPlayer.SetTruckID(curTruck.GetID())
    curTruck.SetOwner(curPlayer)
#    GameWorld.Log("玩家已有骠车" , curPlayer.GetPlayerID())
#===============================================================================
# #加经验值
# def AddExp(index, tick):
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#    sendTest = IPY_GameWorld.IPY_CSendTest()
#    addExp = sendTest.GetExp()
#    playerControl = PlayerControl.PlayerControl(curPlayer)
#    playerControl.AddExp(addExp,True)
#===============================================================================
#---------------------------------------------------------------------
#===============================================================================
# //03 01 加属性点#tagCAddPoint
# tagCAddPoint       *   GettagCAddPoint();
#
# class   IPY_CAddPoint
# {
# public:
#    //0:力量 1:精神 2:敏捷 3:体魄 4:智力 5:幸运
#    int      GetType();
#
#    int      GetPoint();
# };
#===============================================================================
##//03 01 加属性点#tagCAddPoint
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks //03 01 加属性点#tagCAddPoint
def AddPoint(index, tick):
    return
#// B2 06 玩家加点 #tagCMAddPoint
#
#struct    tagCMAddPoint
@@ -2049,8 +1609,7 @@
    NotifyPlayerBasePoint(curPlayer, pointAttrIDList)
    playerControl = PlayerControl.PlayerControl(curPlayer)
    playerControl.RefreshPlayerAttrState()
    EventShell.EventRespons_AddPoint(curPlayer)
    PlayerControl.SetLingGenMaxIndex(curPlayer)
    #PlayerControl.SetLingGenMaxIndex(curPlayer)
    return
#// B2 07 重置加点 #tagCMResetAttrPoint
@@ -2106,8 +1665,6 @@
        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=[]):
@@ -2300,10 +1857,6 @@
        curPlayer.ResetPos(curPlayer.GetPosX(), curPlayer.GetPosY())
        return
    
    #如果是小游戏中则停止小游戏
    if curPlayer.GetPlayerAction() == IPY_GameWorld.paGameEvent:
        PlayerGameEvent.StopGameEvent(curPlayer, tick)
    #删除有限无敌BUFF
    PlayerControl.DelLimitSuperBuff(curPlayer, tick)
    
@@ -2323,125 +1876,6 @@
    PetControl.FightPetFollowMove(curPlayer, sendPack_StartX, sendPack_StartY)
    
    
    return
#---------------------------------------------------------------------
#===============================================================================
# //05 01玩家移动#tagCPlayerMove
# tagCPlayerMove       *   GettagCPlayerMove();
#
# class   IPY_CPlayerMove
# {
# public:
#
#    int      GetStartX();
#
#    int      GetStartY();
#
#    int      GetDestX();
#
#    int      GetDestY();
#
#    int      GetWorldTick();
# };
#===============================================================================
##客户端封包响应//05 01玩家移动#tagCPlayerMove
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应//05 01玩家移动#tagCPlayerMove
def PlayerMove(index, tick):
    GameWorld.GetPsycoFunc(__Func_PlayerMove)(index, tick)
    return
##客户端封包响应//05 01玩家移动#tagCPlayerMove
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应//05 01玩家移动#tagCPlayerMove
def __Func_PlayerMove(index, tick):
    return
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    #防外挂 不可移动
    if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_AutoCheckHack_State) \
                                      == ChConfig.Def_AutoCheck_State_Danger:
        return
    #不可移动行为状态, 判断客户端限制
    if not OperControlManager.IsObjCanDoAction(
                                        curPlayer,
                                        ChConfig.Def_Obj_ActState_ServerAct,
                                        IPY_GameWorld.oalMove
                                        ):
        return False
    #玩家移动通用检查
    if not __CheckPlayerCanMove(curPlayer):
        return
    #封包参数
    sendPack = IPY_GameWorld.IPY_CPlayerMove()
    sendPack_StartX = sendPack.GetStartX()
    sendPack_StartY = sendPack.GetStartY()
    sendPack_DestX = sendPack.GetDestX()
    sendPack_DestY = sendPack.GetDestY()
    sendPack_WorldTick = sendPack.GetWorldTick()
    #先验证目标点是否合法
    if not GameWorld.GetMap().CanMove(sendPack_DestX, sendPack_DestY):
        return
    #相同点不移动
    if (sendPack_StartX == sendPack_DestX) and (sendPack_StartY == sendPack_DestY):
        #GameWorld.ErrLog('PlayerMove 相同点不移动', curPlayer.GetID())
        return
    #---副本地图移动检查---
    if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
        if not FBLogic.DoFBCanMove(curPlayer, sendPack_DestX, sendPack_DestY, tick):
            return
    #---正常移动---
    vehicle = curPlayer.GetPlayerVehicle()
    if vehicle not in [IPY_GameWorld.pvNull, IPY_GameWorld.pvHorse]:
        #GameWorld.ErrLog("不能移动, 交通工具不明 %d" % (vehicle), curPlayer.GetID())
        return
    #玩家正常移动
    PlayerNormalMove(curPlayer, sendPack_StartX, sendPack_StartY, sendPack_DestX,
                     sendPack_DestY, sendPack_WorldTick, tick)
#===============================================================================
#    attackTime = tick - curPlayer.GetPlayerAttackTick()
#    if attackTime <= curPlayer.GetAtkInterval() / 2:
#        #玩家攻击在僵直时间中, 不能走路
#        #GameWorld.Log("玩家攻击在僵直时间中, 不能走路 %d" %(attackTime) , curPlayer.GetPlayerID())
#        return
#===============================================================================
#===============================================================================
#    #玩家骑乘状态
#    vehicle = curPlayer.GetPlayerVehicle()
#
#    #如果在骑马状态,需要判定特殊坐骑
#    if vehicle == IPY_GameWorld.pvHorse and not __CheckHorseCanMove( curPlayer ):
#        __DoLogic_DropHorse( curPlayer , tick )
#        return
#
#    #玩家正常移动
#    if vehicle == IPY_GameWorld.pvNull or vehicle == IPY_GameWorld.pvHorse:
#        #玩家正常移动
#        PlayerNormalMove(curPlayer , moveData)
#    elif curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvTruck :
#        #人镖合一,玩家移动
#        PlayerMoveByCarryerTruck(curPlayer , moveData)
#    else:
#        GameWorld.Log("不能移动, 交通工具不明 %d"%(vehicle) , curPlayer.GetPlayerID())
#===============================================================================
    return
#---------------------------------------------------------------------
@@ -2496,11 +1930,6 @@
                     client_DestY, clientWorldTick, tick) :
    # 废弃改成PY移动
    return
    #如果玩家事件中, 退出任务
#    if curPlayer.GetPlayerAction() == IPY_GameWorld.paEvent:
#        EventShell.DoExitEvent(curPlayer)
    curMap = GameWorld.GetMap()
    #校验客户端时间
    if not PlayerControl.PlayerMoveCheckClientWorldTick(curPlayer, clientWorldTick, client_StartX, client_StartY):
@@ -2511,14 +1940,6 @@
    if not CheckMovePos(curPlayer, curPlayer, curMap, client_StartX, client_StartY, client_DestX, client_DestY):
        return
    
    #假设客户端都是正确的,可行走障碍点
    #if PlayerControl.DoLogic_PlayerInBarrierPoint(curPlayer):
    #    return
    #如果是小游戏中则停止小游戏
    if curPlayer.GetPlayerAction() == IPY_GameWorld.paGameEvent:
        PlayerGameEvent.StopGameEvent(curPlayer, tick)
    #2010/04/30 移动修改为全C++控制, Python状态机设置为空闲(清空采集等状态)
    PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paNull)
    #删除有限无敌BUFF
@@ -2533,40 +1954,6 @@
    #PetControl.FightPetFollowMove(curPlayer, client_DestX, client_DestY, client_StartX, client_StartY)
    return
#---------------------------------------------------------------------
##人镖合一,玩家移动
#@param curPlayer 玩家实例
#@param moveData 移动封包
#@return 返回值无意义
#@remarks 人镖合一,玩家移动
#===============================================================================
# def PlayerMoveByCarryerTruck(curPlayer , moveData) :
#    curPlayerTruck = curPlayer.GetTruck()
#    curMap = GameWorld.GetMap()
#
#    #不可移动行为状态, 服务端限制
#    if not OperControlManager.IsObjCanDoAction(curPlayerTruck,
#                                               ChConfig.Def_Obj_ActState_ServerAct,
#                                               IPY_GameWorld.oalMove):
#        return
#
#
#    if curPlayerTruck == None:
#        #离开人镖合一状态
#        GameWorld.Log("离开人镖合一状态" , curPlayer.GetPlayerID())
#        return
#
#    if CheckMovePos(curPlayer, curPlayerTruck, curMap, moveData.GetStartX(), moveData.GetStartY(), moveData.GetDestX(), moveData.GetDestY()) != True :
#        return
#
#    #镖车移动
#    #curPlayer.SetSpeed(curPlayerTruck.GetSpeed())
#    curPlayerTruck.Move(moveData.GetDestX(), moveData.GetDestY())
#    curPlayer.Sync_Move(moveData.GetDestX(), moveData.GetDestY())
#    return
#===============================================================================
#---------------------------------------------------------------------
##移动点检查, checkObj 是移动对象(在人镖合一状态下, 输入为骠车
#@param curPlayer 玩家实例
#@param checkObj 移动对象
@@ -2612,151 +1999,8 @@
            
        return False
    
#===============================================================================
#   考虑到会不同步的问题, 不加这个判定
#    #检查目标点上,是否有对象,有不让移动
#    mapObj = GameWorld.GetMap().GetPosObj(destX, destY)
#
#    if not mapObj:
#        return
#
#    for i in range(0, mapObj.GetObjCount()):
#        curObj = mapObj.GetObjByIndex(i)
#        #只有一种情况特殊:死亡的NPC可以让玩家走过去
#        if curObj.GetGameObjType() == IPY_GameWorld.gotNPC and \
#           GameObj.GetHP(curObj) <= 0 :
#            continue
#        curPlayer.MoveFail()
#        GameWorld.Log("移动失败,目标点有玩家或者NPC")
#        return
#===============================================================================
    #检查玩家到目的地2点之间是否可以直接走
    #===========================================================================
    # if moveDist > 15 and (not curMap.CanLineTo(destX, destY, objPosX, objPosY) \
    #        and not curMap.CanLineTo(objPosX, objPosY, destX, destY)):
    #
    #    #正反方向有一点不可走, 则不可走
    #    #GameWorld.Log("移动失败,检查玩家到目的地2点之间是否可以直接走(%d,%d)->(%d,%d), ClientCurPos:(%d,%d)"%(
    #    #                                            objPosX, objPosY,destX, destY,startX,startY ) , curPlayer.GetPlayerID())
    #    #地方不可走
    #    if sendPlayerMoveFail:
    #        curPlayer.MoveFail()
    #
    #    return False
    #===========================================================================
    return True
#---------------------------------------------------------------------
#===============================================================================
# //05 02 玩家停止移动#tagCPlayerStopMove
# tagCPlayerStopMove       *   GettagCPlayerStopMove();
#
# class   IPY_CPlayerStopMove
# {
# public:
#
#    int      GetPosX();
#
#    int      GetPosY();
#
#    int      GetDir();
#
#    int      GetWorldTick();
# };
#===============================================================================
##客户端封包响应 //05 02 玩家停止移动#tagCPlayerStopMove
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //05 02 玩家停止移动#tagCPlayerStopMove
def PlayerStopMove(index, tick):
    GameWorld.GetPsycoFunc(__Func_PlayerStopMove)(index, tick)
    return
##客户端封包响应 //05 02 玩家停止移动#tagCPlayerStopMove
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //05 02 玩家停止移动#tagCPlayerStopMove
def __Func_PlayerStopMove(index, tick):
    #===========================================================================
    # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    #
    # #获取封包参数
    # sendPack = IPY_GameWorld.IPY_CPlayerStopMove()
    # sendPack_Tick = sendPack.GetWorldTick()
    # sendPack_PosX = sendPack.GetPosX()
    # sendPack_PosY = sendPack.GetPosY()
    # sendPack_Dir = sendPack.GetDir()
    #
    # #交通工具
    # vehicle = curPlayer.GetPlayerVehicle()
    #
    # #玩家停止移动
    # if curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvNull or vehicle == IPY_GameWorld.pvHorse:
    #    PlayerNormalStopMove(curPlayer, sendPack_Tick, sendPack_PosX, sendPack_PosY, sendPack_Dir)
    #
    # #人镖合一停止移动
    # elif vehicle == IPY_GameWorld.pvTruck :
    #    #人镖合一停止移动
    #    PlayerStopMoveByCarryTruck(curPlayer, sendPack_Tick, sendPack_PosX, sendPack_PosY)
    #
    # else:
    #    GameWorld.Log("不能移动, 交通工具不明%d" % (vehicle) , curPlayer.GetPlayerID())
    #===========================================================================
    return
#---------------------------------------------------------------------
##玩家停止移动
#@param curPlayer 玩家实例
#@param sendPack_Tick 时间戳
#@param sendPack_PosX 目标X坐标
#@param sendPack_PosY 目标Y坐标
#@param sendPack_Dir 面向
#@return 返回值无意义
#@remarks 自定义函数 玩家停止移动
#===============================================================================
# def PlayerNormalStopMove(curPlayer, sendPack_Tick, sendPack_PosX, sendPack_PosY, sendPack_Dir) :
#    #玩家停止移动检查
#    if CheckPlayerStopMove(curPlayer) != True :
#        return
#
#    if not PlayerControl.PlayerMoveCheckClientWorldTick(curPlayer, sendPack_Tick, sendPack_PosX, sendPack_PosY):
#        return
#
#    if PlayerControl.PlayerRefreshPos(curPlayer, curPlayer, sendPack_PosX, sendPack_PosY) != True:
#        return
#
#    #curPlayer.SetFaceDir(sendPack_Dir)
#    curPlayer.StopMove()
#    return True
#
# #---------------------------------------------------------------------
# ##人镖合一停止移动
# #@param curPlayer 玩家实例
# #@param sendPack_Tick 时间戳
# #@return 返回值无意义
# #@remarks 自定义函数 人镖合一停止移动
# def PlayerStopMoveByCarryTruck(curPlayer, clientWorldTick, sendPack_PosX, sendPack_PosY):
#    curPlayerTruck = curPlayer.GetTruck()
#    if curPlayerTruck == None:
#        GameWorld.Log("人镖合一停止移动 -> 没有骠车!" , curPlayer.GetPlayerID())
#        return
#
#    if curPlayerTruck.GetCurAction() != IPY_GameWorld.laNPCMove :
#        return
#
#    if not PlayerControl.PlayerMoveCheckClientWorldTick(curPlayer, clientWorldTick, sendPack_PosX, sendPack_PosY):
#        return
#
#    curPlayerTruck.StopMove()
#    return True
#===============================================================================
#---------------------------------------------------------------------
#===============================================================================
# //03 05主角点击复活#tagCCliectReborn
# tagCCliectReborn       *   GettagCCliectReborn();
@@ -2866,209 +2110,6 @@
    return
#---------------------------------------------------------------------
#===============================================================================
# //04 01 获取区域内对象信息#tagCAreaObjInfo
# tagCAreaObjInfo       *   GettagCAreaObjInfo();
#
# class   IPY_CAreaObjInfo
# {
# public:
#
#    int      GetObjType();
#
#    int      GetObjID();
# };
#===============================================================================
##//04 01 获取区域内对象信息#tagCAreaObjInfo
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks //04 01 获取区域内对象信息#tagCAreaObjInfo
def PlayerNeedSeeOther(index, tick):
    #现在改为, 直接发送信息给客户端, 这个封包不处理了
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#    sendReq = IPY_GameWorld.IPY_CAreaObjInfo()
#    tagObj = GameWorld.GetObj(sendReq.GetObjID(), sendReq.GetObjType())
#
#    if tagObj == None:
#        GameWorld.Log("玩家请求其他玩家的相貌信息失败, 对象不存在")
#        return
#
#    if GameWorld.IsSameObj(curPlayer, tagObj):
#        #自己不能得到自己的信息
#        return
#
#    dist = GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), tagObj.GetPosX(), tagObj.GetPosY())
#    #对象在自己两倍视野外面, 则拒绝
#    if dist > curPlayer.GetSight() * 2:
#        #目标玩家在视野外面
#        GameWorld.Log("玩家请求其他玩家的相貌信息失败,目标玩家在视野外面 %d" % dist)
#        curPlayer.Sync_GetPlayerInfoFail(sendReq.GetObjID())
#        return
#
#    if tagObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
#        return
#    curPlayer.SeeOtherPlayer(tagObj)
    return
#---------------------------------------------------------------------
#===============================================================================
# //04 02 获取鼠标左键点击之后对象的详细信息#tagCClickObjGetInfo
# tagCClickObjGetInfo       *   GettagCClickObjGetInfo();
#
# class   IPY_CClickObjGetInfo
# {
# public:
#
#    int      GetObjID();
#
#    int      GetObjType();
# };
#===============================================================================
##客户端封包响应//04 02 获取鼠标左键点击之后对象的详细信息#tagCClickObjGetInfo
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应//04 02 获取鼠标左键点击之后对象的详细信息#tagCClickObjGetInfo
def PlayerClickOtherPlayerGetInfo(index, tick):
    GameWorld.GetPsycoFunc(__Func_PlayerClickOtherPlayerGetInfo)(index, tick)
    return
##客户端封包响应//04 02 获取鼠标左键点击之后对象的详细信息#tagCClickObjGetInfo
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应//04 02 获取鼠标左键点击之后对象的详细信息#tagCClickObjGetInfo
def __Func_PlayerClickOtherPlayerGetInfo(index, tick):
    #===========================================================================
    # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    #
    # sendPack = IPY_GameWorld.IPY_CClickObjGetInfo()
    # sendPack_ID = sendPack.GetObjID()
    # sendPack_Type = sendPack.GetObjType()
    #
    # tagObj = GameWorld.GetObj(sendPack_ID, sendPack_Type)
    #
    # if tagObj == None:
    #    #GameWorld.Log("玩家请求其他玩家的相貌信息失败, 对象不存在", curPlayer.GetPlayerID())
    #    return
    #
    # dist = GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), tagObj.GetPosX(), tagObj.GetPosY())
    # #是否可以目标详细信息
    # canGetDetail = (dist <= curPlayer.GetSight())
    # #目标类型
    # tagObjType = tagObj.GetGameObjType()
    #
    # #仅处理Player和NPC
    # if tagObjType not in [IPY_GameWorld.gotPlayer, IPY_GameWorld.gotNPC]:
    #    return
    #
    # #---玩家处理---
    # if tagObjType == IPY_GameWorld.gotPlayer:
    #    #获取玩家详细信息成功
    #    if canGetDetail:
    #        extendDataDict = {}
    #        extendDataDict['maxHP'] = GameObj.GetMaxHP(tagObj)
    #        extendDataDict['maxMP'] = tagObj.GetMaxMP()
    #        extendDataDict['hit'] = tagObj.GetHit()
    #        extendDataDict['miss'] = tagObj.GetMiss()
    #        extendDataDict['atkSpeed'] = PlayerControl.GetAtkSpeed(tagObj)
    #        extendDataDict['superHitRate'] = tagObj.GetSuperHitRate()
    #        extendDataDict['superHit'] = tagObj.GetSuperHit()
    #        extendDataDict['luckyHitRate'] = tagObj.GetLuckyHitRate()
    #        extendDataDict['greatHitRate'] = tagObj.GetGreatHitRate()
    #        extendDataDict['ignoreDefRate'] = tagObj.GetIgnoreDefRate()
    #        extendDataDict['damageReduceRate'] = tagObj.GetDamageReduceRate()
    #        extendDataDict['damageBackRate'] = tagObj.GetDamageBackRate()
    #
    #        extendData = str(extendDataDict)
    #        extendDataLen = len(extendData)
    #        curPlayer.PlayerClickOtherPlayerDetail(tagObj, extendDataLen, extendData)
    #        return
    #
    #    #获取玩家详细信息失败
    #    curPlayer.Sync_GetPlayerInfoFail(sendPack_ID)
    #    return
    #
    # #---NPC处理---
    #
    # #获取NPC详细信息成功
    # if canGetDetail:
    #    curPlayer.PlayerClickOtherNPCDetail(tagObj)
    #    return
    #
    #===========================================================================
    #获取NPC详细信息失败
    #暂不处理
    return
#---------------------------------------------------------------------
#===============================================================================
# //03 02 玩家坐下/站立#tagCSit
# tagCSit       *   GettagCSit();
#
# class   IPY_CSit
# {
# public:
#    //0:坐下 1:站立
#    int      GetType();
# };
#===============================================================================
##客户端封包响应 //03 02 玩家坐下/站立#tagCSit
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 02 玩家坐下/站立#tagCSit
def PlayerSit(index, tick):
    GameWorld.DebugLog("PlayerSit...")
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    #功能开启判断换成
    #GameFuncComm.GetFuncCanUse(curPlayer, funcID)
    #功能开启判断换成
    #GameFuncComm.GetFuncCanUse(curPlayer, funcID)
    if GameObj.GetHP(curPlayer) <= 0:
        return
    sendPack = IPY_GameWorld.IPY_CSit()
    setType = sendPack.GetType()
    if setType == 1: #手游版 只做站立
        PlayerControl.DoPlayerStand(curPlayer)
    return
    if curPlayer.IsMoving():
        PlayerControl.NotifyCode(curPlayer, "CanNotSitWrongState")
        return
    #在交通工具中, 不可打坐
    if curPlayer.GetPlayerVehicle() != IPY_GameWorld.pvNull:
        return
    #打坐行为,客户端限制
    if not OperControlManager.IsObjCanDoAction(curPlayer,
                                               ChConfig.Def_Obj_ActState_ServerAct,
                                               IPY_GameWorld.oalSit):
        return
    #设置回血/回魔开始标示位
    curPlayer.SetRestoreTime(tick)
    #获得封包
    sendPack = IPY_GameWorld.IPY_CSit()
    setType = sendPack.GetType()
    playAction = curPlayer.GetPlayerAction()
    #---想坐下---
    if setType == 0 and playAction == IPY_GameWorld.paNull:
        PlayerControl.DoPlayerSit(curPlayer, tick)
        return
    #---想站起来---
    PlayerControl.DoPlayerStand(curPlayer)
    return
#---------------------------------------------------------------------
##C++封包触发, 玩家下线
#@param index 玩家索引
#@param tick 时间戳
@@ -3077,28 +2118,6 @@
def PlayerDisconnect(index, tick):
    GameWorld.GetPsycoFunc(__Func_PlayerDisconnect)(index, tick)
    return
#---------------------------------------------------------------------
##记录新增有效登陆玩家,登陆10分钟以上玩家才算有效
# @param curPlayer 玩家实例
# @return None
def NoteLoginValid(curPlayer):
    if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_LoginValid) == 1:
        #已记录
        return
    #计算时间, 当前减去登陆时间
    diffTime = GameWorld.GetCurrentTime() - GameWorld.GetDateTimeByStr(curPlayer.GetLoginTime().strip())
    #10分钟以上才算有效玩家
    if diffTime.days == 0 and diffTime.seconds < 10 * 60:
        return
    DataRecordPack.DR_LoginValid(curPlayer.GetAccID(), curPlayer.GetIP(), curPlayer)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_LoginValid, 1)
    return
##C++封包触发, 玩家下线
#@param index 玩家索引
@@ -3113,10 +2132,19 @@
    except:
        import traceback
        GameWorld.RaiseException("玩家下线逻辑错误\r\n%s" % traceback.format_exc())
    RecvPackToMapDB.MapCallDB(GetPackSaveData(curPlayer))
    #调用底层使玩家下线
    curPlayer.DoDisconnect(tick)
    
# 简化c++的保存数据封包
def GetPackSaveData(curPlayer):
    roleSaveData = base64.b64decode(curPlayer.GetPackData())  # base64加密了
    allData = ""
    allData = CommFunc.WriteBYTE(allData, IPY_ServerDefine.gstUpdate)
    allData = CommFunc.WriteString(allData, len(roleSaveData), roleSaveData)
    return  allData
##玩家正常下线
#@param curPlayer 玩家索引
#@param tick 时间戳
@@ -3139,11 +2167,6 @@
    #流向记录玩家下线
    DataRecordPack.DR_PlayerDisconnect(curPlayer)
    
    #记录新增有效登陆玩家
    NoteLoginValid(curPlayer)
    #VIP时间
    #PlayerVip.CalcVIPTimeByTick(curPlayer, tick, False)
    #在线时间
    PlayerOnlinePrize.CalcOnlineTime(curPlayer)
    #首充提示时间
@@ -3163,18 +2186,16 @@
    #设置RouteServerInitOK字典
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RouteServerInitOK, 0)
    
    #取消自动运镖状态
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_AutoTruck, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PlayerKey_CrossRegisterMap, 0)
    
    #下线召回宠物
    PetControl.ReCallFightPet(curPlayer)
    
    #PlayerTJG.CalcPlayerTJG(curPlayer, tick)
    #离线session
    EventReport.WriteEvent_session(curPlayer)
    #需放最后
    PlayerOnline.OnPlayerLogoff(curPlayer)
    return
#---------------------------------------------------------------------
@@ -3311,36 +2332,6 @@
    NetPackCommon.SendFakePack(curPlayer, showGuide)
    return
#---------------------------------------------------------------------
#===============================================================================
# //05 03 玩家跳跃#tagCJump
# tagCJump       *   GettagCJump();
#
# class   IPY_CJump
# {
# public:
#
#    int      GetSkillID();
#
#    int      GetStartPosX();
#
#    int      GetStartPosY();
#
#    int      GetEndPosX();
#
#    int      GetEndPosY();
# };
#===============================================================================
##客户端封包响应 //05 03 玩家跳跃#tagCJump
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //05 03 玩家跳跃#tagCJump
def PlayerJump(index, tick):
    #没这个功能了
    return
## 玩家状态变更
#  @param index 玩家索引
#  @param tick 当前时间
@@ -3356,9 +2347,6 @@
    if lastAction == curAction:
        return
    
    #如果上一个状态是小游戏状态
    if lastAction == IPY_GameWorld.paGameEvent:
        PlayerGameEvent.TakeoffFishermanEquipment(curPlayer)
    return
#---------------------------------------------------------------------
@@ -3424,117 +2412,7 @@
        
    return
#---------------------------------------------------------------------
#===============================================================================
# //03 0B 设置金钱类型#tagCSetMoneyType
# tagCSetMoneyType       *   GettagCSetMoneyType();
#
# class   IPY_CSetMoneyType
# {
# public:
#    //1:金子/金票    2:银子/银票
#    int      GetType();
#    //TMoneyType
#    int      GetMoneyType();
# };
#===============================================================================
##客户端封包响应 //03 0B 设置金钱类型#tagCSetMoneyType
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 0B 设置金钱类型#tagCSetMoneyType
def SetMoneyType(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    sendPack = IPY_GameWorld.IPY_CSetMoneyType()
    curType = sendPack.GetType()
    curMoneyType = sendPack.GetMoneyType()
    if curType == 1 and curMoneyType == IPY_GameWorld.TYPE_Price_Gold_Money :
        curPlayer.SetUseGoldType(IPY_GameWorld.TYPE_Price_Gold_Money)
    elif curType == 1 and curMoneyType == IPY_GameWorld.TYPE_Price_Gold_Paper :
        curPlayer.SetUseGoldType(IPY_GameWorld.TYPE_Price_Gold_Paper)
    elif curType == 2 and curMoneyType == IPY_GameWorld.TYPE_Price_Silver_Money :
        curPlayer.SetUseSilverType(IPY_GameWorld.TYPE_Price_Silver_Money)
    elif curType == 2 and curMoneyType == IPY_GameWorld.TYPE_Price_Silver_Paper :
        curPlayer.SetUseSilverType(IPY_GameWorld.TYPE_Price_Silver_Paper)
    else:
        GameWorld.Log("SetMoneyType = > 金钱类型 = %s错误" % (curType) , curPlayer.GetPlayerID())
        return
    return
#---------------------------------------------------------------------
#===============================================================================
# //03 08 打开大地图#tagCOpenMap
# tagCOpenMap       *   GettagCOpenMap();
#
# class   IPY_COpenMap
# {
# public:
#
#    int      GetType();
# };
#===============================================================================
##客户端封包响应 //03 08 打开大地图#tagCOpenMap
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 08 打开大地图#tagCOpenMap
def PlayerMapInfo(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    if tick - curPlayer.GetPosInfoTick() < ChConfig.Def_GetOtherPosInterval:
        return
    curPlayer.SetPosInfoTick(tick)
    #队伍信息同步
    PlayerTeam.NotifyPosInfoToPlayer(curPlayer, tick)
    #骠车信息同步
    PlayerTruck.NotifyPosInfoToPlayer(curPlayer, tick)
    #通知大地图标记点数量
    OnSendMapSignCnt(curPlayer)
    return
#---------------------------------------------------------------------
#===============================================================================
# //03 0A 更改攻击模式#tagCChangeAttackMode
# tagCChangeAttackMode       *   GettagCChangeAttackMode();
#
# class   IPY_CChangeAttackMode
# {
# public:
#    //TAttackMode
#    int      GetMode();
# };
#===============================================================================
##客户端封包响应 //03 0A 更改攻击模式#tagCChangeAttackMode
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 0A 更改攻击模式#tagCChangeAttackMode
def PlayerChangeAttackMode(index, tick) :
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    sendPack = IPY_GameWorld.IPY_CChangeAttackMode()
    sendPackMode = sendPack.GetMode()
    #不可切换模式的地图
    mapID = GameWorld.GetMap().GetMapID()
    if mapID in ChConfig.Def_CanNotChangeAtkModelMap:
        GameWorld.Log("本地图不可切换PK模式,mapID=%s" % (mapID), curPlayer.GetPlayerID())
        return
    #===============================================================================================
    # #只有amPeace和amAll
    # #if sendPackMode < 0 or sendPackMode > IPY_GameWorld.amAll :
    # if sendPackMode not in [IPY_GameWorld.amPeace, IPY_GameWorld.amAll, IPY_GameWorld.amFamily]:
    #    GameWorld.Log("切换攻击模式封包,类型 = %s错误" % (sendPackMode) , curPlayer.GetPlayerID())
    #    return
    #===============================================================================================
    ChangeAttackMode(curPlayer, sendPackMode)
    return
#//03 0A 更改攻击模式#tagCChangeAttackMode
##改变玩家PK模式
#@param curPlayer 玩家
#@param attackMode
@@ -3563,154 +2441,6 @@
    SyncPKModel(curPlayer)
    return
#---------------------------------------------------------------------
#===============================================================================
# //06 06 取消Buff#tagCCancelBuff
# tagCCancelBuff       *   GettagCCancelBuff();
#
# class   IPY_CCancelBuff
# {
# public:
#
#    int      GetBuffID();
# };
#===============================================================================
##客户端封包响应 //06 06 取消Buff#tagCCancelBuff
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //06 06 取消Buff#tagCCancelBuff
def PlayerCancelBuff(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    sendPack = IPY_GameWorld.IPY_CCancelBuff()
    skillID = sendPack.GetBuffID()
    #---查找取消的技能---
    #---清空Buff---
    #@bug 2607: 持续性技能调用DoBuffDisApper, 导致持续性回血Buff, 一次性将剩余的回复量都加上了
    #===========================================================================
    # if buffSkill.GetSkillType() not in ChConfig.Def_LstBuff_List:
    #    BuffSkill.DoBuffDisApper(curPlayer, curPlayerCancelbuff, tick)
    #===========================================================================
    BuffSkill.DelBuffBySkillID(curPlayer, skillID, tick)
    #刷新人物属性
    playerControl = PlayerControl.PlayerControl(curPlayer)
    #刷新所有状态
    playerControl.RefreshPlayerAttrByBuff()
    #GameWorld.Log("玩家取消buff成功,buffTypeID = %s"%(buffSkillTypeID) , curPlayer.GetPlayerID())
    return
#---------------------------------------------------------------------
#===============================================================================
# //03 0C 开始跳舞/钓鱼#tagCStartGameEvent
# tagCStartGameEvent       *   GettagCStartGameEvent();
#
# class   IPY_CStartGameEvent
# {
# public:
#    //游戏事件 Type = TGameEvent
#    int      GetType();
# };
#===============================================================================
##客户端封包响应 //03 0C 开始跳舞/钓鱼#tagCStartGameEvent
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 0C 开始跳舞/钓鱼#tagCStartGameEvent
def StartGameEvent(index, tick):
    GameWorld.GetPsycoFunc(__Func_StartGameEvent)(index, tick)
    return
##客户端封包响应 //03 0C 开始跳舞/钓鱼#tagCStartGameEvent
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 0C 开始跳舞/钓鱼#tagCStartGameEvent
def __Func_StartGameEvent(index, tick):
    #游戏事件 Type = TGameEvent
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    if GameObj.GetHP(curPlayer) == 0:
        #GameWorld.Log("玩家死亡,没有事件")
        return
    sendPack = IPY_GameWorld.IPY_CStartGameEvent()
    eventType = sendPack.GetType()
    #---停止游戏事件---
    if eventType == IPY_GameWorld.geNull:
        PlayerGameEvent.StopGameEvent(curPlayer, tick)
        return
    #2010-5-26 只开启钓鱼,关闭跳舞
    if eventType != IPY_GameWorld.geFish:
        return
    #通过动作获得相应动作位
    curActBit = OperControlManager.GetActBitByAction(ChConfig.Def_ActBit_GameEvent, eventType)
    if curActBit != None:
        #拉进度条中 状态,客户端限制
        if not OperControlManager.IsObjCanDoAction(curPlayer,
                                                   ChConfig.Def_Obj_ActState_ClientAct,
                                                   curActBit):
            return
    #---验证是否可以开始小游戏事件---
    lastShowEventTick = curPlayer.GetGameEventTick()
    if tick - lastShowEventTick < ChConfig.Def_ShowEventTime:
        #GameWorld.Log("事件播放间隔太短")
        return
    #检查是否可以开始小游戏
    if not PlayerGameEvent.CheckCanBeginGameEvent(curPlayer, tick):
        return
    if not PlayerGameEvent.CanProcessGameEvent(curPlayer, eventType, tick):
        #PlayerGameEvent.StopGameEvent(curPlayer,tick)
        return
    #---开始执行小游戏事件---
    #设置玩家当期为游戏事件状态
    PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paGameEvent)
    #设定开始游戏事件
    PlayerGameEvent.StartGameEvent(curPlayer, eventType, tick)
    return
#// B0 50 钓鱼收杆 #tagCMDoFish
#
#struct    tagCMDoFish
#
#{
#    tagHead        Head;
#    BYTE        FishNum;        // 钓鱼编号1~N
#    BYTE        PosIndex;    // 停留位置1~N
#};
## 钓鱼收杆
#  @param curPlayer
#  @return None
#===============================================================================
# def OnDoFish(index, clientData, tick):
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#    if not curPlayer:
#        return
#
#    if curPlayer.GetPlayerAction() != IPY_GameWorld.paGameEvent:
#        GameWorld.DebugLog("非小游戏状态下,不可收杆!", curPlayer.GetPlayerID())
#        return
#
#    if curPlayer.GetPlayerGameEvent() != IPY_GameWorld.geFish:
#        GameWorld.DebugLog("非钓鱼状态下,不可收杆!", curPlayer.GetPlayerID())
#        return
#
#    fishType = clientData.PosIndex
#    PlayerGameEvent.DoFishLogic(curPlayer, fishType)
#    return
#===============================================================================
#===============================================================================
# //A1 03 设置是否成年 #tagCMAdult
@@ -3727,59 +2457,6 @@
    curPlayer.ChangeAdult(adult)
    return
#---------------------------------------------------------------------
#===============================================================================
# //03 0D 玩家自定义动作#tagCShowFace
# tagCShowFace       *   GettagCShowFace();
#
# class   IPY_CShowFace
# {
# public:
#    //表情类型, 客户端自定, 服务器广播这个Type
#    int      GetType();
# };
#===============================================================================
##客户端封包响应 //03 0D 玩家自定义动作#tagCShowFace
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 0D 玩家自定义动作#tagCShowFace
def ShowFace(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    if tick - curPlayer.GetShowFaceTick() < ChConfig.Def_ShowEventTime:
        return
    if GameObj.GetHP(curPlayer) <= 0:
        return
    #表情行为, 客户端限制
    if not OperControlManager.IsObjCanDoAction(curPlayer,
                                               ChConfig.Def_Obj_ActState_ClientAct,
                                               IPY_GameWorld.oalLook):
        return
    #移动中不执行此操作
    if curPlayer.IsMoving():
        #PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_0")
        return
    if curPlayer.GetPlayerAction() != IPY_GameWorld.paNull:
        return
    if curPlayer.GetPlayerVehicle() != IPY_GameWorld.pvNull:
        return
    #设置间隔
    curPlayer.SetShowFaceTick(tick)
    sendPack = IPY_GameWorld.IPY_CShowFace()
    PlayerControl.DoPlayerShowPlayerFace(curPlayer, sendPack.GetType())
    return True
#----------------------------自定义方法
#---------------------------------------------------------------------
##检查玩家是否可以停止移动
#@param curPlayer 玩家实例
@@ -3850,321 +2527,6 @@
    NetPackCommon.SendFakePack(curPlayer, sendPack)
    
    GameWorld.Log("地图切换失败", curPlayer.GetID())
    return
#---------------------------------------------------------------------
#===============================================================================
# //01 04 在线回应#tagCOnlineReturn
# tagCOnlineReturn       *   GettagCOnlineReturn();
#
# class   IPY_COnlineReturn
# {
# public:
#
#    int      GetType();
# };
#===============================================================================
##客户端封包响应 //01 04 在线回应#tagCOnlineReturn
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //01 04 在线回应#tagCOnlineReturn
def OnlineReply(index, tick):
    #目前做到RouteServer中去了
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#
#    lastOnlineReplyTick = curPlayer.GetLastOnlineReplyTick()
#
#    #回应次数+1
#    curPlayer.SetLastOnlineReplyTick(tick)
#    curPlayer.SetOnlineReplyCount(curPlayer.GetOnlineReplyCount() + 1)
#    if lastOnlineReplyTick == 0:
#        GameWorld.Log("初始化在线回应")
#        #GameWorld.Log("GetLastOnlineReplyTick %d"%curPlayer.GetLastOnlineReplyTick())
#        return
#
#    #GameWorld.Log("tick %d"%tick)
#    diffTick = tick - lastOnlineReplyTick - ChConfig.Def_PlayerOnLineReply_ClientReply
#    if diffTick < -ChConfig.Def_PlayerOnLineReply_ClientReply:
#        GameWorld.Log("在线回应间隔错误 = %d"%diffTick)
#        curPlayer.Kick(IPY_GameWorld.disOnlineReplyError)
#        return
#
#
##    GameWorld.Log(str(curPlayer.GetTotalOnlineReplyTick()))
##    GameWorld.Log(str(diffTick))
#    curPlayer.SetTotalOnlineReplyTick(curPlayer.GetTotalOnlineReplyTick() + diffTick)
#
#    GameWorld.Log("在线回应次数 = %d  总时间 = %d"%(curPlayer.GetOnlineReplyCount(), curPlayer.GetTotalOnlineReplyTick()))
    return
#---------------------------------------------------------------------
#===============================================================================
# //06 08 召唤兽移动#tagCSummonMove
# tagCSummonMove       *   GettagCSummonMove();
#
# class   IPY_CSummonMove
# {
# public:
#
#    int      GetSummonID();
#
#    int      GetPosX();
#
#    int      GetPosY();
#
#    int      GetDestPosX();
#
#    int      GetDestPosY();
# };
#===============================================================================
##客户端封包响应 //06 08 召唤兽移动#tagCSummonMove
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //06 08 召唤兽移动#tagCSummonMove
def PlayerSummonMove(index, tick):
    #逻辑做服务器端
    return
#===============================================================================
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#    sendPack = IPY_GameWorld.IPY_CSummonMove()
#    summonID = sendPack.GetSummonID()
#    posX = sendPack.GetPosX()
#    posY = sendPack.GetPosY()
#    destX = sendPack.GetDestPosX()
#    destY = sendPack.GetDestPosY()
#    #找到这个召唤兽
#    summonNPC = curPlayer.FindSummonByID(summonID)
#    #无法查找到这个召唤兽
#    if summonNPC == None or GameObj.GetHP(summonNPC) <= 0:
#        GameWorld.Log('无法查找到这个召唤兽 summonID=%d'%summonID)
#        return
#
#    if ChConfig.Def_ClientControlSummonNPCID.count(summonNPC.GetFunctionType()) == 0:
#        #这个召唤兽客户端不能控制
#        #GameWorld.Log('这个召唤兽客户端不能控制')
#        return
#
#
#    #目的地是否可以到达
#    curMap = GameWorld.GetMap()
#    if curMap.CanMove(destX, destY) != True:
#        #地方不可走, 重置玩家的位置
#        GameWorld.Log("召唤兽地方不可走, destX=%s, destY=%s"%(destX, destY))
#        return
# #===============================================================================
# #    curMap = GameWorld.GetMap()
# #    if CheckMovePos(curPlayer, summonNPC,curMap, posX, posY, destX, destY, sendPlayerMoveFail = False) != True :
# #        #封包信息错误
# #        return
# #===============================================================================
#
#
#    #移动点坐标
#    dist = GameWorld.GetDist(posX, posY, destX, destY)
#    if dist > 20 :
#        #瞬移
#        GameWorld.Log('召唤兽瞬移summonID=%d'%summonID)
#        summonNPC.ResetPos(destX, destY)
#        return
#
#    #正常移动
#    summonNPC.Move(destX, destY)
#    return
#===============================================================================
#---------------------------------------------------------------------
#===============================================================================
# //06 09 召唤兽攻击#tagCSummonAttack
# tagCSummonAttack       *   GettagCSummonAttack();
#
# class   IPY_CSummonAttack
# {
# public:
#
#    int      GetSummonID();
#
#    int      GetObjType();
#
#    int      GetObjID();
#
#    int      GetPosX();
#
#    int      GetPosY();
# };
#===============================================================================
##客户端封包响应 //06 09 召唤兽攻击#tagCSummonAttack
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //06 09 召唤兽攻击#tagCSummonAttack
def PlayerSummonAttack(index, tick):
    #逻辑做服务器端
    return
#===============================================================================
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#    sendPack = IPY_GameWorld.IPY_CSummonAttack()
#    summonID = sendPack.GetSummonID()
#    posX = sendPack.GetPosX()
#    posY = sendPack.GetPosY()
#    attackType = sendPack.GetObjType()
#    attackID = sendPack.GetObjID()
#
#    #找到这个召唤兽
#    summonNPC = curPlayer.FindSummonByID(summonID)
#    #无法查找到这个召唤兽
#    if summonNPC == None or GameObj.GetHP(summonNPC) <= 0:
#        GameWorld.Log('找不到召唤兽')
#        return
#
#    if ChConfig.Def_ClientControlSummonNPCID.count(summonNPC.GetFunctionType()) == 0:
#        #这个召唤兽客户端不能控制
#        GameWorld.Log('这个召唤兽客户端不能控制')
#        return
#
#    #判断公共CD
#    if tick - summonNPC.GetAttackTick() < summonNPC.GetAtkInterval():
#        GameWorld.Log("攻击间隔没有到")
#        return
#
#    if PlayerControl.PlayerRefreshPos(curPlayer, summonNPC, posX, posY) != True:
#        #当前位置刷新失败
#        GameWorld.Log("召唤兽攻击当前位置刷新失败")
#        return
#
#    #被攻击者
#    attackTag = None
#    if attackType == IPY_GameWorld.gotPlayer:
#        attackTag = GameWorld.GetPlayerManager().FindPlayerByID(attackID)
#    elif attackType == IPY_GameWorld.gotNPC:
#        attackTag = GameWorld.FindNPCByID(attackID)
#    else:
#        #封包类型错误,或对象无法攻击
#        GameWorld.Log("召唤兽封包攻击类型错误 attackType = %s"%(attackType))
#        return
#
#    #无法查找攻击目标
#    if attackTag == None :
#        GameWorld.Log("无法查找攻击目标,attackID = %s"%(attackID))
#        return
#
#    if not BaseAttack.GetCanAttack(summonNPC, attackTag, None, tick):
#        return
#
#    if not __CheckPlayerSummonAttack(curPlayer , summonNPC , attackTag , tick):
#        return
#
#    #普通攻击
#    BaseAttack.Attack(summonNPC,attackTag, None, 0, 1,tick)
#
#    return
#===============================================================================
#===============================================================================
# def __CheckPlayerSummonAttack(curPlayer , summonNPC , attackTag , tick):
#    #1. 如果主人在战斗状态, 并且攻击对象为封包中的攻击对象, 返回True
#    #这个逻辑,将会导致,如果玩家停止攻击守卫,那么召唤兽将不攻击守卫
#    if curPlayer.IsBattleState() :
#        curOwnerActionObj = curPlayer.GetActionObj()
#        if curOwnerActionObj != None and GameWorld.IsSameObj(curOwnerActionObj, attackTag):
#            return True
#
#    #2. 判定关系
#    #判断是否敌对关系
#    relation = BaseAttack.GetTagRelation(summonNPC, attackTag, None, tick)
#
#    if relation[0] != ChConfig.Type_Relation_Enemy  :
#        GameWorld.Log("Attack Fail : Message = %s"%relation[1])
#        AttackCommon.PlayerAttackFailSysMessanage(curPlayer,relation[1])
#        return False
#
#    return True
#===============================================================================
#---------------------------------------------------------------------
#===============================================================================
# //06 0A 召唤兽停止#tagCSummonStop
# tagCSummonStop       *   GettagCSummonStop();
#
# class   IPY_CSummonStop
# {
# public:
#
#    int      GetSummonID();
#
#    int      GetPosX();
#
#    int      GetPosY();
# };
#===============================================================================
##客户端封包响应 //06 0A 召唤兽停止#tagCSummonStop
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //06 0A 召唤兽停止#tagCSummonStop
def PlayerSummonStop(index , tick):
    #逻辑做服务器端
    return
#===============================================================================
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#    sendPack = IPY_GameWorld.IPY_CSummonStop()
#    summonID = sendPack.GetSummonID()
#    posX = sendPack.GetPosX()
#    posY = sendPack.GetPosY()
#
#    #找到这个召唤兽
#    summonNPC = curPlayer.FindSummonByID(summonID)
#
#    #无法查找到这个召唤兽
#    if summonNPC == None or GameObj.GetHP(summonNPC) <= 0:
#        return
#
#    if ChConfig.Def_ClientControlSummonNPCID.count(summonNPC.GetFunctionType()) == 0:
#        #这个召唤兽客户端不能控制
#        #GameWorld.Log('这个召唤兽客户端不能控制')
#        return
#
#    if PlayerControl.PlayerRefreshPos(curPlayer, summonNPC, posX, posY) != True:
#        #当前位置刷新失败
#        GameWorld.Log("召唤兽攻击当前位置刷新失败")
#        return
#
#    summonNPC.StopMove()
#
#    return
#===============================================================================
#---------------------------------------------------------------------
#===============================================================================
# //03 0F 是否隐藏面具#tagCHideMask
# tagCHideMask       *   GettagCHideMask();
#
# class   IPY_CHideMask
# {
# public:
#    //是否隐藏
#    int      GetIsHide();
# };
#===============================================================================
##客户端封包响应 //03 0F 是否隐藏面具#tagCHideMask
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 0F 是否隐藏面具#tagCHideMask
def HideMask(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    sendPack = IPY_GameWorld.IPY_CHideMask()
    isHide = sendPack.GetIsHide()
    if isHide != 0 and isHide != 1:
        GameWorld.Log("HideMask -> 封包类型错误isHide = %s" % (isHide) , curPlayer.GetPlayerID())
        return
    if curPlayer.GetIsHideMask() == isHide:
        return
    curPlayer.SetIsHideMask(isHide)
    return
#---------------------------------------------------------------------
@@ -4295,56 +2657,12 @@
        #GameWorld.Log("战斗中无法换线")
        return False
    
    #---有镖车---
    if curPlayer.GetTruck() != None:
        #GeRen_liubo_760310   <n color="0,255,0">对不起,您处于押运状态中,无法切换线路!</n> 256 -
        PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_760310")
        return False
    if curPlayer.GetPlayerVehicle() not in ChConfig.Def_PlayerChangLine_Vehicle:
        #GeRen_liubo_760310   <n color="0,255,0">对不起,您处于押运状态中,无法切换线路!</n> 256 -
        PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_760310")
        return False
    return True
#---------------------------------------------------------------------
#===============================================================================
# //01 0C 得到当前服务器线路状态#tagCGetLineState
# tagCGetLineState       *   GettagCGetLineState();
#
# class   IPY_CGetLineState
# {
# public:
#    //无意义
#    int      GetType();
# };
#===============================================================================
##客户端封包响应 //01 0C 得到当前服务器线路状态#tagCGetLineState
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //01 0C 得到当前服务器线路状态#tagCGetLineState
def LineState(index, tick):
    #改为GameServer同步要查询的地图ID
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#    #1. 只有普通地图查看线路
#    gameMap = GameWorld.GetMap()
#
#    if gameMap.GetMapFBType() != IPY_GameWorld.fbtNull:
#        #Line_lose_Examine  <n color="0,255,0">`o对不起,目前该地图没有开放分流,无法查看线路状态!</n>
#        #PlayerControl.NotifyCode(curPlayer, "Line_lose_Examine")
#        return
#
#    if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_LineState) <= ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_LineState]:
#        #Line_Examinelose_Frequent  <n color="0,255,0">`o对不起,对不起,您查看游戏线路状态过于频繁,请稍后重试!</n>   256
#        #PlayerControl.NotifyCode(curPlayer, "Line_Examinelose_Frequent")
#        return
#
#    curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_LineState, tick)
#    #GameWorld.Log("查看分流成功" , curPlayer.GetPlayerID())
#    curPlayer.GameServer_LineState()
    return
def GetRebronTime(curPlayer, rebornType):
    ''' 死亡状态才验证时间,本服跨服通用
@@ -4454,11 +2772,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
@@ -4525,7 +2839,7 @@
        playerControl.SetToBornPlace()        
    elif rebornType == ChConfig.rebornType_MainCity:
        #直接取db中配置的复活点
        PlayerControl.PlayerResetWorldPos(curPlayer, gameMap.GetRebornMapID(), gameMap.GetRebornMapX(), gameMap.GetRebornMapY(), False)
        PlayerControl.PlayerResetWorldPos(curPlayer, gameMap.GetRebornMapID(), gameMap.GetRebornMapX(), gameMap.GetRebornMapY())
    #重新召唤宠物
    PlayerPet.AutoSummonPet(curPlayer)
    
@@ -4576,243 +2890,6 @@
    
    FBLogic.DoFBOnReborn(curPlayer, rebornType, tick)
    return
#---------------------------------------------------------------------
#===============================================================================
# //03 11 使用锻造炉#tagCUseMakeStove
# tagCUseMakeStove       *   GettagCUseMakeStove();
#
# class   IPY_CUseMakeStove
# {
# public:
#    //无意义
#    int      GetType();
# };
#===============================================================================
##客户端封包响应 //03 11 使用锻造炉#tagCUseMakeStove
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 11 使用锻造炉#tagCUseMakeStove
def PlayerUseMakeStove(index , tick):
    #===============================================================================================
    # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    #
    # #功能开启判断换成
    # #GameFuncComm.GetFuncCanUse(curPlayer, funcID)
    #
    # #非空闲状态无法使用
    # if curPlayer.GetPlayerAction() not in ChConfig.Def_Player_DoEvent_State:
    #    PlayerControl.NotifyCode(curPlayer, "Factory_Execution_Wrong")
    #    return
    #
    # #移动中不执行此操作
    # if curPlayer.IsMoving():
    #    #PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_0")
    #    return False
    #
    # #开始锻造事件
    # ItemCommon.DoLogic_UseStoveEvent(curPlayer)
    #===============================================================================================
    return
#---------------------------------------------------------------------
#===============================================================================
# //03 12 查看家族战排期#tagCGetFamilyWarTime
# tagCGetFamilyWarTime       *   GettagCGetFamilyWarTime();
#
# class   IPY_CGetFamilyWarTime
# {
# public:
#    //无意义
#    int      GetType();
# };
#===============================================================================
##客户端封包响应 //03 12 查看家族战排期#tagCGetFamilyWarTime
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 12 查看家族战排期#tagCGetFamilyWarTime
def QueryFamilyWarPlan(index, tick):
#===================================================================================================
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#
#    if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_QueryFamilyWar, tick):
#        #操作过于频繁
#        return
#
#    if curPlayer.GetFamilyID() == 0:
#        #无家族不查询
#        return
#
#    #开始查询
#    curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_sqtFamilyWar, 0, '', '', 0)
#===================================================================================================
    return
#-------------------------------------------------------------------
#===============================================================================
# //03 13 查询镖车位置#tagCGetTruckPos
# tagCGetTruckPos       *   GettagCGetTruckPos();
#
# class   IPY_CGetTruckPos
# {
# public:
#    //无意义
#    int      GetType();
# };
#===============================================================================
##客户端封包响应 //03 13 查询镖车位置#tagCGetTruckPos
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 13 查询镖车位置#tagCGetTruckPos
def QueryTruckPos(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
 #    GameWorld.Log('进入镖车查询 ID:%s'%curPlayer.GetID())
    if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_QueryTruckPos) <= ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_QueryTruckPos]:
        #查询过于频繁
        PlayerControl.NotifyCode(curPlayer, "Old_hgg_31379")
        return
    curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_QueryTruckPos, tick)
    #开始查询
    curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_sqtTruck, curPlayer.GetTruckID(), 'TruckPos', '', 0)
    return
#---------------------------------------------------------------------
#===============================================================================
# //03 14 传送镖车位置#tagCMoveToTruckPos
# tagCMoveToTruckPos       *   GettagCMoveToTruckPos();
#
# class   IPY_CMoveToTruckPos
# {
# public:
#    //无意义
#    int      GetType();
# };
#===============================================================================
##客户端封包响应 //03 14 传送镖车位置#tagCMoveToTruckPos
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 14 传送镖车位置#tagCMoveToTruckPos
def MoveToTruckPos(index, tick):
#===============================================================================
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#
#    if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_MoveToTruckPos) <= ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_MoveToTruckPos]:
#        #传送过于频繁
#        PlayerControl.NotifyCode(curPlayer, "Convey_Car_Frequently")
#        return
#
#    curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_MoveToTruckPos, tick)
#
#    #判定玩家状态
#    if not PlayerControl.CheckTransState(curPlayer):
#        return
#
#    #战斗状态不让玩家传送
#    if curPlayer.IsBattleState():
#        PlayerControl.NotifyCode(curPlayer, "CannotAtk09")
#        return
#
#    #开始传送
#    curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_sqtTruck, curPlayer.GetTruckID(), 'MoveToTruck', '', 0)
#===============================================================================
    return
#---------------------------------------------------------------------
#===============================================================================
# //03 15 开始远程鉴定#tagCRemoteIdentify
# tagCRemoteIdentify       *   GettagCRemoteIdentify();
#
# class   IPY_CRemoteIdentify
# {
# public:
#    //无意义
#    int      GetType();
# };
#===============================================================================
##客户端封包响应 //03 15 开始远程鉴定#tagCRemoteIdentify
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 15 开始远程鉴定#tagCRemoteIdentify
def FarIdentify(index, tick):
    #关闭此功能
    return
#---------------------------------------------------------------------
#===============================================================================
# //03 16 得到副本状态#tagCGetFBState
# tagCGetFBState       *   GettagCGetFBState();
#
# class   IPY_CGetFBState
# {
# public:
#    //无意义
#    int      GetType();
# };
#===============================================================================
##客户端封包响应//03 16 得到副本状态#tagCGetFBState
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应//03 16 得到副本状态#tagCGetFBState
def GetFBState(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_FBState) < ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_FBState]:
        #查询过于频繁
        return
    curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_FBState, tick)
    if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull:
        #普通地图不查询
        return
    FBLogic.DoGetFBState(curPlayer , tick)
    return
#---------------------------------------------------------------------
#===============================================================================
# //03 19 副本帮助界面#tagCFbHelp
# tagCFbHelp       *   GettagCFbHelp();
#
# class   IPY_CFbHelp
# {
# public:
#    //无意义
#    int      GetType();
# };
#===============================================================================
##客户端封包响应 //03 19 副本帮助界面#tagCFbHelp
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 19 副本帮助界面#tagCFbHelp
#副本帮助界面
def FBHelp(index , tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    if not curPlayer.GetMapLoadOK():
        #玩家未登陆成功副本不处理
        return
    if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_FBHelp) < ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_FBHelp]:
        #查询过于频繁
        return
    curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_FBHelp, tick)
#    if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull:
#        #普通地图不查询
#        return
    FBLogic.DoFBHelp(curPlayer , tick)
    return
#---------------------------------------------------------------------
#---------------------------------------------------------------------
#// C1 05 进入跨服地图 #tagCMEnterCrossServer
@@ -4862,186 +2939,6 @@
    mapID = sendPack.GetMapID()
    clientSendLineID = sendPack.GetLineID()
    PlayerControl.PlayerEnterFB(curPlayer, mapID, clientSendLineID)
    return
#---------------------------------------------------------------------
#===============================================================================
#//07 24 定点传送#tagCDingDianTransport
#tagHead        Head;
#BYTE        ItemIndex;
#WORD        TransportIndex;
## 定点传送
#  @param index 玩家索引
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def PointTransport(index, tick):
#===============================================================================
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
# #    if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_WorldTransport, tick):
# #        #间隔未到
# #        return
#    sendPack = IPY_GameWorld.IPY_CDingDianTransport()
#    lineID = sendPack.GetItemIndex()        #本项目用来指定传送的目标线路, -1为默认
#    sendPack_TransportIndex = sendPack.GetTransportIndex()   #传送点索引
#    lineID = lineID if lineID > 0 else -1
#
#    if not PlayerControl.CheckPlayerTransport(curPlayer):
#        #玩家当前状态不可传送
#        return
#    PointTransportList = ReadChConfig.GetEvalChConfig('PointTransport')
#    PointCount = len(PointTransportList)
#    #索引错误
#    if sendPack_TransportIndex < 0 or sendPack_TransportIndex >= PointCount:
#        return
#    curPointDict = PointTransportList[sendPack_TransportIndex]
#
#    mapID = curPointDict["MapID"]
#    lvLimit = curPointDict["LVLimit"]
#    posX = curPointDict["PosX"]
#    posY = curPointDict["PosY"]
#    money = curPointDict["Money"]
#    moneyType = curPointDict["MoneyType"]
#
#    #职业限制
#    if lvLimit > curPlayer.GetLV():
#        #对不起,该场景需要XX级才能进入!
#        PlayerControl.NotifyCode(curPlayer, "Carry_hwj35_0", [lvLimit])
#        return
#    #金钱限制
#    if not PlayerControl.HaveMoneyEx(curPlayer, moneyType, money):
#        return
#    #目标地图判断(存在否,敌国,副本)
#    if not PlayerControl.CheckTagCountry(curPlayer, mapID):
#        return
#
#    #坐标点判断
#    posX, posY = GetTransportPos(curPlayer, 0, mapID, posX, posY)
#    if (posX, posY) == (0, 0):
#        #04BBF813-7A30-47A8-927DE1ACCC4F378E 目标点为障碍点
#        PlayerControl.NotifyCode(curPlayer, "04BBF813-7A30-47A8-927DE1ACCC4F378E")
#        return
#
#    if BeginTrans(curPlayer, mapID, posX, posY, lineID=lineID):
#        curPlayer.SetDict(ChConfig.Def_PlayerKey_TransMoney, money)
#        curPlayer.SetDict(ChConfig.Def_PlayerKey_TransMoneyType, moneyType)
#        curPlayer.SetDict(ChConfig.Def_PlayerKey_TransType, ChConfig.Def_Transport_Type_FixedPoint)
#    else:
#        #没有进度条,直接扣取
#        infoDict = {ChConfig.Def_Cost_Reason_SonKey:mapID}
#        PlayerControl.PayMoney(curPlayer, moneyType, money, ChConfig.Def_Cost_Transport, infoDict)
#
#===============================================================================
    #PlayerControl.PlayerResetWorldPos(curPlayer, MapID, PosX, PosY, False)
    #PlayerControl.NotifyCode(curPlayer, "Map_Deliver_Succeed", [MapID])
    return
#===============================================================================
# #  04 04 好友传送 #tagCFriendTransport
# #
# #struct    tagCFriendTransport
# #{
# #    tagHead        Head;
# #    DWORD        FriendID;
# #    Byte         ExtField1;
# #};
#===============================================================================
##客户端封包响应 04 04 好友传送 #tagCFriendTransport
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 04 04 好友传送 #tagCFriendTransport
def FriendTransPort(index, tick):
    return
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#
#    if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_FlyToFriend, tick):
#        #间隔未到
#        return
#
#    sendPack = IPY_GameWorld.IPY_CFriendTransport()
#    sendPack_FriendID = sendPack.GetFriendID()
#    sendPack_IsAutoBuy = sendPack.GetExtField1()
#
#    if not curPlayer.FindFriend(sendPack_FriendID):
#        #确认好友失败
#        return
#
#    if not PlayerControl.CheckPlayerTransport(curPlayer):
#        #玩家当前状态不可传送
#        return
#
#    type = ChConfig.Def_Transport_Type_Friend
#    if not TransportVipLvRestrict(curPlayer, type):
#        #vip等级限制
#        return
#
#    transportPayDict = ReadChConfig.GetEvalChConfig('TransportPay')
#    payInfo = transportPayDict.get(type)
#
#    if payInfo == None:
#        GameWorld.ErrLog("表TransportPay信息错误 没有对应类型 %s" % (type))
#        return
#
#
#    #物品ID, 物品效果值, 付费类型,金额
#    itemID, itemEffectID, moneyType, money = payInfo
#
#    #通知消费方式
#    sendPayType = ChConfig.Def_FriendTransPort_UseItem
#    #使用道具传送
#    useItem = ItemCommon.FindItemInPackByEffectEx(curPlayer, itemEffectID)
#
#    #没有物品
#    if useItem == None:
#        if sendPack_IsAutoBuy:
#            #没有钱
#            if not PlayerControl.HaveMoneyEx(curPlayer, moneyType, money):
#                return
#
#            #金钱消费
#            sendPayType = ChConfig.Def_FriendTransPort_UseMoney
#        else:
#            #物品不足
#            PlayerControl.NotifyCode(curPlayer, "GeRen_pan_861048", [itemID])
#            return
#
#    sendMsg = '%s' % (sendPayType)
#
#    #查询并传送
#    curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_sqtPlayer, sendPack_FriendID,
#                             'FlytoFriendByID', sendMsg, len(sendMsg))
#---------------------------------------------------------------------
#===============================================================================
#04 05 世界传送tagCWorldTransfer
#
# struct    tagCWorldTransfer
# {
#    tagHead        Head;
#    DWORD        MapID;
#    WORD        PosX;
#    WORD        posY;
#    BYTE        ExtField1;
# };
#===============================================================================
##
##客户端封包响应 04 05 世界传送tagCWorldTransfer
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 04 05 世界传送tagCWorldTransfer
def WorldTransPort(index, tick):
    #---获取封包信息---
    packUseItem = IPY_GameWorld.IPY_CWorldTransfer()
    packTransportType = packUseItem.GetType()
    mapID = packUseItem.GetMapID()
    posX = packUseItem.GetPosX()
    posY = packUseItem.GetPosY()
    lineID = packUseItem.GetExtField1()
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    __Func_WorldTransPort(curPlayer, packTransportType, mapID, posX, posY, tick, lineID)
    return
#// B0 05 开始世界传送 #tagCMWorldTransfer
@@ -5128,12 +3025,11 @@
# @param mapID 地图ID
# @param posX 坐标X
# @param posY 坐标Y
# @param takeTruck 是否携带镖车
# @param lineID 线路ID -1代表当前线
# @param msg 切换地图携带的信息
# @param canLock 是否可以锁定玩家(传送点不可锁定, 因为要跨地图寻路)
#  @return: 是否在拉进度条
def BeginTrans(curPlayer, mapID, posX, posY, takeTruck=False, lineID= -1, msg='', canLock=True, exData1=0):
def BeginTrans(curPlayer, mapID, posX, posY, lineID= -1, msg='', canLock=True, exData1=0):
    #===========================================================================
    # if PlayerControl.IsPlayerInFight(curPlayer):
    #    #记录传送坐标, 用于进度条结束后传送
@@ -5147,7 +3043,7 @@
    #    return True
    #===========================================================================
    
    PlayerControl.PlayerResetWorldPos(curPlayer, mapID, posX, posY, takeTruck, lineID, msg, canLock, exData1)
    PlayerControl.PlayerResetWorldPos(curPlayer, mapID, posX, posY, lineID, msg, canLock, exData1)
    #PlayerControl.NotifyCode(curPlayer, "Map_Deliver_Succeed", [mapID])
    return False
@@ -5198,7 +3094,7 @@
    if not hasEnough:
        #道具不够默认扣钱
        costMoney = IpyGameDataPY.GetFuncCfg('TransportPay', 2)
        if not TransportPayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, costMoney, transportType, ChConfig.GMTool_Offline_WorldTransfer):
        if not TransportPayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, costMoney, transportType):
            GameWorld.DebugLog('    传送消耗处理 传送道具不足 itemID=%s, 钱也不够costMoney=%s'%(itemID, costMoney))
            return False
    else:
@@ -5211,7 +3107,7 @@
#  @param transportType 传送类型
#  @return 是否vip等级限制
def TransportVipLvRestrict(curPlayer, transportType):
    return PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_FreeTransport)
    return 0
@@ -5224,7 +3120,7 @@
#@param noteMark 记录类型
#@return 返回值真, 扣费成功
#@remarks 传送付费记录
def TransportPayMoney(curPlayer, moneyType, money, transportType, noteMark):
def TransportPayMoney(curPlayer, moneyType, money, transportType):
    moneyList = PlayerControl.HaveMoneyEx(curPlayer, moneyType, money)
    if moneyList == []:
        return False
@@ -5237,75 +3133,6 @@
                                              moneyType, money)
        
    return True
#//03 26 手动升级#tagCUserLVUp
#////////////////////////////////////////////////////////////////
#
#class       IPY_CUserLVUp
#{
#private:
#    CUserLVUp      *           m_Instance;
#public:
#    //初始化
#    IPY_CUserLVUp();
#----------------------------
##客户端封包响应 //03 26 玩家升级请求#tagCUserLVUp
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 03 26 玩家升级请求#tagCUserLVUp
def PlayerLvUpRequest(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    #---开始升级---
    playerControl = PlayerControl.PlayerControl(curPlayer)
    #参数填True表示手动升级 在人物达到20级以后会调用一次人物会升一级
    playerControl.PlayerLvUp(True)
    return
#---------------------------------------------------------------------
#===============================================================================
# //03 2B 双倍经验激活/停止/查询#tagCDoubleExp
#
# struct    tagCDoubleExp
# {
#    tagHead        Head;
#    BYTE        Type;        //1-激活;2-停止;3-查询
#
# };
#===============================================================================
##客户端封包响应 //03 2B 双倍经验激活/停止/查询#tagCDoubleExp
#@param index 玩家索引
#@param tick 时间戳
#@return 返回值无意义
#@remarks 客户端封包响应 //03 2B 双倍经验激活/停止/查询#tagCDoubleExp
def DoubleExpState(index, tick):
    return
## 03 31 副本玩家激活特殊技能
#  @param index 玩家索引
#  @param tick 时间戳
#  @return 无返回值
#  @remarks 副本玩家激活特殊技能
def UseFBSpecilSkill(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    fbSkillPack = IPY_GameWorld.IPY_CFBSpecilSkill()
    useType = fbSkillPack.GetType()
    useState = fbSkillPack.GetState()
    FBLogic.UseFBSpecilSkill(curPlayer, useType, useState, tick)
#---------------------------------------------------------------------
#===============================================================================
#//A2 05 请求兑换离线经验封包#tagPyCMOfflineExpExchange
#struct tagPyCMOfflineExpExchange
#{
#    tagHead    Head;
#    BYTE    Index;   //经验倍率索引
#    DWORD    ExchangeTime;   //兑换时间
#};
#===============================================================================
##//A2 05 请求兑换离线经验封包#tagPyCMOfflineExpExchange
@@ -5352,7 +3179,7 @@
    #参考经验
    rExp = PlayerControl.GetPlayerReExp(curPlayer)
    reLV = curPlayer.GetLV()                    #参考等级
    worldLvExpRate = PlayerWorldAverageLv.GetWorldAverageLvExpRate(curPlayer) #世界等级经验加成
    worldLvExpRate = 0
    
    #经验公式
    redeemExp = int(eval(recList[1]))
@@ -5388,63 +3215,6 @@
    curPlayer.Syn_OfflineTimeQueryResult() # 通知客服端离线时间
    return
#------------------------------------------------------------------------------
## //A0 09 购买大地图标记点# tagPyBuyMapSignPoint
#  @param index 玩家索引
#  @param curPackData 封包结构体
#  @param tick 时间戳
#  @return None
def BuyMapSignCount(index, curPackData, tick):
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#    curVipLv = curPlayer.GetVIPLv()
#
#    curMapsignCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PlayerMapSignCnt)
#
#    #if curMapsignCnt >= min(PlayerVip.GetVipCanBuyTransportPointCnt(curVipLv), ChConfig.Def_Player_MapSignPointMaxCount):
#    #    #已经全部开通或当前vip等级只能买这么多
#    #    return
#    if curMapsignCnt >= ChConfig.Def_Player_MapSignPointMaxCount:
#        #已经全部开通或当前vip等级只能买这么多
#        return
#
#    buyCountIndex = curMapsignCnt + 1
#    buyMoneyCostDict = ReadChConfig.GetEvalChConfig("MapSignCountBuyMoney")
#    buyMoneyList = buyMoneyCostDict.get(buyCountIndex)
#    if buyMoneyList == None:
#        GameWorld.ErrLog("购买大地图标识位置 = %s 在MapSignCountBuyMoney.txt表中找不到购买价格" % buyCountIndex)
#        return
#
#    buyMoney = buyMoneyList[0]  # 金钱数量
#    buyMoneyType = buyMoneyList[1]  # 金钱类型
#
#    #扣钱
#    moneyList = PlayerControl.HaveMoneyEx(curPlayer, buyMoneyType, buyMoney)
#    if moneyList == []:
#        #金钱不足
#        return
#
#    for moneyType, moneyCount in moneyList:
#        PlayerControl.PayMoney(curPlayer, moneyType, moneyCount, 'BuyMapSignCount')
#
#    curMapsignCnt = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_PlayerMapSignCnt, buyCountIndex)
#
#    #通知客户端数量
#    OnSendMapSignCnt(curPlayer)
    return
## 通知大地图标记数量
#  @param curPlayer 玩家实例
#  @return None
def OnSendMapSignCnt(curPlayer):
#    curMapsignCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PlayerMapSignCnt)
#    mapsignCnt = ChConfig.Def_Player_InitMapSignPointCount + curMapsignCnt
#
#    mapSignPointCount = ChPyNetSendPack.tagPyMapSignPointCount()
#    mapSignPointCount.Count = mapsignCnt
#    NetPackCommon.SendFakePack(curPlayer, mapSignPointCount)
    return
#//B0 24 领取家族悬赏奖励 #tagReceiveFamilyArrestAward
#
@@ -5460,34 +3230,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
@@ -5521,48 +3263,6 @@
    NetPackCommon.SendFakePack(curPlayer, awardReceiveState)
    return
## 查询是否还在家族的申请列表中(不在线时被拒绝了)
#  @param curPlayer: 玩家实例
#  @return: None
def QueryIsResFamily(curPlayer):
    familyIDList = []
    for index in range(0, ChConfig.Def_Player_RequestAddFamilyMaxCnt):
        familyID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RequestAddFamilyID % index)
        if familyID == 0:
            continue
        familyIDList.append(familyID)
    #向GameServer请求是否还在该家族申请列表中
    sendMsg = str(familyIDList)
    curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_RequestIsFamily, curPlayer.GetID(),
                                         'RequestIsFamily', sendMsg, len(sendMsg))
    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
@@ -5590,27 +3290,18 @@
    # 活跃放置奖励
    elif rewardType == ChConfig.Def_RewardType_ActivityPlace:
        PlayerActivity.GetActivityPlaceReward(curPlayer)
    # 挂机奖励
    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)
@@ -5632,12 +3323,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)
@@ -5647,9 +3332,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)
@@ -5659,12 +3341,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)
@@ -5719,42 +3395,30 @@
    # 轮回殿奖励
    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)
    #自定义奖励
    elif rewardType == ChConfig.Def_RewardType_CustomAward:
        PlayerCustomAward.OnGetCustomAward(curPlayer, dataEx)
    #境界修仙之路奖励
    elif rewardType == ChConfig.Def_RewardType_RealmXXZL:
        PlayerPrestigeSys.GetXXZLAward(curPlayer, dataEx)
    #境界渡劫任务条件奖励
    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)
    #任务奖励
    elif rewardType == ChConfig.Def_RewardType_Task:
        PlayerTask.GetTaskAward(curPlayer, dataEx)
    #战令奖励
    elif rewardType == ChConfig.Def_RewardType_Zhanling:
        PlayerZhanling.GetZhanlingReward(curPlayer, dataEx, dataExStr)
    #福地聚宝盆奖励
    elif rewardType == ChConfig.Def_RewardType_MineTreasure:
        PlayerMineArea.GetMineTreasureAward(curPlayer, dataEx)
    #玩法前瞻奖励
    elif rewardType == ChConfig.Def_RewardType_GameNotice:
        OnGiveAwardByClient(curPlayer, rewardType, ChConfig.Def_PDict_GameNoticeAwardState, IpyGameDataPY.GetFuncEvalCfg("GameNoticeReward", 1))
@@ -5920,7 +3584,6 @@
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    if not curPlayer:
        return
    BossHurtMng.OnQueryBossHurtList(curPlayer, clientData)
    return
@@ -6076,6 +3739,23 @@
    serverTime = GameWorld.GetCurrentTime()
    if not serverTime:
        return
    clientPack = ChPyNetSendPack.tagMCOpenServerDay()
    clientPack.Day = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay)
    clientPack.IsMixServer = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_IsMixServer)
    clientPack.MixDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_MixServerDay)
    clientPack.OpenWeekday = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_OpenServerWeekday)
    clientPack.NowYear = serverTime.year
    clientPack.NowMonth = serverTime.month
    clientPack.NowDay = serverTime.day
    clientPack.NowHour = serverTime.hour
    clientPack.NowMinute = serverTime.minute
    clientPack.NowSecond = serverTime.second
    clientPack.NowMicSecond = serverTime.microsecond
    clientPack.WeekOfYear = GameWorld.GetWeekOfYear()
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    #旧包先保留,之后删除
    gw = GameWorld.GetGameWorld()
    packData = ChPyNetSendPack.tagOpenServerDay()
    packData.Clear()
@@ -6216,10 +3896,6 @@
        #                   % (dist, distSum, speed, needTick, passCalcTick, checkNeedTick), curPlayer.GetID())
        curPlayer.SetDict(MoveDistCalcTick, tick)
        curPlayer.SetDict(MoveDistSum, 0)
    #如果是小游戏中则停止小游戏
    if curPlayer.GetPlayerAction() == IPY_GameWorld.paGameEvent:
        PlayerGameEvent.StopGameEvent(curPlayer, tick)
        
    #2010/04/30 移动修改为全C++控制, Python状态机设置为空闲(清空采集等状态)
    PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paNull)
@@ -6377,7 +4053,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