#!/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-11-27 20:30" hxp Ð޸ĽáÊø°Ú̯״̬ʼþµ¥¶À´¦Àí£¬²»ÔÚ½áÊøÊ¼þÖд¦Àí
# @change: "2013-12-10 14:00" hxp Ð޸IJ鿴°Ú̯״̬ʼþµ¥¶À´¦Àí£¬²»ÔÚ½áÊøÊ¼þÖд¦Àí
# @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-08 10:00" hxp Ôö¼ÓÌìÌݾº¼¼³¡ÈÎÎñʼþ´¥·¢
# @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 PlayerShopItem
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 PlayerSuccess
import PlayerArrestTask
import PlayerRune
import IpyGameDataPY
import FormulaControl
import GameFuncComm
import ChPyNetSendPack
import NetPackCommon
import NPCCommon
import PlayerVip
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
##¿Í»§¶Ë//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)
    
    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   ÎÒ²»»á¸øµÐÈËÌṩÈκΰïÖúµÄ!
        #²»Í¬¹ú¼®, ²»ÄܺÍ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 = curNPC.GetLV()     
    
    #ÔËÐÐ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)
    
    #---²¹ÂúѪÂúħ---
    curPlayer.SetHP(curPlayer.GetMaxHP())
    curPlayer.SetMP(curPlayer.GetMaxMP())
    
    #---¸øÓèÍæ¼ÒÐÂÊÖÎïÆ·---
    itemControler = ItemControler.PlayerItemControler(curPlayer)
    
    firstLoginGiveItemList = ReadChConfig.GetEvalChConfig("FirstLogin_GiveItem")
    for itemID, itemCount, itemBind in firstLoginGiveItemList:
        if itemID == 0:
            continue
        giveItem = ItemCommon.CreateSingleItem(itemID)
        
        if not giveItem:
            GameWorld.ErrLog('__FirstLoginOnEnter giveItemErr = %s'%(itemID), playerID)
            continue
        
        if itemCount > 0:
            ItemControler.SetItemCount(giveItem, itemCount, curPlayer.GetPlayerID(), curPlayer.GetAccID(), 
                                       curPlayer.GetPlayerName())
        
        ItemControler.SetItemIsBind(giveItem, itemBind)
            
        if not itemControler.PutInItem(IPY_GameWorld.rptItem, giveItem):
            GameWorld.ErrLog('__FirstLoginOnEnter packFull, giveItemErr = %s'%(itemID), playerID)
            giveItem.Clear()
            continue
    
    #---³õʼ»¯×°±¸ÏÔÒþ---
    curPlayer.SetEquipShowSwitch(IPY_GameWorld.revClothesCoat|IPY_GameWorld.revWeaponCoat|IPY_GameWorld.revMask)
    
    #ĬÈÏ´¥·¢Ò»´Î¹¦ÄÜ¿ªÆô
    if curPlayer.GetLV() == 1:
        GameFuncComm.DoFuncOpenLogic(curPlayer)
        
    #³õʼ»¯×é¶Ó״̬
    PlayerControl.SetTeamCheckStateEx(curPlayer, 0, 1)
    
    #°´Æ½Ì¨¸øÊ׸ö³ÆºÅ
    #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)
    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 µÈ¼¶ÌáÉý,ÄúÓÐеÄÈÎÎñ¿É½ÓÊÜ!
        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
#---------------------------------------------------------------------
##ÈÎÎñ´¥·¢Æ÷_OnCoin »»È¡½ðǮʼþ
#@param curPlayer Íæ¼ÒʵÀý
#@return ·µ»ØÖµÎÞÒâÒå
#@remarks ÈÎÎñ´¥·¢Æ÷_OnCoin »»È¡½ðǮʼþ
def EventResponse_OnCoin(curPlayer):
    RunQuestEvent(curPlayer, 'on_coin', 'on_coin', Def_RunQuestType_RunAll)
    curPlayer.DataServer_CheckPrizeItem()
    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_ArenaEvent(curPlayer, eventName):
    RunQuestEvent(curPlayer, "arena_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
    
    rewardPer = 100 if rewardPer <= 0 else rewardPer
    moneyType, moneyCnt = 0, 0
    curQuestData = QuestManager.FindQuest(taskID)
    # »·ÈÎÎñÖ§³Ö¶à±¶½±ÀøÁìÈ¡
    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 ·µ»ØÖµÎÞÒâÒå
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_OnBuyTeHuiItem(curPlayer, shopID, itemShopIndex):
    # ¹ºÂòÌØ»ÝÉ̵êÎïÆ·
    RunQuestEvent(curPlayer, "on_buy_tehuiitem", "on_buy_tehuiitem", Def_RunQuestType_Normal)
    RunQuestEvent(curPlayer, "on_buy_tehuiitem", shopID, Def_RunQuestType_Normal)
    RunQuestEvent(curPlayer, "on_buy_tehuiitem", "%s_%s" % (shopID, itemShopIndex), 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_OnActiveMagicWeapon(curPlayer, mwID):
    # ¼¤»î·¨±¦
    RunQuestEvent(curPlayer, "on_activemagicweapon", mwID, Def_RunQuestType_Normal)
    RunQuestEvent(curPlayer, "on_activemagicweaponex", mwID, Def_RunQuestType_RunAll)
    RunQuestEvent(curPlayer, "on_activemagicweaponex", 0, Def_RunQuestType_RunAll)
    return
def EventRespons_MagicWeaponLV(curPlayer, mwID, lv):
    # ·¨±¦½âËø½ø¶È
    RunQuestEvent(curPlayer, "magicweaponlv", '%s_%s'%(mwID, lv), Def_RunQuestType_RunAll)
    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):
    #Éñ±ø´¸Á¶
    RunQuestEvent(curPlayer, "plusgodweapon", "plusgodweapon", Def_RunQuestType_Normal)
    return
def EventRespons_RefineItem(curPlayer, alchemyLV):
    #°ËØÔ¯Á¶µ¤
    RunQuestEvent(curPlayer, "refineitem", alchemyLV, Def_RunQuestType_Normal)
    RunQuestEvent(curPlayer, "refineitem", "refineitem", Def_RunQuestType_Normal)
    return
def EventRespons_RefineStoveUp(curPlayer, alchemyLV):
    #°ËØÔ¯ÉýÖÁX¼¶
    RunQuestEvent(curPlayer, "refinestoveup", alchemyLV, Def_RunQuestType_Normal)
    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_MWSoulActive(curPlayer, soulid):
    #·¨±¦Ö®»ê¼¤»î
    RunQuestEvent(curPlayer, "mwsoulactive", soulid, 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, equipplace):
    #´©´÷ij²¿Î»×°±¸(·ÇʱЧ)
    RunQuestEvent(curPlayer, "equipbyplace", 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):
    #Ç¿»¯µÈ¼¶±ä»¯
    RunQuestEvent(curPlayer, "equipplus", "equipplus", Def_RunQuestType_Normal)
    return
def EventRespons_EquipStar(curPlayer):
    #×°±¸×ÜÐǼ¶±ä»¯
    RunQuestEvent(curPlayer, "equipstar", "equipstar", 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)
    #ExitShopItem(curPlayer) # Ææ¼£Ö»ÔÚÇеØÍ¼¼°ÏÂÏßʱ¹Ø±Õ°Ú̯
    #ExitWatchShopItem(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 ExitShopItem(curPlayer):
    GameWorld.DebugLog("ExitShopItem", curPlayer.GetPlayerID())
    playerShop = curPlayer.GetPlayerShop()
    #ÔÚ°Ú̯״̬
    if playerShop.GetIsStartShop():
        PlayerShopItem.DoExitShop(curPlayer , curPlayer.GetPlayerShop())
        
    return
#---------------------------------------------------------------------
##½áÊø²é¿´°Ú̯ʼþ
#@param curPlayer Íæ¼ÒʵÀý
#@return ·µ»ØÖµÎÞÒâÒå
#@remarks ×Ô¶¨Ò庯Êý:½áÊø²é¿´°Ú̯ʼþ
def ExitWatchShopItem(curPlayer):
    curPlayerShop = curPlayer.GetPlayerShop()
    
    if not curPlayerShop.GetIsWatchingShop():
        return
    openShopPlayer = curPlayer.GetActionPlayer()
    __DoExitWatchShopItem(curPlayer , openShopPlayer)
    
    curPlayerShop.SetIsWatchingShop(0) 
    return
#---------------------------------------------------------------------
##½áÊø²é¿´°Ú̯ʼþ
#@param curPlayer Íæ¼ÒʵÀý
#@return ·µ»ØÖµÎÞÒâÒå
#@remarks ×Ô¶¨Ò庯Êý:½áÊø²é¿´°Ú̯ʼþ
def __DoExitWatchShopItem(curPlayer , openShopPlayer):
    
    if openShopPlayer == None:
        return
    
    shop = openShopPlayer.GetPlayerShop()
    #ûÓпªµê
    if not shop.GetIsStartShop():
        return
    
    #É̵êɾ³ýÕâ¸öÍæ¼Ò
    shop.DeleteWatchPlayer(curPlayer.GetPlayerID())
    return
#---------------------------------------------------------------------
##½áÊøÊ¼þËø
#@param curPlayer Íæ¼ÒʵÀý
#@return ·µ»ØÖµÎÞÒâÒå
#@remarks ×Ô¶¨Ò庯Êý:½áÊøÊ¼þËø
#===============================================================================
# def ExitEventLock(curPlayer):
#    if not curPlayer.GetHaveSetEventLock() :
#        return
#    
#    #ÔÚ°Ú̯״̬²»½âËø£¬Ææ¼£°Ú̯ÎïÆ·½âËøÖ»ÔÚÇеØÍ¼/ÏÂÏß/Íæ¼ÒÖ÷¶¯½áÊø°Ú̯Çé¿öϽâËø
#    playerShop = curPlayer.GetPlayerShop()
#    if playerShop.GetIsStartShop():
#        return
#    
#    #»ñµÃÍæ¼ÒÎïÆ·¹ÜÀíÆ÷
#    ItemManager = curPlayer.GetItemManager()
#    #»ñµÃ±³°ü
#    curPack = ItemManager.GetPack(IPY_GameWorld.rptItem)
#    for i in range(curPack.GetCount()):
#        item = curPack.GetAt(i)
#        if item == None or item.IsEmpty():
#            continue
#        
#        if not item.GetIsEventLocked():
#            continue
#        
#        #À뿪ʼþËø
#        item.SetIsEventLocked(False)
#===============================================================================
        
#---------------------------------------------------------------------
##½áÊø²é¿´ÅÅÐаñ
#@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
    
    #·ÅÆúÐüÉÍÈÎÎñ
    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()
    
    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):
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#    
#    materialCompoundPack = IPY_GameWorld.IPY_CMaterialCompound()
#    itemIndex = materialCompoundPack.GetItemIndex()
#    
#    curItemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
#    curItem = curItemPack.GetAt(itemIndex)
#
#    #ÀàÐͲ»·ûºÏ
#    if  not ItemCommon.CheckItemByType(curItem, ChConfig.Def_Type_Machining_Stuff):
#        PlayerControl.NotifyCode(curPlayer, "GeRen_jin_287294")
#        return
#    
#    #[½ðÇ®£¬½ðÇ®ÀàÐÍ]
#    curEffMoney = curItem.GetEffectByIndex(1)
#    useMoney = curEffMoney.GetEffectValue(0)
#    useMoneyType = curEffMoney.GetEffectValue(1)
#    
#    #ÅжϽðÇ®
#    if not PlayerControl.HaveMoney(curPlayer, useMoneyType, useMoney):
#        return
#
#    #[µÈ¼¶£¬ÊýÁ¿]
#    curEffInfo = curItem.GetEffectByIndex(0)
#    curEffectID = curEffInfo.GetEffectID()
#    curItemLv = curEffInfo.GetEffectValue(0)
#    useCount = curEffInfo.GetEffectValue(1)
#    
#    #---ÊýÁ¿ÑéÖ¤---
#    hasCount = curItem.GetCount()
#    if useCount > hasCount:
#        PlayerControl.NotifyCode(curPlayer , "GeRen_jin_293296")
#        return
#    
#    #²éÕÒ¸ü¸ßÒ»¼¶µÄ²ÄÁÏ
#    findItemData = ItemCommon.FindItemFromDataByEffValue(ChConfig.Def_Type_Machining_Stuff, curEffectID, curItemLv+1)
#    
#    #ÒѾÊǶ¥¼¶²ÄÁÏ
#    if findItemData == None:
#        PlayerControl.NotifyCode(curPlayer, "GeRen_jin_708106")
#        return
#    
#    #---´´½¨ÎïÆ·£¬·ÅÈë±³°ü£¬Ê§°ÜÔòҪɾ³ýÎïÆ·---
#    newItem = ItemCommon.CreateSingleItem(findItemData.GetItemTypeID())
#    ItemControler.SetItemIsBind(newItem, curItem.GetIsBind())
#    
#    isBind = newItem.GetIsBind()
#    
#    newItemTypeID = newItem.GetItemTypeID()
#    newItemCount = newItem.GetCount()
#    
#    #ÊÇ·ñ³É¹¦·ÅÈë±³°ü
#    itemControl = ItemControler.PlayerItemControler(curPlayer)
#    if not itemControl.PutInItem(IPY_GameWorld.rptItem, newItem):
#        PlayerControl.NotifyCode(curPlayer, "GeRen_jin_650657")
#        newItem.Clear()
#        return
#    
#    curItemID = curItem.GetItemTypeID()  #ºÏ³É²ÄÁÏID
#    
#    #---¿ÛÇ®ÎïÆ·²¢¼Ç¼---
#    PlayerControl.PayMoney(curPlayer, useMoneyType, useMoney)
#    
#    ItemCommon.DelItem(curPlayer, curItem, useCount, True, 'ComposeChip')
#    
#    #Éú³ÉÎïÆ·
#    PlayerControl.NotifyCode(curPlayer, 'GeRen_jin_557507', [newItemTypeID, newItemCount])
#    
#    #ÊÖÐø·ÑÁ÷Ïò¼Ç¼
#    PlayerControl.DataServerMoneyLog(curPlayer, useMoneyType, 650, par = useMoney, msg = "poundage")
#    
#    
#    DataRecordPack.DR_StuffMachining(curPlayer, newItemTypeID, newItemCount, isBind)
    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 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_Money, 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 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
    runTaskAwardDict = IpyGameDataPY.GetFuncEvalCfg('RunTaskAward')
    if taskType not in runTaskAwardDict:
        GameWorld.DebugLog('ÁìÈ¡»·ÈÎÎñÿÂÖ½±Àø  RunTaskAward ûÓÐÅäÖÃÀàÐ͵Ľ±Àø ÀàÐÍ %s'%taskType)
        return
    moneyNum = 0
    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 = runTaskAwardDict[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_RunTaskAwardState % taskType, 1)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RunTaskAwardRecord % taskType, moneyNum)
    GameWorld.DebugLog('ÁìÈ¡»·ÈÎÎñÿÂÖ½±Àø³É¹¦  moneyType=%s, moneyNum=%s'%(moneyType, moneyNum))
    
    #֪ͨ¿Í»§¶Ë
    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
    #¸±±¾
    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)