| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #  | 
| # @todo:   | 
| #  | 
| # @author: Alee  | 
| # @date 2017-12-1 ÏÂÎç01:37:09  | 
| # @version 1.0  | 
| #  | 
| # @note:   | 
| #  | 
| #---------------------------------------------------------------------  | 
| #µ¼Èë  | 
| import PlayerState  | 
| import IPY_GameWorld  | 
| import GameWorld  | 
| import PlayerControl  | 
| import GameMap  | 
| import ChConfig  | 
| import EventShell  | 
| import SkillShell  | 
| import BuffSkill  | 
| import PlayerEventCounter  | 
| import PlayerTeam  | 
| import PlayerHorse  | 
| import PlayerTruck  | 
| import NPCCommon  | 
| import PlayerGameEvent  | 
| import SkillCommon  | 
| import FBLogic  | 
| import ChItem  | 
| import ItemCommon  | 
| import ItemControler  | 
| import ChEquip  | 
| import FunctionNPCCommon  | 
| import PlayerGMOper  | 
| import ReadChConfig  | 
| import PetControl  | 
| import OperControlManager  | 
| import ShareDefine  | 
| import PlayerAutoCheckOnline  | 
| import PlayerGameWallow  | 
| import NetPackCommon  | 
| import ChPyNetSendPack  | 
| import Operate_PlayerBuyZhenQi  | 
| import DataRecordPack  | 
| import PlayerBillboard  | 
| import UpdatePlayerName  | 
| import PlayerOnlinePrize  | 
| import PlayerLVAward  | 
| import PlayerGoldGift  | 
| import PlayerSignDay  | 
| import MixServerCampaign  | 
| import PlayerPet  | 
| import PlayerPrestigeSys  | 
| import PlayerFamily  | 
| import PlayerLoginDayAward  | 
| import PlayerGodWeapon  | 
| import PlayerWorldAverageLv  | 
| import GameLogic_ManorWar  | 
| import PlayerGoldInvest  | 
| import PlayerActivity  | 
| import PlayerTeHui  | 
| import FBCommon  | 
| import HighLadderTube  | 
| import BossHurtMng  | 
| import PlayerAction  | 
| import PlayerAttrFruit  | 
| import PlayerSuccess  | 
| import PlayerDienstgrad  | 
| import PlayerMixLoginDayAward  | 
| import PlayerFreeGoods  | 
| import ShopItemManage  | 
| import PlayerRecover  | 
| import Operate_EquipSuitCompose  | 
| import PlayerEquipDecompose  | 
| import PlayerCoat  | 
| import PlayerQQ  | 
| import PlayerCostVIP  | 
| import PlayerMergeKing  | 
| import PlayerMergePK  | 
| import GameFuncComm  | 
| import PlayerMagicWeapon  | 
| import GameLogic_TrialTower  | 
| import GameLogic_FamilyWar  | 
| import PlayerBossReborn  | 
| import Operate_EquipWash  | 
| import PlayerTreasure  | 
| import PlayerMergeEvent  | 
| import GameLogic_GodArea  | 
| import PlayerRune  | 
| import PlayerFamilyRedPacket  | 
| import IpyGameDataPY  | 
| import EventReport  | 
| import Operate_EquipStone  | 
| import OpenServerCampaign  | 
| import PlayerVip  | 
| import PlayerRefineStove  | 
| import PassiveBuffEffMng  | 
| import PlayerDiceEx  | 
| import QuestCommon  | 
| import PlayerTJG  | 
| import GameLogic_XMZZ  | 
| import GameLogic_SealDemon  | 
| import GameLogic_Dogz  | 
| import PlayerFlashGiftbag  | 
| import PlayerCostRebate  | 
| import PlayerSpringSale  | 
| import PlayerFairyCeremony  | 
| import ChNetSendPack  | 
| import PyGameData  | 
| import PlayerCoin  | 
| import PlayerGeTui  | 
| import PlayerDogz  | 
|   | 
| import datetime  | 
| import time  | 
| import math  | 
| import re  | 
| #---------------------------------------------------------------------  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##C++µ÷Ó÷â°ü, µØÍ¼¿ªÆô³É¹¦, ³õʼ»¯ÐÅÏ¢  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks µØÍ¼¿ªÆô³É¹¦, ³õʼ»¯ÐÅÏ¢  | 
| def InitPlayer(tick):  | 
|     return   | 
|   | 
| #---------------------------------------------------------------------  | 
| ##Íæ¼ÒµÇ½ÓÎÏ·³õʼ»¯  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks Íæ¼ÒµÇ½ÓÎÏ·³õʼ»¯  | 
| def InitLoginPlayer(curPlayer, tick):  | 
|     #³õʼ»¯Ö°Òµ½×Êý£¬Ä¬ÈÏ1  | 
|     if PlayerControl.GetJobRank(curPlayer) == 0:  | 
|         PlayerControl.SetJobRank(curPlayer, 1)  | 
|           | 
|     ##³õʼ»¯½»Ò×ÁÐ±í  | 
|     if curPlayer.GetTradeList().GetTradeItemCount() == 0:  | 
|         curPlayer.GetTradeList().SetTradeListCount(ChConfig.Def_PlayerTradeMaxItemCount)  | 
|           | 
|     #³õʼ»¯Íæ¼ÒµÄʱÖÓ¸öÊý  | 
|     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 ´¦Àí  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ×Ô¶¨Ò庯Êý, C++·â°üGameServer_InitOK ´¦Àí  | 
| def OnAllServerInitOK(curPlayer, tick):  | 
|     if FBLogic.PlayerLoginInFBCheck(curPlayer, tick):  | 
|         #Íæ¼ÒÊǵÚÒ»´ÎµÇ¼, ²¢ÇÒÍæ¼ÒÐèÒªÌß»ØÔÀ´µØÍ¼  | 
|         return  | 
|       | 
|     #--------------------------------֪ͨ¿Í»§¶ËÈÎÎñ-------------  | 
|     #ÏÈ·¢ËÍËùÓÐÈÎÎñ, ÔÙË¢ÐÂÈÕÆÚ, ·ñÔò»áÓÐ2¸öÏàͬµÄÈÎÎñÔÚÍæ¼ÒÉíÉÏ  | 
|     #°ÑÍæ¼Òµ±Ç°µÄËùÓÐÈÎÎñ·¢Ë͸ø¿Í»§¶Ë  | 
|     #GameWorld.Log('EventShell.NotifyAllQuestDetail')  | 
|     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  | 
|   | 
|   | 
| #---------------------------------------------------------------------  | 
| ##Íæ¼ÒµÇ½ÓÎÏ·Âß¼´¦Àí  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks Íæ¼ÒµÇ½ÓÎÏ·Âß¼´¦Àí  | 
| def DoPlayerLogin(curPlayer, tick):  | 
|     #ÕâÀïÖ»×ö³õʼ»¯Âß¼  | 
|     curPlayer.SetDict(ChConfig.Def_PlayerKey_LoadMapIsLogin, 1)  | 
|     #֪ͨʱ¼ä  | 
|     Sync_PyServerDataTimeToClient(curPlayer)  | 
|     #Í¨ÖªÍæ¼Ò»ù±¾ÐÅÏ¢  | 
|     curPlayer.Sync_ClientPlayerLogin()  | 
|       | 
|     #ͬ²½GameServer×Ô¼ºµÄµØÍ¼ID  | 
|     curPlayer.Sync_GameServer_MapID()  | 
|       | 
|     SyncGuideState(curPlayer)  | 
|       | 
|     #³õʼ»¯Íæ¼Ò±³°ü  | 
|     InitPlayerPack(curPlayer)  | 
|       | 
|     #Í¨ÖªÍæ¼ÒÎïÆ·ÐÅÏ¢  | 
|     __Sync_PackDetel(curPlayer)  | 
|       | 
|     #¸üÐÂÖ÷·þIDÐÅÏ¢  | 
|     #UpdatePlayerServerGroupID(curPlayer)  | 
|       | 
|     #ÉÏÏßѧϰ¼¼ÄÜ  | 
|     SkillCommon.PlayerLoginCheckLearnSkill(curPlayer)  | 
|       | 
|     SkillCommon.PlayerLoginMergeServerSkillLogic(curPlayer, tick)  | 
|       | 
|     #ˢм¼ÄÜCD  | 
|     SkillCommon.PlayerLoginUpdateSkillCD(curPlayer, tick)  | 
|       | 
|     #Í¨ÖªÍæ¼Ò¼¼ÄÜÐÅÏ¢  | 
|     __Sync_ClientSkill(curPlayer)  | 
|       | 
|     #Çå³ýÉú²ú²É¼¯Buff  | 
|     #PlayerControl.DelProduceBuff(curPlayer, tick)  | 
|     #Çå³ý¹ú¼Ò´ðÌâBuff  | 
|     #PlayerExam.DoLogic_ExitExam(curPlayer, tick, needRefresh = False)  | 
|     #Çå³ýVIPbuff  | 
|     #BuffSkill.DelBuffBySkillID(curPlayer, ChConfig.Def_VIPExp_SkillTypeID, tick)  | 
|     #PlayerReincarnation.ReincarOnLogin(curPlayer)  | 
|       | 
|     #Í¨ÖªÍæ¼ÒµÄbuff  | 
|     __Sync_ClientBuff(curPlayer)  | 
|       | 
|     #³õʼ»¯ÏÖʵʱ¼äÎïÆ·  | 
|     InitRealityTimeItem(curPlayer, tick)  | 
|   | 
|     #---Ë¢ÐÂÁËÍæ¼ÒÊôÐÔ, µÇ½ֻˢÐÂÒ»´Î£¬ÆäËûµØ·½²»ÓÃË¢  | 
|     DoPlayerLoginInMap(curPlayer, tick)  | 
|       | 
|     #ÉèÖÃÉÏÏßʱ¼ä  | 
|     curPlayer.SetLoginTime(GameWorld.GetCurrentDataTimeStr())  | 
|     #PlayerControl.SyncOnLineTimeTotal(curPlayer)  | 
|     #PlayerControl.SyncOnLineTimeLastOpenPack(curPlayer, IPY_GameWorld.rptItem)  | 
|     PlayerGodWeapon.OnLogin(curPlayer)  | 
|     PlayerPrestigeSys.OnLogin(curPlayer)  | 
|     DataRecordPack.DR_PlayerLogin(curPlayer)  | 
|     EventReport.WriteEvent_login(curPlayer)  | 
|       | 
|       | 
|     leaveServerSecond = PlayerControl.GetPlayerLeaveServerSecond(curPlayer)  | 
|     if leaveServerSecond > ChConfig.Def_PlayerOfflineProtectTime / 1000:  | 
|         # ÀëÏß³¬¹ýÀëÏß±£»¤ÖØÖÃÇÐÏßÁÙʱ±£´æµÄÏà¹Ø¼Ç¼ֵ  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_PlayChangeLineID, 0)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FuncChangeLineID, 0)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_HighChangeLineID, 0)  | 
|         #GameWorld.DebugLog("ÀëÏß³¬¹ý10ÃëÖØÖÃÇÐÏßÁÙʱ±£´æµÄÏà¹Ø¼Ç¼ֵ!leaveServerSecond=%s" % leaveServerSecond, curPlayer.GetPlayerID())  | 
|           | 
|     # ºÏ·þÊ׵Ǵ¦Àí  | 
|     __DoMixServerFirstLogin(curPlayer)  | 
|     PlayerBillboard.BillboardOnLogin(curPlayer)  | 
|       | 
|     #·ÇͬһÌì¶þ´ÎµÇ½, Ó¦¸Ã·ÅÔڸú¯ÊýÖеÄSetLoginTimeÖ®ºó£¬EventResponse_OnEnter֮ǰ  | 
|     NoteOtherDayLogin(curPlayer)  | 
|           | 
|     #ÉÏÏßʱ֪ͨÍÑ»ú¹Òʱ±»»÷ɱµÄÀëÏßʱ¼ä  | 
|     __Sync_PlayerOffline(curPlayer, tick)  | 
|       | 
|     #Íæ¼ÒÀ©Õ¹ÐÅÏ¢  | 
|     __SyncPlayerInfoEx(curPlayer)  | 
|       | 
|     #PKģʽ  | 
|     SyncPKModel(curPlayer)  | 
|           | 
|     #ͨÓÃÇ¿»¯ÐǼ¶ÐÅÏ¢  | 
|     ChEquip.NotifyEquipPartStarLV(curPlayer)  | 
|     Operate_EquipWash.OnEquipWashLogin(curPlayer)  | 
|     #֪ͨÌ××°ÐÅÏ¢  | 
|     ChEquip.NotifyEquipPartSuiteLV(curPlayer)  | 
|     ChEquip.SyncAllEquipAttrActiveInfo(curPlayer)  | 
|     #×°±¸Î»±¦Ê¯ÏâǶ֪ͨ  | 
|     Operate_EquipStone.OnLogin(curPlayer)  | 
|       | 
|     #´óʦ  | 
|     #PlayerGreatMaster.MasterOnLogin(curPlayer)  | 
|       | 
|     #֪ͨVIP  | 
|     PlayerVip.DoOnLogin(curPlayer, tick)  | 
|       | 
|     #֪ͨ·¨±¦¾«Á¶µÈ¼¶  | 
|     PlayerRefineStove.DoOnLogin(curPlayer, tick)  | 
|       | 
|     #---Íæ¼ÒÉÏÏß, ³èÎïÂß¼´¦Àí---  | 
|     PetControl.DoLogic_PetInfo_OnLogin(curPlayer, tick)  | 
|       | 
|     #ÒªÔÚ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)  | 
|       | 
|     # Í¨ÖªµÈ¼¶½±ÀøÁìÈ¡¼Ç¼  | 
|     PlayerLVAward.Sync_LVAwardGetRecordInfo(curPlayer)  | 
|       | 
|     PlayerCoin.OnLogin(curPlayer)  | 
|     # Ê׳ä/ÌìÌìÊ׳ä/³äÖµºÀÀñ  | 
|     PlayerGoldGift.OnLogin(curPlayer)  | 
|       | 
|     #Íæ¼Ò»Ø¹é֪ͨ  | 
|     #PlayerRecall.PlayerBack(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)  | 
|       | 
|     # Í¨ÖªÍæ¼ÒÊÇ·ñ¿ÉÒԲμӼÒ×å»î¶¯  | 
|     #PlayerFamily.SendClientForbidFamilyAction(curPlayer)  | 
|     # Ìáʾ¹ó±ö¾ãÀÖ²¿ÐÅÏ¢  | 
|     #PlayerVip.NoteVIPClubInfo(curPlayer)  | 
|       | 
|     #½ÇÉ«¸ÄÃû´ÎÊý  | 
|     UpdatePlayerName.Sync_UpdatePlayerNameCount(curPlayer)  | 
|   | 
|     #֪ͨÔËÐгɹ¦  | 
|     curPlayer.BalanceServer_PlayerLoginInitOK()  | 
|       | 
|     # ÐÂÊÖÖ¸µ¼Ô±ÉÏÏß´¦Àí  | 
| #    #PlayerFreshmanGuide.FreshmanGuiderOnLogin(curPlayer)  | 
| #      | 
|     # ×øÆïÏà¹ØÍ¨Öª  | 
|     PlayerHorse.PlayerHorseLogin(curPlayer)  | 
|       | 
|     PlayerTreasure.OnTreasureLogin(curPlayer)  | 
|       | 
| #    # Í¨ÖªÀۼƵǽÀñ  | 
|     PlayerLoginDayAward.OnLoginNotifyLoginDayAward(curPlayer)  | 
| #      | 
|     # ¿ª·þ»î¶¯½±ÀøÐÅÏ¢  | 
|     OpenServerCampaign.OnOpenServerCampaignLogin(curPlayer)  | 
| #      | 
| #    # Í¨ÖªºÏ·þ½±ÀøÁìȡ״̬  | 
| #    PlayerMixLoginDayAward.OnLoginNotifyMixLoginDayAward(curPlayer)  | 
| #      | 
| #    # Í¨ÖªºÏ·þ½±Àø  | 
| #    MixServerCampaign.OnMixServerCampaignLogin(curPlayer)  | 
| #      | 
| #    # ½ÚÈյǽ½±Àø  | 
| #    PlayerFestivalLogin.OnLoginFestivalLogin(curPlayer)  | 
|   | 
|     # ÊÔÁ¶Ö®Ëþ  | 
|     GameLogic_TrialTower.OnFBPlayerLogin(curPlayer)  | 
|     # ¹ÅÉñ½ûµØ  | 
|     GameLogic_GodArea.GodAreaOnLogin(curPlayer)  | 
| #    # ²É¼¯NPC´ÎÊý֪ͨ  | 
|     NPCCommon.SyncCollNPCTime(curPlayer)  | 
| #          | 
| #    # Ìػݻ  | 
| #    PlayerTeHui.PlayerLogin_TeHui(curPlayer)  | 
| #      | 
| #    # ×Ô¶¨ÒåÉÌµê  | 
| #    ShopItemManage.DoOnLogin(curPlayer)  | 
| #      | 
| #    # Ã¿ÈÕ»îÔ¾¶È  | 
|     PlayerActivity.OnLogin(curPlayer)  | 
| #      | 
| #    # ¸±±¾½øÈëʱ¼ä  | 
|     FBCommon.FBOnLogin(curPlayer)  | 
| #      | 
| #    #ÌìÌݾº¼¼³¡  | 
| #    HighLadderTube.OnLogin(curPlayer)  | 
| #      | 
| #    #ÊÀ½çµÈ¼¶  | 
|     PlayerWorldAverageLv.OnLogin(curPlayer)  | 
| #      | 
|     # Í¶×ÊÀí²Æ  | 
|     PlayerGoldInvest.OnLogin(curPlayer)  | 
| #      | 
| #    #½ÚÈջ  | 
| #    PlayerAction.ActionOnLogin(curPlayer)  | 
| #      | 
| #    #ÊôÐÔ¹ûʵʹÓÃÇé¿ö  | 
|     PlayerAttrFruit.AttrFruitOnLogin(curPlayer)  | 
| #      | 
| #    #³É¾Í  | 
|     PlayerSuccess.SuccOnLogin(curPlayer)  | 
| #      | 
| #    #ͬ²½×Ô¶¯Õ½¶·ÅäÖüǼ  | 
| #    Sync_AutoFightSetting(curPlayer)  | 
| #      | 
|     PlayerFamily.FamilyPlayerOnLogin(curPlayer, tick)  | 
|     #¸Äµ½ GameServerRefresh GameSever_PlayerInitOKºó´¦Àí²ÅÄܱ£Ö¤Íæ¼ÒÒѾÔÚGameserver×¢²á  | 
|     #PlayerDienstgrad.RefreshBillBoardDienstgrad(curPlayer)  | 
|     # ³ÆºÅ  | 
|     PlayerDienstgrad.Sync_AllDienstgradOnLogin(curPlayer)  | 
| #    # ×ÊÔ´ÕÒ»ØOnLogin  | 
|     PlayerRecover.RecoverOnLogin(curPlayer)  | 
| #  | 
| #    # Ê±×°  | 
| #    PlayerCoat.OnLogin_Coat(curPlayer)  | 
| #  | 
| #    # ¿ç·þÆ¥Åä  | 
| #    PlayerMergePK.MergePKOnLogin(curPlayer)  | 
| #    PlayerMergeKing.MergePKOnLogin(curPlayer)  | 
|       | 
|     # ×Ô¶¨Òå»õ±Òֵͬ²½  | 
|     PlayerControl.NotifyPlayerAllCurrency(curPlayer)  | 
|     #֪ͨ»ù´¡ÊôÐÔ  | 
|     NotifyPlayerBasePoint(curPlayer)  | 
|       | 
|     #Ïû·Ñ·µÀû  | 
|     PlayerCostRebate.OnPlayerLogin(curPlayer)  | 
|     #ÏÞÊ±ÌØ»Ý  | 
|     PlayerSpringSale.OnPlayerLogin(curPlayer)  | 
|     #ÏÞʱÀñ°ü  | 
|     PlayerFlashGiftbag.OnPlayerLogin(curPlayer)  | 
|       | 
| #    # Ïû·ÑVIP  | 
| #    PlayerCostVIP.CostVIPOnLogin(curPlayer, tick)  | 
| #      | 
| #    # QQÏà¹Ø½±ÀøOnLogin  | 
| #    #PlayerQQ.Sync_QQAllAwardRecord(curPlayer)  | 
| #      | 
| #    # ÊÀ½çboss  | 
|     BossHurtMng.OnLogin(curPlayer)  | 
|     ChItem.Sync_ItemDayUseCnt(curPlayer)  | 
| #    # ÐüÉ͵Ǽ֪ͨ  | 
| #    PlayerArrestTask.OnLogin(curPlayer)  | 
|     # ·ûÓ¡µÇ¼֪ͨ  | 
|     PlayerRune.PlayerRuneLogin(curPlayer)  | 
|     # ÏÉÃ˺ì°üµÇ¼֪ͨ  | 
|     PlayerFamilyRedPacket.OnPlayerLogin(curPlayer)  | 
|     # ·¨±¦µÇ¼֪ͨ  | 
|     PlayerMagicWeapon.PlayerMagicWeaponLogin(curPlayer)  | 
|     # É̵êÎïÆ·¹ºÂò´ÎÊýµÇ¼֪ͨ  | 
|     FunctionNPCCommon.ShopItemOnLogin(curPlayer)  | 
|     # Í¨ÖªÉèÖõı»¶¯¹¦·¨  | 
|     PassiveBuffEffMng.OnLoginGFPassive(curPlayer)  | 
|     #ÎÒҪ̫¼«  | 
|     PlayerDiceEx.DiceExOnLogin(curPlayer)  | 
|     # ¾çÇéÈÎÎñÍê³É״̬  | 
|     QuestCommon.Sync_StoryMissionState(curPlayer)  | 
|     #ÏÉħ֮Õù  | 
|     GameLogic_XMZZ.OnXMZZLogin(curPlayer)  | 
|     PlayerOnlinePrize.OnPlayerLogin(curPlayer)  | 
|     GameLogic_SealDemon.NotifyFMTDouble(curPlayer)  | 
|     #×°±¸·Ö½â  | 
|     PlayerEquipDecompose.PlayerLogin(curPlayer)  | 
|     #·À³ÁÃÔ  | 
|     PlayerGameWallow.DoLogic_CheckWallow(curPlayer, tick)  | 
|     # Í¨ÖªÍÑ»ú¹ÒÐÅÏ¢  | 
|     PlayerTJG.NotifyTJGInfo(curPlayer)  | 
|     # ÍÆËÍÌáÐÑ  | 
|     PlayerGeTui.LoginNotifySetting(curPlayer)  | 
|     # ¼«Æ·°×Äà  | 
|     PlayerFreeGoods.OnLogin(curPlayer)  | 
|     # BOSS¸´»î»î¶¯  | 
|     PlayerBossReborn.OnLogin(curPlayer)  | 
|     # ÏɽçÊ¢µä»î¶¯  | 
|     PlayerFairyCeremony.OnLogin(curPlayer)  | 
|     # ·ÖÖ§ÏÂÔØ½±Àø¼Ç¼֪ͨ  | 
|     SyncPackDownloadAward(curPlayer)  | 
|     # µÇ¼´¥·¢¹¦ÄÜ¿ªÆô£¨ÀϺŴ¦Àí£©  | 
|     GameFuncComm.DoFuncOpenLogic(curPlayer)  | 
|     # ÉñÊÞ  | 
|     PlayerDogz.OnPlayerLogin(curPlayer)  | 
|     # ÉñÊÞ¸±±¾  | 
|     GameLogic_Dogz.SyncNPCRefreshTime(curPlayer.GetID())  | 
|   | 
|     # ÉÏÏß²éѯһ´Î³äÖµ¶©µ¥  | 
|     curPlayer.SendDBQueryRecharge()  | 
|       | 
|     curPlayer.SetState(0)   # ÍÑ»ú¹Ò»Ö¸´ÎªÕý³£ÉÏÏß  | 
|     curPlayer.SetFacePic(0) # Í¨ÖªÊý¾Ý¿âÊÇ·ñ±£´æ»¹ÊÇÏÂÏߣ¬×öÒ»´Î»Ö¸´£¬1Ϊ±£´æ 0ΪÕý³£ÏÂÏß  | 
|     tjgTime = PlayerTJG.GetTJGTime(curPlayer)  | 
|     if tjgTime:  | 
|         curPlayer.SendGameServerRefreshState(IPY_GameWorld.CDBPlayerRefresh_HappyPoint, tjgTime)  | 
|       | 
|     return  | 
|   | 
|   | 
| ## Íæ¼ÒÀ©Õ¹ÐÅϢͬ²½  | 
| #  @param curPlayer  | 
| #  @return None  | 
| def __SyncPlayerInfoEx(curPlayer):  | 
|     playerInfoEx = ChPyNetSendPack.tagMCPlayerInfo()  | 
|     playerInfoEx.Clear()  | 
|     playerInfoEx.IsAdult = curPlayer.IsAdult()  | 
|     playerInfoEx.CreateRoleTime = curPlayer.GetCreateRoleTime()  | 
|       | 
|     NetPackCommon.SendFakePack(curPlayer, playerInfoEx)  | 
|     return  | 
|   | 
| ## ºÏ·þÊ׵Ǵ¦Àí  | 
| #  @param curPlayer  | 
| #  @return None  | 
| def __DoMixServerFirstLogin(curPlayer):  | 
|     isMixServer = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_IsMixServer)  | 
|     if not isMixServer:  | 
|         return  | 
|       | 
|     lastMixServerDayKey = ShareDefine.Def_Notify_WorldKey_LastMixServerDay  | 
|     lastMixServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(lastMixServerDayKey)  | 
|     GameWorld.DebugLog("ºÏ·þÊ׵Ǵ¦ÀílastMixServerDay=%s" % lastMixServerDay, curPlayer.GetPlayerID())  | 
|       | 
|     playerDay = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MixLoginDay)  | 
|       | 
|     if playerDay == lastMixServerDay:  | 
|         GameWorld.DebugLog("±¾´ÎºÏ·þÒѾµÇ¼¹ý.")  | 
|         return  | 
|   | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MixLoginDay, lastMixServerDay)  | 
|       | 
|     # Í¬²½ÅÅÐаñ  | 
|     PlayerBillboard.UpdBillboardOnMixServerFirstLogin(curPlayer, lastMixServerDay)  | 
|       | 
|     # ÆäËû  | 
|     # ...  | 
|     # ÖØÖõǼ½±ÀøÁìȡ״̬  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MixLoginDayState, 0)  | 
|     PlayerMixLoginDayAward.NotifyPlayerAwardState(curPlayer)  | 
|       | 
|     # ÖØÖø÷ºÏ·þ»î¶¯Êý¾Ý  | 
|     for campaignType in ShareDefine.Def_MixCampaign_Type_List:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MixServerCampaign_AwardRecord \  | 
|                                 % campaignType, 0, ChConfig.Def_PDictType_OpenServerCampaign)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MixServerCampaign_RecordData \  | 
|                                 % campaignType, 0, ChConfig.Def_PDictType_OpenServerCampaign)  | 
|   | 
|       | 
|     # ÖØÖÃÍæ¼Ò¸ÄÃû´ÎÊý  | 
|     UpdatePlayerName.ResetChangeNameCnt(curPlayer)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
|           | 
| ##Çå³ýÍæ¼ÒËÀÍöÐÅÏ¢  | 
| # @param curPlayer Ö÷½Ç  | 
| # @return None  | 
| def ClearPlayerDeadInfo(curPlayer):  | 
|     #¼Ç¼µ±Ç°ËÀÍö´ÎÊý£¬Ê±¼ä  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_PlayerDeadCnt, 0)  | 
|     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')     #ijʱ¼ä¶ÎÄÚÉÏÏßÌáʾ  | 
|     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 Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks Í¨Öª±³°üÏêϸÐÅÏ¢  | 
| def __Sync_PackDetel(curPlayer):  | 
|     itemManager = curPlayer.GetItemManager()  | 
|       | 
|     for packIndex in ChConfig.Def_PlayerLoginInitPackIndexList:  | 
|         itemManager.GetPack(packIndex).Sync_Refresh()  | 
|   | 
|     for packIndex in ChConfig.Def_VPackCnt_Dict.keys():  | 
|         ItemControler.Sync_VPackItem_Refresh(curPlayer, packIndex)  | 
|           | 
| #===============================================================================  | 
| #      | 
| #    itemManager.GetPack(IPY_GameWorld.rptEquip).Sync_Refresh()  | 
| #    itemManager.GetPack(IPY_GameWorld.rptItem).Sync_Refresh()  | 
| #    itemManager.GetPack(IPY_GameWorld.rptRecycle).Sync_Refresh()  | 
| #    itemManager.GetPack(IPY_GameWorld.rptTitle).Sync_Refresh()  | 
| #    #itemManager.GetPack(IPY_GameWorld.rptInvestiture).Sync_Refresh()  | 
| #    itemManager.GetPack(IPY_GameWorld.rptHorse).Sync_Refresh()  | 
| #    itemManager.GetPack(IPY_GameWorld.rptAnyWhere).Sync_Refresh()  | 
| #    #itemManager.GetPack(IPY_GameWorld.rptFabao).Sync_Refresh()  | 
| #    #itemManager.GetPack(IPY_GameWorld.rptHorseEquip).Sync_Refresh()  | 
| #    #ʱװ±³°ü  | 
| #    itemManager.GetPack(IPY_GameWorld.rptCabinetWeaponCoat).Sync_Refresh()  | 
| #    itemManager.GetPack(IPY_GameWorld.rptCabinetHorse).Sync_Refresh()  | 
| #    itemManager.GetPack(IPY_GameWorld.rptCabinetDressCoat).Sync_Refresh()  | 
| #    #³èÎï´¢Îï¹ñ  | 
| #    itemManager.GetPack(IPY_GameWorld.rptPetCabinetPet).Sync_Refresh()  | 
| #    #´òÔì±³°ü(Òò´òÔì¸ÄΪԶ³Ì´òÔì,ÐèÒªÉÏÏß֪ͨ±³°üÄÚÈÝ)  | 
| #    itemManager.GetPack(IPY_GameWorld.rptCompose).Sync_Refresh()  | 
| #    itemManager.GetPack(IPY_GameWorld.rptResult).Sync_Refresh()  | 
| #      | 
| #    itemManager.GetPack(IPY_GameWorld.rptJewelMerge).Sync_Refresh()  | 
| #    itemManager.GetPack(IPY_GameWorld.rptJewelMergeResult).Sync_Refresh()  | 
| #    itemManager.GetPack(IPY_GameWorld.rptFineSoulSlot).Sync_Refresh()  | 
| #    #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  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##Í¨ÖªÍæ¼Ò¼¼ÄÜÐÅÏ¢  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks Í¨ÖªÍæ¼Ò¼¼ÄÜÐÅÏ¢  | 
| def __Sync_ClientSkill(curPlayer):  | 
|     skillManager = curPlayer.GetSkillManager()  | 
|     for i in range(skillManager.GetSkillCount()):  | 
|         curSkill = skillManager.GetSkillByIndex(i)  | 
|         curSkill.Sync_Skill()  | 
|   | 
|     return  | 
|    | 
| #---------------------------------------------------------------------  | 
| ##Í¨ÖªÍæ¼ÒbuffÐÅÏ¢  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks Í¨ÖªÍæ¼ÒbuffÐÅÏ¢  | 
| def __Sync_ClientBuff(curPlayer):  | 
|     curPlayer.GetBuffState().Sync_Buff()  | 
|     curPlayer.GetDeBuffState().Sync_Buff()  | 
|     curPlayer.GetAura().Sync_Buff()  | 
|     curPlayer.GetIncBuff().Sync_Buff()  | 
|     curPlayer.GetProcessBuffState().Sync_Buff()  | 
|     curPlayer.GetProcessDeBuffState().Sync_Buff()  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÉÏÏßʱ֪ͨÀëÏßʱ¼ä£¨ÀëÏß¹Ò»ú¹¦ÄÜ£©  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ÉÏÏßʱ֪ͨÀëÏßʱ¼ä£¨ÀëÏß¹Ò»ú¹¦ÄÜ£©  | 
| def __Sync_PlayerOffline(curPlayer, tick):  | 
|     #---µÈ¼¶ÏÞÖÆ---  | 
|     if GameWorld.IsMergeServer():  | 
|         return  | 
|     PlayerTJG.TJGDeadOffline(curPlayer)  | 
|       | 
| #===============================================================================  | 
| #    #---µÈ¼¶ÏÞÖÆ---  | 
| #    lvLimit = ReadChConfig.GetEvalChConfig('OfflineSys_LVLimit')  | 
| #    if curPlayer.GetLV() < lvLimit:  | 
| #        return  | 
| #      | 
| #    if GameWorld.IsMergeServer():  | 
| #        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  | 
|   | 
| def UpdatePlayerServerGroupID(curPlayer):  | 
|     # ¸üÐÂ×Ô¼ºµÄ·þÎñÆ÷×éID, ¿ç·þ·þÎñÆ÷²»´¦Àí  | 
|     if GameWorld.IsMergeServer():  | 
|         return  | 
|     serverGroupID = GameWorld.GetServerGroupID()  | 
|     if not serverGroupID:  | 
|         return  | 
|     playerServerGroupID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ServerGroupID)  | 
|     if playerServerGroupID != serverGroupID:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ServerGroupID, serverGroupID)  | 
|         GameWorld.DebugLog("¸üÐÂÍæ¼ÒËùÊô·þÎñÆ÷×éID: serverGroupID=%s" % serverGroupID)  | 
|           | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##Íæ¼ÒÔÚµØÍ¼·þÎñÆ÷ÖеǼok,³õʼ»¯×Ô¼º  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks Íæ¼ÒÔÚµØÍ¼·þÎñÆ÷ÖеǼok,³õʼ»¯×Ô¼º  | 
| def DoPlayerLoginInMap(curPlayer, tick):  | 
|     #֪ͨGameServerÇл»µØÍ¼¿ªÊ¼  | 
|     curPlayer.GameServer_SetLoadMapState(0)  | 
|     #ÔÚÍæ¼ÒÇл»³¡¾°µÄʱºò, ²»»áµ÷Óõ½ÕâÀï  | 
|     curPlayer.SetCanMove(False)  | 
|     curPlayer.SetInitOK(False)  | 
|     #Íæ¼ÒµÇ¼³É¹¦  | 
|     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)  | 
|     #ÉÏÏߺÍÇеØÍ¼¼ÓÓÐÏÞÎÞµÐBuff  | 
|     SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer, ChConfig.Def_SkillID_LimitSuperBuff, tick)  | 
|               | 
|     #Ë¢ÐÂÍæ¼ÒµÄÊÓÒ°  | 
|     PlayerState.ChangePlayerSigh(curPlayer, tick)  | 
|       | 
|     playerControl = PlayerControl.PlayerControl(curPlayer)  | 
|     #Ë¢ÐÂËùÓÐ״̬  | 
|     playerControl.ReCalcAllState()  | 
|       | 
|     #Ë¢ÐÂÒÑ·ÖÖÓµ¥Î»ÏûºÄµÄÎïÆ·(²»ÈÃÍæ¼ÒÒ»ÉÏÏ߾͵ôÄ;Ã)  | 
|     curPlayer.SetProcessEquipDurgTick(tick)  | 
|       | 
|     #³õʼ»¯Íæ¼Òµ±Ç°ÉÏÏßʱ¼ä  | 
|     curPlayer.SetLoginTick(tick)  | 
|     #µÇ¼ÐµØÍ¼£¬ÖØÖüÆËãÔÚÏßʱ³¤tick  | 
|     curPlayer.SetDict(ChConfig.Def_PlayerKey_CalcOLTimeTick, tick)  | 
|       | 
|     #³õʼ»¯Íæ¼ÒµÄÖØÉúµã  | 
|     PlayerControl.RefreshRebornPoint(curPlayer, tick)  | 
|       | 
|     #Ç¿ÖÆ¼ÇÂ¼Íæ¼ÒµÄһЩÐÅÏ¢  | 
|     SavePlayerMessionInDataServer(curPlayer)  | 
|       | 
|     #¼ì²é¸üÐÂ×ÜÕ½¶·Á¦  | 
|     #PlayerBillboard.UpdatePlayerFPTotalBillboard(curPlayer, True)  | 
|       | 
|     #Çå³ýÔÚ±¾µØÍ¼ÀëÏ߼ǼÐÅÏ¢  | 
|     PlayerControl.RemoveLeaveServerPlayerInfo(curPlayer.GetPlayerID())  | 
|       | 
|     PyGameData.g_needRefreshMapServerState = True # ÓÐÍæ¼ÒµÇ¼µØÍ¼Ê±ÉèÖÃÐèҪˢР | 
|     return  | 
|   | 
| ##¼ì²éÇеØÍ¼Çå³ý¸±±¾ÌØÊâbuff  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return   | 
| def __CheckClearBuffOnMapChange(curPlayer, tick):  | 
|     curMapID = GameWorld.GetMap().GetMapID()  | 
|     fbBuffDict = ReadChConfig.GetEvalChConfig("FBBuff")  | 
|     buffIDList = []  | 
|     for buffID, mapIDList in fbBuffDict.items():  | 
|           | 
|         # ²»ÊǸõØÍ¼µÄbuffÇå³ý  | 
|         if not mapIDList or curMapID not in mapIDList:  | 
|             if BuffSkill.DelBuffBySkillID(curPlayer, buffID, tick):  | 
|                 GameWorld.DebugLog("ÇеØÍ¼É¾³ý¶àÓàbuff: %s" % buffID)  | 
|                 buffIDList.append(buffID)  | 
|       | 
|     # Çл»µØÍ¼²»»á´øBUFFeffect£¬ReCalcAllStateͳһ´¦Àí  | 
|     for buffID in ChConfig.ClearBuffOnMapChangeList:  | 
|         BuffSkill.DelBuffBySkillID(curPlayer, buffID, tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##Ç¿ÖÆ¼ÇÂ¼Íæ¼ÒµÄһЩÐÅÏ¢  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks Ç¿ÖƼÇÂ¼Íæ¼ÒµÄһЩÐÅÏ¢  | 
| def SavePlayerMessionInDataServer(curPlayer):  | 
|     #mapID = curPlayer.GetMapID()  | 
|     #lineID = PlayerControl.GetPlayerLineID(curPlayer)  | 
|       | 
|     #¼Ç¼µØÍ¼Ïß·£¬µ±Ç°¾ÑéºÍ½ðÇ®  | 
|       | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##C++·â°ü´¥·¢, Íæ¼ÒµÇ½ÓÎÏ·  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks C++·â°ü´¥·¢, Íæ¼ÒµÇ½ÓÎÏ·  | 
| def PlayerLogin(index, tick):  | 
|     GameWorld.GetPsycoFunc(__Func_PlayerLogin)(index, tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##C++·â°ü´¥·¢, Íæ¼ÒµÇ½ÓÎÏ·  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks C++·â°ü´¥·¢, Íæ¼ÒµÇ½ÓÎÏ·  | 
| def __Func_PlayerLogin(index, tick):  | 
|     #ÕâÀïÖ»×ö³õʼ»¯Âß¼  | 
|     #ÔÚÍæ¼ÒÇл»³¡¾°µÄʱºò, ²»»áµ÷Óõ½ÕâÀï  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     InitLoginPlayer(curPlayer, tick)  | 
|     DoPlayerLogin(curPlayer, tick)  | 
|       | 
|     #Ëø×¡Íæ¼Ò, µÈµ½¶ÁÈ¡µØÍ¼³É¹¦, ÔÙ½âËø  | 
|     curPlayer.SetCanMove(False)  | 
|       | 
|     #µÇ½·¢Í¼ÐÎÑéÖ¤Âë  | 
|     PlayerAutoCheckOnline.PlayerLoginCaptcha(curPlayer, tick)  | 
|       | 
| #---------------------------------------------------------------------  | 
| ##C++·â°ü´¥·¢, Íæ¼ÒÇл»µØÍ¼µÄʱºò, ÔÚ±¾µØÍ¼µÇ¼  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks C++·â°ü´¥·¢, Íæ¼ÒÇл»µØÍ¼µÄʱºò, ÔÚ±¾µØÍ¼µÇ¼  | 
| def ChangeMapInit(index, tick):  | 
|     GameWorld.GetPsycoFunc(__Func_ChangeMapInit)(index, tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##C++·â°ü´¥·¢, Íæ¼ÒÇл»µØÍ¼µÄʱºò, ÔÚ±¾µØÍ¼µÇ¼  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks C++·â°ü´¥·¢, Íæ¼ÒÇл»µØÍ¼µÄʱºò, ÔÚ±¾µØÍ¼µÇ¼  | 
| def __Func_ChangeMapInit(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     InitLoginPlayer(curPlayer, tick)  | 
| #===============================================================================  | 
| #    #Çл»µØÍ¼£¬  | 
| #    #ÖØË¢Íæ¼ÒÊôÐÔ,ÖØÉèѪÁ¿(ÒòÇл»µØÍ¼Ê±,·â°ü¿ÉÄܱ»½Ø¶Ï,µ¼Ö¶ª°ü,ÐèÖØË¢ÊôÐÔ°ü)  | 
| #    #ÖØËãÊôÐÔ  | 
| #    playerControl = PlayerControl.PlayerControl(curPlayer)  | 
| #    playerControl.RefreshAllState()  | 
| #===============================================================================  | 
|      | 
|     #ÉèÖÃÍæ¼ÒµÄ¼¼ÄÜCD  | 
|     SkillCommon.PlayerChangeMapUpdateSkillCD(curPlayer, tick)  | 
|     #³õʼ»¯Íæ¼Ò±³°ü  | 
|     InitPlayerPack(curPlayer)  | 
|       | 
|     #ÔÚÕâ¸öÀïÃæ»áÖØË¢ËùÓÐÊôÐÔ, ±ØÐëÔÚÕÙ»½ÊÞ³öÏÖǰ×ö, ÕâÑùºÍ×°±¸Ïà¹ØµÄ±»¶¯¼¼ÄܲÅÄÜ×÷ÓÃÔÚÕÙ»½ÊÞÉíÉÏ  | 
|     DoPlayerLoginInMap(curPlayer, tick)  | 
|       | 
|     #----------±ØÐëÔÚÕâ¸öʱºò×ö, ²»ÄÜÔÚÍæ¼Ò·¢À´µØÍ¼¶ÁÈ¡okµÄʱºò×ö, ·ñÔò, Íæ¼ÒÈç¹û²»·¢À´µØÍ¼¶ÁÈ¡³É¹¦·â°ü, ¾Í²»ÄÜ´´½¨ÕâЩ¶«Î÷ÁË  | 
| #    -------------------------------------  | 
| #    Íæ¼ÒÇл»µØÍ¼³É¹¦Ö®ºó,   | 
| #    1.ҪˢÐÂGameServerÖÐæô³µµÄMapID  | 
| #    2.ҪˢÐÂ×Ô¼ºÕÙ»½ÊÞµÄ״̬  | 
| #    ------------------------------------------------------  | 
|     #Íæ¼ÒÇл»µØÍ¼³É¹¦, ³õʼ»¯Íæ¼ÒµÄ¸½¼ÓÐÅÏ¢(æô³µ, ÕÙ»½ÊÞ)  | 
|     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()):  | 
|     #    curSummon = curPlayer.GetSummonNPCAt(i)  | 
|     #    #³õʼ»¯µ±Ç°ÕÙ»½ÊÞ״̬  | 
|     #    SkillCommon.SetSummonNPCProperty(curPlayer, curSummon)  | 
|     #    summonControl = NPCCommon.NPCControl(curSummon)  | 
|     #    #¸üгðºÞ  | 
|     #    summonControl.ClearNPCAngry()                          | 
|     #    #Ë¢ÐÂNPC״̬/buff  | 
|     #    summonControl.RefreshNPCState()  | 
|     #    #Òòµ±Ç°ÑªÁ¿ÏÈË¢,×î´óѪÁ¿ºóË¢£¬ÓпÉÄܵ±Ç°ÑªÁ¿´óÓÚ×î´óѪÁ¿  | 
|     #    curSummon.SetHP(min(curSummon.GetHP() , curSummon.GetMaxHP()))  | 
|     #===========================================================================  | 
|       | 
|     #³õʼ»¯³èÎï Í¨Öª¿Í»§¶Ë  | 
|     PetControl.Sync_PetInfo_ChangeMap(curPlayer, tick)  | 
|   | 
|     #֪ͨGameServer×Ô¼ºÏÖÔڵĵØÍ¼  | 
|     curPlayer.Sync_GameServer_MapID()  | 
|       | 
|     #Èç¹û±¾µØÍ¼ÊǸ±±¾µÄ»°, Ôò֪ͨGameServerÍæ¼Ò½øÈ븱±¾  | 
|     if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtTeam:  | 
|         curPlayer.GameServer_TeamEnterFB(1)  | 
|     else:  | 
|         curPlayer.GameServer_TeamEnterFB(0)  | 
|   | 
|     #֪ͨÔËÐгɹ¦  | 
|     curPlayer.BalanceServer_PlayerChangeMapInitOK()  | 
|     #Ëø×¡Íæ¼Ò, µÈµ½¶ÁÈ¡µØÍ¼³É¹¦, ÔÙ½âËø  | 
|     curPlayer.SetCanMove(False)  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##³õʼ»¯Íæ¼Ò±³°ü  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ³õʼ»¯Íæ¼Ò±³°ü  | 
| def InitPlayerPack(curPlayer) :  | 
|     itemManager = curPlayer.GetItemManager()  | 
|       | 
|     #³õʼ»¯Íæ¼Ò±³°ü  | 
|     PlayerControl.Init_ItemPack(curPlayer)  | 
|       | 
|     #³õʼ»¯Íæ¼Ò²Ö¿â  | 
|     PlayerControl.Init_Warehouse(curPlayer)  | 
|       | 
|     #³õʼ»¯Ñ°±¦±³°ü  | 
|     PlayerControl.Init_TreasurePack(curPlayer)  | 
|       | 
|     #³õʼ»¯ÉñÊÞÎïÆ·±³°ü  | 
|     curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzItem)  | 
|     curPack.SetCount(ChConfig.Def_PackCnt_DogzItem)  | 
|     curPack.Sync_PackCanUseCount()  | 
|     #³õʼ»¯ÉñÊÞ×°±¸±³°ü  | 
|     curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)  | 
|     curPack.SetCount(ChConfig.Def_PackCnt_DogzEquip)  | 
|     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(ShareDefine.retMax)  | 
|       | 
|     #³õʼ»¯À¬»øÍ°  | 
|     #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(ShareDefine.rptPet)  | 
|     curPack.SetCount(ChConfig.Def_PackCnt_Pet)  | 
|     #curPack.Sync_PackCanUseCount()  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÊÇ·ñÓÐÎÞµÐBuff  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÕæ, ÓÐÎÞµÐBuff  | 
| #@remarks ×Ô¶¨Ò庯Êý, ÊÇ·ñÓÐÎÞµÐBuff  | 
| def __CheckLimitSuperBuff(curPlayer):  | 
|     skillID = ChConfig.Def_SkillID_LimitSuperBuff  | 
|   | 
|     return CheckHasBuffBySkillID(curPlayer, skillID)  | 
|   | 
|   | 
| ## ÅжÏÊÇ·ñÓÐij¼¼ÄÜbuff  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param skillID   | 
| #  @return ·µ»ØÖµÕæ  | 
| def CheckHasBuffBySkillID(curPlayer, skillID):  | 
|     buffSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)  | 
|     #Òì³£´íÎó  | 
|     if not buffSkill:  | 
|         GameWorld.Log("Íæ¼ÒÈ¡Ïûbuffʧ°Ü,Êý¾Ý¿âÎÞ´Ëbuff,buffid = %s " % (skillID) , curPlayer.GetPlayerID())  | 
|         return False  | 
|   | 
|     buffType = SkillCommon.GetBuffType(buffSkill)  | 
|     buffTuple = SkillCommon.GetBuffManagerByBuffType(curPlayer, buffType)  | 
|     #ͨ¹ýÀàÐÍ»ñȡĿ±êµÄbuff¹ÜÀíÆ÷Ϊ¿Õ£¬ÔòÌø³ö  | 
|     if buffTuple == ():  | 
|         return False  | 
|       | 
|     buffState = buffTuple[0]  | 
|       | 
|     #ÅжÏÊÇ·ñ´æÔÚµÄBUFF  | 
|     buffSkillTypeID = buffSkill.GetSkillTypeID()  | 
|     curBuff = buffState.FindBuff(buffSkillTypeID)  | 
|       | 
|     if not curBuff:  | 
|         return False  | 
|       | 
|     return True  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##C++·â°ü´¥·¢, Çл»µØÍ¼³É¹¦( Ä¿±êµØÍ¼ )  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@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)  | 
|   | 
|     if curPlayer.GetMapLoadOK():  | 
|         #Íæ¼ÒÒѾ¶ÁÈ¡µØÍ¼OK, ÎÞÐèÔÙ³õʼ»¯  | 
|         #GameWorld.Log("Íæ¼ÒÒѾ¶ÁÈ¡µØÍ¼OK, ÎÞÐèÔÙ³õʼ»¯" , curPlayer.GetPlayerID())  | 
|         resetFBLinePosX = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ResetFBLinePosX)  | 
|         resetFBLinePosY = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ResetFBLinePosY)  | 
|         if resetFBLinePosX and resetFBLinePosY:  | 
|             GameWorld.Log("Íæ¼Ò¸±±¾Öбä¸ü¹¦ÄÜÏß·ÐéÄâÇеØÍ¼³É¹¦!!!", curPlayer.GetPlayerID())  | 
|             curPlayer.SetDict(ChConfig.Def_PlayerKey_ResetFBLinePosX, 0)  | 
|             curPlayer.SetDict(ChConfig.Def_PlayerKey_ResetFBLinePosY, 0)  | 
|               | 
|             #curPlayer.ResetPos(resetFBLinePosX, resetFBLinePosY)  | 
|             # »Ö¸´ÊÓÒ°£¬Ë¢ÐÂ×Ô¼ºµÄÊÓÒ°  | 
|             curPlayer.SetVisible(True)  | 
|             PlayerControl.SetSight(curPlayer, ChConfig.Def_PlayerSight_Default)  | 
|             curPlayer.RefreshView()  | 
|               | 
|             FBLogic.DoEnterFB(curPlayer, tick)  | 
|         return  | 
|       | 
|     #¼ì²éGMÕʺÅÊÇ·ñÓÐȨÏ޵ǽ  | 
|     #if not __CheckGMCanLoadMapOK(curPlayer):  | 
|     #    return  | 
|       | 
|     #¼ì²âÕ˺ÅÊÇ·ñËø¶¨  | 
|     if not __CheckForbidLogin(curPlayer):  | 
|         return  | 
|       | 
|     GameWorld.Log("µØÍ¼¶ÁÈ¡³É¹¦" , curPlayer.GetPlayerID())  | 
|       | 
|     #֪ͨGameServerÇл»µØÍ¼Í£Ö¹  | 
|     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):  | 
|         #Ë¢ÐÂ×Ô¼ºµÄÊÓÒ°  | 
|         curPlayer.RefreshView()  | 
|         curPlayer.SetVisible(True)  | 
|       | 
|     #Èç¹ûÍæ¼ÒhpΪ0,ÉèÖÃÍæ¼ÒΪËÀÍö״̬  | 
|     if curPlayer.GetHP() <= 0:  | 
|         curPlayer.SetPlayerAction(IPY_GameWorld.paDie)  | 
|         #curPlayer.SetDead()  | 
|           | 
|     #°ÑÍæ¼ÒÉèÖÃΪ³õʼ»¯³É¹¦×´Ì¬  | 
|     curPlayer.SetInitOK(True)  | 
|       | 
|     #bug:GMºÅ·´ÒþÐÎÔÚÍæ¼ÒÇл»µØÍ¼Ö®ºó,½Å±¾Î´ÉèÖÃÍæ¼ÒÊôÐÔ֮ǰ£¬C++֪ͨºÏ²¢·â°üµ¼Ö¿ͻ§¶ËËÀB  | 
|     #½«·´ÒþÐοªÆô×ªÒÆµ½½Å±¾  | 
|     if curPlayer.GetGMLevel():  | 
|         curPlayer.SetIsDefVisible(True)  | 
|       | 
|     #ÓÐÏÞÎÞµÐBuff  | 
|     if not __CheckLimitSuperBuff(curPlayer):  | 
|         curPlayer.SetCanAttack(True)  | 
|           | 
|     #Èç¹ûÔÚʼþ״̬ , ¾Í²»½â³ýËø¶¨ ÈÎÎñ1ËøËÀÁË  | 
|     #if curPlayer.GetPlayerAction() != IPY_GameWorld.paEvent:  | 
|     curPlayer.SetCanMove(True)  | 
|       | 
|     #ͬ²½¿Í»§¶Ëtick  | 
|     #Õâ¸ö·â°üÒªÔÚEndLoadMap, ÉÏÂí֮ǰ·¢, ·ñÔò¿Í»§¶Ë´¦Àíʱ»ú²»¶Ô(¿Í»§¶Ë·â°ü»º´æ»úÖÆ)  | 
|     #curPlayer.Sync_ClientTick()  | 
|       | 
|     #×öÉÏÒ»¸öµØÍ¼µÄÉÏÂí/æô³µÂß¼  | 
|     #»Ö¸´×Ô¼ºµÄ״̬  | 
|     playerVehicle = curPlayer.GetLastMapPlayerVehicle()  | 
|     if playerVehicle == IPY_GameWorld.pvHorse:  | 
|         #Íæ¼ÒÔÚÆïÂíÖÐ  | 
|         if not PlayerHorse.PlayerRideHorseUp(curPlayer, False, False):  | 
|         #=======================================================================  | 
|         #    playerHorseState = curPlayer.GetLastMapPlayerRidehorseState()  | 
|         #    if playerHorseState != IPY_GameWorld.prsNormal:  | 
|         #        #Çл»µØÍ¼, »Ö¸´¼±ÐÐ״̬  | 
|         #        curPlayer.SetPlayerRidehorseState(playerHorseState)  | 
|         #          | 
|         #    #Ë¢ÐÂÈËÎïÊôÐÔ ËùÓÐ״̬  | 
|         #    playerControl = PlayerControl.PlayerControl(curPlayer)  | 
|         #    playerControl.RefreshAllState()  | 
|         # else:  | 
|         #=======================================================================  | 
|             #´ËʱÒѾÊÇÏÂÂí״̬²»ÐèҪˢ״̬ µ«ÊÇÐèҪ֪ͨ¿Í»§¶ËÏÂÂí  | 
|             PlayerHorse.PlayerRideHorseDown(curPlayer, False)  | 
|           | 
|     elif playerVehicle == IPY_GameWorld.pvTruck:  | 
|         #Íæ¼ÒÉÏæô³µ, ²»ÖØÖÃ×Ô¼ºµÄλÖÃ, ÒòÎªÍæ¼ÒÏÖÔÚ»¹ÔÚÇл»µØÍ¼ÖÐ(Ç¿ÖÆÉϳµ,ÒòΪÓпÉÄܱ»¹¥»÷)  | 
|         PlayerTruck.PlayerTruckUP(curPlayer, False , False , False)  | 
|           | 
|     InitPlayerTruck(curPlayer, tick)  | 
|   | 
|     PlayerTeam.PlayerLoginSetTeam(curPlayer, tick)  | 
|       | 
|     #ÒªÇóÊý¾Ý¿âµÃµ½Óʼþ״̬  | 
|     #curPlayer.DataServer_GetPlayerMailState()  | 
|       | 
|     #curPlayer.EndLoadMap()  | 
|   | 
|     #¼¤»îÍæ¼Ò(±£Ö¤³ÖÐøÐÔBuff´¦Àí¼ä¸ô)  | 
|     PlayerControl.SetIsNeedProcess(curPlayer, True)  | 
|   | 
|     #³õʼ»¯GM²Ù×÷  | 
|     PlayerGMOper.DoGMOperLogic(curPlayer, tick)  | 
|       | 
|     #Èç¹ûµÇ¼µÄ¸±±¾,Ö´ÐнøÈ븱±¾Âß¼, ÒòΪÓÐʱ¼äÏìÓ¦, ±ØÐëÔÚEndLoadMapÖ®ºó...  | 
|     FBLogic.DoEnterFBLogic(curPlayer, tick)  | 
|       | 
|     #´¥·¢Íæ¼Ò½øÈëµØÍ¼µÄʼþ  | 
|     EventShell.EventResponse_OnMap(curPlayer)  | 
|       | 
|     #´¥·¢Íæ¼Ò½øÈëµØÍ¼µÄʼþ  | 
|     EventShell.EventResponse_OnMapEx(curPlayer)  | 
|       | 
|     #´¥·¢Çл»µØÍ¼³èÎïÂß¼  | 
|     PetControl.DoLogic_PetLoadMapOK(curPlayer)  | 
|   | 
|     #---¼ì²éÊÇ·ñ¿¨Õϰ---  | 
|     curMap = GameWorld.GetMap()  | 
|     posX = curPlayer.GetPosX()  | 
|     posY = curPlayer.GetPosY()  | 
|       | 
|     # ¸´»îËæ»úλÖà  | 
|     if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_IsReBorn):  | 
|         if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_IsReBorn) == 2:  | 
|             PlayerControl.PlayerControl(curPlayer).SetToBornPlace()  | 
|         else:  | 
|             posX, posY = GameMap.GetNearbyPosByDis(posX, posY, ChConfig.Def_RebornPos_Area_Range)  | 
|             curPlayer.ResetPos(posX, posY)  | 
|               | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_IsReBorn, 0)  | 
|       | 
|     if curPlayer.GetHP() <= 0 or curPlayer.GetPlayerAction() == IPY_GameWorld.paDie:  | 
|         #Èç¹ûÍæ¼ÒÉÏÏߺóËÀÍö,»Ø³Ì¸´»î  | 
|         isLogin = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_LoadMapIsLogin)  | 
|         rebornType = ChConfig.rebornType_City if isLogin else ChConfig.rebornType_System  | 
|         PlayerRebornByType(curPlayer, rebornType, tick)  | 
|           | 
|     elif curMap.CanMove(posX, posY) != True:  | 
|         nearPosX, nearPosY = GameMap.GetNearbyPosByDis(posX, posY, ChConfig.Def_RebornPos_Area_Range)  | 
|         if nearPosX == 0 and nearPosY == 0:  | 
|             GameWorld.Log('Íæ¼ÒµÇÂ¼ÖØÖÃλÖÃʧ°Ü, °ÑÍæ¼Ò´ò»ØÖØÉúµã posX = %s posY = %s' % (posX, posY) , curPlayer.GetPlayerID())  | 
|             playerControl = PlayerControl.PlayerControl(curPlayer)  | 
|             playerControl.SetToBornPlace()  | 
|         else:  | 
|             curPlayer.ResetPos(nearPosX, nearPosY)  | 
|             GameWorld.Log('Íæ¼ÒµÇÂ¼ÖØÖÃλÖÃʧ°Ü, ÉèÖø½½üµã nearPosX = %s nearPosY = %s' % (nearPosX, nearPosY) , curPlayer.GetPlayerID())  | 
|   | 
|     #ÉêÇëµÃµ½½±ÀøÎïÆ·  | 
|     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)  | 
|       | 
|     #ÌØ»Ý»î¶¯Ê¼þ  | 
|     #PlayerTeHui.PlayerLoadMapOK(curPlayer)  | 
|       | 
|     #ÉèÖÃÕóÓª  | 
|     if curPlayer.GetFaction() != ChConfig.CampType_Neutral \  | 
|                 and GameWorld.GetMap().GetMapID() not in ChConfig.Def_MapID_NeedCamp \  | 
|                 and GameWorld.GetMap().GetMapID() not in ReadChConfig.GetEvalChConfig("MapID_NeedCamp"):  | 
|         #ÖØÖÃÕóÓª  | 
|         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:  | 
|         curPlayer.SetAttackMode(initAttackModel)  | 
|         SyncPKModel(curPlayer)  | 
|         GameWorld.DebugLog("½øÈëµØÍ¼Ç¿ÖÆÇл»PKģʽ: %s" % initAttackModel)  | 
|       | 
|     PassiveBuffEffMng.OnLoadMapGFPassive(curPlayer)  | 
|     ItemControler.PlayerItemControler(curPlayer).RefreshStartEquipCount()   # Ë¢ÐÂ×°±¸Õ䯷ÐǼ¶  | 
|     #EndLoadMapÐè·ÅÔÚ×îºó  | 
|     curPlayer.EndLoadMap()  | 
|     return True  | 
|   | 
| ## Çл»µØÍ¼Í¬²½Ò»´ÎPKģʽ  | 
| #  @param curPlayer  | 
| #  @return None  | 
| def SyncPKModel(curPlayer):  | 
|     # Í¬²½¿Í»§¶ËPKģʽ  | 
|     sendPack = ChPyNetSendPack.tagMCAttackMode()  | 
|     sendPack.Clear()  | 
|     sendPack.Mode = curPlayer.GetAttackMode()  | 
|     NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##¼ì²éGMÊÇ·ñ¿ÉÒԵǽµØÍ¼  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÕæ, ¿ÉÒԵǽ  | 
| #@remarks ¼ì²éGMÊÇ·ñ¿ÉÒԵǽµØÍ¼  | 
| def __CheckGMCanLoadMapOK(curPlayer):  | 
|     return True  | 
| #    if not curPlayer.GetGMLevel() :  | 
| #        #²»ÊÇGM, ¿ÉÒԵǽ  | 
| #        return True  | 
| #      | 
| #    curPlayerIP = curPlayer.GetIP()  | 
| #      | 
| #    if curPlayerIP.find('192.168.') == 0 or curPlayerIP.find('10.30.') == 0:  | 
| #        GameWorld.Log('ÄÚÍøGM = %s , %s IP = %s,µÇ½µØÍ¼·þÎñÆ÷, ²»ÑéÖ¤IP' % (curPlayer.GetID() , curPlayer.GetName() , curPlayerIP))  | 
| #        return True  | 
| #            | 
| #    #GM, IPÑéÖ¤²»Í¨¹ý  | 
| #    if not curPlayer.IsPlayerInPermitIP():  | 
| #        curPlayer.Kick(IPY_GameWorld.disIPNotPermit)  | 
| #        return  | 
| #      | 
| #    #IPÑé֤ͨ¹ý  | 
| #    return True  | 
|   | 
|   | 
| ## ¼ì²âÕ˺ÅÊÇ·ñËø¶¨  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ÊÇ·ñËø¶¨  | 
| def __CheckForbidLogin(curPlayer):  | 
|       | 
|     if (curPlayer.GetAccState() & pow(2, ChConfig.Def_PysForbidByPy)) <= 0:  | 
|         return True  | 
|       | 
|     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):  | 
|     GameWorld.GetPsycoFunc(__Func_AddPoint)(index, tick)  | 
|     return  | 
|   | 
| ##//03 01 ¼ÓÊôÐÔµã#tagCAddPoint  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks //03 01 ¼ÓÊôÐÔµã#tagCAddPoint  | 
| def __Func_AddPoint(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     playerControl = PlayerControl.PlayerControl(curPlayer)  | 
|     #JobQuotiety = PlayerControl.JobQuotiety  | 
|     curFreePoint = curPlayer.GetFreePoint()  | 
|     #job = curPlayer.GetJob()  | 
|     recvAddPoint = IPY_GameWorld.IPY_CAddPoint()  | 
|     addValue = recvAddPoint.GetPoint()  | 
|       | 
|     #¼ìÑéÊÇ·ñÄܹ»¼Óµã  | 
|     if addValue < 1 or addValue > curFreePoint:  | 
|         #¼ìÑ鲻ͨ¹ý, ·µ»Ø  | 
|         #GameWorld.ErrLog("(%s,%s)¼ìÑéÊÇ·ñÄܹ»¼Óµã£¬¼ìÑ鲻ͨ¹ý, ·µ»Ø"%(addValue,curFreePoint) , curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     #·â°ü¼ÓµãÀàÐÍ  | 
|     addPointType = recvAddPoint.GetType()  | 
|       | 
|     #¼Óµã   | 
|     if addPointType == ShareDefine.Def_Effect_STR:  | 
|         curPlayer.SetBaseSTR(addValue + curPlayer.GetBaseSTR())  | 
|           | 
|     elif addPointType == ShareDefine.Def_Effect_PNE:  | 
|         curPlayer.SetBasePNE(addValue + curPlayer.GetBasePNE())  | 
|           | 
|     elif addPointType == ShareDefine.Def_Effect_PHY:  | 
|         curPlayer.SetBasePHY(addValue + curPlayer.GetBasePHY())  | 
|           | 
|     elif addPointType == ShareDefine.Def_Effect_CON:  | 
|         curPlayer.SetBaseCON(addValue + curPlayer.GetBaseCON())  | 
|           | 
|     else:  | 
|         #Òì³£³¬³ö±ß½ç  | 
|         GameWorld.ErrLog("AddPoint GetTypeErr = %s" % (addPointType) , curPlayer.GetID())  | 
|         return  | 
|       | 
|     curPlayer.SetFreePoint(curFreePoint - addValue)  | 
|       | 
|     DataRecordPack.DR_Freepoint(curPlayer, "AddPoint", curFreePoint, {"AddPointType":addPointType})  | 
|     playerControl.RefreshPlayerAttrState()       | 
|       | 
|     return  | 
|   | 
| def NotifyPlayerBasePoint(curPlayer):  | 
|     #ÉÏÏß֪ͨ»ù´¡ÊôÐ﵋  | 
|     notifyList = []  | 
|     notifyBasePointDict = {  | 
|                  IPY_GameWorld.CDBPlayerRefresh_BaseSTR:'BaseSTR',  | 
|                  IPY_GameWorld.CDBPlayerRefresh_BasePHY:'BasePHY',  | 
|                  IPY_GameWorld.CDBPlayerRefresh_BaseCON:'BaseCON',  | 
|                  IPY_GameWorld.CDBPlayerRefresh_BasePNE:'BasePNE',  | 
|                 }  | 
|     for refreshType, keyStr in notifyBasePointDict.items():  | 
|         notifyStruct = ChPyNetSendPack.tagRefreshType()  | 
|         notifyStruct.RefreshType = refreshType  | 
|         notifyStruct.Value = getattr(curPlayer, 'Get%s'%keyStr)()  | 
|         notifyList.append(notifyStruct)  | 
|           | 
|     #ÊôÐÔ×éºÏ°ü Í¨Öª×Ô¼º  | 
|     sendPack = ChPyNetSendPack.tagObjInfoListRefresh()  | 
|     sendPack.Clear()  | 
|     sendPack.ObjID = curPlayer.GetID()  | 
|     sendPack.ObjType = curPlayer.GetGameObjType()  | 
|     sendPack.Count = len(notifyList)  | 
|     sendPack.RefreshType = notifyList  | 
|     NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
|     return  | 
|   | 
| #===============================================================================  | 
| # //B4 04 Õ½Ç°³å·æ #tagCMRush  | 
| #   | 
| # struct    tagCMRush  | 
| # {  | 
| #    tagHead        Head;  | 
| #    DWORD        ObjID;    //·ÇÅä±íNPCID£¬Ä¿Ç°Ö»Ö§³ÖNPC  | 
| #    BYTE        PosX;    // Ä¿±êX  | 
| #    BYTE        PosY;    // Ä¿±êY  | 
| # };  | 
| #===============================================================================  | 
| # Óë¿Í»§¶ËÔ¼¶¨³å·æµ½Ä¿±êºó·¢°ü Óë¼¼Äܳ巿²»Í¬  | 
| def OnPlayerRush(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_Rush) <= ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_Rush]:  | 
|         return  | 
|       | 
|     curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_Rush, tick)  | 
|       | 
|     #ÎÞ·¨Ñé֤Ŀ±ê  | 
|     #===========================================================================  | 
|     # curTag = GameWorld.GetObj(clientData.ObjID, IPY_GameWorld.gotNPC)  | 
|     # if not curTag or curTag.GetHP() ==0:  | 
|     #    return  | 
|     #   | 
|     # #ÓëÄ¿±êÏà²î̫Զ  | 
|     # if GameWorld.GetDist(curTag.GetPosX(), curTag.GetPosY(), clientData.PosX, clientData.PosY) > 6:  | 
|     #    return  | 
|     #===========================================================================  | 
|       | 
|     #³¬³öÊÓÒ°  | 
|     if GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), clientData.PosX, clientData.PosY) > curPlayer.GetSight():  | 
|         return  | 
|       | 
|     curPlayer.StopMove()  | 
|     #GameWorld.DebugLog("սǰ³å·æ %s %s"%([curPlayer.GetPosX(), curPlayer.GetPosY()], [clientData.PosX, clientData.PosY]))  | 
|     curPlayer.ChangePos(clientData.PosX, clientData.PosY)  | 
|     sendPack = ChPyNetSendPack.tagMCRush()  | 
|     sendPack.Clear()  | 
|     sendPack.ID = curPlayer.GetID()  | 
|     sendPack.ObjType = curPlayer.GetGameObjType()  | 
|     sendPack.PosX = clientData.PosX  | 
|     sendPack.PosY = clientData.PosY  | 
|       | 
|     PlayerControl.PyNotifyAll(curPlayer, sendPack, False, -1)  | 
|     return  | 
|   | 
|   | 
| #===============================================================================  | 
| # //B4 06 Õ½¶·Òƶ¯ # tagCMFightMove  | 
| #   | 
| # struct    tagCMFightMove  | 
| # {  | 
| #    tagHead        Head;  | 
| #    WORD        StartX;  | 
| #    WORD        StartY;  | 
| #    WORD        DestX;  | 
| #    WORD        DestY;  | 
| #    DWORD        WorldTick;  | 
| # };  | 
| #===============================================================================  | 
| # ÓëÒÆ¶¯µÄÇø±ðÔÚÓÚ²»¹ã²¥  | 
| def PlayerFightMove(index, clientData, tick):  | 
|     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_StartX = clientData.StartX  | 
|     sendPack_StartY = clientData.StartY  | 
|     sendPack_DestX = clientData.DestX  | 
|     sendPack_DestY = clientData.DestY  | 
|     sendPack_WorldTick = clientData.WorldTick  | 
|   | 
|     #Ïàͬµã²»Òƶ¯  | 
|     if (sendPack_StartX == sendPack_DestX) and (sendPack_StartY == sendPack_DestY):  | 
|         #GameWorld.ErrLog('PlayerMove Ïàͬµã²»Òƶ¯', curPlayer.GetID())  | 
|         return  | 
|       | 
|     #ÏÈÑé֤Ŀ±êµãÊÇ·ñºÏ·¨  | 
|     if not GameWorld.GetMap().CanMove(sendPack_DestX, sendPack_DestY):  | 
|         curPlayer.ResetPos(curPlayer.GetPosX(), curPlayer.GetPosY())  | 
|         return  | 
|       | 
|     if tick - curPlayer.GetDictByKey("FightMoveTick") < 50:  | 
|         #curPlayer.ResetPos(curPlayer.GetPosX(), curPlayer.GetPosY())  | 
|         return  | 
|     curPlayer.SetDict("FightMoveTick", tick)  | 
|       | 
|     #---Õý³£Òƶ¯---  | 
|     vehicle = curPlayer.GetPlayerVehicle()  | 
|       | 
|     if vehicle not in [IPY_GameWorld.pvNull, IPY_GameWorld.pvHorse]:  | 
|         #GameWorld.ErrLog("²»ÄÜÒÆ¶¯, ½»Í¨¹¤¾ß²»Ã÷ %d" % (vehicle), curPlayer.GetID())  | 
|         return  | 
|   | 
|     curMap = GameWorld.GetMap()  | 
|     #УÑé¿Í»§¶Ëʱ¼ä  | 
|     #if not PlayerControl.PlayerMoveCheckClientWorldTick(curPlayer, sendPack_WorldTick, sendPack_StartX, sendPack_StartY):  | 
|     #    return  | 
|       | 
|     #ÒÆ¶¯µã¼ì²é  | 
|     if not CheckMovePos(curPlayer, curPlayer, curMap, sendPack_StartX, sendPack_StartY, sendPack_DestX, sendPack_DestY):  | 
|         return  | 
|       | 
|     if GameWorld.GetDist(sendPack_StartX, sendPack_StartY, sendPack_DestX, sendPack_DestY) > 20:  | 
|         curPlayer.ResetPos(curPlayer.GetPosX(), curPlayer.GetPosY())  | 
|         return  | 
|       | 
|     #Èç¹ûÊÇСÓÎÏ·ÖÐÔòֹͣСÓÎÏ·  | 
|     if curPlayer.GetPlayerAction() == IPY_GameWorld.paGameEvent:  | 
|         PlayerGameEvent.StopGameEvent(curPlayer, tick)  | 
|       | 
|     #ɾ³ýÓÐÏÞÎÞµÐBUFF  | 
|     PlayerControl.DelLimitSuperBuff(curPlayer, tick)  | 
|       | 
|     curPlayer.ChangePos(sendPack_DestX, sendPack_DestY)  | 
|     #curPlayer.SetClientMoveTick(sendPack_WorldTick)  | 
|       | 
|     fightPet = curPlayer.GetPetMgr().GetFightPet()  | 
|     #ÎÞ³öÕ½³èÎï  | 
|     if fightPet == None:  | 
|         return  | 
|       | 
|     if GameWorld.GetDist(fightPet.GetPosX(), fightPet.GetPosY(), sendPack_DestX, sendPack_DestY) <= 4:  | 
|         #Õ½¶·Öв»Æµ·±Òƶ¯  | 
|         return  | 
|   | 
|     #³öÕ½³èÎïÍ¬Ê±ÒÆ¶¯  | 
|     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  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÑéÖ¤Íæ¼ÒÊÇ·ñ¿ÉÒÔÒÆ¶¯.  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @return ²¼¶ûÖµ  | 
| # @remarks ¿Í»§¶Ë·â°üÏìÓ¦  | 
| def __CheckPlayerCanMove(curPlayer):  | 
|     if not curPlayer.GetMapLoadOK():  | 
|         #Íæ¼ÒµØÍ¼¶Áȡδ³É¹¦, Ìß³öÕâÈË  | 
|         #curPlayer.Kick(IPY_GameWorld.disPlayerMovedWhenNotPrepare)  | 
|         return False  | 
|       | 
|     #Ëø¶¨²»¿ÉÒÆ¶¯  | 
|     if not curPlayer.GetCanMove():  | 
|         return False  | 
|       | 
|     #Íæ¼ÒÒѾËÀÍö  | 
|     if curPlayer.GetHP() <= 0:  | 
|         return False  | 
|       | 
| #    #Ñ£ÔÎʱ£¬²»¿ÉÒÆ¶¯ zhengyang 2010-6-2  | 
| #    if curPlayer.GetAbnormalState() == IPY_GameWorld.sctFaint:  | 
| #        return False  | 
|       | 
|     #²»¿ÉÒÆ¶¯ÐÐΪ״̬, ÅжϷþÎñ¶ËÏÞÖÆ  | 
|     if not OperControlManager.IsObjCanDoAction(  | 
|                                         curPlayer,  | 
|                                         ChConfig.Def_Obj_ActState_ServerAct,  | 
|                                         IPY_GameWorld.oalMove  | 
|                                         ):  | 
|         return False  | 
|       | 
|     #Íæ¼ÒͨÓõÄ״̬ת»»¼ì²é  | 
|     if not PlayerControl.PlayerCanStateTransfer(curPlayer):  | 
|         return False  | 
|       | 
|     return True  | 
|   | 
|   | 
| #---------------------------------------------------------------------  | 
| ##Íæ¼ÒÆÕÍ¨ÒÆ¶¯  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param client_StartX ¿Í»§¶ËÆðµãX  | 
| #@param client_StartX ¿Í»§¶ËÆðµãY  | 
| #@param client_DestX ¿Í»§¶ËÄ¿±êµãX  | 
| #@param client_DestY ¿Í»§¶ËÄ¿±êµãY  | 
| #@param tick Ê±¼ä  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks Íæ¼ÒÆÕÍ¨ÒÆ¶¯  | 
| def PlayerNormalMove(curPlayer, client_StartX, client_StartY, client_DestX,  | 
|                      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):  | 
|         curPlayer.Sync_ClientTick()  | 
|         return  | 
|       | 
|     #ÒÆ¶¯µã¼ì²é  | 
|     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  | 
|     #PlayerControl.DelLimitSuperBuff(curPlayer, tick)  | 
|       | 
|     #GameWorld.DebugLog("ÒÆ¶¯Ç°-----Íæ¼Ò×ø±ê %s-%s  Ä¿µÄµØ%s -%s"%(curPlayer.GetPosX(), curPlayer.GetPosY(), client_DestX, client_DestY))  | 
|     # ÔÚUpdatePos µ÷Óüä¸ôÄÚ¶à´Îµ÷ÓÃmove»áʹ m_StartMoveTick ÖØÖ㬵¼ÖÂÎÞ·¨Òƶ¯  | 
|     # ¶øÔÚ CheckMovePos -> PlayerRefreshPos -> __FixPlayerPos -> ChangePos Ôì³ÉÒÆ¶¯µÄÏÖÏó  | 
|     curPlayer.Move(client_DestX, client_DestY)  | 
|   | 
|     #³öÕ½³èÎïÍ¬Ê±ÒÆ¶¯  | 
|     #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 Òƶ¯¶ÔÏó  | 
| #@param curMap µ±Ç°µØÍ¼  | 
| #@param startX ¿ªÊ¼Òƶ¯×ø±êX  | 
| #@param startY ¿ªÊ¼Òƶ¯×ø±êY  | 
| #@param destX Òƶ¯Ä¿±êX  | 
| #@param destY Òƶ¯Ä¿±êY  | 
| #@param sendPlayerMoveFail ÊÇ·ñ·¢ËÍÒÆ¶¯Ê§°Ü  | 
| #@return ·µ»ØÖµÕæ, ¼ì²é³É¹¦  | 
| #@remarks Òƶ¯µã¼ì²é, checkObj ÊÇÒÆ¶¯¶ÔÏó(ÔÚÈËïÚºÏһ״̬ÏÂ, ÊäÈëΪæô³µ  | 
| def CheckMovePos(curPlayer, checkObj, curMap, startX, startY, destX, destY, sendPlayerMoveFail=True):  | 
|     #Æðʼµã,Ä¿±êµã  | 
|     #Ë¢ÐÂÍæ¼Òµ±Ç°Î»Öà  | 
|     if not PlayerControl.PlayerRefreshPos(curPlayer, checkObj, startX, startY):  | 
|         #Íæ¼Òµ±Ç°Î»ÖÃË¢ÐÂʧ°Ü  | 
|         #GameWorld.Log("Íæ¼Òµ±Ç°Î»ÖÃË¢ÐÂʧ°Ü" , curPlayer.GetPlayerID())  | 
|         if sendPlayerMoveFail and curPlayer.GetID() == checkObj.GetID():  | 
|             #Ô˶¯ÕßÊÇÍæ¼Ò, ÄÇÃ´ÖØÖÃÍæ¼ÒλÖà  | 
|             curPlayer.ResetPos(curPlayer.GetPosX(), curPlayer.GetPosY())  | 
|               | 
|         return False  | 
|       | 
|     #µ±Ç°¶ÔÏó×ø±ê  | 
|     objPosX = checkObj.GetPosX()  | 
|     objPosY = checkObj.GetPosY()  | 
|       | 
|     #Ä¿µÄµØÊÇ·ñ¿ÉÒÔµ½´ï  | 
|     if not curMap.CanMove(destX, destY):  | 
|         #µØ·½²»¿É×ß, ÖØÖÃÍæ¼ÒµÄλÖà  | 
|         #GameWorld.Log("µØ·½²»¿É×ß, ÖØÖÃÍæ¼ÒµÄλÖÃ" , curPlayer.GetPlayerID())  | 
|         if sendPlayerMoveFail:  | 
|             curPlayer.MoveFail()  | 
|               | 
|         return False  | 
|           | 
|     #¼ì²éÍæ¼ÒÒÆ¶¯¾àÀëÊÇ·ñ¹ýÔ¶  | 
|     moveDist = GameWorld.GetDist(objPosX, objPosY, destX, destY)  | 
|     if moveDist > ChConfig.Def_PlayerMaxMoveDist:  | 
|         #GameWorld.Log("ÒÆ¶¯Ê§°Ü£¬¼ì²éÍæ¼ÒÒÆ¶¯¾àÀëÊÇ·ñ¹ýÔ¶" , curPlayer.GetPlayerID())  | 
|         if sendPlayerMoveFail:  | 
|             curPlayer.MoveFail()  | 
|               | 
|         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 \  | 
| #           curObj.GetHP() <= 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();  | 
| #   | 
| # class   IPY_CCliectReborn  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetType();  | 
| #    //0: ÒøÆ± 1:Òø×Ó  | 
| #    int      GetMoneyType();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //03 05Ö÷½Çµã»÷¸´»î#tagCCliectReborn  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦ //03 05Ö÷½Çµã»÷¸´»î#tagCCliectReborn  | 
| def PlayerClickReborn(index, tick):  | 
|     #Íæ¼Òµã»÷: ÖØÉú  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     #¸ù¾ÝÍæ¼ÒÑ¡ÔñÖØÉúÑ¡ÏîÖØÉú  | 
|     sendPack = IPY_GameWorld.IPY_CCliectReborn()  | 
|     #¸´»îÀàÐÍ  | 
|     playerRebornType = sendPack.GetType()  | 
|       | 
|     if curPlayer.GetHP() > 0:  | 
|         # µ±ÑªÁ¿´óÓÚ0ÊÕµ½¸´»îÇëÇó°üʱ£¬Ò»°ãÊÇǰºó¶Ë¸´»î״̬²»Ò»ÖµÄÇé¿öϵ¼Ö嵀  | 
|         # ÓÉÓÚǰ¶ËÐèÒª¸ù¾Ý¸´»î״̬Åжϸ´»î½çÃæÏà¹ØÂß¼£¬ËùÒÔÕâÀïÐèÒª×öÒ»Ð©ÌØÊâ´¦Àí£¬·ÀֹijЩÇé¿öÏÂǰºó¶Ë¸´»î״̬²»Ò»Öµ¼ÖµÄһЩÒì³£ÎÊÌâ  | 
|           | 
|         # ºó¶Ë·ÇËÀÍö״̬µÄÇé¿ö£¬²¹Í¬²½Ò»´Î¸´»î°ü¸øÇ°¶Ë  | 
|         if curPlayer.GetPlayerAction() != IPY_GameWorld.paDie:  | 
|             SyncPlayerReborn(curPlayer, playerRebornType)  | 
|         # ºó¶ËÒ²ÊÇËÀÍö״̬µÄÇé¿ö£¬Ö±½ÓÖØÐ´¥·¢Ò»´Î¸´»î  | 
|         else:  | 
|             PlayerRebornByType(curPlayer, playerRebornType, tick)  | 
|         #ÉúÃüÖµ²»Îª0 , ²»ÄÜÖØÉú  | 
| #        GameWorld.Log("Íæ¼Òµã»÷: ÖØÉúʧ°Ü,ÉúÃüÖµ²»Îª0 , ²»ÄÜÖØÉú" , curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     #FBÖнûÖ¹¸´»î  | 
|     if FBLogic.DoFBForbidReborn(curPlayer, playerRebornType):  | 
|         PlayerControl.NotifyCode(curPlayer, "Reborn_lhs_31379")  | 
|         return  | 
|       | 
|     #Íæ¼Ò¸´»î  | 
|     if PlayerRebornByType(curPlayer, playerRebornType, tick):  | 
|         #Íæ¼Ò¸´»î³É¹¦,ÅжÏÊÇ·ñÔÚ¸±±¾Öи´»î  | 
|         PlayerReborn_InFB(curPlayer, playerRebornType, tick)  | 
|           | 
|     return  | 
|   | 
| def SyncPlayerReborn(curPlayer, rebornType):  | 
|     rebornInfo = ChNetSendPack.tagPlayerReborn()  | 
|     rebornInfo.Clear()  | 
|     rebornInfo.PlayerID = curPlayer.GetPlayerID()  | 
|     rebornInfo.Type = rebornType  | 
|     rebornInfo.PosX = curPlayer.GetPosX()  | 
|     rebornInfo.PosY = curPlayer.GetPosY()  | 
|     NetPackCommon.SendFakePack(curPlayer, rebornInfo)      | 
|     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'] = tagObj.GetMaxHP()  | 
|             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 curPlayer.GetHP() <= 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 Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks C++·â°ü´¥·¢, Íæ¼ÒÏÂÏß  | 
| 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 Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks C++·â°ü´¥·¢, Íæ¼ÒÏÂÏß  | 
| def __Func_PlayerDisconnect(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     try:  | 
|         # ±ÜÃâÒòÂß¼´íÎóµ¼ÖÂÏÂÏßʧ°Ü£¬¿ÉÄܵ¼Ö»صµµÄÇé¿ö  | 
|         DoPlayerDisconnect(curPlayer, tick)  | 
|     except:  | 
|         import traceback  | 
|         GameWorld.ErrLog("Íæ¼ÒÏÂÏßÂß¼´íÎó~~~~~\r\n%s" % traceback.format_exc())  | 
|         if GameWorld.GetGameWorld().GetDebugLevel():  | 
|             raise Exception("Íæ¼ÒÏÂÏß~~~~~\r\n%s" % traceback.format_exc())  | 
|           | 
|     #µ÷ÓõײãÊ¹Íæ¼ÒÏÂÏß  | 
|     curPlayer.DoDisconnect(tick)  | 
|       | 
| ##Íæ¼ÒÕý³£ÏÂÏß  | 
| #@param curPlayer Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks C++·â°ü´¥·¢, Íæ¼ÒÏÂÏß  | 
| def DoPlayerDisconnect(curPlayer, tick):  | 
|       | 
|     GameWorld.Log("PlayerDisconnect!" , curPlayer.GetPlayerID())  | 
|       | 
|     PlayerMergeEvent.BroadcastMergePlayerEvent()  | 
|     #ÏÂÏßÁË£¬½«´æ´¢ÔÚ×ÖµäÖеÄÕæÊµXPÖµ£¬ÉèÖøøÍæ¼Ò£¬Íê³É֪ͨºÍ´æ´¢  | 
|     #curPlayer.SetXP(curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_RecordXPValue))  | 
|     #######################################################################  | 
|     #ÏÂÏßÂß¼  | 
|     PlayerControl.PlayerLeaveServer(curPlayer, tick)  | 
|       | 
|     #######################################################################  | 
|     #Éè¶¨Íæ¼ÒµÄÏÂÏßʱ¼ä  | 
|     curPlayer.SetLogoffTime(GameWorld.GetCurrentDataTimeStr())  | 
|       | 
|     #Á÷Ïò¼ÇÂ¼Íæ¼ÒÏÂÏß  | 
|     DataRecordPack.DR_PlayerDisconnect(curPlayer)  | 
|       | 
|     #¼Ç¼ÐÂÔöÓÐЧµÇÂ½Íæ¼Ò  | 
|     NoteLoginValid(curPlayer)  | 
|       | 
|     #VIPʱ¼ä  | 
|     #PlayerVip.CalcVIPTimeByTick(curPlayer, tick, False)  | 
|     #ÔÚÏßʱ¼ä  | 
|     PlayerOnlinePrize.CalcOnlineTime(curPlayer)  | 
|     #Ê׳äÌáʾʱ¼ä  | 
|     PlayerGoldGift.UpdateFirstGoldTime(curPlayer)  | 
|     #Íæ¼Òδ»ØÍ¼ÐÎÑéÖ¤ÂëÏÂÏß½«»á¼Ç¼´íÎó´ÎÊý  | 
|     #===========================================================================  | 
|     # if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_Captcha_WaitSign) \  | 
|     # == PlayerAutoCheckOnline.Def_Captcha_WaitAnswer:  | 
|     #    PlayerAutoCheckOnline.CaptchaAnswerErr(curPlayer, tick, False)  | 
|     #   | 
|     #    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_Captcha_WaitSign, PlayerAutoCheckOnline.Def_Captcha_Safe)  | 
|     #   | 
|     #===========================================================================  | 
|     #@warning: µÈ×Ö¶ÎͳһÐ޸ģ¬É¾³ýË«±¶¾ÑéBUFF  | 
|     #PlayerDoubleExpSys.DeleteDoubleExpBuff(curPlayer, ChConfig.Def_DoubleExpNote_StopOff)  | 
|       | 
|     #ÉèÖÃRouteServerInitOK×Öµä  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RouteServerInitOK, 0)  | 
|       | 
|     #È¡Ïû×Ô¶¯ÔËïÚ״̬  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_AutoTruck, 0)  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RoomID, 0)  | 
|       | 
|     #ÏÂÏßÕٻسèÎï  | 
|     #PetControl.ReCallFightPet(curPlayer)  | 
|       | 
|     PlayerTJG.CalcPlayerTJG(curPlayer, tick)  | 
|       | 
|     #ÀëÏßsession  | 
|     EventReport.WriteEvent_session(curPlayer)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //03 03 ÉèÖÿì½ÝÀ¸±£´æ#tagCSetShutCutData  | 
| # tagCSetShutCutData       *   GettagCSetShutCutData();  | 
| #   | 
| # class   IPY_CSetShutCutData  | 
| # {  | 
| # public:  | 
| #   | 
| #    char *      GetSetting();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //03 03 ÉèÖÿì½ÝÀ¸±£´æ#tagCSetShutCutData  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦ //03 03 ÉèÖÿì½ÝÀ¸±£´æ#tagCSetShutCutData  | 
| def SetShutcutSettingHV(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     sendPack = IPY_GameWorld.IPY_CSetShutCutData()  | 
|       | 
|     setting = sendPack.GetSetting()  | 
|     if not GameWorld.EncodingToUnicode(setting):  | 
|         #±àÂë¸ñʽ²»ºÏ·¨  | 
|         setting = ""  | 
|         GameWorld.ErrLog("SetShutCutData Encoding Err", curPlayer.GetID())  | 
|         return  | 
|       | 
|     if len(setting) > 100:  | 
|         return  | 
|       | 
|     curPlayer.SetSetting(setting)  | 
|     return  | 
|   | 
| #// A2 22 ÉèÖÃÒýµ¼³É¹¦ #tagCMSetGuideOK  | 
| #  | 
| #struct    tagCMSetGuideOK  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        GuideIndex; // ¼Ç¼λË÷Òý, ·¢ËÍ255ʱ,´ú±íÉèÖÃÈ«²¿  | 
| #    BYTE        IsOK;  | 
| #};  | 
| def OnSetGuideOK(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     guideIndex = clientData.GuideIndex  | 
|     isOK = clientData.IsOK  | 
|     # È«²¿ÉèÖà  | 
|     if guideIndex == 255:  | 
|         value = 0 if not isOK else (pow(2, 31) - 1)  | 
|         for i in xrange(ChConfig.Def_GuideStateKeyCount):  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GuideState % i, value)  | 
|         GameWorld.DebugLog("ÉèÖÃÈ«²¿Òýµ¼×´Ì¬: isOK=%s,value=%s" % (isOK, value))  | 
|     else:  | 
|         if guideIndex >= 31*ChConfig.Def_GuideStateKeyCount:  | 
|             GameWorld.ErrLog("ÉèÖÃÒýµ¼Ê§°Ü, ³¬¹ý×î´óÖ§³Ö¼Ç¼λ£¡ guideIndex=%s" % guideIndex)  | 
|             return  | 
|         GameWorld.DebugLog("ÉèÖÃÒýµ¼³É¹¦ guideIndex=%s,isOK=%s" % (guideIndex, isOK))  | 
|         isOK = 1 if isOK else 0  | 
|         GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GuideState, guideIndex, isOK)  | 
|     # ÕâÀïÖ»¸üÐÂ״ֵ̬  | 
|     #SyncGuideState(curPlayer)  | 
|     return  | 
|   | 
| def SyncGuideState(curPlayer):  | 
|     # Í¬²½Òýµ¼×´Ì¬¼Ç¼  | 
|     guideStatePack = ChPyNetSendPack.tagMCGuideState()  | 
|     guideStatePack.GuideState = []  | 
|     for i in xrange(ChConfig.Def_GuideStateKeyCount):  | 
|         guideStatePack.GuideState.append(curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_GuideState % i))  | 
|     guideStatePack.Count = len(guideStatePack.GuideState)  | 
|     NetPackCommon.SendFakePack(curPlayer, guideStatePack)  | 
|     return  | 
|   | 
| def ShowGuide(curPlayer, guideID):  | 
|     # Í¨Öª¿Í»§¶ËÏÔʾÒýµ¼  | 
|     showGuide = ChPyNetSendPack.tagMCShowGuide()  | 
|     showGuide.GuideID = guideID  | 
|     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 µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def OnPlayerChangeAction(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     if not curPlayer:  | 
|         return  | 
|       | 
|     lastAction = curPlayer.GetPlayerLastAction()  | 
|     curAction = curPlayer.GetPlayerAction()  | 
|       | 
|     if lastAction == curAction:  | 
|         return  | 
|       | 
|     #Èç¹ûÉÏÒ»¸ö״̬ÊÇСÓÎϷ״̬  | 
|     if lastAction == IPY_GameWorld.paGameEvent:  | 
|         PlayerGameEvent.TakeoffFishermanEquipment(curPlayer)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //03 06 ÉèÖÃÉúÃü»Ö¸´ÊýÖµ#tagCSetHPRestore  | 
| # tagCSetHPRestore       *   GettagCSetHPRestore();  | 
| #   | 
| # class   IPY_CSetHPRestore  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetValue();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //03 06 ÉèÖÃÉúÃü»Ö¸´ÊýÖµ#tagCSetHPRestore  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦ //03 06 ÉèÖÃÉúÃü»Ö¸´ÊýÖµ#tagCSetHPRestore  | 
| def HPRestoreSetting(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     sendPack = IPY_GameWorld.IPY_CSetHPRestore()  | 
|     curValue = sendPack.GetValue()  | 
|     if curValue < 0 or curValue > 100:  | 
|         return  | 
|     curPlayer.SetHPRestoreSetting(curValue)  | 
|     #Íæ¼Ò»î×ŵÄʱºòµ÷Óà  | 
|     if curPlayer.GetHP() > 0 :  | 
|         #µ÷ÓÃ×Ô¶¯»ØÑª  | 
|         PlayerControl.PlayerAutoRestoreHP(curPlayer, tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //03 07 ÉèÖÃħ·¨»Ö¸´ÊýÖµ#tagCSetMPRestore  | 
| # tagCSetMPRestore       *   GettagCSetMPRestore();  | 
| #   | 
| # class   IPY_CSetMPRestore  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetValue();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //03 07 ÉèÖÃħ·¨»Ö¸´ÊýÖµ#tagCSetMPRestore  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦ //03 07 ÉèÖÃħ·¨»Ö¸´ÊýÖµ#tagCSetMPRestore  | 
| def MPRestoreSetting(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     sendPack = IPY_GameWorld.IPY_CSetMPRestore()  | 
|     curValue = sendPack.GetValue()  | 
|     if curValue < 0 or curValue > 100:  | 
|         return  | 
|       | 
|     curPlayer.SetMPRestoreSetting(curValue)  | 
|       | 
|     #Íæ¼Ò»î×ŵÄʱºòµ÷Óà  | 
|     if curPlayer.GetHP() > 0 :  | 
|         #µ÷ÓÃ×Ô¶¯»ØÄ§  | 
|         PlayerControl.PlayerAutoRestoreMP(curPlayer, tick)  | 
|           | 
|     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  | 
|   | 
| ##¸Ä±äÍæ¼ÒPKģʽ  | 
| #@param curPlayer Íæ¼Ò  | 
| #@param attackMode  | 
| #@return  | 
| def ChangeAttackMode(curPlayer, attackMode):  | 
|       | 
|     if attackMode < IPY_GameWorld.amPeace or attackMode >= IPY_GameWorld.amMax:  | 
|         GameWorld.DebugLog("±ä¸üPKģʽÒì³££¬²»´æÔÚ¸Ãģʽ!attackMode=%s" % attackMode)  | 
|         return  | 
|     if curPlayer.GetAttackMode() == attackMode:  | 
|         GameWorld.DebugLog("PKģʽÏàͬ£¬²»±ä¸ü!attackMode=%s" % attackMode)  | 
|         return  | 
|       | 
|     attackModels = GameWorld.GetMap().GetAttackModels()  | 
|     if not attackModels & pow(2, attackMode):  | 
|         GameWorld.DebugLog("±¾µØÍ¼½ûÖ¹Çл»¸Ãģʽ£¡attackModels=%s,changeMode=%s" % (attackModels, attackMode))  | 
|         return  | 
|       | 
|     #Èç¹ûÇл»µ½ºÍƽģʽ,Çå¿ÕËùÓÐÕÙ»½Ê޵ijðºÞ  | 
|     if attackMode == IPY_GameWorld.amPeace:  | 
|         NPCCommon.ClearSummonAngry_Player(curPlayer)  | 
|       | 
|     curPlayer.SetAttackMode(attackMode)  | 
|       | 
|     # Í¬²½¿Í»§¶ËPKģʽ  | 
|     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 curPlayer.GetHP() == 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  | 
| #   | 
| # struct tagCMAdult  | 
| # {  | 
| #    tagHead        Head;  | 
| #    BYTE        Adult;   | 
| # };  | 
| #===============================================================================  | 
| # Ö»Ð޸ĵØÍ¼µÄadult£¬Ï´εǼ»áÔڵǼ°ü·¢£¬×¢Òâ²âÊÔÇл»µØÍ¼  | 
| def PySetAdult(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     adult = 1 if clientData.Adult else 0  | 
|     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 curPlayer.GetHP() <= 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 Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¼ì²éÍæ¼ÒÊÇ·ñ¿ÉÒÔÍ£Ö¹ÒÆ¶¯  | 
| def CheckPlayerStopMove(curPlayer):  | 
|     if not curPlayer.GetMapLoadOK() :  | 
|         #Íæ¼ÒµØÍ¼¶ÁȡΪ³É¹¦, Ìß³öÕâÈË  | 
|         #curPlayer.Kick(IPY_GameWorld.disPlayerMovedWhenNotPrepare)  | 
|         #GameWorld.Log("Íæ¼ÒµØÍ¼¶ÁȡûÓгɹ¦")  | 
|         return  | 
|       | 
|     if curPlayer.GetHP() == 0:  | 
|         #Íæ¼ÒÒѾËÀÍö  | 
|         #GameWorld.Log("Íæ¼ÒÍ£Ö¹ÒÆ¶¯,Íæ¼ÒÒѾËÀÍö")  | 
|         return  | 
|       | 
|     if PlayerControl.PlayerCanStateTransfer(curPlayer) != True:  | 
|         #GameWorld.Log("ÒÆ¶¯×´Ì¬´íÎó")  | 
|         return  | 
|       | 
|     if curPlayer.GetCanMove() != True:  | 
|         #GameWorld.Log("Íæ¼Ò²»¿ÉÍ£Ö¹")  | 
|         return  | 
|       | 
|     return True  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##C++·â°ü´¥·¢, Íæ¼ÒÄܹ»ÖØÖÃ×Ô¼ºµÄλÖà  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks C++·â°ü´¥·¢, Íæ¼ÒÄܹ»ÖØÖÃ×Ô¼ºµÄλÖà  | 
| def PlayerCanResetWorldPos(index, tick):  | 
|     GameWorld.GetPsycoFunc(__Func_PlayerCanResetWorldPos)(index, tick)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| ##C++·â°ü´¥·¢, Íæ¼ÒÄܹ»ÖØÖÃ×Ô¼ºµÄλÖà  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks C++·â°ü´¥·¢, Íæ¼ÒÄܹ»ÖØÖÃ×Ô¼ºµÄλÖà  | 
| def __Func_PlayerCanResetWorldPos(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     PlayerControl.DoPlayerResetWorldPos(curPlayer, tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##C++·â°ü´¥·¢, Çл»µØÍ¼Ê§°Ü·â°ü´¥·¢  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks C++·â°ü´¥·¢, Çл»µØÍ¼Ê§°Ü·â°ü´¥·¢  | 
| def PlayerChangeMapFailCallback(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #´«ËÍʱ, Ëø¶¨Íæ¼Ò, ´«Ëͳɹ¦, ÔÚÄ¿±êµØÍ¼½âËø, ´«ËÍʧ°Ü, ÔÚ´«Ëͻص÷º¯ÊýPlayerChangeMapFailCallbackÖнâËø  | 
|     curPlayer.ExitEvent()  | 
|     NotifyChangeMapFail(curPlayer)  | 
|     return  | 
|   | 
|   | 
| # Í¨ÖªÇл»µØÍ¼Ê§°Ü  | 
| def NotifyChangeMapFail(curPlayer):  | 
|     curPlayer.SetVisible(True)  | 
|     sendPack = ChPyNetSendPack.tagMCChangeMapFail()  | 
|     sendPack.Clear()  | 
|       | 
|     NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
|     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 summonNPC.GetHP() <= 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 summonNPC.GetHP() <= 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 summonNPC.GetHP() <= 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  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //03 10 Í˳ö¸±±¾#tagCExitFB  | 
| # tagCExitFB       *   GettagCExitFB();  | 
| #   | 
| # class   IPY_CExitFB  | 
| # {  | 
| # public:  | 
| #    //ÎÞÒâÒå  | 
| #    int      GetType();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //03 10 Í˳ö¸±±¾#tagCExitFB  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦ //03 10 Í˳ö¸±±¾#tagCExitFB  | 
| def ExitFB(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     __Func_ExitFB(curPlayer, tick)  | 
|     return  | 
|   | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //03 10 Í˳ö¸±±¾#tagCExitFB  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦ //03 10 Í˳ö¸±±¾#tagCExitFB  | 
| def __Func_ExitFB(curPlayer, tick):  | 
|     if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull:  | 
|         return  | 
|       | 
|     GameWorld.Log('Íæ¼Ò = %s , Ö÷¶¯À뿪¸±±¾' % (curPlayer.GetName()) , curPlayer.GetID())  | 
|       | 
|     if not FBLogic.CanPlayerLeaveFB(curPlayer):  | 
|         return  | 
|       | 
|     #Íæ¼ÒÖ÷¶¯Í˳öFB,ÏÈ´¦ÀíFBÏà¹ØÐÅÏ¢£¬ÔÙÈÃÍæ¼ÒÍ˳ö  | 
|     FBLogic.DoPlayerLeaveFB(curPlayer, tick)  | 
|       | 
|     #Íæ¼ÒÖ÷¶¯À뿪¸±±¾  | 
|     PlayerControl.PlayerLeaveFB(curPlayer)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //01 0B Çл»·ÖÁ÷#tagCChangeLine  | 
| # tagCChangeLine       *   GettagCChangeLine();  | 
| #   | 
| # class   IPY_CChangeLine  | 
| # {  | 
| # public:  | 
| #    //»»µ½¼¸Ïß  | 
| #    int      GetLine();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //01 0B Çл»·ÖÁ÷#tagCChangeLine  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦ //01 0B Çл»·ÖÁ÷#tagCChangeLine  | 
| def ChangeLine(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     sendPack = IPY_GameWorld.IPY_CChangeLine()  | 
|     changLineID = sendPack.GetLine()  | 
|       | 
|     if changLineID < 0:  | 
|         GameWorld.ErrLog("ChangeLine -> ·â°ü´íÎó, ÎÞ´ËÏß· = %s" % (changLineID), curPlayer.GetID())  | 
|         return  | 
|       | 
|     mapID = curPlayer.GetMapID()  | 
|       | 
|     activityLineID = 0 # »î¶¯Ïß, Ä¬ÈÏ1Ïß  | 
|     activityMapLineDict = IpyGameDataPY.GetFuncEvalCfg("MapLine", 2, {})  | 
|     if mapID in activityMapLineDict:  | 
|         activityLineID = max(0, activityMapLineDict[mapID] - 1)  | 
|           | 
|     mapLineDict = IpyGameDataPY.GetFuncEvalCfg("MapLine", 1)  | 
|     if changLineID != activityLineID and mapID in mapLineDict and changLineID >= mapLineDict[mapID]:  | 
|         GameWorld.ErrLog("¸ÃµØÍ¼Ã»Óпª·Å´ËÏß·£¬ÎÞ·¨ÊÖ¶¯Çл»£¡mapID=%s,changLineID=%s,maxLine=%s"   | 
|                          % (mapID, changLineID, mapLineDict[mapID]), curPlayer.GetID())  | 
|         return  | 
|       | 
|     #¼ì²éÊÇ·ñ¿ÉÒÔ»»Ïß  | 
|     if not __CheckCanChangLine(curPlayer, tick):  | 
|         return  | 
|       | 
|     #¿ªÊ¼»»Ïß  | 
|     PlayerControl.PlayerChangeLine(curPlayer, changLineID)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##Çл»·ÖÁ÷¼ì²âº¯Êý  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ²¼¶ûÖµ  | 
| #@remarks Çл»·ÖÁ÷¼ì²âº¯Êý  | 
| def __CheckCanChangLine(curPlayer, tick):  | 
|     #---¼ä¸ô¼ì²é---  | 
|     if tick - curPlayer.GetLoginTick() < ChConfig.Def_PlayerChangLine_Tick:  | 
|         #PK_liubo_500807   <n color="0,255,0">¶Ô²»Æð£¬ÄúÇл»ÓÎÏ·Ïß·¹ýÓÚÆµ·±£¬ÇëÉÔºóÖØÊÔ!</n>   256 -  | 
|         PlayerControl.NotifyCode(curPlayer, "PK_liubo_500807")  | 
|         #GameWorld.Log("µÇ¼¼ä¸ôСÓÚ%s,ÎÞ·¨»»Ïß"%ChConfig.Def_PlayerChangLine_Tick)  | 
|         return False  | 
|       | 
|     #---״̬¼ì²é---  | 
|     playerAction = curPlayer.GetPlayerAction()  | 
|       | 
|     if playerAction == IPY_GameWorld.paSit:  | 
|         PlayerControl.DoPlayerStand(curPlayer)  | 
|           | 
|     elif playerAction not in ChConfig.Def_PlayerChangLine_State:  | 
|         #GeRen_liubo_71563    <n color="0,255,0">¶Ô²»Æð£¬Äú´¦ÓÚʼþ״̬ÖУ¬ÎÞ·¨Çл»Ïß·!</n> 256 -  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_71563")  | 
|         #GameWorld.Log("·Ç¿ÕÏÐ״̬ÎÞ·¨»»Ïß")  | 
|         return False  | 
|       | 
|     #---Õ½¶·ÖÐ---  | 
|     if PlayerControl.IsPlayerInFight(curPlayer):  | 
|         #GeRen_liubo_850801   <n color="0,255,0">¶Ô²»Æð£¬Äú´¦ÓÚÕ½¶·×´Ì¬ÖУ¬ÎÞ·¨Çл»Ïß·!</n> 256 -  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_850801")  | 
|         #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  | 
|   | 
|   | 
|   | 
| ##»ñÈ¡ËÀÍöÀäȴʱ¼ä  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param playerRebornType ¸´»îÀàÐÍ  | 
| #@return ËÀÍöÀäȴʱ¼ä  | 
| def GetRebronTime(curPlayer, playerRebornType):  | 
|     mapType = GameWorld.GetMap().GetMapFBType()  | 
|     # ¸±±¾µØÍ¼CD  | 
|     if mapType != IPY_GameWorld.fbtNull:  | 
|         fbRebornTimeDict = IpyGameDataPY.GetFuncEvalCfg('DuplicatesRebornTime', 1)  | 
|         curMapID = GameWorld.GetMap().GetMapID()  | 
|         if curMapID in fbRebornTimeDict:  | 
|             return fbRebornTimeDict[curMapID]  | 
|         return fbRebornTimeDict.get(0, 0)  | 
|     if playerRebornType in [ChConfig.rebornType_Health, ChConfig.rebornType_UseItem]:  | 
|         #Եظ´»î¡¢µÀ¾ß¸´»î²»ÓÃCD  | 
|         return 0  | 
|     if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_IsAddReviveTired):  | 
|         findBuff = SkillCommon.FindBuffByID(curPlayer, ChConfig.Def_SkillID_ReviveTired)[0]  | 
|         if findBuff:  | 
|             if findBuff.GetSkill().GetSkillLV() == findBuff.GetSkill().GetSkillMaxLV():  | 
|                 return IpyGameDataPY.GetFuncEvalCfg('RebornArguments', 1)[1]  | 
|     return 0  | 
|       | 
| #    playerRebornTimeDict = ReadChConfig.GetEvalChConfig('PlayerRebornTime')  | 
| #      | 
| #    curMapID = GameWorld.GetMap().GetMapID()  | 
| #      | 
| #    #²»ÔÚÅä±íµÄµØÍ¼IDÖÐȡĬÈ쵀  | 
| #    if curMapID not in playerRebornTimeDict.keys():  | 
| #        curMapID = 0  | 
| #      | 
| #    rebronTimeByTypeDict = playerRebornTimeDict.get(curMapID, {})  | 
| #      | 
| #    if not rebronTimeByTypeDict:  | 
| #        GameWorld.ErrLog("GetRebronTime rebronTimeByTypeDict=%s,,curMapID=%s" %   | 
| #                              (rebronTimeByTypeDict, curMapID))  | 
| #        return 0  | 
| #      | 
| #    #¹«Ê½²ÎÊý  | 
| #    playerLV = curPlayer.GetLV()  | 
| #    playerDeadCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PlayerDeadCnt)  | 
| #      | 
| #    rebornTime = int(eval(rebronTimeByTypeDict.get(playerRebornType, "0")))  | 
| #      | 
| #    return rebornTime  | 
|   | 
|   | 
| ## ËÀÍöÀäȴʱ¼äÊÇ·ñÍêÁË  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param rebornTime ËÀÍöÀäȴʱ¼ä  | 
| #@return boolean  | 
| def CanRebornByTimeOver(curPlayer, rebornTime):  | 
|     #ºÁÃë  | 
|     playerDeadTimeTick = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DeadTime)  | 
|     curGameWorldTick = int(time.time())  | 
|       | 
|     GameWorld.DebugLog("¸´»îÀäȴʱ¼ä=%s,passTime=%s"%(rebornTime, max(0, curGameWorldTick - playerDeadTimeTick)))  | 
|     return max(0, curGameWorldTick - playerDeadTimeTick) >= rebornTime  | 
|       | 
|   | 
| #---------------------------------------------------------------------  | 
| ##×Ô¶¨Ò庯Êý, Íæ¼Ò¸´»î  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param playerRebornType ¸´»îÀàÐÍ  | 
| #@param tick Ê±¼ä´Á  | 
| #@param mapBornPlace ¸´»îλÖã¬Ä¬ÈÏ0ÎªÔµØ  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ×Ô¶¨Ò庯Êý, Íæ¼Ò¸´»î  | 
| def PlayerRebornByType(curPlayer, playerRebornType, tick, mapBornPlace=0):  | 
|     curPlayerID = curPlayer.GetID()  | 
|     curVipLv = curPlayer.GetVIPLv()  | 
|       | 
|     gameMap = GameWorld.GetMap()  | 
|       | 
|     #ÐèÒªÖ§¸¶µÄÒø×ÓÊýÁ¿   | 
|     moneyPrice = 0  | 
|     #¸´»î»Ö¸´ÑªÁ¿¡¢Ä§µÄÍò·Ö±È  | 
|     resetHpPercent = ChConfig.Def_MaxRateValue  | 
|     resetMpPercent = ChConfig.Def_MaxRateValue  | 
|           | 
|     #¸´»îÀäȴʱ¼ä£¨Ã룩  | 
|     rebornTime = GetRebronTime(curPlayer, playerRebornType)      | 
|     #Àäȴʱ¼äµ½ÁË  | 
|     if not CanRebornByTimeOver(curPlayer, rebornTime):  | 
|         PlayerControl.NotifyCode(curPlayer, 'RebornCD')  | 
|         return False  | 
|       | 
|     isFBReborn = False  | 
|     #-----------------------------------------»Ø³Ç¸´»î(Çл»µØÍ¼)-----------------------------------  | 
|     if playerRebornType == ChConfig.rebornType_City:  | 
|         if FBLogic.OnPlayerReborn():  | 
|             isFBReborn = True  | 
|         else:  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_IsReBorn, 1)  | 
|           | 
| #===============================================================================  | 
| #        #²»ÔÚÌØÊâµÄµØÍ¼ÖÐ,Íæ¼Ò¸±±¾Öи´»îÏà¹Ø  | 
| #        if not FBLogic.OnPlayerReborn():  | 
| #            #Êä³öϵͳÌáʾ  | 
| #            __NotifyReBornToPlace( curPlayer )  | 
| #===============================================================================  | 
|   | 
|       | 
|     #----------------------------------------------ÆäËû¸´»î(²»Çл»µØÍ¼)------------------------------------  | 
|     #¼¼Äܸ´»î  | 
|     elif playerRebornType == ChConfig.rebornType_Skill:  | 
|   | 
|         if not gameMap.GetSkillReborn():  | 
|             return False  | 
|           | 
|         reBornSkill =  GameWorld.GetGameData().GetSkillBySkillID(ChConfig.Def_SkillID_SkillReBorn)  | 
|         #»Ö¸´ÑªÁ¿Íò·Ö±È  | 
|         resetHpPercent = reBornSkill.GetEffect(1).GetEffectValue(0)  | 
|         #»Ö¸´Ä§Íò·Ö±È  | 
|         resetMpPercent = reBornSkill.GetEffect(2).GetEffectValue(0)  | 
|           | 
|         BuffSkill.DelBuffBySkillID(curPlayer, ChConfig.Def_SkillID_SkillReBorn, tick)  | 
|       | 
|     #Եؽ¡¿µ¸´»î  | 
|     elif playerRebornType == ChConfig.rebornType_Health:  | 
|         #if not PlayerVip.GetVipCanOriginalReborn(curVipLv):  | 
|         #    #vipµÈ¼¶ÏÞÖÆ  | 
|         #    return  | 
|         if not gameMap.GetLocalReborn():  | 
|             GameWorld.DebugLog('    µØÍ¼ÅäÖò»ÄÜԵظ´»î')  | 
|             return False  | 
|           | 
|         if not __HealthRebornPayMoney(curPlayer):  | 
|             return False  | 
|           | 
|     #ʹÓõÀ¾ß(»¹ÑôÖä)¸´»î  | 
|     elif playerRebornType == ChConfig.rebornType_UseItem:  | 
|   | 
|         if not gameMap.GetLocalReborn():  | 
|             return False  | 
|           | 
|         if not __RebornDelItem(curPlayer):  | 
|             return False  | 
|       | 
|     # ¸±±¾¸´»î  | 
|     elif playerRebornType in [ChConfig.rebornType_FBGold, ChConfig.rebornType_FBUseItem]:  | 
|         isFBReborn = True  | 
|         freeBorn = FBLogic.DecFreeRebornCount(curPlayer)  | 
|         if not freeBorn:  | 
|             if not gameMap.GetLocalReborn():  | 
|                 return False  | 
|               | 
|             if playerRebornType == ChConfig.rebornType_FBGold:  | 
|                 #if not PlayerVip.GetVipCanOriginalReborn(curVipLv):  | 
|                 #    #vipµÈ¼¶ÏÞÖÆ  | 
|                 #    return False  | 
|                   | 
|                 if not __HealthRebornPayMoney(curPlayer):  | 
|                     return False  | 
|                   | 
|             elif playerRebornType == ChConfig.rebornType_FBUseItem:  | 
|                 if not __RebornDelItem(curPlayer):  | 
|                     return False  | 
|     elif playerRebornType == ChConfig.rebornType_MainCity:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_IsReBorn, 2)  | 
|   | 
|     elif playerRebornType == ChConfig.rebornType_System:  | 
|         pass  | 
|       | 
|     else:  | 
|         #·â°ü´íÎó  | 
| #        GameWorld.Log("ÖØÉú·â°üÀàÐÍ = %s´íÎó"%(playerRebornType), curPlayerID )  | 
|         return False  | 
|       | 
|     #֪ͨ¿Í»§¶ËÍæ¼Ò¸´»î³É¹¦  | 
|     curPlayer.Reborn(playerRebornType)  | 
|       | 
|     #Ö´ÐÐÍæ¼Ò¸±±¾¸´»î  | 
|     if isFBReborn:  | 
|         FBLogic.OnResetFBRebornPlacePos(curPlayer, mapBornPlace, tick)  | 
|       | 
|     #¸´»î¼ÓÎÞµÐBuff  | 
|     SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer , ChConfig.Def_SkillID_LimitSuperBuff, tick)  | 
|     #¸´»îÆ£ÀÍBUff  | 
|     if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_IsAddReviveTired):  | 
|         findBuff = SkillCommon.FindBuffByID(curPlayer, ChConfig.Def_SkillID_ReviveTired)[0]  | 
|         if findBuff:  | 
|             buffSkillLV = findBuff.GetSkill().GetSkillLV()  | 
|             if findBuff.GetSkill().GetSkillMaxLV() != buffSkillLV:  | 
|                 buffSkillLV = buffSkillLV + 1  | 
|         else:  | 
|             buffSkillLV = 1  | 
|         SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer , ChConfig.Def_SkillID_ReviveTired, tick, buffSkillLV)  | 
|         GameWorld.DebugLog('    ¸´»îÆ£ÀÍBUff buffSkillLV=%s'%(buffSkillLV))  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_IsAddReviveTired,0)  | 
|       | 
|   | 
|     #ÖØËãÊôÐÔ  | 
|     playerControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playerControl.RefreshAllState()  | 
|       | 
|     #ÉèÖÃѪÁ¿  | 
|     curPlayer.SetHP(curPlayer.GetMaxHP() * resetHpPercent / ChConfig.Def_MaxRateValue)  | 
|     curPlayer.SetMP(curPlayer.GetMaxMP() * resetMpPercent / ChConfig.Def_MaxRateValue)  | 
|       | 
|     #Íæ¼Ò¸´»îºó¸±±¾´¦Àí  | 
|     FBLogic.OnPlayerRebornOver(curPlayer, playerRebornType)  | 
|           | 
|     #ÕϰµãÖÐԵظ´»î, ´ò»ØÖØÉúµã  | 
|     if (playerRebornType == ChConfig.rebornType_City and not isFBReborn)\  | 
|     or not GameWorld.GetMap().CanMove(curPlayer.GetPosX(), curPlayer.GetPosY()) \  | 
|     or (playerRebornType == ChConfig.rebornType_MainCity and gameMap.GetRebornMapID() == curPlayer.GetMapID()):  | 
|         #Íæ¼ÒÇл»µ½ÖØÉúµã  | 
|         playerControl.SetToBornPlace()          | 
|     elif playerRebornType == ChConfig.rebornType_MainCity:  | 
|         #Ö±½ÓÈ¡dbÖÐÅäÖõĸ´»îµã  | 
|         PlayerControl.PlayerResetWorldPos(curPlayer, gameMap.GetRebornMapID(), gameMap.GetRebornMapX(), gameMap.GetRebornMapY(), False)  | 
|     #ÖØÐÂÕÙ»½³èÎï  | 
|     PlayerPet.AutoSummonPet(curPlayer)  | 
|       | 
|     #¸´»î³É¹¦,ÖØÖÃ״̬  | 
|     PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paNull)  | 
|     return True  | 
|   | 
| ##¸´»î¿Û³ýÔª±¦  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ÊÇ·ñ¿Û³ý³É¹¦  | 
| def __HealthRebornPayMoney(curPlayer):  | 
|     rebornCfg = IpyGameDataPY.GetFuncEvalCfg('RebornArguments', 1)  | 
|     moneyPrice = rebornCfg[2]  | 
|     #Òì³£  | 
|     if not moneyPrice:  | 
|         return True  | 
|     costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, moneyPrice)  | 
|     if not costMoneyList:  | 
|         return False  | 
|     infoDict = {}  | 
|     for moneyType, moneyCnt in costMoneyList:  | 
|         if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_Revive, infoDict):  | 
|             return False  | 
|       | 
|     GameWorld.Login_Interface_GoldRec(curPlayer , 0 , 0 , 'HealthReborn' , moneyType , moneyPrice)  | 
|     return True  | 
|   | 
| ##¸´»î¿Û³ýµÀ¾ß  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ÊÇ·ñ¿Û³ý³É¹¦  | 
| def __RebornDelItem(curPlayer):  | 
|     rebornItem = ItemCommon.FindItemInPackByEffectEx(curPlayer, ChConfig.Def_Effect_Reborn)  | 
|     if not rebornItem:  | 
|         #GeRen_chenxin_143504 ¶Ô²»Æð,ÄúûÓÐXXX!  | 
|         #PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_143504", [ChConfig.Def_ItemID_Reborn])  | 
|         return False  | 
|               | 
|     #µ÷ÓÃͨÓýӿÚɾ³ýµÀ¾ß  | 
|     ItemCommon.DelItem(curPlayer, rebornItem, 1, True, "Reborn")  | 
|     return True  | 
|   | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # def __NotifyReBornToPlace( curPlayer ):  | 
| #    #ÆÕͨµØÍ¼  | 
| #    if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull:  | 
| #        #Revival_Home   <n color="0,255,0">Ìáʾ£ºÄú¿ÉÒÔÔÚ¸÷´óÖ÷³ÇµÄÔÓ»õµêÏû³ýÉíÉÏЯ´øµÄÐéÈõ״̬!</n>  256 -  | 
| #        PlayerControl.NotifyCode( curPlayer, "Revival_Home" )  | 
| #    #¸±±¾ÖÐ  | 
| #    elif not FBLogic.DoNotifyReBorn( curPlayer ):  | 
| #        #Êä³öĬÈÏÌáʾ  | 
| #        PlayerControl.NotifyCode( curPlayer, "Revival_Home" )  | 
| #      | 
| #    return  | 
| #===============================================================================  | 
| ##¸±±¾½Ó¿Ú:Íæ¼Ò¸´»î  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¸±±¾½Ó¿Ú:Íæ¼Ò¸´»î  | 
| def PlayerReborn_InFB(curPlayer, rebornType, tick):  | 
|     mapType = GameWorld.GetMap().GetMapFBType()  | 
|     #²»ÔÚ¸±±¾ÖÐ  | 
|     if mapType == IPY_GameWorld.fbtNull:  | 
|         return  | 
|       | 
|     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  | 
| #---------------------------------------------------------------------  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //03 21 ½øÈ븱±¾»î¶¯#tagCEnterFbGameEvent  | 
| # tagCEnterFbGameEvent       *   GettagCEnterFbGameEvent();  | 
| #   | 
| # class   IPY_CEnterFbGameEvent  | 
| # {  | 
| # public:  | 
| #    //µØÍ¼ID  | 
| #    int      GetMapID();  | 
| #    //ÏßID  | 
| #    int      GetLineID();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //03 21 ½øÈ븱±¾»î¶¯#tagCEnterFbGameEvent  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦ //03 21 ½øÈ븱±¾»î¶¯#tagCEnterFbGameEvent  | 
| def EnterFbGameEvent(index, tick):  | 
|     GameWorld.GetPsycoFunc(__Func_EnterFbGameEvent)(index, tick)  | 
|     return  | 
|   | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //03 21 ½øÈ븱±¾»î¶¯#tagCEnterFbGameEvent  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦ //03 21 ½øÈ븱±¾»î¶¯#tagCEnterFbGameEvent  | 
| def __Func_EnterFbGameEvent(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     sendPack = IPY_GameWorld.IPY_CEnterFbGameEvent()  | 
|     #ÊÕ µØÍ¼ºÍÏß·ID  | 
|     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  | 
| #  | 
| #struct    tagCMWorldTransfer  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        Type;  | 
| #    DWORD        MapID;  | 
| #    BYTE        LineID;  | 
| #    WORD        PosX;  | 
| #    WORD        PosY;  | 
| #    DWORD        ExData1;    //À©Õ¹×Ö¶Î1£¬¸÷¸öÏîÄ¿¸ù¾Ý×Ô¼ºµÄÐèÒª¾ö¶¨ÓÃ;  | 
| #};  | 
| def PYWorldTransPort(index, clientPack, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     packTransportType = clientPack.Type  | 
|     mapID = clientPack.MapID  | 
|     lineID = clientPack.LineID  | 
|     posX = clientPack.PosX  | 
|     posY = clientPack.PosY  | 
|     exData1 = clientPack.ExData1  | 
|     __Func_WorldTransPort(curPlayer, packTransportType, mapID, posX, posY, tick, lineID, exData1)  | 
|     return  | 
|   | 
| def __Func_WorldTransPort(curPlayer, packTransportType, mapID, posX, posY, tick, lineID=-1, exData1=0):  | 
|     if curPlayer.GetMapID() != mapID:  | 
|         #ÑéÖ¤¼ä¸ô  | 
|         if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_WorldTransport) < ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_WorldTransport]:  | 
|             #ûµ½¼ä¸ô  | 
|             return  | 
|       | 
|         curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_WorldTransport, tick)  | 
|           | 
|     playerID = curPlayer.GetPlayerID()  | 
|     GameWorld.DebugLog("WorldTransPort packTransportType=%s,mapID=%s,lineID=%s,exData1=%s"   | 
|                        % (packTransportType, mapID, lineID, exData1), playerID)  | 
|     lineID = -1 if lineID == 255 else lineID  | 
|     #ÊÀ½ç´«ËÍ·â°üÔÊÐíÀàÐÍ£¨ÊÀ½ç£¬´óµØÍ¼£¬ÈÎÎñ£©  | 
|     if packTransportType not in ChConfig.Def_PackType_TransportType.keys():  | 
|         GameWorld.ErrLog('WorldTransPort packTransportType = %s, NoFind' % (packTransportType), playerID)  | 
|         return  | 
|   | 
|     transportType = ChConfig.Def_PackType_TransportType.get(packTransportType)  | 
|     # ·þÎñ¶ËÔݲ»×öVIPµÈ¼¶´«ËÍÏÞÖÆ£¬Óɿͻ§¶Ë¿ØÖÆ  | 
| #    if not TransportVipLvRestrict(curPlayer, transportType):  | 
| #        return  | 
|     #¼ì²éÍæ¼Ò״̬  | 
|     if not PlayerControl.CheckPlayerTransport(curPlayer):  | 
|         return  | 
|   | 
|     #Ä¿±êµØÍ¼Åжϣ¨´æÔÚ·ñ£¬µÐ¹ú£¬¸±±¾£©  | 
|     if not PlayerControl.CheckTagCountry(curPlayer, mapID):  | 
|         return  | 
|   | 
|     #×ø±êµãÅÐ¶Ï  | 
|     posX, posY = GetTransportPos(curPlayer, packTransportType, mapID, posX, posY)  | 
|       | 
|     if (posX, posY) == (0, 0):  | 
|         #04BBF813-7A30-47A8-927DE1ACCC4F378E Ä¿±êµãΪÕϰµã  | 
|         PlayerControl.NotifyCode(curPlayer, "04BBF813-7A30-47A8-927DE1ACCC4F378E")  | 
|         return  | 
|   | 
| #===============================================================================  | 
| #    isFreedomTransBuff = SkillCommon.GetPlayerBuffBySkillTypeID(curPlayer, ShareDefine.Def_FreedomTransBuffID)  | 
| #    if not PlayerControl.IsPlayerInFight(curPlayer):  | 
| #   | 
| #        if (transportType == ChConfig.Def_Transport_Type_BigMap) or (not isFreedomTransBuff):  | 
| #            #´«ËÍÖ§¸¶´¦Àí  | 
| #   | 
| #            if not PayForTransport(curPlayer, transportType, isAutoBuy):  | 
| #                return  | 
| #===============================================================================  | 
|     #ÊÇÈÎÎñ´«ËÍ£¬VIPµÈ¼¶²»¹»£¬ÇÒ´«ËÍ·û²»×㣬²»´¦Àí  | 
|     if transportType == ChConfig.Def_Transport_Type_Mission and \  | 
|        not TransportVipLvRestrict(curPlayer, transportType) and \  | 
|        not PayForTransport(curPlayer, transportType):  | 
|             return  | 
|       | 
|     #¿ªÊ¼´«ËÍ  | 
|     curPlayer.SetDict(ChConfig.Def_PlayerKey_TransType, transportType)  | 
|     #curPlayer.SetDict(ChConfig.Def_PlayerKey_TransAutoBuyItem, isAutoBuy)  | 
|     BeginTrans(curPlayer, mapID, posX, posY, lineID=lineID, exData1=exData1)  | 
|     return  | 
|       | 
|   | 
| ## ¿ªÊ¼´«ËÍ  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @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):  | 
|     #===========================================================================  | 
|     # if PlayerControl.IsPlayerInFight(curPlayer):  | 
|     #    #¼Ç¼´«ËÍ×ø±ê, ÓÃÓÚ½ø¶ÈÌõ½áÊøºó´«ËÍ  | 
|     #    curPlayer.SetDict(ChConfig.Def_PlayerKey_TransMapId, mapID)  | 
|     #    curPlayer.SetDict(ChConfig.Def_PlayerKey_TransPosX, posX)  | 
|     #    curPlayer.SetDict(ChConfig.Def_PlayerKey_TransPosY, posY)  | 
|     #      | 
|     #    #Õ½¶·×´Ì¬ÖÐÀ½ø¶ÈÌõ  | 
|     #    PlayerControl.Sync_PrepareBegin(curPlayer, ChConfig.Def_TransTime,  | 
|     #                                    ShareDefine.Def_PstTrans)  | 
|     #    return True  | 
|     #===========================================================================  | 
|       | 
|     PlayerControl.PlayerResetWorldPos(curPlayer, mapID, posX, posY, takeTruck, lineID, msg, canLock, exData1)  | 
|     #PlayerControl.NotifyCode(curPlayer, "Map_Deliver_Succeed", [mapID])  | 
|     return False  | 
|   | 
|   | 
| ##È¡µÃÕýÈ·´«ËÍ×ø±ê  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param transportType ´«ËÍÀàÐÍ  | 
| #@param transportMapID ·â°üµØÍ¼ID  | 
| #@param posX ·â°üµØÍ¼posX  | 
| #@param posY ·â°üµØÍ¼posY  | 
| #@return ×ø±êµã  | 
| #@remarks È¡µÃÕýÈ·´«ËÍ×ø±ê  | 
| def GetTransportPos(curPlayer, transportType, transportMapID, transportPosX, transportPosY):  | 
|     #---ÊÀ½ç´«ËÍÂß¼ÌØÊâ´¦Àí---  | 
|     #===========================================================================  | 
|     # if transportType == ShareDefine.Def_Transport_World:  | 
|     #    cityPosDict = ReadChConfig.GetEvalChConfig('Def_List_City_Pos')  | 
|     #      | 
|     #    posInfo = cityPosDict.get(transportMapID)  | 
|     #      | 
|     #    if posInfo == None:  | 
|     #        #ÎÞ·¨²éÕÒºÏÊʵÄ×ø±ê  | 
|     #        return 0, 0  | 
|     #      | 
|     #    transportPosX, transportPosY = posInfo  | 
|     #===========================================================================  | 
|   | 
|     #---¹«ÓÃ×ø±êµã¼ì²âÂß¼---  | 
|     if curPlayer.GetMapID() == transportMapID:  | 
|         #±¾µØÍ¼ÐèÒªÑéÖ¤ÊÇ·ñÕϰµã  | 
|         if not GameWorld.GetMap().CanMove(transportPosX, transportPosY):  | 
|             transportPosX, transportPosY = GameMap.GetNearbyPosByDis(transportPosX, transportPosY, ChConfig.Def_RebornPos_Area_Range)  | 
|       | 
|     return transportPosX, transportPosY  | 
|       | 
| ##´«ËÍÏûºÄ´¦Àí  | 
| #@param curPlayer Íæ¼Ò  | 
| #@param transportType ´«ËÍÀàÐÍ  | 
| #@return BOOL Ö§¸¶ÊÇ·ñ³É¹¦  | 
| #@remarks ´«ËÍÏûºÄ´¦Àí  | 
| def PayForTransport(curPlayer, transportType):  | 
|     itemID = IpyGameDataPY.GetFuncCfg('TransportPay')  | 
|     if not itemID:  | 
|         return True  | 
|     useCount = 1    # ÏûºÄÊýÁ¿  | 
|     itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|     hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(itemID, itemPack, useCount)  | 
|     if not hasEnough:  | 
|         #µÀ¾ß²»¹»Ä¬ÈÏ¿ÛÇ®  | 
|         costMoney = IpyGameDataPY.GetFuncCfg('TransportPay', 2)  | 
|         if not TransportPayMoney(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, costMoney, transportType, ChConfig.GMTool_Offline_WorldTransfer):  | 
|             GameWorld.DebugLog('    ´«ËÍÏûºÄ´¦Àí ´«Ë͵À¾ß²»×ã itemID=%s, Ç®Ò²²»¹»costMoney=%s'%(itemID, costMoney))  | 
|             return False  | 
|     else:  | 
|         ItemCommon.ReduceItem(curPlayer, itemPack, itemList, useCount, False)  | 
|       | 
|     return True  | 
|   | 
| ## ´«ËÍvipµÈ¼¶ÏÞÖÆ  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param transportType ´«ËÍÀàÐÍ  | 
| #  @return ÊÇ·ñvipµÈ¼¶ÏÞÖÆ  | 
| def TransportVipLvRestrict(curPlayer, transportType):  | 
|       | 
|     #´óµØÍ¼±ê¼Ç´«ËͲ»ÄÜÌåÑéÎÞÏÞ·Ébuff¹¦ÄÜ  | 
|     if transportType != ChConfig.Def_Transport_Type_BigMap:  | 
|         if SkillCommon.GetPlayerBuffBySkillTypeID(curPlayer, ShareDefine.Def_FreedomTransBuffID):  | 
|             #ÓÐÎÞÏÞ·Ébuff  | 
|             return True  | 
|     return PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_FreeTransport)  | 
|   | 
|   | 
|   | 
| #---------------------------------------------------------------------  | 
| ##´«Ë͸¶·Ñ¼Ç¼  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param moneyType ¸¶·ÑÀàÐÍ  | 
| #@param money ¼Û¸ñ  | 
| #@param transportType ´«ËÍÀàÐÍ  | 
| #@param noteMark ¼Ç¼ÀàÐÍ  | 
| #@return ·µ»ØÖµÕæ, ¿Û·Ñ³É¹¦  | 
| #@remarks ´«Ë͸¶·Ñ¼Ç¼  | 
| def TransportPayMoney(curPlayer, moneyType, money, transportType, noteMark):  | 
|     moneyList = PlayerControl.HaveMoneyEx(curPlayer, moneyType, money)  | 
|     if moneyList == []:  | 
|         return False  | 
|       | 
|     for moneyType, money in moneyList:  | 
|         if money > 0:  | 
|             PlayerControl.PayMoney(curPlayer, moneyType, money, ChConfig.Def_Cost_Transport,   | 
|                                    {"TransportType":transportType})  | 
|             GameWorld.Login_Interface_GoldRec(curPlayer, transportType, 0, 'TransportType',  | 
|                                               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  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param curPackData ·â°ü½á¹¹Ìå  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÀëÏß¾Ñé¶Ò»»  | 
| def PlayerExpExchange(index, curPackData, tick):  | 
|     # ¿ç·þ·þÎñÆ÷¹¦ÄÜÏÞÖÆ  | 
|     if GameWorld.IsMergeServer():  | 
|         return  | 
|           | 
|     #¶Ò»»¹«Ê½×Öµä  | 
|     OfflineExpChangeDict = ReadChConfig.GetEvalChConfig("OfflineSys_ExpChange")  | 
|       | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #ÊÕ°ü×Ö¶Î  | 
|     mulIndex = curPackData.Index # ¾Ñé±¶ÂÊË÷Òý  | 
|     exchangeTime = curPackData.ExchangeTime #¶Ò»»Ê±¼ä£¨·ÖÖÓ£©  | 
|       | 
|     recList = OfflineExpChangeDict.get(int(mulIndex))  # ¸ù¾ÝË÷Òý»ñÈ¡¼Ç¼  | 
|     if not recList: # ÕÒ²»µ½¼Ç¼  | 
|         GameWorld.ErrLog('ÀëÏß¾Ñé¶Ò»»Ë÷Òý´íÎóindex=%s' % mulIndex)  | 
|         return  | 
|       | 
|     #×îСvipµÈ¼¶ÏÞÖÆ  | 
|     minVIPLv = recList[0]  | 
|     #vipµÈ¼¶  | 
|     VIPLv = curPlayer.GetVIPLv()  | 
|     #ҪʹÓõÄʱ¼ä  | 
|     useMinutes = exchangeTime  | 
|     #ÀëÏßÀÛ»ýʱ¼ä  | 
|     haveMinutes = curPlayer.GetOfflineMinutes()  | 
|       | 
|     if VIPLv < minVIPLv:  | 
|         GameWorld.ErrLog("ÀëÏß¹Ò»ú·â°ü¶Ò»»¾ÑéÒì³££¬Íæ¼ÒvipµÈ¼¶ %s, ÏÔʾµÄvipµÈ¼¶ %s £¬" % (VIPLv, minVIPLv))  | 
|         return  | 
|       | 
|     if useMinutes > haveMinutes :  | 
|         GameWorld.ErrLog("ÀëÏß¹Ò»ú·â°ü¶Ò»»¾ÑéÒì³££¬¶Ò»»Ê±¼ä %s, ÀÛ»ýʱ¼ä %s £¬" % (useMinutes, haveMinutes))  | 
|         return  | 
|       | 
|     #²Î¿¼¾Ñé  | 
|     rExp = PlayerControl.GetPlayerReExp(curPlayer)  | 
|     reLV = curPlayer.GetLV()                    #²Î¿¼µÈ¼¶  | 
|     worldLvExpRate = PlayerWorldAverageLv.GetWorldAverageLvExpRate(curPlayer) #ÊÀ½çµÈ¼¶¾Ñé¼Ó³É  | 
|       | 
|     #¾Ñ鹫ʽ  | 
|     redeemExp = int(eval(recList[1]))  | 
|     #»õ±ÒÐÅÏ¢ÁÐ±í  | 
|     moneyInfoList = recList[2]  | 
|     #»õ±ÒÀàÐÍ  | 
|     moneyType = int(moneyInfoList[0])  | 
|     #ÏûºÄµÄ»õ±Ò¹«Ê½  | 
|     costMoney = int(eval(moneyInfoList[1]))  | 
|       | 
|     playerControl = PlayerControl.PlayerControl(curPlayer)  | 
| #    #³¬¹ý¾Ñé´¢´æÉÏÏÞ£¬²»Óè¶Ò»»¾Ñé  | 
| #    if redeemExp + curPlayer.GetTotalExp() > ChConfig.Def_UpperLimit_DWord:  | 
| #        PlayerControl.NotifyCode(curPlayer, "ExpChange_lhs_31379")  | 
| #        return  | 
|       | 
|     haveMoneyList = PlayerControl.HaveMoneyEx(curPlayer, moneyType, costMoney)  | 
|       | 
|     if not haveMoneyList:#½ðÇ®²»×ã  | 
|         return  | 
|       | 
|     #¿Û½ðÇ®  | 
|     for moneyType, moneyCnt in haveMoneyList:  | 
|         if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_OffLineExp,   | 
|                                       {"ChangeTime":useMinutes, "Index":mulIndex, ChConfig.Def_Cost_Reason_SonKey:mulIndex}): # ½ðÇ®²»×ã  | 
|             GameWorld.ErrLog('¸ßЧÁ·¹¦£¬£¬½ðÇ®²»×ã##PlayerControl=%s,,moneyCnt=%s' % (PlayerControl, moneyCnt))  | 
|             return  | 
|       | 
|     playerControl.AddExp(redeemExp) # ¼Ó¾Ñé  | 
|       | 
|     offlineTime = int(max(haveMinutes - useMinutes, 0)) # ¿ÛÀëÏßʱ¼ä  | 
|     curPlayer.SetOfflineMinutes(offlineTime) # ÉèÖÃÀëÏßʱ¼ä  | 
|     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  | 
| #  | 
| #struct    tagReceiveFamilyArrestAward  | 
| #  | 
| #{  | 
| #    tagHead        Head;  | 
| #    DWORD        ArrestID;        //ÐüÉÍÈÎÎñID  | 
| #};  | 
| ## ÁìÈ¡¼Ò×åÐüÉͽ±Àø  | 
| #  @param index: Íæ¼ÒË÷Òý  | 
| #  @param clientData: ·â°ü½á¹¹Ìå  | 
| #  @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  | 
|   | 
|   | 
| #//B0 26 ÇëÇó¼Ò×åÐüÉͽ±ÀøÁìÈ¡Çé¿ö #tagQueryFamilyArrestAwardReceiveState  | 
| #  | 
| #struct    tagQueryFamilyArrestAwardReceiveState  | 
| #  | 
| #{  | 
| #    tagHead        Head;  | 
| #};  | 
| ## ÇëÇó¼Ò×åÐüÉͽ±ÀøÁìÈ¡Çé¿ö  | 
| #  @param index: Íæ¼ÒË÷Òý  | 
| #  @param clientData: ·â°ü½á¹¹Ìå  | 
| #  @param tick: Ê±¼ä´Á  | 
| #  @return: None  | 
| def QueryFamilyArrestAwardReceiveState(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     Sync_FamilyArrestAwardReceiveState(curPlayer)  | 
|     return  | 
|   | 
|   | 
| ## Í¨Öª¿Í»§¶Ë¼Ò×åÐüÉÍÈÎÎñ½±ÀøÁìÈ¡Çé¿ö  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @return: None  | 
| def Sync_FamilyArrestAwardReceiveState(curPlayer):  | 
|     awardReceiveState = ChPyNetSendPack.tagFamilyArrestAwardReceiveState()  | 
|     awardReceiveState.Clear()  | 
|       | 
|     state = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyArrestAwardState)  | 
|     awardReceiveState.ReceiveState = state  | 
|     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  | 
|   | 
|   | 
| #===============================================================================  | 
| #// AF 02 ºÏ·þ»î¶¯½±Àø #tagCMMixCampaignAward  | 
| #  | 
| #struct    tagCMMixCampaignAward  | 
| #  | 
| #{  | 
| #    tagHead         Head;  | 
| #    BYTE        Type;    //0-²éѯ£»1-ÁìÈ¡  | 
| #    DWORD        CampaignType;        //½±ÀøÀàÐÍ  | 
| #    BYTE        Index;    //½±ÀøÎ»£¬ÁìȡʱÓà  | 
| #};  | 
| #===============================================================================  | 
| ## ºÏ·þ»î¶¯½±Àø  | 
| #  @param index: Íæ¼ÒË÷Òý  | 
| #  @param clientData: ·â°ü½á¹¹Ìå  | 
| #  @param tick: Ê±¼ä´Á  | 
| #  @return:   | 
| def GiveMixServerCampaignAward(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     campaignType = clientData.CampaignType  | 
|     queryType = clientData.Type  | 
|     awardIndex = clientData.Index # ½±ÀøÎ»  | 
|   | 
|     GameWorld.DebugLog("GiveMixServerCampaignAward campaignType=%s,queryType=%s,awardIndex=%s"   | 
|                        % (campaignType, queryType, awardIndex))  | 
|     if queryType == ShareDefine.Def_MSCGameServerQuery_MailAward:  | 
|         GameWorld.DebugLog("    ¿Í»§¶Ë²»¿É·¢ÁìÈ¡ºÏ·þÓʼþ½±ÀøÀàÐÍ")  | 
|         return  | 
|       | 
|     isMix = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_IsMixServer)  | 
|     if not isMix:  | 
|         GameWorld.ErrLog("    µ±Ç°·ÇºÏ·þ״̬£¡")  | 
|         return      | 
|       | 
|     if campaignType not in ShareDefine.Def_MixCampaign_Type_List:  | 
|         GameWorld.ErrLog("    ºÏ·þ»î¶¯ÀàÐÍ´íÎócampaignType=%s error! not define" % campaignType)  | 
|         return  | 
|       | 
|     # Èç¹ûÖ±½ÓÔÚMapServerÖд¦Àí£¬Ôò·µ»Ø  | 
|     if MixServerCampaign.DoMixServerCampaignOnMapServer(curPlayer, campaignType, queryType, awardIndex):  | 
|         return  | 
|       | 
|     awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MixServerCampaign_AwardRecord \  | 
|                                 % campaignType, 0, ChConfig.Def_PDictType_OpenServerCampaign)  | 
|     awardState = GameWorld.GetDataByDigitPlace(awardRecord, awardIndex)  | 
|       | 
|     if awardState == MixServerCampaign.Def_AwardState_Got:  | 
|         if queryType == ShareDefine.Def_MSCGameServerQuery_QueryAward:  | 
|             recordData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MixServerCampaign_RecordData \  | 
|                                 % campaignType, 0, ChConfig.Def_PDictType_OpenServerCampaign)  | 
|             MixServerCampaign.Sync_MixServerCampaignAward(curPlayer, campaignType, awardState, recordData)  | 
|         GameWorld.DebugLog("    ÒѾÁìÈ¡¹ý¸Ã½±Àø...")  | 
|         return  | 
|   | 
|     #Áì½±µÄÐèÒªµÈ´ýGameServer»Ø°üÒÔºó²Å´¦ÀíÏÂÒ»¸ö·â°ü  | 
|     if queryType != ShareDefine.Def_MSCGameServerQuery_QueryAward:  | 
|         if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_QueryMixServerAwardState) == 1:  | 
|             GameWorld.DebugLog("    ÒѾÔÚ²éѯÖÐ...")  | 
|             return  | 
|       | 
|     curPlayer.SetDict(ChConfig.Def_PlayerKey_QueryMixServerAwardState, 1)  | 
|       | 
|     familyID = curPlayer.GetFamilyID()  | 
|       | 
|     #[ÇëÇóÀàÐÍ, »î¶¯ÀàÐÍ, ÁìÈ¡Ë÷Òý, ¼Ò×åID]  | 
|     msgList = [queryType, campaignType, awardIndex, familyID]  | 
|       | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'MixServerCampaignAward', \  | 
|             '%s' % (msgList), len(str(msgList)))  | 
|   | 
|     GameWorld.DebugLog("    msgList=%s" % str(msgList))  | 
|     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  | 
| ## ÁìÈ¡½±Àø  | 
| #  @param None None  | 
| #  @return None  | 
| def PlayerGetReward(index, clientData, tick):  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     curPlayer = playerManager.GetPlayerByIndex(index)  | 
|       | 
|     rewardType = clientData.RewardType # ½±ÀøÀàÐÍ  | 
|     dataEx = clientData.DataEx # ¸½¼ÓÐÅÏ¢  | 
|     dataExStr = clientData.DataExStr # ¸½¼Ó×Ö·ûÐÅÏ¢  | 
|       | 
|     GameWorld.DebugLog("PlayerGetReward: rewardType=%s,dataEx=%s,dataExStr=%s" % (rewardType, dataEx, dataExStr))  | 
|       | 
|     # »îÔ¾¶È½±Àø  | 
|     if rewardType == ChConfig.Def_RewardType_Activity:  | 
|         PlayerActivity.GetActivityAward(curPlayer, dataEx)  | 
|     # ÏÉÃË»îÔ¾¶È½±Àø  | 
|     elif rewardType == ChConfig.Def_RewardType_FamilyActivity:  | 
|         PlayerFamily.GetFamilyActivityAward(curPlayer, dataEx)  | 
|     # ÏÉÃËÁªÈü¹Ú¾üÏÉÃËÿÈÕٺ»½±Àø  | 
|     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_DayRealmPoint:  | 
|         PlayerActivity.GetRealmPointAward(curPlayer)  | 
|     # Ê׳äÀñ°ü½±Àø  | 
|     elif rewardType == ChConfig.Def_RewardType_GoldGiftFirst:  | 
|         PlayerGoldGift.GetPlayerGoldGiftFirst(curPlayer)  | 
|     # ÁìÈ¡·¨±¦Ö®»ê½±Àø  | 
|     elif rewardType == ChConfig.Def_RewardType_MWSoulAward:  | 
|         PlayerMagicWeapon.GetMWSoulAward(curPlayer, dataEx)  | 
|     # ÁìÈ¡¼«Æ·°×Äà  | 
|     elif rewardType == ChConfig.Def_RewardType_FreeGoods:  | 
|         PlayerFreeGoods.OnGetFreeGoods(curPlayer, dataEx)  | 
|     # ÁìÈ¡Ïû·Ñ·µÀû½±Àø  | 
|     elif rewardType == ChConfig.Def_RewardType_CostRebate:  | 
|         PlayerCostRebate.OnGetCostRebateAward(curPlayer, dataEx)  | 
|     # ÁìÈ¡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)  | 
| #  | 
| #    # ³äÖµºÀÀñ½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_GoldGift:  | 
| #        PlayerGoldGift.GetPlayerGoldGift(curPlayer, dataEx)  | 
| #  | 
| #    # ÀÛ¼ÆÇ©µ½½±Àø  | 
| #    #elif rewardType == ShareDefine.Def_RewardType_DaySign:  | 
| #    #    PlayerSignDay.GiveSignCntAward(curPlayer, dataEx)  | 
| #  | 
| #    # ÌìÌìÊ׳佱Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_DailyGold:  | 
| #        PlayerGoldGift.GetPlayerDailyGoldChargeGift(curPlayer)  | 
| #  | 
| #    # µ¥ÈÕ³äÖµ¶àѡһÀñ°ü  | 
| #    elif rewardType == ShareDefine.Def_RewardType_SingleGoldGift:  | 
| #        giftLV = 0 # Ä¬ÈϵÚÒ»µµ0  | 
| #        if dataExStr:  | 
| #            try:  | 
| #                giftLV = int(dataExStr)  | 
| #            except:  | 
| #                GameWorld.ErrLog("µ¥ÈÕ³äÖµ¶àѡһÀñ°ü½±Àøµµ´íÎó£¡%s" % dataExStr)  | 
| #        PlayerGoldGift.GetSingleGoldGift(curPlayer, dataEx, giftLV, 0)  | 
| #          | 
| #    # µ±ÈÕ³äÖµÎÞÏÞÁìÈ¡Àñ°ü  | 
| #    elif rewardType == ShareDefine.Def_RewardType_UnlimitedGoldGift:  | 
| #        PlayerGoldGift.GetSingleGoldGift(curPlayer, 0, 0, 1)     | 
| #      | 
| #    # µÇ½ǩµ½½±Àø  | 
| #    #elif rewardType == ShareDefine.Def_RewardType_DayLoginSign:  | 
| #    #    PlayerSignDay.GetDaySignAward(curPlayer, dataEx)  | 
| #          | 
| #    # ¿ç·þPK½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_MergePKAward:  | 
| #        PlayerMergePK.OnQueryMergePKAward(curPlayer, dataEx, GameWorld.ToIntDef(dataExStr), tick)  | 
| #          | 
| #    # ÍõÕßÕù°ÔÈ«·þÈÙÒ«½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_ServerHonour:  | 
| #        PlayerMergeKing.GetMergeKingAward_ServerHonour(curPlayer)  | 
| #          | 
| #    # ÍõÕßÕù°Ô½ú¼¶ÅÅÃû½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_MergeKingRank:  | 
| #        PlayerMergeKing.GetMergeKingAward_Rank(curPlayer)  | 
| #          | 
| #    # ÍõÕßÕù°Ô¾º²Â»ý·Ö½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_MergeKingSupport:  | 
| #        PlayerMergeKing.GetMergeKingAward_Support(curPlayer, dataEx, tick)  | 
| #          | 
| #    # QQ³É³¤Àñ°ü½±Àø  | 
| #    elif rewardType in [ShareDefine.Def_RewardType_QQUpYellow, ShareDefine.Def_RewardType_QQUpBlue]:  | 
| #        PlayerQQ.GetQQUpReward(curPlayer, rewardType, dataEx)  | 
| #      | 
| #    # QQÐÂÊÖÀñ°ü½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_QQNewMan:  | 
| #        PlayerQQ.GetQQNewManAward(curPlayer, rewardType, dataEx)  | 
| #      | 
| #    # QQÿÈÕÀñ°ü½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_QQDayGift:  | 
| #        PlayerQQ.GetQQDayGift(curPlayer, rewardType, dataEx)  | 
| #      | 
| #    # Qzone³É³¤Àñ°ü½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_QzoneUp:  | 
| #        PlayerQQ.GetQzoneUpReward(curPlayer, rewardType, dataEx)  | 
| #      | 
| #    # QzoneÐÂÊÖÀñ°ü½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_QzoneNewMan:  | 
| #        PlayerQQ.GetQzoneNewManAward(curPlayer, rewardType, dataEx)  | 
| #      | 
| #    # QzoneÿÈÕÀñ°ü½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_QzoneDayGift:  | 
| #        PlayerQQ.GetQzoneDayGift(curPlayer, rewardType, dataEx)  | 
| #          | 
| #    # Ïû·ÑVIPµÈ¼¶½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_CostVIPLV:  | 
| #        PlayerCostVIP.GetCostVIPAward(curPlayer, dataEx)  | 
| #          | 
| #    # Ïû·ÑVIP³É³¤½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_CostVIPGrowUp:  | 
| #        PlayerCostVIP.GetVIPGrowUpAward(curPlayer, dataEx)  | 
| #    # ×ªÉúÁì½±  | 
| #    elif rewardType == ShareDefine.Def_RewardType_Reincarnation:  | 
| #        PlayerReincarnation.GetReincarnationAward(curPlayer, dataEx)  | 
| #    # ¿ç·þbossÊ״βÎÓë½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_MergeBossFirstJoinAward:  | 
| #        GameLogic_MergeBoss.OnGetMergeBossFirstJoinAward(curPlayer)  | 
| #    # ÐüÉÍÈÎÎñ»ý·Ö½±Àø  | 
| #    elif rewardType == ShareDefine.Def_RewardType_ArrestTaskAward:  | 
| #        PlayerArrestTask.OnGetArrestPointAward(curPlayer, dataEx)  | 
|     return  | 
|       | 
|       | 
| ## Í¨Öª¸÷½±ÀøÁìÈ¡¼Ç¼ÐÅÏ¢  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @param rewardType: ½±ÀøÀàÐÍ  | 
| #  @param rewardGetRecord: Áì½±¼Ç¼  | 
| #  @return None  | 
| def Sync_RewardGetRecordInfo(curPlayer, rewardType, rewardGetRecord):  | 
|     sendPack = ChPyNetSendPack.tagMCPlayerRewardGetRecord()  | 
|     sendPack.Clear()  | 
|     sendPack.RewardType = rewardType  | 
|     sendPack.RewardGetRecord = rewardGetRecord  | 
|     NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
|     return  | 
|   | 
| ##A5 1A Íæ¼Ò×Ô¶¯Õ½¶·ÉèÖÃÐÅÏ¢´¢´æ#tagCMSaveAutoFightSetting  | 
| #  @param index, clientData, tick  | 
| #  @return None  | 
| def OnSaveAutoFightSetting(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     settingDict = eval(clientData.Data) #×ֵ䱣´æ  | 
|     #×Ô¶¯Õ½¶·ÅäÖà  | 
|     #¼¼ÄÜÊý  | 
|     BasicSkillCount, AreaSkillCount, BuffSkillCount = ReadChConfig.GetEvalChConfig("AutoFightSetting")  | 
|       | 
|     BasicSkillList = settingDict.get("BasicSkill",[0]*BasicSkillCount)      | 
|     Key = "BasicSkill"  | 
|     for ValueIndex, Value in enumerate(BasicSkillList):  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AutoFightSetting%(Key, ValueIndex), Value)  | 
|           | 
|     AreaSkillList = settingDict.get("AreaSkill",[0]*AreaSkillCount)  | 
|     Key = "AreaSkill"  | 
|     for ValueIndex, Value in enumerate(AreaSkillList):  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AutoFightSetting%(Key, ValueIndex), Value)  | 
|           | 
|     BuffSkillList = settingDict.get("BuffSkill",[0]*BuffSkillCount)     | 
|     Key = "BuffSkill"  | 
|     for ValueIndex, Value in enumerate(BuffSkillList):  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AutoFightSetting%(Key, ValueIndex), Value)   | 
|       | 
|     Key = "HPPackagePercent"  | 
|     Value = settingDict.get(Key,0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AutoFightSetting%(Key, 0), Value)   | 
|     return   | 
|   | 
| ## Í¨Öª¿Í»§¶Ë×Ô¶¯Õ½¶·ÅäÖà  | 
| #  @param curPlayer  | 
| #  @return None  | 
| def Sync_AutoFightSetting(curPlayer):    | 
|     BasicSkillCount, AreaSkillCount, BuffSkillCount = ReadChConfig.GetEvalChConfig("AutoFightSetting")  | 
|     settingDict = {}  | 
|       | 
|     Key = "BasicSkill"  | 
|     BasicSkillList = []  | 
|     for ValueIndex in xrange(BasicSkillCount):  | 
|         Value = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AutoFightSetting%(Key, ValueIndex), 0)  | 
|         BasicSkillList.append(Value)  | 
|     settingDict[Key] = BasicSkillList     | 
|       | 
|     Key = "AreaSkill"  | 
|     AreaSkillList = []  | 
|     for ValueIndex in xrange(AreaSkillCount):  | 
|         Value = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AutoFightSetting%(Key, ValueIndex), 0)  | 
|         AreaSkillList.append(Value)  | 
|     settingDict[Key] = AreaSkillList    | 
|       | 
|     Key = "BuffSkill"  | 
|     BuffSkillList = []  | 
|     for ValueIndex in xrange(BuffSkillCount):  | 
|         Value = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AutoFightSetting%(Key, ValueIndex), 0)  | 
|         BuffSkillList.append(Value)     | 
|     settingDict[Key] = BuffSkillList    | 
|        | 
|     Key = "HPPackagePercent"  | 
|     Value = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AutoFightSetting%(Key, 0), 0)  | 
|     settingDict[Key] = Value   | 
|       | 
|     #½«ÉèÖÃÄÚÈÝ֪ͨµ½¿Í»§¶Ë  | 
|     sendPack = ChPyNetSendPack.tagMCAutoFightSetting()  | 
|     sendPack.Clear()  | 
|     sendPack.Data = "%s"%settingDict  | 
|     sendPack.Size = len(sendPack.Data)  | 
|     NetPackCommon.SendFakePack(curPlayer, sendPack)   | 
|     return   | 
|   | 
| ## bossÉËѪÁбí·â°ü²éѯ  | 
| #  @param curPlayer  | 
| #  @return None  | 
| def OnQueryBossHurtList(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     if not curPlayer:  | 
|         return  | 
|     BossHurtMng.OnQueryBossHurtList(curPlayer, clientData)  | 
|     return  | 
|   | 
|   | 
| ## µØÍ¼NPCÐÅÏ¢²éѯ·â°ü  | 
| #  @param curPlayer  | 
| #  @return None  | 
| def OnQueryMapNPCInfo(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     if not curPlayer:  | 
|         return  | 
|       | 
|     # ²éѯ¼ä¸ô¿ØÖÆ  | 
|     if not clientData.IsNoTimeLimit:  | 
|         tickType = ChConfig.TYPE_Player_Tick_QueryMapNPCInfo  | 
|         if tick - curPlayer.GetTickByType(tickType) <= ChConfig.TYPE_Player_Tick_Time[tickType]:  | 
|             GameWorld.DebugLog("OnQueryMapNPCInfo ²éѯ¹ýÓÚÆµ·±£¡")  | 
|             return  | 
|           | 
|         curPlayer.SetTickByType(tickType, tick)  | 
|       | 
|     tagMapID = clientData.MapID  | 
|     tagLineID = clientData.LineID  | 
|     queryNPCStr = clientData.NPCIDList  | 
|     npcIDList = []  | 
|     if queryNPCStr:  | 
|         try:         | 
|             npcIDList = eval(clientData.NPCIDList)  | 
|         except BaseException:  | 
|             GameWorld.ErrLog("OnQueryMapNPCInfo, npcIDList=%s" % clientData.NPCIDList)  | 
|             return  | 
|           | 
|         if not isinstance(npcIDList, list):  | 
|             GameWorld.ErrLog("OnQueryMapNPCInfo, npcIDList=%s is not list£¡" % str(npcIDList))  | 
|             return  | 
|       | 
|     GameWorld.DebugLog("OnQueryMapNPCInfo tagMapID=%s,tagLineID=%s,npcIDList=%s"   | 
|                        % (tagMapID, tagLineID, str(npcIDList)))  | 
|       | 
|     curMapID = GameWorld.GetMap().GetMapID()  | 
|       | 
|     # Èç¹ûÊÇͬÕŵØÍ¼£¬Ö±½Ó²éѯ֪ͨ  | 
|     if curMapID == tagMapID:  | 
|         npcInfoDict = NPCCommon.GetNPCInfo(npcIDList, tick)  | 
|         gameWorld = IPY_GameWorld.IPY_GameWorld(tagLineID)  | 
|         playerManager = gameWorld.GetMapCopyPlayerManagerByFbIndex(tagLineID)  | 
|         playerCnt = 0  | 
|         if playerManager:  | 
|             playerCnt = playerManager.GetPlayerCount()  | 
|         GameWorld.DebugLog("    Í¬µØÍ¼²éѯcurMapID=%s,tagLineID=%s,playerCnt=%s,npcInfoDict=%s"   | 
|                            % (curMapID, tagLineID, playerCnt, str(npcInfoDict)))  | 
|         NPCCommon.SyncNPCInfo(curPlayer, tagMapID, playerCnt, npcInfoDict)  | 
|     else:  | 
|         # ÇëÇóGameServerÄ¿±êµØÍ¼NPCÐÅÏ¢  | 
|         sendMsg = "%s" % str([tagMapID, tagLineID, npcIDList])  | 
|         curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_NPCInfo, 0,  | 
|                                  'NPCInfo', sendMsg, len(sendMsg))  | 
|     return  | 
|   | 
|   | 
|   | 
| ## µØÍ¼NPCÊýÁ¿²éѯ·â°ü A2 27 ²éѯµØÍ¼NPCÊýÁ¿ÐÅÏ¢ #tagCMQueryNPCCntInfo  | 
| #  @param curPlayer  | 
| #  @return None  | 
| def OnQueryMapNPCCntInfo(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     if not curPlayer:  | 
|         return  | 
|       | 
|     # ²éѯ¼ä¸ô¿ØÖÆ  | 
|     if not clientData.IsNoTimeLimit:  | 
|         if not GameWorld.CheckPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_QueryMapNPCInfo, tick):  | 
|             GameWorld.DebugLog("OnQueryMapNPCCntInfo ²éѯ¹ýÓÚÆµ·±£¡")  | 
|             return  | 
|          | 
|     tagMapID = clientData.MapID  | 
|     tagLineID = clientData.LineID  | 
|     queryNPCStr = clientData.NPCIDList  | 
|     npcIDList = []  | 
|     if queryNPCStr:  | 
|         try:         | 
|             npcIDList = eval(clientData.NPCIDList)  | 
|         except BaseException:  | 
|             GameWorld.ErrLog("OnQueryMapNPCCntInfo, npcIDList=%s" % clientData.NPCIDList)  | 
|             return  | 
|           | 
|         if not isinstance(npcIDList, list):  | 
|             GameWorld.ErrLog("OnQueryMapNPCCntInfo, npcIDList=%s is not list£¡" % str(npcIDList))  | 
|             return  | 
|       | 
|     GameWorld.DebugLog("OnQueryMapNPCCntInfo tagMapID=%s,tagLineID=%s,npcIDList=%s"   | 
|                        % (tagMapID, tagLineID, str(npcIDList)))  | 
|       | 
|     curMapID = GameWorld.GetMap().GetMapID()  | 
|       | 
|     # Èç¹ûÊÇͬÕŵØÍ¼£¬Ö±½Ó²éѯ֪ͨ  | 
|     if curMapID == tagMapID:  | 
|         npcInfoDict = NPCCommon.GetNPCCntInfo(npcIDList, tick)  | 
|   | 
|         GameWorld.DebugLog("    Í¬µØÍ¼²éѯcurMapID=%s,tagLineID=%s,npcInfoDict=%s"   | 
|                            % (curMapID, tagLineID, str(npcInfoDict)))  | 
|         NPCCommon.SyncNPCCntInfo(curPlayer, tagMapID, npcInfoDict)  | 
|     else:  | 
|         # ÇëÇóGameServerÄ¿±êµØÍ¼NPCÐÅÏ¢  | 
|         sendMsg = "%s" % str([tagMapID, tagLineID, npcIDList])  | 
|         curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_NPCCnt, 0,  | 
|                                  'NPCCnt', sendMsg, len(sendMsg))  | 
|     return  | 
|   | 
|   | 
| ## ¿ç·þÈü±¨Ãû״̬  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def SendRegisterState(curPlayer, state):  | 
|     resultPack = ChPyNetSendPack.tagMergeWarRegisterState()  | 
|     resultPack.Clear()  | 
|       | 
|     resultPack.RegisterState = state  | 
|     NetPackCommon.SendFakePack(curPlayer, resultPack)  | 
|     return  | 
|   | 
|   | 
| # ¸ÄΪ¿Í»§¶ËÖ÷¶¯ÇëÇótick  A1 02  | 
| def QueryWorldTick(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     curPlayer.Sync_ClientTick()  | 
|     return  | 
|   | 
|   | 
| ## Í¬²½Ê±¼ä  | 
| #  @param curPlayer   | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| def Sync_PyServerDataTimeToClient(curPlayer):  | 
|     # ·þÎñÆ÷ʱ¼ä  | 
|     serverTime = GameWorld.GetCurrentTime()  | 
|     if not serverTime:  | 
|         return  | 
|       | 
|     serverDateTime = ChPyNetSendPack.tagServerDateTime()  | 
|     serverDateTime.Clear()  | 
|     serverDateTime.Year = serverTime.year  | 
|     serverDateTime.Month = serverTime.month  | 
|     serverDateTime.Day = serverTime.day  | 
|     serverDateTime.Hour = serverTime.hour  | 
|     serverDateTime.Minute = serverTime.minute  | 
|     serverDateTime.Second = serverTime.second  | 
|     serverDateTime.MicSecond = serverTime.microsecond     | 
|       | 
|     # Í¨Öª¿Í»§¶Ëͬ²½Ê±¼ä  | 
|     NetPackCommon.SendFakePack(curPlayer, serverDateTime)  | 
|     return  | 
|   | 
|   | 
| #===============================================================================  | 
| # //B4 09 Íæ¼ÒÒÆ¶¯ # tagCMPyMove  | 
| #   | 
| # struct    tagCMPyMove  | 
| # {  | 
| #    tagHead        Head;  | 
| #    WORD        Dir;    // ³¯Ïò  | 
| #    WORD        ClientPosX;    // ¿Í»§¶Ë×ø±êX ºÁÃ×  | 
| #    WORD        ClientPosY;    // ¿Í»§¶Ë×ø±êY   | 
| #    WORD        SeverPosX;    // ·þÎñ¶Ë×ø±êX ¸ñ×Ó  | 
| #    WORD        SeverPosY;    // ·þÎñ¶Ë×ø±êY  | 
| #    DWORD        WorldTick;  | 
| #    BYTE        MoveType;    // 0 Í£Ö¹ 1ÒÆ¶¯  | 
| # };  | 
| #===============================================================================  | 
|   | 
| # python´¦ÀíеÄÒÆ¶¯·½Ê½  | 
| def PYPlayerMove(index, clientPack, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     #·ÀÍâ¹Ò ²»¿ÉÒÆ¶¯  | 
|     if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_AutoCheckHack_State) \  | 
|                                       == ChConfig.Def_AutoCheck_State_Danger:  | 
|         return  | 
|   | 
|     if not PYPlayerNormalMove(curPlayer, clientPack, tick):  | 
|         posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY()  | 
|           | 
|         if GameWorld.GetMap().CanMove(posX, posY) != True:  | 
|             resultPos = GameMap.GetEmptyPlaceInArea(posX, posY, 5)  | 
|       | 
|             if resultPos.GetPosX() == posX and resultPos.GetPosY() == posY:  | 
|                 GameWorld.ErrLog("Íæ¼Ò×ø±ê¿¨ËÀ %s %s"%(posX, posY))  | 
|                 return  | 
|             posX = resultPos.GetPosX()  | 
|             posY = resultPos.GetPosY()   | 
|               | 
|         curPlayer.ResetPos(posX, posY)  | 
|   | 
| def PYPlayerNormalMove(curPlayer, clientPack, tick) :  | 
|       | 
|     #Íæ¼ÒÒÆ¶¯Í¨Óüì²é  | 
|     if not __CheckPlayerCanMove(curPlayer):  | 
|         return True  | 
|       | 
|     #·â°ü²ÎÊý  | 
|     moveDir = clientPack.Dir    # Òƶ¯·½Ïò  | 
|     clientPosX = clientPack.ClientPosX     #ºÁÃ× Ö»×÷Ϊ»Ø°üÓà  | 
|     clientPosY = clientPack.ClientPosY  | 
|     sendPack_SeverPosX = clientPack.SeverPosX      #¸ñ×Ó  | 
|     sendPack_SeverPosY = clientPack.SeverPosY  | 
|     sendPack_WorldTick = clientPack.WorldTick  | 
|     moveType = clientPack.MoveType  | 
|       | 
|     lastMoveTick = curPlayer.GetClientMoveTick()  | 
|       | 
|     if moveType != 0 and sendPack_WorldTick - lastMoveTick < 50:  | 
|         GameWorld.DebugLog("move ·¢°üÌ«¿ì ÊÕ°ü%s - ÉÏÒ»´Î%s"%(sendPack_WorldTick, lastMoveTick))  | 
|         # ·¢°ü¹ý¿ì  | 
|         return True  | 
|       | 
|     #ÏÈÑé֤Ŀ±êµãÊÇ·ñºÏ·¨  | 
|     if not GameWorld.GetMap().CanMove(sendPack_SeverPosX, sendPack_SeverPosY):  | 
|         GameWorld.DebugLog("ÒÆ¶¯Õϰµã")  | 
|         return False  | 
|       | 
|     if curPlayer.GetPosX() == sendPack_SeverPosX and curPlayer.GetPosY() == sendPack_SeverPosY:  | 
|         if moveType != 0 and sendPack_WorldTick - lastMoveTick < 222:  | 
|             # ¼õÉÙͬ²½ÂÊ  | 
|             return True  | 
|         curPlayer.SetClientMoveTick(sendPack_WorldTick)  | 
|         #GameWorld.DebugLog("ûÓиñ×ÓÒÆ¶¯µÄÒ²¹ã²¥")  | 
|         # Ã»Óиñ×ÓÒÆ¶¯µÄÒ²¹ã²¥  | 
|         PyNotifyPlayerMove(curPlayer, moveDir, clientPosX, clientPosY, sendPack_SeverPosX, sendPack_SeverPosY, moveType)  | 
|         return True  | 
|       | 
|       | 
|     #---¸±±¾µØÍ¼Òƶ¯¼ì²é---  | 
|     if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:  | 
|         if not FBLogic.DoFBCanMove(curPlayer, sendPack_SeverPosX, sendPack_SeverPosY, tick):  | 
|             return False  | 
|       | 
|     #---Õý³£Òƶ¯---  | 
|     vehicle = curPlayer.GetPlayerVehicle()  | 
|       | 
|     if vehicle not in [IPY_GameWorld.pvNull, IPY_GameWorld.pvHorse]:  | 
|         #GameWorld.ErrLog("²»ÄÜÒÆ¶¯, ½»Í¨¹¤¾ß²»Ã÷ %d" % (vehicle), curPlayer.GetID())  | 
|         return False  | 
|       | 
|   | 
|     #УÑé¿Í»§¶Ëʱ¼ä  | 
|     if not PlayerControl.PlayerMoveCheckClientWorldTick(curPlayer, sendPack_WorldTick, sendPack_SeverPosX, sendPack_SeverPosY):  | 
|         curPlayer.Sync_ClientTick()  | 
|         return False  | 
|   | 
|     dist = GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), sendPack_SeverPosX, sendPack_SeverPosY)  | 
|     if dist > 4:  | 
|         # ¶ª°ü À»Ø  | 
|         GameWorld.DebugLog("ÒÆ¶¯¾àÀë¹ý´ó£¬ Íæ¼Ò×ø±ê %s-%s  ÊÕ°ü %s-%s"%(curPlayer.GetPosX(), curPlayer.GetPosY(),   | 
|                                                            sendPack_SeverPosX, sendPack_SeverPosY), curPlayer.GetID())  | 
|         return False  | 
|       | 
|       | 
|     #Èç¹ûÊÇСÓÎÏ·ÖÐÔòֹͣСÓÎÏ·  | 
|     if curPlayer.GetPlayerAction() == IPY_GameWorld.paGameEvent:  | 
|         PlayerGameEvent.StopGameEvent(curPlayer, tick)  | 
|           | 
|     #2010/04/30 Òƶ¯ÐÞ¸ÄΪȫC++¿ØÖÆ, Python״̬»úÉèÖÃΪ¿ÕÏÐ(Çå¿Õ²É¼¯µÈ״̬)  | 
|     PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paNull)  | 
|     #ɾ³ýÓÐÏÞÎÞµÐBUFF  | 
|     #PlayerControl.DelLimitSuperBuff(curPlayer, tick)  | 
|   | 
|     curPlayer.ChangePos(sendPack_SeverPosX, sendPack_SeverPosY)  | 
|     PyNotifyPlayerMove(curPlayer, moveDir, clientPosX, clientPosY, sendPack_SeverPosX, sendPack_SeverPosY, moveType)  | 
|     curPlayer.SetClientMoveTick(sendPack_WorldTick)  | 
|       | 
|     # ºóÃæ±ØÐë·µ»ØTrue  | 
|     fightPet = curPlayer.GetPetMgr().GetFightPet()  | 
|     if fightPet:  | 
|         #³öÕ½³èÎïÍ¬Ê±ÒÆ¶¯  | 
|         if moveType == 0 or tick - fightPet.GetActionTick() > 300:  | 
|       | 
|             PetControl.FightPetFollowMove(curPlayer,sendPack_SeverPosX, sendPack_SeverPosY)  | 
|             fightPet.SetCurAction(IPY_GameWorld.laNPCNull)  | 
|               | 
|     return True  | 
|   | 
|   | 
| #===============================================================================  | 
| # //B4 0A Íæ¼ÒÒÆ¶¯ #tagMCPYPlayerMove  | 
| #   | 
| # struct    tagMCPYPlayerMove  | 
| # {  | 
| #    tagHead        Head;  | 
| #    WORD        Dir;    // ³¯Ïò  | 
| #    WORD        ClientPosX;    // ¿Í»§¶Ë×ø±êX ºÁÃ×  | 
| #    WORD        ClientPosY;    // ¿Í»§¶Ë×ø±êY  | 
| #    WORD        SeverPosX;    // ·þÎñ¶Ë×ø±êX ¸ñ×Ó  | 
| #    WORD        SeverPosY;    // ·þÎñ¶Ë×ø±êY  | 
| #    DWORD        ObjID;  | 
| #    BYTE        ObjType;  | 
| #    WORD        Speed;  | 
| #    BYTE        MoveType;    // 0 Í£Ö¹ 1ÒÆ¶¯  | 
| # };  | 
| #===============================================================================  | 
| def PyNotifyPlayerMove(curPlayer, moveDir, clientPosX, clientPosY, posX, posY, moveType):  | 
|     sendPack = ChPyNetSendPack.tagMCPYPlayerMove()  | 
|       | 
|     sendPack.Clear()  | 
|     sendPack.ObjID = curPlayer.GetID()  | 
|     sendPack.ObjType = IPY_GameWorld.gotPlayer  | 
|     sendPack.Dir = moveDir  | 
|     sendPack.ClientPosX = clientPosX  | 
|     sendPack.ClientPosY = clientPosY  | 
|     sendPack.SeverPosX = posX  | 
|     sendPack.SeverPosY = posY  | 
|     sendPack.Speed = curPlayer.GetSpeed()  | 
|     sendPack.MoveType = moveType  | 
|     # NotifyAll ×ö¹ýÂË»òÕßÊýÁ¿´¦Àí  | 
|     PlayerControl.PyNotifyAll(curPlayer, sendPack, False, -1)  | 
|     return  | 
|   | 
| def GetDownloadAward(curPlayer, dataEx):  | 
|     ##·Ö°üÏÂÔØ½±Àø dataEx 0Ö±½ÓÁìÈ¡ 1·¢Óʼþ  | 
|     awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DownloadAwardState)  | 
|     if awardState:  | 
|         GameWorld.Log('    ·Ö°üÏÂÔØ½±ÀøÒÑÁìÈ¡£¬²»¿ÉÖØ¸´ÁìÈ¡£¡', curPlayer.GetID())  | 
|         return  | 
|       | 
|     awardItemList = IpyGameDataPY.GetFuncEvalCfg('DownReward')  | 
|     # ¼ì²é±³°ü  | 
|     if dataEx == 0:  | 
|         needSpace = len(awardItemList)  | 
|         packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  | 
|         if needSpace > packSpace:  | 
|             PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")  | 
|             return  | 
|           | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DownloadAwardState, 1)  | 
|     if dataEx == 1:  | 
|         PlayerControl.SendMailByKey('SubpackageDownload', [curPlayer.GetID()], awardItemList)  | 
|     else:  | 
|         for itemID, itemCnt, isBind in awardItemList:  | 
|             ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, isBind, [IPY_GameWorld.rptItem])  | 
|     SyncPackDownloadAward(curPlayer)  | 
|     return  | 
|   | 
| def SyncPackDownloadAward(curPlayer):  | 
|     #·Ö°üÏÂÔØ½±Àø¼Ç¼֪ͨ  | 
|     sendPack = ChPyNetSendPack.tagMCPackDownloadRecord()  | 
|     sendPack.Clear()  | 
|     sendPack.Record = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DownloadAwardState)  | 
|     NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
|     return |