#!/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
|
|