| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
|   | 
| ##@package PlayerTrade  | 
| # Íæ¼Ò½»Ò×Âß¼  | 
| #  | 
| # @author panwei  | 
| # @date 2010-4-28  | 
| # @version 2.3  | 
| #  | 
| # @change: "2013-03-18 16:30" wdb ½»Ò׿ªÆô  | 
| # @change: "2013-04-12 14:30" wdb ÎÞÎïÆ·½ðÇ®½»Ò×ÅжϴíÎó  | 
| # @change: "2013-09-27 15:20" hxp Ôö¼Óµ¥·½ÃæÍ˳ö½»Ò×ʱ֪ͨ¶Ô·½Í˳ö½»Ò×ÐÅÏ¢  | 
| # @change: "2013-10-12 21:10" Alee ÏµÍ³Ìáʾ  | 
| # @change: "2013-10-17 10:50" hxp Ôö¼Ó½»Ò׵ȼ¶ÏÞÖÆ  | 
| # @change: "2013-12-10 15:20" hxp Ôö¼Ó½»Ò×½ðÇ®ÀàÐÍÏÞÖÆ  | 
| # @change: "2013-12-16 18:30" hxp Ð޸Ľ»Ò×¼ì²â£¬ÐÞ¸ÄÎÞ½»Ò×ÎïÆ·Ê±·¢Ëͽ»Ò×½áÊø  | 
| # @change: "2013-12-20 10:50" xmnathan ½»Ò×Åж¨Ð޸ģ¬Ç¿»¯7ÒÔÉϼ°ÏâǶ±¦Ê¯×°±¸²»ÔÊÐí½»Ò×  | 
| # @change: "2014-01-07 15:30" hxp ÏµÍ³markÐÞ¸Ä  | 
| # @change: "2015-01-14 00:30" hxp Ôö¼Ó½»Ò×ʼþ»ã±¨  | 
| # @change: "2015-06-04 11:00" hxp °ó¶¨ÎïÆ·²»¿É½»Ò×; ·À·¶²»¿É½»Ò×µÄÎïÆ·²»¿É½»Ò×  | 
| # @change: "2015-07-03 16:00" zqx È¥³ýGMÏÞÖÆ  | 
| # @change: "2016-03-17 19:00" hxp ÐÞ¸´LostItemÁ÷ÏòÎÞ×°±¸ÏêϸÐÅÏ¢ÎÊÌâ  | 
| #---------------------------------------------------------------------  | 
| """Version = 2016-03-17 19:00"""  | 
| #---------------------------------------------------------------------  | 
| import IPY_GameWorld  | 
| import GameWorld  | 
| import ChConfig  | 
| import ItemControler  | 
| import ItemCommon  | 
| import PlayerRequest  | 
| import PlayerControl  | 
| import FunctionNPCCommon  | 
| #import PlayerVip  | 
| import DataRecordPack  | 
| import ReadChConfig  | 
| import ShareDefine  | 
| import EventReport  | 
| #---------------------------------------------------------------------  | 
| #===============================================================================  | 
| # ½»Ò×ÏûÏ¢Ìáʾ curPlayer.TradeMsg  | 
| # 1. ¶Ô·½¾Ü¾ø½»Ò×  | 
| # 2. ¶Ô·½ÎÞ»ØÓ¦  | 
| # 3. ½»Ò×ʧ°Ü, ÔÒò: ¶Ô·½½ðÇ®³¬¹ýÉÏÏÞ  | 
| # 4. ½»Ò×ʧ°Ü, ÔÒò: ¶Ô·½±³°ü¿Õ¼ä²»×ã  | 
| # 5. ½»Ò×ʧ°Ü, ÔÒò: ¶Ô·½ÒÑÀëÏß  | 
| #===============================================================================  | 
| #½»Ò×ÇëÇó  | 
| #class   IPY_CPlayerTradeAsk  | 
| #{  | 
| #public:  | 
| #  | 
| #    int      GetTagPlayerID();  | 
| #};  | 
| ## ÅжÏÊÇ·ñÄܹ»¿ªÊ¼½»Ò×   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curTagPlayer Ä¿±êÍæ¼Ò  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def __CanStartTrade(curPlayer, curTagPlayer):  | 
|     #״̬Åж¨  | 
|     if curPlayer.GetPlayerAction() not in ChConfig.Def_CanTradeState or curPlayer.IsMoving():  | 
|         PlayerControl.NotifyCode(curPlayer, "Business_Fail01")  | 
|         #PlayerControl.NotifyCode(curTagPlayer, "Business_Fail02")  | 
|         return False  | 
|       | 
|     #״̬Åж¨  | 
|     if curTagPlayer.GetPlayerAction() not in ChConfig.Def_CanTradeState or curTagPlayer.IsMoving():  | 
|         PlayerControl.NotifyCode(curPlayer, "ApplyDealingLost04")  | 
|         return False  | 
|       | 
|     return True  | 
|   | 
| ## ·¢³ö½»Ò×ÇëÇó(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return True or False  | 
| def TradeAsk(index, tick):      | 
|     sendPack = IPY_GameWorld.IPY_CPlayerTradeAsk()  | 
|     #·¢Æð½»Ò×Íæ¼Ò  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #Ä¿±êÍæ¼ÒID  | 
|     curTagPlayerID = sendPack.GetTagPlayerID()  | 
|     #½»Ò×Ä¿±êÍæ¼Ò  | 
|     curTagPlayer = GameWorld.GetObj(curTagPlayerID, IPY_GameWorld.gotPlayer)  | 
|     #·â°ü¼ì²é  | 
|     if curTagPlayer == None :  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_795514")  | 
|         return False  | 
|       | 
|     #½»Ò×»ù±¾Åж¨  | 
|     if not TradeBasicCondition(curPlayer, curTagPlayer):  | 
|         return False  | 
|       | 
|     #Ë«·½×´Ì¬ÅÐ¶Ï  | 
|     if not __CanStartTrade(curPlayer, curTagPlayer):  | 
|         return False  | 
|       | 
|     #ÎÞ·¨ºÍ×Ô¼º½»Ò×  | 
|     if curPlayer.GetID() == curTagPlayerID :  | 
|         GameWorld.Log("TradeAsk -> ÎÞ·¨ºÍ×Ô¼º½»Ò×" , curPlayer.GetPlayerID())  | 
|         return False  | 
|       | 
|     #Ìí¼ÓÇëÇó  | 
|     curPlayer.AddRequest(curTagPlayerID, IPY_GameWorld.reqTrade, tick, ChConfig.Def_EventClearTime)  | 
|   | 
|     #ÉèÖõ±Ç°×´Ì¬ÎªÑ¯Îʽ»Ò×״̬  | 
|     curPlayer.SetPlayerTradeState(IPY_GameWorld.tsTradeAsk)  | 
|   | 
|     #ÉèÖñ»Ñ¯ÎÊÈËΪ±»Ñ¯ÎÊ״̬  | 
|     curTagPlayer.SetPlayerTradeState(IPY_GameWorld.tsTradeAsked)  | 
|   | 
|     #Ä¿±êÍæ¼ÒÌáʾÐÅÏ¢  | 
|     curTagPlayer.RequestWarn(IPY_GameWorld.reqTrade , curPlayer.GetID() , curPlayer.GetPlayerName())  | 
|       | 
|     #InviteDealing ½»Ò×ÑûÇëÒѾ·¢³ö£¬ÇëµÈ´ý¶Ô·½Ó¦´ð£¡  | 
|     PlayerControl.NotifyCode(curPlayer, "InviteDealing")  | 
|     return True   | 
|   | 
|   | 
| #»ØÓ¦¶Ô·½µÄ½»Ò×ÇëÇó  | 
| #class   IPY_CTradeAnswer  | 
| #{  | 
| #public:  | 
| #  | 
| #    int      GetHostPlayerID();  | 
| #    //0: ¾Ü¾ø½»Ò× 1:½ÓÊܽ»Ò× 2: ³¬Ê±  | 
| #    int      GetType();  | 
| #};  | 
| ## »ØÓ¦½»Ò×ÇëÇó(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None or True or False  | 
| def TradeAnswer(index, tick):  | 
|     sendPack = IPY_GameWorld.IPY_CTradeAnswer()  | 
|     #½»Ò×Ä¿±êÍæ¼Ò  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #½»Ò×·¢ÆðÍæ¼Ò  | 
|     curTagPlayer = GameWorld.GetObj(sendPack.GetHostPlayerID(), IPY_GameWorld.gotPlayer)  | 
|       | 
|     if curTagPlayer == None:  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_795514")  | 
|         return False  | 
|       | 
|     #״̬ÅÐ¶Ï  | 
|     if not __CanStartTrade(curPlayer, curTagPlayer):  | 
|         return False  | 
|       | 
|     if not PlayerRequest.CheckRequest(curTagPlayer, curPlayer, IPY_GameWorld.reqTrade):  | 
|         GameWorld.Log("TradeAnswer ->Request no record" , curPlayer.GetPlayerID() , curTagPlayer.GetPlayerID())  | 
|         return False  | 
|     | 
|     #½»Ò×Ä¿±êÍæ¼ÒÎÞask·â°ü  | 
|     if curPlayer.GetPlayerTradeState() != IPY_GameWorld.tsTradeAsked :  | 
|         GameWorld.Log("TradeAnswer->Trade not Asked" , curPlayer.GetPlayerID() , curTagPlayer.GetPlayerID())  | 
|         return False  | 
|       | 
|     #½»Ò×»ù±¾Åж¨  | 
|     if not TradeBasicCondition(curPlayer, curTagPlayer):  | 
|         #GameWorld.Log("²»Âú×ã½»Ò×»ù±¾Åж¨")  | 
|         return False  | 
|       | 
|     answerType = sendPack.GetType()  | 
|       | 
|     #¶Ô·½ÎÞµã»÷È·¶¨»ò³¬Ê±,·µ»Ø  | 
|     if answerType != 1:  | 
|         if answerType == 0:  | 
|             curPlayer.TradeMsg(1)  | 
|             #CancelLockedDealing02 ¶Ô·½È¡Ïû½»Ò×  | 
|             PlayerControl.NotifyCode(curTagPlayer, "CancelLockedDealing02")  | 
|               | 
|         else:  | 
|             curPlayer.TradeMsg(2)  | 
|             #CancelLockedDealing03 Ä¿±êÍæ¼Ò¶ÔÄúµÄ½»Ò×ÇëÇóδ×ö³öÈκÎÏìÓ¦£¬ÇëÇó³¬Ê±  | 
|             PlayerControl.NotifyCode(curTagPlayer, "CancelLockedDealing03")  | 
|               | 
|         curPlayer.ClearRequest()  | 
|         curTagPlayer.ClearRequest()  | 
|         return False  | 
|       | 
|     #ÉèÖÃË«·½×´Ì¬Îª¿ªÊ¼½»Ò×״̬  | 
|     curPlayer.SetPlayerTradeState(IPY_GameWorld.tsTradeBegin)  | 
|     curTagPlayer.SetPlayerTradeState(IPY_GameWorld.tsTradeBegin)  | 
|     #ÉèÖõ±Ç°½»Ò×¶ÔÏó  | 
|     curPlayer.SetActionObj(curTagPlayer)  | 
|     curTagPlayer.SetActionObj(curPlayer)  | 
|     #¿ªÊ¼½»Ò×  | 
|     curPlayer.StartTrade(curTagPlayer.GetID())  | 
|     curTagPlayer.StartTrade(curPlayer.GetID())  | 
|     #Çå¿ÕÉϴν»Ò×ÁÐ±í  | 
|     curPlayer.GetTradeList().Clear()  | 
|   | 
|     curPlayer.ClearRequest()  | 
|     curTagPlayer.ClearRequest()  | 
|     return True  | 
|   | 
| ## 2¸öÍæ¼ÒÊÇ·ñ½»Ò×ÖР  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curTagPlayer Ä¿±êÍæ¼Ò  | 
| #  @return True or False  | 
| def __IsTrading(curPlayer, curTagPlayer):  | 
|     if curPlayer.GetPlayerAction() != IPY_GameWorld.paTrade:  | 
|         #GameWorld.Log("½»Ò×״̬²»¶Ô")  | 
|         return False  | 
|       | 
|     if curTagPlayer.GetPlayerAction() != IPY_GameWorld.paTrade:  | 
|         #GameWorld.Log("Ä¿±ê½»Ò×״̬²»¶Ô")  | 
|         return False  | 
|       | 
|     return True  | 
|   | 
|   | 
| #°ÑÎïÆ··Åµ½½»Ò×À¸  | 
| #class   IPY_CPutItemTrade  | 
| #{  | 
| #public:  | 
| #  | 
| #    int      GetItemIndex();  | 
| #};    | 
| ## °ÑÎïÆ··ÅÈë½»Ò×À¸(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return True or False  | 
| def PutItemTrade(index, tick):  | 
|     #===========================================================================  | 
|     # sendPack = IPY_GameWorld.IPY_CPutItemTrade()  | 
|     # #·¢Æð½»Ò×Íæ¼Ò  | 
|     # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     # #½»Ò×½ÓÊÜ·½  | 
|     # curTagPlayer = curPlayer.GetActionPlayer()  | 
|     #   | 
|     # #½»Ò×»ù±¾Åж¨  | 
|     # if not TradeBasicCondition(curPlayer, curTagPlayer):  | 
|     #    #GameWorld.Log("²»Âú×ã½»Ò×»ù±¾Åж¨")  | 
|     #    return False  | 
|     #   | 
|     # #״̬Åж¨  | 
|     # if not __IsTrading(curPlayer, curTagPlayer) :  | 
|     #    #GameWorld.Log("µ±Ç°×´Ì¬²»Êǽ»Ò×״̬")  | 
|     #    return False  | 
|     #   | 
|     # #µ±Ç°×´Ì¬²»ÊÇ¿ªÊ¼½»Ò×״̬  | 
|     # if curPlayer.GetPlayerTradeState() != IPY_GameWorld.tsTradeBegin:  | 
|     #    #GameWorld.Log("·ÅÈëÎïÆ·Ê±µÄ״̬²»ÊÇ¿ªÊ¼½»Ò×״̬")  | 
|     #    return False  | 
|     #   | 
|     # #·¢Æð½»Ò×Íæ¼ÒµÄÎïÆ·±³°ü  | 
|     # backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|     # #»ñµÃµ±Ç°ÎïÆ·  | 
|     # curItem = backPack.GetAt(sendPack.GetItemIndex())  | 
|     #   | 
|     # if not CheckTradeItem(curPlayer, curItem):  | 
|     #    return  | 
|     #   | 
|     # #»ñµÃ×Ô¼ºµÄ½»Ò×ÁÐ±í  | 
|     # tradeList = curPlayer.GetTradeList()  | 
|     # #½»Ò×À¸ÒÑÂú  | 
|     # if tradeList.GetPutInCount() >= tradeList.GetTradeItemCount():  | 
|     #    return False  | 
|     #   | 
|     # #Ìí¼ÓÎïÆ·  | 
|     # tradeList.AddItem(sendPack.GetItemIndex())  | 
|     # #ÉèÖÃÎïÆ·ÎªËø¶¨×´Ì¬  | 
|     # curItem.SetIsEventLocked(True)  | 
|     #===========================================================================  | 
|     return True  | 
|   | 
|   | 
| #°ÑÎïÆ·´Ó½»Ò×À¸Ð¶Ïµ½°ü¹ü  | 
| #class   IPY_CGetBackItemInTrade  | 
| #{  | 
| #public:  | 
| #    ////½»Ò×ÁбíµÄÐòºÅ  | 
| #    int      GetTradeIndex();  | 
| #};  | 
| ## °ÑÎïÆ·´Ó½»Ò×À¸Ð¶Ïµ½±³°ü(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def GetBackItemInTrade(index, tick):  | 
|     #===========================================================================  | 
|     # sendPack = IPY_GameWorld.IPY_CGetBackItemInTrade()  | 
|     # #·¢Æð½»Ò×Íæ¼Ò  | 
|     # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     # #½»Ò×½ÓÊÜ·½  | 
|     # curTagPlayer = curPlayer.GetActionPlayer()  | 
|     # #½»Ò×»ù±¾Åж¨  | 
|     # if not TradeBasicCondition(curPlayer, curTagPlayer):  | 
|     #    #GameWorld.Log("²»Âú×ã½»Ò×»ù±¾Åж¨")  | 
|     #    return False  | 
|     #   | 
|     # #״̬Åж¨  | 
|     # if not __IsTrading(curPlayer, curTagPlayer):  | 
|     #    #GameWorld.Log("µ±Ç°×´Ì¬²»Êǽ»Ò×״̬")  | 
|     #    return False  | 
|     #   | 
|     # #µ±Ç°×´Ì¬²»ÊÇ¿ªÊ¼½»Ò×״̬  | 
|     # if curPlayer.GetPlayerTradeState() != IPY_GameWorld.tsTradeBegin:  | 
|     #    GameWorld.Log("жÏÂÎïÆ·Ê±µÄ״̬²»ÊÇ¿ªÊ¼½»Ò×״̬ %d " % (curPlayer.GetPlayerTradeState()) , curPlayer.GetPlayerID())  | 
|     #    return False  | 
|     #   | 
|     # #»ñµÃ×Ô¼ºµÄ½»Ò×ÁÐ±í  | 
|     # tradeList = curPlayer.GetTradeList()  | 
|     # #»ñµÃ½»Ò×À¸Ë÷Òý  | 
|     # tradeIndex = sendPack.GetTradeIndex()  | 
|     # itemIndex = tradeList.GetTradeItem(tradeIndex)  | 
|     # #·¢Æð½»Ò×Íæ¼ÒµÄÎïÆ·±³°ü  | 
|     # backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|     # #»ñµÃµ±Ç°ÎïÆ·  | 
|     # curItem = backPack.GetAt(itemIndex)  | 
|     # if curItem == None or curItem.IsEmpty():  | 
|     #    return False  | 
|     #   | 
|     # #ɾ³ýÎïÆ·Ë÷Òý  | 
|     # tradeList.DeleteByIndex(tradeIndex)  | 
|     # #°ü¹üÖеÄÎïÆ·½âËø  | 
|     # curItem.SetIsEventLocked(False)  | 
|     #===========================================================================  | 
|     return  | 
|   | 
|   | 
| ## À뿪½»Ò×   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param type ½áÊøÀàÐÍ  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def LeaveTrade(curPlayer, type):  | 
|     if curPlayer == None or curPlayer.GetID() == 0:  | 
|         return False  | 
|       | 
|     #ÊÇ·ñÔÚ½»Ò×״̬  | 
|     if curPlayer.GetPlayerAction() != IPY_GameWorld.paTrade:  | 
|         return False  | 
|       | 
|     #½ÓÊܽ»Ò×·½  | 
|     curTagPlayer = curPlayer.GetActionPlayer()      | 
|     if not curTagPlayer or curTagPlayer.GetID() == 0 :  | 
|         #Ä¿±ê²»´æÔÚ,×Ô¼º½áÊø½»Ò×  | 
|         unTrade(curPlayer, type)  | 
|         return False  | 
|       | 
|     #²»ÔÚ½»Ò×״̬,²»´¦Àí  | 
|     if curTagPlayer.GetPlayerAction() != IPY_GameWorld.paTrade:  | 
|         return False  | 
|       | 
|     #Ë«·½À뿪½»Ò×  | 
|     unTrade(curPlayer, type)  | 
|     unTrade(curTagPlayer, type)  | 
|       | 
|     # Í˳ö½»Ò×ʱ֪ͨ¶Ô·½Í˳ö½»Ò×ÐÅÏ¢  | 
|     if type == 0:  | 
|         PlayerControl.NotifyCode(curTagPlayer, "CancelLockedDealing02")  | 
|     return True  | 
|   | 
| #Ò»·½Í˳ö½»Ò×  | 
| #//0A 07 Í˳ö½»Ò×#tagCExitTrade  | 
| #tagCExitTrade       *   GettagCExitTrade();  | 
| #  | 
| #class   IPY_CExitTrade  | 
| #{  | 
| #public:  | 
| #  | 
| #    int      GetType();  | 
| #};  | 
| ## Õý³£Í˳ö½»Ò×(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def ExitTrade(index, tick):  | 
|     sendPack = IPY_GameWorld.IPY_CExitTrade()  | 
|     #µ±Ç°Íæ¼Ò  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     LeaveTrade(curPlayer, sendPack.GetType())  | 
|     return True  | 
|   | 
|   | 
| #//0A 08 Ô¶³Ì··ÊÛµÀ¾ß#tagCSaleItem   | 
| #  | 
| #struct tagCSaleItem   | 
| #{   | 
| #WORD UseItem; // Ê¹ÓõĵÀ¾ßË÷Òý   | 
| #WORD SaleItem1; // ··ÂôµÄÎïÆ·1   | 
| #WORD SaleItem2; // ··ÂôµÄÎïÆ·2   | 
| #WORD SaleItem3; // ··ÂôµÄÎïÆ·3   | 
| #WORD SaleItem4; // ··ÂôµÄÎïÆ·4   | 
| #WORD SaleItem5; // ··ÂôµÄÎïÆ·5   | 
| #WORD SaleItem6; // ··ÂôµÄÎïÆ·6   | 
| #};   | 
| ## Ô¶³Ì··ÊÛµÀ¾ß  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def LongDistanceSaleItem(index, tick):  | 
|     return  | 
| #===============================================================================  | 
| #    # µ±Ç°Íæ¼Ò  | 
| #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
| #    vipLv = curPlayer.GetVIPLv()  | 
| #      | 
| #    #µÈ¼¶²»×ã  | 
| #    #if not PlayerVip.GetVipCanFarSellItem(vipLv):  | 
| #    #    return  | 
| #      | 
| #    # µ±Ç°·Ç¿ÕÏÐ״̬      | 
| #    if not PlayerControl.IsPlanStateNull(curPlayer):  | 
| #        PlayerControl.NotifyCode(curPlayer, "CanNotUseAffectActionItem", [ChConfig.Def_ItemID_LongSaleItem])  | 
| #        return  | 
| #   | 
| #    sendPack = IPY_GameWorld.IPY_CSaleItem()  | 
| #    curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
| #    useItem = ItemCommon.FindItemInPackByEffectEx(curPlayer, ChConfig.Def_Effect_FarSellItem)  | 
| #      | 
| #    isUseItem = True  | 
| #    useMoney = 0  | 
| #      | 
| #    if not ItemCommon.CheckItemCanUse(useItem):  | 
| #        isUseItem = False  | 
| #        #useMoney = PlayerVip.GetVipFarSellCost(vipLv)  | 
| #          | 
| #        #ÑéÖ¤½ð¶î  | 
| #        if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, useMoney):  | 
| #            return  | 
| #      | 
| #    saleItemIndex1 = sendPack.GetSaleItem1()  | 
| #    saleItemIndex2 = sendPack.GetSaleItem2()  | 
| #    saleItemIndex3 = sendPack.GetSaleItem3()  | 
| #    saleItemIndex4 = sendPack.GetSaleItem4()  | 
| #    saleItemIndex5 = sendPack.GetSaleItem5()  | 
| #    saleItemIndex6 = sendPack.GetSaleItem6()  | 
| #      | 
| #    saleItemIndexList = [saleItemIndex1, saleItemIndex2, saleItemIndex3, \  | 
| #                         saleItemIndex4, saleItemIndex5, saleItemIndex6]  | 
| #      | 
| #    # ±äÁ¿ÎïÆ·½øÐз·ÊÛ  | 
| #    for saleItemIndex in saleItemIndexList:  | 
| #        if saleItemIndex < 0 or saleItemIndex >= curPack.GetMaxCount():  | 
| #            continue  | 
| #        FunctionNPCCommon.SellPackItem(curPlayer, IPY_GameWorld.rptItem, saleItemIndex, ChConfig.Def_ShopType_LongSale)  | 
| #      | 
| #    if isUseItem:  | 
| #        #--¿Û³ýµÀ¾ßÎïÆ·--  | 
| #        ItemCommon.DelItem(curPlayer, useItem, 1, True, "LongDistanceSaleItem")  | 
| #    else:  | 
| #        payType = IPY_GameWorld.TYPE_Price_Gold_Money  | 
| #        #¿Û½ð¶î  | 
| #        if not PlayerControl.PayMoney(curPlayer, payType, useMoney, ChConfig.Def_Cost_Trade):  | 
| #            return  | 
| #        #Ïû·Ñ¼Ç¼  | 
| #        GameWorld.Login_Interface_GoldRec(curPlayer, 0, 1, 'FarSell', IPY_GameWorld.TYPE_Price_Gold_Money, useMoney)  | 
| #      | 
| #    return  | 
| #===============================================================================  | 
|   | 
|       | 
| #½»Ò×Ëø¶¨  | 
| #class   IPY_CTradeLock  | 
| #{  | 
| #public:  | 
| #    //1: ½»Ò×È·ÈÏ 0: È¡ÏûÈ·ÈÏ  | 
| #    int      GetType();  | 
| #    int      GetMoney();  | 
| #};  | 
| ## ½»Ò×Ëø¶¨(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def TradeLock(index, tick):  | 
|       | 
|     sendPack = IPY_GameWorld.IPY_CTradeLock()  | 
|     #µã»÷Ëø¶¨µÄÍæ¼Ò  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #Ä¿±êÍæ¼Ò  | 
|     curTagPlayer = curPlayer.GetActionPlayer()  | 
|     #½»Ò×»ù±¾Åж¨  | 
|     if not TradeBasicCondition(curPlayer, curTagPlayer):  | 
|         #GameWorld.Log("½»Ò×Ëø¶¨(·â°ü²ÎÊý)²»Âú×ã½»Ò×»ù±¾Åж¨")  | 
|         return False  | 
|       | 
|     #״̬Åж¨  | 
|     if not __IsTrading(curPlayer, curTagPlayer):  | 
|         #GameWorld.Log("½»Ò×Ëø¶¨(·â°ü²ÎÊý)µ±Ç°×´Ì¬²»Êǽ»Ò×״̬")  | 
|         return False  | 
|       | 
|     #·â°ü״̬  | 
|     lockType = sendPack.GetType()  | 
|       | 
|     #½â³ýËø¶¨  | 
|     if lockType == 0:  | 
|         #Ä¿±êÍæ¼ÒδµãËø¶¨  | 
|         if curTagPlayer.GetPlayerTradeState() == IPY_GameWorld.tsTradeBegin:  | 
|             curPlayer.SetPlayerTradeState(IPY_GameWorld.tsTradeBegin)  | 
|             curPlayer.SetTradeLock(False, 0, 0, 0, 0)  | 
|         #Ä¿±êÒѾµãËø¶¨»òÒѵ㽻Ò×  | 
|         else:  | 
|             curPlayer.SetPlayerTradeState(IPY_GameWorld.tsTradeBegin)  | 
|             curPlayer.SetTradeLock(False, 0, 0, 0, 0)  | 
|             curTagPlayer.SetPlayerTradeState(IPY_GameWorld.tsTradeBegin)  | 
|             curTagPlayer.SetTradeLock(False, 0, 0, 0, 0)  | 
|               | 
|         #CancelLockedDealing ¶Ô·½È¡ÏûËø¶¨½»Ò×£¡  | 
|         PlayerControl.NotifyCode(curTagPlayer, "CancelLockedDealing")  | 
|         return False  | 
|       | 
|     #È·ÈÏËø¶¨  | 
|     if curPlayer.GetPlayerTradeState() != IPY_GameWorld.tsTradeBegin:  | 
|         #Íæ¼Òµ±Ç°×´Ì¬,ÎÞ·¨È·ÈÏËø¶¨  | 
|         return False  | 
|       | 
|     # ÅжϽðÇ®  | 
|     sendGold = sendPack.GetGold()  | 
|     if CheckMoneyInvalid(curPlayer, sendGold, curPlayer.GetGold(), "GoldErr"):  | 
|         return False    | 
|   | 
|     sendGPaper = sendPack.GetGoldPaper()  | 
|     if CheckMoneyInvalid(curPlayer, sendGPaper, curPlayer.GetGoldPaper(), "GoldPaperErr"):  | 
|         return False    | 
|       | 
|     sendSilver = sendPack.GetSilver()  | 
|     if CheckMoneyInvalid(curPlayer, sendSilver, PlayerControl.GetSilver(curPlayer), "SilverErr"):  | 
|         return False  | 
|   | 
|     sendSPaper = sendPack.GetSilverPaper()  | 
|     if CheckMoneyInvalid(curPlayer, sendSPaper, curPlayer.GetSilverPaper(), "SilverPaperErr"):  | 
|         return False  | 
|       | 
|     # Ææ¼£Ö»ÔÊÐí½»ÒׯÕͨ½ð±Ò - hxp  | 
|     if sendGold > 0 or sendGPaper > 0 or sendSPaper > 0:  | 
|         GameWorld.ErrLog("sendGold > 0 or sendGPaper > 0 or sendSPaper > 0", curPlayer.GetID())  | 
|         return False  | 
|       | 
|     #Ëø¶¨³É¹¦  | 
|     curPlayer.SetTradeLock(True, sendGold, sendGPaper, sendSilver, sendSPaper)  | 
|     #ÉèÖõ±Ç°×´Ì¬ÎªËø¶¨×´Ì¬  | 
|     curPlayer.SetPlayerTradeState(IPY_GameWorld.tsTradeConfirm)  | 
|      | 
|     #LockedDealing   ¶Ô·½ÒÑ¾Ëø¶¨½»Ò×£¬ÇëÈ·ÈϽ»Ò×ÎïÆ·£¡  | 
|     PlayerControl.NotifyCode(curTagPlayer, "LockedDealing")  | 
|       | 
|     return True  | 
|   | 
| ## ¼ì²â½ðÇ®ÊÇ·ñ²»ÕýÈ·  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return None  | 
| def CheckMoneyInvalid(curPlayer, sendMoney, playerMoney, notify):  | 
|   | 
|     if sendMoney < 0 or playerMoney < sendMoney:  | 
|         PlayerControl.NotifyCode(curPlayer, notify)  | 
|         return True  | 
|       | 
|     return False  | 
|   | 
|   | 
| ## ½»Ò×ʧ°Üºó, Íæ¼ÒÒª×öµÄÊÂÇé(²ÎÊý -> µ±Ç°Íæ¼Ò)  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def TradeOKFail(curPlayer):  | 
|     #===========================================================================  | 
|     # curPlayer.SetPlayerTradeState(IPY_GameWorld.tsTradeBegin)  | 
|     # curPlayer.SetTradeLock(False, 0, 0, 0, 0)  | 
|     # #ÄûØËùÓÐÎïÆ·  | 
|     # #ÓÉÓÚtradeListÁбíÔڵײ㹹½¨Îª¾²Ì¬Áбí(³¤¶È¹Ì¶¨), ËùÒÔÔÚÏÂÃæ  | 
|     # #¿ÉÒÔÔÚforÖÐÖ±½Óɾ³ýµÚi¸öÔªËØ  | 
|     # tradeList = curPlayer.GetTradeList()  | 
|     # #·¢Æð½»Ò×Íæ¼ÒµÄÎïÆ·±³°ü  | 
|     # backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|     # for i in range(tradeList.GetTradeItemCount()):  | 
|     #    itemIndex = tradeList.GetTradeItem(i)  | 
|     #      | 
|     #    if itemIndex < 0:  | 
|     #        continue  | 
|     #      | 
|     #    tradeList.DeleteByIndex(i)  | 
|     #      | 
|     #    #°ü¹üÖеÄÎïÆ·½âËø  | 
|     #    #»ñµÃµ±Ç°ÎïÆ·  | 
|     #    curItem = backPack.GetAt(itemIndex)  | 
|     #    #°ü¹üÖеÄÎïÆ·½âËø  | 
|     #      | 
|     #    if not curItem.IsEmpty():  | 
|     #        curItem.SetIsEventLocked(False)  | 
|     #          | 
|     # #½áÊøµ±Ç°½»Ò×  | 
|     # unTrade(curPlayer, 0)  | 
|     #===========================================================================  | 
|     return  | 
|   | 
| #½»Ò×µã»÷È·ÈÏ  | 
| #class   IPY_CTradeOK  | 
| #{  | 
| #public:  | 
| #    //1: OK 0: Cancel  | 
| #    int      GetType();  | 
| #};  | 
| ## ½»Ò׳ɹ¦(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def TradeOK(index, tick):  | 
|     sendPack = IPY_GameWorld.IPY_CTradeOK()  | 
|     #·¢Æð½»Ò×Íæ¼Ò  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #½ÓÊܽ»Ò×·½  | 
|     curTagPlayer = curPlayer.GetActionPlayer()  | 
|     #½»Ò×»ù±¾Åж¨  | 
|     if not TradeBasicCondition(curPlayer, curTagPlayer):  | 
|         #GameWorld.Log("TradeOK²»Âú×ã½»Ò×»ù±¾Åж¨")  | 
|         return False  | 
|       | 
|     #״̬Åж¨  | 
|     if not __IsTrading(curPlayer, curTagPlayer):  | 
|         #GameWorld.Log("TradeOKµ±Ç°×´Ì¬²»Êǽ»Ò×״̬")  | 
|         return False  | 
|   | 
|     #ûѡÔñÈ·¶¨  | 
|     if sendPack.GetType() != 1:  | 
|         #½â³ý½»Ò×  | 
|         unTrade(curPlayer, 0)  | 
|         unTrade(curTagPlayer, 0)  | 
|         return False  | 
|   | 
|     if curPlayer.GetPlayerTradeState() != IPY_GameWorld.tsTradeConfirm:  | 
|         #Ö»ÓÐÏÈËø¶¨ºó,²Å¿ÉÒÔ½»Ò×  | 
|         return False  | 
|           | 
|     #»ñµÃ×Ô¼ºµÄ½»Ò×Çåµ¥  | 
|     curPlayerTradeList = curPlayer.GetTradeList()  | 
|     #»ñµÃ¶Ô·½µÄ½»Ò×Çåµ¥  | 
|     curTagPlayerTradeList = curTagPlayer.GetTradeList()  | 
|     #»ñµÃ×Ô¼ºµÄ±³°ü  | 
|     curPlayerPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|     #»ñµÃ¶Ô·½µÄ±³°ü  | 
|     curTagPlayerPack = curTagPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|           | 
|     #ÉèÖõ±Ç°×´Ì¬ÎªOK״̬  | 
|     curPlayer.SetPlayerTradeState(IPY_GameWorld.tsTradeOK)  | 
|       | 
|     #---------------------------------Èç¹ûË«·½¶¼OK,¿ªÊ¼½»Ò×------------------------------------  | 
|     #Ë«·½¶¼µã»÷OK  | 
|     if curTagPlayer.GetPlayerTradeState() == IPY_GameWorld.tsTradeOK :  | 
|   | 
|         # ÎÞ½ðÇ®ºÍÎïÆ·½»Ò×  | 
|         if max(TradeMoneyCount(curPlayerTradeList)) <= 0 and max(TradeMoneyCount(curTagPlayerTradeList)) <= 0 \  | 
|             and CheckIsEmptyItem(curPlayerTradeList) and CheckIsEmptyItem(curTagPlayerTradeList):  | 
|               | 
|             TradeOKFail(curPlayer)  | 
|             TradeOKFail(curTagPlayer)  | 
|             return False   | 
|   | 
|         # ½»Ò×ǰ½ðÇ®  | 
|         curGold, curGPaper, curSilver, curSPaper = GetPlayerMoney(curPlayer)  | 
|         tagGold, tagGPaper, tagSilver, tagSPaper = GetPlayerMoney(curTagPlayer)  | 
|           | 
|         #·ÅÈëÎïÆ·  | 
|         if not TradePutIn(curPlayer, curTagPlayer, curPlayerTradeList, curTagPlayerTradeList, curTagPlayerPack, curPlayerPack):  | 
|             #GameWorld.Log("·ÅÈëÎïÆ·Ê§°Ü")  | 
|             TradeOKFail(curPlayer)  | 
|             TradeOKFail(curTagPlayer)  | 
|             return False  | 
|           | 
| #        #¼Ç¼´ó¶î¶È½ðÇ®½»Ò×  | 
| #        __LargeTradeMoney(curPlayer,curTagPlayer,curPlayerTradeList,curTagPlayerTradeList)  | 
|         # ½»Ò×ÖнðÇ®±ä»¯  | 
|         DataRecordPack.DR_TradeMoney(curPlayer, curTagPlayer, curGold, curGPaper, curSilver, curSPaper)  | 
|         DataRecordPack.DR_TradeMoney(curTagPlayer, curPlayer, tagGold, tagGPaper, tagSilver, tagSPaper)  | 
|           | 
|         #Ë«·½½áÊøµ±Ç°½»Ò×  | 
|         unTrade(curPlayer, 1)  | 
|         unTrade(curTagPlayer, 1)  | 
|             | 
|     return True  | 
|   | 
|   | 
| ## »ñµÃÍæ¼Ò½ðÇ®   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return   | 
| def GetPlayerMoney(player):  | 
|     return player.GetGold(), player.GetGoldPaper(), PlayerControl.GetSilver(player), player.GetSilverPaper()  | 
|   | 
|   | 
| ## ÅжÏÊÇ·ñʱ¿ÕÎïÆ·ÁÐ±í   | 
| #  @param tradeList ½»Ò×ÁÐ±í  | 
| #  @return   | 
| def CheckIsEmptyItem(tradeList):  | 
|   | 
|     for i in range(0, tradeList.GetTradeItemCount()):  | 
|         if tradeList.GetTradeItem(i) >= 0:  | 
|             return False  | 
|       | 
|     return True       | 
|                   | 
| #===============================================================================  | 
| ### ¼Ç¼´ó¶î¶È½ðÇ®½»Ò×------------------  | 
| ##  @param curPlayer µ±Ç°Íæ¼Ò  | 
| ##  @param curTagPlayer ½»Ò×¶Ô·½  | 
| ##  @param curPlayerTradeList ½»Ò×ÐÅÏ¢  | 
| ##  @param curTagPlayerTradeList ¶Ô·½½»Ò×ÐÅÏ¢  | 
| ##  @return None  | 
| ##  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| #def __LargeTradeMoney(curPlayer,curTagPlayer,curPlayerTradeList,curTagPlayerTradeList):  | 
| #    playerID = curPlayer.GetPlayerID()  | 
| #    haveGold = curPlayer.GetGold()  | 
| #    haveSilver = PlayerControl.GetSilver(curPlayer)  | 
| #    tagPlayerID = curTagPlayer.GetPlayerID()  | 
| #    tagHaveGold = curTagPlayer.GetGold()  | 
| #    tagHaveSilver = PlayerControl.GetSilver(curTagPlayer)  | 
| #      | 
| #    curPlayerTradeMoney = curPlayerTradeList.GetMoney()  | 
| #    curTagPlayerTradeMoney = curTagPlayerTradeList.GetMoney()  | 
| #      | 
| #    #Ë«·½¶¼¸øÓè´ó¶î¶È½ð¶î£¬ÎÞÁĵÄÈËÀà°¡  | 
| #    if curPlayerTradeMoney >= ChConfig.Def_LargeTrade_Silver and \  | 
| #    curTagPlayerTradeMoney >= ChConfig.Def_LargeTrade_Silver:  | 
| #  | 
| #        GameWorld.NoteDownLargeTrade(  | 
| #                                     tradeSilver = curPlayerTradeMoney,  | 
| #                                     senderID = playerID,  | 
| #                                     senderGold = haveGold,  | 
| #                                     senderSilver = haveSilver,  | 
| #                                     )  | 
| #  | 
| #        GameWorld.NoteDownLargeTrade(  | 
| #                                     tradeSilver = curTagPlayerTradeMoney,  | 
| #                                     receiverID = tagPlayerID,  | 
| #                                     receiverGold = tagHaveGold,  | 
| #                                     receiverSilver = tagHaveSilver  | 
| #                                     )  | 
| #        return  | 
| #      | 
| #    #µ¥Ïò¸øÓè´ó¶î¶È½ð¶î  | 
| #    #Ò»´ÎÐÔ½»Ò×ÖУ¬Ô·½¸øÓèµÄ½ð¶î  | 
| #    if curPlayerTradeMoney >= ChConfig.Def_LargeTrade_Silver:  | 
| #        GameWorld.NoteDownLargeTrade(  | 
| #                                     tradeSilver = curPlayerTradeMoney,  | 
| #                                     senderID = playerID,  | 
| #                                     senderGold = haveGold,  | 
| #                                     senderSilver = haveSilver,  | 
| #                                     receiverID = tagPlayerID,  | 
| #                                     receiverGold = tagHaveGold,  | 
| #                                     receiverSilver = tagHaveSilver  | 
| #                                     )  | 
| #      | 
| #    #Ò»´ÎÐÔ½»Ò×ÖУ¬¶Ô·½¸øÓèµÄ½ð¶î  | 
| #    if curTagPlayerTradeMoney >= ChConfig.Def_LargeTrade_Silver:  | 
| #        GameWorld.NoteDownLargeTrade(  | 
| #                                     tradeSilver = curTagPlayerTradeMoney,  | 
| #                                     senderID = playerID,  | 
| #                                     senderGold = haveGold,  | 
| #                                     senderSilver = haveSilver,  | 
| #                                     receiverID = tagPlayerID,  | 
| #                                     receiverGold = tagHaveGold,  | 
| #                                     receiverSilver = tagHaveSilver  | 
| #                                     )  | 
| #          | 
| ### ¼Ç¼´ó¶îÎïÆ·½»Ò×  | 
| ##  @param curPlayer µ±Ç°Íæ¼Ò  | 
| ##  @param curTagPlayer ¶Ô·½Íæ¼Ò  | 
| ##  @param curItem ½»Ò×ÎïÆ·  | 
| ##  @return None  | 
| ##  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| #def __LargeTradeItem(curPlayer,curTagPlayer,curItem):  | 
| #    curItemID = curItem.GetItemTypeID()  | 
| #    if curItemID not in ChConfig.Def_ItemID_LargeTrade:  | 
| #        return  | 
| #      | 
| #    curCount = curItem.GetCount()  | 
| #    if curCount != curItem.GetPackCount():  | 
| #        return  | 
| #      | 
| #    GameWorld.NoteDownLargeTrade(  | 
| #                                 tradeItemID = curItemID,  | 
| #                                 tradeItemCount = curCount,  | 
| #                                 senderID = curPlayer.GetPlayerID(),  | 
| #                                 senderGold = curPlayer.GetGold(),  | 
| #                                 senderSilver = PlayerControl.GetSilver(curPlayer),  | 
| #                                 receiverID = curTagPlayer.GetPlayerID(),  | 
| #                                 receiverGold = curTagPlayer.GetGold(),  | 
| #                                 receiverSilver = PlayerControl.GetSilver(curTagPlayer)  | 
| #                                 )  | 
| #===============================================================================  | 
|   | 
|   | 
| ## ½«½»Ò×À¸ÖеÄÎïÆ··ÅÈë±³°ü   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curTagPlayer Ä¿±êÍæ¼Ò  | 
| #  @param curPlayerTradeList µ±Ç°Íæ¼Ò½»Ò×Çåµ¥,  | 
| #  @param curTagPlayerTradeList Ä¿±êÍæ¼Ò½»Ò×Çåµ¥,   | 
| #  @param curTagPlayerPack Ä¿±êÍæ¼Ò±³°ü  | 
| #  @param curPlayerPack  µ±Ç°Íæ¼Ò±³°ü  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def TradePutIn(curPlayer, curTagPlayer, curPlayerTradeList, curTagPlayerTradeList, curTagPlayerPack, curPlayerPack):  | 
|     #¼ì²é±³°ü¿Õ¼äºÍÒø×ÓÉÏÏÞÊÇ·ñÂú×ãÌõ¼þ  | 
|     if not TradePackCanPutIn(curPlayer, curTagPlayer, curTagPlayerTradeList, curPlayerTradeList , curTagPlayerPack) or \  | 
|         not TradePackCanPutIn(curTagPlayer, curPlayer, curPlayerTradeList, curTagPlayerTradeList , curPlayerPack):  | 
|         #²»Âú×ã½»Ò×Ìõ¼þ  | 
|         #GameWorld.Log("²»Âú×ã½»Ò×Ìõ¼þ")  | 
|         return False  | 
|       | 
|     selfTradeItemList = list()  #Type = SingleItem  | 
|     tagTradeItemList = list()   #Type = SingleItem  | 
|       | 
|     #»ñµÃ×Ô¼ºÎïÆ·¹ÜÀíÆ÷  | 
|     curItemControl = ItemControler.PlayerItemControler(curPlayer)  | 
|     #È¡³ö¶Ô·½ÎïÆ·,·ÅÈë×Ô¼º±³°ü  | 
|     for i in range(0, curTagPlayerTradeList.GetTradeItemCount()):  | 
|         curTagItemIndex = curTagPlayerTradeList.GetTradeItem(i)  | 
|         if curTagItemIndex == -1:  | 
|             continue  | 
|         #GameWorld.Log("%sµÄÎïÆ·Ë÷Òý%s"%(curTagPlayer.GetPlayerName(),curTagItemIndex))  | 
|         curTagItem = curTagPlayerPack.GetAt(curTagItemIndex)  | 
|         if curTagItem.IsEmpty():  | 
|             GameWorld.Log("%s->%s ½»Ò×ÎïÆ·»ñȡʧ°Ü,%sÎïÆ·Îª¿Õ" % (curPlayer.GetPlayerID(), curTagPlayer.GetPlayerID(), curTagItem.GetItemTypeID()))  | 
|             continue  | 
|           | 
| #        #¼Ç¼´ó¶îÎïÆ·½»Ò×  | 
| #        __LargeTradeItem(curPlayer,curTagPlayer,curTagItem)  | 
|         tagTradeItemList.append(curTagItem.GetItem())  | 
|         tagItemNoteDict = ItemCommon.GetItemNoteDict(curTagItem.GetItem(), curTagItem.GetCount())  | 
|         # Á÷Ïò¼Ç¼£¬¼Ç¼½»Ò×ʧȥ ÎïÆ·  | 
|         #DataRecordPack.DR_TradeLostItem(curTagPlayer, curPlayer, curTagItem.GetItemTypeID(),   | 
|         #                                curTagItem.GetCount(), tagItemNoteDict)  | 
|         TradeEventReport(curTagPlayer, curPlayer, curTagItem.GetItemTypeID(), curTagItem.GetCount(), "Lost")  | 
|         ItemCommon.DR_DelItem(curTagPlayer, IPY_GameWorld.rptItem, "Trade", tagItemNoteDict)  | 
|         #²Á³ý¶Ô·½ÎïÆ·  | 
|         curTagItem.Wipe()  | 
|   | 
|     #»ñµÃ¶Ô·½ÎïÆ·¹ÜÀíÆ÷  | 
|     tagItemControl = ItemControler.PlayerItemControler(curTagPlayer)  | 
|     #È¡³ö×Ô¼ºÎïÆ·,·ÅÈë¶Ô·½±³°ü  | 
|     for i in range(0, curPlayerTradeList.GetTradeItemCount()):  | 
|         curItemIndex = curPlayerTradeList.GetTradeItem(i)  | 
|         if curItemIndex == -1:  | 
|             continue  | 
|         #GameWorld.Log("%sµÄÎïÆ·Ë÷Òý%s"%(curPlayer.GetPlayerName(),curItemIndex))  | 
|         curItem = curPlayerPack.GetAt(curItemIndex)  | 
|         if curItem.IsEmpty():  | 
|             GameWorld.Log("%s->%s½»Ò×ÎïÆ·»ñȡʧ°Ü,%sÎïÆ·Îª¿Õ" % (curPlayer.GetPlayerID(), curTagPlayer.GetPlayerID(), curItem.GetItemTypeID()))  | 
|             continue  | 
|           | 
| #        #¼Ç¼´ó¶îÎïÆ·½»Ò×  | 
| #        __LargeTradeItem(curPlayer,curTagPlayer,curItem)  | 
|         selfTradeItemList.append(curItem.GetItem())  | 
|         curItemNoteDict = ItemCommon.GetItemNoteDict(curItem.GetItem(), curItem.GetCount())  | 
|         # Á÷Ïò¼Ç¼£¬¼Ç¼½»Ò×ʧȥ ÎïÆ·  | 
|         #DataRecordPack.DR_TradeLostItem(curPlayer, curTagPlayer, curItem.GetItemTypeID(),   | 
|         #                                curItem.GetCount(), curItemNoteDict)       | 
|         TradeEventReport(curPlayer, curTagPlayer, curItem.GetItemTypeID(), curItem.GetCount(), "Lost")  | 
|         ItemCommon.DR_DelItem(curPlayer, IPY_GameWorld.rptItem, "Trade", curItemNoteDict)  | 
|         #²Á³ý×Ô¼ºÎïÆ·  | 
|         curItem.Wipe()  | 
|           | 
|     curPlayerID = curPlayer.GetPlayerID()  | 
|     curTagPlayerID = curTagPlayer.GetPlayerID()      | 
|     #½«×Ô¼ºÎïÆ··ÅÈë¶Ô·½¿Ú´ü  | 
|     for curItem in selfTradeItemList:  | 
|         curItemTypeID = curItem.GetItemTypeID()  | 
|         curItemCount = curItem.GetCount()  | 
|         curItemGUID = curItem.GetGUID()        | 
|           | 
|         if not tagItemControl.PutInItem(IPY_GameWorld.rptItem, curItem, event=["Trade", True, {}]):  | 
|             GameWorld.ErrLog("TradePutIn fail, tagPlayerID=%s, ItemDetel=%s, %s, %s" % (curTagPlayerID,  | 
|                              curItemTypeID, curItemCount, curItemGUID), curPlayerID, curTagPlayerID)  | 
|             return False  | 
|   | 
|         # Á÷Ïò¼Ç¼£¬½»Ò×¹ºµÃÎïÆ·, ÔÝʱÆÁ±Î£¬PutInͳһ¼Ç¼  | 
|         #DataRecordPack.DR_TradeGetItem(curTagPlayer, curPlayer, curItemTypeID, curItemCount, equipNote)  | 
|         TradeEventReport(curTagPlayer, curPlayer, curItemTypeID, curItemCount, "Get")  | 
|           | 
|         #Ë«·½ÎïÆ·Ìáʾ  | 
|         PlayerControl.NotifyCode(curPlayer, "LostRes", [curItemTypeID, curItemCount])  | 
|         PlayerControl.NotifyCode(curTagPlayer, "ObtainRes01", [curItemTypeID, curItemCount])  | 
|           | 
|     #½«¶Ô·½ÎïÆ··ÅÈë×Ô¼º¿Ú´ü  | 
|     for curItem in tagTradeItemList:  | 
|         curItemTypeID = curItem.GetItemTypeID()  | 
|         curItemCount = curItem.GetCount()  | 
|         curItemGUID = curItem.GetGUID()          | 
|           | 
|         if not curItemControl.PutInItem(IPY_GameWorld.rptItem, curItem, event=["Trade", True, {}]):  | 
|             GameWorld.ErrLog("TradePutIn, tagPlayerID=%s, ItemDetel=%s, %s, %s" % (curPlayerID,  | 
|                              curItemTypeID, curItemCount, curItemGUID), curTagPlayerID, curPlayerID)  | 
|             return False  | 
|   | 
|         # Á÷Ïò¼Ç¼£¬½»Ò×¹ºµÃÎïÆ·, ÔÝʱÆÁ±Î£¬PutInͳһ¼Ç¼  | 
|         #DataRecordPack.DR_TradeGetItem(curPlayer, curTagPlayer, curItemTypeID, curItemCount, equipNote)  | 
|         TradeEventReport(curPlayer, curTagPlayer, curItemTypeID, curItemCount, "Get")  | 
|              | 
|         #Ë«·½ÎïÆ·Ìáʾ  | 
|         PlayerControl.NotifyCode(curTagPlayer, "LostRes", [curItemTypeID, curItemCount])  | 
|         PlayerControl.NotifyCode(curPlayer, "ObtainRes01", [curItemTypeID, curItemCount])  | 
|       | 
|     #½ðÇ®ÀàÐÍ  | 
|     tradeMoneyType = (IPY_GameWorld.TYPE_Price_Gold_Money, IPY_GameWorld.TYPE_Price_Gold_Paper,  | 
|                       IPY_GameWorld.TYPE_Price_Silver_Money, IPY_GameWorld.TYPE_Price_Silver_Paper)  | 
|                         | 
|     #½«¶Ô·½µÄÇ®·ÅÈë×Ô¼ºµÄ¿Ú´ü      | 
|     for typeIndex, moneyValue in enumerate(TradeMoneyCount(curTagPlayerTradeList)):  | 
|         TradeMoney(curPlayer, curTagPlayer, moneyValue, tradeMoneyType[typeIndex])  | 
|           | 
|     #½«×Ô¼ºµÄÇ®·ÅÈë¶Ô·½µÄ¿Ú´ü  | 
|     for typeIndex, moneyValue in enumerate(TradeMoneyCount(curPlayerTradeList)):  | 
|         TradeMoney(curTagPlayer, curPlayer, moneyValue, tradeMoneyType[typeIndex])              | 
|     return True  | 
|   | 
| ## ½»Ò×ÎïÆ·Ê¼þ»ã±¨  | 
| #  @param None  | 
| #  @return None  | 
| def TradeEventReport(curPlayer, tagPlayer, itemID, itemCnt, tradeType):  | 
|     eventParam = "PlayerID=%s,PlayerName=%s,TradeType=%s,TagPlayer=%s,ItemID=%s,ItemCount=%s" \  | 
|                 % (curPlayer.GetPlayerID(), curPlayer.GetPlayerName(), tradeType,  | 
|                    tagPlayer.GetPlayerID(), itemID, itemCnt)  | 
|     #EventReport.EventReport(ShareDefine.Def_UserAction_TradeItem, eventParam, curPlayer)  | 
|     return  | 
|   | 
|   | 
| ## »ñµÃ½»Ò×ÖнðÇ®µÄÊýÁ¿  | 
| #  @param tradeList ½»Ò×ÕËÄ¿  | 
| #  @return None  | 
| def TradeMoneyCount(tradeList):     | 
|     return (tradeList.GetGold(), tradeList.GetGoldPaper(), tradeList.GetSilver(), tradeList.GetSilverPaper())  | 
|   | 
|   | 
| ## ½»Ò×½ðÇ®×ªÒÆ  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param tagPlayer Ä¿±êÍæ¼Ò  | 
| #  @param moneyCnt ½ðÇ®ÊýÁ¿  | 
| #  @param moneyType ½ðÇ®ÀàÐÍ  | 
| #  @return None  | 
| def TradeMoney(curPlayer, tagPlayer, moneyCnt, moneyType):  | 
|     if moneyCnt <= 0:  | 
|         return  | 
|           | 
|     if PlayerControl.PayMoney(tagPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_Trade):  | 
|         PlayerControl.GiveMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_GiveMoney_Trade)  | 
|     else:  | 
|         GameWorld.ErrLog('TradeMoney fail, %s, %s' % (curPlayer.GetPlayerID(), tagPlayer.GetPlayerID()))  | 
|     return  | 
|   | 
|   | 
| ## ½»Ò×»ù±¾Åж¨  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curTagPlayer Ä¿±êÍæ¼Ò  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def TradeBasicCondition(curPlayer, curTagPlayer):  | 
|     tradeLVLimit = ReadChConfig.GetEvalChConfig("TradeLVLimit")  | 
|     # ·¢Æð·½µÈ¼¶ÅÐ¶Ï  | 
|     if curPlayer.GetLV() < tradeLVLimit:  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_93493")  | 
|         return False  | 
|       | 
|     #ÈÎÒâÒ»·½¶ÏÏß,½»Ò×״̬ȡÏû  | 
|     if curTagPlayer == None :  | 
|         curPlayer.TradeMsg(5)  | 
|         #GeRen_chenxin_795514 Ä¿±êÍæ¼Ò²»ÔÚÏߣ¡  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_740521")  | 
|         return False  | 
|       | 
|     # ½»Ò×Ä¿±êµÈ¼¶ÅÐ¶Ï  | 
|     if curTagPlayer.GetLV() < tradeLVLimit:  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_67166")  | 
|         return False  | 
|       | 
|     #ÈÎÒâÒ»·½ËÀÍö,ÎÞ·¨¿ªÆô½»Ò×  | 
|     if curPlayer.GetHP() <= 0:  | 
|         #ApplyDealingLost07 ÄãÒѾËÀÍö£¬½»Ò×È¡Ïû£¡  | 
|         PlayerControl.NotifyCode(curPlayer, "ApplyDealingLost07")  | 
|         return False   | 
|       | 
|     if curTagPlayer.GetHP() <= 0:  | 
|         #ApplyDealingLost03 Ä¿±êËÀÍö£¬ÎÞ·¨·¢³ö½»Ò×ÑûÇ룡  | 
|         PlayerControl.NotifyCode(curPlayer, "ApplyDealingLost03")  | 
|         return False  | 
|       | 
|     #¾àÀëÅж¨  | 
|     #¼ì²éÍæ¼ÒÒÆ¶¯¾àÀëÊÇ·ñ¹ýÔ¶  | 
|     if GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), curTagPlayer.GetPosX(), curTagPlayer.GetPosY()) > ChConfig.Def_CanTradeDist:  | 
|         #GeRen_chenxin_671654 ¾àÀë̫Զ£¬ÎÞ·¨·¢³ö½»Ò×ÑûÇ룡  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_671654")  | 
|         return False  | 
|       | 
|     #GMÎ޴˹¦ÄÜ  | 
| #    if GameWorld.IsGM(curPlayer) or GameWorld.IsGM(curTagPlayer):  | 
| #        PlayerControl.NotifyCode(curPlayer, "GeRen_admin_59724")  | 
| #        return False  | 
|       | 
|     return True  | 
|   | 
| ## ¼ì²éÍæ¼Ò±³°üÊÇ·ñ¿ÉÒÔ·ÅÏ   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curTagPlayer Ä¿±êÍæ¼Ò  | 
| #  @param tagList Ä¿±ê½»Ò×  | 
| #  @param selfList ×Ô¼º½»Ò×À¸  | 
| #  @param tagPack Ä¿±êÎïÆ·´æÔڵı³°ü  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def TradePackCanPutIn(curPlayer, curTagPlayer, tagList, selfList, tagPack):  | 
|     #ÑéÖ¤±³°ü¿Õ¼ä---------------------------------------------------------------------  | 
|     if ItemControler.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem) + selfList.GetPutInCount() < tagList.GetPutInCount():  | 
|         #PlayerControl.NotifyCode(curPlayer, "PackRoomageLack")  | 
|         PlayerControl.NotifyCode(curTagPlayer, "PackFullTag", [IPY_GameWorld.rptItem])  | 
|         #Task_WinLost_RoomLack02 ÄúµÄ±³°ü¿Õ¼ä²»×ã,ÇëÕûÀí±³°üºóÔÙÀ´  | 
|         PlayerControl.NotifyCode(curPlayer, "Task_WinLost_RoomLack02")  | 
|         curPlayer.TradeMsg(4)  | 
|         return False  | 
|       | 
|     #ÑéÖ¤½ðÇ®---------------------------------------------------------------------  | 
|     #½ðÇ®ÀàÐÍ  | 
|     tradeMoneyType = (IPY_GameWorld.TYPE_Price_Gold_Money, IPY_GameWorld.TYPE_Price_Gold_Paper,  | 
|                       IPY_GameWorld.TYPE_Price_Silver_Money, IPY_GameWorld.TYPE_Price_Silver_Paper)  | 
|       | 
|     # ÑéÖ¤Íæ¼Ò½ðÇ®ÊÇ·ñ×ã¹»£¬½ÓÊÕÍæ¼ÒÇ®ÊÇ·ñ³¬ÏÞ  | 
|     for typeIndex, moneyValue in enumerate(TradeMoneyCount(tagList)):  | 
|         if not CheckMoneyValue(curTagPlayer, curPlayer, moneyValue, tradeMoneyType[typeIndex]):  | 
|             return False  | 
|       | 
|     #ÑéÖ¤ÎïÆ·---------------------------------------------------------------------  | 
|     for i in range(0, tagList.GetTradeItemCount()):  | 
|         curTagItemIndex = tagList.GetTradeItem(i)  | 
|         if curTagItemIndex == -1:  | 
|             continue  | 
|         curTagItem = tagPack.GetAt(curTagItemIndex)  | 
|         if curTagItem.IsEmpty() or curTagItem.GetIsBind() or not curTagItem.GetCanTrade():  | 
|             GameWorld.ErrLog("¶Ô·½½»Ò×ÎïÆ·Îª¿Õ»ò´æÔÚ°ó¶¨ÎïÆ·»ò´æÔÚ²»¿É½»Ò×ÎïÆ·!tagPlayerID=%s"   | 
|                              % (curTagPlayer.GetPlayerID()), curPlayer.GetPlayerID())  | 
|             return False  | 
|           | 
|     return True  | 
|   | 
|   | 
| ## ½âËø½»Ò×À¸ÖеÄÎïÆ·   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param tagPlayer Ä¿±êÍæ¼Ò  | 
| #  @param tradeValue ½»Ò×Çåµ¥  | 
| #  @param moneyType µ±Ç°Íæ¼Ò  | 
| #  @return True  | 
| def CheckMoneyValue(curPlayer, tagPlayer, tradeValue, moneyType):  | 
|       | 
|     if tradeValue <= 0:  | 
|         return True  | 
|       | 
|     # ÅжϽðÇ®²¢Ìáʾ  | 
|     if not PlayerControl.HaveMoney(curPlayer, moneyType, tradeValue):  | 
|           | 
|         #¶Ô²»Æð£¬Ä¿±ê½ðÇ®²»×㣬²Ù×÷ÎÞЧ  | 
|         PlayerControl.NotifyCode(tagPlayer, "Objective_Money_Shortage")  | 
| #        #¶Ô²»Æð,ÄãµÄ½ðÇ®²»×ã  | 
| #        PlayerControl.NotifyCode(curPlayer, "SilverErr")  | 
|         return False  | 
|       | 
|     if moneyType in (IPY_GameWorld.TYPE_Price_Gold_Money, IPY_GameWorld.TYPE_Price_Gold_Paper):  | 
|         valueLimit = ChConfig.Def_PlayerTotalMoney_Gold  | 
|     else:  | 
|         valueLimit = ChConfig.Def_PlayerTotalMoney_Silver  | 
|       | 
|     #¼ì²éÍæ¼Ò½ðÇ®ÊÇ·ñ×ã¹»  | 
|     if PlayerControl.GetMoney(tagPlayer, moneyType) + tradeValue > valueLimit:  | 
|           | 
|         # ¶Ô²»Æð£¬ÄúЯ´øµÄ½ðÇ®ÒѾ´ïÉÏÏÞ,²Ù×÷ÎÞЧ!  | 
|         PlayerControl.NotifyCode(tagPlayer, "GeRen_chenxin_609765")  | 
|         #Money_Schlep_Most01 ¶Ô²»Æð£¬Ä¿±êÉíÉÏЯ´øµÄ½ðÇ®ÒѾ´ïÉÏÏÞ,²Ù×÷ÎÞЧ  | 
|         PlayerControl.NotifyCode(curPlayer, "Money_Schlep_Most01")  | 
|         tagPlayer.TradeMsg(3)  | 
|         return False  | 
|       | 
|     return True  | 
|   | 
|   | 
| ## ½âËø½»Ò×À¸ÖеÄÎïÆ·   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param list ½»Ò×Çåµ¥  | 
| #  @return True  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def unBindItem(curPlayer, list):  | 
|     #===========================================================================  | 
|     # pack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)  | 
|     # for i in range(0, list.GetTradeItemCount()):  | 
|     #    curItemIndex = list.GetTradeItem(i)  | 
|     #    if curItemIndex == -1:  | 
|     #        continue  | 
|     #      | 
|     #    curItem = pack.GetAt(curItemIndex)  | 
|     #      | 
|     #    if curItem.IsEmpty():  | 
|     #        continue  | 
|     #      | 
|     #    curItem.SetIsEventLocked(False)  | 
|     #===========================================================================  | 
|           | 
|     return True  | 
|   | 
| ## ½â³ý½»Ò×  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò    | 
| #  @param Type ÀàÐÍ   | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def unTrade(curPlayer, Type):  | 
|     #½»Ò׳ɹ¦,½â³ý½»Ò×  | 
|     #ɾ³ýÉϴν»Ò×ÁÐ±í  | 
|     curPlayerTradeList = curPlayer.GetTradeList()  | 
|     if curPlayerTradeList == None:  | 
|         curPlayer.EndTrade(Type)  | 
|         return  | 
|     #½»Ò׳ɹ¦,Çå³ý½»Ò×ÁÐ±í  | 
|     if Type == 1:  | 
|         curPlayerTradeList.Clear()  | 
|         curPlayer.EndTrade(Type)  | 
|         PlayerControl.NotifyCode(curPlayer, "DealingSucceed")  | 
|     #½»Ò×ʧ°Ü,½â³ýÎïÆ·Ëø¶¨×´Ì¬,²¢Çå³ý½»Ò×ÁÐ±í  | 
|     elif Type == 0:  | 
|         unBindItem(curPlayer, curPlayerTradeList)  | 
|         curPlayerTradeList.Clear()  | 
|         curPlayer.EndTrade(Type)  | 
|     #Ò쳣״̬  | 
|     else:  | 
|         GameWorld.Log("½»Ò×״̬Òì³£ type = %s" % (Type) , curPlayer.GetPlayerID())  | 
|         return  | 
|           | 
|     return True  | 
|   | 
| ## ¼ì²é½»Ò×ÎïÆ·ÊÇ·ñÊÇ¿ÉÒÔ½»Ò×µÄ  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curItem µ±Ç°ÎïÆ·  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def CheckTradeItem(curPlayer, curItem):  | 
|     if curItem == None or curItem.IsEmpty():  | 
|         #ÎÞ´ËÎïÆ·  | 
|         #GameWorld.Log("µ±Ç°Íæ¼ÒÎïÆ·²»´æÔÚ")  | 
|         return False  | 
|       | 
|     if curItem.GetIsBind():  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165")  | 
|         return False  | 
|       | 
|     if not curItem.GetCanTrade():  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165")  | 
|         return False  | 
|       | 
|     if ItemControler.IsEventItem(curItem):  | 
|         PlayerControl.NotifyCode(curPlayer, "itemuse_chenxin_31379")  | 
|         return False  | 
|       | 
|     if curItem.GetIsLocked():  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_644055")  | 
|         return False  | 
|       | 
|     return True  | 
|       | 
|       |