| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #---------------------------------------------------------------------  | 
| #  | 
| #---------------------------------------------------------------------  | 
| ##@package EventShell  | 
| # @todo: Ê¼þ¹ÜÀíÆ÷  | 
| #  | 
| # @author: eggxp  | 
| # @date 2010-4-20  | 
| # @version 6.8  | 
| #  | 
| # @note: ¹ÜÀíËùÓÐNPCʼþ´¥·¢½Ó¿Ú  | 
| #---------------------------------------------------------------------  | 
| # @change: "2013-04-15 11:00" wdb ½«ComparePlayerLV_UseItem¸üÃûΪCheckItemUseLV£¬·ÅÈëItemControler  | 
| # @change: "2013-04-18 17:00" wdb ÎïÆ·ÑÕɫʹÓÃÐÞ¸Ä  | 
| # @change: "2013-05-03 17:00" wdb npcÉ̵êÐÞ¸Ä  | 
| # @change: "2013-05-07 15:30" wdb ²Ö¿âÐÞ¸Ä  | 
| # @change: "2013-05-20 11:00" wdb Ôö¼Ó¸±±¾É¨µ´  | 
| # @change: "2013-05-29 11:55" Alee ÐÂÔöɱµÈ¼¶·¶Î§µÄÈÎÎñÂß¼(дËÀ)  | 
| # @change: "2013-05-30 10:30" wdb ×°±¸±¦Ê¯ÏâǶµ÷Õû  | 
| # @change: "2013-06-06 21:30" Alee Õ½¶·×´Ì¬²»¿É½øÈëÈÎÎñ¶Ô»°£¬µ¼Ö¶ÔÏó±ä¸üµÈÎÊÌâ  | 
| # @change: "2013-07-08 15:00" Alee Ìí¼ÓÆÕͨǿ»¯´¥·¢ÈÎÎñ  | 
| # @change: "2013-07-09 15:30" Alee ÒѽÓÈÎÎñÉý¼¶´¥·¢Âß¼  | 
| # @change: "2013-07-19 20:00" Alee Ìí¼Ó»Ø¹º  | 
| # @change: "2013-07-26 17:00" Alee VIP´ò¿ªÔ¶³Ì²Ö¿â  | 
| # @change: "2013-09-10 20:10" Alee ÏµÍ³Ìáʾ³åÍ»  | 
| # @change: "2013-09-18 17:00" Alee Í˳öËø¶¨Í˳ö½»Ò×  | 
| # @change: "2013-09-23 19:30" Alee ºìÃûÌáʾÐÞ¸Ä  | 
| # @change: "2013-11-15 20:20" hxp ¹Ø±Õ07 3A¹ºÂò±³°ü·â°ü¹¦ÄÜ£¬Ôö¼Ó±³°ü³É¹¦ÏµÍ³Ìáʾ  | 
| # @change: "2013-12-12 14:30" hxp Ôö¼Ó×êʯ¹ºÂò±³°ü¼Æ·Ñµãʼþͬ²½  | 
| # @change: "2013-12-13 12:20" hxp ÐÞ¸ÄÊ×µÇÎïÆ·°ó¶¨ÉèÖà  | 
| # @change: "2013-12-27 16:00" Alee É¾³ý¶àÓà´úÂë  | 
| # @change: "2014-01-08 13:20" hxp ÐÞ¸Ä×êʯ¹ºÂò±³°ü»¨·Ñ×êʯ¼Æ·Ñµãʼþͬ²½£¬ÔÚPayMoneyÄڲ㴦Àí  | 
| # @change: "2014-02-17 17:30" hxp Ôö¼Ó¹ºÂò·ûÎı³°ü¸ñ×Ó  | 
| # @change: "2014-03-18 19:00" hxp Ê×µÇÔùËÍÎïÆ·¸ÄΪÅäÖÃÎļþÅäÖà  | 
| # @change: "2014-03-27 19:30" hxp Ôö¼Ó×øÆï»»×°  | 
| # @change: "2014-04-04 20:00" hxp Ôö¼Ó×øÆï»»¼¼ÄÜ£¬¹Ù¾ô¼¼ÄÜ  | 
| # @change: "2014-04-07 12:30" hxp ³á°òÏà¹Ø±³°üÎïÆ·½»»»  | 
| # @change: "2014-04-17 20:30" hxp ÉñÆ÷ʱװ»»×°  | 
| # @change: "2014-04-22 17:50" xcc Ôö¼ÓÔÚÏßʱ¼äÃâ·Ñ¿ªÆô±³°ü¹¦ÄÜ  | 
| # @change: "2014-04-26 19:30" hxp ÁìµØÕ½ÇÅ  | 
| # @change: "2014-04-28 14:00" Alee É¾³ý²âÊÔ×Ê½ð   | 
| # @change: "2014-05-23 14:30" xcc Ôö¼Óħ·½±³°üÎïÆ··ÅÈë½ÇÉ«±³°üµÄ½Ó¿Ú   | 
| # @change: "2014-05-23 15:40" xcc ÐÞ¸´È«²¿·ÅÈë·ÅÈëʧ°ÜµÄbug  | 
| # @change: "2014-06-06 17:00" hxp Ôö¼Ó¿ìËÙÍê³ÉÈÎÎñʼþ  | 
| # @change: "2014-06-23 14:30" Alee ¹Ø±ÕÊä³ö  | 
| # @change: "2014-07-24 21:30" hxp Ôö¼ÓÉèÖÃÅÜ»·ÈÎÎñÐǼ¶£¬Ò»¼üÍê³ÉËùÓÐÅÜ»·ÈÎÎñ  | 
| # @change: "2014-07-31 21:30" hxp È¡ÏûºìÃû²»ÄÜÓëNPC¶Ô»°ÏÞÖÆ  | 
| # @change: "2014-08-26 11:00" hxp NotifyOneMissionÔö¼Ó²ÎÊýÑ¡ÔñÊÇ·ñͬ²½¸ÃÈÎÎñÈ«²¿×ÖµäÐÅÏ¢  | 
| # @change: "2014-12-25 16:10" ljd Í¬²½ÉÏÒ»´Î±³°ü¿ª¸ñʱ¼ä  | 
| # @change: "2015-01-10 23:00" hxp ²Ö¿â¹ºÂòÌØÊâ´¦Àí  | 
| # @change: "2015-01-14 00:30" hxp Ôö¼Óʼþ»ã±¨  | 
| # @change: "2015-01-22 15:00" hxp ¾«¼òlogÊä³ö  | 
| # @change: "2015-03-20 15:00" hxp Ôö¼ÓÊÕ»ñ¹ûʵ£¬¸±±¾²É¼¯Ê¼þ£»Ôö¼Ó½øÈë¼ÒÔ°´«ËÍÃÅÈë¿Ú  | 
| # @change: "2015-03-23 11:00" Alee ¼Ò×åÉý¼¶Ê¼þ¸ÄΪ´¥·¢ËùÓÐ½Úµã  | 
| # @change: "2015-03-28 11:40" ljd Ôö¼ÓÈÎÎñ°ëСʱ´¥·¢Ê¼þ×¢²á¡¢¹ºÂòÈÕ³£ÈÎÎñÉÏÏÞ  | 
| # @change: "2015-04-09 15:00" hxp ¸±±¾ÖÐÎÞ·¨É¾³ýÈÎÎñÌáʾÐÞ¸Ä  | 
| # @change: "2015-06-15 23:00" hxp Ê±×°»»×°  | 
| # @change: "2015-07-13 14:00" hxp Á÷ÏòÔö¼ÓÍæ¼Ò²ÎÊý  | 
| # @change: "2015-07-16 15:00" zqx Ôö¼ÓµÀ¾ß¿ªÆô±³°ü¸ñ×Ó  | 
| # @change: "2015-08-10 14:00" zqx Ð޸Ŀª¸ñ¿ÛµÀ¾ßÂß¼  | 
| # @change: "2015-12-08 18:00" hxp Ôö¼Ó²»ÊÇͨ¹ýNPC¶Ô»°½çÃæ½øÈëµØÍ¼IDÅäÖà  | 
| # @change: "2016-05-17 18:00" hxp Ôö¼Ó·ÇNPC¶Ô»°Íê³ÉÈÎÎñÁìÈ¡½±Àø  | 
| # @change: "2016-07-27 10:40" xdh Ê״εǼ¼¤»îÅå´÷³ÆºÅ  | 
| # @change: "2016-10-28 10:40" xdh ×øÆï¡¢³á°ò¡¢³È×°ÊýÁ¿´¥·¢ÈÎÎñ  | 
| # @change: "2016-12-26 21:00" xdh ¾ôλÉý½×¡¢²¿Î»Ç¿»¯ÐǼ¶´¥·¢ÈÎÎñ  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2016-12-26 21:00"""  | 
| #---------------------------------------------------------------------  | 
| import IPY_GameWorld  | 
| import GameWorld  | 
| import EventSrc  | 
| import ChConfig  | 
| import QuestManager  | 
| import QuestRunner  | 
| import PlayerControl  | 
| import FunctionNPCCommon  | 
| import FBLogic  | 
| import ItemControler  | 
| import ItemCommon  | 
| import QuestCommon  | 
| import copy  | 
| import GameLogInfo  | 
| import time  | 
| import GameServerRefresh  | 
| import PlayerMissionCollect  | 
| import ReadChConfig  | 
| import PlayerFamily  | 
| import ShareDefine  | 
| import Operate_PlayerBuyZhenQi  | 
| import Func_6  | 
| import DataRecordPack  | 
| import PlayerCoin  | 
| import PlayerTrade  | 
| import PlayerExpandPackCfgMgr  | 
| import EventReport  | 
| import PlayerCoat  | 
| import PlayerGatherSoul  | 
| #import PlayerArrestTask  | 
| import PlayerRune  | 
| import IpyGameDataPY  | 
| import FormulaControl  | 
| import GameFuncComm  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import NPCCommon  | 
| import PlayerVip  | 
| import GameObj  | 
|   | 
| import math  | 
| import random  | 
| #---------------------------------------------------------------------  | 
|   | 
| #ÿÈÕÈÎÎñ×îС´¥·¢µÈ¼¶  | 
| Day_Event_Trig_Min_LV = 21  | 
|   | 
| #ÈÎÎñ´¥·¢Ä£Ê½  | 
| Def_RunQuestType_Normal = 1     #ÆÕͨ  | 
| #Def_RunQuestType_NoAnswer = 2   #²»ÐèÒª»ØÓ¦(LVUp)  | 
| Def_RunQuestType_RunAll = 3     #ÔËÐÐËùÓÐ(OnDay), Ã¿ÈÕÅж¨(²»ÄÜÖ»ÔÚonLVUPµÄʱºòÅж¨, ÒòÎªÍæ¼Ò¿ÉÄÜÅѹú, Åѹúºó, Èç¹ûÖ»ÔÚonLVUPµÄʱºòд, ÄÇôÅѹúºó½Ó²»µ½Ã¿ÈÕÈÎÎñ)  | 
| Def_RunQuest_ChangeMap_Tick = 1000  | 
|   | 
| Def_Warehouse_FuncName = "Func_6"  # ²Ö¿âÏà¹Ø¹¦ÄÜpyÃû  | 
| ############################################################  | 
| #def QuestRunner_GetFunc(name):  | 
| #    return    GameWorld.GetExecFunc(EventSrc, "QuestRunner.%s"%name)  | 
| #---------------------------------------------------------------------  | 
| #µ¼ÈëËùÓеÄNPCAI  | 
| GameWorld.ImportAll("Script\\Event\\" , "EventSrc")  | 
| GameWorld.ImportAll("Script\\Event\\" , "")  | 
| #---------------------------------------------------------------------  | 
| ##C++´¥·¢·â°üÖØ¶ÁËùÓÐʼþ  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks C++´¥·¢·â°üÖØ¶ÁËùÓÐʼþ  | 
| def ReloadEvent(tick):  | 
|     scriptPath = ChConfig.GetAppPath() + "Script\\Event\\EventSrc"  | 
|     GameWorld.ReloadScript(scriptPath, "EventSrc")  | 
|       | 
|     scriptPath = ChConfig.GetAppPath() + "Script\\Event"  | 
|     GameWorld.ReloadScript(scriptPath, "")  | 
|       | 
|     #ÖØÐ¶Áȡʼþ  | 
|     QuestManager.ReloadQuests(tick)  | 
|     DoReloadRefresh()  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 01 Ê¼þ´¥·¢#tagCNPCTalk  | 
| # tagCNPCTalk       *   GettagCNPCTalk();  | 
| #   | 
| # class   IPY_CNPCTalk  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetNPCID();  | 
| #   | 
| #    int      GetPosX();  | 
| #   | 
| #    int      GetPosY();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë//08 01·â°üÏìÓ¦ Ê¼þ´¥·¢#tagCNPCTalk  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë//08 01·â°üÏìÓ¦ Ê¼þ´¥·¢#tagCNPCTalk  | 
| def BeginEvent(index, tick):  | 
|     GameWorld.GetPsycoFunc(__Func_BeginEvent)(index, tick)  | 
|     return  | 
|   | 
| ##¿Í»§¶Ë//08 01·â°üÏìÓ¦ Ê¼þ´¥·¢#tagCNPCTalk  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë//08 01·â°üÏìÓ¦ Ê¼þ´¥·¢#tagCNPCTalk  | 
| def __Func_BeginEvent(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|   | 
|     if curPlayer.GetPlayerAction() != IPY_GameWorld.paNull:  | 
|         #Íæ¼Ò״̬²»ÊÇ¿ÕÏÐ״̬  | 
|         return  | 
|       | 
|     #·À³ÁÃÔ  | 
|     if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_Wallow_LV) > ChConfig.Def_GameWallow_LV_First:  | 
|         PlayerControl.NotifyCode(curPlayer, "AvoidSink09")  | 
|         return  | 
|       | 
| #===============================================================================  | 
| #    #ÒÆ¶¯Öв»Ö´Ðд˲Ù×÷  | 
| #    if curPlayer.IsMoving():  | 
| #        PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_0")  | 
| #        return  | 
| #===============================================================================  | 
|       | 
|     if tick - curPlayer.GetResetWorldPosAskTick() < Def_RunQuest_ChangeMap_Tick:  | 
|         #[bug]2009.4.25  | 
|         #1. Íæ¼Ò½øÈë·ÙÌìÈܶ´(ÈÎÎñ״̬ÉèÖÃΪ2)  | 
|         #2. ÔڵȴýÇл»µØÍ¼»ØÓ¦Ö®Ç°, ÆÕͨÁÄÌì(ÈÎÎñ״̬ÉèÖÃΪ1)  | 
|         #3. ½øÈëµØÍ¼ÁË  | 
|         #ÕâÑù¾Í¿ÉÒÔË¢·ÙÌìÈܶ´  | 
|         GameWorld.GodLog(curPlayer, "BeginEvent, ResetWorldPosAskTick")  | 
|         return  | 
|        | 
|     #Íæ¼Ò´¥·¢Ê¼þ   | 
|     sendPack = IPY_GameWorld.IPY_CNPCTalk()  | 
|       | 
|     sendPack_EventNPCID = sendPack.GetNPCID()  | 
|     sendPack_NPCPosX = sendPack.GetPosX()  | 
|     sendPack_NPCPosY = sendPack.GetPosY()  | 
|       | 
|     if sendPack_EventNPCID == 0:  | 
|         #Ŀǰ²»´¦ÀíµØµã´¥·¢Ààʼþ  | 
|         return  | 
|       | 
|     #2010/5/6 Òƶ¯ÖнÓÊܿͻ§¶Ë·â°ü(Òò¿Í»§¶ËÒÆ³ýStopmove), Ð£ÑéÎó²î, ÀÛ¼Ó  | 
|     #===========================================================================  | 
|     # if not PlayerControl.PlayerRefreshPos(curPlayer, curPlayer, sendPack_NPCPosX, sendPack_NPCPosY):  | 
|     #    #Íæ¼Òµ±Ç°Î»ÖÃË¢ÐÂʧ°Ü  | 
|     #    #GameWorld.Log(' CheckUseSkill RefreshPosErr packPos = ( %s, %s ), playerPos = ( %s, %s )'%( posX, posY, curPlayer.GetPosX(), curPlayer.GetPosY() ), curPlayerID )  | 
|     #    return  | 
|     #===========================================================================  | 
|       | 
|     #Ö´ÐжԻ°Âß¼  | 
|     EventLogic(curPlayer, sendPack_EventNPCID, tick)  | 
|     return  | 
|   | 
| #// C1 06 ¿ç·þNPC¶Ô»° #tagCMCrossNPCTalk  | 
| #  | 
| #struct    tagCMCrossNPCTalk  | 
| #{  | 
| #    tagHead        Head;  | 
| #    WORD        ObjID;  | 
| #    DWORD        NPCID;  | 
| #    WORD        PosX;  | 
| #    WORD        PosY;  | 
| #};  | 
| def OnCrossNPCTalk(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     objID = clientData.ObjID  | 
|     npcID = clientData.NPCID  | 
|     #posX = clientData.PosX  | 
|     #posY = clientData.PosY  | 
|     if GameWorld.IsCrossServer():  | 
|         return  | 
|       | 
|     lastTick = curPlayer.GetDictByKey("CrossNPCTalkTick")  | 
|     if tick - lastTick < 2000:  | 
|         return  | 
|     curPlayer.SetDict("CrossNPCTalkTick", tick)  | 
|       | 
|     npcData = GameWorld.GetGameData().FindNPCDataByID(npcID)  | 
|     if not npcData:  | 
|         GameWorld.ErrLog("¿ç·þNPCID²»´æÔÚ! npcID=%s" % npcID)  | 
|         return  | 
|           | 
|     # Ä¿Ç°ÔÝÖ§³Ö¿ç·þ²É¼¯  | 
|     if npcData.GetType() not in [IPY_GameWorld.ntCollection, IPY_GameWorld.ntMissionCollect]:  | 
|         return  | 
|       | 
|     collectNPCIpyData = IpyGameDataPY.GetIpyGameData("CollectNPC", npcID)  | 
|     if collectNPCIpyData:  | 
|         if not NPCCommon.CheckCanCollectByNPCID(curPlayer, npcID, collectNPCIpyData):  | 
|             return  | 
|           | 
|         msgDict = {"PlayerID":curPlayer.GetPlayerID(), "ObjID":objID, "NPCID":npcID}  | 
|         GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_CollectNPC, msgDict)  | 
|           | 
|     return  | 
|   | 
| def ClientServerMsg_CollectNPC(curPlayer, msgData, serverGroupID, tick):  | 
|     ## ÊÕµ½×Ó·þͬ²½µÄ²É¼¯NPC  | 
|     objID = msgData["ObjID"]  | 
|     npcID = msgData["NPCID"]  | 
|     curNPC = GameWorld.FindNPCByID(objID)  | 
|     if not curNPC:  | 
|         return  | 
|     if npcID !=  curNPC.GetNPCID():  | 
|         GameWorld.ErrLog("²É¼¯¿ç·þNPC´íÎó!npcID=%s != curNPCID=%s" % (npcID, curNPC.GetNPCID()))  | 
|         return  | 
|     EventLogic(curPlayer, objID, tick)  | 
|     return  | 
|   | 
| ##¿Í»§¶Ë//08 01·â°üÏìÓ¦ ×Ô¶¨Ò庯Êý: Ê¼þ´¦Àí  | 
| #@param curPlayer µ±Ç°Íæ¼Ò  | 
| #@param eventNPCID Ê¼þNPCID  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë//08 01·â°üÏìÓ¦ ×Ô¶¨Ò庯Êý: Ê¼þ´¦Àí  | 
| def EventLogic(curPlayer, eventNPCID, tick):  | 
|     #¼ì²éÍæ¼ÒºÍNPCµÄ¾àÀëÔÚ²»ÔÚ¶Ô»°·¶Î§ÄÚ  | 
|     curNPC = GameWorld.GetNPCManager().FindNPCByID(eventNPCID)  | 
|       | 
|     #ûÓÐÕâ¸öNPC  | 
|     if curNPC == None :  | 
|         return  | 
|   | 
|     #¿É½øÈëʼþÀàÐÍNPC  | 
|     eventNPCType = [IPY_GameWorld.ntFunctionNPC, IPY_GameWorld.ntCollection, IPY_GameWorld.ntMissionCollect]  | 
|       | 
|     if curNPC.GetType() not in eventNPCType:  | 
|         GameWorld.Log("²»ÊǶԻ°NPC, ²»ÄܶԻ° %d"%(curNPC.GetType()) , curPlayer.GetPlayerID())  | 
|         return   | 
|       | 
|     dist = GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), curNPC.GetPosX(), curNPC.GetPosY())  | 
|       | 
|     if dist > ChConfig.Def_EventDist:  | 
|         #Íæ¼Ò¾àÀë¹ýÔ¶, ²»ÄÜ´¥·¢  | 
|         curPlayer.ResetPos(curPlayer.GetPosX(), curPlayer.GetPosY())  | 
|         return  | 
|       | 
|     if curNPC.GetType() == IPY_GameWorld.ntCollection:  | 
|         #¼Ò×åÕ½µÄËþºÍÆå, ¶Ô»°»á¿ªÊ¼¶Á½ø¶ÈÌõ  | 
|         __BeginCollect(curPlayer, curNPC, tick)  | 
|         return  | 
|       | 
|     #ÈÎÎñ²É¼¯NPC  | 
|     if curNPC.GetType() == IPY_GameWorld.ntMissionCollect:  | 
|         PlayerMissionCollect.QueryMissionCollect(curPlayer, curNPC, tick)  | 
|         return  | 
|       | 
|     #Çå¿ÕÍæ¼Ò´«Ë͵ØÍ¼´ø×ßµÄNPC  | 
|     #ÒòΪ¸±±¾ÈÎÎñÖÐ, Èç¹û¸±±¾ÈËÂú²»Äܽø, »á´«ËÍÒ»´Î¶àÒ»Ö»NPC...  | 
|     curPlayer.ClearChangeMapTakeCreateNPC()  | 
|       | 
|     #ÔÚXML±íÖÐÕÒµ½Õâ¸öNPCµÄ½Å±¾  | 
|     EventRespons_OnVisit(curPlayer, curNPC)  | 
|     return  | 
|   | 
| ##¿Í»§¶Ë//08 01·â°üÏìÓ¦ ×Ô¶¨Ò庯Êý: ¿ªÊ¼¼Ò×åÕ½ÖеÄËþºÍÆÚÀ½ø¶ÈÌõ  | 
| #@param curPlayer µ±Ç°Íæ¼Ò  | 
| #@param curNPC Ê¼þNPCʵÀý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë//08 01·â°üÏìÓ¦ ×Ô¶¨Ò庯Êý: ¿ªÊ¼¼Ò×åÕ½ÖеÄËþºÍÆÚÀ½ø¶ÈÌõ  | 
| def __BeginCollect(curPlayer, curNPC, tick):  | 
|     result = FBLogic.OnCanCollect(curPlayer, curNPC, tick)  | 
|     if not result:  | 
|         #²»¿É²É¼¯  | 
|         return  | 
|       | 
|     curPlayer.SetActionObj(curNPC)  | 
|     PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paNull)  | 
|       | 
|     if NPCCommon.OnCollectNPCBegin(curPlayer, curNPC, tick):  | 
|         return  | 
|       | 
|     prepareTime = FBLogic.GetFBPrepareTime(curPlayer, curNPC)  | 
|       | 
|     collTimeReduceRate = PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_CollTimeReduceRate)  | 
|     if collTimeReduceRate:  | 
|         prepareTime = max(1000, int(prepareTime * (ShareDefine.Def_MaxRateValue - collTimeReduceRate) / float(ShareDefine.Def_MaxRateValue)))  | 
|           | 
|     PlayerControl.Sync_PrepareBegin(curPlayer, prepareTime, IPY_GameWorld.pstCollecting, prepareID = curNPC.GetID())  | 
|       | 
|     ##Ìí¼ÓÕâ¸öNPCµÄÉËѪÁÐ±í£¬ÓÃÓÚ¶à¸öÈËÒ»ÆðÇÀÆå£¬Ò»È˳ɹ¦ºó£¬ÆäËûÈË´ò¶Ï  | 
|     curNPC_HurtList = curNPC.GetPlayerHurtList()  | 
|     import AttackCommon  | 
|     AttackCommon.AddHurtValue(curNPC, curPlayer.GetPlayerID(), ChConfig.Def_NPCHurtTypePlayer, 1)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
|   | 
| #===============================================================================  | 
| # //08 02 Ê¼þ»ØÓ¦#tagCNPCAnswer  | 
| # tagCNPCAnswer       *   GettagCNPCAnswer();  | 
| #   | 
| # class   IPY_CNPCAnswer  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetAnswerLen();  | 
| #    //size = AnswerLen  | 
| #    char *      GetAnswer();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë//08 02·â°üÏìÓ¦ Ê¼þ»ØÓ¦#tagCNPCAnswer  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë//08 02·â°üÏìÓ¦ Ê¼þ»ØÓ¦#tagCNPCAnswer  | 
| def EventAnswer(index, tick):  | 
|     GameWorld.GetPsycoFunc(__Func_EventAnswer)(index, tick)  | 
|     return  | 
|   | 
| ##¿Í»§¶Ë//08 02·â°üÏìÓ¦ Ê¼þ»ØÓ¦#tagCNPCAnswer  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë//08 02·â°üÏìÓ¦ Ê¼þ»ØÓ¦#tagCNPCAnswer  | 
| def __Func_EventAnswer(index, tick):  | 
|     timeClock = time.clock()  | 
|       | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
| #    if curPlayer.GetPlayerAction() != IPY_GameWorld.paEvent:  | 
| #        #Íæ¼Ò²»ÔÚʼþÖÐ,·µ»Ø  | 
| #        GameWorld.Log("EventAnswer, Íæ¼Ò²»ÔÚʼþÖÐ", curPlayer.GetID())  | 
| #        return  | 
|       | 
|     if tick - curPlayer.GetResetWorldPosAskTick() < Def_RunQuest_ChangeMap_Tick:  | 
|         #[bug]2009.4.25  | 
|         #1. Íæ¼Ò½øÈë·ÙÌìÈܶ´(ÈÎÎñ״̬ÉèÖÃΪ2)  | 
|         #2. ÔڵȴýÇл»µØÍ¼»ØÓ¦Ö®Ç°, ÆÕͨÁÄÌì(ÈÎÎñ״̬ÉèÖÃΪ1)  | 
|         #3. ½øÈëµØÍ¼ÁË  | 
|         #ÕâÑù¾Í¿ÉÒÔË¢·ÙÌìÈܶ´  | 
|         GameWorld.GodLog(curPlayer, "EventAnswer, ResetWorldPosAskTick")  | 
|         return  | 
|       | 
|     sendPack = IPY_GameWorld.IPY_CNPCAnswer()  | 
|     answer = sendPack.GetAnswer()  | 
|     if answer == "":  | 
|         #Íæ¼Ò»Ø´ðΪ¿Õ  | 
|         GameWorld.Log("Íæ¼Ò»Ø´ðΪ¿Õ" , curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     answerBase = copy.deepcopy(answer)  | 
|     answer = answer.lower()  | 
|     if answer == "cancel":  | 
|         #GameWorld.Log("Íæ¼ÒÇ¿ÖÆ½áÊøÊ¼þ" , curPlayer.GetPlayerID())  | 
|         DoExitEvent(curPlayer)  | 
|         return  | 
|       | 
|     funcHead = "fc_"  | 
|     xmlFuncHead = "evt_"  | 
|       | 
|     curNPC = QuestRunner.GetPlayerTalkNPC(curPlayer)  | 
|     #ºìÃûÍæ¼ÒÎÞ·¨½Ó,½»ÈÎÎñ  | 
| #    if curPlayer.GetPlayerNameColor() == IPY_GameWorld.pncRed and __Check_FunctionNPC_Talk_RedName(curNPC):  | 
| #        PlayerControl.NotifyCode(curPlayer, "PK_lhs_161795")  | 
| #        #½áÊøÊ¼þ  | 
| #        DoExitEvent(curPlayer)  | 
| #        return  | 
|       | 
|     if curNPC != None and not GameWorld.IsSameCountry(curPlayer, curNPC) :  | 
|         #PK_lhs_372238   <n color="255,0,0">ÎÒ²»»á¸øµÐÈËÌṩÈκΰïÖúµÄ!</n>  | 
|         #²»Í¬¹ú¼®, ²»ÄܺÍNPC¶Ô»°  | 
|         #PlayerControl.NotifyCode(curPlayer, "PK_lhs_372238")  | 
|         DoExitEvent(curPlayer)  | 
|         return  | 
|       | 
|     GameWorld.DebugLog("%s(%d) ·ÃÎÊNPC»ØÓ¦: %s"%(curPlayer.GetName(), curPlayer.GetID(), answerBase) , curPlayer.GetPlayerID())  | 
|       | 
|     if answer.find(funcHead) == 0:  | 
|         #ÊÇʼþÏìÓ¦  | 
|         if curNPC == None:  | 
|             #ûÓÐÕâ¸öNPC  | 
|             GameWorld.Log("funcHeadûÓÐÕâ¸öNPC" , curPlayer.GetPlayerID())  | 
|             return  | 
|           | 
|         #µÃµ½Íæ¼ÒµÄ¶ÔÏó  | 
|         funcAnswer = answerBase.replace(funcHead, "")  | 
|         responseType="Func_%d"%curNPC.GetFunctionType()  | 
|         callFunc = GameWorld.GetExecFunc(EventSrc, "%s.%s"%(responseType, funcAnswer))  | 
|           | 
|         if callFunc == None:  | 
|             #º¯Êýµ÷Óò»¿ÉʹÓà  | 
|             GameWorld.Log("»ØÓ¦Ê¼þÏìÓ¦ %s %s²»¿ÉʹÓÃ"%(responseType, funcAnswer) , curPlayer.GetPlayerID())  | 
|             return  | 
|           | 
|         callFunc(curPlayer, tick)  | 
|         return  | 
|       | 
|     elif answer.find(xmlFuncHead) == 0:  | 
|         #ÔËÐÐFuncĿ¼ÏµÄXMLÎļþ  | 
|         #ʼþ¶Ô»°(¿ªÍ¨²Ö¿â, ¹ºÂòæô³µÂíÆ¥Ê¹ÓÃʱ¼äµÈ  | 
|         funcAnswer = answer.replace(xmlFuncHead, "")  | 
|         QuestsEvent = QuestManager.GetAllQuestsEvents()  | 
|         curNPC = QuestRunner.GetPlayerTalkNPC(curPlayer)  | 
|           | 
|         if curNPC == None:  | 
|             #ûÓÐÕâ¸öNPC  | 
|             GameWorld.Log("GetPlayerTalkNPCûÓÐÕâ¸öNPC" , curPlayer.GetPlayerID())  | 
|             return  | 
|           | 
|         #µÃµ½NPCµÄTypeID  | 
|         funcType = curNPC.GetFunctionType()  | 
|         key = ("function_npc", "%d_%s.xml"%(funcType, funcAnswer))  | 
|           | 
|         if QuestsEvent.has_key(key):  | 
|             for event in QuestsEvent[key]:  | 
|                 nodeList = event[1].GetXMLEventLoader().GetNodeList()  | 
|                 #ÔËÐÐfunction_npcĿ¼ÏµÄ[funcType].xmlÎļþ  | 
|                 if QuestRunner.RunFunctionQuest(curPlayer, nodeList) != True:  | 
|                     GameWorld.Log("ÈÎÎñʼþ¶Ô»°Ö´ÐÐʧ°Ü" , curPlayer.GetPlayerID())  | 
|                     DoExitEvent(curPlayer)  | 
|         else:  | 
|             GameWorld.Log("¹þÏ¸ÌØËøÂðÀû(¾«Áé×åÓï) %s"%(str(key)) , curPlayer.GetPlayerID())  | 
|             DoExitEvent(curPlayer)  | 
|               | 
|         return  | 
|       | 
|     else:  | 
|   | 
|         #ÆÕͨ¶Ô»°  | 
|         QuestRunner.RunPlayerAnswer(curPlayer, answer)  | 
|       | 
|     #¼Ç¼ÈÎÎñÏà¹ØÐÅÏ¢  | 
|     GameLogInfo.LogInfo_MissionTime(timeClock)  | 
|     GameLogInfo.LogInfo_MissionCount(1)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
|   | 
| ##ÈÎÎñ´¥·¢Æ÷×°±¸ÆÕͨǿ»¯Ê¹ÓôÎÊý  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param curNPC NPCʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnKillById »÷ɱָ¶¨IDµÄ¹ÖÎï  | 
| def EventRespons_OnEquipNormalPlus(curPlayer, itemID):  | 
|     RunQuestEvent(curPlayer, "on_equip_normal_plus", itemID, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
|   | 
| ## ÈÎÎñ´¥·¢Æ÷_OnVisit ºÍNPC¶Ô»°  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param curNPC NPCʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnVisit ºÍNPC¶Ô»°  | 
| def EventRespons_OnVisit(curPlayer, curNPC):  | 
|     #GameWorld.Log("·ÃÎÊNPCËø×¡" , curPlayer.GetPlayerID())  | 
|     curPlayer.BeginEvent()  | 
|     curPlayer.SetActionObj(curNPC)  | 
|           | 
|     #µÃµ½NPCµÄTypeID  | 
|     npcTypeID = curNPC.GetNPCID()  | 
|     #GameWorld.Log("%s(%d) ·ÃÎÊNPC %d"%(curPlayer.GetName(), curPlayer.GetID(),npcTypeID) , curPlayer.GetPlayerID())  | 
|     if QuestRunner.RunQuestOnVisit(curPlayer, npcTypeID) != True:  | 
|         GameWorld.Log("%sÈÎÎñ¶Ô»°Ö´ÐÐʧ°Ü"%(npcTypeID) , curPlayer.GetPlayerID())  | 
|         DoExitEvent(curPlayer)  | 
|       | 
|     return  | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ_ÿÈÕÈÎÎñ //0.xml, º¯Êýµ÷ÓàQuestRunner.RunQuest Ö´ÐÐÂß¼  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param eventName Ê¼þ×ÖµäÃû  | 
| #@param trigID Ê¼þ×ÖµäÖµ  | 
| #@param eventDictName Ëæ»úʼþ×ÖµäÃû£¬´¢´æID  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ_ÿÈÕÈÎÎñ //0.xml, º¯Êýµ÷ÓàQuestRunner.RunQuest Ö´ÐÐÂß¼  | 
| def RunDayEvent(curPlayer, eventName, trigID, eventDictName):  | 
|     QuestsEvent = QuestManager.GetAllQuestsEvents()  | 
|     key = (eventName, "0.xml")  | 
|     #ÒòΪÿÈÕÈÎÎñɱ¹ÖËæ»ú, ËùÒÔÖ»ÓÐÓÃ0.xmlÀ´¶ÁÈ¡  | 
|     if not QuestsEvent.has_key(key) :  | 
|         return  | 
|       | 
|     curQuestList = QuestsEvent[key]  | 
|     if len(curQuestList) == 0:  | 
|         GameWorld.Log("%s Ã»Óд¥·¢!"%str(key) , curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     for event in curQuestList:  | 
|         questID = event[0]  | 
|         curMission = curPlayer.FindMission(questID)  | 
|         if curMission == None:  | 
|             continue  | 
|           | 
|         killRangeName = "killrangenpclv"  | 
|         #Ö¸¶¨NPCµÈ¼¶·¶Î§  | 
|         killRangeLV = curMission.GetProperty(killRangeName)  | 
|         #´ÓÒ»¸ö·¶Î§Ëæ»ú³öÒ»¸öÖ¸¶¨Öµ  | 
|         eventID = curMission.GetProperty(eventDictName)  | 
|         #ɱÈÎÒâ¹Ö  | 
|         anyKill = curMission.GetProperty(QuestCommon.Def_Day_Event_Any_Kill)  | 
|           | 
|         #·ûºÏÒ»Ñù¼´¿ÉÖ´ÐÐ  | 
|         if anyKill == 0 and eventID != trigID and killRangeLV == 0:  | 
|             continue  | 
|           | 
|         if killRangeLV > 0:  | 
|             curMission.SetProperty(killRangeName, trigID, False)  | 
|           | 
|         QuestRunner.RunQuest(curPlayer, questID, event[1].GetXMLEventLoader().GetNodeList())  | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ_ÈÎÎñʼþ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param eventName Ê¼þ×ÖµäÃû  | 
| #@param fileID Ê¼þXMLÎļþÃû  | 
| #@param runType Ö´Ðз½Ê½ Def_RunQuestType_  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ_ÈÎÎñʼþ  | 
| def RunQuestEvent(curPlayer, eventName, fileID, runType):  | 
|     eventName = eventName.lower()  | 
|     QuestsEvent = QuestManager.GetAllQuestsEvents()  | 
|     key = (eventName, "%s.xml"%str(fileID))  | 
|       | 
|     if not QuestsEvent.has_key(key) :  | 
|         #GameWorld.DebugLog("RunQuestEvent Ã»ÓÐkey = %s  !" % str(key), curPlayer.GetPlayerID())  | 
|         return False  | 
|       | 
|     curQuestList = QuestsEvent[key]  | 
|     if len(curQuestList) == 0:  | 
|         GameWorld.Log("%s Ã»Óд¥·¢!"%str(key) , curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     for event in curQuestList:  | 
|         questID = event[0]  | 
|   | 
|         #δ¼¤»îµÄÈÎÎñÒ²ÐèÒª´¥·¢, ÔÒò: ÈÎÎñδ¼¤»î, µ«ÊÇ»¹Êǻᱣ´æÔÚÍæ¼ÒÉíÉÏ  | 
|         #ÔÒò: Íæ¼ÒÒ»ÌìÖ»ÄÜÁìȡһ´Î»î¶¯, ²»¹Ü»î¶¯¿ªÆô¶àÉÙ´Î  | 
|         #ËùÒÔÒªÈ÷Ǽ¤»î״̬´¥·¢onday  | 
|           | 
|         #2009.2.15      ¸üÐÂ, Î´¼¤»îµÄ»î¶¯²»»á´¥·¢, ²»¿¼Âǻɾ³ý  | 
|         curQuestData = QuestManager.FindQuest(questID)  | 
|         curMission = curPlayer.FindMission(questID)  | 
|           | 
|         if curQuestData != None and curQuestData.Type == QuestCommon.Def_GM_Active_Mission_Type:  | 
|             #¼ì²éÓÐûÓм¤»î  | 
|             #ûÓ줻î, Ìø¹ý      | 
|             if not GameWorld.GetGameWorld().IsEventActive(questID):  | 
|                 if curMission == None:  | 
|                     continue  | 
|                 #ÊÇÍê³ÉµÄÈÎÎñ  | 
|                 if curMission.GetState() == ChConfig.Def_Mission_State_Over:  | 
|                     continue  | 
|               | 
|         #GameWorld.Log("Íæ¼Ò´¥·¢ÈÎÎñ: %s  - %d"%(str(key), questID) , curPlayer.GetPlayerID())      | 
|         if runType == Def_RunQuestType_RunAll:  | 
|             #ÔËÐÐËùÓÐ½Úµã  | 
|             QuestRunner.RunAllQuest(curPlayer, questID, event[1].GetXMLEventLoader().GetNodeList())  | 
|             continue  | 
| #        elif runType == Def_RunQuestType_NoAnswer:  | 
| #            QuestRunner.RunQuestNoAnswer(curPlayer, questID, event[1].GetXMLEventLoader().GetNodeList())  | 
| #            continue  | 
|           | 
| #        curMission = curPlayer.FindMission(questID)  | 
|         if curMission == None:  | 
|             continue  | 
|           | 
|         if runType != Def_RunQuestType_RunAll and curMission.GetState() == ChConfig.Def_Mission_State_Over:  | 
|             #ÈÎÎñÒѾÍê³É  | 
|             continue  | 
|   | 
|         if runType == Def_RunQuestType_Normal:  | 
|             QuestRunner.RunQuest(curPlayer, questID, event[1].GetXMLEventLoader().GetNodeList())  | 
|   | 
|     return True  | 
| #---------------------------------------------------------------------  | 
| def Event_OnKillByID(curPlayer, npcID):  | 
|     #ÔËÐÐon_kill_by_idĿ¼ÏµÄ[NPCTypeID].xmlÎļþ  | 
|     RunQuestEvent(curPlayer, "on_kill_by_id", npcID, Def_RunQuestType_Normal)  | 
|     #´¥·¢Ã¿ÈÕÈÎÎñɱ¹Ö  | 
|     RunDayEvent(curPlayer, "on_kill_by_id", npcID, QuestCommon.Def_Kill_Npc_ID)  | 
|     return  | 
|   | 
| ##ÈÎÎñ´¥·¢Æ÷_OnKillById »÷ɱָ¶¨IDµÄ¹ÖÎï  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param curNPC NPCʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnKillById »÷ɱָ¶¨IDµÄ¹ÖÎï  | 
| def EventRespons_OnKillById(curPlayer, curNPC):  | 
|     #µÃµ½NPCµÄTypeID  | 
|     npcTypeID = curNPC.GetNPCID()  | 
|     QuestRunner.SetKillNPC(curNPC)  | 
|       | 
|     Event_OnKillByID(curPlayer, npcTypeID)  | 
|       | 
|     #´¥·¢°´µÈ¼¶É±¹Ö  | 
|     EventRespons_OnKillByLv(curPlayer, curNPC)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnKillByLv »÷ɱָ¶¨µÈ¼¶µÄ¹ÖÎï  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param curNPC NPCʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnKillByLv »÷ɱָ¶¨µÈ¼¶µÄ¹ÖÎï  | 
| def EventRespons_OnKillByLv(curPlayer, curNPC):  | 
|     if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:  | 
|         return  | 
|       | 
|     #µÃµ½NPCµÄTypeID  | 
|     npcLV = NPCCommon.GetNPCLV(curNPC)      | 
|       | 
|     #ÔËÐÐon_kill_by_lvĿ¼ÏµÄ[NPCTypeID].xmlÎļþ  | 
|     #QuestRunner.SetKillNPC(curNPC)  | 
|       | 
|     RunQuestEvent(curPlayer, "on_kill_by_lv", npcLV, Def_RunQuestType_Normal)  | 
|       | 
|     #´¥·¢Ã¿ÈÕÈÎÎñɱ¹Ö  | 
|     RunDayEvent(curPlayer, "on_kill_by_lv", npcLV, QuestCommon.Def_Kill_Npc_LV)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_Íê³ÉijÊÖ»úÈÎÎñ  | 
| # @param curPlayer£ºÍæ¼ÒʵÀý  | 
| # @param curTaskType£º('1_MissionId'£ºÓÎÀú½ºþ£»'2_MissionId'£ºÐ¦¶÷¼£»)  | 
| # @return None  | 
| def EventRespons_OnPhoneAchieveTask(curPlayer, curTaskType):  | 
|       | 
|     RunQuestEvent(curPlayer, "on_phone_achieve_task", curTaskType, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
|   | 
|   | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnGet Íæ¼ÒʰȡÎïÆ·  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param itemTypeID ÎïÆ·ID  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnGet Íæ¼ÒʰȡÎïÆ·  | 
| def EventRespons_OnGet(curPlayer, itemTypeID):  | 
|     RunQuestEvent(curPlayer, "on_get", itemTypeID, Def_RunQuestType_Normal)  | 
|     #´¥·¢Ã¿ÈÕÈÎÎñµÃµ½ÎïÆ·  | 
|     RunDayEvent(curPlayer, "on_get", itemTypeID, QuestCommon.Def_Item_ID)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnTruckDisappear ïÚ³µ¶ªÊ§´¥·¢ÈÎÎñ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param taskID ïÚ³µÊ¼þID  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnTruckDisappear ïÚ³µ¶ªÊ§´¥·¢ÈÎÎñ  | 
| def EventRespons_OnTruckDisappear(curPlayer, taskID):  | 
|     GameWorld.Log("æô³µ¶ªÊ§, ´¥·¢æô³µ¶ªÊ§ÈÎÎñ %d"%(taskID), curPlayer.GetPlayerID())  | 
|     RunQuestEvent(curPlayer, "on_truck_disappear", taskID, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnTruckDestroy ïÚ³µ´òÀô¥·¢ÈÎÎñ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param taskID ïÚ³µÊ¼þID  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnTruckDestroy ïÚ³µ´òÀô¥·¢ÈÎÎñ  | 
| def EventRespons_OnTruckDestroy(curPlayer, taskID):  | 
|     GameWorld.Log("æô³µ´òÀÃ, ´¥·¢æô³µ´òÀÃÈÎÎñ %d"%(taskID), curPlayer.GetPlayerID())  | 
|     RunQuestEvent(curPlayer, "on_truck_destroy", taskID, Def_RunQuestType_Normal)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| ##×Ô¶¨Ò庯Êý:OnEnter Íæ¼ÒÉÏÏß´¥·¢GM¿ª¹ØµÄ»î¶¯  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ×Ô¶¨Ò庯Êý:OnEnter Íæ¼ÒÉÏÏß´¥·¢GM¿ª¹ØµÄ»î¶¯  | 
| def PlayerGMEventTrig(curPlayer):  | 
|     gameWorld = GameWorld.GetGameWorld()  | 
|     #¼ì²éÍæ¼Ò´¥·¢GMʼþ(´¥·¢on_activeºÍon_deactive)  | 
|     #QuestManager.FindQuest  | 
|       | 
|     delQuestList = []  | 
|     for i in range(0, curPlayer.GetMissionCount()):  | 
|         curMission = curPlayer.GetMissionByIndex(i)  | 
|         missionID = curMission.GetMissionID()  | 
|         missionData = QuestManager.FindQuest(missionID)  | 
|         if missionData == None:  | 
|             continue  | 
|           | 
|         if missionData.Type != QuestCommon.Def_GM_Active_Mission_Type:  | 
|             continue  | 
|           | 
|         #¼ì²é½ÚÇìÈÎÎñ  | 
|         if not gameWorld.IsEventActive(missionID):  | 
|             #Íæ¼ÒÓнÚÇìÈÎÎñ, µ«ÊÇÈÎÎñÒѾ¹Ø±ÕÁË  | 
|             #×¢Òâ: ÕâÀïÊÇÔÚforÖÐɾ³ý!!!  | 
|             delQuestList.append(missionID)  | 
|             #EventResponse_OnDeActive(curPlayer, missionID)  | 
|               | 
|     for missionID in delQuestList:  | 
|         EventResponse_OnDeActive(curPlayer, missionID)  | 
|       | 
|     for i in range(gameWorld.GetActiveEventCount()):  | 
|         missionID = gameWorld.GetActiveEventByIndex(i)  | 
|         if curPlayer.FindMission(missionID):  | 
|             #Íæ¼ÒÓÐÕâ¸öÈÎÎñ  | 
|             continue  | 
|           | 
|         #Íæ¼ÒûÓÐÕâ¸ö½ÚÇìÈÎÎñ, ÐèÒª´¥·¢  | 
|         EventResponse_OnActive(curPlayer, missionID)  | 
|           | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##´¥·¢ËùÓÐËûÈË·¢²¼µÄÈÎÎñ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ×Ô¶¨Ò庯Êý:´¥·¢ËùÓÐËûÈË·¢²¼µÄÈÎÎñ  | 
| def PlayerMissionPubEventTrig(curPlayer):  | 
|     #¼ì²éÍæ¼Ò´¥·¢GMʼþ(´¥·¢on_activeºÍon_deactive)  | 
|     #QuestManager.FindQuest  | 
|     missionPubManager = GameWorld.GetGameWorld().GetDBMissionPubManager()      | 
|     for i in range(missionPubManager.GetCount()):  | 
|         curMissionPub = missionPubManager.GetAt(i)  | 
|         missionID = curMissionPub.GetMissionID()  | 
|         if curPlayer.FindMission(missionID):  | 
|             #Íæ¼ÒÓÐÕâ¸öÈÎÎñ  | 
|             continue  | 
|           | 
|         #´¥·¢ËûÈË·¢²¼µÄÈÎÎñ  | 
|         CheckTrigMissionPub(curPlayer, curMissionPub)  | 
|           | 
|     return  | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnEnter ÈÎÎñDZ¹æÔò,Íæ¼ÒµÚÒ»´ÎµÇ½ÓÎÏ·ÒªÌí¼ÓÈÎÎñ1¸øÍæ¼Ò  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnEnter ÈÎÎñDZ¹æÔò,Íæ¼ÒµÚÒ»´ÎµÇ½ÓÎÏ·ÒªÌí¼ÓÈÎÎñ1¸øÍæ¼Ò  | 
| def EventResponse_OnEnter(curPlayer):  | 
|     curPlayerID = curPlayer.GetID()  | 
|     #quests = QuestManager.GetQuests()  | 
|     addMission = QuestCommon.GetCommonMission(curPlayer)  | 
|       | 
|     if addMission == None:  | 
|         #Ö´ÐеÚÒ»´ÎµÇ½Âß¼  | 
|         __FirstLoginOnEnter(curPlayer)  | 
|           | 
|         addMission = QuestCommon.GetCommonMission(curPlayer)  | 
|           | 
|         if addMission == None:  | 
|             GameWorld.ErrLog('EventResponse_OnEnter, Íæ¼Ò = %sÎÞ·¨»ñµÃ¹«¹²ÈÎÎñ'%(curPlayer.GetName()), curPlayer.GetID())  | 
|             return  | 
|       | 
|     if addMission.GetState() != ChConfig.Def_Mission_State_NoAccept:  | 
|         return   | 
|       | 
|     #Íæ¼ÒµÚÒ»¸öÈÎÎñûÓÐ×ö,Ëø×¡  | 
|     GameWorld.Log("Íæ¼ÒµÚÒ»¸öÈÎÎñûÓÐ×ö, Ëø×¡", curPlayerID)  | 
|     #curPlayer.BeginEvent()  | 
|     curPlayer.SetDict(ChConfig.Def_PlayerKey_Frist_Lock, 1)  | 
|     #µ÷ÓÃÖ´ÐÐÐÂÊÖÈÎÎñ  | 
|     RunQuestEvent(curPlayer, "on_enter", ChConfig.Def_XML_FirstLogin, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##Íæ¼ÒµÚÒ»´ÎµÇ½ÓÎÏ·Âß¼, ÈçÈÎÎñ¼ÓÔØÂß¼, ×Ô¶¯Ñ§Ï°¼¼ÄÜ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ×Ô¶¨Ò庯Êý:Íæ¼ÒµÚÒ»´ÎµÇ½ÓÎÏ·Âß¼, ÈçÈÎÎñ¼ÓÔØÂß¼, ×Ô¶¯Ñ§Ï°¼¼ÄÜ  | 
| def __FirstLoginOnEnter(curPlayer):  | 
|     playerID = curPlayer.GetID()  | 
|       | 
|     GameWorld.Log('Íæ¼ÒÊǵÚÒ»´Î½øÈëÓÎÏ·', playerID)  | 
|     # ÌØÊâ˵Ã÷£º Èç¹ûµØÍ¼Ã»ÓÐÍêÈ«³õʼ»¯ºÃ£¬¿Í»§¶Ë¶Ï¿ª»òÕßÒì³£µÈÇé¿ö»á´¥·¢RunGateGameServerMapServerKickOutPlayerNoSave  | 
|     # ÄÇôÔÚDoPlayerLogin ÖÐÉèÖõÄÊý¾Ý½«²»»á±»±£´æ£¬ Èç»áµ¼ÖµÚÒ»¸öÈÎÎñÖØ¸´´¥·¢ÎÊÌ⣬¼Ç¼¶à´Î·¢ËÍ  | 
|     EventReport.WriteEvent_Entry(curPlayer, 4)  | 
|     #EventReport.EventReport(ShareDefine.Def_UserAction_FirstLogin, "", curPlayer)  | 
|     #---¸øÍæ¼ÒÐÂÊÖÈÎÎñ---  | 
|     addMission = QuestCommon.AddNewMission(curPlayer, ChConfig.Def_MissionID_FirstLogin)  | 
|     #¹ã²¥ÐÂÔöÈÎÎñ  | 
|     NotifyOneMission(curPlayer, addMission)  | 
|       | 
|     #---²¹ÂúѪÂúħ---  | 
|     GameObj.SetHP(curPlayer, GameObj.GetMaxHP(curPlayer))  | 
|     curPlayer.SetMP(curPlayer.GetMaxMP())  | 
|       | 
|     #---¸øÓèÍæ¼ÒÐÂÊÖÎïÆ·---  | 
|       | 
|     #---³õʼ»¯×°±¸ÏÔÒþ µÚ1Ì×*10+ûÓÐÌ××°  | 
|     curPlayer.SetEquipShowSwitch(10)  | 
|     PlayerControl.SetFaceEquipIndex(curPlayer, 11012014)  | 
|       | 
|     #ĬÈÏ´¥·¢Ò»´Î¹¦ÄÜ¿ªÆô  | 
|     if curPlayer.GetLV() == 1:  | 
|         GameFuncComm.DoFuncOpenLogic(curPlayer)  | 
|           | 
|     #³õʼ»¯×é¶Ó״̬  | 
|     autoJoinReqCheck = IpyGameDataPY.GetFuncCfg("TeamCheckSet", 1)  | 
|     autoInviteCheck = IpyGameDataPY.GetFuncCfg("TeamCheckSet", 2)  | 
|     PlayerControl.SetTeamCheckStateEx(curPlayer, int(not autoJoinReqCheck), int(not autoInviteCheck))  | 
|       | 
|     #°´Æ½Ì¨¸øÊ׸ö³ÆºÅ  | 
|     #PlayerDienstgrad.GiveFirstLoginDienstgrad(curPlayer)  | 
|   | 
| # 2012-04-12 Íæ¼Ò³õʼ»¯Ê±ÒѸøÓè¸ñ×Ó  | 
| #    #---ÐÂÊÖ¸ø²Ö¿â---  | 
| #    if ChConfig.Def_FirstLogin_OpenWareHouseCnt > 0:  | 
| #        ResetWarehouse(curPlayer, ChConfig.Def_FirstLogin_OpenWareHouseCnt, False)  | 
|       | 
|     #Íæ¼ÒĬÈ϶ñÃûÖµ  | 
|     curPlayer.SetInfamyValue(ChConfig.Def_FirstLogin_InfamyValue)  | 
|       | 
|     #±ê¼ÇÒѵǽ¹ý£¬ÓÃÓÚ·ÇͬһÌì¶þ´ÎµÇ½  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_OtherDayLogin, 1)  | 
|       | 
|     #curPlayer.SetDict("ThunderLogin", 1)  | 
|     #¼Ç¼µÚÒ»´ÎµÇ½  | 
|     DataRecordPack.DR_FirstLogin(curPlayer.GetAccID(), curPlayer.GetIP(), curPlayer)  | 
|       | 
|     #ÄÚ²¿ºÅ¸øÓèÔª±¦  | 
|     #PlayerCoin.GiveGoldByCreate(curPlayer)  | 
|       | 
|     #Ê×µÇÓʼþ  | 
|     mailList = IpyGameDataPY.GetFuncEvalCfg("MailLVAward", 2)  | 
|     for mailTypeKey, mailItemList in mailList:  | 
|         PlayerControl.SendMailByKey(mailTypeKey, [curPlayer.GetPlayerID()], mailItemList)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnLogin Íæ¼ÒµÇ½ÓÎÏ·´¥·¢  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnLogin Íæ¼ÒµÇ½ÓÎÏ·´¥·¢  | 
| def EventResponse_OnLogin(curPlayer):  | 
|     #´¥·¢GM¿ª¹Ø»î¶¯  | 
| #    PlayerGMEventTrig(curPlayer)  | 
|     #´¥·¢ËûÈË·¢²¼»î¶¯  | 
| #    PlayerMissionPubEventTrig(curPlayer)  | 
|       | 
|     RunQuestEvent(curPlayer, "on_login", "on_login", Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_On_GameServer_Login ´ËʼþÐèÒªGameServer³õʼ»¯Íæ¼Òºó£¬·µ»ØÊǼÒ×峤ºó´¥·¢  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_On_GameServer_Login ´ËʼþÐèÒªGameServer³õʼ»¯Íæ¼Òºó£¬·µ»ØÊǼÒ×峤ºó´¥·¢  | 
| def EventResponse_On_GameServer_Login(curPlayer):  | 
|     #ÉèÖÃΪ¼Ò×峤£¨GameServerÒÑÑéÖ¤£¬MapServer»¹Ã»Ë¢Ð£©  | 
|     curPlayer.SetFamilyMemberLV(IPY_GameWorld.fmlLeader)  | 
|     RunQuestEvent(curPlayer, "on_gs_login", "on_gs_login", Def_RunQuestType_RunAll)  | 
|     return  | 
| #===============================================================================  | 
| #   | 
| # #³ÇÃŻ¿ªÊ¼´¥·¢ÈÎÎñʼþ  | 
| # def EventResponse_On_Open_Gate_War(curPlayer):  | 
| #    if not curPlayer.GetGameServerInitOK():  | 
| #        GameServerRefresh.Set_Mission_No_ID_On_Open_Gate_War( curPlayer , 1 )  | 
| #        return  | 
| #      | 
| #    RunQuestEvent(curPlayer, "on_open_gate_war", "on_open_gate_war", Def_RunQuestType_RunAll)  | 
| #    return  | 
| #   | 
| # #³ÇÃŻ½áÊø´¥·¢ÈÎÎñʼþ  | 
| # def EventResponse_On_Close_Gate_War(curPlayer):  | 
| #    if not curPlayer.GetGameServerInitOK():  | 
| #        GameServerRefresh.Set_Mission_No_ID_On_Close_Gate_War( curPlayer , 1 )  | 
| #        return  | 
| #      | 
| #    RunQuestEvent(curPlayer, "on_close_gate_war", "on_close_gate_war", Def_RunQuestType_RunAll)  | 
| #    return  | 
| #   | 
| # #³ÇÃŻÖеǽ´¥·¢ÈÎÎñʼþ  | 
| # def EventResponse_On_Gate_War_Login(curPlayer):  | 
| #    RunQuestEvent(curPlayer, "on_gate_war_login", "on_gate_war_login", Def_RunQuestType_RunAll)  | 
| #    return  | 
| #   | 
| # #³ÇÃŻºóµÇ½´¥·¢ÈÎÎñʼþ  | 
| # def EventResponse_Not_Gate_War_Login(curPlayer):  | 
| #    RunQuestEvent(curPlayer, "not_gate_war_login", "not_gate_war_login", Def_RunQuestType_RunAll)  | 
| #    return  | 
| #===============================================================================  | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnGameEvent ÌøÎèµöÓã½ø¶ÈÌõ½áÊøºó´¥·¢  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnGameEvent ÌøÎèµöÓã½ø¶ÈÌõ½áÊøºó´¥·¢  | 
| def EventRespons_OnGameEvent(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_game_event", "on_game_event", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnMap Íæ¼ÒµÇ½µØÍ¼  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnMap Íæ¼ÒµÇ½µØÍ¼  | 
| def EventResponse_OnMap(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_map", "on_map", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
|   | 
| ##ÈÎÎñ´¥·¢Æ÷_OnMapEx Íæ¼ÒµÇ½µØÍ¼  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return None  | 
| def EventResponse_OnMapEx(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_map_ex", "on_map_ex", Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_LVUp µ±Íæ¼ÒÉý¼¶µÄʱºò´¥·¢  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_LVUp µ±Íæ¼ÒÉý¼¶µÄʱºò´¥·¢  | 
| def EventResponse_LVUp(curPlayer):  | 
|     #ÒѽÓÈÎÎñÉý¼¶´¥·¢Âß¼  | 
|     RunQuestEvent(curPlayer, "on_lv_up", "on_lv_up", Def_RunQuestType_Normal)  | 
|       | 
|     #2010/5/18 LvUp´¥·¢ÓɶÁÈ¡XMLÐÞ¸ÄΪ¶ÁÈ¡ÅäÖñíLvUpTrigMissionID  | 
|     #Éý¼¶´¥·¢ÈÎÎñ·Ö2ÖÖ: 1.Ìí¼ÓÈÎÎñ²¢ÇÒ´¥·¢ÈÎÎñXMLÂß¼£¬ÈÎÎñÒÑ´æÔÚÔòÖ»´¥·¢XMLÂß¼  | 
|     #                2.²»Ìí¼ÓÈÎÎñ£¬Èç¹ûÈÎÎñ´æÔڲŴ¥·¢XMLÂß¼  | 
|       | 
|     #{ Ö°Òµ:{{µÈ¼¶:[ ´¥·¢ÈÎÎñIDÁбí] } }  | 
|     missionDist = ReadChConfig.GetEvalChConfig('LvUpTrigMissionID')  | 
|     #¸ù¾ÝÌõ¼þ¹ýÂË×Öµä  | 
|     missionJobDist = missionDist.get(curPlayer.GetJob())  | 
|       | 
|     if not missionJobDist:  | 
|         #GameWorld.ErrLog('EventResponse_LVUp, job = %s'%(curPlayer.GetJob()), curPlayer.GetID())  | 
|         return  | 
|       | 
|     missionIDList = missionJobDist.get(curPlayer.GetLV())  | 
|       | 
|     if not missionIDList:  | 
|         #GameWorld.ErrLog('EventResponse_LVUp, lv = %s'%(curPlayer.GetLV()), curPlayer.GetID())  | 
|           | 
|         # Éý¼¶Ö»´¥·¢ÈÎÎñXML£¬²»Ìí¼ÓÈÎÎñ  | 
|         __LVUpNoAddMission(curPlayer)  | 
|         return  | 
|       | 
|     #¸øÓèÈÎÎñ±ê־λ  | 
|     isGiveMission = False  | 
|       | 
|     for missionID in missionIDList:  | 
|         if curPlayer.FindMission(missionID):  | 
|             GameWorld.ErrLog('EventResponse_LVUp, hasSameMissionID = %s'%(missionID), curPlayer.GetID())  | 
|             continue  | 
|           | 
|         isGiveMission = True  | 
|           | 
|         #Ìí¼ÓÐÂÈÎÎñ¸øÍæ¼Ò  | 
|         addMission = QuestCommon.AddNewMission(curPlayer, missionID)  | 
|         NotifyOneMission(curPlayer, addMission)  | 
|       | 
|     if isGiveMission:  | 
|         #LvUp_Get_Task <n color="0,255,0" BKCOLOR="0,0,0">µÈ¼¶ÌáÉý,ÄúÓÐеÄÈÎÎñ¿É½ÓÊÜ!</n>  | 
|         PlayerControl.NotifyCode(curPlayer , "LvUp_Get_Task")  | 
|       | 
|     RunQuestEvent(curPlayer, "on_lv_up", curPlayer.GetLV(), Def_RunQuestType_RunAll)  | 
| #===============================================================================  | 
| #    #ÄÜ·ñ´¥·¢³ÇÃŻ  | 
| #    __IsGateWar(curPlayer)  | 
| #===============================================================================  | 
|     return True  | 
|   | 
| ## Éý¼¶Ö»´¥·¢ÈÎÎñXML£¬²»Ìí¼ÓÈÎÎñ  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @return None  | 
| def __LVUpNoAddMission(curPlayer):  | 
|     missionDist = ReadChConfig.GetEvalChConfig('LvUpTrigMissionNotAdd')  | 
|     #¸ù¾ÝÌõ¼þ¹ýÂË×Öµä  | 
|     lvTrigMissionList = missionDist.get(curPlayer.GetJob())  | 
|       | 
|     if lvTrigMissionList == None:  | 
|         return  | 
|       | 
|     if curPlayer.GetLV() not in lvTrigMissionList:  | 
|         return  | 
|   | 
|     RunQuestEvent(curPlayer, "on_lv_up", curPlayer.GetLV(), Def_RunQuestType_RunAll)  | 
|       | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_ͨÓûÏìÓ¦, µ¥¸öÍæ¼Ò  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param eventName Ê¼þ×ÖµäÃû  | 
| #@param fileID Ê¼þXMLÎļþÃû  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks   | 
| def EventResponse_OnAction(curPlayer, eventName, fileID):  | 
|     RunQuestEvent(curPlayer, eventName, fileID, Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| ##ÈÎÎñ´¥·¢Æ÷_ͨÓûÏìÓ¦, È«·þÍæ¼Ò  | 
| #@param eventName Ê¼þ×ÖµäÃû  | 
| #@param fileID Ê¼þXMLÎļþÃû  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks   | 
| def EventResponse_OnActionAllMapPlayer(eventName, fileID):  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|   | 
|     for i in range(0, playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(i)  | 
|           | 
|         if not curPlayer or curPlayer.IsEmpty():  | 
|             continue  | 
|   | 
|         EventResponse_OnAction(curPlayer, eventName, fileID)  | 
|   | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnHalfHour Ã¿°ëСʱ´¥·¢Ò»´Î  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnHour Ã¿Ð¡Ê±´¥·¢Ò»´Î  | 
| def EventResponse_OnHalfHour(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_halfhour", "on_halfhour", Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnHour Ã¿Ð¡Ê±´¥·¢Ò»´Î  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnHour Ã¿Ð¡Ê±´¥·¢Ò»´Î  | 
| def EventResponse_OnHour(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_hour", "on_hour", Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnDay Ã¿Ìì´¥·¢Ò»´Î  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnDay Ã¿Ìì´¥·¢Ò»´Î  | 
| def EventResponse_OnDay(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_day", "on_day", Def_RunQuestType_RunAll)  | 
|     RunQuestEvent(curPlayer, "on_day", "on_dayex", Def_RunQuestType_Normal)  | 
|       | 
|     #ÇåÉͽðÈÎÎñ½±Àø  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RunTaskAwardState % QuestCommon.Def_Mission_Type_RunDaily, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RunTaskAwardRecord % QuestCommon.Def_Mission_Type_RunDaily, 0)  | 
|     NotifyRunEndAward(curPlayer, QuestCommon.Def_Mission_Type_RunDaily)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnWeek Ã¿ÖÜ´¥·¢Ò»´Î  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnWeek Ã¿ÖÜ´¥·¢Ò»´Î  | 
| def EventResponse_OnWeek(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_week", "on_week", Def_RunQuestType_RunAll)  | 
|       | 
|     #ÇåÏÉÃËÈÎÎñ½±Àø  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RunTaskAwardState % QuestCommon.Def_Mission_Type_RunFamily, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RunTaskAwardRecord % QuestCommon.Def_Mission_Type_RunFamily, 0)  | 
|     NotifyRunEndAward(curPlayer, QuestCommon.Def_Mission_Type_RunFamily)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnLeaveFamily Íæ¼ÒÀ뿪¼Ò×å´¥·¢( ×Ô¶¯/±»¶¯ )  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnLeaveFamily Íæ¼ÒÀ뿪¼Ò×å´¥·¢( ×Ô¶¯/±»¶¯ )  | 
| def EventResponse_OnLeaveFamily(curPlayer):  | 
|     if not curPlayer.GetGameServerInitOK():  | 
|         GameServerRefresh.Set_Mission_No_ID_OnLeaveFamily(curPlayer , 1)  | 
|         return  | 
|       | 
|     RunQuestEvent(curPlayer, "on_leave_family", "on_leave_family", Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnMemberChange ¼Ò×峤±ä¸ü  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnMemberChange ¼Ò×峤±ä¸ü  | 
| def EventResponse_OnMemberChange(curPlayer):  | 
|     if not curPlayer.GetGameServerInitOK():  | 
|         GameServerRefresh.Set_Mission_No_ID_OnMemberChange(curPlayer , 1)  | 
|         return  | 
|       | 
|     GameWorld.Log('EventResponse_OnMemberChange' , curPlayer.GetID())  | 
|     RunQuestEvent(curPlayer, 'on_member_change', 'on_member_change', Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnFamily ½øÈë¼Ò×å  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnFamily ½øÈë¼Ò×å  | 
| def EventResponse_OnFamily(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_family", "on_family", Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnCreateFamily ´´½¨¼Ò×å  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnCreateFamily ´´½¨¼Ò×å  | 
| def EventResponse_OnCreateFamily(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_create_family", "on_create_family", Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnFamilyAdd ¼ÓÈë¼Ò×å  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| def EventResponse_OnFamilyAdd(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_add_family", "on_add_family", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnFamilyLVUp ¼Ò×åÉý¼¶  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| def EventResponse_OnFamilyLVUp(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_lv_up_family", "on_lv_up_family", Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnLeaveMap À뿪µØÍ¼  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnLeaveMap À뿪µØÍ¼  | 
| def EventResponse_OnLeaveMap(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_leave_map", "on_leave_map", Def_RunQuestType_Normal)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnFBTimeOut ¸±±¾Ê±¼ä½áÊø  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnFBTimeOut ¸±±¾Ê±¼ä½áÊø  | 
| def EventResponse_OnFBTimeOut(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_fb_timeout", "on_fb_timeout", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| #===============================================================================  | 
| # #¹¥»÷³ÇÃÅʼþ´¥·¢  | 
| # def EventResponse_OnAttackGate(curPlayer):  | 
| #    RunQuestEvent(curPlayer, "on_attack_gate", "on_attack_gate", Def_RunQuestType_Normal)  | 
| #    return  | 
| #===============================================================================  | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnKillEnemy »÷É±Íæ¼Òʼþ´¥·¢  | 
| #@param attackPlayer ¹¥»÷Õß  | 
| #@param deadPlayer ËÀÍöµÄÍæ¼Ò  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnKillEnemy »÷É±Íæ¼Òʼþ´¥·¢  | 
| def EventResponse_OnKillEnemy(attackPlayer, deadPlayer):  | 
|     RunQuestEvent(attackPlayer, "on_kill_enemy", "on_kill_enemy", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnEnemyKill ±»Íæ¼Ò»÷ɱʼþ´¥·¢  | 
| #@param deadPlayer ËÀÍöµÄÍæ¼Ò  | 
| #@param attackPlayer ¹¥»÷Õß  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnEnemyKill ±»Íæ¼Ò»÷ɱʼþ´¥·¢  | 
| def EventResponse_OnEnemyKill(deadPlayer, attackPlayer):  | 
|     RunQuestEvent(deadPlayer, "on_enemy_kill", "on_enemy_kill", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷vipµÈ¼¶¸Ä±ä  | 
| #@param curPlayer Íæ¼Ò  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷vipµÈ¼¶¸Ä±ä´¥·¢  | 
| def EventResponse_OnVipLvUp(curPlayer, vipLV):  | 
|     RunQuestEvent(curPlayer, "on_viplv_up", vipLV, Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| ##ÈÎÎñ´¥·¢Æ÷¹ºÂòvipÀñ°ü  | 
| #@param curPlayer Íæ¼Ò  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷vipµÈ¼¶¸Ä±ä´¥·¢  | 
| def EventResponse_BuyVIPItem(curPlayer, vipLV):  | 
|     RunQuestEvent(curPlayer, "buyvipitem", "buyvipitem", Def_RunQuestType_Normal)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_Active ÒѾÎÞʹÓÃÁË  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param typeName ÀàÐÍ  | 
| #@param missionID ÈÎÎñID  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_Active ÒѾÎÞʹÓÃÁË  | 
| def __EventResponse_Active(curPlayer, typeName, missionID):  | 
|     eventName = typeName  | 
|     fileID = typeName  | 
|     QuestsEvent = QuestManager.GetAllQuestsEvents()  | 
|     key = (eventName, "%s.xml"%str(fileID))  | 
|     if not QuestsEvent.has_key(key) :  | 
|         return False  | 
|       | 
|     curQuestList = QuestsEvent[key]  | 
|     if len(curQuestList) == 0:  | 
|         GameWorld.Log("%s Ã»Óд¥·¢!"%str(key) , curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     for event in curQuestList:  | 
|         questID = event[0]  | 
|         if questID != missionID:  | 
|             continue  | 
|   | 
|         #GameWorld.Log("Íæ¼Ò´¥·¢ÈÎÎñ: %s  - %d"%(str(key), questID) , curPlayer.GetPlayerID())      | 
|         #ÔËÐÐËùÓÐ½Úµã  | 
|         QuestRunner.RunAllQuest(curPlayer, questID, event[1].GetXMLEventLoader().GetNodeList())  | 
|         break  | 
|   | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##´¥·¢µ¥¸öËûÈË·¢²¼µÄÈÎÎñ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param curMissionPub ·¢²¼µÄÈÎÎñÊý¾Ý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ×Ô¶¨Ò庯Êý:´¥·¢µ¥¸öËûÈË·¢²¼µÄÈÎÎñ  | 
| def CheckTrigMissionPub(curPlayer, curMissionPub):  | 
|     missionID = curMissionPub.GetMissionID()  | 
|     if curPlayer.FindMission(missionID):  | 
|         #Íæ¼ÒÓÐÕâ¸öÈÎÎñ  | 
|         return  | 
|       | 
|     missinoPubType = curMissionPub.GetMissinoPubType()  | 
|       | 
|     #¼ì²é´¥·¢ÈÎÎñ·¢²¼  | 
|     if missinoPubType == IPY_GameWorld.mptFamily:  | 
|         #¼Ò×å·¢²¼  | 
|         if curPlayer.GetFamilyID() == 0:  | 
|             return  | 
|           | 
|         if curPlayer.GetFamilyID() != curMissionPub.GetPubID():  | 
|             return   | 
|           | 
|         EventResponse_OnMissionPub(curPlayer, missionID)  | 
|           | 
|     elif missinoPubType == IPY_GameWorld.mptCountry:  | 
|         #¼Ò×å·¢²¼  | 
|         if curPlayer.GetCountry() != curMissionPub.GetPubID():  | 
|             return   | 
|           | 
|         EventResponse_OnMissionPub(curPlayer, missionID)  | 
|           | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnMissionPub ËûÈË·¢²¼ÈÎÎñ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param missionID ÈÎÎñID  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnMissionPub ËûÈË·¢²¼ÈÎÎñ  | 
| def EventResponse_OnMissionPub(curPlayer, missionID):  | 
|     if not curPlayer.GetGameServerInitOK():  | 
|         GameServerRefresh.Set_Mission_Have_ID_OnMissionPub(curPlayer , missionID)  | 
|         return  | 
|       | 
|     RunQuestEvent(curPlayer, 'on_pub', missionID, Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnActive ´¥·¢GM¿ª¹ØÈÎÎñ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param missionID ÈÎÎñID  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnActive ´¥·¢GM¿ª¹ØÈÎÎñ  | 
| def EventResponse_OnActive(curPlayer, missionID):  | 
|     if not curPlayer.GetGameServerInitOK():  | 
|         GameServerRefresh.Set_Mission_Have_ID_OnActive(curPlayer , missionID)  | 
|         return  | 
|       | 
|     RunQuestEvent(curPlayer, 'on_active', missionID, Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnDeActive ¹Ø±ÕGM¿ª¹ØÈÎÎñ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param missionID ÈÎÎñID  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnDeActive ¹Ø±ÕGM¿ª¹ØÈÎÎñ  | 
| def EventResponse_OnDeActive(curPlayer, missionID):  | 
|     if not curPlayer.GetGameServerInitOK():  | 
|         GameServerRefresh.Set_Mission_Have_ID_OnDeActive(curPlayer , missionID)  | 
|         return  | 
|       | 
|     RunQuestEvent(curPlayer, 'on_deactive', missionID, Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_OnDig ÍÚ±¦½ø¶ÈÌõ½áÊøºó´¥·¢  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_OnDig ÍÚ±¦½ø¶ÈÌõ½áÊøºó´¥·¢  | 
| def EventResponse_OnDig(curPlayer):      | 
|     #Íæ¼ÒÍڵش¥·¢  | 
|     QuestRunner.InitTreasureNotifyContentList()  | 
|     #GameWorld.Log("¿ªÊ¼ÍÚµØ")  | 
|       | 
|     for i in range(0, curPlayer.GetMissionCount()):  | 
|         curMission = curPlayer.GetMissionByIndex(i)  | 
|         #Õâ¸öÈÎÎñÒѾ×öÍêÁË(-1)  »òÕß   Õâ¸öÈÎÎñ»¹Ã»ÓнÓ(0)  | 
|         if curMission.GetState() in [ChConfig.Def_Mission_State_NoAccept, ChConfig.Def_Mission_State_Over]:  | 
|             continue  | 
|   | 
|         RunQuestEvent(curPlayer, "on_dig", curMission.GetMissionID(), Def_RunQuestType_Normal)  | 
|               | 
|     treasureNotifyList = QuestRunner.GetTreasureNotifyContentList()  | 
|     #µÃµ½ÌáʾµÄ×î¸ßµÈ¼¶  | 
|     minLV = 0  | 
|     minIndex = -1  | 
|     for i in range(0, len(treasureNotifyList)):  | 
|         if minLV == 0:  | 
|             minLV = treasureNotifyList[i].LV  | 
|             minIndex = i  | 
|             continue  | 
|         if treasureNotifyList[i].LV < minLV:  | 
|             minLV = treasureNotifyList[i].LV   | 
|             minIndex = i  | 
|               | 
|     if minIndex == -1:  | 
|         #ûÓÐÍÚ±¦ÈÎÎñ  | 
|         curPlayer.Notify(0, "n")  | 
|         return  | 
|       | 
|     missionID = treasureNotifyList[minIndex].MissionID  | 
|     #Í¨ÖªÍæ¼Ò  | 
|     curPlayer.Notify(missionID, treasureNotifyList[minIndex].Content)  | 
|     #curPlayer.NotifyMiddle(missionID, QuestRunner.TreasureNotifyContentList[minIndex].Content)              | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_LVFull µ±Ç°µÈ¼¶Âú¼¶µÄʱºò´¥·¢  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_LVFull µ±Ç°µÈ¼¶Âú¼¶µÄʱºò´¥·¢  | 
| def EventResponse_LVFull(curPlayer):  | 
|     #µÃµ½NPCµÄTypeID  | 
|     #ÔËÐÐon_visitĿ¼ÏµÄ[NPCTypeID].xmlÎļþ  | 
|     questID = curPlayer.GetLV() * 100  | 
|       | 
|     return RunQuestEvent(curPlayer, "on_lv_full", questID, Def_RunQuestType_RunAll)  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_MisCollectTime Ñ¯ÎÊÊÇ·ñ¿É²É¼¯¸ÃNPC  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param curNPC NPCʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_MisCollectTime Ñ¯ÎÊÊÇ·ñ¿É²É¼¯¸ÃNPC  | 
| def EventRespons_MisCollectTime(curPlayer, curNPC):  | 
|     #µÃµ½NPCµÄTypeID  | 
|     npcTypeID = curNPC.GetNPCID()  | 
|       | 
|     #GameWorld.Log("ѯÎÊÊÇ·ñ¿É²É¼¯¸ÃNPC, NPCID %d"%(npcTypeID))  | 
|       | 
|     #ÔËÐÐon_coltime_by_idĿ¼ÏµÄ[NPCTypeID].xmlÎļþ  | 
|     RunQuestEvent(curPlayer, "on_coltime_by_id", npcTypeID, Def_RunQuestType_Normal)  | 
|       | 
|     #ÅÜ»·ÈÎÎñËæ»ú²É¼¯Ê±£¬ÎÞNPCID ÔËÐÐon_coltime_by_idĿ¼ÏµÄ0.xmlÎļþ  | 
|     RunQuestEvent(curPlayer, "on_coltime_by_id", 0, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷_MisCollectSuccess ²É¼¯½ø¶ÈÌõ½áÊøºó´¥·¢  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param curNPC NPCʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÈÎÎñ´¥·¢Æ÷_MisCollectSuccess ²É¼¯½ø¶ÈÌõ½áÊøºó´¥·¢  | 
| def EventRespons_MisCollectSuccess(curPlayer, curNPC):  | 
|     #µÃµ½NPCµÄTypeID  | 
|     npcTypeID = curNPC.GetNPCID()  | 
|       | 
|     #GameWorld.Log("²É¼¯¸ÃNPC³É¹¦, NPCID %d"%(npcTypeID))  | 
|       | 
|     #ÔËÐÐon_collect_by_idĿ¼ÏµÄ[NPCTypeID].xmlÎļþ  | 
|     RunQuestEvent(curPlayer, "on_collect_by_id", npcTypeID, Def_RunQuestType_Normal)  | 
|       | 
|     #Ëæ»ú²É¼¯  | 
|     RunDayEvent(curPlayer, "on_collect_by_id", npcTypeID, QuestCommon.Def_Collect_Npc_ID)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÈÎÎñ´¥·¢Æ÷CatchPetOK, ×¥³è³É¹¦.  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param curNPC NPCʵÀý  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ×¥³è³É¹¦  | 
| def EventRespons_CatchPetOK(curPlayer, curNPC):  | 
|     #ÔËÐÐon_catch_pet_ok_by_idĿ¼ÏµÄ[NPCTypeID].xmlÎļþ  | 
|     #RunQuestEvent(curPlayer, "on_catch_pet_ok_by_id", curNPC.GetNPCID(), Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_LearnSkill(curPlayer, skillTypeID):  | 
|     # Ñ§Ï°¼¼ÄÜ  | 
|     RunQuestEvent(curPlayer, "on_learnskill", skillTypeID, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| ##ÈÎÎñ´¥·¢Æ÷ ÅÜ»·ÈÎÎñ´¥·¢ÏÂÒ»¸öÅÜ»·ÈÎÎñ´¥·¢Ïà¹ØÊ¼þ  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param missionID ÏÂÒ»¸öÅÜ»·ÈÎÎñID  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ÈÎÎñ´¥·¢Æ÷ ÅÜ»·ÈÎÎñ´¥·¢ÏÂÒ»¸öÅÜ»·ÈÎÎñ´¥·¢Ïà¹ØÊ¼þ  | 
| def EventRespons_SetRunAround(curPlayer, missionID):  | 
|     RunQuestEvent(curPlayer, "on_run_around", missionID, Def_RunQuestType_Normal)  | 
|   | 
| ##FBʼþ´¥·¢  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param eventName Ê¼þÃû  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def EventRespons_FBEvent(curPlayer, eventName):  | 
|     RunQuestEvent(curPlayer, "fb_event", eventName, Def_RunQuestType_Normal)  | 
|   | 
|   | 
| ##Ìí¼ÓºÃÓѳɹ¦´¥·¢  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param eventName Ê¼þÃû  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def EventRespons_AddFriendSucceed(curPlayer, eventName):  | 
|     RunQuestEvent(curPlayer, "add_friend_succeed", eventName, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
|   | 
| ##buffÏûʧ´¥·¢  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param eventName Ê¼þÃû  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def EventRespons_BuffDisappear(curPlayer, eventName):  | 
|     RunQuestEvent(curPlayer, "buff_disappear", eventName, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
|   | 
| ##Ãëcd´¥·¢  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param eventName Ê¼þÃû  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def EventRespons_ClearCDTime(curPlayer, eventName):  | 
|     RunQuestEvent(curPlayer, "clear_cd_time", eventName, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
|   | 
| ##³åѨ  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param eventName Ê¼þÃû  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def EventRespons_OpenXueWei(curPlayer, eventName):  | 
|     RunQuestEvent(curPlayer, "open_xuewei", eventName, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
|   | 
| ##Íæ¼Òʼþ  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param eventName Ê¼þÃû  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def EventRespons_PlayerEvent(curPlayer, eventName):  | 
|     RunQuestEvent(curPlayer, "player_event", eventName, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
|   | 
| ##ʹÓÃÔ¶³Ì¹¦ÄÜʼþ  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param eventName Ê¼þÃû  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def EventRespons_DirectFuncEvent(curPlayer, eventName):  | 
|     RunQuestEvent(curPlayer, "direct_event", eventName, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
|   | 
| ##¹ÙÖ°(ÍþÍû)Ïà¹Ø´¥·¢  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param eventName Ê¼þÃû  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def EventRespons_PlayerPrestige(curPlayer, eventName):  | 
|     RunQuestEvent(curPlayer, "player_prestige", eventName, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| ## É̵깺ÂòÎïÆ·´¥·¢  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param itemID ÎïÆ·ID  | 
| #  @param itemCnt ÎïÆ·ÊýÁ¿  | 
| #  @return None  | 
| def EventRespons_BuyItem(curPlayer, itemID, itemCnt):  | 
|     curPlayer.SetDict(ChConfig.Def_PlayerKey_BuyItemCnt, itemCnt)  | 
|     RunQuestEvent(curPlayer, "buy_item", "buy_item_%s"%itemID, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| ## NPCËÀÍöÃþ¹ÖÂß¼  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param curNPC npcʵÀý  | 
| #  @return None  | 
| def EventRespons_OnKillByFeel(curPlayer, curNPC):  | 
|       | 
|     #µÃµ½NPCµÄTypeID  | 
|     npcTypeID = curNPC.GetNPCID()  | 
|       | 
|     #ÔËÐÐon_kill_by_feelĿ¼ÏµÄ[NPCTypeID].xmlÎļþ  | 
|     QuestRunner.SetKillNPC(curNPC)  | 
|       | 
|     RunQuestEvent(curPlayer, "on_kill_by_feel", npcTypeID, Def_RunQuestType_Normal)  | 
|       | 
|     #´¥·¢Ã¿ÈÕÈÎÎñɱ¹Ö  | 
|     RunDayEvent(curPlayer, "on_kill_by_feel", npcTypeID, QuestCommon.Def_Kill_Npc_ID)  | 
|     EventRespons_OnKillByLv(curPlayer, curNPC)  | 
|     return  | 
|   | 
| ## Íê³ÉÈÎÎñ  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param taskID ÈÎÎñid  | 
| #  @param rewardPer ½±Àø±¶Öµ°Ù·Ö±È, Èç150Ϊ1.5±¶½±Àø  | 
| #  @return None  | 
| def EventRespons_OnFinishTask(curPlayer, taskID, rewardPer=100):  | 
|     curMission = curPlayer.FindMission(taskID)  | 
|     if curMission == None:  | 
|         GameWorld.ErrLog("Íæ¼ÒÎÞ¸ÃÈÎÎñ: %s" % taskID, curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     missionState = curMission.GetState()  | 
|       | 
|     if missionState != ChConfig.Def_Mission_State_CanComplete:  | 
|         GameWorld.DebugLog("ÈÎÎñ״̬(%s)²»¿ÉÌá½»£¬²»ÄÜÍê³ÉÈÎÎñ£¡taskID=%s" % (missionState, taskID))  | 
|         return  | 
|       | 
|     curQuestData = QuestManager.FindQuest(taskID)  | 
|       | 
|     rewardPer = 100 if rewardPer <= 0 else rewardPer  | 
|     moneyType, moneyCnt = 0, 0  | 
|     # »·ÈÎÎñÖ§³Ö¶à±¶½±ÀøÁìÈ¡  | 
|     if curQuestData != None and curQuestData.Type in QuestCommon.Def_RunTask_Type_List:  | 
|         if rewardPer != 100:  | 
|             rewardCostDict = ReadChConfig.GetEvalChConfig("RunAround_MulRewardCost")  | 
|             if rewardPer not in rewardCostDict:  | 
|                 GameWorld.ErrLog("²»Ö§³Ö¸Ã¶à±¶½±Àø±ÈÀý: taskID=%s,rewardPer=%s" % (taskID, rewardPer), curPlayer.GetPlayerID())  | 
|                 return  | 
|               | 
|             moneyType, moneyCnt = rewardCostDict[rewardPer]  | 
|             if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyCnt):  | 
|                 return  | 
|               | 
|         curMission.SetProperty(QuestRunner.Def_Task_Reward_Per, rewardPer, False)  | 
|       | 
|     isOK = RunQuestEvent(curPlayer, "on_finish", taskID, Def_RunQuestType_Normal)  | 
|       | 
|     if not isOK:  | 
|         GameWorld.DebugLog("OnFinishTask Ê§°Ü£¡")  | 
|         return  | 
|       | 
|     if moneyCnt > 0:  | 
|         PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_MissionDel,   | 
|                                {"taskID":taskID, "rewardPer":rewardPer, ChConfig.Def_Cost_Reason_SonKey:taskID})  | 
|     return  | 
|   | 
| ## ¿ìËÙÍê³ÉÈÎÎñ  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param missionID ÈÎÎñid  | 
| #  @return None  | 
| def EventRespons_OnQuickFinishTask(curPlayer, missionID):  | 
|     RunQuestEvent(curPlayer, "quick_finish_task", missionID, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| ## Ò»¼üÍê³ÉËùÓл·ÈÎÎñ  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param missionID ÈÎÎñid  | 
| #  @return None  | 
| def EventRespons_OnQuickFinishAllAround(curPlayer, missionID):  | 
|     RunQuestEvent(curPlayer, "on_quick_finish_all_around", missionID, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| ## ÉèÖÃÈÎÎñÐǼ¶  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param missionID ÈÎÎñid  | 
| #  @return None  | 
| def EventRespons_OnSetMissionStar(curPlayer, missionID):  | 
|     RunQuestEvent(curPlayer, "on_set_mission_star", missionID, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| ## ÊÕ»ñ¹ûʵ  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param eventName   | 
| #  @return None  | 
| def EventRespons_OnPlantHarvest(curPlayer, eventName):  | 
|     RunQuestEvent(curPlayer, "on_plant_harvest", eventName, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| ## ¸±±¾²É¼¯NPC  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param eventName   | 
| #  @return None  | 
| def EventRespons_OnFBCollect(curPlayer, eventName):  | 
|     RunQuestEvent(curPlayer, "on_fb_collect", eventName, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| ## ¹ºÂòÈÕ³£ÈÎÎñ´ÎÊýÉÏÏÞ  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param eventName   | 
| #  @return None  | 
| def EventRespons_OnBuyDayMissionSum(curPlayer, buyNum):  | 
|     RunQuestEvent(curPlayer, "on_buy_mission_sum", buyNum, Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
|   | 
| ## ´©×°±¸´¥·¢ÅжÏËù´©³È×°ÊýÁ¿  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param eventName   | 
| #  @return None  | 
| def EventRespons_OrangeQualityCnt(curPlayer, equipcnt):  | 
|     RunQuestEvent(curPlayer, "quality_orange_cnt", equipcnt, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| ## ²¿Î»Ç¿»¯ÐǼ¶  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param eventName   | 
| #  @return None  | 
| def EventRespons_OnEquipPartStarUp(curPlayer, upstar):  | 
|     RunQuestEvent(curPlayer, "on_equippartstarup", "on_equippartstarup", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| ## ¾ôλÉý½×  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param eventName  | 
| #  @return None  | 
| def EventRespons_OnOfficialUp(curPlayer, officialLV, starIndex):  | 
|     #ÐǼ¶*100+½×¼¶  | 
|     RunQuestEvent(curPlayer, "on_officialup", starIndex*100+officialLV, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| ## Í¨¹ØÊÔÁ¶Ö®ËþµÚX²ã  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param eventName   | 
| #  @return None  | 
| def EventRespons_TrialTowerCnt(curPlayer, cnt):  | 
|     RunQuestEvent(curPlayer, "on_trialtowercnt", cnt, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| ## Í¨¹ØÌìÐÇËþµÚX²ã  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param eventName   | 
| #  @return None  | 
| def EventRespons_SkyTowerCnt(curPlayer, cnt):  | 
|     RunQuestEvent(curPlayer, "skytowerpass", cnt, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| ##»¤ËÍX´ÎÃÀÅ®   | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param eventName Ê¼þÃû  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def EventRespons_TruckCnt(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_truckcnt", "on_truckcnt", Def_RunQuestType_Normal)  | 
|       | 
| ##·Ö½âÈÎÒâX¼þ³È×°   | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param eventName Ê¼þÃû  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def EventRespons_EquipDecompose(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_equipdecompose", "on_equipdecompose", Def_RunQuestType_Normal)  | 
|     return  | 
|       | 
| def EventRespons_OnBuyNobleVIP(curPlayer, nobleType):  | 
|     # ¹ºÂò¹ó×å  | 
|     RunQuestEvent(curPlayer, "on_buy_noblevip", "on_buy_noblevip", Def_RunQuestType_Normal)  | 
|     RunQuestEvent(curPlayer, "on_buy_noblevip", nobleType, Def_RunQuestType_Normal)  | 
|     return  | 
|       | 
| def EventRespons_OnGoldInvest(curPlayer, investType):  | 
|     # °ó×êͶ×Ê  | 
|     RunQuestEvent(curPlayer, "on_goldinvest", "on_goldinvest", Def_RunQuestType_Normal)  | 
|     RunQuestEvent(curPlayer, "on_goldinvest", investType, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_OnActivatePet(curPlayer, petID):  | 
|     # ¼¤»î³èÎï  | 
|     RunQuestEvent(curPlayer, "on_activatepet", "on_activatepet", Def_RunQuestType_Normal)  | 
|     RunQuestEvent(curPlayer, "on_activatepet", petID, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_MagicWeaponLV(curPlayer, mwID, lv):  | 
|     # ·¨±¦½âËø½ø¶È  | 
|     RunQuestEvent(curPlayer, "magicweaponlv", '%s_%s'%(mwID, lv), Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| def EventRespons_MagicWeaponFBPassLV(curPlayer, mwID, lv):  | 
|     # Ä§×å·¨±¦¹Ø¿¨½ø¶È  | 
|     RunQuestEvent(curPlayer, "mwfbpasslv", '%s_%s'%(mwID, lv), Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_SuccessFinish(curPlayer, succID):  | 
|     # ÁìÈ¡Íê³É¾Í  | 
|     RunQuestEvent(curPlayer, "successfinish", succID, Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| def EventRespons_KillWorldBoss(curPlayer):  | 
|     # »÷ɱÊÀ½çBOSS  | 
|     RunQuestEvent(curPlayer, "killworldboss", 'killworldboss', Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_KillWorldBossByFeel(curPlayer):  | 
|     #ÃþÊÀ½çBOSS  | 
|     RunQuestEvent(curPlayer, "killworldbossbyfeel", 'killworldbossbyfeel', Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_SealDemon(curPlayer):  | 
|     # »ñµÃ·âħ̳110¼¶ÒÔÉÏBOSSÉ˺¦ÅÅÃûµÚÒ»  | 
|     RunQuestEvent(curPlayer, "sealdemon", "sealdemon", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_HorseMultiple(curPlayer, multiple):  | 
|     #×øÆïÎ¹ÑøX±¶±©»÷Ò»´Î  | 
|     RunQuestEvent(curPlayer, "horsemultiple", multiple, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_HorseLV(curPlayer, horselv):  | 
|     #ÈÎÒâ×øÆïµ½X¼¶  | 
|     RunQuestEvent(curPlayer, "horselv", horselv, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_FBEncourage(curPlayer, mapid):  | 
|     #¸±±¾¹ÄÎ輸´Î  | 
|     RunQuestEvent(curPlayer, "fbencourage", mapid, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_AddFriend(curPlayer, cnt):  | 
|     #ºÃÓÑÊýÁ¿  | 
|     RunQuestEvent(curPlayer, "addfriend", cnt, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_DujieFBHelp(curPlayer):  | 
|     #ÏÉÃË»¤·¨  | 
|     RunQuestEvent(curPlayer, "dujiehelp", "dujiehelp", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_DujieFBHelpPass(curPlayer):  | 
|     #¶É½ÙÖúÕ½  | 
|     RunQuestEvent(curPlayer, "dujiehelppass", "dujiehelppass", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_PassiveSet(curPlayer):  | 
|     #±»¶¯¼¼ÄÜÉèÖà  | 
|     RunQuestEvent(curPlayer, "passiveset", "passiveset", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_PlusGodWeapon(curPlayer, weaponType):  | 
|     #Éñ±ø´¸Á¶  | 
|     RunQuestEvent(curPlayer, "plusgodweapon", "plusgodweapon", Def_RunQuestType_Normal)  | 
|     RunQuestEvent(curPlayer, "plusgodweapon", weaponType, Def_RunQuestType_Normal)  | 
|     return  | 
| def EventRespons_GodWeaponUp(curPlayer, weaponType, attrLV):  | 
|     # Éñ±øÉý¼¶  | 
|     RunQuestEvent(curPlayer, "godweaponup", "%s_%s"%(weaponType, attrLV), Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_RefineItem(curPlayer, alchemyLV, alchemyItemID):  | 
|     #°ËØÔ¯Á¶µ¤  | 
|     #ÕâÁ½¸ö½Ó¿Ú²ß»®ÔÝʱ²»Óã¬ÏÈ×¢ÊÍ£¬Ê¹ÓÃеÄÁ¬Ä³¸öµ¤Ò©½Ó¿Ú  | 
|     #RunQuestEvent(curPlayer, "refineitem", alchemyLV, Def_RunQuestType_Normal)  | 
|     #RunQuestEvent(curPlayer, "refineitem", "refineitem", Def_RunQuestType_Normal)  | 
|     RunQuestEvent(curPlayer, "refineitem", alchemyItemID, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_RefineStoveUp(curPlayer, alchemyLV):  | 
|     #°ËØÔ¯ÉýÖÁX¼¶  | 
|     RunQuestEvent(curPlayer, "refinestoveup", alchemyLV, Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| def EventRespons_GetRealmPoint(curPlayer):  | 
|     #»ñµÃÐÞÐÐµã  | 
|     RunQuestEvent(curPlayer, "getrealmpoint", "getrealmpoint", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_MWSkillUp(curPlayer):  | 
|     #·¨±¦¼¼ÄÜÉý¼¶  | 
|     RunQuestEvent(curPlayer, "mwskillup", "mwskillup", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_ShopBuy(curPlayer, shopid):  | 
|     #Ö¸¶¨É̵êÂò¶«Î÷  | 
|     RunQuestEvent(curPlayer, "shopbuy", shopid, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_GetLastRunTaskAward(curPlayer, taskType):  | 
|     #ÅÜ»·×îÖÕ½±ÀøÁìÈ¡  | 
|     RunQuestEvent(curPlayer, "on_lastruntask_award", taskType, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_RunTaskAllCnt(curPlayer, tastType, allcnt):  | 
|     #µ±ÌìÒÑÍê³ÉÅÜ»·Êý  | 
|     RunQuestEvent(curPlayer, "runtaskallcnt", '%s_%s'%(tastType, allcnt), Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_RealmUp(curPlayer, realmlv):  | 
|     #¾³½çÉý¼¶  | 
|     RunQuestEvent(curPlayer, "realmup", realmlv, Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
|   | 
| def EventRespons_PassQueenRelecs(curPlayer, lineID, grade):  | 
|     #X¼¶Í¨¹ØX²ãæ´»ÊÒż£  | 
|     RunQuestEvent(curPlayer, "passqueenrelecs", '%s_%s'%(lineID, grade), Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_HorseUp(curPlayer):  | 
|     #×øÆïÉý¼¶  | 
|     RunQuestEvent(curPlayer, "horseup", "horseup", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_SuitPlus(curPlayer, cnt):  | 
|     #2½×Ç¿»¯·À¾ßÌ××°X¼þ  | 
|     RunQuestEvent(curPlayer, "suitplus", cnt, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_TrialExchange(curPlayer, costItemID):  | 
|     #×ÚÃÅÊÔÁ¶¶Ò»»×°±¸  | 
|     RunQuestEvent(curPlayer, "trialexange", costItemID, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_EquipByPlace(curPlayer, itemClassLV, equipplace):  | 
|     #´©´÷ij²¿Î»×°±¸(·ÇʱЧ)  | 
|     RunQuestEvent(curPlayer, "equipbyplace", '%s_%s'%(itemClassLV, equipplace), Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_CompoundEquip(curPlayer, itemColor, itemQuality):  | 
|     #×°±¸ºÏ³ÉijƷÖÊijÐǼ¶  | 
|     RunQuestEvent(curPlayer, "compoundequip", '%s_%s'%(itemColor, itemQuality), Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_EquipWash(curPlayer, washType, washLV):  | 
|     #×°±¸Ï´Á·ÖÁX¼¶  | 
|     RunQuestEvent(curPlayer, "equipwash", '%s_%s'%(washType, washLV), Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_AddBourseItem(curPlayer):  | 
|     #Éϼܼ¯ÊÐÎïÆ·  | 
|     RunQuestEvent(curPlayer, "addbourseitem", "addbourseitem", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_StoreDonate(curPlayer):  | 
|     #¾èÏ×ÏÉÃË×°±¸  | 
|     RunQuestEvent(curPlayer, "storedonate", "storedonate", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_EquipPlus(curPlayer, classLV, partPlusLV):  | 
|     #Ç¿»¯µÈ¼¶±ä»¯  | 
|     RunQuestEvent(curPlayer, "equipplus", "equipplus", Def_RunQuestType_Normal)  | 
|     RunQuestEvent(curPlayer, "equipplus", '%s_%s'%(classLV, partPlusLV), Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_EquipPlusEvolve(curPlayer, nextEvolveLV):  | 
|     #Ç¿»¯½ø»¯  | 
|     RunQuestEvent(curPlayer, "equipplusevolve", "equipplusevolve", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_Talk(curPlayer, eventName):  | 
|     #ƵµÀ·¢ÑÔ  | 
|     RunQuestEvent(curPlayer, "talk", eventName, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_FairyDomain(curPlayer, eventType):  | 
|     #Íê³ÉçÎç¿ÏÉÓòʼþ  | 
|     RunQuestEvent(curPlayer, "fairydomain", 'fairydomain', Def_RunQuestType_Normal)  | 
|     RunQuestEvent(curPlayer, "fairydomain", eventType, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_AroundMission(curPlayer, missionType):  | 
|     #Íê³ÉÅÜ»·ÈÎÎñ  | 
|     RunQuestEvent(curPlayer, "aroundfinish", missionType, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_Pray(curPlayer, prayType):  | 
|     #Íê³ÉÆíÔ¸  | 
|     RunQuestEvent(curPlayer, "pray", prayType, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_ThinkMagicWeapon(curPlayer):  | 
|     #¸ÐÓ¦·¨±¦  | 
|     RunQuestEvent(curPlayer, "thinkfabao", 'thinkfabao', Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_ElementSkill(curPlayer, mainSkillID, skillElementType, updSelectSkillLV):  | 
|     #¼¤»îÎåÐÐר¾« Ö÷¼¼ÄÜID_ר¾«ÀàÐÍ_¼¤»îµÈ¼¶.xml  | 
|     RunQuestEvent(curPlayer, "elementskill", '%s_%s_%s'%(mainSkillID, skillElementType, updSelectSkillLV), Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_EquipStarUp(curPlayer):  | 
|     #×°±¸ÉýÐÇ  | 
|     RunQuestEvent(curPlayer, "equipstarup", 'equipstarup', Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_InlayStone(curPlayer):  | 
|     #±¦Ê¯ÏâǶ  | 
|     RunQuestEvent(curPlayer, "inlaystone", 'inlaystone', Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_StoneChange(curPlayer):  | 
|     # ±¦Ê¯±ä¸ü  | 
|     RunQuestEvent(curPlayer, "stonechange", 'stonechange', Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_EquipItem(curPlayer):  | 
|     #´©ÍÑ×°±¸  | 
|     RunQuestEvent(curPlayer, "equipitem", 'equipitem', Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_SkillUp(curPlayer, FuncType, skillLV):  | 
|     #Éý¼¶¼¼ÄÜ  | 
|     RunQuestEvent(curPlayer, "skillup", FuncType, Def_RunQuestType_Normal)  | 
|     RunQuestEvent(curPlayer, "skillup", '%s_%s' % (FuncType, skillLV), Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_LingGenQualityUP(curPlayer, attrID, qualityLV):  | 
|     #Áé¸ùÉýÆ·  | 
|     RunQuestEvent(curPlayer, "linggenqualityup", '%s_%s' % (attrID, qualityLV), Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_AddPoint(curPlayer):  | 
|     #Áé¸ù¼Óµã  | 
|     RunQuestEvent(curPlayer, "addpoint", '0', Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_ActivityAward(curPlayer, awardIndex):  | 
|     #»îÔ¾Áì½±  | 
|     RunQuestEvent(curPlayer, "activityaward", awardIndex, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_AddActivityValue(curPlayer):  | 
|     # Ôö¼Ó»îÔ¾¶È  | 
|     RunQuestEvent(curPlayer, "addactivity", "addactivity", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_HorsePetBoss(curPlayer):  | 
|     #²Î¼ÓÆï³èBOSS  | 
|     RunQuestEvent(curPlayer, "horsepetboss", 'horsepetboss', Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_LingGenReset(curPlayer):  | 
|     #Áé¸ùÖØÖà  | 
|     RunQuestEvent(curPlayer, "linggenreset", 'linggenreset', Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_UseMissionItem(curPlayer, missionID):  | 
|     # Ê¹ÓÃÎïÆ·´¥·¢ÈÎÎñ  | 
|     RunQuestEvent(curPlayer, "usemissionitem", missionID, Def_RunQuestType_RunAll)  | 
|     return  | 
|   | 
| def EventRespons_XBXZ(curPlayer, MWID):  | 
|     # Ïɱ¦Ñ°Ö÷Áì½±  | 
|     RunQuestEvent(curPlayer, "xbxz", MWID, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_AddAuctionEquip(curPlayer, color):  | 
|     # ÉϼÜ×°±¸ÅÄÆ·  | 
|     RunQuestEvent(curPlayer, "addauctionequip", color, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_BuyAuctionEquip(curPlayer, color):  | 
|     # ¹ºÂò×°±¸ÅÄÆ·  | 
|     RunQuestEvent(curPlayer, "buyauctionequip", color, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_OnMoneyChange(curPlayer, moneyType):  | 
|     # »õ±Ò±ä¸üʱ  | 
|       | 
|     # ÔÝ¿ª·ÅÁéʯ  | 
|     if moneyType not in [IPY_GameWorld.TYPE_Price_Gold_Paper]:  | 
|         return  | 
|     RunQuestEvent(curPlayer, "onmoneychange", moneyType, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_ActivityPlace(curPlayer, event, runall=False):  | 
|     ''' »îÔ¾·ÅÖÃʼþ  | 
|     @param event: ¿ÉÆô¶¯ canstart¡¢Æô¶¯ start¡¢¿ÉÁì½± cangetreward¡¢Áì½± getreward  | 
|     '''  | 
|     RunQuestEvent(curPlayer, "activityplace", event, Def_RunQuestType_RunAll if runall else Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_ArenaBattleOver(curPlayer):  | 
|     # ÌôÕ½¾º¼¼³¡ - ½áËã²ÅËã  | 
|     RunQuestEvent(curPlayer, "arenabattleover", "arenabattleover", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| def EventRespons_ArenaHighestScore(curPlayer):  | 
|     # Ë¢Ð¾º¼¼³¡ÀúÊ·×î¸ß·Ö  | 
|     RunQuestEvent(curPlayer, "arenahighestscore", "arenahighestscore", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
|   | 
| #================================================================================  | 
| #===============================================================================  | 
| # //08 07 Íæ¼ÒÇл»µØÍ¼#tagCChangeMap  | 
| # tagCChangeMap       *   GettagCChangeMap();  | 
| #   | 
| # class   IPY_CChangeMap  | 
| # {  | 
| # public:  | 
| #    //´«Ë͵ãID  | 
| #    int      GetTransportID();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 07 Íæ¼ÒÇл»µØÍ¼#tagCChangeMap  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 07 Íæ¼ÒÇл»µØÍ¼#tagCChangeMap  | 
| def ChangeMap(index, tick):  | 
|     GameWorld.GetPsycoFunc(__Func_ChangeMap)(index, tick)  | 
|     return  | 
|   | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 07 Íæ¼ÒÇл»µØÍ¼#tagCChangeMap  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 07 Íæ¼ÒÇл»µØÍ¼#tagCChangeMap  | 
| def __Func_ChangeMap(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     changeMapPack = IPY_GameWorld.IPY_CChangeMap()  | 
|       | 
|     if PlayerChangeMap(curPlayer, changeMapPack.GetTransportID(), tick):  | 
|         return  | 
|       | 
|     #´«ËÍʧ°Ü, ÉèÖÃÍæ¼Ò¿ÉÒÔÒÆ¶¯  | 
|     curPlayer.SetCanMove(True)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| ##Íæ¼Òͨ¹ý´«Ë͵ã, ´«Ë͵ØÍ¼  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param transportID ´«Ë͵ãID  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ²¼¶ûÖµ  | 
| #@remarks Íæ¼Òͨ¹ý´«Ë͵ã, ´«Ë͵ØÍ¼  | 
| def PlayerChangeMap(curPlayer, transportID, tick):  | 
|     transport = GameWorld.GetGameData().FindTransportByID(transportID)  | 
|     if transport == None:  | 
|         #GameWorld.Log("ûÓдËÇл»µã = %s"%(transportID) , curPlayer.GetPlayerID())  | 
|         return False  | 
|   | 
|     #Çл»µØÍ¼×ø±ê¾àÀë  | 
|     dist = GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), transport.GetPosX(), transport.GetPosY())  | 
|     #²»ÔÚÇл»µã·¶Î§ÄÚ  | 
|     if dist > transport.GetRange() + 16:  | 
| #    if curPlayer.GetPosX() < transport.GetPosX()-dist or curPlayer.GetPosX() > transport.GetPosX()+dist or curPlayer.GetPosY() < transport.GetPosY()-dist or curPlayer.GetPosY() > transport.GetPosY()+dist:  | 
|         #GameWorld.Log("Íæ¼Ò²»ÔÚÇл»µãÄÚ" , curPlayer.GetPlayerID())  | 
|         curPlayer.ResetPos(curPlayer.GetPosX(), curPlayer.GetPosY())  | 
|         GameWorld.GodLog(curPlayer, '´«Ë͵ã¾àÀë¹ýÔ¶ = %s, Range = %s'%(dist, transport.GetRange()))  | 
|         return False  | 
|   | 
|     #ÔÚÇл»µã·¶Î§ÄÚ£¬Çл»µØÍ¼  | 
|     mapID = transport.GetTargetMapID()  | 
|     targetPosX = transport.GetTargetPosX()  | 
|     targetPosY = transport.GetTargetPosY()  | 
|       | 
|     if not PlayerControl.CanEnterMap(curPlayer, mapID):  | 
|         #Íæ¼Ò²»¿É½øÈë¸Ã³¡¾°  | 
|         return False  | 
|   | 
| #    #Ìí¼ÓÓÐÏÞÎÞµÐBUFF  | 
| #    SkillCommon.AddBuffBySkillType(curPlayer, ChConfig.Def_SkillID_LimitSuperBuff, tick)  | 
|     #2. Íæ¼ÒÇл»µØÍ¼£¨µØÍ¼ID£¬X£¬Y£©  | 
|     curTruck = curPlayer.GetTruck()  | 
|     if curTruck:  | 
|         isTakeTruck = curTruck.GetMode() != IPY_GameWorld.trmStop  | 
|     else:  | 
|         isTakeTruck = False  | 
|           | 
|     PlayerControl.PlayerResetWorldPos(curPlayer, mapID, targetPosX, targetPosY, isTakeTruck, canLock = False)  | 
|     return True  | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 0A ½áÊøÊ¼þ#tagCCancelEvent  | 
| # tagCCancelEvent       *   GettagCCancelEvent();  | 
| #   | 
| # class   IPY_CCancelEvent  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetType();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 0A ½áÊøÊ¼þ#tagCCancelEvent  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 0A ½áÊøÊ¼þ#tagCCancelEvent  | 
| def ExitEvent(index, tick):  | 
|     GameWorld.GetPsycoFunc(__Func_ExitEvent)(index, tick)  | 
|     return  | 
|   | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 0A ½áÊøÊ¼þ#tagCCancelEvent  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 0A ½áÊøÊ¼þ#tagCCancelEvent  | 
| def __Func_ExitEvent(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     DoExitEvent(curPlayer)  | 
|     #¸±±¾À뿪ʼþ  | 
|     FBLogic.OnExitEvent(curPlayer, tick)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| #°Ñµ±Ç°ÈÎÎñ֪ͨ¸ø¿Í»§¶Ë  | 
| #/**ÈÎÎñ״̬¶¨Òå*/  | 
| #enum        TMissionState  | 
| #{  | 
| #    msNoMission = 0,    ///<δ½Ó  | 
| #    msProcessing,       ///<½øÐÐÖÐ  | 
| #    msCanComplete,      ///<¿ÉÌá½»  | 
| #    msComplete,         ///<ÒÑÍê³É  | 
| #    msFail,             ///<ʧ°Ü  | 
| #    msNoExist,          ///<æô³µ²»´æÔÚ  | 
| #};  | 
| #ÌØÊâÈÎÎñ״̬¶¨Òå:   | 
| #0 : Î´½Ó  | 
| #-1: ÒÑÍê³É  | 
| #-2: æô³µ¶ªÊ§  | 
| #-3: æô³µ±»´òÀÃ  | 
| #-4: ÈÎÎñδ´ïµ½¿É½Ó״̬  | 
| #-5: ÈÎÎñ¿ÉÌá½»  | 
|           | 
| ##ˢе¥¶ÀµÄÈÎÎñ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param curMission ÈÎÎñʵÀý  | 
| #@param isFirstLogin ÊÇ·ñµÚÒ»´ÎµÇ½  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks Ë¢Ðµ¥¶ÀµÄÈÎÎñ  | 
| def NotifyOneMission(curPlayer, curMission, isFirstLogin = False, isNotifyAll = True):  | 
|     #state = curMission.GetState()  | 
|       | 
|     #֪ͨÈÎÎñ×Öµä  | 
|     if isNotifyAll:  | 
|         curMission.Notify_AllProperty()  | 
|       | 
|     #з½Ê½: Ë¢ÐÂÕâ¸ö  | 
|     QuestRunner.RefreshMission(curPlayer, curMission)  | 
|           | 
| #    GameWorld.Log("state = %d"%state)  | 
| #    missionState = curMission.GetMissionState()  | 
| #    lastMissionState = missionState  | 
| #    taskID = curMission.GetMissionID()  | 
| #      | 
| #    if QuestManager.FindQuest(taskID) == None:  | 
| #        GameWorld.Log("ÈÎÎñID = %d Ã»ÓÐÈÎÎñÃèÊö!"%taskID)  | 
| #        return  | 
| #  | 
| #    questData = QuestManager.FindQuest(taskID)  | 
| #    taskName = questData.Name  | 
| #      | 
| #    if taskName == "":  | 
| #        #GameWorld.Log("ÈÎÎñÃû³Æ = ¿Õ")  | 
| #        return  | 
| #      | 
| #    parentID = 0  | 
| #    if state == -1:  | 
| #        missionState = IPY_GameWorld.msComplete  | 
| #    if state == -4:  | 
| #        missionState = IPY_GameWorld.msNoExist  | 
| #          | 
| #    if missionState == IPY_GameWorld.msNoMission and state != 0:  | 
| #        missionState = IPY_GameWorld.msProcessing  | 
| #          | 
| #    curMission.SetMissionState(missionState)  | 
| #      | 
| #    if questData.Type == 8 and state == 0:  | 
| #        #ÈÎÎñÀàÐÍ:8 ÎªÓÂÕßÈÎÎñ(¾íÖáÈÎÎñ), ²»Í¨Öª¸ø¿Í»§¶Ë  | 
| #        return  | 
| #      | 
| #      | 
| #      | 
| #    if state == 0:  | 
| #        #״̬µÈÓÚ0, Ö»ÏÔʾµÆ  | 
| ##        GameWorld.Log("״̬µÈÓÚ0, Ö»ÏÔʾµÆ")  | 
| #        QuestRunner.ShowMissionLight(curPlayer, curMission)  | 
| #          | 
| #        #ÔÚÈÎÎñ²éѯÖÐÌí¼ÓÕâ¸öÈÎÎñ  | 
| #        QuestRunner.NotifyNewQuestInfo(curPlayer, curMission)  | 
| #        return  | 
| #      | 
| #    if not isFirstLogin and lastMissionState == missionState:  | 
| #        #GameWorld.Log("lastMissionState = %d  curMissionState = %s"%(lastMissionState, missionState))  | 
| #        GameWorld.Log("Íæ¼Òµ±Ç°ÈÎÎñ¸üÐÂ, ÃèÊö²»±ä")  | 
| #        return  | 
| #    GameWorld.Log("Íæ¼Òµ±Ç°ÈÎÎñ: %s, state = %d"%(taskName, state))  | 
| #      | 
| #      | 
| #    #if questData.Invisible == 0 or missionState !=:  | 
| #    #    #Èç¹ûÈÎÎñΪÒþ²ØÈÎÎñ, Ôò²»ÏÔʾ¸ø¿Í»§¶Ë¿´µ½  | 
| #    taskType = QuestManager.FindQuest(taskID).Type  | 
| #    curPlayer.NotifyTaskInfo(taskType, questData.NameCode, taskID, parentID, missionState)  | 
| #      | 
| #          | 
| #    if state == -1 or state == -4:  | 
| #        #ÈÎÎñIDΪ-1»òÕß-4, ±íʾÈÎÎñÒѾÍê³É, ²»ÐèÒª½øÒ»²½ÏÔʾÈÎÎñÏêϸÇé¿ö  | 
| #        curPlayer.Sync_ClearMapMissionLight(taskID)  | 
| #        return  | 
| #          | 
| #  | 
| #      | 
| #    #·¢ËÍËùÓÐÈÎÎñ×·×ÙÐÅÏ¢  | 
| #    QuestRunner.ShowMissionInfo(curPlayer, curMission, -1)  | 
| #  | 
| #    #·¢ËÍËùÓеƵÄÐÅÏ¢  | 
| #    QuestRunner.ShowMissionLight(curPlayer, curMission)  | 
|   | 
| #---------------------------------------------------------------------      | 
| ##°ÑÍæ¼Òµ±Ç°µÄËùÓÐÈÎÎñ·¢Ë͸ø¿Í»§¶Ë, Èç¹ûÍæ¼ÒÊǵÚÒ»´ÎµÇ¼, °ÑËùÓÐÈÎÎñ·¢¸ø¿Í»§¶Ë     | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param isFirstLogin ÊÇ·ñµÚÒ»´ÎµÇ½  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks °ÑÍæ¼Òµ±Ç°µÄËùÓÐÈÎÎñ·¢Ë͸ø¿Í»§¶Ë, Èç¹ûÍæ¼ÒÊǵÚÒ»´ÎµÇ¼, °ÑËùÓÐÈÎÎñ·¢¸ø¿Í»§¶Ë     | 
| def NotifyAllQuestDetail(curPlayer, isFirstLogin = False):  | 
|     notifyMissionList = []  | 
|     for i in range(0, curPlayer.GetMissionCount()):  | 
|         curMission = curPlayer.GetMissionByIndex(i)  | 
|         notifyMissionList.append(curMission)  | 
|       | 
|     for curMission in notifyMissionList:  | 
|         #ÔÚ֪ͨÈÎÎñµÄʱºò, »áɾ³ýÈÎÎñ, ËùÒÔÒªÖØ½¨Ò»´ÎÁÐ±í  | 
|         NotifyOneMission(curPlayer, curMission, isFirstLogin)  | 
|           | 
|     return  | 
|   | 
| #ÈÎÎñÃèÊö  | 
| #def GetTaskDetail(index, tick):  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #    sendPack = IPY_GameWorld.IPY_CGetTaskDetail()  | 
| #    sendTaskID = sendPack.GetTaskID()  | 
| #    curTask = curPlayer.FindMission(sendTaskID)  | 
| #    if curTask == None:  | 
| #        GameWorld.Log("ûÓÐÕâ¸öÈÎÎñ%d"%sendTaskID)  | 
| #        return   | 
| #  | 
| #    descriptionIndex = 0  | 
| #    state = curTask.GetState()  | 
| #    questDescriptionList = QuestManager.FindQuest(sendTaskID).QuestDescriptionList  | 
| #      | 
| #    rewardNode = None  | 
| #    if state == -1 or state ==0:  | 
| #        #ÈÎÎñÒѾÍê³É/ûÓнӣ¬ Ã»Óн±Àø½Úµã  | 
| #        descriptionIndex = len(questDescriptionList) - 1  | 
| #        questDescs = QuestManager.GetQuestDescriptions()  | 
| #        if questDescs.has_key(sendTaskID):  | 
| #            detail = questDescs[sendTaskID]  | 
| #    else:  | 
| #        descriptionIndex = curTask.GetDescriptionIndex()  | 
| #        #µÃµ½ÈÎÎñ½±Àø, Æ´½Ó  | 
| #        rewardNode = QuestRunner.GetRewardNode(curPlayer, curTask)  | 
| #        #ÈÎÎñÃèÊöÌæ»»  | 
| #        detail = questDescriptionList[descriptionIndex].Msg   | 
| #        if detail == "":  | 
| #            return  | 
| #          | 
| #          | 
| #        if rewardNode != None:  | 
| #            #ÈÎÎñÃèÊöÓëÈÎÎñ½±ÀøÌæ»»  | 
| #            #detail = detail + QuestRunner.ReplaceNPCTalkText(curPlayer, curTask, rewardNode.FindChildNode("msg").GetXML())  | 
| #            detail = "%s %s"%(detail, rewardNode.FindChildNode("msg").GetAttribute("code"))  | 
| #    curPlayer.NotifyTaskDetail(sendPack.GetType(), curTask, detail)  | 
| #    return  | 
|   | 
| #############################################################  | 
| ##»Ø¾ø×°±¸¼Ó¹¤·â°ü  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param funcAnswer ÏìÓ¦µÄʼþ  | 
| #@return ÎÞ  | 
| #@remarks »Ø¾ø×°±¸¼Ó¹¤·â°ü  | 
| def SyncMakeItemRefuse(curPlayer, funcAnswer):  | 
|     answerDict = {  | 
|                   'EquipAddStar' : ShareDefine.Def_mitLVUpStar, #ÉýÐÇ  | 
|                   }  | 
|     answerType = answerDict.get(funcAnswer)  | 
|       | 
|     if answerType == None:  | 
|         return  | 
|        | 
|     curPlayer.Sync_MakeItemAnswer(answerType, ChConfig.Def_ComposeState_None)  | 
|       | 
| #---------------------------------------------------------------------  | 
| ##Ô¶³ÌÖ´ÐÐNPC¹¦ÄÜ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param responseType Ê¼þÏìÓ¦ÀàÐÍ  | 
| #@param funcAnswer ÏìÓ¦µÄʼþ  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÊÇ·ñÖ´Ðгɹ¦  | 
| #@remarks Ô¶³ÌÖ´ÐÐNPC¹¦ÄÜ  | 
| def FuncDirectCall(curPlayer, responseType, funcAnswer, tick, clientData=None):  | 
|     #Ô¶³Ìʼþ,״̬ͳһÅÐ¶Ï  | 
|     if not FunctionNPCCommon.CheckPlayerCanStateEvent(curPlayer):  | 
|         #Í˳ö»Ø°ü  | 
|         SyncMakeItemRefuse(curPlayer, funcAnswer)  | 
|         return  | 
|       | 
|     callFunc = GameWorld.GetExecFunc(EventSrc, "%s.%s"%(responseType, funcAnswer))  | 
|       | 
|     if callFunc == None:  | 
|         #º¯Êýµ÷Óò»¿ÉʹÓà  | 
|         GameWorld.Log("¹¦ÄÜ»ØÓ¦Ê¼þÏìÓ¦ %s %s²»¿ÉʹÓÃ"%(responseType, funcAnswer) , curPlayer.GetPlayerID())  | 
|         #Í˳ö»Ø°ü  | 
|         SyncMakeItemRefuse(curPlayer, funcAnswer)  | 
|         return  | 
|       | 
|     if clientData:  | 
|         return GameWorld.GetPsycoFunc(callFunc)(curPlayer, clientData, tick)  | 
|       | 
|     return GameWorld.GetPsycoFunc(callFunc)(curPlayer, tick)  | 
| #---------------------------------------------------------------------  | 
| ## NPC¶Ô»°Ö´ÐÐNPC¹¦ÄÜ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param funcAnswer ÏìÓ¦µÄʼþ  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÊÇ·ñÖ´Ðгɹ¦  | 
| #@remarks NPC¶Ô»°Ö´ÐÐNPC¹¦ÄÜ  | 
| def FuncCall(curPlayer, funcAnswer, tick):  | 
|     tagObj = curPlayer.GetActionObj()  | 
|       | 
|     if tagObj == None:  | 
|         #ûÓÐÄ¿±ê  | 
|         GameWorld.Log("FuncCall -> Ã»ÓÐÄ¿±ê" , curPlayer.GetPlayerID())  | 
|         return  | 
|               | 
|     if tagObj.GetGameObjType() != IPY_GameWorld.gotNPC:  | 
|         #̸»°¶ÔÏó²»¶Ô  | 
|         GameWorld.Log("FuncCall -> Ì¸»°¶ÔÏó²»¶Ô" , curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     curNPC = GameWorld.GetNPCManager().GetNPCByIndex(tagObj.GetIndex())  | 
|       | 
|     if curNPC == None:  | 
|         #ûÓÐÕâ¸öNPC  | 
|         GameWorld.Log("FuncCall ->ûÓÐÕâ¸öNPC" , curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     responseType = "Func_%d"%curNPC.GetFunctionType()  | 
|       | 
|     if not responseType:  | 
|         return  | 
|       | 
|     callFunc = GameWorld.GetExecFunc(EventSrc, "%s.%s"%(responseType, funcAnswer))  | 
|       | 
|     if callFunc == None:  | 
|         #º¯Êýµ÷Óò»¿ÉʹÓà  | 
|         GameWorld.Log("FuncCall ->¹¦ÄÜ»ØÓ¦Ê¼þÏìÓ¦ %s %s²»¿ÉʹÓÃ"%(responseType, funcAnswer) , curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     return GameWorld.GetPsycoFunc(callFunc)(curPlayer, tick)  | 
| #---------------------------------------------------------------------  | 
| #    //08 11 ÌØÊâÈÎÎñ½á¹û#tagEndSpecialEvent  | 
| #  | 
| #    struct  tagEndSpecialEvent  | 
| #    {  | 
| #        tagHead     Head;  | 
| #        BYTE        Type;       //1. ¿ªÊ¼´òÔì 2. ¿ªÊ¼¼ø¶¨ 3. ...  | 
| #    };  | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 0B ´òÔìÎïÆ·#tagCMakeItem  | 
| # tagCMakeItem       *   GettagCMakeItem();  | 
| #   | 
| # class   IPY_CMakeItem  | 
| # {  | 
| # public:  | 
| #    //´òÔìµÄÎïÆ·ID  | 
| #    int      GetMakeItemID();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 0B ´òÔìÎïÆ·#tagCMakeItem  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 0B ´òÔìÎïÆ·#tagCMakeItem  | 
| def MakeItem(index, tick):  | 
|     return  | 
|   | 
| #===============================================================================  | 
| # //08 19 ´òÔì×°±¸#tagCBuildEquip  | 
| # int GetBuildID(); //´òÔìID  | 
| # int GetItem1Count(); //ʹÓÃÎïÆ·1¸öÊý  | 
| # int GetItem2Count(); //ʹÓÃÎïÆ·2¸öÊý  | 
| # int GetItem3Count(); //ʹÓÃÎïÆ·3¸öÊý  | 
| # int GetItem4Count(); //ʹÓÃÎïÆ·4¸öÊý  | 
| # int GetItem5Count(); //ʹÓÃÎïÆ·5¸öÊý  | 
| # int GetItem6Count(); //ʹÓÃÎïÆ·6¸öÊý  | 
| # int GetBuildMode(); //´òÔìģʽ£¬Ä¿Ç°ÓУºÄ¬ÈÏ£¬°ó¶¨£¬·Ç°ó¶¨´òÔìģʽ  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 19 ´òÔì×°±¸#tagCBuildEquip  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 19 ´òÔì×°±¸#tagCBuildEquip  | 
| def BuildEquip(index, tick):  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #    FuncDirectCall(curPlayer, "Func_102", "BuildEquip", tick)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 03 Íæ¼Ò¹ºÂòÎïÆ·#tagCBuyItemList  | 
| # tagCBuyItemList       *   GettagCBuyItemList();  | 
| #   | 
| # class   IPY_CBuyItemList  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetBuyItemIndex();  | 
| #    //¹ºÂòÊýÁ¿  | 
| #    int      GetBuyCount();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 03 Íæ¼Ò¹ºÂòÎïÆ·#tagCBuyItemList  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 03 Íæ¼Ò¹ºÂòÎïÆ·#tagCBuyItemList  | 
| def BuyItem(index, tick):  | 
|     #µÃµ½Íæ¼ÒµÄ¶ÔÏó  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|   | 
|     result = FuncDirectCall(curPlayer, "FunctionNPCCommon", "BuyItem", tick)  | 
|   | 
|     if result:  | 
|         PlayerControl.NotifyCode(curPlayer, "BuyResSucceed")  | 
|           | 
|     return  | 
|   | 
|   | 
| #===============================================================================  | 
| # //A2 03 »Ø¹ºÎïÆ· #tagCMBuyItemBack  | 
| #   | 
| # struct tagCMBuyItemBack  | 
| # {  | 
| #    tagHead    Head;  | 
| #    BYTE    Index;    //±³°üλÖÃË÷Òý  | 
| # };  | 
| #===============================================================================  | 
| ## »Ø¹ºÎïÆ·  | 
| #  @param None  | 
| #  @return None  | 
| def BuyItemBack(index, clientPack, tick):  | 
|     #µÃµ½Íæ¼ÒµÄ¶ÔÏó  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|   | 
|     FunctionNPCCommon.BuyItemBack(curPlayer, clientPack, tick)  | 
|   | 
|     return  | 
|   | 
|   | 
| #===============================================================================  | 
| # //0E 04 Íæ¼Ò¼ø¶¨ÎïÆ·#tagCShopIdentifyItem  | 
| # tagCShopIdentifyItem       *   GettagCShopIdentifyItem();  | 
| #   | 
| # class   IPY_CShopIdentifyItem  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetTYPE();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0E 04 Íæ¼Ò¼ø¶¨ÎïÆ·#tagCShopIdentifyItem  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0E 04 Íæ¼Ò¼ø¶¨ÎïÆ·#tagCShopIdentifyItem  | 
| def IdentifyItem(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //12 01 ´ò¿ªÐżþ#tagCOpenLetter  | 
| # tagCOpenLetter       *   GettagCOpenLetter();  | 
| #   | 
| # class   IPY_COpenLetter  | 
| # {  | 
| # public:  | 
| #    //ÐżþID  | 
| #    char *      GetMailID();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//12 01 ´ò¿ªÐżþ#tagCOpenLetter  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//12 01 ´ò¿ªÐżþ#tagCOpenLetter  | 
| def OpenLetter(index, tick):  | 
|     #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #FuncCall(curPlayer, "OpenLetter", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //12 02 ·¢ËÍÐżþ#tagCSendMail  | 
| # tagCSendMail       *   GettagCSendMail();  | 
| #   | 
| # class   IPY_CSendMail  | 
| # {  | 
| # public:  | 
| #    //Ä¿±êÃû³Æ  | 
| #    char *      GetTagName();  | 
| #    //Ö÷Ìâ  | 
| #    char *      GetTitle();  | 
| #   | 
| #    int      GetContentLen();  | 
| #    //size = ContentLen  | 
| #    char *      GetContent();  | 
| #    //Òø×Ó  | 
| #    int      GetMoney();  | 
| #    //ÀàÐÍ: TLetterType, ×Ô¼º¸¶·Ñ, ¶Ô·½¸¶·Ñ  | 
| #    int      GetLetterType();  | 
| #    //·¢ËÍÎïÆ·ÊýÁ¿  | 
| #    int      GetItemCount();  | 
| #    //size = ItemCount  | 
| #    int      GetItem(int index);  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//12 02 ·¢ËÍÐżþ#tagCSendMail  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//12 02 ·¢ËÍÐżþ#tagCSendMail  | 
| def SendLetter(index, tick):  | 
|     #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #FuncCall(curPlayer, "SendLetter", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //12 05 ÍËÐÅ#tagCReturnMail  | 
| # tagCReturnMail       *   GettagCReturnMail();  | 
| #   | 
| # class   IPY_CReturnMail  | 
| # {  | 
| # public:  | 
| #   | 
| #    char *      GetMailID();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//12 05 ÍËÐÅ#tagCReturnMail  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//12 05 ÍËÐÅ#tagCReturnMail  | 
| def ReturnLetter(index, tick):  | 
|     #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #FuncCall(curPlayer, "ReturnLetter", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //12 06 É¾³ýÐżþ#tagCDeleteMail  | 
| # tagCDeleteMail       *   GettagCDeleteMail();  | 
| #   | 
| # class   IPY_CDeleteMail  | 
| # {  | 
| # public:  | 
| #   | 
| #    char *      GetMailID();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//12 06 É¾³ýÐżþ#tagCDeleteMail  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//12 06 É¾³ýÐżþ#tagCDeleteMail  | 
| def DeleteLetter(index, tick):  | 
|     #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #FuncCall(curPlayer, "DeleteLetter", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //12 07 ÖÃΪ±£´æ#tagCSaveMail  | 
| # tagCSaveMail       *   GettagCSaveMail();  | 
| #   | 
| # class   IPY_CSaveMail  | 
| # {  | 
| # public:  | 
| #   | 
| #    char *      GetMailID();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//12 07 ÖÃΪ±£´æ#tagCSaveMail  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//12 07 ÖÃΪ±£´æ#tagCSaveMail  | 
| def SaveLetter(index, tick):  | 
|     #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #FuncCall(curPlayer, "SaveLetter", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //12 03 ÌáÈ¡ÐżþµÄÇ®#tagCGetMailMoney  | 
| # tagCGetMailMoney       *   GettagCGetMailMoney();  | 
| #   | 
| # class   IPY_CGetMailMoney  | 
| # {  | 
| # public:  | 
| #   | 
| #    char *      GetMailID();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//12 03 ÌáÈ¡ÐżþµÄÇ®#tagCGetMailMoney  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//12 03 ÌáÈ¡ÐżþµÄÇ®#tagCGetMailMoney  | 
| def GetLetterMoney(index, tick):  | 
|     #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #FuncCall(curPlayer, "GetLetterMoney", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //12 04 ÌáÈ¡ÐżþÎïÆ·#tagCGetMailItem  | 
| # tagCGetMailItem       *   GettagCGetMailItem();  | 
| #   | 
| # class   IPY_CGetMailItem  | 
| # {  | 
| # public:  | 
| #   | 
| #    char *      GetMailID();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//12 04 ÌáÈ¡ÐżþÎïÆ·#tagCGetMailItem  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//12 04 ÌáÈ¡ÐżþÎïÆ·#tagCGetMailItem  | 
| def GetLetterItem(index, tick):  | 
|     #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #FuncCall(curPlayer, "GetLetterItem", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 05 Íæ¼ÒÐÞÀíÎïÆ·#tagCShopRepairItem  | 
| # tagCShopRepairItem       *   GettagCShopRepairItem();  | 
| #   | 
| # class   IPY_CShopRepairItem  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetPackType();  | 
| #   | 
| #    int      GetItemIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 05 Íæ¼ÒÐÞÀíÎïÆ·#tagCShopRepairItem  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 05 Íæ¼ÒÐÞÀíÎïÆ·#tagCShopRepairItem  | 
| def RepairItem(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     FuncDirectCall(curPlayer, "FunctionNPCCommon", "RepairItem", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 06 ÂôÎïÆ·#tagCPlayerSellItem  | 
| # tagCPlayerSellItem       *   GettagCPlayerSellItem();  | 
| #   | 
| # class   IPY_CPlayerSellItem  | 
| # {  | 
| # public:  | 
| #    //±³°üÀàÐÍ  | 
| #    int      GetPackType();  | 
| #    //ÎïÆ·Ë÷Òý  | 
| #    int      GetItemIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 06 ÂôÎïÆ·#tagCPlayerSellItem  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 06 ÂôÎïÆ·#tagCPlayerSellItem  | 
| def SellItem(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|   | 
|     result = FuncDirectCall(curPlayer, "FunctionNPCCommon", "SellItem", tick)  | 
|       | 
|     sendData = IPY_GameWorld.IPY_CPlayerSellItem()  | 
|     packType = sendData.GetPackType()  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 0C ºÏ³É#tagCMerge  | 
| # tagCMerge       *   GettagCMerge();  | 
| #   | 
| # class   IPY_CMerge  | 
| # {  | 
| #    int GetCompoundTimes();//ºÏ³É´ÎÊý  | 
| #    int GetIsAutoBuy();//ÊÇ·ñ×Ô¶¯¹ºÂò¸½¼Ó²ÄÁÏ  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 0C ºÏ³É#tagCMerge  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 0C ºÏ³É#tagCMerge  | 
| def MergeItem(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 0E ÎïÆ·°ó¶¨#tagCBindItem  | 
| # tagCBindItem       *   GettagCBindItem();  | 
| #   | 
| # class   IPY_CBindItem  | 
| # {  | 
| # public:  | 
| #    //°ó¶¨Ó¡¼ÇµÄindex  | 
| #    int      GetBindStoneIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 0E ÎïÆ·°ó¶¨#tagCBindItem  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 0E ÎïÆ·°ó¶¨#tagCBindItem  | 
| def BindItem(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 0F ×°±¸´ò¿×#tagCMakeHoleItem  | 
| # tagCMakeHoleItem       *   GettagCMakeHoleItem();  | 
| #   | 
| # class   IPY_CMakeHoleItem  | 
| # {  | 
| # public:  | 
| #    //ÊÇ·ñ×Ô¶¯¹ºÂò, Èç¹û×Ô¶¯¹ºÂò, ÔòÏÂÃæ×Ö¶ÎÎÞЧ  | 
| #    int      GetAutoBuyItem();  | 
| #    //·þÎñÆ÷¶Ë×Ô¼ºÕÒ´ò¿×λÖà  | 
| #    int      GetMakeHoleType();  | 
| #    //ÊÇ·ñʹÓð󶨲ÄÁÏ, Îª1ÊÇÈ«²¿ÓÃ, 0ΪֻÓò»°ó¶¨µÄ  | 
| #    int      GetIsUseBindItem();  | 
| # };  | 
| #===============================================================================  | 
| # ----->>>ÇØÊ¼»Ê°æ·â°ü, ÔÝʱ²»ÓÃ<<<-----  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 0F ×°±¸´ò¿×#tagCMakeHoleItem  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 0F ×°±¸´ò¿×#tagCMakeHoleItem  | 
| def MakeHoleItem(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 10 ×°±¸ÉýÐÇ#tagCItemLVUpStar  | 
| # tagCItemLVUpStar       *   GettagCItemLVUpStar();  | 
| #   | 
| # class   IPY_CItemLVUpStar  | 
| # {  | 
| # public:  | 
| #    //ÊÇ·ñ×Ô¶¯¹ºÂò, Èç¹û×Ô¶¯¹ºÂò, ÔòÏÂÃæ×Ö¶ÎÎÞЧ  | 
| #    int      GetAutoBuyItem();  | 
| #    //±³°üÐÇʯλÖà  | 
| #    int      GetStarStoneIndex();  | 
| #    //ÊÇ·ñʹÓ÷À±¬·û  | 
| #    int      GetUseFangBaoFu();  | 
| #    //·À±¬¸½Index  | 
| #    int      GetFangBaoFuIndex();  | 
| #    //ÊÇ·ñ×Ô¶¯¹ºÂò·À±¬·û  | 
| #    int      GetAutoBuyFangBaoFu();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦08 10 ×°±¸ÉýÐÇ#tagCItemLVUpStar  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦08 10 ×°±¸ÉýÐÇ#tagCItemLVUpStar  | 
| def ItemLVUpStar(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 11 ÏâǶ±¦Ê¯#tagCInsertStone  | 
| # tagCInsertStone       *   GettagCInsertStone();  | 
| #   | 
| # class   IPY_CInsertStone  | 
| # {  | 
| # public:  | 
| #    //±¦Ê¯Î»Öà  | 
| #    int      GetStoneIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 11 ÏâǶ±¦Ê¯#tagCInsertStone  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 11 ÏâǶ±¦Ê¯#tagCInsertStone  | 
| def InsertStone(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 12 ²ð½âÎïÆ·#tagCDepartItem  | 
| # tagCDepartItem       *   GettagCDepartItem();  | 
| #   | 
| # class   IPY_CDepartItem  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetType();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 12 ²ð½âÎïÆ·#tagCDepartItem  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 12 ²ð½âÎïÆ·#tagCDepartItem  | 
| def DepartItem(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0D 01 ºÏ³ÉÎïÆ··ÅÈë±³°ü#tagCPutItemInComposePack  | 
| # tagCPutItemInComposePack       *   GettagCPutItemInComposePack();  | 
| #   | 
| # class   IPY_CPutItemInComposePack  | 
| # {  | 
| # public:  | 
| #    //±³°üλÖà  | 
| #    int      GetItemIndex();  | 
| #    //·ÅÈëλÖà  | 
| #    int      GetMakePackIndex();  | 
| #    //·ÅÈëÊýÁ¿  | 
| #    int      GetCount();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0D 01 ºÏ³ÉÎïÆ··ÅÈë±³°ü#tagCPutItemInComposePack  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0D 01 ºÏ³ÉÎïÆ··ÅÈë±³°ü#tagCPutItemInComposePack  | 
| def PutItemInCompose(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0D 02 È¡³öºÏ³É±³°üÎïÆ·#tagCGetItemInComposePack  | 
| # tagCGetItemInComposePack       *   GettagCGetItemInComposePack();  | 
| #   | 
| # class   IPY_CGetItemInComposePack  | 
| # {  | 
| # public:  | 
| #    //ºÏ³ÉλÖà  | 
| #    int      GetComposePackIndex();  | 
| #    //ÎïÆ·Î»Öà  | 
| #    int      GetItemIndex();  | 
| #    //È¡³öÊýÁ¿  | 
| #    int      GetCount();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0D 02 È¡³öºÏ³É±³°üÎïÆ·#tagCGetItemInComposePack  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0D 02 È¡³öºÏ³É±³°üÎïÆ·#tagCGetItemInComposePack  | 
| def GetItemInCompose(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0D 03 ºÏ³É±³°üÖÐÍ϶¯ÎïÆ·#tagCMoveItemInComposePack  | 
| # tagCMoveItemInComposePack       *   GettagCMoveItemInComposePack();  | 
| #   | 
| # class   IPY_CMoveItemInComposePack  | 
| # {  | 
| # public:  | 
| #    //ÆðʼλÖà  | 
| #    int      GetSrcIndex();  | 
| #    //Ä¿±êλÖà  | 
| #    int      GetDestIndex();  | 
| #   | 
| #    int      GetCount();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0D 03 ºÏ³É±³°üÖÐÍ϶¯ÎïÆ·#tagCMoveItemInComposePack  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0D 03 ºÏ³É±³°üÖÐÍ϶¯ÎïÆ·#tagCMoveItemInComposePack  | 
| def MoveItemInCompose(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0D 04 ÎïÆ··ÅÈë×¼±¸²ð½â±³°ü#tagCPutItemInBreakPreparePack  | 
| # tagCPutItemInBreakPreparePack       *   GettagCPutItemInBreakPreparePack();  | 
| #   | 
| # class   IPY_CPutItemInBreakPreparePack  | 
| # {  | 
| # public:  | 
| #    //±³°üλÖà  | 
| #    int      GetItemIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0D 04 ÎïÆ··ÅÈë×¼±¸²ð½â±³°ü#tagCPutItemInBreakPreparePack  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0D 04 ÎïÆ··ÅÈë×¼±¸²ð½â±³°ü#tagCPutItemInBreakPreparePack  | 
| def PutItemInBreakPreparePack(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0D 05 ´Ó²ð½â×¼±¸±³°üÖÐÈ¡³ö#tagCGetBackItemInBreakPrepare  | 
| # tagCGetBackItemInBreakPrepare       *   GettagCGetBackItemInBreakPrepare();  | 
| #   | 
| # class   IPY_CGetBackItemInBreakPrepare  | 
| # {  | 
| # public:  | 
| #    //²ð½â±³°üµÄλÖà  | 
| #    int      GetBreakPrepareIndex();  | 
| #    //Íϵ½Ä¿µÄµØµÄλÖà  | 
| #    int      GetItemIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //0D 05 ´Ó²ð½â×¼±¸±³°üÖÐÈ¡³ö#tagCGetBackItemInBreakPrepare  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦ //0D 05 ´Ó²ð½â×¼±¸±³°üÖÐÈ¡³ö#tagCGetBackItemInBreakPrepare  | 
| def GetBackItemInBreakPrepare(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0D 06 ´Ó²ð½â½á¹û±³°üÖÐÈ¡³ö#tagCGetBackItemInBreakItem  | 
| # tagCGetBackItemInBreakItem       *   GettagCGetBackItemInBreakItem();  | 
| #   | 
| # class   IPY_CGetBackItemInBreakItem  | 
| # {  | 
| # public:  | 
| #    //²ð½â½á¹û±³°üλÖà  | 
| #    int      GetBreakItemIndex();  | 
| #    //È¡³öÊýÄ¿  | 
| #    int      GetCount();  | 
| #    //±³°üλÖà  | 
| #    int      GetItemIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0D 06 ´Ó²ð½â½á¹û±³°üÖÐÈ¡³ö#tagCGetBackItemInBreakItem  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0D 06 ´Ó²ð½â½á¹û±³°üÖÐÈ¡³ö#tagCGetBackItemInBreakItem  | 
| def GetBackItemInBreakItem(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0D 07 È¡³öºÏ³É½á¹û±³°ü#tagCGetItemFromResultPack  | 
| # tagCGetItemFromResultPack       *   GettagCGetItemFromResultPack();  | 
| #   | 
| # class   IPY_CGetItemFromResultPack  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetItemIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0D 07 È¡³öºÏ³É½á¹û±³°ü#tagCGetItemFromResultPack  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0D 07 È¡³öºÏ³É½á¹û±³°ü#tagCGetItemFromResultPack  | 
| def GetItemFromResultPack(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0D 08 ·ÅÈëºÏ³É½á¹û±³°ü#tagCPutInResultPack  | 
| # tagCPutInResultPack       *   GettagCPutInResultPack();  | 
| #   | 
| # class   IPY_CPutInResultPack  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetItemIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0D 08 ·ÅÈëºÏ³É½á¹û±³°ü#tagCPutInResultPack  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0D 08 ·ÅÈëºÏ³É½á¹û±³°ü#tagCPutInResultPack  | 
| def PutItemInResultPack(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0E 01 ¼ø¶¨ÎïÆ··ÅÈë±³°ü#tagCPutItemInIdentify  | 
| # tagCPutItemInIdentify       *   GettagCPutItemInIdentify();  | 
| #   | 
| # class   IPY_CPutItemInIdentify  | 
| # {  | 
| # public:  | 
| #    //±³°üλÖà  | 
| #    int      GetItemIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0E 01 ¼ø¶¨ÎïÆ··ÅÈë±³°ü#tagCPutItemInIdentify  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0E 01 ¼ø¶¨ÎïÆ··ÅÈë±³°ü#tagCPutItemInIdentify  | 
| def PutItemInIdentify(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0E 02 È¡³ö¼ø¶¨±³°üÄÚµÄÎïÆ·#tagCGetBackItemInIdentify  | 
| # tagCGetBackItemInIdentify       *   GettagCGetBackItemInIdentify();  | 
| #   | 
| # class   IPY_CGetBackItemInIdentify  | 
| # {  | 
| # public:  | 
| #    //ÎïÆ·Î»Öà  | 
| #    int      GetItemIndex();  | 
| #    //È¡³öÊýÁ¿  | 
| #    int      GetCount();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0E 02 È¡³ö¼ø¶¨±³°üÄÚµÄÎïÆ·#tagCGetBackItemInIdentify  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0E 02 È¡³ö¼ø¶¨±³°üÄÚµÄÎïÆ·#tagCGetBackItemInIdentify  | 
| def GetItemInIdentify(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0E 03 ¼ø¶¨½áÊø#tagCIdentifyOK  | 
| # tagCIdentifyOK       *   GettagCIdentifyOK();  | 
| #   | 
| # class   IPY_CIdentifyOK  | 
| # {  | 
| # public:  | 
| #    //ÎÞÒâÒå  | 
| #    int      GetType();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0E 03 ¼ø¶¨½áÊø#tagCIdentifyOK  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0E 03 ¼ø¶¨½áÊø#tagCIdentifyOK  | 
| def IdentifyOK(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 15 ²ð½âÎïÆ·±¦Ê¯#tagCBreakItemStone  | 
| # tagCBreakItemStone       *   GettagCBreakItemStone();  | 
| #   | 
| # class   IPY_CBreakItemStone  | 
| # {  | 
| # public:  | 
| #    //ÎïÆ·µÄµÚ¼¸¸ö±¦Ê¯  | 
| #    int      GetStoneIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 15 ²ð½âÎïÆ·±¦Ê¯#tagCBreakItemStone  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 15 ²ð½âÎïÆ·±¦Ê¯#tagCBreakItemStone  | 
| def DigItemStone(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 16 Ê¹ÓÃÍþ¶û¸Õ#tagCUseWeiErGangIncreaseEndure  | 
| # tagCUseWeiErGangIncreaseEndure       *   GettagCUseWeiErGangIncreaseEndure();  | 
| #   | 
| # class   IPY_CUseWeiErGangIncreaseEndure  | 
| # {  | 
| # public:  | 
| #    //Íþ¶û¸ÕλÖà  | 
| #    int      GetGangStoneIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 16 Ê¹ÓÃÍþ¶û¸Õ#tagCUseWeiErGangIncreaseEndure  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 16 Ê¹ÓÃÍþ¶û¸Õ#tagCUseWeiErGangIncreaseEndure  | 
| def UseWegAddEndure(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 27 ´«ËµÎïÆ·ºÏ³É#tagCLegendMerge  | 
| # tagCLegendMerge       *   GettagCLegendMerge();  | 
| #   | 
| # class   IPY_CLegendMerge  | 
| # {  | 
| # public:  | 
| #    //Index  | 
| #    int      GetItemIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//07 27 ´«ËµÎïÆ·ºÏ³É#tagCLegendMerge  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//07 27 ´«ËµÎïÆ·ºÏ³É#tagCLegendMerge  | 
| def LegendItemMerge(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 17 ½â³ý°ó¶¨#tagCCancelBind  | 
| # tagCCancelBind       *   GettagCCancelBind();  | 
| #   | 
| # class   IPY_CCancelBind  | 
| # {  | 
| # public:  | 
| #    //°ó¶¨Ó¡¼ÇµÄindex  | 
| #    int      GetUnBindStoneIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 17 ½â³ý°ó¶¨#tagCCancelBind  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 17 ½â³ý°ó¶¨#tagCCancelBind  | 
| def UnBindItem(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 18 Õ½»êÌ××°ºÏ³É#tagCSoulOfWarMerge  | 
| # tagCSoulOfWarMerge       *   GettagCSoulOfWarMerge();  | 
| #   | 
| # class   IPY_CSoulOfWarMerge  | 
| # {  | 
| # public:  | 
| #    //ÊÇ·ñʹÓð󶨲ÄÁÏ  | 
| #    int      GetUseBindItem();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 18 Õ½»êÌ××°ºÏ³É#tagCSoulOfWarMerge  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 18 Õ½»êÌ××°ºÏ³É#tagCSoulOfWarMerge  | 
| def SoulOfWarEquip(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 23 ÐÞÀí·¨±¦#tagCRepairFabao  | 
| # tagCRepairFabao       *   GettagCRepairFabao();  | 
| #   | 
| # class   IPY_CRepairFabao  | 
| # {  | 
| # public:  | 
| #    //·¨±¦µÄλÖà  | 
| #    int      GetFabaoIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//07 23 ÐÞÀí·¨±¦#tagCRepairFabao  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//07 23 ÐÞÀí·¨±¦#tagCRepairFabao  | 
| def RepairFaBao(index , tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 22 ÌáÁ¶·¨±¦#tagCForgeFaBao  | 
| # tagCForgeFaBao       *   GettagCForgeFaBao();  | 
| #   | 
| # class   IPY_CForgeFaBao  | 
| # {  | 
| # public:  | 
| #    //ÌáÁ¶¶àÉÙ·ÖÖÓ  | 
| #    int      GetTime();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//07 22 ÌáÁ¶·¨±¦#tagCForgeFaBao  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//07 22 ÌáÁ¶·¨±¦#tagCForgeFaBao  | 
| def ForgeFaBao(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 25 ·¨±¦ºÏ³É#tagCFaBaoMix  | 
| # tagCFaBaoMix       *   GettagCFaBaoMix();  | 
| #   | 
| # class   IPY_CFaBaoMix  | 
| # {  | 
| # public:  | 
| #    //3¸öºÏ³ÉÒ»¸ö  | 
| #    int      GetItemIndex1();  | 
| #   | 
| #    int      GetItemIndex2();  | 
| #   | 
| #    int      GetItemIndex3();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//07 25 ·¨±¦ºÏ³É#tagCFaBaoMix  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//07 25 ·¨±¦ºÏ³É#tagCFaBaoMix  | 
| def MixFaBao(index , tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 34 ·¨±¦·ÉÉý#tagCFaBaoFly  | 
| # tagCFaBaoFly       *   GettagCFaBaoFly();  | 
| #   | 
| # class   IPY_CFaBaoFly  | 
| # {  | 
| # public:  | 
| #    //Index  | 
| #    int      GetItemIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//07 34 ·¨±¦·ÉÉý#tagCFaBaoFly  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//07 34 ·¨±¦·ÉÉý#tagCFaBaoFly  | 
| def FaBaoFly(index , tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 35 Ä¨È¥·¨±¦¼¼ÄÜ#tagCFaBaoForget  | 
| # tagCFaBaoForget       *   GettagCFaBaoForget();  | 
| #   | 
| # class   IPY_CFaBaoForget  | 
| # {  | 
| # public:  | 
| #    //Index  | 
| #    int      GetItemIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//07 35 Ä¨È¥·¨±¦¼¼ÄÜ#tagCFaBaoForget  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//07 35 Ä¨È¥·¨±¦¼¼ÄÜ#tagCFaBaoForget  | 
| def FaBaoForget(index , tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 36 ·¨±¦ÈÚºÏ#tagCFaBaoMerge  | 
| # tagCFaBaoMerge       *   GettagCFaBaoMerge();  | 
| #   | 
| # class   IPY_CFaBaoMerge  | 
| # {  | 
| # public:  | 
| #    //×ó±ßÄǸö·¨±¦  | 
| #    int      GetFaBao1Index();  | 
| #    //ÓÒ±ßÄǸö·¨±¦  | 
| #    int      GetFaBao2Index();  | 
| #    //µÚÒ»¸öÎïÆ·, ºìºìµÄ¶¹×Ó  | 
| #    int      GetItem1Cnt();  | 
| #    //µÚ¶þ¸öÎïÆ·, Ô²Ô²µÄÇò  | 
| #    int      GetItem2Cnt();  | 
| #    //µÚÈý¸öÎïÆ·, ¾íÖá  | 
| #    int      GetItem3Cnt();  | 
| #    //ÊÇ·ñʹÓð󶨲ÄÁÏ  | 
| #    int      GetUseBindItem();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//07 36 ·¨±¦ÈÚºÏ#tagCFaBaoMerge  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//07 36 ·¨±¦ÈÚºÏ#tagCFaBaoMerge  | 
| def FaBaoMerge(index , tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0F 0E ¼Ò×å¾èÏ×Òø×Ó#tagCContributeSilver  | 
| def ContributeFamilyMoney(index , tick):  | 
|     # Ê¹ÓÃРA6 05  ¼Ò×å¾èÏ× #tagCMFamilyDonate  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 28 5ÐÐת»»#tagCItemChangeProperty  | 
| # tagCItemChangeProperty       *   GettagCItemChangeProperty();  | 
| #   | 
| # class   IPY_CItemChangeProperty  | 
| # {  | 
| # public:  | 
| #    //ÊÇ·ñ²ÄÁϲ»×ã×Ô¶¯¹ºÂò  | 
| #    int      GetAutoBuyStuff();  | 
| #    //ÊÇ·ñʹÓð󶨲ÄÁÏ  | 
| #    int      GetUseBindItem();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//07 28 5ÐÐת»»#tagCItemChangeProperty  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//07 28 5ÐÐת»»#tagCItemChangeProperty  | 
| def ItemChangeProperty(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 29 Áé»ê·âÓ¡#tagCItemChangeGiveSoul  | 
| # tagCItemChangeGiveSoul       *   GettagCItemChangeGiveSoul();  | 
| #   | 
| # class   IPY_CItemChangeGiveSoul  | 
| # {  | 
| # public:  | 
| #    //ÊÇ·ñ²ÄÁϲ»×ã×Ô¶¯¹ºÂò  | 
| #    int      GetAutoBuyStuff();  | 
| #    //ÊÇ·ñʹÓð󶨲ÄÁÏ  | 
| #    int      GetUseBindItem();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//07 29 Áé»ê·âÓ¡#tagCItemChangeGiveSoul  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//07 29 Áé»ê·âÓ¡#tagCItemChangeGiveSoul  | 
| def ItemChangeGiveSoul(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 30 Áé»êת»»#tagCItemChangeSoul  | 
| # tagCItemChangeSoul       *   GettagCItemChangeSoul();  | 
| #   | 
| # class   IPY_CItemChangeSoul  | 
| # {  | 
| # public:  | 
| #    //ÊÇ·ñ²ÄÁϲ»×ã×Ô¶¯¹ºÂò  | 
| #    int      GetAutoBuyStuff();  | 
| #    //ÊÇ·ñʹÓð󶨲ÄÁÏ  | 
| #    int      GetUseBindItem();  | 
| #    //ÊÇ·ñʹÓÃÁé»êʯ  | 
| #    int      GetUseIceStone();  | 
| #    //ÊÇ·ñ×Ô¶¯¹ºÂò  | 
| #    int      GetIceStoneAutoBuy();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//07 30 Áé»êת»»#tagCItemChangeSoul  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//07 30 Áé»êת»»#tagCItemChangeSoul  | 
| def ItemChangeSoul(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 31 Ç©Ãû¸Ä±äÖé#tagCItemChangeMark  | 
| # tagCItemChangeMark       *   GettagCItemChangeMark();  | 
| #   | 
| # class   IPY_CItemChangeMark  | 
| # {  | 
| # public:  | 
| #    //ÊÇ·ñʹÓð󶨲ÄÁÏ  | 
| #    int      GetUseBindItem();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//07 31 Ç©Ãû¸Ä±äÖé#tagCItemChangeMark  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//07 31 Ç©Ãû¸Ä±äÖé#tagCItemChangeMark  | 
| def ItemChangeMark(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 32 Ç©ÃûÖé#tagCItemChangeGiveMark  | 
| # tagCItemChangeGiveMark       *   GettagCItemChangeGiveMark();  | 
| #   | 
| # class   IPY_CItemChangeGiveMark  | 
| # {  | 
| # public:  | 
| #    //ÊÇ·ñʹÓð󶨲ÄÁÏ  | 
| #    int      GetUseBindItem();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//07 32 Ç©ÃûÖé#tagCItemChangeGiveMark  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//07 32 Ç©ÃûÖé#tagCItemChangeGiveMark  | 
| def ItemChangeGiveMark(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##ÖØÖñ³°üµÈ¼¶  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param addPackCnt ¿ªÆôµÈ¼¶  | 
| #@return ²¼¶ûÖµ  | 
| #@remarks ×Ô¶¨Ò庯Êý ÉèÖñ³°üµÈ¼¶  | 
| def ResetBackPack(curPlayer, addPackCnt = 1):  | 
|     packType = IPY_GameWorld.rptItem  | 
|       | 
|     #³õʼ»¯Íæ¼Ò±³°ü  | 
|     if packType not in ChConfig.Def_Type_CanBuyPack_PlayerDict.keys():  | 
|         return  | 
|       | 
|     keyName = ChConfig.Def_Type_CanBuyPack_PlayerDict.get(packType)[ChConfig.Def_PlayerPackDict_Index_Key]  | 
|       | 
|     #ÒѾ¿ªÆôµÄ±³°ü¸ñ×ÓÊý  | 
|     packCount = ChConfig.Def_PlayerFirstLoginOpenBackCnt + curPlayer.NomalDictGetProperty(keyName)  | 
|     resetPackCnt = packCount + addPackCnt  | 
|   | 
|     curPack = curPlayer.GetItemManager().GetPack(packType)  | 
|           | 
|     if resetPackCnt > curPack.GetMaxCount():  | 
|         return False  | 
|       | 
|     #ÉèÖÃÍæ¼Ò±³°üÊýÁ¿  | 
|     curPack.SetCount(resetPackCnt)  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, keyName, curPlayer.NomalDictGetProperty(keyName) + addPackCnt)  | 
|       | 
|     #³õʼ»¯Íæ¼Ò±³°ü  | 
|     PlayerControl.Init_ItemPack(curPlayer)  | 
|   | 
|     PlayerControl.NotifyCode(curPlayer, "GeRen_hwj35_149184", [addPackCnt])  | 
|     return True  | 
| #---------------------------------------------------------------------  | 
| ##ÉèÖòֿâµÈ¼¶  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@param addWarehouseCnt ²Ö¿âµÈ¼¶  | 
| #@param needNotify ÊÇ·ñÐèҪϵͳÌáʾ  | 
| #@return ²¼¶ûÖµ  | 
| #@remarks ×Ô¶¨Ò庯Êý ÉèÖòֿâµÈ¼¶  | 
| def ResetWarehouse(curPlayer, addWarehouseCnt = 1, needNotify = True):  | 
|     packType = IPY_GameWorld.rptWarehouse  | 
|     #³õʼ»¯Íæ¼Ò±³°ü  | 
|     if packType not in ChConfig.Def_Type_CanBuyPack_PlayerDict.keys():  | 
|         return  | 
|       | 
|     keyName = ChConfig.Def_Type_CanBuyPack_PlayerDict.get(packType)[ChConfig.Def_PlayerPackDict_Index_Key]  | 
|     count = ChConfig.Def_Type_CanBuyPack_PlayerDict.get(packType)[ChConfig.Def_PlayerPackDict_Index_InitCnt] + \  | 
|         curPlayer.NomalDictGetProperty(keyName) + addWarehouseCnt  | 
|   | 
|     curPack = curPlayer.GetItemManager().GetPack(packType)  | 
|           | 
|     if count > curPack.GetMaxCount():  | 
|         return False  | 
|       | 
|     #ÉèÖòֿâ¸ñ×ÓÊý  | 
|     curPack.SetCount(count)  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, keyName, curPlayer.NomalDictGetProperty(keyName) + addWarehouseCnt)  | 
|       | 
|     #³õʼ»¯²Ö¿â  | 
|     PlayerControl.Init_Warehouse(curPlayer)  | 
|       | 
|     if not needNotify:  | 
|         return True   | 
|       | 
|     PlayerControl.NotifyCode(curPlayer, "GeRen_hwj35_874335", [addWarehouseCnt])  | 
|     return True  | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0C 01 ±³°üÎïÆ··ÅÈë²Ö¿â#tagCPutItemInWarehouse  | 
| # tagCPutItemInWarehouse       *   GettagCPutItemInWarehouse();  | 
| #   | 
| # class   IPY_CPutItemInWarehouse  | 
| # {  | 
| # public:  | 
| #    //±³°üλÖà  | 
| #    int      GetItemIndex();  | 
| #    //·ÅÈëλÖà  | 
| #    int      GetWarehouseIndex();  | 
| #    //·ÅÈëÊýÁ¿  | 
| #    int      GetCount();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0C 01 ±³°üÎïÆ··ÅÈë²Ö¿â#tagCPutItemInWarehouse  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0C 01 ±³°üÎïÆ··ÅÈë²Ö¿â#tagCPutItemInWarehouse  | 
| def PutItemInWarehouse(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     FuncDirectCall(curPlayer, Def_Warehouse_FuncName, "PutItemInWarehouse", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0C 02 È¡³ö²Ö¿âÎïÆ·#tagCGetItemInWarehouse  | 
| # tagCGetItemInWarehouse       *   GettagCGetItemInWarehouse();  | 
| #   | 
| # class   IPY_CGetItemInWarehouse  | 
| # {  | 
| # public:  | 
| #    //²Ö¿âλÖà  | 
| #    int      GetWarehouseIndex();  | 
| #    //ÎïÆ·Î»Öà  | 
| #    int      GetItemIndex();  | 
| #    //È¡³öÊýÁ¿  | 
| #    int      GetCount();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0C 02 È¡³ö²Ö¿âÎïÆ·#tagCGetItemInWarehouse  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0C 02 È¡³ö²Ö¿âÎïÆ·#tagCGetItemInWarehouse  | 
| def GetItemInWarehouse(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     FuncDirectCall(curPlayer, Def_Warehouse_FuncName, "GetItemInWarehouse", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0C 03 ²Ö¿âÈ¡³ö½ðÇ®#tagCGetMoneyInWarehouse  | 
| # tagCGetMoneyInWarehouse       *   GettagCGetMoneyInWarehouse();  | 
| #   | 
| # class   IPY_CGetMoneyInWarehouse  | 
| # {  | 
| # public:  | 
| #    //½ðÇ®ÀàÐÍ  | 
| #    int      GetMoneyType();  | 
| #    //Ç®  | 
| #    int      GetMoney();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0C 03 ²Ö¿âÈ¡³ö½ðÇ®#tagCGetMoneyInWarehouse  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0C 03 ²Ö¿âÈ¡³ö½ðÇ®#tagCGetMoneyInWarehouse  | 
| def GetMoneyInWarehouse(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     FuncDirectCall(curPlayer, Def_Warehouse_FuncName, "GetMoneyInWarehouse", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0C 04 ²Ö¿â·ÅÈë½ðÇ®#tagCPutMoneyInWarehouse  | 
| # tagCPutMoneyInWarehouse       *   GettagCPutMoneyInWarehouse();  | 
| #   | 
| # class   IPY_CPutMoneyInWarehouse  | 
| # {  | 
| # public:  | 
| #    //½ðÇ®ÀàÐÍ  | 
| #    int      GetMoneyType();  | 
| #    //½ðÇ®  | 
| #    int      GetMoney();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0C 04 ²Ö¿â·ÅÈë½ðÇ®#tagCPutMoneyInWarehouse  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0C 04 ²Ö¿â·ÅÈë½ðÇ®#tagCPutMoneyInWarehouse  | 
| def PutMoneyInWarehouse(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     FuncDirectCall(curPlayer, Def_Warehouse_FuncName, "PutMoneyInWarehouse", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0C 05 ÉèÖòֿâÃÜÂë#tagCSetWarehousePsw  | 
| # tagCSetWarehousePsw       *   GettagCSetWarehousePsw();  | 
| #   | 
| # class   IPY_CSetWarehousePsw  | 
| # {  | 
| # public:  | 
| #    //µ±Ç°ÃÜÂë(¿Õ±íʾûÓÐÃÜÂë)  | 
| #    char *      GetPsw();  | 
| #    //¾ÉÃÜÂë  | 
| #    char *      GetOldPsw();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0C 05 ÉèÖòֿâÃÜÂë#tagCSetWarehousePsw  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0C 05 ÉèÖòֿâÃÜÂë#tagCSetWarehousePsw  | 
| def SetWarehousePsw(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     FuncDirectCall(curPlayer, Def_Warehouse_FuncName, "SetWarehousePsw", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0C 06 Ëø¶¨²Ö¿â#tagCSetWarehouseLock  | 
| # tagCSetWarehouseLock       *   GettagCSetWarehouseLock();  | 
| #   | 
| # class   IPY_CSetWarehouseLock  | 
| # {  | 
| # public:  | 
| #    //0: ½âËø 1:Ëø¶¨  | 
| #    int      GetIsLock();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0C 06 Ëø¶¨²Ö¿â#tagCSetWarehouseLock  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0C 06 Ëø¶¨²Ö¿â#tagCSetWarehouseLock  | 
| def SetWarehouseLock(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     FuncDirectCall(curPlayer, Def_Warehouse_FuncName, "SetWarehouseLock", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0C 07 ¿Í»§¶Ë·¢ËͲֿâÃÜÂë#tagSendWarehousePsw  | 
| # tagSendWarehousePsw       *   GettagSendWarehousePsw();  | 
| #   | 
| # class   IPY_SendWarehousePsw  | 
| # {  | 
| # public:  | 
| #   | 
| #    char *      GetPsw();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0C 07 ¿Í»§¶Ë·¢ËͲֿâÃÜÂë#tagSendWarehousePsw  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0C 07 ¿Í»§¶Ë·¢ËͲֿâÃÜÂë#tagSendWarehousePsw  | 
| def SendWarehousePsw(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     FuncDirectCall(curPlayer, Def_Warehouse_FuncName, "SendWarehousePsw", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0C 08 µÚÒ»´Î´ò¿ª²Ö¿â#tagCInitWarehousePsw  | 
| # tagCInitWarehousePsw       *   GettagCInitWarehousePsw();  | 
| #   | 
| # class   IPY_CInitWarehousePsw  | 
| # {  | 
| # public:  | 
| #    //ÃÜÂë  | 
| #    char *      GetPsw();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0C 08 µÚÒ»´Î´ò¿ª²Ö¿â#tagCInitWarehousePsw  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0C 08 µÚÒ»´Î´ò¿ª²Ö¿â#tagCInitWarehousePsw  | 
| def InitWarehousePsw(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     FuncDirectCall(curPlayer, Def_Warehouse_FuncName, "InitWarehousePsw", tick)  | 
|     DoExitEvent(curPlayer)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 10 ²Ö¿âÖØÕû#tagCWarehouseReset  | 
| # tagCWarehouseReset       *   GettagCWarehouseReset();  | 
| #   | 
| # class   IPY_CWarehouseReset  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetType();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//07 10 ²Ö¿âÖØÕû#tagCWarehouseReset  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//07 10 ²Ö¿âÖØÕû#tagCWarehouseReset  | 
| def ResetWarehouseItem(index, tick):  | 
| #===============================================================================  | 
| #    ±³°üÖØÕûºÏ²¢ 07 0F  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #    FuncCall(curPlayer, "ResetWarehouseItem", tick)  | 
| #===============================================================================  | 
|     return  | 
| #---------------------------------------------------------------------      | 
| #===============================================================================  | 
| # //07 0F ±³°üÖØÕû#tagCItemPackReset  | 
| # //¶ÔÐÔÄÜÓбȽϴóµÄÓ°Ïì  | 
| #  | 
| # struct         tagCItemPackReset  | 
| # {  | 
| #         BYTE               Type;              //±³°üÀàÐÍ  | 
| #         WORD               ItemBeginIndex;    //ÎïÆ·ÆðʼË÷Òý  | 
| #         WORD               ItemEndIndex;      //ÎïÆ·½áÊøË÷Òý  | 
| # };  | 
| #===============================================================================  | 
| ## ÎïÆ·ÖØÕû(·â°ü²ÎÊý)  | 
| #  @param index ÎïÆ·Ë÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def ResetItem(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     sendPack = IPY_GameWorld.IPY_CItemPackReset()  | 
|     sendPack_PackIndex = sendPack.GetType()  | 
|     sendPack_ItemBeginIndex = sendPack.GetItemBeginIndex()  | 
|     sendPack_ItemEndIndex = sendPack.GetItemEndIndex()  | 
|       | 
|     #·â°ü¼ì²é  | 
|     if sendPack_PackIndex not in ChConfig.Def_CanItemResetPack:  | 
|         GameWorld.ErrLog('ResetItem TypeErr = %s'%(sendPack_PackIndex), curPlayer.GetID())  | 
|         return  | 
|       | 
|     #Íæ¼Ò±³°ü¼ì²é  | 
|     rolePack = curPlayer.GetItemManager().GetPack(sendPack_PackIndex)   | 
|       | 
|     if sendPack_ItemBeginIndex < 0 or sendPack_ItemBeginIndex >= sendPack_ItemEndIndex \  | 
|             or sendPack_ItemEndIndex >= rolePack.GetCount():  | 
|         GameWorld.ErrLog('ResetItem IndexErr = %s,%s'%(sendPack_ItemBeginIndex, sendPack_ItemEndIndex), curPlayer.GetID())  | 
|         return  | 
|       | 
|     #²Ö¿â±³°üÌØÊâ´¦Àí: Ã¿´ÎÕûÀíÒ»Ò³  | 
|     #===========================================================================  | 
|     # if sendPack_PackIndex == IPY_GameWorld.rptWarehouse:  | 
|     #    #if sendPack_ItemEndIndex - sendPack_ItemBeginIndex >= ChConfig.Def_ItemReset_WarehousePageCnt:   | 
|     #    #    GameWorld.ErrLog('ResetItem WarehouseIndexErr = %s,%s'%(sendPack_ItemBeginIndex, sendPack_ItemEndIndex), curPlayer.GetID())  | 
|     #    #    return  | 
|     #      | 
|     #    #Íæ¼Òµ±Ç°×´Ì¬²»ÊÇ²Ö¿â´æÈ¡×´Ì¬  | 
|     #    if curPlayer.GetWarehouseState() != IPY_GameWorld.wsWarehouse:  | 
|     #        return  | 
|     #===========================================================================  | 
|       | 
|     #±³°üÕûÀíÂß¼  | 
|     ItemControler.ResetItem(curPlayer, sendPack_PackIndex, sendPack_ItemBeginIndex, sendPack_ItemEndIndex, tick)  | 
|     return  | 
| #---------------------------------------------------------------------     | 
| #===============================================================================  | 
| # //08 14 ³ÆºÅºÏ³É#tagCTitleMix  | 
| # tagCTitleMix       *   GettagCTitleMix();  | 
| #   | 
| # class   IPY_CTitleMix  | 
| # {  | 
| # public:  | 
| #    //×îÖÕÒªºÏ³ÉµÄ³ÆºÅ  | 
| #    int      GetTitleID();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 14 ³ÆºÅºÏ³É#tagCTitleMix  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 14 ³ÆºÅºÏ³É#tagCTitleMix  | 
| def MixTitle(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     FuncCall(curPlayer, "MixTitle", tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0C 09 ²Ö¿âÍ϶¯ÎïÆ·#tagMoveItemInWarehouse  | 
| # tagMoveItemInWarehouse       *   GettagMoveItemInWarehouse();  | 
| #   | 
| # class   IPY_MoveItemInWarehouse  | 
| # {  | 
| # public:  | 
| #    //ÆðʼλÖà  | 
| #    int      GetSrcIndex();  | 
| #    //Ä¿±êλÖà  | 
| #    int      GetDestIndex();  | 
| #   | 
| #    int      GetCount();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//0C 09 ²Ö¿âÍ϶¯ÎïÆ·#tagMoveItemInWarehouse  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//0C 09 ²Ö¿âÍ϶¯ÎïÆ·#tagMoveItemInWarehouse  | 
| def MoveItemInWarehouse(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     FuncDirectCall(curPlayer, Def_Warehouse_FuncName, "MoveItemInWarehouse", tick)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| ##ÖØ¶ÁÈÎÎñˢР | 
| #@param ÎÞ  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ÖضÁÈÎÎñˢР | 
| def DoReloadRefresh():  | 
|     #¸³Öµ  | 
|     QuestRunner.SetFindQuestFunc(QuestManager.FindQuest)  | 
|     QuestRunner.SetFunctionNPCTalk(QuestManager.GetFunctionNPCTalk())  | 
|     QuestRunner.SetFindDefaultTalkFunc(QuestManager.FindDefaultTalk)  | 
|     QuestRunner.SetQuestTrig(QuestManager.GetQuestTrig())  | 
|     QuestRunner.SetQuestDescriptions(QuestManager.GetQuestDescriptions())  | 
|     QuestRunner.SetAllQuestsEvents(QuestManager.GetAllQuestsEvents())  | 
|       | 
| #--------------------------------------×Ô¶¨Òå·½·¨  | 
| ##½áÊøÊ¼þÏìÓ¦  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ×Ô¶¨Ò庯Êý:½áÊøÊ¼þÏìÓ¦  | 
| def DoExitEvent(curPlayer):      | 
|     #ÔÊÐíÕûÀí±³°ü  | 
|     #ExitEvent() »á°Ñ״̬Çå¿Õ,Onday»á´¥·¢£¬ÐèÒª»¹Ô  | 
|     playerAction = curPlayer.GetPlayerAction()  | 
|       | 
|     curPlayer.SetForbiddenResetItem(0)  | 
|     ExitCompose(curPlayer)  | 
|     ExitWarehouse(curPlayer)  | 
|     #ExitRepair(curPlayer)  | 
|     ExitCreateFamily(curPlayer)  | 
|     ExitBillboard(curPlayer)  | 
|     #ExitEventLock(curPlayer)  | 
|     #npcÉ̵êÍ˳ö  | 
|     ExitNPCShop(curPlayer)  | 
|       | 
|     #PlayerTrade.LeaveTrade(curPlayer, 0)  | 
|     # Çå³ýpy×Ô¶¨Òå״̬  | 
|     #ClearPyPlayerAction(curPlayer)  | 
|       | 
|     #µ÷Óõײã½áÊøÊ¼þ  | 
|     #±ÜÃâ²ß»®±ä¸ü£¬µ¼ÖÂÆäËûÍ˳öËø¶¨Ê¼þʹÈÎÎñ1δ½ÓÈ¡¾ÍÍ˳öËø¶¨  | 
|     if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_Frist_Lock) != 1:  | 
|         curPlayer.ExitEvent()  | 
|       | 
|     if playerAction == IPY_GameWorld.paSit:  | 
|         #»¹Ô´ò×ø  | 
|         PlayerControl.SetIsNeedProcess(curPlayer, True)  | 
|         #Íæ¼Ò×øÏÂ  | 
|         curPlayer.Sit()  | 
|       | 
|     #GameWorld.Log("Íæ¼ÒÍ˳öËùÓÐʼþ³É¹¦" , curPlayer.GetPlayerID())  | 
|     return True  | 
|   | 
| #---------------------------------------------------------------------  | 
| ## npcÉ̵êÍ˳ö  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @return ·µ»ØÖµÎÞÒâÒå  | 
| def ExitNPCShop(curPlayer):  | 
|     # ÉèÖõ±Ç°É̵êµÄnpcidΪ0  | 
|     curPlayer.SetDict(ChConfig.Def_PlayerKey_TradeTagNPC, 0)          | 
|     return  | 
|   | 
|   | 
| ## Çå³ýpy×Ô¶¨Òå״̬  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @return ·µ»ØÖµÎÞÒâÒå  | 
| def ClearPyPlayerAction(curPlayer):  | 
|     #Çå³ýpy×Ô¶¨Òå״̬  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_PyPlayerAction, 0)        | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##½áÊø²é¿´ÅÅÐаñ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ×Ô¶¨Ò庯Êý:½áÊø²é¿´ÅÅÐаñ  | 
| def ExitBillboard(curPlayer):  | 
|     if curPlayer.GetWatchBillboardState() == 0:  | 
|         return  | 
|     curPlayer.GameServer_SetWatchBillboardState(0)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| ##½áÊø²Ö¿âʼþ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ×Ô¶¨Ò庯Êý:½áÊø²Ö¿âʼþ  | 
| def ExitWarehouse(curPlayer):  | 
|     curPlayer.SetWarehouseState(IPY_GameWorld.wsNull)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| ##½áÊø´òÔìʼþ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ×Ô¶¨Ò庯Êý:½áÊø´òÔìʼþ  | 
| def ExitCompose(curPlayer):  | 
|     curPlayer.SetComposeItemState(IPY_GameWorld.cisNull)  | 
|     return  | 
| #---------------------------------------------------------------------   | 
| ##½áÊøÐÞÀíʼþ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ×Ô¶¨Ò庯Êý:½áÊøÐÞÀíʼþ  | 
| def ExitRepair(curPlayer):  | 
|     if curPlayer.GetEventHaveFixItem() == True:  | 
|         #Ë¢ÐÂÊôÐÔ  | 
|         playerControl = PlayerControl.PlayerControl(curPlayer)  | 
|         playerControl.RefreshAllState()  | 
|         #ÖØÖÃ״̬  | 
|         curPlayer.SetEventHaveFixItem(False)  | 
|           | 
| #---------------------------------------------------------------------     | 
| ##½áÊø´´½¨¼Ò×åʼþ  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ×Ô¶¨Ò庯Êý:½áÊø´´½¨¼Ò×åʼþ  | 
| def ExitCreateFamily(curPlayer):  | 
|     PlayerFamily.SendPack_GameServer_ClearViewFamilyState(curPlayer)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 09 È¡ÏûÈÎÎñ#tagCCancelTask  | 
| # tagCCancelTask       *   GettagCCancelTask();  | 
| #   | 
| # class   IPY_CCancelTask  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetTaskID();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//08 09 È¡ÏûÈÎÎñ#tagCCancelTask  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//08 09 È¡ÏûÈÎÎñ#tagCCancelTask  | 
| def DeleteMission(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     pack = IPY_GameWorld.IPY_CCancelTask()  | 
|     missionID = pack.GetTaskID()   | 
|     curMission = curPlayer.FindMission(missionID)  | 
|       | 
|     if not curMission:  | 
|         return  | 
|       | 
|     missionState = curMission.GetState()  | 
|       | 
|     #δ½ÓÈÎÎñ»òÒÑÍê³ÉÈÎÎñ²»¿É·ÅÆú  | 
|     if missionState in [ ChConfig.Def_Mission_State_NoAccept, ChConfig.Def_Mission_State_Over ]:  | 
|         return  | 
|       | 
|     #ÒÆ¶¯Öв»Ö´Ðд˲Ù×÷  | 
|     if curPlayer.IsMoving():  | 
|         #PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_0")  | 
|         return  | 
|       | 
|     if curPlayer.GetPlayerAction()!= IPY_GameWorld.paNull:  | 
|         #ÄúÖ»ÓÐÔÚ¿ÕÏÐ״̬ÏÂ²Å¿É·ÅÆúÈÎÎñ  | 
|         PlayerControl.NotifyCode(curPlayer, "Task_cannot_Delete02")  | 
|         return  | 
|       | 
|     #if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:  | 
|     #    PlayerControl.NotifyCode(curPlayer, "GeRen_hgg_880525")  | 
|     #    return  | 
|       | 
|     curQuestData = QuestManager.FindQuest(missionID)  | 
|     if not curQuestData:  | 
|         return  | 
|       | 
|     #·ÅÆúÐüÉÍÈÎÎñ  | 
|     #if missionID == ChConfig.Def_ArrestMissionID:  | 
|     #    PlayerArrestTask.OnDeleteArrestTask(curPlayer)  | 
|       | 
|     #ÏÈÔÚÈÎÎñ±íÖÐÕÒÊý¾Ý, Èç¹ûÕÒµ½ÁË, ¾Í²»±éÀúXMLÁË  | 
|     if __DoLogic_DeleteMission(curPlayer, curMission):  | 
|         GameWorld.Log("ÔÚÈÎÎñ±íÖÐÕÒÊý¾Ý, É¾³ýÈÎÎñ = %s, ×´Ì¬ = %s"%(missionID, missionState), curPlayer.GetID())  | 
|         return  | 
|       | 
|     #GameWorld.Log("ÔÚXMLÖвéÕÒÊý¾Ý, É¾³ýÈÎÎñ = %s, ×´Ì¬ = %s"%(missionID, missionState), curPlayer.GetID())  | 
|     #ɾ³ý±íÖÐÎÞ, ¾Í¶ÁXML( ÕâÀïµÄÈÎÎñÓ¦¸Ã¶¼ÊÇȫͼÈÎÎñ, ÈçÿÈÕÈÎÎñ )  | 
|     RunQuestEvent(curPlayer, "on_delete", missionID, Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| ##¶ÁÊý¾Ý¿âÈÎÎñɾ³ý±í, É¾³ýÈÎÎñ  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param curMission ÈÎÎñʵÀý  | 
| # @return ·µ»ØÖµÕæ, É¾³ý³É¹¦  | 
| # @remarks ×Ô¶¨Ò庯Êý, ¶ÁÊý¾Ý¿âÈÎÎñɾ³ý±í, É¾³ýÈÎÎñ  | 
| def __DoLogic_DeleteMission(curPlayer, curMission):  | 
|     missionID = curMission.GetMissionID()  | 
|     GameWorld.Log("__DoLogic_DeleteMission---%s"%missionID, curPlayer.GetID())  | 
|     delMissionData = GameWorld.GetGameData().GetMissionDeleteByID(missionID)  | 
|     #ÈÎÎñɾ³ý±íÖÐÎÞ´ËÈÎÎñ  | 
|     if not delMissionData:  | 
|         return  | 
|       | 
|     #ÊÇ·ñÇå³ýïÚ³µ  | 
|     if delMissionData.GetDeleteTruck():  | 
|         #Íæ¼ÒÓµÓÐïÚ³µ, ÇÒïÚ³µIDºÍÈÎÎñIDÒ»Ö  | 
|         if curPlayer.GetTruckID() != 0 and curPlayer.GetTruckEventID() == missionID:  | 
|             curPlayer.GameServer_DelTruck()  | 
|       | 
|     #ÊÇ·ñÐèҪɾ³ýÎïÆ·  | 
|     for index in range(0, delMissionData.GetDeleteItemCount()):  | 
|         delItemData = delMissionData.GetDeleteItemAt(index)  | 
|         delItemID = delItemData.GetID()  | 
|         #0±íʾȫ²¿É¾³ý  | 
|         delItemCount = delItemData.GetCount()  | 
|         ItemCommon.DelMissionItem(curPlayer, IPY_GameWorld.rptItem, delItemID, delItemCount, missionID)  | 
|       | 
|     #ɾ³ýÕâ¸öÈÎÎñ  | 
|     QuestCommon.DeleteMission(curPlayer, missionID)  | 
|       | 
|     #ÊÇ·ñÓд¥·¢ÐÂÈÎÎñ  | 
|     nextMissionID = delMissionData.GetNextMissionID()  | 
|       | 
|     if nextMissionID > 0:  | 
|         curAddMission = QuestCommon.AddNewMission(curPlayer, nextMissionID)  | 
|         NotifyOneMission(curPlayer, curAddMission)  | 
|       | 
|     return True  | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //04 03 ÈÎÎñ´«ËÍ#tagCMissionTransport  | 
| # tagCMissionTransport       *   GettagCMissionTransport();  | 
| #   | 
| # class   IPY_CMissionTransport  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetMapID();  | 
| #   | 
| #    int      GetPosX();  | 
| #   | 
| #    int      GetPosY();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦//04 03 ÈÎÎñ´«ËÍ#tagCMissionTransport  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦//04 03 ÈÎÎñ´«ËÍ#tagCMissionTransport  | 
| def MissionMove(index, tick):  | 
|     return  | 
|   | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 37 Ê¥Æ÷Ç¿»¯#tagCShengQiQiangHua  | 
| # tagCShengQiQiangHua       *   GettagCShengQiQiangHua();  | 
| #   | 
| # class   IPY_CShengQiQiangHua  | 
| # {  | 
| # public:  | 
| #    //Ê¥Æ÷λÖà  | 
| #    int      GetDestIndex();  | 
| #    //×Ô¶¯Âò²ÄÁÏ  | 
| #    int      GetAutoBuyMaterial();  | 
| #    // ²»Ê¹Óð󶨲ÄÁÏÇ¿»¯  | 
| #    int      GetNotUserBindMaterial();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //07 37 Ê¥Æ÷Ç¿»¯#tagCShengQiQiangHua  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦ //07 37 Ê¥Æ÷Ç¿»¯#tagCShengQiQiangHua  | 
| def ShengQiQiangHua(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 38 Çå³ýÊ¥Æ÷¸½¼ÓÊôÐÔ#tagCClearShengQiAttrs  | 
| # tagCClearShengQiAttrs       *   GettagCClearShengQiAttrs();  | 
| #   | 
| # class   IPY_CClearShengQiAttrs  | 
| # {  | 
| # public:  | 
| #   | 
| #    int      GetDestIndex();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //07 38 Çå³ýÊ¥Æ÷¸½¼ÓÊôÐÔ#tagCClearShengQiAttrs  | 
| #@param index Íæ¼ÒË÷Òý  | 
| #@param tick Ê±¼ä´Á  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| #@remarks ¿Í»§¶Ë·â°üÏìÓ¦ //07 38 Çå³ýÊ¥Æ÷¸½¼ÓÊôÐÔ#tagCClearShengQiAttrs  | 
| def ClearShengQiAttrs(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0D 0E ±¦Ê¯ºÏ³É#tagCStoneCompound  | 
| # tagCStoneCompound       *   GettagCStoneCompound();  | 
| #   | 
| # class   IPY_CStoneCompound  | 
| # {  | 
| # public:  | 
| #    // ºÏ³É´ÎÊý  | 
| #    int      GetCompoundCount();  | 
| #    // ºÏ³Éģʽ  | 
| #    int      GetCompoundTimes();  | 
| #    // ×Ô¶¯¹ºÂò  | 
| #    int      GetIsAutoBuy();  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //0D 0E ±¦Ê¯ºÏ³É#tagCStoneCompound  | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //0D 0E ±¦Ê¯ºÏ³É#tagCStoneCompound  | 
| def StoneCompound(index, tick):  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #    FuncDirectCall(curPlayer, "Func_103", "BeginStoneCompound", tick)  | 
|     return  | 
|   | 
|   | 
| #===============================================================================  | 
| # //A1 06 ×°±¸Ì××°»¯#tagCEquipSuite  | 
| #   | 
| # struct tagCEquipSuite  | 
| # {  | 
| #    tagHead    Head;  | 
| #    BYTE    EquipPackType;    //×°±¸ËùÔÚ±³°üÀàÐÍ  | 
| #    DWORD    ItemIndex;    //×°±¸±³°üË÷Òý  | 
| # };  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦ //08 1A ×°±¸Ì××°»¯#tagCEquipSuite  | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //08 1A ×°±¸Ì××°»¯#tagCEquipSuite  | 
| def EquipMakeSuit(index, clientData, tick):  | 
|     #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #FuncDirectCall(curPlayer, "Func_104", "EquipMakeSuit", tick, clientData)  | 
|     return  | 
|   | 
| #===============================================================================  | 
| #//A1 05 ×°±¸¸½Ä§ #tagCEquipAddSkill  | 
| #  | 
| #struct    tagCEquipAddSkill  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        EquipPackType;        //×°±¸ËùÔÚ±³°üÀàÐÍ  | 
| #    BYTE        Type;            // 0-Çå¿Õ;1-¸½¼Ó  | 
| #    WORD        EquipIndex;        // ×°±¸ÔÚ±³°üÖеÄË÷Òý  | 
| #};  | 
| #===============================================================================  | 
| ##¿Í»§¶Ë·â°üÏìÓ¦  | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //0D 09 ×°±¸¸½Ä§#tagCEquipAddSkill  | 
| def MagicAttached(index, clientData, tick):  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #    FuncDirectCall(curPlayer, "Func_104", "MagicAttached", tick, clientData)  | 
|     return  | 
|   | 
|   | 
| #===================================================================================================  | 
| # //0D 11 ÍþÍû×°±¸ºÏ³É·â°ü#tagCPrestigeEquipMerge  | 
| # tagCPrestigeEquipMerge    * GettagCPrestigeEquipMerge();  | 
| #   | 
| # class IPY_CPrestigeEquipMerge  | 
| # {  | 
| # public:  | 
| #   | 
| #    //ºÏ³ÉÀàÐÍ  | 
| #    int GetType();  | 
| #    //×°±¸Ë÷Òý  | 
| #    int GetEquipIndex();  | 
| #    //²ÄÁÏË÷Òý  | 
| #    int GetMaterialIndex();  | 
| # };  | 
| #===================================================================================================  | 
| ##0D 11 ÍþÍû×°±¸ºÏ³É·â°ü#tagCPrestigeEquipMerge  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //0D 11 ÍþÍû×°±¸ºÏ³É·â°ü#tagCPrestigeEquipMerge  | 
| def PrestigeEquipMerge(index, tick):  | 
| #      | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #    FuncDirectCall(curPlayer, "Func_106", "PrestigeEquipMerge", tick)  | 
|     return  | 
|   | 
|   | 
| #===============================================================================  | 
| # //0D 0C ²ÄÁϼӹ¤#tagCMaterialCompound  | 
| #   | 
| # struct    tagCMaterialCompound  | 
| # {  | 
| #    tagHead        Head;  | 
| #    WORD        ItemIndex;    // ²ÄÁÏÔÚ±³°üÖеÄË÷Òý  | 
| # };  | 
| #===============================================================================  | 
| ##²ÄÁϼӹ¤·â°ü£¬µãÒ»´ÎÖ»ºÏÒ»´Î£¬£¨Ë鯬ºÏ³É£©  | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //0D 0C ²ÄÁϼӹ¤#tagCMaterialCompound  | 
| def StuffMachining(index, tick):  | 
|     return  | 
|       | 
|       | 
| ##½øÈ븱±¾³¡¾°ÑéÖ¤.  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param mapID µØÍ¼ID  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÊÇ·ñÑéÖ¤³É¹¦  | 
| # @remarks ¿Í»§¶Ë·â°üÏìÓ¦  | 
| def DoLogic_EnterFbGameEvent(curPlayer, mapID, tick):  | 
|     #ÔÝÆÁ±ÎNPCÑéÖ¤ÅÐ¶Ï  | 
|     return  | 
| #    #ûÓÐNPC¶Ô»°µ¯½çÃæ  | 
| #    if mapID in ChConfig.Def_EnterFB_NoNPCForm or mapID in ReadChConfig.GetEvalChConfig("MapID_NoNPCForm"):  | 
| #        return True  | 
| #      | 
| #    callName = ChConfig.Def_EnterFb_CallNPCFunc.get(mapID)  | 
| #      | 
| #    if callName == None:  | 
| #        return False  | 
| #      | 
| #    result = FuncCall(curPlayer, callName, tick)  | 
| #      | 
| #    if not result:  | 
| #        return False  | 
| #  | 
| #    return True  | 
|   | 
| #---------------------------------------------------------------------  | 
| ## ¹ºÂò²Ö¿â·â°ü //0C 10 ¹ºÂò²Ö¿â¿Õ¼ä  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return ÎÞ·µ»ØÖµ  | 
| #  @remarks ¹ºÂò²Ö¿â·â°ü   | 
| def BuyWarehouse(index, tick):  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #  | 
| #    #ת»»Íæ¼ÒµÄ»õ±Ò  | 
| #    buyWarehouseType = PlayerControl.ChangeMoneyType(curPlayer, ChConfig.Def_BuyWarehouse_Type)  | 
| #      | 
| #    if not PlayerControl.HaveMoney(curPlayer, buyWarehouseType, ChConfig.Def_BuyWarehouse_Cost):  | 
| #        #½ðÇ®²»×ã  | 
| #        return  | 
| #      | 
| #    if not ResetWarehouse(curPlayer):  | 
| #        #²Ö¿â¿Õ¼äÒÑÂú  | 
| #        return  | 
| #      | 
| #    #---¿ÛÍæ¼ÒÇ®---  | 
| #    if not PlayerControl.PayMoney(curPlayer, buyWarehouseType, ChConfig.Def_BuyWarehouse_Cost):  | 
| #        GameWorld.ErrLog('BuyWarehouse PayMoneyErr')  | 
| #        return  | 
| #      | 
| #    #ÊÖÐø·ÑÁ÷Ïò¼Ç¼  | 
| #    PlayerControl.DataServerMoneyLog(curPlayer, buyWarehouseType, 656, par = ChConfig.Def_BuyWarehouse_Cost)  | 
|      | 
|     return  | 
| #---------------------------------------------------------------------  | 
| ##//07 3A ¹ºÂòÎïÆ·±³°ü¿Õ¼ä#tagCBuyBackpack  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return ÎÞ·µ»ØÖµ  | 
| #  @remarks ¹ºÂòÎïÆ·±³°ü¿Õ¼ä  | 
| def BuyItemPack(index, tick):  | 
|     # ¹Ø±Õ´Ë·â°ü¹¦ÄÜ£¬ÇëʹÓÃͨÓùºÂò·â°ü07 41  | 
|     return  | 
| #  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #    #ת»»Íæ¼ÒµÄ»õ±Ò  | 
| #    useMoneyType = PlayerControl.ChangeMoneyType(curPlayer, ChConfig.Def_BuyItemPack_Type)  | 
| #      | 
| #    #ÑéÖ¤Íæ¼Ò»õ±Ò  | 
| #    if not PlayerControl.HaveMoney(curPlayer, useMoneyType, ChConfig.Def_BuyItemPack_Cost):  | 
| #        return  | 
| #      | 
| #    if not ResetBackPack(curPlayer):  | 
| #        #±³°ü¿Õ¼äÒÑÂú  | 
| #        return  | 
| #      | 
| #    #---¿ÛÍæ¼ÒÇ®---  | 
| #    if not PlayerControl.PayMoney(curPlayer, useMoneyType, ChConfig.Def_BuyItemPack_Cost):  | 
| #        GameWorld.ErrLog('BuyItemPack PayMoneyErr')  | 
| #        return  | 
| #  | 
| #    #ÊÖÐø·ÑÁ÷Ïò¼Ç¼  | 
| #    PlayerControl.DataServerMoneyLog(curPlayer, useMoneyType, 655, par = ChConfig.Def_BuyItemPack_Cost)  | 
| #    return  | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # #//07 3CͨÓñ³°ü²Ù×÷#tagCBackpackOperate  | 
| # #//¶ÔÐÔÄÜÓ°ÏìºÜС  | 
| # ////////////////////////////////////////////////////////////  | 
| # tagCBackpackOperate*GettagCBackpackOperate();  | 
| # class IPY_CBackpackOperate  | 
| # {  | 
| # int GetSrcBackpack();//Ô´±³°üÀàÐÍ  | 
| # int GetDesBackPack();//Ä¿±ê±³°üÀàÐÍ  | 
| # int GetSrcIndex();//Æðʼλ  | 
| # int GetDestIndex();//Ä¿±êλÖà  | 
| # int GetCount();//ÎïÆ·ÊýÁ¿  | 
| # }  | 
| #===============================================================================  | 
| ## Í¨Óñ³°ü²Ù×÷#tagCBackpackOperate  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return ÎÞ·µ»ØÖµ  | 
| #  @remarks 07 3CͨÓñ³°ü²Ù×÷#tagCBackpackOperate  | 
| def BackpackOperate(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     sendPack = IPY_GameWorld.IPY_CBackpackOperate()  | 
|     pack_SrcBackpack = sendPack.GetSrcBackpack()  | 
|     pack_DesBackPack = sendPack.GetDesBackPack()  | 
|     pack_SrcIndex = sendPack.GetSrcIndex()  | 
|     pack_DestIndex = sendPack.GetDestIndex()  | 
|     pack_ItemCount = sendPack.GetCount()  | 
|       | 
|     FunctionNPCCommon.BackpackOperate(curPlayer, pack_SrcBackpack, pack_DesBackPack,   | 
|                                           pack_SrcIndex, pack_DestIndex, pack_ItemCount, tick)  | 
|     return  | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //07 3D Í¨Óñ³°üÎïÆ·½»»»#tagCPackItemExchange  | 
| # //¶ÔÐÔÄܼ¸ºõÎÞÓ°Ïì  | 
| # struct tagCPackItemExchange  | 
| # {  | 
| # BYTE SrcBackpack;//Ô´±³°üÀàÐÍ  | 
| # BYTE DesBackPack;//Ä¿±ê±³°üÀàÐÍ  | 
| # WORD SrcIndex;//ÆðʼλÖà  | 
| # WORD DestIndex;//Ä¿±êλÖà  | 
| # };  | 
| #===============================================================================  | 
| ## Í¨Óñ³°üÎïÆ·½»»»#tagCPackItemExchange  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return ÎÞ·µ»ØÖµ  | 
| #  @remarks //07 3D Í¨Óñ³°üÎïÆ·½»»»#tagCPackItemExchange  | 
| def PackItemExchange(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     sendPack = IPY_GameWorld.IPY_CPackItemExchange()  | 
|     pack_SrcBackpack = sendPack.GetSrcBackpack()  | 
|     pack_DesBackPack = sendPack.GetDesBackPack()  | 
|     pack_SrcIndex = sendPack.GetSrcIndex()  | 
|     pack_DestIndex = sendPack.GetDestIndex()  | 
|       | 
|     # ·ûÓ¡½»»»  | 
|     if PlayerRune.SwitchRune(curPlayer, pack_SrcBackpack, pack_DesBackPack, pack_SrcIndex, pack_DestIndex):  | 
|         return  | 
|     # ¾Û»ê½»»»  | 
|     if PlayerGatherSoul.SwitchGatherSoul(curPlayer, pack_SrcBackpack, pack_DesBackPack, pack_SrcIndex, pack_DestIndex):  | 
|         return  | 
|       | 
|     #ʱװ  | 
|     if PlayerCoat.SwitchCoat(curPlayer, pack_SrcBackpack, pack_DesBackPack, pack_SrcIndex, pack_DestIndex):  | 
|         return  | 
|       | 
|     FunctionNPCCommon.PackItemExchange(curPlayer, pack_SrcBackpack, pack_DesBackPack,   | 
|                                           pack_SrcIndex, pack_DestIndex, tick)  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 1B Ê¹ÓÃÐÞÀíµÀ¾ßÐÞÀí×°±¸#tagCRepairEquip  | 
| # struct tagCRepairEquip  | 
| # {  | 
| #         tagHead Head  | 
| #         WORD        ItemIndex; // µÀ¾ßË÷Òý  | 
| #         BYTE PackType; //±³°üÀàÐÍ  | 
| #         WORD        EquipIndex; //×°±¸ÔÚÏàÓ¦±³°üÖеÄË÷Òý   | 
| # };  | 
| #===============================================================================  | 
| ##ʹÓÃÐÞÀíµÀ¾ßÐÞÀí×°±¸#tagCRepairEquip  | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //08 1B Ê¹ÓÃÐÞÀíµÀ¾ßÐÞÀí×°±¸#tagCRepairEquip  | 
| def ChangeEquipEndure(index, tick):  | 
|     return  | 
|       | 
|       | 
| #//07 3F Ê¹ÓõÀ¾ßÔö¼Ó×î´óÁéÎÆ´ÎÊý#tagCUseIncreaseMaxAddSkill   | 
| #struct tagCUseIncreaseMaxAddSkill   | 
| #{   | 
| #tagHead Head;   | 
| #WORD ItemIndex; // µÀ¾ßË÷Òý   | 
| #BYTE PackType; //±³°üÀàÐÍ   | 
| #WORD EquipIndex; //×°±¸ÔÚÏàÓ¦±³°üÖеÄË÷Òý   | 
| #};   | 
| ##ʹÓõÀ¾ßÔö¼Ó×î´óÁéÎÆ´ÎÊý  | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def UseIncreaseMaxAddSkill(index, tick):  | 
|     return  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #    sendPack = IPY_GameWorld.IPY_CUseIncreaseMaxAddSkill()  | 
| #      | 
| #    Operate_MagicAttached.UseIncreaseMaxAddSkill(curPlayer, sendPack.GetItemIndex(),  | 
| #                                                     sendPack.GetPackType(), sendPack.GetEquipIndex())  | 
|       | 
|   | 
| #===============================================================================  | 
| # //07 42 ÎïÆ·ÄÜÁ¿×ªÒÆ#tagCItemTransfer  | 
| # struct       tagCItemTransfer  | 
| # {  | 
| #         tagHead            Head;  | 
| #         BYTE                  PackType;         //±³°üÀàÐÍ:rptItem, rptEquip, rptWarehouse   | 
| #         BYTE                  ItemPlace;  | 
| #         BYTE                  TransferType;  //×ªÒÆÀàÐÍ  | 
| # };  | 
| #===============================================================================  | 
| ##ÎïÆ·ÄÜÁ¿×ªÒÆ  | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def ItemEnergyTransfer(index, tick):  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #      | 
| #    #±ÜÃâ·´¸´²Ù×÷  | 
| #    if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_ChangeEnergy) \  | 
| #    < ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_ChangeEnergy]:  | 
| #        return  | 
| #      | 
| #    curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_ChangeEnergy, tick)  | 
| #      | 
| #    pack = IPY_GameWorld.IPY_CItemTransfer()  | 
| #    Operate_MagicAttached.ItemEnergyTransfer(curPlayer, pack.GetPackType(),  | 
| #                                             pack.GetItemPlace(), pack.GetTransferType())  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //16 0B³èÎïÁ¶»¯#tagCPetRefinery  | 
| # struct tagCPetRefinery  | 
| # {  | 
| # tagHead Head;  | 
| # DWORD PetID;//³èÎïID  | 
| # };  | 
| #===============================================================================  | 
| ##³èÎïÁ¶»¯.  | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //16 0B³èÎïÁ¶»¯#tagCPetRefinery  | 
| def CPetRefinery(index, tick):  | 
|     return  | 
|   | 
| #===============================================================================  | 
| #//07 41 Í¨ÓùºÂòPack¿Õ¼ä#tagCOpenPackCount  | 
| # struct       tagCOpenPackCount  | 
| # {  | 
| #         tagHead            Head;  | 
| #         BYTE                  PackType;         //±³°üÀàÐÍ:rptItem, rptEquip, rptWarehouse   | 
| #         BYTE                  Count;               //¹ºÂò¸ñÊý  | 
| # };  | 
| #===============================================================================  | 
| ##¹ºÂò¸÷ÖÖ°ü¹ü¸ñ×Ó  | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def OpenPackCount(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     pack = IPY_GameWorld.IPY_COpenPackCount()  | 
|     packType = pack.GetPackType()  | 
|     if packType not in ChConfig.Def_Type_CanBuyPack_PlayerDict.keys():  | 
|         return  | 
|       | 
|     buyCount = pack.GetCount()  | 
|   | 
|     #ÒѹºÂò¸ñ×ÓÊý  | 
|     keyName = ChConfig.Def_Type_CanBuyPack_PlayerDict[packType][ChConfig.Def_PlayerPackDict_Index_Key]  | 
|     curGridCnt = curPlayer.NomalDictGetProperty(keyName)    | 
|       | 
|     #ĬÈϸñ×ÓÊý  | 
|     initCnt = ChConfig.Def_Type_CanBuyPack_PlayerDict[packType][ChConfig.Def_PlayerPackDict_Index_InitCnt]    | 
|       | 
|     curPack = curPlayer.GetItemManager().GetPack(packType)  | 
|     curPackMaxCnt = curPack.GetMaxCount()  | 
|       | 
|     if packType in [IPY_GameWorld.rptPetCabinetPet, IPY_GameWorld.rptCabinetWeaponCoat,   | 
|                     IPY_GameWorld.rptCabinetDressCoat, IPY_GameWorld.rptCabinetHorse]:  | 
|         vipLv = curPlayer.GetVIPLv()  | 
|         #curPackMaxCnt = ChConfig.Def_PackCnt_Fashion + PlayerVip.GetVipCabinetAddGridCnt(vipLv)  | 
|           | 
|     openAnonCnt =  initCnt + curGridCnt + buyCount  | 
|       | 
|     if curPackMaxCnt < openAnonCnt:  | 
|         #ÊýÁ¿³¬¹ý×î´ó¸ñ×ÓÊý  | 
|         GameWorld.DebugLog("¹ºÂò±³°ü¸ñ×Ó£¬ÊýÁ¿³¬¹ý×î´ó¸ñ×ÓÊý£¡packType=%s,buyCount=%s" % (packType, buyCount))  | 
|         return  | 
|      | 
|     isBuyOK, costMoneyList = DoOpenGrid(curPlayer, curGridCnt, packType, buyCount)  | 
|     if not isBuyOK:  | 
|         return  | 
|       | 
|     #fromIndex, toIndex =  curGridCnt + 1, curGridCnt + buyCount    | 
| #    GameWorld.Log("fromIndex=%s toIndex=%s"%(fromIndex, toIndex))  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, keyName, curGridCnt + buyCount)  | 
|       | 
|     if packType == IPY_GameWorld.rptItem:  | 
|         #±³°üˢР | 
|         PlayerControl.Init_ItemPack(curPlayer)  | 
|         #¿ª¸ñ×Ó£¬¼Ó¾Ñé  | 
|         #OpenPackAddExp(curPlayer, packType, fromIndex, toIndex)  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_671654")  | 
|         #PlayerControl.SyncOnLineTimeTotal(curPlayer)  | 
|         #PlayerControl.SyncOnLineTimeLastOpenPack(curPlayer, packType)  | 
|           | 
|           | 
|     elif packType == IPY_GameWorld.rptWarehouse:  | 
|         #²Ö¿âˢР | 
|         PlayerControl.Init_Warehouse(curPlayer)  | 
|         #¿ª¸ñ×Ó£¬¼Ó¾Ñé  | 
|         #OpenPackAddExp(curPlayer, packType, fromIndex, toIndex)  | 
|               | 
|     else:  | 
|         #ÊÕÄɹñˢР | 
|         PlayerControl.Init_CabinetCountByType(curPlayer, packType)  | 
|       | 
|     DataRecordPack.DR_OpenPackCount(curPlayer, packType, buyCount, curPlayer.NomalDictGetProperty(keyName))  | 
|       | 
|     if costMoneyList:  | 
|         #Ïû·Ñ¼Ç¼  | 
|         for moneyType, money in costMoneyList:  | 
|             GameWorld.Login_Interface_GoldRec(curPlayer, 0, 1, 'BuyPackGrid', moneyType, money)  | 
|   | 
|     return  | 
|   | 
| ##¿ªÆô¸ñ×Ó¿ÛµÀ¾ß×êʯ  | 
| # @param curPlayer Íæ¼Ò¶ÔÏó  | 
| # @param buyMoney ×êʯÏûºÄ  | 
| # @param packType ±³°üÀàÐÍ  | 
| # @param curPack ÎïÆ·¹ÜÀíÆ÷  | 
| # @param buyPackMoneyType »õ±ÒÀàÐÍ  | 
| # @param buyCount ¹ºÂò¸ñ×ÓÊý  | 
| # @return None ÊÇ·ñ¹ºÂò³É¹¦, Íæ¼ÒÊÇ·ñÓÐÇ®¿î  | 
| def DoOpenGrid(curPlayer, curGridCnt, packType, buyCount):  | 
|     curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|       | 
|     itemId = IpyGameDataPY.GetFuncCfg('OpenBagItem')  | 
|     itemCntFormula = IpyGameDataPY.GetFuncCompileCfg('OpenBagItem', 2)  | 
|     buyMoney = IpyGameDataPY.GetFuncCfg('OpenBagItem', 3)  | 
|     totalItemCnt = 0  | 
|     for index in range(curGridCnt+1, curGridCnt + buyCount+1):  | 
|         itemcnt = eval(itemCntFormula)  | 
|         totalItemCnt += itemcnt  | 
|       | 
|     hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemId, curPack, totalItemCnt)  | 
|       | 
|     needMoney = lackCnt * buyMoney if not hasEnough else 0  | 
|           | 
|   | 
|     # ÐèÒª¸¶Ç®  | 
|     costMoneyList = []  | 
|     if needMoney > 0:  | 
|         costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, needMoney)  | 
|         if costMoneyList == []:  | 
|             #½ðÇ®²»×ã  | 
|             return False, costMoneyList  | 
|       | 
|         #¸¶¿î  | 
|         for moneyType, moneyCnt in costMoneyList:  | 
|             infoDict = {"BuyCount":buyCount, ChConfig.Def_Cost_Reason_SonKey:packType}  | 
|             if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_BuyPack, infoDict, 1):  | 
|                 return False, costMoneyList  | 
|       | 
|     # ¿ÛµÀ¾ß  | 
|     delCnt = max(0, totalItemCnt - lackCnt) # Êµ¼Ê¿Û³ýµÄ¸öÊý  | 
|     if indexList:  | 
|         ItemCommon.ReduceItem(curPlayer, curPack, indexList, delCnt, True)  | 
|           | 
|     return True, costMoneyList  | 
|           | 
| ##¿ªÆôÎïÆ·±³°ü¸ñ×Ó»ò²Ö¿â¸ñ×Ó¿ÉÔö¼ÓµÄ¾ÑéÖµ  | 
| # @param curPlayer Íæ¼Ò¶ÔÏó  | 
| # @param packType ±³°üÀàÐÍ  | 
| # @param packType ±³°üÀàÐÍ  | 
| # @param packType ±³°üÀàÐÍ  | 
| # @param needRefresh ÊÇ·ñÐèҪˢÐÂÍæ¼ÒÊôÐÔ  | 
| # @return None  | 
| def OpenPackAddExp(curPlayer, packType, fromIndex, toIndex, needRefresh = True):  | 
|     cfgObj = PlayerExpandPackCfgMgr.GetExpandPackCfg(curPlayer, packType)  | 
|     #ÕÒ²»ÕÒÕâÖÖ±³°üµÄÅäÖÃÐÅÏ¢¶ÔÏó  | 
|     if not cfgObj:  | 
| #        GameWorld.Log("not cfgObj")  | 
|         return  | 
|       | 
|     attrInfo = cfgObj.GetTotalCanAddAttrInfo(curPlayer, fromIndex, toIndex)  | 
|     #ûÕÒµ½ÊôÐÔÐÅÏ¢  | 
|     if not attrInfo:  | 
| #        GameWorld.Log("not attrInfo")  | 
|         return  | 
| #    GameWorld.Log("attrInfo=%s"%attrInfo)  | 
|     playerControl = PlayerControl.PlayerControl(curPlayer)  | 
|     #Ôö¼Ó¾Ñé  | 
|     #֪ͨ»ñµÃ¾Ñé  | 
|     addExp = attrInfo.get("Exp", 0)  | 
|     if 0 != addExp:  | 
|         playerControl.AddExp(addExp)  | 
|     if needRefresh:  | 
|         #ÖØË¢Ö÷½ÇÊôÐÔ  | 
|         playerControl.RefreshAllState()  | 
|       | 
|       | 
|           | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //16 0D ³èÎï×°±¸ºÏ³É#tagPetEquipMerge   | 
| # struct tagPetEquipMerge   | 
| # {   | 
| # tagHead Head;   | 
| # DWORD StuffIndex1; //×°±¸Ë÷Òý   | 
| # DWORD StuffIndex2; //×°±¸Ë÷Òý   | 
| # DWORD StuffIndex3; //×°±¸Ë÷Òý   | 
| # BYTE AutoBuy; //ÊÇ·ñ×Ô¶¯¹ºÂò½á»êµÆ   | 
| # };  | 
| #===============================================================================  | 
| ##³èÎï×°±¸ºÏ³É#tagPetEquipMerge   | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return None  | 
| # @remarks   | 
| def CPetEquipMerge(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //08 26 ×°±¸Ö±½ÓÉýÐÇ#tagCEquipUpStarImmediately  | 
| # struct         tagCEquipUpStarImmediately  | 
| # {  | 
| #         tagHead             Head;  | 
| #         WORD                 ItemIndex;          // µÀ¾ßË÷Òý  | 
| #         BYTE          PackType; //±³°üÀàÐÍ  | 
| #         WORD                 EquipIndex;        //×°±¸ÔÚÏàÓ¦±³°üÖеÄË÷Òý   | 
| # };  | 
| #===============================================================================  | 
| ##×°±¸Ö±½ÓÉýÐÇ#tagCEquipUpStarImmediately  | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return None  | 
| # @remarks   | 
| def CEquipUpStarImmediately(index, tick):  | 
|     return  | 
|   | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # //0D 12 Éñ±ø»½ÐÑ#tagCEquipWakeUp  | 
| # struct         tagCEquipWakeUp  | 
| # {  | 
| #         tagHead             Head;  | 
| #         WORD                 ItemIndex;                   //²ÄÁÏÔÚÎïÆ·±³°üÖеÄλÖÃË÷Òý  | 
| #         BYTE          PackType;           //±³°üÀàÐÍ   | 
| #         WORD                 EquipIndex;                 //×°±¸ÔÚÏàÓ¦±³°üÖеÄË÷Òý  | 
| # };  | 
| #===============================================================================  | 
| ##Éñ±ø»½ÐÑ#tagCEquipWakeUp  | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return None  | 
| # @remarks   | 
| def CEquipWakeUp(index, tick):  | 
|     return  | 
|   | 
| #===============================================================================  | 
| # #07 43 tagCEsotericaStudy  | 
| # #struct tagCEsotericaStudy  | 
| # #{  | 
| # #    tagHead    Head;  | 
| # #    WORD    ItemIndex;  | 
| # #};  | 
| #===============================================================================  | 
| ##ѧϰÎäÁÖÃØóÅ  | 
| # @param index Íæ¼ÒË÷Òý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return None  | 
| def LearnWuLinSkill(index, tick):  | 
|     return  | 
|   | 
| #===============================================================================  | 
| # //A0 10 ¹ºÂòÕæÆø#tagPyCMBuyZhenqi  | 
| # struct tagPyCMBuyZhenqi  | 
| # {  | 
| #    tagHead Head;      | 
| # };  | 
| #===============================================================================  | 
| ## A0 10 ¹ºÂòÕæÆø#tagPyCMBuyZhenqi  | 
| #  @param index Ë÷Òý  | 
| #  @param clientData ·â°ü½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| #  @remarks  | 
| def PlayerBuyZhenqi(index, clientData, tick):  | 
|     #Operate_PlayerBuyZhenQi.PlayerBuyZhenQi(index, clientData, tick)  | 
|     return  | 
|   | 
|   | 
| #===============================================================================  | 
| #===============================================================================  | 
| # //B0 15 Íæ¼ÒÁìÈ¡Êղؼн±Àø#tagAskCollectPrize  | 
| # struct tagAskCollectPrize  | 
| # {  | 
| #    tagHead Head;      | 
| # };  | 
| #===============================================================================  | 
| ## B0 15 Íæ¼ÒÁìÈ¡Êղؼн±Àø#tagAskCollectPrize  | 
| #  @param index Ë÷Òý  | 
| #  @param clientData ·â°ü½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| #  @remarks  | 
| def PlayerGetFavoriteAward(index, clientData, tick):  | 
|     return  | 
|   | 
|   | 
| #===============================================================================  | 
| # //B0 01 ´ò¿ªÔ¶³ÌÉÌµê  | 
| #   | 
| # struct tagPyOpenLongShop  | 
| # {  | 
| #    tagHead Head;  | 
| # };  | 
| #===============================================================================  | 
| ## B0 01 ´ò¿ªÔ¶³ÌÉÌµê  | 
| #  @param index Ë÷Òý  | 
| #  @param clientData ·â°ü½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| #  @remarks  | 
| def PlayerOpenLongShop(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     #ºìÃûÍæ¼ÒÎÞ·¨Ê¹ÓÃÔ¶³ÌÉÌµê  | 
|     if curPlayer.GetPlayerNameColor() == IPY_GameWorld.pncRed or curPlayer.GetPKValue() > 0:  | 
|         PlayerControl.NotifyCode(curPlayer, "PK_lhs_161795")  | 
|         return  | 
|           | 
|     #µ±Ç°vipµÈ¼¶²»ÄÜʹÓÃÔ¶³ÌÉÌµê  | 
|     #if not PlayerVip.GetVipCanLongShop(curPlayer):  | 
|     #    moneyCnt, moneyType = ReadChConfig.GetEvalChConfig("DirectShopCost")  | 
|     #    if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt):  | 
|     #        #½ðÇ®²»×ã  | 
|     #        return  | 
|     #      | 
|               | 
|     FunctionNPCCommon.StartTrade(curPlayer, tick)  | 
|       | 
|     #´¥·¢ÈÎÎñ  | 
|     EventRespons_DirectFuncEvent(curPlayer, "open_shop")  | 
|     return  | 
|       | 
|       | 
| #===============================================================================  | 
| #//A2 04 ÇëÇó´ò¿ªÔ¶³Ì²Ö¿â #tagCMOpenLongWarehouse  | 
| #  | 
| #struct    tagCMOpenLongWarehouse  | 
| #{  | 
| #    tagHead        Head;  | 
| #};  | 
| #===============================================================================  | 
| ## A2 04 ÇëÇó²Ö¿âÎïÆ·  | 
| #  @param index Ë÷Òý  | 
| #  @param clientData ·â°ü½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| #  @remarks  | 
| def PlayerOpenLongWarehouse(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     # Ôݲ»¼ÓCD·À·¶  | 
|     curPlayer.Sync_WarehouseItem()  | 
|       | 
|     return  | 
|   | 
| #===============================================================================  | 
| # //B0 06 ²é¿´¼Ò×åÕ½ÉêÇëÐÅÏ¢ #tagViewAllFamilyInfo  | 
| #   | 
| # struct    tagViewAllFamilyInfo  | 
| # {  | 
| #    tagHead        Head;  | 
| # };  | 
| #===============================================================================  | 
| ## B0 06 ²é¿´¼Ò×åÕ½ÉêÇëÐÅÏ¢  | 
| #  @param index Ë÷Òý  | 
| #  @param clientData ·â°ü½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| #  @remarks  | 
| def ViewAllFamilyInfo(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     PlayerFamily.SendPack_GameServer_ViewAllFamily(curPlayer)  | 
|     return  | 
|   | 
|   | 
| #===============================================================================  | 
| # //B0 07 ²é¿´¼Ò×åÕù°ÔÕ½ÐÅÏ¢ #tagViewAllFamilyBattlenfo  | 
| #   | 
| # struct    tagViewAllFamilyBattlenfo  | 
| # {  | 
| #    tagHead        Head;  | 
| # };  | 
| #===============================================================================  | 
| ## B0 07 ²é¿´¼Ò×åÕù°ÔÕ½ÐÅÏ¢  | 
| #  @param index Ë÷Òý  | 
| #  @param clientData ·â°ü½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| #  @remarks  | 
| def ViewAllFamilyBattlenfo(index, clientData, tick):  | 
|     return  | 
|   | 
|   | 
| #===============================================================================  | 
| #//B0 31 ¿Í»§¶ËµÇÈ뷽ʽ #tagPlayerLoginType  | 
| #  | 
| #struct tagPlayerLoginType  | 
| #  | 
| #{  | 
| #    tagHead    Head;  | 
| #    BYTE        LoginType;        //ÀàÐÍ  | 
| #};  | 
| #====================================  | 
| ## B0 31 ¿Í»§¶ËµÇÈ뷽ʽ  | 
| #  @param index Ë÷Òý  | 
| #  @param clientData ·â°ü½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| def OnPlayerLoginType(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_LoginType, clientData.LoginType)  | 
|     EventRespons_OnRevLoginType(curPlayer)  | 
|     return  | 
|   | 
|   | 
| #===============================================================================  | 
| #//B0 32 µÇÈëÆ÷µÇÈëÁìÈ¡½±Àø #tagFastLoginPrize  | 
| #  | 
| #struct tagFastLoginPrize  | 
| #{  | 
| #    tagHead    Head;  | 
| #};  | 
| #====================================  | 
| ## B0 32 µÇÈëÆ÷µÇÈëÁìÈ¡½±Àø  | 
| #  @param index Ë÷Òý  | 
| #  @param clientData ·â°ü½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| def OnRewardByLoginType(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     RunQuestEvent(curPlayer, "on_logintype", "on_reward_bylogintype", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| #=======================================================================================================================  | 
| # //A0 17  ÁìȡÿÌìÎïÆ· #tagGiveItemByDay  | 
| #   | 
| # struct    tagGiveItemByDay  | 
| #   | 
| # {  | 
| #    tagHead        Head;  | 
| # };  | 
| #=======================================================================================================================  | 
| ## A0 17 ÁìȡÿÈÕÎïÆ·  | 
| #  @param index Ë÷Òý  | 
| #  @param clientData ·â°ü½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| def GiveItemByDay(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     EventRespons_PlayerEvent(curPlayer, "player_give_item")  | 
|     return  | 
|   | 
|   | 
| ##ÈÎÎñ´¥·¢Æ÷ÔڼǼµÇ½ģʽµÄʱºò´¥·¢  | 
| #@param curPlayer Íæ¼ÒʵÀý  | 
| #@return ·µ»ØÖµÎÞÒâÒå  | 
| def EventRespons_OnRevLoginType(curPlayer):  | 
|     RunQuestEvent(curPlayer, "on_revlogintype_event", "on_revlogintype_event", Def_RunQuestType_Normal)  | 
|     return  | 
|   | 
| #// A2 07 ½ÓÊÜÈÎÎñ #tagCMTakeTask  | 
| #  | 
| #struct    tagCMTakeTask  | 
| #{  | 
| #    tagHead        Head;  | 
| #    DWORD        TaskID;  | 
| #};  | 
| def OnTakeTask(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     missionID = clientData.TaskID  | 
|     curMission = curPlayer.FindMission(missionID)  | 
|     if not curMission:  | 
|         return  | 
|       | 
|     missionState = curMission.GetState()  | 
|     if missionState != ChConfig.Def_Mission_State_NoAccept:  | 
|         return  | 
|       | 
|     curQuestData = QuestManager.FindQuest(missionID)  | 
|     if not curQuestData:  | 
|         return  | 
|       | 
|     QuestCommon.SetPlayerMissionState(curPlayer, curMission, 1)  | 
|     return  | 
|   | 
| #// A2 18 Íê³ÉÈÎÎñ #tagCMFinishTask  | 
| #  | 
| #struct tagCMFinishTask  | 
| #{  | 
| #    tagHead         Head;  | 
| #    DWORD        TaskID;  | 
| #    WORD        RewardPer;    // ½±Àø°Ù·Ö±È, Ä¬ÈÏ100;  150Ôò´ú±í1.5±¶  | 
| #};  | 
| def OnPlayerFinishTask(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     taskID = clientData.TaskID  | 
|     rewardPer = clientData.RewardPer  | 
|       | 
|     if taskID <= 0:  | 
|         return  | 
|       | 
|     EventRespons_OnFinishTask(curPlayer, taskID, rewardPer)  | 
|     return  | 
|   | 
| ## A2 06 ¿ìËÙÍê³ÉÈÎÎñ#tagCMQuickFinishMission  | 
| #  @param index Ë÷Òý  | 
| #  @param clientData ·â°ü½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| def PlayerQuickFinishTask(index, clientData, tick):  | 
|     missionID = clientData.MissionID  | 
|     if missionID <= 0:  | 
|         return  | 
|       | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     doType = clientData.DoType  | 
|     if doType == 1:  | 
|         EventRespons_OnQuickFinishAllAround(curPlayer, missionID)  | 
|     else:  | 
|         EventRespons_OnQuickFinishTask(curPlayer, missionID)  | 
|     return  | 
|   | 
|   | 
| ## A2 09 ÉèÖû·ÈÎÎñÐǼ¶#tagCMSetRunMissionStar  | 
| #  @param index Ë÷Òý  | 
| #  @param clientData ·â°ü½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| def PlayerSetRunMissionStar(index, clientData, tick):  | 
|     missionID = clientData.MissionID  | 
|     if missionID <= 0:  | 
|         return  | 
|   | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     EventRespons_OnSetMissionStar(curPlayer, missionID)  | 
|     return  | 
|   | 
|   | 
| ## A2 15 ¹ºÂòÈÕ³£ÈÎÎñ´ÎÊýÉÏÏÞ#tagCMBuyDayMissionSum  | 
| #  @param index Ë÷Òý  | 
| #  @param clientData ·â°ü½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| def PlayerBuyDayMissionSum(index, clientData, tick):  | 
|     buyNum = clientData.BuyNum  | 
|     if buyNum <= 0:  | 
|         return  | 
|   | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     EventRespons_OnBuyDayMissionSum(curPlayer, buyNum)  | 
|     return  | 
|   | 
| ## A2 15 ÁìÈ¡»·ÈÎÎñÿÂÖ½±Àø#tagCMGetRunTaskEndAward  | 
| #  @param index Ë÷Òý  | 
| #  @param clientData ·â°ü½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| def OnGetRunTaskAward(index, clientData, tick):  | 
|     taskType = clientData.Type  | 
|     if taskType not in [QuestCommon.Def_Mission_Type_RunDaily, QuestCommon.Def_Mission_Type_RunFamily]:  | 
|         GameWorld.DebugLog('ÁìÈ¡»·ÈÎÎñÿÂÖ½±Àø ÀàÐÍ´íÎó %s'%taskType)  | 
|         return  | 
|       | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|   | 
|     hasGotAward = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RunTaskAwardState % taskType)  | 
|     if hasGotAward:  | 
|         GameWorld.DebugLog('ÁìÈ¡»·ÈÎÎñÿÂÖ½±Àø  Òѽ±Àø ÀàÐÍ %s'%taskType)  | 
|         return  | 
|     #ÎïÆ·½±Àø  | 
|     itemList = []  | 
|     itemAwardDict = IpyGameDataPY.GetFuncEvalCfg('RunTaskAward', 3, {})  | 
|     if str(taskType) in itemAwardDict:  | 
|         itemList = itemAwardDict[str(taskType)]  | 
|         # ¼ì²é±³°ü  | 
|         needSpace = len(itemList)  | 
|         packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  | 
|         if needSpace > packSpace:  | 
|             PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")  | 
|             return  | 
|         for itemID, itemCount, isBind in itemList:  | 
|             ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem])  | 
|       | 
|     #¸ø¾Ñé  | 
|     giveExp = 0  | 
|     expAwardDict = IpyGameDataPY.GetFuncEvalCfg('RunTaskAward', 4, {})  | 
|     if str(taskType) in expAwardDict:  | 
|         reExp = PlayerControl.GetPlayerReExp(curPlayer)  | 
|         giveExp = eval(expAwardDict[str(taskType)])  | 
|         PlayerControl.PlayerControl(curPlayer).AddExp(giveExp)  | 
|       | 
|     #¸øÇ®  | 
|     moneyType = 0  | 
|     moneyNum = 0  | 
|     runTaskMoneyAwardDict = IpyGameDataPY.GetFuncEvalCfg('RunTaskAward')  | 
|     if taskType in runTaskMoneyAwardDict:  | 
|         specialAwardDict = IpyGameDataPY.GetFuncEvalCfg('RunTaskAward', 2, {})  | 
|         if taskType in specialAwardDict:  | 
|             rate, moneyCnt = specialAwardDict[taskType]  | 
|             if GameWorld.CanHappen(rate):  | 
|                 moneyNum = moneyCnt  | 
|                 if taskType == QuestCommon.Def_Mission_Type_RunDaily:  | 
|                     PlayerControl.WorldNotify(0, 'CoinTaskReward', [curPlayer.GetName()])  | 
|         moneyType, minMoney, maxMoney = runTaskMoneyAwardDict[taskType]  | 
|         if not moneyNum:  | 
|             moneyNum = random.randint(minMoney, maxMoney)  | 
|         if moneyType == ShareDefine.TYPE_Price_Family_Contribution:  | 
|             PlayerFamily.AddPlayerFamilyActiveValue(curPlayer, moneyNum, True, ShareDefine.Def_AddFAVReason_DoFamilyMisson)  | 
|         else:  | 
|             addDataDict = {ChConfig.Def_Give_Reason_SonKey:"Run"}  | 
|             PlayerControl.GiveMoney(curPlayer, moneyType, moneyNum, ChConfig.Def_GiveMoney_Mission, addDataDict, False)  | 
|           | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RunTaskAwardRecord % taskType, moneyNum)  | 
|           | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RunTaskAwardState % taskType, 1)  | 
|     GameWorld.DebugLog('ÁìÈ¡»·ÈÎÎñÿÂÖ½±Àø³É¹¦  moneyType=%s, moneyNum=%s, itemList=%s, giveExp=%s'%(moneyType, moneyNum, itemList, giveExp))  | 
|       | 
|     #֪ͨ¿Í»§¶Ë  | 
|     NotifyRunEndAward(curPlayer, taskType)  | 
|   | 
|       | 
|     #ɾ³ýÁìÈ¡½±ÀøµÄÈÎÎñ (¸ÄÓÉÈÎÎñ½Å±¾´¥·¢ÏÂÒ»»·)  | 
|     EventRespons_GetLastRunTaskAward(curPlayer, taskType)  | 
| #    runTaskAwardTaskIDDict = IpyGameDataPY.GetFuncEvalCfg('RunTaskAwardTaskID')  | 
| #    runTaskAwardTaskID = runTaskAwardTaskIDDict.get(taskType, 0)  | 
| #    if runTaskAwardTaskID:  | 
| #        QuestCommon.DeleteMission(curPlayer, runTaskAwardTaskID)  | 
|       | 
|     #¸üÐÂÏÂÂÖÈÎÎñ  | 
| #    mission_1 = QuestCommon.GetCommonMission(curPlayer)  | 
| #    if not mission_1:  | 
| #        return  | 
| #    nextMissionID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RunTaskNextMissionID % taskType)  | 
| #    if not nextMissionID:  | 
| #        #ûÓÐÏÂÂÖÈÎÎñ  | 
| #        return  | 
| #    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RunTaskNextMissionID % taskType, 0)  | 
| #    if not curPlayer.FindMission(nextMissionID):  | 
| #        QuestCommon.AddNewMission(curPlayer, nextMissionID)  | 
| #    nextMission = curPlayer.FindMission(nextMissionID)  | 
| #    QuestCommon.SetPlayerMissionState(curPlayer, nextMission, 1)  | 
| #    nextMission.SetMissionState(1)  | 
| #    nextMission.SetDescriptionIndex(0)  | 
| #  | 
| #    #ÏÈÇå¿Õ×ÖµäÔÙÉèÖÃеÄ×Öµä  | 
| #    curPlayer.Sync_ClearMissionDict(nextMissionID)  | 
| #    nextMission.ClearProperty()  | 
| #    Def_Around_AllCount = QuestRunner.GetRunKey(taskType, QuestRunner.Key_Around_AllCount)  | 
| #    Def_Around_Count = QuestRunner.GetRunKey(taskType, QuestRunner.Key_Around_Count)  | 
| #    mission_1.SetProperty(Def_Around_Count,0)  | 
| #    #×Ü»·Êý  | 
| #    allCount = mission_1.GetProperty(Def_Around_AllCount)  | 
| #    #µ¥ÂÖÒÑ×ö»·Êý  | 
| #    #aroundCount = mission_1.GetProperty(Def_Around_Count)  | 
| #    nextMission.SetProperty(Def_Around_AllCount, allCount)  | 
| #    nextMission.SetProperty(Def_Around_Count, 0)  | 
| #      | 
| #    #ÉèÖÃËæ»úÈÎÎñʼþ  | 
| #    EventRespons_SetRunAround(curPlayer, nextMissionID)  | 
| #      | 
| #      | 
| #   | 
| #    NotifyOneMission(curPlayer, nextMission, isNotifyAll = False)  | 
|     return  | 
|   | 
| def NotifyRunEndAward(curPlayer, taskType=-1):  | 
|     ## Í¨ÖªÅÜ»·ÂÖ½±Àø  | 
|     taskTypeList = [QuestCommon.Def_Mission_Type_RunDaily, QuestCommon.Def_Mission_Type_RunFamily] if taskType == -1 else [taskType]  | 
|     infoPack = ChPyNetSendPack.tagMCRunTaskAwardInfo()  | 
|     infoPack.Clear()  | 
|     infoPack.InfoList = []  | 
|     for ttype in taskTypeList:  | 
|         recordPack = ChPyNetSendPack.tagMCRunTaskAwardRecord()  | 
|         recordPack.Type = ttype  | 
|         recordPack.Num = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RunTaskAwardRecord % ttype)  | 
|         recordPack.AwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RunTaskAwardState % ttype)  | 
|         infoPack.InfoList.append(recordPack)  | 
|     infoPack.Cnt = len(infoPack.InfoList)  | 
|     NetPackCommon.SendFakePack(curPlayer, infoPack)  | 
|     return  | 
|   | 
| #// A2 24 ´¥ÅöNPC #tagCMTouchNPC  | 
| #  | 
| #struct     tagCMTouchNPC  | 
| #{  | 
| #    tagHead        Head;  | 
| #    DWORD        ObjID;  | 
| #};  | 
| def MoveTouchNPC(index, clientData, tick):  | 
|     #´¥ÅöNPC  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     eventNPCID = clientData.ObjID  | 
|     curNPC = GameWorld.GetNPCManager().FindNPCByID(eventNPCID)  | 
|       | 
|     #ûÓÐÕâ¸öNPC  | 
|     if curNPC == None :  | 
|         return  | 
|     dist = GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), curNPC.GetPosX(), curNPC.GetPosY())  | 
|       | 
|     if dist > ChConfig.Def_EventDist:  | 
|         #Íæ¼Ò¾àÀë¹ýÔ¶, ²»ÄÜ´¥·¢  | 
|         return  | 
|       | 
|     if curNPC.GetType() != ChConfig.ntTouchKill:  | 
|         return  | 
|       | 
|     if not FBLogic.OnCanMoveTouchNPC(curPlayer, curNPC, tick):  | 
|         return  | 
|       | 
|     #¸±±¾  | 
|     FBLogic.OnMoveTouchNPC(curPlayer, curNPC, tick)  | 
|       | 
|     #Âß¼´¦ÀíÍêºóɱËÀNPC  | 
|     npcControl = NPCCommon.NPCControl(curNPC)  | 
|     npcControl.SetKilled()  | 
|     return  | 
|   | 
|   | 
| ## ¿Í»§¶ËÈÎÎñ¼ÆÊý  | 
| #===============================================================================  | 
| # //A2 25 ¿Í»§¶ËÈÎÎñ¼ÆÊý # tagCMClientTaskCount  | 
| #   | 
| # struct     tagCMClientTaskCount  | 
| # {  | 
| #    tagHead        Head;  | 
| #    DWORD        CountID;        // ¼ÆÊýID£¬¿Í»§¶ËÓë²ß»®Ô¼¶¨£¬¿ÉÒÔÊÇNPCID»òÆäËû  | 
| # };  | 
| #===============================================================================  | 
| def ClientTaskCount(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     RunQuestEvent(curPlayer, "on_client_by_id", clientData.CountID, Def_RunQuestType_Normal)  | 
|   | 
|   |