| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
|   | 
| ##@package PlayerTruck  | 
| # ´ËÄ£¿éʵÏÖæô³µÂß¼  | 
| #  | 
| # @author eggxp  | 
| # @date 2010-4-28  | 
| # @version 3.2  | 
| #  | 
| # ÐÞ¸Äʱ¼ä ÐÞ¸ÄÈË ÐÞ¸ÄÄÚÈÝ  | 
| # @change: "2013-03-13 17:00" wdb É¾³ý·â°ü  | 
| # @change: "2013-04-17 20:35" Alee Í³Ò»BUFFɾ³ýº¯Êý  | 
| # @change: "2013-04-25 13:30" Alee ×ªÒÆDelBuffBySkillID  | 
| # @change: "2014-10-14 14:00" hxp »Ö¸´·â°ü£»ÐÞ¸ÄϵͳÌáʾ£»Ôö¼ÓÿÈÕ¿ÉÃâ·ÑË¢ÐÂïÚ³µ´ÎÊý  | 
| # @change: "2014-10-17 17:00" hxp Ôö¼ÓÀïÚ»îÔ¾¶È£»Ð޸Ľ±ÀøÌáʾ²ÎÊý£»Ð޸Ĵò½ÙÏà¹ØÊýÖµ´æ´¢  | 
| # @change: "2014-10-18 16:00" hxp Ôö¼ÓÍæ¼ÒËÀÍöïÚ³µ´¦Àí£»½±ÀøÌṩreExp¼°reMoney£»OnDayÖØÖýÙïÚ´ÎÊý  | 
| # @change: "2014-10-21 09:20" Alee ïÚ³µ±¨´í¼òµ¥·À·¶  | 
| # @change: "2014-11-12 16:30" hxp Ôö¼ÓÀïÚ/½ÙïÚ³É¾Í  | 
| # @change: "2014-11-15 15:30" hxp È¥³ýïÚ³µbuffÂß¼  | 
| # @change: "2014-11-15 17:30" Alee ÓÅ»¯ÀïÚËÙ¶ÈˢР | 
| # @change: "2015-01-12 17:40" ljd ÐÞ¸ÄïÚ³µµÈ¼¶Ë¢ÐÂ--¿É°ó×êˢР | 
| # @change: "2015-01-14 00:30" hxp Ôö¼Ó×êʯÏûºÄÀàÐÍ  | 
| # @change: "2015-01-23 17:00" ljd Ð޸İó×ê¡¢×êʯˢиÅÂÊ·Ö¿ª  | 
| # @change: "2015-03-19 16:50" ljd ¹ó×å¼Ó³É  | 
| # @change: "2015-07-10 17:30" ljd ÅÅÐаñ¼ÓÍæ¼Òƽ̨²ÎÊýName2  | 
| # @change: "2015-07-28 11:10" ljd ¹ó×å¼Ó³É »¹Ô  | 
| # @change: "2016-06-13 10:30" hxp ïÚ³µÐÞ¸ÄΪÏÞʱÍê³É; Ôö¼ÓïÚ³µ½±ÀøÍ¨Öª  | 
| # @change: "2016-07-04 15:00" hxp ïÚ³µË¢Ðµȼ¶Ö§³ÖÎïÆ·Ä£Ê½£» ´´½¨ïÚ³µÖ§³Ö¶îÍâ½±Àø  | 
| # @change: "2016-07-18 19:00" hxp ïÚ³µÈÎÎñ״̬±ä¸üʼþ¼Ç¼µã  | 
| # @change: "2016-09-06 11:00" xdh Ôö¼Ó¿ª·þÌ커ËÍË«±¶ÅäÖà  | 
| # @change: "2016-09-06 20:30" hxp Ôö¼Ó×Ô¶¯ÔËïÚ״̬ÏÂÎ޵Р | 
| # @change: "2017-03-16 21:00" hxp ¾Ñé½±ÀøÊýÖµÖ§³Ö³¬¹ý20ÒÚ, ïÚ³µÖ÷È˵ȼ¶¼Ç¼֧³Ö4λÊý  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2017-03-16 21:00"""  | 
| #------------------------------------------------------------------------------------------------------------   | 
| #  | 
| import IPY_GameWorld  | 
| import GameMap  | 
| import GameWorld  | 
| import ChConfig  | 
| import PlayerControl  | 
| import EventShell  | 
| import NPCCommon  | 
| import ReadChConfig  | 
| #import PlayerPrestigeSys  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import SkillCommon  | 
| import ShareDefine  | 
| import DataRecordPack  | 
| import PlayerBillboard  | 
| import PlayerActivity  | 
| import PlayerSuccess  | 
| import ItemCommon  | 
| import ItemControler  | 
| import QuestCommon  | 
| import BuffSkill  | 
| import GameObj  | 
| #---------------------------------------------------------------------  | 
| Def_TruckOwnerTeamID = "TeamID"  # NPC×Öµä¼Ç¼Ö÷È˶ÓÎéID  | 
| Def_TruckOwnerFamilyID = "FamilyID"  # NPC×Öµä¼Ç¼Ö÷È˼Ò×åID  | 
| Def_TruckOwnerNameColor = "NameColor"  # NPC×Öµä¼Ç¼Ö÷ÈËÃû×ÖÑÕÉ«  | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # #Íæ¼Ò½øÈëæô³µ, Òª:  | 
| # #1.Íæ¼ÒÊôÐÔÉèÖÃΪÒþ²Ø,   | 
| # #2.ÉèÖÃÍæ¼ÒΪæô³µ×´Ì¬,  | 
| # #3.ÉèÖÃÍæ¼ÒΪÎÞµÐ״̬   | 
| # #4.ÉèÖÃÍæ¼ÒµÄæô³µSetTruck()  ÊäÈëΪÕÙ»½³öÀ´µÄSummonNPCÀàÐÍ  | 
| #   | 
| # #Íæ¼ÒÀ뿪æô³µ, Òª:  | 
| # #1.Íæ¼ÒÊôÐÔÉèÖÃΪ²»Òþ²Ø  | 
| # #2.ÉèÖÃÍæ¼ÒΪ¿ÕÏÐ״̬    | 
| # #3.ÉèÖÃÍæ¼ÒΪ·ÇÎÞµÐ״̬  | 
| # #4.ÉèÖÃÍæ¼ÒµÄæô³µSetTruck(None)  | 
| #===============================================================================  | 
|   | 
|   | 
| #===============================================================================  | 
| # #Íæ¼Ò½øÈëг¡¾°, Òª:  | 
| # #1. ¸ù¾Ýæô³µIDÕÒµ½×Ô¼ºµÄæô³µ  | 
| # #------>Èç¹ûÕÒµ½ÁË,   | 
| # #2. æô³µµÄSetOwnerΪ×Ô¼º  | 
| # #3. Íæ¼ÒµÄSetTruckΪÕâ¸öæô³µ  | 
| #===============================================================================  | 
|   | 
|   | 
| #===============================================================================  | 
| # #Íæ¼ÒÀ뿪±¾³¡¾°:  | 
| # #----->Èç¹ûÓÐæô³µ,   | 
| # #1. æô³µµÄSetOwnerΪNone  | 
| # #2. Íæ¼ÒµÄSetTruckΪNone   | 
| #===============================================================================  | 
|   | 
|   | 
| # Ë¢ÐÂïÚ³µµÈ¼¶·½Ê½¶¨Òå  | 
| (  | 
| Def_RefreshTruckLVWay_Free,    # Ãâ·ÑË¢  | 
| Def_RefreshTruckLVWay_Item,    # µÀ¾ßË¢  | 
| Def_RefreshTruckLVWay_Money,   # »õ±ÒË¢  | 
| Def_RefreshTruckLVWay_Max,  | 
| ) = range(4)  | 
|   | 
| ## ¼ì²âÈÎÎñÔÚµØÍ¼ÖÐÊÇ·ñÓÐïÚ³µ  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def PlayerInMapHaveTruck(curPlayer):  | 
|   | 
|     if curPlayer.GetTruck() != None or GameWorld.GetAllFbNPCManager().FindTruckByID(curPlayer.GetTruckID()):  | 
|         #Õâ¸öÈË»¹ÓÐæô³µ  | 
|         return True  | 
|       | 
|     #2009.2.23  | 
|     #bugʾÀý:  | 
|     #1.Çå³ýÍæ¼Ò״̬  | 
|     #2.Íæ¼Ò½Óæô³µÈÎÎñ      <- ÕâÀï»á¶ÏÑÔ, 2Á¾æô³µ  | 
|     #3.ɾ³ýæô³µ  | 
|     #ΪÁ˰²È«ÐÔ, ÕâÀïÔÙ´ÎУÑé, Íæ¼ÒûÓÐæô³µ  | 
|     if GameWorld.GetAllFbNPCManager().FindTruckByID(curPlayer.GetID() * IPY_GameWorld.Def_Player_Truck_ID_Rate):  | 
|         return True  | 
|     return False  | 
|   | 
|   | 
| ## ´´½¨ïÚ³µ   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò,  | 
| #  @param truckMoney ïÚ³µÑº½ð  | 
| #  @param money_type Ñº½ðÀàÐÍ  | 
| #  @param summonID ÕÙ»½ID,  | 
| #  @param eventID Ê¼þID  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def  CreateTruck(curPlayer,truckMoney, money_type,summonID, eventID, tick):  | 
|     # ¿ç·þ·þÎñÆ÷¹¦ÄÜÏÞÖÆ  | 
|     if GameWorld.IsCrossServer():  | 
|         return  | 
|               | 
|     #ÅжÏÊÇ·ñÒѾ´æÔÚïÚ³µ,´æÔÚÏûʧ  | 
| #    if curPlayer.GetTruckID() != 0:  | 
| #        GameWorld.Log("ÒѾÓÐæô³µ ID = %d"%curPlayer.GetTruckID())  | 
| #        return  | 
|   | 
| #    if PlayerControl.GetSilver(curPlayer) < truckMoney:  | 
| #        GameWorld.Log("Òø×Ó²»×ã Ñº½ð = %d"%truckMoney)  | 
| #        return   | 
|     if PlayerInMapHaveTruck(curPlayer):  | 
|         #Õâ¸öÈË»¹ÓÐæô³µ  | 
|         raise Exception("CreateTruck, Player Already Have Truck")  | 
|         return  | 
|   | 
|     #=========================================================================================================  | 
|     # if truckMoney != 0 and money_type == 0:  | 
|     #    GameWorld.Log("Ѻ½ðÀàÐͲ»¶Ô = %d"%(money_type) , curPlayer.GetPlayerID())  | 
|     #    return  | 
|     #=========================================================================================================  | 
|       | 
|     #ÉèÖÃÂíÆ¥µÈ¼¶  | 
|     curPlayer.SetHorseLV(0)  | 
|     #ÉèÖÃïÚ³µµ±Ç°×´Ì¬  | 
|     curPlayer.SetTruckState(IPY_GameWorld.tusNormal)  | 
|       | 
|     #=========================================================================================================  | 
|     # #ÉèÖÃïÚ³µÑº½ð  | 
|     # curPlayer.SetTruckMoney(truckMoney)  | 
|     # curPlayer.SetTruckMoneyType(money_type)  | 
|     #=========================================================================================================  | 
|       | 
|     #ÉèÖÃïÚ³µÈÎÎñ¿ªÊ¼Ê±¼ä  | 
|     curPlayer.SetTruckCalcStartTime(tick)  | 
|     summonTruck = curPlayer.SummonTruck()  | 
|     summonTruck.SetNPCTypeID(summonID)  | 
|     #Ö»ÓÐÔÚÉèÖÃÁËNPCTypeIDºó,²ÅÄÜÉèÖÃÆäËûÊôÐÔ  | 
|     summonTruck.SetTickTypeCount(ChConfig.TYPE_NPC_Tick_Count)  | 
|       | 
|     #ÉèÖÃïÚ³µµÈ¼¶  | 
|     truckLv = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TruckLV)  | 
|       | 
|     #¼Ç¼µ±Ç°Ñºïڵȼ¶, ÒòΪSetLVÔÚÇл»µØÍ¼ÒÔºó»á±»ÇåµôDef_Player_Dict_TruckLVÔÚÕÙ»½³öÀ´ÒÔºóɾ³ýÁË  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_PawnTruckLV, truckLv)  | 
|     summonTruck.SetLV(truckLv)  | 
|       | 
|     summonTruck.SetOwner(curPlayer)  | 
|     summonTruck.SetOwnerID(curPlayer.GetID())  | 
|     summonTruck.SetCountry(curPlayer.GetCountry())  | 
|     summonTruck.SetName(curPlayer.GetName())  | 
|           | 
|     curPlayer.SetTruck(summonTruck)  | 
|     #ÉèÖÃïÚ³µIDΪÈËÎïID  | 
|     curPlayer.SetTruckID(summonTruck.GetID())  | 
|     curPlayer.SetTruckEventID(eventID)  | 
|     summonPos = GameMap.GetEmptyPlaceInArea(curPlayer.GetPosX(), curPlayer.GetPosY(), ChConfig.Def_DropItemDist)  | 
|       | 
|     #ÉèÖÃïÚ³µÖ÷È˵ȼ¶  | 
|     SetTruckOwnerLV(summonTruck, curPlayer.GetLV())  | 
|       | 
|     #¸ü¸ÄïÚ³µ¼Ç¼µÄ²¿·ÖÖ÷ÈËÐÅÏ¢  | 
|     ChangeTruckNoteInfo(curPlayer)  | 
|     #=========================================================================================================  | 
|     # #ÔÚæô³µÉíÉÏÉèÖÃæô³µÑº½ð  | 
|     # summonTruck.SetMoney(truckMoney)  | 
|     # summonTruck.SetMoneyType(money_type)  | 
|     #=========================================================================================================  | 
|       | 
|     #´´½¨ïÚ³µ  | 
|     summonTruck.Reborn(summonPos.GetPosX(), summonPos.GetPosY())  | 
|           | 
|     #֪ͨGameServeræô³µ³öÏÖ  | 
|     summonTruck.GameServer_Sync_TruckAppear()  | 
|       | 
|     #È«·þ¹ã²¥  | 
|     #Truck_hgg_246653 XXXXX¿ªÊ¼»¤ËÍXXïÚ³µÀ²~´ó¼Ò¿ìÈ¥¡¾Î§¹Û¡¿°¡~  | 
|     if truckLv in ReadChConfig.GetEvalChConfig("TruckWorldNotifyLv"):  | 
|         PlayerControl.WorldNotify(0, "Truck_hgg_246653", [curPlayer.GetName(), truckLv])  | 
|       | 
|     #¿ÉÕÙ»½ïÚ³µµÈ¼¶ÉèÖóÉ0  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_TruckLV, 0)  | 
|       | 
|     #֪ͨ¿Í»§¶ËïÚ³µAIģʽ  | 
|     Sync_TruckMode(curPlayer)  | 
|       | 
|     #ÉèÖÃïÚ³µÎ޵Р | 
|     SkillCommon.AddBuffBySkillType(summonTruck, ChConfig.Def_SkillID_LimitSuperBuff, tick)  | 
|       | 
|     #ÉèÖÃAIģʽbuff  | 
|     AddTruckStateBuff(summonTruck, tick)  | 
|       | 
|     DataRecordPack.DR_Truck(curPlayer, "Star", {"LV":truckLv})  | 
|       | 
|     #¸üÐÂïÚ³µ½øÅÅÐаñ  | 
|     PlayerBillboard.UpdateBillboardPlayerTruck(curPlayer.GetPlayerID(), curPlayer.GetName(), curPlayer.GetOperateInfo(),  | 
|                                                curPlayer.GetLV(), truckLv, curPlayer.GetMapID())  | 
|       | 
|     #ÀïÚ»îÔ¾¶È  | 
|     #PlayerActivity.AddActivityFinishCnt(curPlayer, ShareDefine.ActivityNum_Truck)  | 
|               | 
|     GameWorld.Log("´´½¨ïÚ³µ³É¹¦" , curPlayer.GetPlayerID())  | 
|     return  | 
|   | 
|   | 
| ## ¸ü¸ÄïÚ³µ¼Ç¼µÄ²¿·ÖÖ÷ÈËÐÅÏ¢  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @return: None  | 
| def ChangeTruckNoteInfo(curPlayer):  | 
|     playerTeamID = curPlayer.GetTeamID()  | 
|     playerFamilyID = curPlayer.GetFamilyID()  | 
|     playerNameColor = curPlayer.GetPlayerNameColor()  | 
|       | 
|     curTruck = curPlayer.GetTruck()  | 
|     if curTruck:  | 
|         SetTruckTeamID(curTruck, playerTeamID)  | 
|         SetTruckFamilyID(curTruck, playerFamilyID)  | 
|         SetTruckNameColor(curTruck, playerNameColor)  | 
|         return  | 
|       | 
|     #ÏòGameServerÇëÇó¼Ç¼ÐÅÏ¢  | 
|     sysmsg = "%s"%([playerTeamID, playerFamilyID, playerNameColor])  | 
|     curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_NoteTruckOwnerInfo,   | 
|              curPlayer.GetID(), 'NoteTruckOwnerInfo', sysmsg, len(sysmsg))  | 
|       | 
|     return  | 
|   | 
|   | 
| ## »ñµÃ¼Ç¼ïÚ³µÉíÉϵÄÖ÷È˶ÓÎéID  | 
| #  @param curTruck: µ±Ç°ïÚ³µ  | 
| #  @return ¼Ç¼ïÚ³µÉíÉϵÄÖ÷È˶ÓÎéID  | 
| def GetTruckTeamID(curTruck):  | 
|     return curTruck.GetDictByKey(Def_TruckOwnerTeamID)  | 
|   | 
|   | 
| ## ÉèÖÃïÚ³µÖ÷È˶ÓÎéID  | 
| #  @param curTruck: ïÚ³µÊµÀý  | 
| #  @param teamID: ¶ÓÎéID  | 
| #  @return:   | 
| def SetTruckTeamID(curTruck, teamID):  | 
|     #¼Ç¼Ö÷È˶ÓÎéID  | 
|     if curTruck.GetDictByKey(Def_TruckOwnerTeamID) == teamID:  | 
|         return  | 
|       | 
|     curTruck.SetDict(Def_TruckOwnerTeamID, teamID)  | 
|     return  | 
|   | 
|   | 
| ## »ñµÃ¼Ç¼ïÚ³µÉíÉϵÄÖ÷ÈËÃû×ÖÑÕÉ«  | 
| #  @param curTruck: µ±Ç°ïÚ³µ  | 
| #  @return ¼Ç¼ïÚ³µÉíÉϵÄÖ÷È˶ÓÎéID  | 
| def GetTruckNameColor(curTruck):  | 
|     return curTruck.GetDictByKey(Def_TruckOwnerNameColor)  | 
|   | 
|   | 
| ## ÉèÖÃïÚ³µÉíÉϵÄÖ÷ÈËÃû×ÖÑÕÉ«  | 
| #  @param curTruck: µ±Ç°ïÚ³µ  | 
| #  @return ¼Ç¼ïÚ³µÉíÉϵÄÖ÷È˶ÓÎéID  | 
| def SetTruckNameColor(curTruck, nameColor):  | 
|     #¼Ç¼Ö÷ÈËÃû×ÖÑÕÉ«  | 
|     if curTruck.GetDictByKey(Def_TruckOwnerNameColor) == nameColor:  | 
|         return  | 
|       | 
|     curTruck.SetDict(Def_TruckOwnerNameColor, nameColor)  | 
|     return  | 
|   | 
|   | 
| ## »ñµÃ¼Ç¼ïÚ³µÉíÉϵÄÖ÷È˶ÓÎéID  | 
| #  @param curTruck: µ±Ç°ïÚ³µ  | 
| #  @return ¼Ç¼ïÚ³µÉíÉϵÄÖ÷È˶ÓÎéID  | 
| def GetTruckFamilyID(curTruck):  | 
|     return curTruck.GetDictByKey(Def_TruckOwnerFamilyID)  | 
|   | 
|   | 
| ## ÉèÖÃïÚ³µÖ÷È˼Ò×åID  | 
| #  @param curTruck: ïÚ³µÊµÀý  | 
| #  @param teamID: ¶ÓÎéID  | 
| #  @return:   | 
| def SetTruckFamilyID(curTruck, familyID):  | 
|     #¼Ç¼Ö÷È˼Ò×åID  | 
|     if curTruck.GetDictByKey(Def_TruckOwnerFamilyID) == familyID:  | 
|         return  | 
|       | 
|     curTruck.SetDict(Def_TruckOwnerFamilyID, familyID)  | 
|     return  | 
|   | 
|   | 
| ## ÉèÖÃïÚ³µ½ðÇ®ÀàÐÍ  | 
| #  @param curTagTruck: ïÚ³µÊµÀý  | 
| #  @param moneyType: ½ðÇ®ÀàÐÍ  | 
| #  @return: None  | 
| def __SetTruckMoneyType(curTagTruck, moneyType):  | 
|     curTagTruck.SetMoneyType(moneyType)  | 
|     return  | 
|   | 
|   | 
| ## »ñÈ¡ïÚ³µ½ðÇ®ÀàÐÍ  | 
| #  @param curTagTruck: ïÚ³µÊµÀý  | 
| #  @return: ïÚ³µ½ðÇ®ÀàÐÍ  | 
| def __GetTruckMoneyType(curTagTruck):  | 
|     return curTagTruck.GetMoneyType()  | 
|   | 
|   | 
| ## ÉèÖÃѺïÚÍæ¼ÒµÈ¼¶  | 
| #  @param curTagTruck: ïÚ³µÊµÀý  | 
| #  @param ownerLV: µÈ¼¶  | 
| #  @return: None  | 
| def SetTruckOwnerLV(curTagTruck, ownerLV):  | 
|     __SetTruckMoneyType(curTagTruck, ownerLV)  | 
|     return  | 
|   | 
|   | 
| ## »ñȡѺïÚÍæ¼ÒµÈ¼¶  | 
| #  @param curTagTruck: ïÚ³µÊµÀý  | 
| #  @param ownerLV: µÈ¼¶  | 
| #  @return: None  | 
| def GetTruckOwnerLV(curTagTruck):  | 
|     value = __GetTruckMoneyType(curTagTruck)  | 
|     if len(str(value)) <= 4:  | 
|         return value  | 
|       | 
|     return int(str(value)[:-4])  | 
|   | 
|   | 
| ## ÉèÖýÙïÚÍæ¼ÒµÈ¼¶  | 
| #  @param curTagTruck: ïÚ³µÊµÀý  | 
| #  @param destroyLV: ½ÙïÚÍæ¼ÒµÈ¼¶  | 
| #  @return: None  | 
| def SetTruckDestroyLV(curTagTruck, destroyLV):  | 
|     value = "%0.4d%0.4d"%(GetTruckOwnerLV(curTagTruck), destroyLV)  | 
|     __SetTruckMoneyType(curTagTruck, int(value))  | 
|     return  | 
|   | 
|   | 
| ## »ñµÃ½ÙïÚÍæ¼ÒµÈ¼¶  | 
| #  @param curTagTruck: ïÚ³µÊµÀý  | 
| #  @return: None  | 
| def GetTruckDestroyLV(curTagTruck):  | 
|       | 
|     value = __GetTruckMoneyType(curTagTruck)  | 
|       | 
|     if len(str(value)) <= 4:  | 
|         return 0  | 
|       | 
|     return int(str(value)[-4:])  | 
|   | 
|   | 
| #class   IPY_MTruckRefresh  | 
| #{  | 
| #public:  | 
| #    //ÓµÓÐÕßID  | 
| #    int      GetPlayerID();  | 
| #    //æô³µID  | 
| #    int      GetTruckID();  | 
| #    //æô³µ×´Ì¬  | 
| #    int      GetTruckState();  | 
| #};  | 
|   | 
| ## ÓÎÏ··þÎñÆ÷ïÚ³µË¢ÐÂ(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def  GameServer_TruckRefresh(index, tick):  | 
|     sendPack = IPY_GameWorld.IPY_MTruckRefresh()  | 
|     #GetAllFbNPCManager : µÃµ½ËùÓи±±¾ÖеÄNPC¹ÜÀíÆ÷, æô³µ´æÔÚÓÚËùÓÐÓи±±¾  | 
|     curTruck = GameWorld.GetAllFbNPCManager().FindTruckByID(sendPack.GetTruckID())  | 
|     if curTruck == None:  | 
|         GameWorld.Log("ûÓÐҪˢÐÂµÄæô³µ id = %d"%sendPack.GetTruckID())  | 
|         return  | 
|       | 
|     if (sendPack.GetTruckState() == IPY_GameWorld.tusDisappear):  | 
|         #ÉèÖÃΪÏûʧ״̬, ÔÚAIÖд¦Àí×Ô¼ºµÄÏûʧÂß¼  | 
|         #ÒòΪ·â°ü´¦ÀíÊÇÔÚ¸±±¾1ÖÐ, æô³µÓпÉÄÜÔÚ¸±±¾2,3,4...ÖÐ, ÏûʧÂß¼±ØÐëÔÚµ±Ç°¸±±¾´¦Àí  | 
|         curTruck.SetIsDisappear(1)  | 
|           | 
|         ##ɾ³ýÅÅÐаñÉϵÄïÚ³µÐÅÏ¢  | 
|         PlayerBillboard.UpdateBillboardPlayerTruck(curTruck.GetOwnerID(), "", "", "", "", 0)  | 
|               | 
| #        curPlayer = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, curTruck)  | 
| #  | 
| #        if curPlayer:  | 
| #            #æô³µÏûʧ  | 
| #            if curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvTruck:  | 
| #                #Èç¹ûÍæ¼ÒµÄ½»Í¨¹¤¾ßΪæô³µµÄ»°, À뿪æô³µ  | 
| #                PlayerTruckDown(curPlayer, curTruck)  | 
| #      | 
| #            curPlayer.SetTruckID(0)  | 
| #            curPlayer.SetTruckState(IPY_GameWorld.tusNull)  | 
| #            curPlayer.SetTruck(None)  | 
| #              | 
| #        curTruck.Disappear()  | 
|         return  | 
|   | 
|     return  | 
|   | 
|   | 
| #class       IPY_MTruckMsg  | 
| #{  | 
| #    //get×Ô¶¯Éú³É  | 
| #    int      GetHead();  | 
| #    int      GetType();                //1.±»¹¥»÷֪ͨ  | 
| #  | 
| #    //set×Ô¶¯Éú³É  | 
| #    void                SetHead(int inputHead);  | 
| #    void                SetType(int inputType);         //1.±»¹¥»÷֪ͨ  | 
| #};  | 
| ## ÓÎÏ··þÎñÆ÷ïÚ³µÐÅÏ¢(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def  GameServer_TruckMsg(index, tick):  | 
|     sendPack = IPY_GameWorld.IPY_MTruckMsg()  | 
|     return  | 
|   | 
|   | 
| ## æô³µË¢Ð»ØÓ¦(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def GameServer_TruckRefreshAnswer(index, tick):  | 
|     sendPack = IPY_GameWorld.IPY_MTruckRefreshAnswer()  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     if sendPack.GetPlayerID() != curPlayer.GetID():  | 
|         #²»ÊÇ×Ô¼ºµÄæô³µ  | 
|         return   | 
|       | 
|     if curPlayer.GetTruckID() != 0 and sendPack.GetTruckID() == 0:  | 
|         OnPlayerTruckDisappear(curPlayer)  | 
|         return   | 
|       | 
|     curPlayer.SetTruckID(sendPack.GetTruckID())  | 
|       | 
|     #ÉèÖÃïÚ³µ×´Ì¬buff  | 
|     curTruck = curPlayer.GetTruck()  | 
|     if curTruck:  | 
|         AddTruckStateBuff(curTruck, tick)  | 
|           | 
|     #֪ͨ¿Í»§¶ËïÚ³µAIģʽ  | 
|     Sync_TruckMode(curPlayer)  | 
|       | 
|     GameWorld.Log("ÊÕµ½æô³µË¢Ð»ØÓ¦, id = %d, mapid = %d"%(sendPack.GetTruckID(), sendPack.GetMapID()) , curPlayer.GetPlayerID())  | 
|     return  | 
|   | 
| ## Íæ¼ÒïÚ³µÊ§°Ü¶ªÊ§  | 
| def OnPlayerTruckDisappear(curPlayer):  | 
|     #æô³µ¶ªÊ§, ´¥·¢æô³µ¶ªÊ§ÈÎÎñ  | 
|     curPlayer.SetTruckID(0)  | 
|     curPlayer.SetTruckState(IPY_GameWorld.tusDisappear)  | 
|     curPlayer.SetTruck(None)  | 
|       | 
|     DataRecordPack.DR_Truck(curPlayer, "Disappear", {})  | 
|       | 
|     #Truck_hgg_149184:ÄúÒÑÀëÏß³¬¹ý5·ÖÖÓ,ïÚ³µ±»»ØÊÕ.  | 
|     PlayerControl.NotifyCode(curPlayer, "Truck_hgg_149184")  | 
|     EventShell.EventRespons_OnTruckDisappear(curPlayer, curPlayer.GetTruckEventID())  | 
|     return  | 
|   | 
| ## É¾³ýÍæ¼ÒµÄæô³µ  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def DelTruck(curPlayer):  | 
|     curTruck = curPlayer.GetTruck()  | 
|     if curTruck == None:  | 
|         GameWorld.Log("DelTruck -> Ã»ÓÐæô³µ¿Éɾ³ý!" , curPlayer.GetPlayerID())  | 
|         curPlayer.GameServer_DelTruck()  | 
|         return  | 
|       | 
|     if GetHaveAutoTruck(curPlayer):  | 
|         #Èç¹ûÍæ¼ÒµÄ½»Í¨¹¤¾ßΪæô³µµÄ»°, À뿪æô³µ  | 
|         PlayerTruckDown(curPlayer, curTruck)  | 
|           | 
|           | 
|     curPlayer.SetTruckID(0)  | 
|     curPlayer.SetTruckState(IPY_GameWorld.tusNull)  | 
|     curPlayer.SetTruck(None)  | 
|       | 
|     curTruck.GameServer_Sync_TruckState(IPY_GameWorld.tusNull)  | 
|     curTruck.Disappear()  | 
|       | 
|     #ɾ³ýÅÅÐаñÉϵÄïÚ³µÐÅÏ¢  | 
|     PlayerBillboard.UpdateBillboardPlayerTruck(curPlayer.GetID(), "", "", "", "", 0)  | 
|       | 
|     GameWorld.Log("ɾ³ýÍæ¼Òæô³µ" , curPlayer.GetPlayerID())  | 
|     #GameWorld.Log("֪ͨGameServeræô³µÏûʧ!")  | 
|       | 
|     return  | 
|   | 
| #Íæ¼Ò½øÈëæô³µ  | 
| #//////////////////////////////////////////////////////////////  | 
| #//0B 02 Íæ¼Ò½øÈëæô³µ#tagCGetOnTruck  | 
| #tagCGetOnTruck       *   GettagCGetOnTruck();  | 
| #  | 
| #class   IPY_CGetOnTruck  | 
| #{  | 
| #public:  | 
| #    //1:ϳµ 2:Éϳµ  | 
| #    int      GetType();  | 
| #};  | 
|   | 
| #Äܹ»¿ªÊ¼ÈËïÚºÏÒ»µÄ״̬  | 
| Def_CanTruckCarryState = [IPY_GameWorld.paNull]  | 
|   | 
| ## Ö´ÐÐÍæ¼Ò½øÈëïÚ³µÂß¼  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curPlayerType µ±Ç°Íæ¼Ò״̬  | 
| #  @param tick µ±Ç°Ê±¼ä   | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def DoPlayerEnterTruck(curPlayer, curPlayerType, tick):  | 
|     #ïÚ³µ  | 
|     curPlayerTruck = curPlayer.GetTruck()  | 
|     #¸ÃÍæ¼ÒÎÞïÚ³µ  | 
|     if curPlayerTruck == None :  | 
|         GameWorld.Log("DoPlayerEnterTruck -> ÎÞ·¨ÕÒµ½ïÚ³µ" , curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
| #    if GameObj.GetHP(curPlayerTruck) == 0:  | 
| #        GameWorld.Log("ïÚ³µÒÑËÀÍö, ¾Ü¾ø")  | 
| #        return  | 
|       | 
|     #ϳµÂß¼  | 
|     if curPlayerType == 1:  | 
|         if CheckTruckCarryerDown(curPlayer,curPlayerTruck) != True :  | 
|             return  | 
|         #ϳµ  | 
|         PlayerTruckDown(curPlayer,curPlayerTruck)  | 
|     #ÉϳµÂß¼  | 
|     elif curPlayerType == 2:  | 
|         #Åж¨Ìõ¼þ,ÎÞ·¨ÈËïÚºÏÒ»  | 
|         if curPlayer.GetPlayerAction() not in Def_CanTruckCarryState:  | 
|             #GameWorld.Log("ÉÏæô³µ×´Ì¬²»¶Ô")   | 
|             return  | 
|           | 
|         if not CheckTruckCarryerUP(curPlayer,curPlayerTruck):  | 
|             #GameWorld.Log("ÈËïÚºÏÒ»,ÎÞЧ¹û speed = %d"%curPlayerTruck.GetSpeed())  | 
|             return  | 
|           | 
|         GameWorld.Log("×¼±¸ÈËïÚºÏÒ»¿ªÊ¼" , curPlayer.GetPlayerID() )  | 
|         PlayerControl.Sync_PrepareBegin( curPlayer, ChConfig.Def_RidehorseTime, IPY_GameWorld.pstTruck )  | 
|           | 
|     else:  | 
|         GameWorld.Log("ÈËïÚºÏÒ»,·â°üÀàÐÍ = %s´íÎó"%(curPlayerType) , curPlayer.GetPlayerID())  | 
|           | 
|     return  | 
|   | 
| ## ÈËïÚºÏÒ»ÖÐ(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def OnPlayerEnterTruck(index, tick):  | 
| #===============================================================================  | 
| #    sendPack = IPY_GameWorld.IPY_CGetOnTruck()  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #    curPlayerType = sendPack.GetType()  | 
| #    DoPlayerEnterTruck(curPlayer, curPlayerType, tick)  | 
| #===============================================================================  | 
|     return  | 
|   | 
| ## ÉϳµÂß¼¼ì²é   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curPlayerTruck Íæ¼ÒïÚ³µ  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def CheckTruckCarryerUP(curPlayer,curPlayerTruck):  | 
|     #¸ÃÍæ¼ÒÎÞïÚ³µ  | 
|     if curPlayerTruck == None :  | 
|         #GameWorld.Log("ÎÞ·¨ÕÒµ½ïÚ³µ")  | 
|         return False  | 
|       | 
|     if curPlayer.GetPlayerVehicle() != IPY_GameWorld.pvNull :  | 
|         PlayerControl.NotifyCode(curPlayer,"Old_hgg_874335")  | 
|         #GameWorld.Log("curPlayer.GetPlayerVehicle()²»Îª¿Õ ×´Ì¬²»¶Ô")   | 
|         return False  | 
|       | 
|     if not curPlayer.IsAlive():  | 
|         #ËÀÍö״̬²»´¦Àí  | 
|         #GameWorld.Log("ËÀÍö״̬²»´¦Àí")  | 
|         return False  | 
|       | 
|     #Õ½¶·×´Ì¬·µ»Ø  | 
|     if curPlayer.IsBattleState() :  | 
|         PlayerControl.NotifyCode(curPlayer,"Old_hgg_287294")  | 
|         #GameWorld.Log("ÈËïÚºÏһʧ°Ü, ÈËÎïÔÚÕ½¶·×´Ì¬")  | 
|         return False  | 
|       | 
|     #ºìÃû²»ÄÜÉÏïÚ³µ  | 
|     if curPlayer.GetPlayerNameColor() == IPY_GameWorld.pncRed :  | 
|         #Old_hgg_772753 ¶Ô²»Æð£¬ºìÃûÍæ¼ÒÎÞ·¨ÉÏïÚ³µ  | 
|         PlayerControl.NotifyCode(curPlayer,"Old_hgg_772753")  | 
|         return False  | 
|       | 
|     #ÅжϾàÀë  | 
|     #»ñµÃÍæ¼ÒºÍïÚ³µ¼äµÄ¾àÀë  | 
|     dist = GameWorld.GetDist(curPlayerTruck.GetPosX(), curPlayerTruck.GetPosY(),  | 
|                              curPlayer.GetPosX(),curPlayer.GetPosY())  | 
|     #ÈËïÚºÏÒ»µÄ¾àÀë  | 
|     if dist > ChConfig.Def_PlayerTruckCarryerDist:  | 
|         PlayerControl.NotifyCode(curPlayer,"Old_hgg_976459")  | 
|         #GameWorld.Log("ÈËïÚºÏһʧ°Ü,³¬³ö×î´ó¾àÀë")  | 
|         return False  | 
|       | 
|     return True  | 
|   | 
| ## Íæ¼ÒÉÏïÚ³µ  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param resetPos ÉϳµºóÊÇ·ñÖØÖÃ×Ô¼ºµÄλÖà  | 
| #  @param checkState ÊÇ·ñ¼ì²âÍæ¼Òµ±Ç°×´Ì¬  | 
| #  @param checkCanCarryerUp ÊÇ·ñÇ¿ÖÆÉϳµ  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def PlayerTruckUP(curPlayer, resetPos = True, checkState = True, checkCanCarryerUp = True):  | 
|     #²»ÔÚ×¼±¸×´Ì¬  | 
|     if checkState and curPlayer.GetPlayerAction() != IPY_GameWorld.paPreparing:  | 
|         #GameWorld.Log("²»ÔÚ×¼±¸×´Ì¬")  | 
|         return  | 
|       | 
|     curPlayerTruck = curPlayer.GetTruck()  | 
|       | 
|     if not curPlayerTruck:  | 
|         return  | 
|       | 
|     if checkCanCarryerUp and not CheckTruckCarryerUP(curPlayer,curPlayerTruck):  | 
|         #²»ÒªÓÃcurPlayerTruck, ÒòΪcurPlayerTruckÓпÉÄÜΪ¿Õ  | 
|         #GameWorld.Log("ÈËïÚºÏÒ»,ÎÞЧ¹û")  | 
|         return  | 
|           | 
|     #Ìí¼Ó±³¸ºÕß  | 
|     curPlayerTruck.AddCarryPlayer(curPlayer)  | 
|     #ÉèÖÃÍæ¼ÒΪÎÞµÐ״̬  | 
|     curPlayer.SetCanAttack(False)  | 
|     #ÉèÖÃΪ²»¿É¼û״̬  | 
|     curPlayer.SetVisible(False)  | 
|     #ÉèÖñ³¸ºÕß  | 
|     curPlayer.SetCarryerNPC(curPlayerTruck)  | 
|     #ÉèÖÃÍæ¼Ò×ø±êΪïÚ³µ×ø±ê  | 
|     if resetPos:  | 
|         GameWorld.ResetPlayerPos( curPlayer, curPlayerTruck.GetPosX(), curPlayerTruck.GetPosY() )  | 
|           | 
|     #ÉèÖÃÍæ¼Ò½»Í¨¹¤¾ß:ïÚ³µ  | 
|     curPlayer.SetPlayerVehicle(IPY_GameWorld.pvTruck)  | 
|       | 
|     #֪ͨ¿Í»§¶Ë  | 
|     curPlayer.Sync_GetOnTruck(1)  | 
|     curPlayerTruck.StopMove()  | 
|     GameWorld.Log("ÈËïÚºÏÒ»,³É¹¦" , curPlayer.GetPlayerID())  | 
|     return  | 
|   | 
| ## Ï³µÂß¼¼ì²é   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curPlayerTruck µ±Ç°Íæ¼ÒïÚ³µ  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def CheckTruckCarryerDown(curPlayer,curPlayerTruck) :  | 
|     if curPlayer.GetPlayerVehicle() != IPY_GameWorld.pvTruck:  | 
|         return False  | 
|     return True  | 
|   | 
| ## Ï³µ(²ÎÊý -> µ±Ç°Íæ¼Ò,µ±Ç°Íæ¼ÒïÚ³µ)  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curPlayerTruck µ±Ç°Íæ¼ÒïÚ³µ  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def PlayerTruckDown(curPlayer,curPlayerTruck) :  | 
|     return  | 
|   | 
|     #жϱ³¸ºÕß  | 
|     curPlayerTruck.PutDownPlayer(curPlayer)  | 
|     #ÉèÖÃÍæ¼ÒΪ·ÇÎÞµÐ״̬  | 
|     curPlayer.SetCanAttack(True)  | 
|     #ÉèÖÃΪ¿É¼û  | 
|     curPlayer.SetVisible(True)  | 
|     #ÉèÖñ³¸ºÕß  | 
|     curPlayer.SetCarryerNPC(None)  | 
|     #ÉèÖý»Í¨¹¤¾ß  | 
|     curPlayer.SetPlayerVehicle(IPY_GameWorld.pvNull)  | 
|       | 
|     #֪ͨ¿Í»§¶Ë  | 
|     curPlayer.Sync_GetOnTruck(0)  | 
|     curPlayerTruck.StopMove()  | 
|     return   | 
|   | 
| ## ïÚ³µÏú»ÙÂß¼   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def DoPlayerTruckDestroy(curPlayer):  | 
|     GameWorld.Log( "Íæ¼Òæô³µ»Ù»µ!" , curPlayer.GetPlayerID() )  | 
|       | 
|     EventShell.EventRespons_OnTruckDestroy( curPlayer, curPlayer.GetTruckEventID() )  | 
|       | 
| #===============================================================================  | 
| #    2009.05.10 ÒòÆÆËðµÄïÚ³µÇл»µØÍ¼½«µ÷Óõ½ÕâÀï,µ¼ÖÂÍæ¼Ò½øÈëÆÆïÚ³µÇеØÍ¼Ï³µ,ϳµÂß¼Ð޸ĵ½Íæ¼Ò±»¹¥»÷ʱ  | 
| #    if curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvTruck:  | 
| #        #Èç¹ûÍæ¼ÒÔÚÈËïÚºÏһ״̬, ÏÂæô³µ  | 
| #        #GameWorld.Log("Èç¹ûÍæ¼ÒÔÚÈËïÚºÏһ״̬, ÏÂæô³µ")  | 
| #        curPlayerTruck = curPlayer.GetTruck()  | 
| #        #¸ÃÍæ¼ÒÎÞïÚ³µ  | 
| #        if curPlayerTruck == None :  | 
| #            GameWorld.Log("DoPlayerTruckDestroy -> ÎÞ·¨ÕÒµ½ïÚ³µ" , curPlayer.GetPlayerID())  | 
| #            return  | 
| #          | 
| #        PlayerTruckDown(curPlayer,curPlayerTruck)  | 
| #===============================================================================  | 
|   | 
| ## GameServerÍ¨ÖªÍæ¼Òæô³µË¢ÐÂ(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def GameServer_PlayerTruckStateRefresh(index, tick):  | 
|     sendPack = IPY_GameWorld.IPY_MPlayerTruckStateRefresh()  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     if curPlayer == None:  | 
|         #ÎÞ´ËÍæ¼ÒÁË  | 
|         return  | 
|       | 
|     if sendPack.GetPlayerID() != curPlayer.GetID():  | 
|         #²»ÊÇ×Ô¼ºµÄ·â°ü  | 
|         return   | 
|     curState = sendPack.GetState()  | 
|     curPlayer.SetTruckState(curState)  | 
|     if curState == IPY_GameWorld.tusDestroy:   | 
|         DoPlayerTruckDestroy(curPlayer)  | 
|         return  | 
|       | 
|     if curState == IPY_GameWorld.tusNull:  | 
|         #æô³µÏûʧ  | 
|               | 
|         curPlayer.SetTruckID(0)  | 
|         curPlayer.SetTruck(None)  | 
|         return  | 
|       | 
| ############################################´òÀÃÂß¼#######################      | 
| ## Ö´ÐÐïÚ³µË𻵠 | 
| #  @param curTruck µ±Ç°ïÚ³µ  | 
| #  @return None  | 
| #  @remarks æô³µ±»´òÀÃÁË, Í¨ÖªÔ¶ÔÚµØÍ¼ÁíÍâÒ»¶ËµÄÖ÷ÈËÕâ¸ö±¯Í´µÄÐÅÏ¢  | 
| def DoTruckDestroy(curTruck):  | 
|       | 
|     if not curTruck.GetCanAttack():  | 
|         #ÒѾִÐйýïÚ³µ±»´ò»µ½±Àø  | 
|         return  | 
|       | 
|     #æô³µ»Ù»µ  | 
|     curTruck.GameServer_Sync_TruckState(IPY_GameWorld.tusDestroy)  | 
|     curTruck.SetCanAttack(0)  | 
|     curTruck.StopMove()  | 
|       | 
|     #æô³µ±»Íæ¼ÒɱËÀ¸øÍæ¼ÒÇ®  | 
|     DoTruckKilledGiveKillerPlayerMoney(curTruck)  | 
|       | 
|     #ïÚ³µÖ÷ÈËID  | 
|     truckOwnerID = curTruck.GetOwnerID()  | 
|       | 
|     #ÒѾ±»´ò½Ùϰñ  | 
|     PlayerBillboard.UpdateBillboardPlayerTruck(truckOwnerID, "", "", "", "", 0)  | 
|     #-----------------------  | 
|       | 
|     #»ñÈ¡ïÚ³µÖ÷ÈË  | 
|     curTagPlayer = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, curTruck)  | 
|     killTruckPlayer = GetKillTruckPlayer(curTruck)  | 
|     if killTruckPlayer:  | 
|         killTruckPlayerName = killTruckPlayer.GetName()  | 
|     else:  | 
|         killTruckPlayerName = ""  | 
|           | 
|     exp, zhenQi, prestige, moneyCnt, moneyType, truckState, isDoubleAward = __GetTruckAwack(curTagPlayer, curTruck, 1)  | 
|     if not curTagPlayer:  | 
|         #µ±Ç°µØÍ¼ÕÒ²»µ½ïÚ³µµÄÖ÷ÈË, ÇëÇóGameServer֪ͨ  | 
|         sendMsg = str([killTruckPlayerName, exp, zhenQi, prestige, moneyCnt, moneyType])  | 
|         GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(truckOwnerID, 0, 0,   | 
|                                               'NotifyTruckDestroy', sendMsg, len(sendMsg))  | 
|         return  | 
|       | 
|     if killTruckPlayerName:  | 
|         #Truck_hgg_492527 ÄúµÄïÚ³µ±»XXXX´ò½Ù,ËðʧXXX¾Ñé,XXX½ð±Ò,xxxħ»ê  | 
|         PlayerControl.NotifyCode(curTagPlayer, "Truck_hgg_492527", [killTruckPlayerName, exp,   | 
|                                                                     moneyCnt, zhenQi])  | 
|     else:  | 
|         #Truck_hgg_887936 ÄúµÄïÚ³µ²ÒÔâÏ´½Ù,ËðʧXXX¾Ñé,XXX½ð±Ò,xxxħ»ê  | 
|         PlayerControl.NotifyCode(curTagPlayer, "Truck_hgg_887936", [exp, moneyCnt, zhenQi])  | 
|       | 
|     DataRecordPack.DR_Truck(curTagPlayer, "Destroy", {"MoneyCount":moneyCnt, "ZhenQi":zhenQi, "Prestige":prestige})  | 
|     GameWorld.Log("æô³µ±»´òÀÃÁË, Í¨ÖªÔ¶ÔÚµØÍ¼ÁíÍâÒ»¶ËµÄÖ÷ÈËÕâ¸ö±¯Í´µÄÐÅÏ¢ = %s"%(curTruck.GetID()))  | 
|     return  | 
|   | 
|   | 
| ## »ñÈ¡½ÙïÚÍæ¼Ò  | 
| #  @param curTruck: ïÚ³µÊµÀý  | 
| #  @return: ½ÙïÚÍæ¼Ò  | 
| def GetKillTruckPlayer(curTruck):  | 
|     npcHurtList = curTruck.GetPlayerHurtList()  | 
|     maxHurtObj = npcHurtList.GetLastTimeHurtValue()  # ×îºó²¹µ¶Õß  | 
|       | 
|     if  maxHurtObj.GetValueType() == ChConfig.Def_NPCHurtTypeNPC:  | 
|         #×îºó²¹µ¶ÕßÊÇNPC  | 
|         curNPC = GameWorld.GetObj(maxHurtObj.GetValueID(), IPY_GameWorld.gotNPC)  | 
|         return NPCCommon.GetNpcObjOwnerDetail(curNPC)  | 
|       | 
|     if maxHurtObj.GetValueType() == ChConfig.Def_NPCHurtTypePlayer:  | 
|         #×îºó²¹µ¶ÕßÊÇÍæ¼Ò  | 
|         return GameWorld.GetObj(maxHurtObj.GetValueID(), IPY_GameWorld.gotPlayer)  | 
|       | 
|     return None  | 
|   | 
|   | 
| ## æô³µ±»Íæ¼ÒɱËÀ, ¸øÍæ¼ÒÇ®   | 
| #  @param curTruck µ±Ç°ïÚ³µ  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def DoTruckKilledGiveKillerPlayerMoney(curTruck):  | 
|     curPlayer = GetKillTruckPlayer(curTruck)  | 
|     if not curPlayer:  | 
|         #µ±Ç°µØÍ¼ÕÒ²»µ½½ÙïÚµÄÍæ¼Ò  | 
|         return  | 
|       | 
|     #Truck_hgg_279029 XXXXXµÄXXïÚ³µ±»OOOOÇÀ½ÙÁË  | 
|     truckLV = curTruck.GetLV()  | 
|     if truckLV in ReadChConfig.GetEvalChConfig("TruckWorldNotifyLv"):  | 
|         PlayerControl.WorldNotify(0, "Truck_hgg_279029", [curTruck.GetName(), truckLV, curPlayer.GetName()])  | 
|       | 
|     if not CanAttackTruck(curPlayer):  | 
|         #Truck_hgg_481766 XXXµÄïÚ³µÒѾ±»ÄúÆÆ»µ,µ«ÊÇÄú½ñÈÕÊ£Óà½ÙïÚ´ÎÊýΪ0,ËùÒÔÎÞ·¨»ñµÃÊÕÒæ.  | 
|         PlayerControl.NotifyCode(curPlayer, "Truck_hgg_481766", [curTruck.GetName()])   | 
|         return  | 
|       | 
|     #ÉèÖýÙïÚÍæ¼ÒµÈ¼¶  | 
|     SetTruckDestroyLV(curTruck, curPlayer.GetLV())  | 
|       | 
|     #¸øÓèïÚ³µ½±Àø  | 
|     GiveTruckAward(curPlayer, curTruck, 1)  | 
|       | 
|     #ÉèÖýÙïÚ´ÎÊý+1  | 
|     destroyTruckCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DestroyTruckCnt)  | 
|     SetDestroyTruckCnt(curPlayer, destroyTruckCnt + 1)  | 
|       | 
|   | 
| ## ÉèÖýÙïÚ´ÎÊý  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @param count: ½ÙïÚ´ÎÊý  | 
| #  @return: None  | 
| def SetDestroyTruckCnt(curPlayer, count):  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_DestroyTruckCnt, count)  | 
|       | 
|     #֪ͨ¿Í»§¶Ë½ÙïÚ´ÎÊý  | 
|     Sync_DestroyTruckCnt(curPlayer)  | 
|     return  | 
|   | 
|   | 
| ## »ñÈ¡ïÚ³µ½±Àø(½ÙïÚºÍÔËïÚ)  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @param curTruck: ½ÙµÄïÚ³µÊµÀý  | 
| #  @param awardType: ½±ÀøÀàÐÍ: 0:ÔËïÚ½±Àø, 1:½ÙïÚ½±Àø  | 
| #  @return: ½±ÀøµÄ¾Ñé, ÕæÆø, ÍþÍû, ½ðÇ®, ½ðÇ®ÀàÐÍ  | 
| def __GetTruckAwack(curPlayer, curTruck, awardType=0, isTimeOut=False):  | 
|     #¸øÓè½±Àø  | 
|     baseExp = GetTruckBaseExp(curTruck)  # »ù´¡¾Ñé  | 
|     baseZhenQi = GetTruckBaseZhenQi(curTruck)  # »ù´¡ÕæÆø  | 
|     basePrestige = GetTruckBasePrestige(curTruck)  # »ù´¡ÍþÍû  | 
|     baseMoney, moneyType = GetTruckBaseMoney(curTruck)  # »ù´¡½ðÇ®  | 
|     truckLv = curTruck.GetLV()  # ïÚ³µµÈ¼¶  | 
|     truckOwnerLV = GetTruckOwnerLV(curTruck)  # ÑºïÚÍæ¼ÒµÈ¼¶  | 
|     truckDestroyLV = GetTruckDestroyLV(curTruck)  # ½ÙïÚÍæ¼ÒµÈ¼¶  | 
|     reExp = 0  | 
|     reMoney = 0  | 
|     if truckDestroyLV <= 0:  | 
|         truckDestroyLV = truckOwnerLV  | 
|           | 
|     truckState = IsTruckDestroy(curTruck)  # ïÚ³µ×´Ì¬(ÍêºÃ»ò±»½Ù)  | 
|       | 
|     if awardType == 1:  | 
|         truckAwardDict = ReadChConfig.GetEvalChConfig("TruckDestroyAward")  | 
|     else:  | 
|         truckAwardDict = ReadChConfig.GetEvalChConfig("TruckOverAward")  | 
|         awardKey = 1 if (truckState or isTimeOut) else 0 # ±»½ÙºÍ³¬Ê±½±ÀøÒ»Ñù  | 
|         truckAwardDict = truckAwardDict.get(awardKey, {})  | 
|       | 
|     exp = int(eval(truckAwardDict.get("Exp", "0")))  # ¾Ñé  | 
|     zhenQi = int(eval(truckAwardDict.get("ZhenQi", "0")))  # ÕæÆø  | 
|     prestige = int(eval(truckAwardDict.get("Prestige", "0")))  # ÍþÍû  | 
|     moneyCnt = int(eval(truckAwardDict.get("Money", "0")))  # ½ðÇ®  | 
|       | 
|     #Èç¹ûÔÚË«±¶½±ÀøÊ±¼ä¶ÎÄÚ,½±Àø·±¶  | 
|     isDoubleAward = CheckDoubleAward()  | 
|     if isDoubleAward:  | 
|         exp, zhenQi, prestige, moneyCnt = exp*2, zhenQi*2, prestige*2, moneyCnt*2  | 
|           | 
|     if curPlayer and awardType == 0:  | 
|         # ¹ó×å¼Ó³É  | 
|         pass  | 
|       | 
|     return exp, zhenQi, prestige, moneyCnt, moneyType, truckState, isDoubleAward  | 
|   | 
|   | 
| ## ¸øÓèïÚ³µ½±Àø  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @param curTruck: ½ÙµÄïÚ³µÊµÀý  | 
| #  @param awardType: ½±ÀøÀàÐÍ: 0:ÔËïÚ½±Àø, 1:½ÙïÚ½±Àø  | 
| #  @return: None  | 
| def GiveTruckAward(curPlayer, curTruck, awardType=0, isTimeOut=False):  | 
|     exp, zhenQi, prestige, moneyCnt, moneyType, truckState, isDoubleAward = __GetTruckAwack(curPlayer, curTruck, awardType, isTimeOut)  | 
|     if awardType == 1:  | 
|         #Truck_hgg_827276 Äú´ò½ÙÁËXXXµÄïÚ³µ,Ò»¹²»ñµÃXXX¾Ñé,XXX½ð±Ò,xxxħ»ê  | 
|         PlayerControl.NotifyCode(curPlayer, "Truck_hgg_827276", [curTruck.GetName(), exp, moneyCnt, zhenQi])  | 
|           | 
|         DataRecordPack.DR_Truck(curPlayer, "Kill", {"MoneyCount":moneyCnt, "ZhenQi":zhenQi, "Prestige":prestige})  | 
|           | 
|         #ÇëÇó¼Ç¼½ÙïÚÐÅÏ¢¹©¿Í»§¶ËÏÔʾ  | 
|         GameWorld.AddUniversalGameRec(curPlayer.GetPlayerID(), ShareDefine.Def_UniversalGameRecType_HijackTruck,   | 
|                                       [curTruck.GetLV(), exp, moneyCnt, zhenQi], [curPlayer.GetName(), curTruck.GetName(), ""])  | 
|     else:  | 
|         #Truck_hgg_20296 ÄúÔÚ±¾´Î»¤ËÍïÚ³µµÄÈÎÎñÖÐÒ»¹²»ñµÃXXX¾Ñé,XXX½ð±Ò,xxxħ»ê  | 
|         #PlayerControl.NotifyCode(curPlayer, "Truck_hgg_20296", [exp, moneyCnt, zhenQi])  | 
|         DataRecordPack.DR_Truck(curPlayer, "End", {"MoneyCount":moneyCnt, "ZhenQi":zhenQi, "Prestige":prestige})  | 
|       | 
|     #¾Ñé  | 
|     if exp > 0:  | 
|         playerControl = PlayerControl.PlayerControl(curPlayer)  | 
|         playerControl.AddExp(exp)  | 
|       | 
|     #ÕæÆø  | 
|     if zhenQi > 0:  | 
|         PlayerControl.PlayerAddZhenQi(curPlayer, zhenQi, True, True, "Truck")  | 
|       | 
| #    #ÍþÍû  | 
| #    if prestige > 0:  | 
| #        PlayerPrestigeSys.AddPrestigeOffcialLV(curPlayer, prestige, ChConfig.Def_AddPrestige_Truck)  | 
|           | 
|     #½ðÇ®  | 
|     if moneyCnt > 0:  | 
|         addDataDict = {ChConfig.Def_Give_Reason_SonKey:awardType}  | 
|         PlayerControl.GiveMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_GiveMoney_Truck, addDataDict)  | 
|           | 
|     #Á÷Ïò¼Ç¼  | 
|       | 
|     # ³É¾Í  | 
| #    if awardType == 0:  | 
| #        #ѺïÚ´ÎÊýÀÛ¼ÆÈÎÎñ  | 
| #        EventShell.EventRespons_TruckCnt(curPlayer)  | 
| #          | 
| #        succType = ShareDefine.SuccType_Truck  | 
| #    else:  | 
| #        succType = ShareDefine.SuccType_TruckRob  | 
| #    PlayerSuccess.DoAddSuccessProgress(curPlayer, succType, 1)  | 
|       | 
|     truckAward = ChPyNetSendPack.tagMCTruckAward()  | 
|     truckAward.Clear()  | 
|     truckAward.AwardType = awardType  | 
|     truckAward.Exp = exp % ChConfig.Def_PerPointValue  | 
|     truckAward.ExpPoint = exp / ChConfig.Def_PerPointValue  | 
|     truckAward.ZhenQi = zhenQi  | 
|     truckAward.Prestige = prestige  | 
|     truckAward.MoneyType = moneyType  | 
|     truckAward.MoneyCnt = moneyCnt  | 
|     truckAward.IsDestroy = truckState  | 
|     truckAward.IsDouble = isDoubleAward  | 
|     truckAward.IsTimeOut = isTimeOut  | 
|     NetPackCommon.SendFakePack(curPlayer, truckAward)  | 
|     GameWorld.DebugLog("GiveTruckAward exp=%s, zhenQi=%s, prestige=%s, moneyCnt=%s, moneyType=%s, truckState=%s, isDoubleAward=%s, isTimeOut=%s"   | 
|                        % (exp, zhenQi, prestige, moneyCnt, moneyType, truckState, isDoubleAward, isTimeOut))  | 
|     return  | 
|   | 
| ###########################################################################   | 
|   | 
| ## æô³µÊܵ½¹¥»÷µÄÏìÓ¦   | 
| #  @param curTruck µ±Ç°ïÚ³µ  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def DoTruckUndeaAttackNotify(curTruck, tick):  | 
|     if tick - curTruck.GetLastUnderAttackNotifyTick() < ChConfig.Def_TruckNotifyToOwnerTick:  | 
|         #֪ͨʱ¼äδµ½  | 
|         return  | 
|       | 
|     curTruck.SetLastUnderAttackNotifyTick(tick)  | 
|     curPlayer = curTruck.GetOwner()  | 
|     if curPlayer == None:  | 
|         #ÐèÒª·¢Ë͸øGameServer֪ͨ  | 
|         curPlayer.GameServer_TruckMsg(IPY_GameWorld.ttmUnderAttack)  | 
|         return  | 
|       | 
|     curPlayer.Sync_TruckMsg(IPY_GameWorld.ttmUnderAttack)  | 
|     return  | 
|   | 
| ## ¿Í»§¶Ë·¢À´Íæ¼ÒÉèÖÃæô³µÄ£Ê½(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def OnPlayerSetTruckMode(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     curTruck = curPlayer.GetTruck()  | 
|     if not curTruck:  | 
|         GameWorld.Log("OnPlayerSetTruckMode -> Ã»ÓÐæô³µ¿ÉÉèÖÃ!" , curPlayer.GetPlayerID())  | 
|         return  | 
|        | 
|     if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_SetTruckMode) <= ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_SetTruckMode]:  | 
|         #Old_hgg_141056 ¶Ô²»Æð,ÄãÉèÖÃïÚ³µÄ£Ê½¼ä¸ôÌ«¶Ì,ÇëÉÔºóÔÙÊÔ!  | 
|         PlayerControl.NotifyCode(curPlayer, "Old_hgg_141056")  | 
|         return  | 
|       | 
|     curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_SetTruckMode, tick)  | 
|       | 
|     pack = IPY_GameWorld.IPY_CSetTruckMode()  | 
|     mode = pack.GetMode()  | 
|       | 
|     if mode not in [IPY_GameWorld.trmStop , IPY_GameWorld.trmDefault]:  | 
|         return  | 
|       | 
|     if curTruck.GetMode() == mode:  | 
|         return  | 
|       | 
|     curTruck.SetMode(mode)  | 
|       | 
|     #֪ͨ¿Í»§¶ËïÚ³µAIģʽ  | 
|     Sync_TruckMode(curPlayer)  | 
|       | 
|     #ÉèÖÃAIģʽbuff  | 
|     AddTruckStateBuff(curTruck, tick)  | 
|     return  | 
|   | 
| ## Í¨ÖªÍæ¼ÒïÚ³µ×ø±ê   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param tick µ±Ç°Ê±¼ä   | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def NotifyPosInfoToPlayer(curPlayer, tick):  | 
|     curTruck = curPlayer.GetTruck()  | 
|     if curTruck == None:  | 
|         return  | 
|       | 
|     if curPlayer.CanSeeOther(curTruck) == True:  | 
|         #Äܹ»¿´µ½æô³µ, ²»Í¨Öª  | 
|         return  | 
|       | 
|     curPlayer.Sync_TruckPosInfo()   | 
|       | 
|       | 
| #------------------------------------------------------------------------------------------------------------   | 
| ## »ñµÃïÚ³µµÄ»ù´¡½±Àø  | 
| #  @param curTruck: ïÚ³µÊµÀý  | 
| #  @return: µ±Ç°ïÚ³µµÈ¼¶»ù´¡½±Àø×Öµä  | 
| def __GetTruckBaseAward(curTruck):  | 
|     if not curTruck:  | 
|         return {}  | 
|       | 
|     curTruckLv = curTruck.GetLV()  | 
|     baseAwardDict = ReadChConfig.GetEvalChConfig("TruckBaseAward")  | 
|     return baseAwardDict.get(curTruckLv, {})  | 
|   | 
|   | 
| ## »ñµÃïÚ³µµÄ»ù´¡¾Ñé½±Àø  | 
| #  @param curTruck: ïÚ³µÊµÀý  | 
| #  @return: »ù´¡¾Ñé½±Àø  | 
| def GetTruckBaseExp(curTruck):  | 
|     return __GetTruckBaseAward(curTruck).get("baseExp", 0)  | 
|   | 
|   | 
| ## »ñµÃïÚ³µµÄ»ù´¡ÕæÆø½±Àø  | 
| #  @param curTruck: ïÚ³µÊµÀý  | 
| #  @return: »ù´¡ÕæÆø½±Àø  | 
| def GetTruckBaseZhenQi(curTruck):  | 
|     return __GetTruckBaseAward(curTruck).get("baseZhenQi", 0)  | 
|   | 
|   | 
| ## »ñµÃïÚ³µµÄ»ù´¡ÍþÍû½±Àø  | 
| #  @param curTruck: ïÚ³µÊµÀý  | 
| #  @return: »ù´¡ÍþÍû½±Àø  | 
| def GetTruckBasePrestige(curTruck):  | 
|     return __GetTruckBaseAward(curTruck).get("basePrestige", 0)  | 
|   | 
|   | 
| ## »ñµÃïÚ³µµÄ»ù´¡½ðÇ®½±Àø  | 
| #  @param curTruck: ïÚ³µÊµÀý  | 
| #  @return: »ù´¡½ðÇ®½±Àø[½ðÇ®ÊýÁ¿, ½ðÇ®ÀàÐÍ]  | 
| def GetTruckBaseMoney(curTruck):  | 
|     return __GetTruckBaseAward(curTruck).get("baseMoney", [0, IPY_GameWorld.TYPE_Price_Silver_Money])  | 
|   | 
|   | 
| ## ¿É·ñ½ÙïÚ  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @return ¿É·ñ½ÙïÚ  | 
| def CanAttackTruck(curPlayer):  | 
|     destroyTruckCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DestroyTruckCnt)  | 
|     destroyTruckMaxCnt = ReadChConfig.GetEvalChConfig("TruckDestroyCnt")  | 
|       | 
|     return destroyTruckCnt < destroyTruckMaxCnt  | 
|   | 
| ## »ñÈ¡×î´ó½ÙïÚ´ÎÊý  | 
| #  @param None  | 
| #  @return  | 
| def GetDestroyTruckMaxCnt():  | 
|     return ReadChConfig.GetEvalChConfig("TruckDestroyCnt")  | 
|   | 
| ## ÊÇ·ñËð»µïÚ³µ  | 
| #  @param curTruck: ïÚ³µÊµÀý  | 
| #  @return: ÊÇ·ñËð»µïÚ³µ  | 
| def IsTruckDestroy(curTruck):  | 
|       | 
|     curTagPlayer = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, curTruck)  | 
|     if curTagPlayer :  | 
|         if curTagPlayer.GetTruckState() == IPY_GameWorld.tusDestroy:  | 
|             return True  | 
|       | 
|     minHP = GetTruckDestroyMinHP(curTruck)  | 
|     if GameObj.GetHP(curTruck) <= minHP:  | 
|         return True  | 
|       | 
|     return False  | 
|   | 
|   | 
| ## Ëð»µïÚ³µ×îСѪÁ¿  | 
| #  @param curTruck: µ±Ç°ïÚ³µ  | 
| #  @return: Ëð»µïÚ³µ×îСѪÁ¿  | 
| def GetTruckDestroyMinHP(curTruck):  | 
|     destroyMinHPRate = ReadChConfig.GetEvalChConfig("TruckDestroyMinHPRate")  | 
|     minHP = max(0, int(GameObj.GetMaxHP(curTruck) * destroyMinHPRate/float(ChConfig.Def_MaxRateValue)))  | 
|     return minHP  | 
|   | 
|   | 
| ## ÊÇ·ñ×Ô¶¯ÔËïÚ  | 
| #  @param# curPlayer:Íæ¼ÒʵÀý  | 
| #  @return: ÊÇ·ñ×Ô¶¯ÔËïÚ  | 
| def GetHaveAutoTruck(curPlayer):  | 
|     return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_AutoTruck) == ShareDefine.Def_Enter_Truck  | 
|   | 
|   | 
| ## ÉèÖÃ×Ô¶¯ÔËïÚ״̬  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @return: None  | 
| def SetAutoTruckState(curPlayer, state):  | 
|     curState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_AutoTruck)  | 
|     if curState == state:  | 
|         return  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_AutoTruck, state)  | 
|       | 
|     tick = GameWorld.GetGameWorld().GetTick()  | 
|     if state == ShareDefine.Def_Enter_Truck:  | 
|         SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer, ShareDefine.Def_SkillID_AutoTruck, tick)  | 
|     else:  | 
|         BuffSkill.DelBuffBySkillID(curPlayer, ShareDefine.Def_SkillID_AutoTruck, tick)  | 
|       | 
|     #ˢнÇÉ«ÊôÐÔ  | 
|     playerControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playerControl.RefreshPlayerAttrByBuff()  | 
|     return  | 
|   | 
| #------------------------------------------------------------------------------------------------------------  | 
| #=============================================================================================================  | 
| #// AE 01 Ë¢ÐÂïÚ³µµÈ¼¶#tagPyRefurbishTruckLV  | 
| #  | 
| #struct     tagPyRefurbishTruckLV  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        CostType;    //ÏûºÄÀàÐÍ: 0-Ãâ·ÑË¢ÐÂ; 1-µÀ¾ß; 2-»õ±Ò  | 
| #    BYTE        MoneyType;    //»¨·Ñ½ðÇ®ÀàÐÍ  | 
| #    DWORD        ItemID;        //ʹÓõĵÀ¾ßID  | 
| #    BYTE        IsAutoBuy;    //µÀ¾ßË¢ÐÂʱÊÇ·ñ×Ô¶¯¹ºÂò; 0-·ñ£»1-ÊÇ  | 
| #};  | 
| ## Íæ¼ÒË¢ÐÂïÚ³µµÈ¼¶  | 
| #  @param index:Íæ¼ÒË÷Òý  | 
| #  @param clientData:·â°ü½á¹¹Ìå  | 
| #  @param tick:ʱ¼ä´Á  | 
| #  @return: None  | 
| def PlayerRefurbishTruckLV(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     if PlayerInMapHaveTruck(curPlayer):  | 
|         #Íæ¼ÒÔÚµØÍ¼ÖÐÓÐæô³µ  | 
|         GameWorld.ErrLog("PlayerBuyTruckLV player have truck ")  | 
|         return  | 
|       | 
|     curTruckLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TruckLV)  # µ±Ç°ïÚ³µµÈ¼¶  | 
|       | 
|     refurbishTruckLVDict = ReadChConfig.GetEvalChConfig("RefurbishTruckLV")  | 
|     if not refurbishTruckLVDict:  | 
|         return  | 
|       | 
|     if curTruckLV >= max(refurbishTruckLVDict):  | 
|         GameWorld.DebugLog("ïÚ³µÒÑÂú¼¶!")  | 
|         return  | 
|       | 
|     upTruckLvInfoList = refurbishTruckLVDict.get(curTruckLV, [])  | 
|     if not upTruckLvInfoList or len(upTruckLvInfoList) != Def_RefreshTruckLVWay_Max:  | 
|         #ÕÒ²»µ½Ë¢Ðµ±Ç°ïÚ³µµÈ¼¶µÄÏûºÄ»òÒѾÊÇ×î¸ßµÈ¼¶  | 
|         GameWorld.ErrLog("PlayerRefurbishTruckLV, curTruckLV=%s not in RefurbishTruckLV.txt! or config Len err!" % (curTruckLV))  | 
|         return  | 
|       | 
|     costType = clientData.CostType  | 
|     moneyType = clientData.MoneyType  | 
|     costItemID = clientData.ItemID  | 
|     isAutoBuy = clientData.IsAutoBuy  | 
|     GameWorld.DebugLog("Ë¢ÐÂïÚ³µµÈ¼¶: costType=%s,moneyType=%s,costItemID=%s,isAutoBuy=%s,curTruckLV=%s"   | 
|                        % (costType, moneyType, costItemID, isAutoBuy, curTruckLV), curPlayer.GetPlayerID())  | 
|     autoBuyGostGold = 0  | 
|     drDict = {"LV":curTruckLV}  | 
|       | 
|     # ÏûºÄÑéÖ¤¼ì²é  | 
|     if costType == Def_RefreshTruckLVWay_Free:  | 
|         upLvRate, upLv, downLv = upTruckLvInfoList[costType]  | 
|         freeCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FreeRefurbishTruckCnt)  | 
|         maxFreeCnt = ReadChConfig.GetEvalChConfig("RefurbishTruckLVFreeCnt")  | 
|         if freeCnt >= maxFreeCnt:  | 
|             GameWorld.DebugLog("    Ã»ÓÐÃâ·Ñ´ÎÊý! freeCnt=%s >= maxFreeCnt=%s" % (freeCnt, maxFreeCnt))  | 
|             return  | 
|           | 
|     elif costType == Def_RefreshTruckLVWay_Item:  | 
|         costItemInfoDict = upTruckLvInfoList[costType]  | 
|         if costItemID not in costItemInfoDict:  | 
|             GameWorld.DebugLog("    curTruckLV=%s,costItemID=%s not configuration!!!" % (curTruckLV, costItemID))  | 
|             return  | 
|         upLvRate, costItemCnt, upLv, downLv = costItemInfoDict[costItemID]  | 
|           | 
|         itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|         lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList([(costItemID, costItemCnt)], itemPack)  | 
|         if lackItemDict:  | 
|             if not isAutoBuy:  | 
|                 GameWorld.DebugLog("    costItem not enough! curTruckLV=%s,costItemID=%s,costItemCnt=%s,isAutoBuy=%s"   | 
|                                    % (curTruckLV, costItemID, costItemCnt, isAutoBuy))  | 
|                 return  | 
|             autoBuyGostGold = ItemCommon.GetAutoBuyItemNeedGold(lackItemDict)  | 
|             if autoBuyGostGold <= 0:  | 
|                 return  | 
|             if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, autoBuyGostGold):  | 
|                 return  | 
|             drDict["lackItemDict"] = lackItemDict   | 
|               | 
|     elif costType == Def_RefreshTruckLVWay_Money:  | 
|         costMoneyInfoDict = upTruckLvInfoList[costType]  | 
|         if moneyType not in costMoneyInfoDict:  | 
|             GameWorld.DebugLog("    curTruckLV=%s,moneyType=%s not configuration!!!" % (curTruckLV, moneyType))  | 
|             return  | 
|         upLvRate, moneyCnt, upLv, downLv = costMoneyInfoDict[moneyType]  | 
|           | 
|         if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyCnt):  | 
|             return  | 
|     else:  | 
|         return  | 
|       | 
|     refreshTotalCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TruckRefreshTotalCnt)  # Íæ¼Ò×ÜË¢ÐÂïÚ³µµÈ¼¶´ÎÊý  | 
|     if refreshTotalCnt <= 0:  | 
|         firstTimeRefreshList = ReadChConfig.GetEvalChConfig("RefurbishTruckLVFirstTime")  | 
|         truckLv = GameWorld.GetResultByRandomList(firstTimeRefreshList, 0)  | 
|         GameWorld.DebugLog("    Ê×´ÎË¢ÐÂïÚ³µµÈ¼¶: truckLv=%s" % truckLv)  | 
|     else:  | 
|         if GameWorld.CanHappen(upLvRate, ChConfig.Def_MaxRateValue):  | 
|             truckLv = upLv  | 
|         else:  | 
|             truckLv = downLv  | 
|       | 
|     if truckLv < 0 or truckLv >= len(refurbishTruckLVDict):  | 
|         #ˢкóïÚ³µµÈ¼¶´íÎó  | 
|         GameWorld.ErrLog("    PlayerRefurbishTruckLV After truckLv = %s error! refreshTotalCnt=%s" % (truckLv, refreshTotalCnt))  | 
|         return  | 
|   | 
|     # ÏûºÄ¿Û³ý´¦Àí  | 
|     if costType == Def_RefreshTruckLVWay_Free:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FreeRefurbishTruckCnt, freeCnt + 1)  | 
|       | 
|     elif costType == Def_RefreshTruckLVWay_Item:  | 
|         ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "RefurbishTruckLV")  | 
|         if autoBuyGostGold > 0:  | 
|             drDict[ChConfig.Def_Cost_Reason_SonKey] = costItemID  | 
|             PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, autoBuyGostGold,   | 
|                                      ChConfig.Def_Cost_BuyStoreItem, drDict, lackItemDict.get(costItemID, 0))  | 
|                   | 
|     elif costType == Def_RefreshTruckLVWay_Money:  | 
|         drDict[ChConfig.Def_Cost_Reason_SonKey] = "Refresh"  | 
|         PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_RefreshTruck, drDict)  | 
|       | 
|     #ÉèÖÃïÚ³µµÈ¼¶  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_TruckLV, truckLv)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_TruckRefreshTotalCnt, refreshTotalCnt + 1)  | 
|               | 
|     if truckLv > curTruckLV:  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_781545")  | 
|     elif truckLv == curTruckLV:  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_16722")  | 
|       | 
|     #Ë¢ÐÂïÚ³µ¶îÍâ½±Àø  | 
|     TruckCreatAwardDict = ReadChConfig.GetEvalChConfig("TruckCreatAward")  | 
|     if truckLv in TruckCreatAwardDict:  | 
|         for itemID, itemCount, isBind in TruckCreatAwardDict[truckLv]:  | 
|             ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere])  | 
|             PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_366028", [itemID, itemCount])  | 
|             PlayerControl.WorldNotify(0, "GeRen_liubo_161795", [curPlayer.GetPlayerName(), itemID, itemCount])  | 
|           | 
|     #֪ͨ¿Í»§¶Ë¿ÉÕÙ»½ïÚ³µµÈ¼¶  | 
|     Sync_TruckLv(curPlayer)  | 
|     GameWorld.DebugLog("    Ë¢Ð½á¹û: upLvRate=%s,updTruckLv=%s,autoBuyGostGold=%s,refreshTotalCnt=%s,drDict=%s"   | 
|                        % (upLvRate, truckLv, autoBuyGostGold, refreshTotalCnt, drDict), curPlayer.GetPlayerID())  | 
|     return  | 
|   | 
|   | 
| #=============================================================================================================  | 
| # //A4 02 ¹ºÂòïÚ³µµÈ¼¶#tagPyBuyTruckLV  | 
| # //AE 02 ¹ºÂòïÚ³µµÈ¼¶#tagPyBuyTruckLV  | 
| #   | 
| # struct tagPyBuyTruckLV  | 
| # {  | 
| #    tagHead        Head;  | 
| #    BYTE        TruckLV;        //ïÚ³µµÈ¼¶  | 
| # };  | 
| #=============================================================================================================  | 
| ## Íæ¼Ò¹ºÂòïÚ³µµÈ¼¶  | 
| #  @param index:Íæ¼ÒË÷Òý  | 
| #  @param clientData:·â°ü½á¹¹Ìå  | 
| #  @param tick:ʱ¼ä´Á  | 
| #  @return: None  | 
| def PlayerBuyTruckLV(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     if PlayerInMapHaveTruck(curPlayer):  | 
|         #Íæ¼ÒÔÚµØÍ¼ÖÐÓÐæô³µ  | 
|         GameWorld.ErrLog("PlayerBuyTruckLV player have truck ")  | 
|         return  | 
|       | 
|     buyTruckLv = clientData.TruckLV  | 
|       | 
|     buyTruckLVDict = ReadChConfig.GetEvalChConfig("BuyTruckLV")  | 
|     moneyList = buyTruckLVDict.get(buyTruckLv, [])  | 
|     if moneyList == []:  | 
|         #ÕÒ²»µ½¹ºÂòµ±Ç°ïÚ³µµÈ¼¶µÄÏûºÄ  | 
|         GameWorld.ErrLog("PlayerBuyTruckLV, buyTruckLV=%s not %s has_key"  | 
|                          (buyTruckLv, buyTruckLVDict))  | 
|         return  | 
|       | 
|     #canBuyLv = PlayerVip.GetVIPCanBuyTruckLv(curPlayer)  # µ±Ç°vip¿É¹ºÂòµÄïÚ³µµÈ¼¶  | 
|     #if buyTruckLv > canBuyLv:  | 
|     #    #µ±Ç°vipµÈ¼¶²»ÄܹºÂò  | 
|     #    GameWorld.ErrLog("PlayerBuyTruckLV, buyTruckLV=%s, canBuyLv=%s "%(buyTruckLv, canBuyLv))  | 
|     #    return  | 
|       | 
|     moneyType= moneyList[1]  | 
|     moneyCnt = moneyList[0]  | 
|     infoDict = {"LV":buyTruckLv, ChConfig.Def_Cost_Reason_SonKey:buyTruckLv}  | 
|     if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_RefreshTruck, infoDict):  | 
|         return  | 
|       | 
|     #ÉèÖÃïÚ³µµÈ¼¶  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_TruckLV, buyTruckLv)  | 
|       | 
|     #֪ͨ¿Í»§¶Ë¿ÉÕÙ»½ïÚ³µµÈ¼¶  | 
|     Sync_TruckLv(curPlayer)  | 
|     return  | 
|   | 
|   | 
| #=============================================================================================================  | 
| # //A4 03 ²éѯïÚ³µµÈ¼¶#tagPyQueryTruckLV  | 
| # //AE 03 ²éѯïÚ³µµÈ¼¶#tagPyQueryTruckLV  | 
| #   | 
| # struct tagPyQueryTruckLV  | 
| # {  | 
| #    tagHead        Head;  | 
| # };  | 
| #=============================================================================================================  | 
| ## ²éѯïÚ³µµÈ¼¶  | 
| #  @param index:Íæ¼ÒË÷Òý  | 
| #  @param clientData:·â°ü½á¹¹Ìå  | 
| #  @param tick:ʱ¼ä´Á  | 
| #  @return: None  | 
| def QueryTruckLV(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     #֪ͨ¿Í»§¶Ë¿ÉÕÙ»½ïÚ³µµÈ¼¶  | 
|     Sync_TruckLv(curPlayer)  | 
|     return  | 
|   | 
|   | 
| ## Í¨Öª¿Í»§¶Ë¿ÉÕÙ»½ïÚ³µµÈ¼¶  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @return: None  | 
| def Sync_TruckLv(curPlayer):  | 
|     canSummonTruckLV = ChPyNetSendPack.tagPyCanSummonTruckLV()  | 
|     canSummonTruckLV.Clear()  | 
|     canSummonTruckLV.TruckLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TruckLV)  | 
|     canSummonTruckLV.FreeCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FreeRefurbishTruckCnt)  | 
|     NetPackCommon.SendFakePack(curPlayer, canSummonTruckLV)  | 
|     return  | 
|   | 
| #=============================================================================================================  | 
| # //A4 04 ²éѯ½ÙïÚ´ÎÊý#tagPyQueryDestroyTruckCnt  | 
| # //AE 04 ²éѯ½ÙïÚ´ÎÊý#tagPyQueryDestroyTruckCnt  | 
| #   | 
| # struct     tagPyQueryDestroyTruckCnt  | 
| # {  | 
| #    tagHead        Head;  | 
| # };  | 
| #=============================================================================================================  | 
| ## ²éѯ½ÙïÚ´ÎÊý  | 
| #  @param index:Íæ¼ÒË÷Òý  | 
| #  @param clientData:·â°ü½á¹¹Ìå  | 
| #  @param tick:ʱ¼ä´Á  | 
| #  @return: None  | 
| def QueryDestroyTruckCnt(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     #֪ͨ¿Í»§¶Ë½ÙïÚ´ÎÊý  | 
|     Sync_DestroyTruckCnt(curPlayer)  | 
|     return  | 
|   | 
|   | 
| ## Í¨Öª¿Í»§¶Ë½ÙïÚ´ÎÊý  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @return: None  | 
| def Sync_DestroyTruckCnt(curPlayer):  | 
|     canSummonTruckLV = ChPyNetSendPack.tagPyDestroyTruckCnt()  | 
|     canSummonTruckLV.Clear()  | 
|     canSummonTruckLV.Count = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DestroyTruckCnt)  | 
|     NetPackCommon.SendFakePack(curPlayer, canSummonTruckLV)  | 
|     return  | 
|   | 
|   | 
| ## Í¨Öª¿Í»§¶ËïÚ³µAIģʽ  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @return: None  | 
| def Sync_TruckMode(curPlayer):  | 
|     curTruck = curPlayer.GetTruck()  | 
|     if not curTruck:  | 
|         mode = IPY_GameWorld.trmStop  | 
|     else:  | 
|         mode = curTruck.GetMode()  | 
|           | 
|     truckMode = ChPyNetSendPack.tagPyTruckMode()  | 
|     truckMode.Clear()  | 
|     truckMode.TruckMode = mode  | 
|     NetPackCommon.SendFakePack(curPlayer, truckMode)  | 
|     return  | 
|   | 
|   | 
| #=============================================================================================================  | 
| # //A4 05 ×Ô¶¯ÔËïÚ #tagPyAutoTruck  | 
| # //AE 05 ×Ô¶¯ÔËïÚ #tagPyAutoTruck  | 
| #   | 
| # struct     tagPyAutoTruck  | 
| # {  | 
| #    tagHead        Head;  | 
| #    BYTE        Type;  | 
| # };  | 
| #=============================================================================================================  | 
| ## ×Ô¶¯ÔËïÚ  | 
| #  @param index:Íæ¼ÒË÷Òý  | 
| #  @param clientData:·â°ü½á¹¹Ìå  | 
| #  @param tick:ʱ¼ä´Á  | 
| #  @return: None  | 
| def AutoTruck(index, clientData, tick):  | 
|       | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     state = clientData.Type  | 
|       | 
|     if not CanAutoTruck(curPlayer):  | 
|         SetAutoTruckState(curPlayer, state)  | 
|         Sync_AutoTruckState(curPlayer, state, False)  | 
|         return  | 
|       | 
|     if state not in [ShareDefine.Def_Out_Truck, ShareDefine.Def_Enter_Truck]:  | 
|         SetAutoTruckState(curPlayer, state)  | 
|         Sync_AutoTruckState(curPlayer, state, False)  | 
|         return  | 
|       | 
|     #ÉèÖÃ×Ô¶¯ÔËïÚ  | 
|     SetAutoTruckState(curPlayer, state)  | 
|       | 
|     #֪ͨ×Ô¶¯ÔËïڳɹ¦   | 
|     Sync_AutoTruckState(curPlayer, state, True)  | 
|     return  | 
|   | 
|   | 
| ## ¿É·ñ×Ô¶¯ÔËïÚ  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @return ¿É·ñ×Ô¶¯ÔËïÚ  | 
| def CanAutoTruck(curPlayer):  | 
|       | 
|     curTruck = curPlayer.GetTruck()  | 
|     if not curTruck:  | 
|         #ûÓÐïÚ³µ  | 
|         return False  | 
|       | 
|     if not curPlayer.IsAlive():  | 
|         #ËÀÍö״̬²»´¦Àí  | 
|         return False  | 
|           | 
|     #»ñµÃÍæ¼ÒºÍïÚ³µ¼äµÄ¾àÀë  | 
|     dist = GameWorld.GetDist(curTruck.GetPosX(), curTruck.GetPosY(),  | 
|                              curPlayer.GetPosX(),curPlayer.GetPosY())  | 
|     #×Ô¶¯ÔËïڵľàÀë  | 
|     if dist > ChConfig.Def_PlayerTruckMoveDist:  | 
|         return False      | 
|       | 
|     return True  | 
|   | 
|   | 
| ## Í¨Öª×Ô¶¯ÔËïÚ״̬  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @param state: ×´Ì¬  | 
| #  @param result: ½á¹û(³É¹¦/ʧ°Ü)  | 
| #  @return: None  | 
| def Sync_AutoTruckState(curPlayer, state, result):  | 
|       | 
|     autoTruckState = ChPyNetSendPack.tagPyAutoTruckState()  | 
|     autoTruckState.Clear()  | 
|     autoTruckState.State = state  | 
|     autoTruckState.Result = result  | 
|     NetPackCommon.SendFakePack(curPlayer, autoTruckState)  | 
|     return  | 
|   | 
|   | 
| ## ÉèÖÃïÚ³µ×´Ì¬buff  | 
| #  @param curTruck: ïÚ³µÊµÀý  | 
| #  @param tick: Ê±¼ä´Á  | 
| #  @return: None  | 
| def AddTruckStateBuff(curTruck, tick):  | 
| #    mode = curTruck.GetMode()  | 
| #    if mode == IPY_GameWorld.trmStop:  | 
| #        #ɾ³ý״̬buff  | 
| #        BuffSkill.DelBuffBySkillID(curTruck, ChConfig.Def_SkillID_TruckAiMode, tick)  | 
| #    else:  | 
| #        #Ìí¼Ó״̬buff  | 
| #        SkillCommon.AddBuffBySkillType_NoRefurbish(curTruck , ChConfig.Def_SkillID_TruckAiMode , tick)  | 
|       | 
|     npcControl = NPCCommon.NPCControl(curTruck)  | 
|     npcControl.RefreshNPCAttrState()  | 
|     return  | 
|   | 
|   | 
| #=============================================================================================================  | 
| #//A4 06 Á¢¼´Íê³ÉÔËïÚ #tagPyOverTruck  | 
| #//AE 06 Á¢¼´Íê³ÉÔËïÚ #tagPyOverTruck  | 
| #  | 
| #struct     tagPyOverTruck  | 
| #{  | 
| #    tagHead        Head;  | 
| #};  | 
| #=============================================================================================================  | 
| ## Á¢¼´Íê³ÉÔËïÚ  | 
| #  @param index:Íæ¼ÒË÷Òý  | 
| #  @param clientData:·â°ü½á¹¹Ìå  | 
| #  @param tick:ʱ¼ä´Á  | 
| #  @return: None  | 
| def OverTruck(index, clientData, tick):  | 
|       | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     if curPlayer == None:  | 
|         #ÎÞ´ËÍæ¼ÒÁË  | 
|         return  | 
|   | 
|     #Õ½¶·×´Ì¬·µ»Ø  | 
|     if curPlayer.IsBattleState() :  | 
|         PlayerControl.NotifyCode(curPlayer,"GeRen_hgg_143504")  | 
|         #GameWorld.Log("Õ½¶·×´Ì¬Öв»ÄÜÁ¢¼´Íê³ÉÔËïÚ!")  | 
|         return   | 
|       | 
|     curTruck = curPlayer.GetTruck()  | 
|     if not curTruck:  | 
|         PlayerControl.NotifyCode(curPlayer,"GeRen_hgg_500807")  | 
|         #GameWorld.Log("ÄúÓë°®³µÈ˳µÁ½¸ô,ÇëÏȻص½°®³µÉíÅÔÔÙÁ¢¼´Íê³É!")  | 
|         return  | 
|       | 
|     #¸ù¾ÝÍæ¼ÒµÈ¼¶ºÍïÚ³µÆ·½×¿Û³ýÔª±¦  | 
|     playerLV = curPlayer.GetLV()  | 
|     truckLV = curTruck.GetLV()  | 
|     overTruckCost = eval(ReadChConfig.GetEvalChConfig("OverTruckCost"))  | 
|     moneyType = IPY_GameWorld.TYPE_Price_Gold_Money  | 
|       | 
|     infoDict = {"truckLV":truckLV, ChConfig.Def_Cost_Reason_SonKey:truckLV}  | 
|     if not PlayerControl.PayMoney(curPlayer, moneyType, overTruckCost, ChConfig.Def_Cost_FinishTruck, infoDict):  | 
|         return  | 
|       | 
|     #½øÐÐÍê³ÉïÚ³µÈÎÎñÂß¼  | 
|     DoLogic_FinishTruck(curPlayer)  | 
|     return  | 
|   | 
|   | 
| ## ¼ì²é¿É·ñ»ñµÃË«±¶½±Àø  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def CheckDoubleAward():  | 
|     curTime = GameWorld.GetCurrentTime()  | 
|     curTimeStr = str(curTime)  | 
|     curTimeStr = curTimeStr.split(".")[0].split()[1]  | 
|   | 
|     #Àý:[['03:00:00', '05:30:00'], ['13:00:00', '15:30:00']]  | 
|     DoubleAwardOpenDayList, DoubleAwardTimeList = ReadChConfig.GetEvalChConfig("TruckDoubleAwardTime")  | 
|     if DoubleAwardOpenDayList:  | 
|         openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(  | 
|                                              ShareDefine.Def_Notify_WorldKey_ServerDay)  | 
|         if openServerDay in DoubleAwardOpenDayList:  | 
|             return True  | 
|           | 
|     for doubleAwardTime in DoubleAwardTimeList:  | 
|           | 
|         if len(doubleAwardTime) != 2:  | 
|             #ʱ¼ä¶ÎÅäÖôíÎó  | 
|             GameWorld.ErrLog("curTimeStr = %s error"%str(doubleAwardTime))  | 
|             continue  | 
|               | 
|         if doubleAwardTime[0] <= curTimeStr < doubleAwardTime[1]:  | 
|             return True  | 
|       | 
|     return False  | 
|   | 
|   | 
| ## Íê³ÉÈÎÎñÂß¼  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def DoLogic_FinishTruck(curPlayer, isTimeOut=False):  | 
|       | 
|     #»ñÈ¡ïÚ³µ½±Àø  | 
|     curTruck = curPlayer.GetTruck()  | 
|     if curTruck:  | 
|         GiveTruckAward(curPlayer, curTruck, isTimeOut=isTimeOut)  | 
|       | 
|     #ɾ³ýïÚ³µ  | 
|     DelTruck(curPlayer)  | 
|   | 
|     #ÉèÖÃÈÎÎñ״̬  | 
|     mission = curPlayer.FindMission(ChConfig.Def_ConvoyTruckMissionID)  | 
|     #Íæ¼ÒÎÞ´ËÈÎÎñ  | 
|     if mission == None:  | 
|         #Ìí¼Ó´ËÈÎÎñ  | 
|         mission = QuestCommon.AddNewMission(curPlayer, ChConfig.Def_ConvoyTruckMissionID)  | 
|   | 
|     #ÉèÖÃÈÎÎñ״̬  | 
|     isFinish = int(not isTimeOut)  | 
|     failReason = "" if not isTimeOut else "»¤Ëͳ¬Ê±"  | 
|     QuestCommon.SetPlayerMissionState(curPlayer, mission, ChConfig.Def_Mission_State_NoAccept, isFinish, failReason)  | 
|     EventShell.NotifyOneMission(curPlayer, mission)  | 
|     return  | 
|   | 
| ## Íæ¼ÒÔËïÚ³¬Ê±  | 
| def OnPlayerTruckTimeOut(curPlayer):  | 
|     GameWorld.DebugLog("ÔËïÚ³¬Ê± ...")  | 
|     DoLogic_FinishTruck(curPlayer, True)  | 
|     return  | 
|   | 
| ## ïÚ³µOnDayÂß¼  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return None  | 
| def DoTruckOnDay(curPlayer):  | 
|     SetDestroyTruckCnt(curPlayer, 0)  | 
|     # Ã¿ÈÕÃâ·ÑˢдÎÊýÖØÖà  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FreeRefurbishTruckCnt, 0)  | 
|     return  | 
|   | 
| ## Íæ¼ÒËÀÍöïÚ³µ´¦Àí  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return None  | 
| def DoPlayerDead(curPlayer):  | 
|     # Ã»ÓÐïÚ³µ£¬²»´¦Àí  | 
|     #if not PlayerInMapHaveTruck(curPlayer):  | 
|     #    return  | 
|     # ÕâÀïÖ»ÄÜ´ÓÍæ¼Ò½Ó¿ÚÅж¨ïÚ³µ£¬²»È»»á±¨´í  | 
|     if curPlayer.GetTruck() == None:  | 
|         return False  | 
|       | 
|     # ¸ü¸ÄïÚ³µÄ£Ê½  | 
|     truck = curPlayer.GetTruck()  | 
|     #ïÚ³µÓëÍæ¼ÒµÄ¾àÀ볬³ö, Í£Ö¹Òƶ¯, ïÚ³µ×´Ì¬ÉèÖÃΪ²»¸úËæ  | 
|     truck.SetCurAction(IPY_GameWorld.laNPCNull)  | 
|     truck.SetMode(IPY_GameWorld.trmStop)  | 
|       | 
|     #֪ͨ¿Í»§¶ËïÚ³µAIģʽ  | 
|     Sync_TruckMode(curPlayer)  | 
|       | 
|     #ÉèÖÃAIģʽbuff  | 
|     tick = GameWorld.GetGameWorld().GetTick()  | 
|     AddTruckStateBuff(truck, tick)  | 
|   | 
|     #ïÚ³µ¸úËæ¶ªÊ§, Í˳ö×Ô¶¯ÔËïÚ  | 
|     SetAutoTruckState(curPlayer, 0)  | 
|     return  |