#!/usr/bin/python # -*- coding: GBK -*- #--------------------------------------------------------------------- # #--------------------------------------------------------------------- ##@package EventShell # @todo: ʼþ¹ÜÀíÆ÷ # # @author: eggxp # @date 2010-4-20 # @version 6.8 # # @note: ¹ÜÀíËùÓÐNPCʼþ´¥·¢½Ó¿Ú #--------------------------------------------------------------------- # @change: "2013-04-15 11:00" wdb ½«ComparePlayerLV_UseItem¸üÃûΪCheckItemUseLV£¬·ÅÈëItemControler # @change: "2013-04-18 17:00" wdb ÎïÆ·ÑÕɫʹÓÃÐÞ¸Ä # @change: "2013-05-03 17:00" wdb npcÉ̵êÐÞ¸Ä # @change: "2013-05-07 15:30" wdb ²Ö¿âÐÞ¸Ä # @change: "2013-05-20 11:00" wdb Ôö¼Ó¸±±¾É¨µ´ # @change: "2013-05-29 11:55" Alee ÐÂÔöɱµÈ¼¶·¶Î§µÄÈÎÎñÂß¼­(дËÀ) # @change: "2013-05-30 10:30" wdb ×°±¸±¦Ê¯ÏâǶµ÷Õû # @change: "2013-06-06 21:30" Alee Õ½¶·×´Ì¬²»¿É½øÈëÈÎÎñ¶Ô»°£¬µ¼Ö¶ÔÏó±ä¸üµÈÎÊÌâ # @change: "2013-07-08 15:00" Alee Ìí¼ÓÆÕͨǿ»¯´¥·¢ÈÎÎñ # @change: "2013-07-09 15:30" Alee ÒѽÓÈÎÎñÉý¼¶´¥·¢Âß¼­ # @change: "2013-07-19 20:00" Alee Ìí¼Ó»Ø¹º # @change: "2013-07-26 17:00" Alee VIP´ò¿ªÔ¶³Ì²Ö¿â # @change: "2013-09-10 20:10" Alee ϵͳÌáʾ³åÍ» # @change: "2013-09-18 17:00" Alee Í˳öËø¶¨Í˳ö½»Ò× # @change: "2013-09-23 19:30" Alee ºìÃûÌáʾÐÞ¸Ä # @change: "2013-11-15 20:20" hxp ¹Ø±Õ07 3A¹ºÂò±³°ü·â°ü¹¦ÄÜ£¬Ôö¼Ó±³°ü³É¹¦ÏµÍ³Ìáʾ # @change: "2013-12-12 14:30" hxp Ôö¼Ó×êʯ¹ºÂò±³°ü¼Æ·Ñµãʼþͬ²½ # @change: "2013-12-13 12:20" hxp ÐÞ¸ÄÊ×µÇÎïÆ·°ó¶¨ÉèÖà # @change: "2013-12-27 16:00" Alee ɾ³ý¶àÓà´úÂë # @change: "2014-01-08 13:20" hxp ÐÞ¸Ä×êʯ¹ºÂò±³°ü»¨·Ñ×êʯ¼Æ·Ñµãʼþͬ²½£¬ÔÚPayMoneyÄڲ㴦Àí # @change: "2014-02-17 17:30" hxp Ôö¼Ó¹ºÂò·ûÎı³°ü¸ñ×Ó # @change: "2014-03-18 19:00" hxp Ê×µÇÔùËÍÎïÆ·¸ÄΪÅäÖÃÎļþÅäÖà # @change: "2014-03-27 19:30" hxp Ôö¼Ó×øÆï»»×° # @change: "2014-04-04 20:00" hxp Ôö¼Ó×øÆï»»¼¼ÄÜ£¬¹Ù¾ô¼¼ÄÜ # @change: "2014-04-07 12:30" hxp ³á°òÏà¹Ø±³°üÎïÆ·½»»» # @change: "2014-04-17 20:30" hxp ÉñÆ÷ʱװ»»×° # @change: "2014-04-22 17:50" xcc Ôö¼ÓÔÚÏßʱ¼äÃâ·Ñ¿ªÆô±³°ü¹¦ÄÜ # @change: "2014-04-26 19:30" hxp ÁìµØÕ½ÇÅ # @change: "2014-04-28 14:00" Alee ɾ³ý²âÊÔ×ʽð # @change: "2014-05-23 14:30" xcc Ôö¼Óħ·½±³°üÎïÆ··ÅÈë½ÇÉ«±³°üµÄ½Ó¿Ú # @change: "2014-05-23 15:40" xcc ÐÞ¸´È«²¿·ÅÈë·ÅÈëʧ°ÜµÄbug # @change: "2014-06-06 17:00" hxp Ôö¼Ó¿ìËÙÍê³ÉÈÎÎñʼþ # @change: "2014-06-23 14:30" Alee ¹Ø±ÕÊä³ö # @change: "2014-07-24 21:30" hxp Ôö¼ÓÉèÖÃÅÜ»·ÈÎÎñÐǼ¶£¬Ò»¼üÍê³ÉËùÓÐÅÜ»·ÈÎÎñ # @change: "2014-07-31 21:30" hxp È¡ÏûºìÃû²»ÄÜÓëNPC¶Ô»°ÏÞÖÆ # @change: "2014-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 PlayerControl import FunctionNPCCommon import FBLogic import ItemControler import ItemCommon import ShareDefine import DataRecordPack import PlayerCoat import PlayerGatherSoul import PlayerRune import IpyGameDataPY import NPCCommon import math import random Def_Warehouse_FuncName = "Func_6" # ²Ö¿âÏà¹Ø¹¦ÄÜpyÃû #--------------------------------------------------------------------- #µ¼ÈëËùÓеÄ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, "") 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 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 #=============================================================================== # //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) FuncDirectCall(curPlayer, "FunctionNPCCommon", "SellItem", tick) return #=============================================================================== # //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 #--------------------------------------------------------------------- #=============================================================================== # //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 #=============================================================================== # #//07 3CͨÓñ³°ü²Ù×÷#tagCBackpackOperate # #//¶ÔÐÔÄÜÓ°ÏìºÜС # //////////////////////////////////////////////////////////// # tagCBackpackOperate*GettagCBackpackOperate(); # class IPY_CBackpackOperate # { # int GetSrcBackpack();//Ô´±³°üÀàÐÍ # int GetDesBackPack();//Ä¿±ê±³°üÀàÐÍ # int GetSrcIndex();//Æðʼλ # int GetDestIndex();//Ä¿±êλÖà # int GetCount();//ÎïÆ·ÊýÁ¿ # } #=============================================================================== ## ͨÓñ³°ü²Ù×÷#tagCBackpackOperate # @param index Íæ¼ÒË÷Òý # @param tick ʱ¼ä´Á # @return ÎÞ·µ»ØÖµ # @remarks 07 3CͨÓñ³°ü²Ù×÷#tagCBackpackOperate def BackpackOperate(index, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) sendPack = IPY_GameWorld.IPY_CBackpackOperate() pack_SrcBackpack = sendPack.GetSrcBackpack() pack_DesBackPack = sendPack.GetDesBackPack() pack_SrcIndex = sendPack.GetSrcIndex() pack_DestIndex = sendPack.GetDestIndex() pack_ItemCount = sendPack.GetCount() FunctionNPCCommon.BackpackOperate(curPlayer, pack_SrcBackpack, pack_DesBackPack, pack_SrcIndex, pack_DestIndex, pack_ItemCount, tick) return #--------------------------------------------------------------------- #=============================================================================== # //07 3D ͨÓñ³°üÎïÆ·½»»»#tagCPackItemExchange # //¶ÔÐÔÄܼ¸ºõÎÞÓ°Ïì # struct tagCPackItemExchange # { # BYTE SrcBackpack;//Ô´±³°üÀàÐÍ # BYTE DesBackPack;//Ä¿±ê±³°üÀàÐÍ # WORD SrcIndex;//ÆðʼλÖà # WORD DestIndex;//Ä¿±êλÖà # }; #=============================================================================== ## ͨÓñ³°üÎïÆ·½»»»#tagCPackItemExchange # @param index Íæ¼ÒË÷Òý # @param tick ʱ¼ä´Á # @return ÎÞ·µ»ØÖµ # @remarks //07 3D ͨÓñ³°üÎïÆ·½»»»#tagCPackItemExchange def PackItemExchange(index, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) sendPack = IPY_GameWorld.IPY_CPackItemExchange() pack_SrcBackpack = sendPack.GetSrcBackpack() pack_DesBackPack = sendPack.GetDesBackPack() pack_SrcIndex = sendPack.GetSrcIndex() pack_DestIndex = sendPack.GetDestIndex() # ·ûÓ¡½»»» if PlayerRune.SwitchRune(curPlayer, pack_SrcBackpack, pack_DesBackPack, pack_SrcIndex, pack_DestIndex): return # ¾Û»ê½»»» if PlayerGatherSoul.SwitchGatherSoul(curPlayer, pack_SrcBackpack, pack_DesBackPack, pack_SrcIndex, pack_DestIndex): return #ʱװ if PlayerCoat.SwitchCoat(curPlayer, pack_SrcBackpack, pack_DesBackPack, pack_SrcIndex, pack_DestIndex): return FunctionNPCCommon.PackItemExchange(curPlayer, pack_SrcBackpack, pack_DesBackPack, pack_SrcIndex, pack_DestIndex, tick) return #=============================================================================== #//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 = ItemCommon.GetPackInitCount(packType) curPack = curPlayer.GetItemManager().GetPack(packType) curPackMaxCnt = curPack.GetMaxCount() 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) PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_671654") #PlayerControl.SyncOnLineTimeTotal(curPlayer) #PlayerControl.SyncOnLineTimeLastOpenPack(curPlayer, packType) elif packType == IPY_GameWorld.rptWarehouse: #²Ö¿âˢРPlayerControl.Init_Warehouse(curPlayer) else: #ÊÕÄɹñˢРPlayerControl.Init_CabinetCountByType(curPlayer, packType) DataRecordPack.DR_OpenPackCount(curPlayer, packType, buyCount, curPlayer.NomalDictGetProperty(keyName)) if costMoneyList: #Ïû·Ñ¼Ç¼ for moneyType, money in costMoneyList: GameWorld.Login_Interface_GoldRec(curPlayer, 0, 1, 'BuyPackGrid', moneyType, money) return ##¿ªÆô¸ñ×Ó¿ÛµÀ¾ß×êʯ # @param curPlayer Íæ¼Ò¶ÔÏó # @param buyMoney ×êʯÏûºÄ # @param packType ±³°üÀàÐÍ # @param curPack ÎïÆ·¹ÜÀíÆ÷ # @param buyPackMoneyType »õ±ÒÀàÐÍ # @param buyCount ¹ºÂò¸ñ×ÓÊý # @return None ÊÇ·ñ¹ºÂò³É¹¦, Íæ¼ÒÊÇ·ñÓÐÇ®¿î def DoOpenGrid(curPlayer, curGridCnt, packType, buyCount): curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) itemId = IpyGameDataPY.GetFuncCfg('OpenBagItem') itemCntFormula = IpyGameDataPY.GetFuncCompileCfg('OpenBagItem', 2) buyMoney = IpyGameDataPY.GetFuncCfg('OpenBagItem', 3) totalItemCnt = 0 for index in range(curGridCnt+1, curGridCnt + buyCount+1): itemcnt = eval(itemCntFormula) totalItemCnt += itemcnt hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemId, curPack, totalItemCnt) needMoney = lackCnt * buyMoney if not hasEnough else 0 # ÐèÒª¸¶Ç® costMoneyList = [] if needMoney > 0: costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, needMoney) if costMoneyList == []: #½ðÇ®²»×ã return False, costMoneyList #¸¶¿î for moneyType, moneyCnt in costMoneyList: infoDict = {"BuyCount":buyCount, ChConfig.Def_Cost_Reason_SonKey:packType} if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_BuyPack, infoDict, 1): return False, costMoneyList # ¿ÛµÀ¾ß delCnt = max(0, totalItemCnt - lackCnt) # ʵ¼Ê¿Û³ýµÄ¸öÊý if indexList: ItemCommon.ReduceItem(curPlayer, curPack, indexList, delCnt, True) return True, costMoneyList #=============================================================================== #//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 #// A2 24 ´¥ÅöNPC #tagCMTouchNPC # #struct tagCMTouchNPC #{ # tagHead Head; # DWORD ObjID; #}; def MoveTouchNPC(index, clientData, tick): #´¥ÅöNPC curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) eventNPCID = clientData.ObjID curNPC = GameWorld.GetNPCManager().FindNPCByID(eventNPCID) #ûÓÐÕâ¸öNPC if curNPC == None : return dist = GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), curNPC.GetPosX(), curNPC.GetPosY()) if dist > ChConfig.Def_EventDist: #Íæ¼Ò¾àÀë¹ýÔ¶, ²»ÄÜ´¥·¢ return if curNPC.GetType() != ChConfig.ntTouchKill: return if not FBLogic.OnCanMoveTouchNPC(curPlayer, curNPC, tick): return #¸±±¾ FBLogic.OnMoveTouchNPC(curPlayer, curNPC, tick) #Âß¼­´¦ÀíÍêºóɱËÀNPC npcControl = NPCCommon.NPCControl(curNPC) npcControl.SetKilled() return