#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#---------------------------------------------------------------------
|
#
|
#---------------------------------------------------------------------
|
##@package ChItem
|
# @todo: ÎïÆ·Âß¼´¦Àí
|
#
|
# @author panwei
|
# @date 2010-4-21
|
# @version 2.9
|
#
|
# ÐÞ¸Äʱ¼ä ÐÞ¸ÄÈË ÐÞ¸ÄÄÚÈÝ
|
# @change: "2015-07-03 16:00" zqx È¥³ýGMÏÞÖÆ
|
# @change: "2015-07-14 21:00" xdh ÁÄÌìÐÅÏ¢Ô¸½¼ÓÖµ¸ÄΪExtras
|
# @change: "2015-09-18 19:30" hxp ÕóÓªÎïÆ·Ê°È¡±£»¤ÅжÏ
|
# @change: "2015-09-21 20:30" hxp ¹¦Ñ«ÎïÆ·Ê¹ÓÃ; ¼ñ¹¦Ñ«ÎïÆ·ÌØÊâÂß¼
|
# @change: "2015-11-06 16:30" hxp Ôö¼ÓpyÀ®°È£¬Ö§³Ö¿ç·þ
|
# @change: "2015-12-15 17:00" hxp ÊÇ·ñ×°±¸ÅжϷ½Ê½ÐÞ¸Ä
|
# @change: "2016-01-26 15:00" hxp PY±íÖ§³ÖÖØ¶Á
|
# @change: "2016-05-20 11:00" hxp µ¥È˸±±¾Ò»¼üʰȡ½ö¿Éʰȡ½ðÇ®
|
# @change: "2016-06-04 10:00" xdh ÐÞ¸´Ã¿ÈÕʹÓÃÎïÆ·¸öÊýÎïÆ·idÈ¡²»µ½ÎÊÌâ
|
# @change: "2016-07-20 14:30" hxp Ïû·ÑµãÁ÷ÏòÕûÀí
|
# @change: "2016-10-17 16:00" hxp Ôö¼ÓÓÀ¾Ã¹ó×弤»î¿¨
|
# @change: "2016-11-22 21:00" hxp µôÂäÎïÆ·ÌØÊâ¹éÊôIDÖ§³Ö
|
# @change: "2017-02-16 18:00" hxp Ö§³ÖÐéÄ⸱±¾Ê°È¡µôÂäÎïÆ·
|
# @change: "2017-03-10 16:00" hxp Ôö¼Ó³á°òÖ±½ÓÉý½×µÀ¾ßÎïÆ·Ê¹ÓÃ
|
# @change: "2017-03-22 21:00" hxp ¶þάÂëºì°ü
|
# @change: "2017-03-24 20:00" hxp Ôö¼ÓÿÈÕʹÓôÎÊýÏÞÖÆÎïÆ·´ÎÊý֪ͨ¿Í»§¶Ë£»Ôö¼ÓÅжÏÎïÆ·Ê¹Óõȼ¶
|
# @change: "2017-05-09 15:30" hxp Ôö¼Ó¿ª³ö¶à¸öÎïÆ·µÄÏä×Ó£¬ Ö§³Ö¹ýÂËûÓнâËøµÄ·ûÓ¡; Ôö¼Ó¿ªÏä×Ó»ñµÃÎïÆ·Í¨Öª
|
#------------------------------------------------------------------------------
|
#"""Version = 2017-05-09 15:30"""
|
#------------------------------------------------------------------------------
|
import IPY_GameWorld
|
import GameWorld
|
import ItemControler
|
import UseItem
|
import ItemCommon
|
import ChConfig
|
import EventShell
|
import PlayerControl
|
import FBLogic
|
import ReadChConfig
|
import OperControlManager
|
import ShareDefine
|
import PlayerAttrFruit
|
import DataRecordPack
|
import ChPyNetSendPack
|
import NetPackCommon
|
import IpyGameDataPY
|
import PlayerSuccess
|
import PyGameData
|
import NPCCommon
|
import FBCommon
|
import GameObj
|
|
import random
|
import json
|
import time
|
#---------------------------------------------------------------------
|
#µ¼Èë
|
GameWorld.ImportAll("Script\\Item\\" , "UseItem")
|
GameWorld.ImportAll("Script\\Item\\" , "")
|
#---------------------------------------------------------------------
|
## ÖØÐ¶ÁÈ¡ËùÓÐÎïÆ·
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def ReloadItem(tick):
|
scriptPath = ChConfig.GetAppPath() + "Script\\Item\\UseItem"
|
GameWorld.ReloadScript(scriptPath, "UseItem")
|
|
scriptPath = ChConfig.GetAppPath() + "Script\\Item"
|
GameWorld.ReloadScript(scriptPath, "")
|
return
|
|
#---------------------------------------------------------------------
|
#===============================================================================
|
# ÎïÆ·ÀàÐÍ------
|
# 1£ºÒ©Æ· 2£º²ÄÁÏ 3£ºÔÓÎï 4£º¸ß¼¶ÔÓÎï 5£ºÈÎÎñÎïÆ·
|
# 6£ºÈÎÎñ¾íÖá 7£º³èÎïµ° 8£º±¦Ê¯ 9£ºÆäËü 10:¼¼ÄÜÊé
|
# 11:Í·²¿×°±¸ 12£ºÒ·þ 13£ºÐ¬×Ó 14£º»¤Íó 15£º½£×ÚÎäÆ÷
|
# 16£º½äÖ¸ 17£ºÏîÁ´ 18£º·¢ÐÍ 19£ºÁ³ÐÍ 20£ºÆäËûÎäÆ÷
|
# 25£ºÆø×ÚÎäÆ÷ 35£ºÄ§×ÚÎäÆ÷ 36£º×øÆï 37£ºÂíÆ¥ËÇÁÏ 41£ºµöÓã½±ÀøÎïÆ·
|
# 45£ºË«±¶¾ÑéÎïÆ· 46£º³èÎïµÀ¾ß 50£º¿É¼Ó¹¤²ÄÁÏ 51£º¿ª¹â²ÄÁÏ
|
#===============================================================================
|
|
## ³õʼ»¯ÎïÆ·ÖØÕûÓÅÏȼ¶
|
# @param curPack ǰ±³°ü
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
#===============================================================================
|
# def __InitPackResetPrior(curPack):
|
# curPack.ClearAddResetPrior()
|
# for value in ReadChConfig.GetEvalChConfig("ItemResetPrior"):
|
# curPack.Init_AddResetPrior(value)
|
#===============================================================================
|
#---------------------------------------------------------------------
|
## ³õʼ»¯ÎïÆ·
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def InitItem(tick):
|
GameWorld.GetPsycoFunc(__Func_InitItem)(tick)
|
return
|
|
## ³õʼ»¯ÎïÆ·
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
#===============================================================================
|
def __Func_InitItem(tick):
|
#³õʼ»¯ÎïÆ·µôÂä±£»¤
|
MapItemProtectTime = IpyGameDataPY.GetFuncCfg("MapItemProtectTime")
|
GameWorld.GetMapItemManager().SetProtectTime(MapItemProtectTime)
|
|
#===============================================================================================
|
#
|
# for i in range(0, GameWorld.GetPlayerManager().GetPlayerCount()):
|
# curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(i)
|
# itemManager = curPlayer.GetItemManager()
|
#
|
# #³õʼ»¯±³°ü
|
# curPack = itemManager.GetPack(IPY_GameWorld.rptItem)
|
# __InitPackResetPrior(curPack)
|
#
|
#===============================================================================================
|
return
|
#===============================================================================
|
|
#---------------------------------------------------------------------
|
## ³õʼ»¯±³°ü
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
#===============================================================================
|
# def InitPlayerLoginItem(curPlayer, tick):
|
# itemManager = curPlayer.GetItemManager()
|
# #³õʼ»¯±³°ü
|
# curPack = itemManager.GetPack(IPY_GameWorld.rptItem)
|
# __InitPackResetPrior(curPack)
|
#===============================================================================
|
#---------------------------------------------------------------------
|
|
## Ö´ÐÐʰȡÂß¼
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param mapItemID µØÍ¼ÎïÆ·ID
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None or True
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def __DoPickup(curPlayer, mapItemID, tick, isGuard):
|
|
playerID = curPlayer.GetPlayerID()
|
mapItemManager = GameWorld.GetMapItemManager()
|
mapItem = mapItemManager.GetItemByID(mapItemID)
|
if mapItem == None or mapItem.IsEmpty():
|
GameWorld.Log("µ±Ç°ÎïÆ·²»´æÔÚ»òÒѾ±»»ØÊÕ,Íæ¼Òʰȡʧ°Ü,mapItemID=%s" % mapItemID, playerID)
|
return
|
dropItemNPCID = GetMapItemUserDataValue(mapItem, ShareDefine.Def_MapItemInfo_NPCID)
|
|
#ïÚ³µÖÐ,ÎÞ·¨Ê°È¡
|
if not isGuard and curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvTruck:
|
PlayerControl.NotifyCode(curPlayer, "Old_hgg_21675")
|
GameWorld.Log("ʹÓý»Í¨¹¤¾ßʱ,ÎÞ·¨Ê°È¡ÎïÆ·!mapItemID=%s,dropItemNPCID=%s" % (mapItemID, dropItemNPCID), playerID)
|
return
|
|
if GameObj.GetHP(curPlayer) == 0:
|
#Íæ¼ÒÒѾËÀÍö
|
GameWorld.Log("Íæ¼ÒÒÑËÀÍö,ÎÞ·¨Ê°È¡ÎïÆ·!mapItemID=%s,dropItemNPCID=%s" % (mapItemID, dropItemNPCID), playerID)
|
return
|
|
posX, posY, itemPosX, itemPosY = curPlayer.GetPosX(), curPlayer.GetPosY(), mapItem.GetPosX(), mapItem.GetPosY()
|
pickDist = GameWorld.GetDist(posX, posY, itemPosX, itemPosY)
|
# ÊØ»¤Ê°È¡²»Ñé֤ʰȡ·¶Î§
|
if not isGuard and pickDist > curPlayer.GetPickupDist():
|
#¾àÀë¹ýÔ¶, ²»ÄܼñÆð
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_805889")
|
GameWorld.Log("µ±Ç°¾àÀë¹ýÔ¶, mapItemID=%s,dropItemNPCID=%s,Íæ¼Ò(%d,%d)-ÎïÆ·(%d,%d),pickDist=%s > playerPickupDist=%s"
|
% (mapItemID, dropItemNPCID, posX, posY, itemPosX, itemPosY, pickDist, curPlayer.GetPickupDist()), playerID)
|
return
|
|
#ʰȡÅжÏ
|
if not __CheckPickUpItemTime(curPlayer, mapItem, tick, mapItemID, dropItemNPCID):
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_913598")
|
return
|
|
#°ÑµØÍ¼ÎïÆ··Åµ½±³°üÖÐ
|
itemControl = ItemControler.PlayerItemControler(curPlayer)
|
#ÌáʾÐÅÏ¢
|
ownerType = mapItem.GetOwnerType()
|
ownerID = mapItem.GetOwnerID()
|
singItem = mapItem.GetItem()
|
|
mapItemType = singItem.GetType() # ÎïÆ·ÀàÐÍ
|
mapItemTypeID = singItem.GetItemTypeID()
|
mapItemCount = singItem.GetCount()
|
singItemGUID = singItem.GetGUID()
|
curEffID = singItem.GetEffectByIndex(0).GetEffectID()
|
playerTeam = curPlayer.GetTeam()
|
#isTeamNotify = (ownerType == ChConfig.Def_NPCHurtTypeTeam and playerTeam != None)
|
isTeamNotify = False
|
# ʰȡ½ðÇ®
|
if mapItemType == ChConfig.Def_ItemType_Money:
|
if not PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, mapItemCount,
|
ChConfig.Def_GiveMoney_Pickup, {}, not isTeamNotify):
|
return
|
|
# Ìáʾ»ñµÃ½ðÇ®ÊýÁ¿
|
if isTeamNotify:
|
PlayerControl.TeamNotify(playerTeam.GetTeamID(), "GeRen_lhs_295695", [curPlayer.GetName(),
|
mapItemCount])
|
# ¸±±¾Ê°È¡½ðÇ®
|
FBLogic.OnFBPickUpItem(curPlayer, singItem, tick)
|
singItem.Clear()
|
#===============================================================================================
|
# # (¿ç·þµôÂ书ѫÎïÆ·, ²»¸øÊµ¼ÊÎïÆ·£¬×ª»¯Îª¹¦Ñ«Öµ)
|
# elif curEffID == ChConfig.Def_Effect_ItemGiveGongXun and GameWorld.IsCrossServer():
|
# #=======================================================================
|
# # # ²»ÐèÒª¶ÓÎéÌáʾ
|
# # if not isTeamNotify:
|
# # PlayerControl.NotifyCode(curPlayer, "ObtainRes01", [mapItemTypeID, mapItemCount])
|
# # # ¶ÓÎéÖУ¬ÎïÆ·±»Ê°È¡Ìáʾ
|
# # else:
|
# # PickupItemSysNotify(curPlayer, isTeamNotify, [mapItemTypeID], False)
|
# #=======================================================================
|
#
|
# # ¸±±¾Ê°È¡½ðÇ®
|
# FBLogic.OnFBPickUpItem(curPlayer, singItem, tick)
|
# singItem.Clear()
|
#===============================================================================================
|
# ʰȡÎïÆ·
|
else:
|
#=======================================================================
|
# isEquip = ItemCommon.CheckItemIsEquip(singItem)
|
# itemMsgList = [mapItemTypeID]
|
#
|
# if isTeamNotify and isEquip:
|
# # ¶ÓÎéʰȡװ±¸Ê±£¬Ïȱ£´æÎïÆ·µÄxmlÊôÐÔ£¬ÓÃÓÚÌáʾµÄxmlÏÔʾ
|
# itemMsgList = ItemCommon.GetItemXMLMsg(singItem)
|
#=======================================================================
|
|
curItemCount = singItem.GetCount()
|
curItemID = singItem.GetItemTypeID()
|
curItemIsAuctionItem = ItemControler.GetIsAuctionItem(singItem)
|
|
isPutInTemp = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_PickupItemPutInTemp)
|
packIndex = ShareDefine.rptTempItem if isPutInTemp else IPY_GameWorld.rptItem
|
packIndex = ChConfig.GetItemPackType(singItem, packIndex)
|
|
# ÊÇ·ñ¿É·ÅÈë
|
if not itemControl.CanPutInItem(packIndex, curItemID, curItemCount, curItemIsAuctionItem):
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packIndex])
|
GameWorld.Log("ʰȡÎïÆ·ÎÞ·¨·ÅÈë±³°ü£¡mapItemID=%s,dropItemNPCID=%s,curItemID=%s,packIndex=%s"
|
% (mapItemID, dropItemNPCID, curItemID, packIndex), curPlayer.GetPlayerID())
|
return
|
|
# ¸±±¾Ê°È¡ÎïÆ·
|
FBLogic.OnFBPickUpItem(curPlayer, singItem, tick)
|
|
equipInfo = [singItem.GetEquipPlace(), ItemCommon.GetItemClassLV(singItem), singItem.GetItemColor(),
|
singItem.GetSuiteID(), singItem.GetUserData()]
|
if not itemControl.PutInItem(packIndex, singItem, event=[ChConfig.ItemGive_Pickup, False, {"NPCID":dropItemNPCID}]):
|
#ÎïÆ·²»ÄÜ·ÅÈë
|
#PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packIndex])
|
GameWorld.ErrLog("ʰȡÎïÆ··ÅÈë±³°üʧ°Ü£¡mapItemID=%s,dropItemNPCID=%s,curItemID=%s,packIndex=%s"
|
% (mapItemID, dropItemNPCID, curItemID, packIndex), curPlayer.GetPlayerID())
|
return
|
|
if dropItemNPCID:
|
mapID = GameWorld.GetGameWorld().GetMapID()
|
lineID = 0 if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull else PlayerControl.GetFBFuncLineID(curPlayer)
|
#ºÏ²¢µØÍ¼µÄ£¬Ê¹ÓÃǰ¶ËlineID£¬¼´ FBID
|
if mapID in [ChConfig.Def_FBMapID_BossHome]:
|
lineID = curPlayer.GetClientLineID()
|
NPCCommon.SendGameServerGoodItemRecord(curPlayer, mapID, lineID, dropItemNPCID, curItemID, equipInfo)
|
|
# ²»ÐèÒª¶ÓÎéÌáʾ
|
#=======================================================================
|
# if not isTeamNotify:
|
# PlayerControl.NotifyCode(curPlayer, "ObtainRes01", [mapItemTypeID, mapItemCount])
|
# else:
|
# # ¶ÓÎéÖУ¬ÎïÆ·±»Ê°È¡Ìáʾ
|
# PickupItemSysNotify(curPlayer, isTeamNotify, itemMsgList, isEquip)
|
#=======================================================================
|
|
#ÏìӦʼþ
|
EventShell.EventRespons_OnGet(curPlayer, mapItemTypeID)
|
#³É¾Í
|
PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_PickUpItem, curItemCount, [curItemID])
|
|
#ÎïÆ·ÒѾ±»¼ñÆð, °ÑÎïÆ·Ö¸ÕëÖÃΪ¿Õ
|
mapItem.SetDropItem(None)
|
#֪ͨ¿Í»§¶Ë, ÈËÎï¼ñÆð¸ÃÎïÆ·, ÒÔ¼°»ØÊÕÎïÆ·µÄÂß¼
|
curPlayer.PickupItem(mapItem)
|
return True
|
|
|
## ÎïÆ·±»Ê°È¡Ìáʾ
|
# @param curPlayer Íæ¼Ò
|
# @param isTeamNotify ÊÇ·ñ¶ÓÎéÌáʾ
|
# @param itemMsgList ÐÅÏ¢²ÎÊý
|
# @param isEquip ÎïÆ·ÊÇ·ñ×°±¸
|
# @return None
|
def PickupItemSysNotify(curPlayer, isTeamNotify, itemMsgList, isEquip):
|
|
curTeam = curPlayer.GetTeam()
|
msgList = [curPlayer.GetName()]
|
|
# ×°±¸´øxmlÊôÐÔ£¬ÆÕͨÎïÆ·Ôò²»ÐèÒª
|
msgList.extend(itemMsgList)
|
sysInfo = "GeRen_lhs_772321" if isEquip else "GeRen_lhs_85890"
|
|
PlayerControl.TeamNotify(curTeam.GetTeamID(), sysInfo, msgList)
|
return
|
|
#---------------------------------------------------------------------
|
#// A3 12 ÊØ»¤Ê°È¡ÎïÆ· #tagCMGuardPickupItem
|
#
|
#struct tagCMGuardPickupItem
|
#{
|
# tagHead Head;
|
# WORD ItemCount;
|
# WORD MapItemID[ItemCount]; //size = ItemCount
|
#};
|
def OnGuardPickupItem(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
mapItemIDList = clientData.MapItemID
|
__DoPickupItem(curPlayer, mapItemIDList, tick, True)
|
return
|
|
## Íæ¼ÒʰȡÎïÆ·(·â°ü²ÎÊý)
|
# @param index µ±Ç°Íæ¼ÒË÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def PlayerPickUpItem(index, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
#Íæ¼Ò¼ñÆðÎïÆ·
|
pickPack = IPY_GameWorld.IPY_PickUpItem()
|
mapItemID = pickPack.GetMapItemID()
|
__DoPickupItem(curPlayer, [mapItemID], tick, False)
|
return
|
|
def __DoPickupItem(curPlayer, mapItemIDList, tick, isGuard):
|
# @param isGuard: ÊÇ·ñÊØ»¤Ê°È¡
|
|
if isGuard and GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
|
mapID = curPlayer.GetMapID()
|
fbIpyData = FBCommon.GetFBIpyData(mapID)
|
if fbIpyData and not fbIpyData.GetGuardPick():
|
GameWorld.Log("¸ÃµØÍ¼ÊØ»¤ÎÞ·¨Ê°È¡ÎïÆ·! mapID=%s" % mapID, curPlayer.GetPlayerID())
|
return
|
|
# #µ¥È˸±±¾Ò»¼üʰȡ
|
# if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtSingle:
|
# SingleFBTPickUP(curPlayer, mapItemID, tick)
|
# return
|
|
if not mapItemIDList:
|
GameWorld.ErrLog("ûÓÐÖ¸¶¨ÒªÊ°È¡µÄµØÍ¼ÎïÆ·ID!", curPlayer.GetPlayerID())
|
return
|
|
succMapItemIDList = [] # ³É¹¦Ê°È¡µÄµØÍ¼ÎïÆ·
|
for mapItemID in mapItemIDList:
|
if __DoPickup(curPlayer, mapItemID, tick, isGuard):
|
succMapItemIDList.append(mapItemID)
|
|
if succMapItemIDList:
|
GameWorld.Log("³É¹¦Ê°È¡µØÍ¼ÎïÆ·, succMapItemIDList=%s" % (succMapItemIDList), curPlayer.GetPlayerID())
|
|
# ÊØ»¤Ê°È¡µÄ£¬¸½¼Óͬ²½ÊØ»¤Ê°È¡½á¹û
|
if isGuard and succMapItemIDList:
|
guradPickupSucc = ChPyNetSendPack.tagMCGuradPickupItemSucc()
|
guradPickupSucc.MapItemID = succMapItemIDList
|
guradPickupSucc.ItemCount = len(guradPickupSucc.MapItemID)
|
NetPackCommon.SendFakePack(curPlayer, guradPickupSucc)
|
|
# Íæ¼Òʰȡ½á¹ûĿǰ¿Í»§¶ËÔÝʱÎÞÓ㬲»Í¨Öª
|
# if not __DoPickup(curPlayer, mapItemID, tick):
|
# curPlayer.Notify_PickupItemResult(mapItemID, 0)
|
# else:
|
# curPlayer.Notify_PickupItemResult(mapItemID, 1)
|
return
|
|
|
###µ¥È˸±±¾Ò»¼üʰȡ
|
## @param curPlayer mapItemID
|
## @return None
|
#def SingleFBTPickUP(curPlayer, mapItemID, tick):
|
# mapItemManager = GameWorld.GetMapItemManager()
|
# curMapItem = mapItemManager.GetItemByID(mapItemID)
|
# if curMapItem == None or curMapItem.IsEmpty():
|
# return
|
#
|
# posX = curPlayer.GetPosX()
|
# posY = curPlayer.GetPosY()
|
# itemPosX = curMapItem.GetPosX()
|
# itemPosY = curMapItem.GetPosY()
|
#
|
# pickDist = GameWorld.GetDist(posX, posY, itemPosX, itemPosY)
|
#
|
# if pickDist > curPlayer.GetPickupDist():
|
# #¾àÀë¹ýÔ¶, ²»ÄܼñÆð
|
# PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_805889")
|
# return
|
#
|
# mapItemIDList = [curMapItem.GetID()]
|
# #ʰȡµ±Ç°¸ñ×ÓÖÜΧµÄÎïÆ·
|
# mapItemManager = GameWorld.GetMapItemManager()
|
# for index in range(mapItemManager.GetMapItemCount()):
|
# mapItem = mapItemManager.GetMapItemByIndex(index)
|
# if not mapItem or mapItem.IsEmpty():
|
# continue
|
#
|
# mapItemObjID = mapItem.GetID()
|
# if mapItemObjID in mapItemIDList:
|
# continue
|
#
|
# curItem = mapItem.GetItem()
|
# # Ö»Ò»¼üʰȡ½ðÇ®
|
# if curItem.GetType() != ChConfig.Def_ItemType_Money:
|
# continue
|
#
|
# pickDist = GameWorld.GetDist(posX, posY, mapItem.GetPosX(), mapItem.GetPosY())
|
#
|
# if pickDist > curPlayer.GetPickupDist():
|
# continue
|
#
|
# mapItemIDList.append(mapItemObjID)
|
#
|
# for mapItemID in mapItemIDList:
|
# if not __DoPickup(curPlayer, mapItemID, tick):
|
# curPlayer.Notify_PickupItemResult(mapItemID, 0)
|
# else:
|
# curPlayer.Notify_PickupItemResult(mapItemID, 1)
|
#
|
# return
|
#---------------------------------------------------------------------
|
## Íæ¼ÒʹÓÃÎïÆ· ->×ÔÉíЧ¹û(·â°ü²ÎÊý)
|
# @param index µ±Ç°Íæ¼ÒË÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def PlayerUseItemSelf(index, tick):
|
GameWorld.GetPsycoFunc(__Func_PlayerUseItemSelf)(index, tick)
|
return
|
|
#---------------------------------------------------------------------
|
## Íæ¼ÒʹÓÃÎïÆ· ->×ÔÉíЧ¹û(·â°ü²ÎÊý)
|
# @param index µ±Ç°Íæ¼ÒË÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def __Func_PlayerUseItemSelf(index, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
#·â°ü²ÎÊý
|
packUseItem = IPY_GameWorld.IPY_CUseItem()
|
|
#ʹÓÃÎïÆ·
|
__DoLogic_PlayerUseItemSelf(curPlayer, packUseItem.GetItemIndex(), tick)
|
return
|
|
#---------------------------------------------------------------------
|
## ʹÓÃÎïÆ·£¬¸ø×Ô¼º
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param useItemIndex ʹÓõÄÎïÆ·Ë÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def __DoLogic_PlayerUseItemSelf(curPlayer, useItemIndex, tick, useCnt=1, exData=0):
|
|
#ʹÓÃÎïÆ·ÐÐΪ״̬, ÅжϿͻ§¶ËÏÞÖÆ
|
if not OperControlManager.IsObjCanDoAction(
|
curPlayer,
|
ChConfig.Def_Obj_ActState_ClientAct,
|
IPY_GameWorld.oalUseItem
|
):
|
return False
|
|
#------------------·â°ü²ÎÊý »ñµÃ Íæ¼ÒÎïÆ·
|
backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
curItem = backPack.GetAt(useItemIndex)
|
|
#¼ì²éÊÇ·ñ¿ÉÒÔʹÓÃÎïÆ·
|
if not CheckPlayerUseItemSelf(curPlayer, curItem, tick):
|
return False
|
|
# -1(²»ÏÞÖÆ); >=0(»¹¿ÉʹÓôÎÊý)
|
todayCanUseCnt = __GetTodayCanUseCnt(curPlayer, curItem)
|
if todayCanUseCnt == 0:
|
return False
|
|
if todayCanUseCnt > 0:
|
useCnt = min(todayCanUseCnt, useCnt)
|
useCnt = min(useCnt, curItem.GetCount()) # ×î´óʹÓÃÊý²»Äܳ¬¹ýÎïÆ·µ±Ç°ÊýÁ¿
|
|
#------------------¼Ç¼ÎïÆ·Ïà¹ØÊôÐÔ //±ØÐëÏȼǼ, ÒòΪDoUseItemLogicÖ´Ðкó, ÎïÆ·ÒѾÏûʧ
|
curItemTypeID = curItem.GetItemTypeID()
|
curItemCDType = curItem.GetCDType()
|
|
#Ö´ÐÐʹÓÃÎïÆ·Âß¼
|
useResult = DoUseItemLogic(curPlayer, curItem, tick, useCnt, exData)
|
isOK, successCnt = __AnalysisUseItemResult(useResult)
|
GameWorld.DebugLog("__DoLogic_PlayerUseItemSelf itemID=%s,result=%s,isOK=%s,successCnt=%s"
|
% (curItemTypeID, useResult, isOK, successCnt))
|
if not isOK:
|
return False
|
|
#------------ʹÓÃÎïÆ·³É¹¦, Ö´ÐÐÏà¹Ø²Ù×÷
|
PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_UseItem, successCnt, [curItemTypeID])
|
|
curPlayer.Sync_UseItem(curItemTypeID, useItemIndex)
|
curPlayer.SetItemCD(curItemCDType, tick)
|
|
#ʹÓÃÎïÆ·µÄÌØÊâÌáʾ
|
ItemCommon.UseItemSpecialNotify(curPlayer, curItemTypeID)
|
|
#Ôö¼Ó½ñÈÕʹÓôÎÊý
|
if todayCanUseCnt > 0:
|
__AddItemUseCntToday(curPlayer, curItemTypeID, successCnt)
|
return True
|
|
## ʹÓÃÎïÆ··µ»ØÖµ´¦Àí£¬ ת»¯Îª¹Ì¶¨¸ñʽ·µ»Ø
|
# @param useResult ²»¶¨ÀàÐÍ·µ»ØÖµ
|
# @return ÊÇ·ñʹÓóɹ¦, ³É¹¦Ê¹ÓøöÊý
|
# @remarks ÓÅ»¯ÅúÁ¿Ê¹ÓÃÎïÆ·Ê±ÎªÁ˼æÈÝоɰ汾×öµÄÁÙʱ´¦Àí
|
def __AnalysisUseItemResult(useResult):
|
# Ö§³ÖNone, bool·µ»ØÖµ, tuple·µ»ØÖµ
|
# ͳһת»¯Îª isOK, ³É¹¦Ê¹ÓôÎÊý
|
isOK = False
|
successCnt = 0
|
|
if isinstance(useResult, tuple):
|
isOK, successCnt = useResult
|
elif isinstance(useResult, bool):
|
isOK = useResult
|
if isOK:
|
successCnt = 1
|
|
return isOK, successCnt
|
|
## ¼ì²éÊÇ·ñ¿ÉÒÔʹÓÃÎïÆ·
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param curItem ʹÓõÄÎïÆ·
|
# @param tick µ±Ç°Ê±¼ä
|
# @return ²¼¶ûÖµ
|
# @remarks
|
def CheckPlayerUseItemSelf(curPlayer, curItem, tick):
|
#----------------------¼ì²é·Ç·¨ÎïÆ·ÊôÐÔ
|
if not ItemCommon.CheckItemCanUse(curItem):
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_644055")
|
return False
|
|
#----------------------¼ì²éÍæ¼ÒÊôÐÔ
|
if not CheckUseItemSelf_Player(curPlayer):
|
return False
|
|
#----------------------¼ì²éÕý³£ÎïÆ·ÊôÐÔ
|
if not UseItemSelf_Item(curPlayer, curItem, tick):
|
return False
|
|
if not ItemCommon.CheckItemCanUseByExpireTime(curItem):
|
# ¹ýÆÚ
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_774045")
|
return False
|
|
return True
|
|
## »ñÈ¡ÎïÆ·½ñÈÕ»¹¿ÉʹÓôÎÊý
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param curItem ʹÓõÄÎïÆ·
|
# @return -1(²»ÏÞÖÆ); >=0(»¹¿ÉʹÓôÎÊý)
|
def __GetTodayCanUseCnt(curPlayer, curItem):
|
maxCnt = ItemCommon.GetCanUseCountDaily(curItem)
|
if maxCnt <= 0:
|
return -1
|
curItemID = curItem.GetItemTypeID()
|
useCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemUseCntToday % curItemID)
|
for itemIDList in IpyGameDataPY.GetFuncEvalCfg('ShareUseCntItem'):
|
if curItemID not in itemIDList:
|
continue
|
for itemID in itemIDList:
|
if itemID == curItemID:
|
continue
|
useCnt += curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemUseCntToday % itemID)
|
|
canUseCnt = max(0, maxCnt - useCnt)
|
|
if canUseCnt <= 0:
|
GameWorld.DebugLog("ÒÑ´ïµ½½ñÈÕʹÓôÎÊýÉÏÏÞ!itemID=%s,useCnt=%s,maxCnt=%s" % (curItemID, useCnt, maxCnt))
|
#PlayerControl.NotifyCode(curPlayer, notifyMark, [itemID])
|
|
#GameWorld.DebugLog("ÎïÆ·ID(%s)½ñÈÕÒÑʹÓôÎÊý(%s), maxCnt=%s" % (itemID, useCnt, maxCnt))
|
return canUseCnt
|
|
## Ôö¼ÓÎïÆ·½ñÈÕʹÓôÎÊý
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param curItem ʹÓõÄÎïÆ·
|
# @return
|
def __AddItemUseCntToday(curPlayer, itemID, addCnt=1):
|
useCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemUseCntToday % itemID)
|
updCnt = min(useCnt + addCnt, ChConfig.Def_UpperLimit_DWord)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ItemUseCntToday % itemID, updCnt)
|
#GameWorld.DebugLog("¸üÐÂÎïÆ·ID(%s)½ñÈÕÒÑʹÓôÎÊý(%s)" % (itemID, updCnt))
|
Sync_ItemDayUseCnt(curPlayer, [itemID])
|
return updCnt
|
|
## ÖØÖÃÎïÆ·½ñÈÕʹÓôÎÊý
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @return
|
def ResetItemUseCntToday(curPlayer):
|
resetItemIDList = []
|
for itemID in PyGameData.DailyUseCountLimitItemIDList:
|
if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemUseCntToday % itemID):
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ItemUseCntToday % itemID, 0)
|
resetItemIDList.append(itemID)
|
if resetItemIDList:
|
Sync_ItemDayUseCnt(curPlayer, resetItemIDList)
|
return
|
|
def Sync_ItemDayUseCnt(curPlayer, syncItemIDList=[]):
|
isForceSync = True
|
if not syncItemIDList:
|
isForceSync = False # ûÓÐÖ¸¶¨ID£¬Ôòֻ֪ͨÓÐʹÓôÎÊýµÄ
|
syncItemIDList = PyGameData.DailyUseCountLimitItemIDList
|
|
useCntInfoPack = ChPyNetSendPack.tagMCItemDayUseCntInfo()
|
useCntInfoPack.Clear()
|
useCntInfoPack.ItemUseCntList = []
|
for itemID in syncItemIDList:
|
useCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemUseCntToday % itemID)
|
if not useCount and not isForceSync:
|
continue
|
useCntPack = ChPyNetSendPack.tagMCItemDayUseCnt()
|
useCntPack.Clear()
|
useCntPack.ItemID = itemID
|
useCntPack.UseCnt = useCount
|
useCntInfoPack.ItemUseCntList.append(useCntPack)
|
useCntInfoPack.Count = len(useCntInfoPack.ItemUseCntList)
|
if useCntInfoPack.Count:
|
NetPackCommon.SendFakePack(curPlayer, useCntInfoPack)
|
return
|
|
#---------------------------------------------------------------------
|
## Ö´ÐÐʹÓÃÎïÆ·Âß¼ // ·µ»ØÕæ±íʾʹÓóɹ¦( Íâ²ãתCDºÍ֪ͨ¿Í»§¶Ë )
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param curItem ʹÓõÄÎïÆ·
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None or True
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def DoUseItemLogic(curPlayer, curItem, tick, useCnt=1, exData=0):
|
#ʹÓÃÌØÊâÎïÆ·½á¹û //·µ»Ø-1´ú±íÒ»°ãÎïÆ·
|
useSpecialItemResult = __DealWith_SpecialItem(curPlayer, curItem, tick, useCnt, exData)
|
|
if useSpecialItemResult != -1:
|
#Õâ¸öÎïÆ·²»ÊÇÒ»°ãÎïÆ·, Ö±½Ó·µ»Ø½á¹û
|
return useSpecialItemResult
|
|
#---ÌØÊâ×°±¸²»Ñé֤װ±¸ÊôÐÔ, ÆÕͨÎïÆ·ÒªÑé֤װ±¸ÊôÐÔ---
|
itemControler = ItemControler.PlayerItemControler(curPlayer)
|
|
#×°±¸ÎÞ·¨Ê¹ÓÃ
|
if itemControler.PlayerCanEquipItem(curItem, False):
|
#Õâ¸öÎïÆ·ÊÇ×°±¸
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_774045")
|
return
|
|
#ÎïÆ·ÀàÐÍID
|
itemTypeID = curItem.GetItemTypeID()
|
|
# ĬÈÏÅúÁ¿Ê¹ÓÃ
|
callFunc = GameWorld.GetExecFunc(UseItem, "Item_%d.%s"%(itemTypeID, "BatchUseItem"))
|
if callFunc:
|
return callFunc(curPlayer, curItem, tick, useCnt, exData)
|
|
#¾É´úÂë¼æÈÝ£¬ÅúÁ¿Ê¹ÓÃÓ¦¸Ãµ÷ÓÃBatchUseItem£¬¶ÔUseItemÑ»·µ÷Óò»ÑϽ÷
|
callFunc = GameWorld.GetExecFunc(UseItem, "Item_%d.%s"%(itemTypeID, "UseItem"))
|
|
if not callFunc:
|
#ÎïÆ·²»¿ÉCall
|
GameWorld.ErrLog("ʹÓÃÎïÆ· = %s²»¿ÉCall"%(itemTypeID), curPlayer.GetID())
|
return
|
|
#·µ»ØÕæ±íʾʹÓóɹ¦( Íâ²ãתCDºÍ֪ͨ¿Í»§¶Ë )
|
return callFunc(curPlayer, curItem, tick)
|
#---------------------------------------------------------------------
|
## ´¦ÀíÌØÊâÎïÆ·
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param curItem ʹÓõÄÎïÆ·
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None or True
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def __DealWith_SpecialItem(curPlayer, curItem, tick, useCnt, exData):
|
#¹ûʵÎïÆ·
|
useFruitResult = PlayerAttrFruit.DoPlayerEatFruitItem(curPlayer, curItem, useCnt)
|
if useFruitResult != -1:
|
return useFruitResult
|
|
#------------------------»ñµÃÎïÆ·Ïà¹ØÊôÐÔ
|
itemTypeID = curItem.GetItemTypeID() #ÎïÆ·ÀàÐÍid
|
curItemType = curItem.GetType() # ÎïÆ·ÀàÐÍ
|
curEffID = curItem.GetEffectByIndex(0).GetEffectID()
|
|
#¸ù¾ÝÎïÆ·ÀàÐÍʹÓÃ{ÎïÆ·ÀàÐÍ:callµÄpyÃû}
|
itemTypeCallFuncDic = {
|
ChConfig.Def_ItemType_HPMP:"Item_Add_HPMP", # ²¹ºì²¹ÀºÒ©¼Á
|
ChConfig.Def_ItemType_AddExp:"Item_AddExp", # ¸ø¾ÑéµÀ¾ß
|
ChConfig.Def_ItemType_GiveMoney:"Item_GiveMoney", # ¸øÈËÎï½ðÇ®
|
ChConfig.Def_ItemType_AutoUseMoney:"Item_GiveMoney", # ¸øÈËÎï½ðÇ®
|
ChConfig.Def_ItemType_RuneExp:"Item_RuneExp", # ¸øÈËÎï·ûÓ¡¾«»ª
|
ChConfig.Def_ItemType_AddLimitBuff:"Item_Add_LimitingBuff", # ¸øÏÞʱbuffÎïÆ·
|
ChConfig.Def_ItemType_AddLimitBuff2:"Item_Add_LimitingBuff", # ¸øÏÞʱbuffÎïÆ·
|
ChConfig.Def_ItemType_AddExpBuff:"Item_Add_LimitingBuff", # ¸øÏÞʱbuffÎïÆ·
|
ChConfig.Def_ItemType_ResetAttrPoint:"Item_ResetAttrPoint", #µ¥¸öÊôÐÔµãÖØÖÃ
|
ChConfig.Def_ItemType_AddCrossRealmPKCnt:"Item_AddCrossRealmPKCnt" #Ôö¼Ó¿ç·þPK´ÎÊý
|
}
|
|
#¸ù¾ÝÎïÆ·Ð§¹ûʹÓÃ{ÎïÆ·Ð§¹ûID:callµÄpyÃû}
|
itemEffIdCallFuncDic = {
|
ChConfig.Def_Effect_UseItemGiveZhenQi:"Item_UseItemGiveZhenQi", # ʹÓõÀ¾ß¸øÓèÕæÆø
|
ChConfig.Def_Effect_AddDienstgrad:"Item_AddDienstgrad", #µÀ¾ß»ñµÃ³ÆºÅ
|
ChConfig.Def_Effect_Face:"Item_Face",
|
ChConfig.Def_Effect_FacePic:"Item_Face",
|
ChConfig.Def_Effect_ItemAddLV:"Item_AddLV", #Éý¼¶µÀ¾ß
|
ChConfig.Def_Effect_TJGAddTime:"Item_TJGAddTime", #Ôö¼ÓÍÑ»ú¹Òʱ¼ä
|
ChConfig.Def_Effect_GuajiAward:"Item_GuajiAward", #Ö±½Ó¸ø¹Ò»úÊÕÒæ
|
ChConfig.Def_Effect_CleanGuilt:"Item_CleanGuilt", # Ï´ºìÃû
|
ChConfig.Def_Effect_PrizeCoin:"Item_PrizeCoin", # ½±Àø³äÖµµãȯ
|
ChConfig.Def_Effect_AddVIPExp:"Item_AddVIPExp", # Ôö¼ÓVIP¾Ñé
|
ChConfig.Def_Effect_VIPLVCard:"Item_VIPLVCard", # VIPµÈ¼¶Ö±Éý¿¨
|
ChConfig.Def_Effect_TiandaoQiyun:"Item_TiandaoQiyun", # ÌìµÀÊ÷ÆøÔË
|
ChConfig.Def_Effect_GubaoPiece:"Item_GubaoPiece", # ¹Å±¦ËéÆ¬Ð§¹ûID
|
ChConfig.Def_Effect_TrainRealmLV:"Item_TrainRealmLV", # ¾³½çÅàÑø¿¨
|
ChConfig.Def_Effect_ResetBossKillCnt:"Item_ResetBossKillCnt", # ÖØÖÃboss»÷ɱƣÀÍ
|
ChConfig.Def_Effect_AddFBCnt:"Item_AddFBCnt", # Ôö¼Ó¸±±¾¿É½øÈë´ÎÊý
|
ChConfig.Def_Effect_AddArenaBattleCount:"Item_AddArenaBattleCount", # Ôö¼Ó¾º¼¼³¡ÌôÕ½´ÎÊý
|
ChConfig.Def_Effect_AddKillBossCnt:"Item_AddKillBossCnt", # Ôö¼ÓBOSS¿É»÷ɱ´ÎÊý
|
ChConfig.Def_Effect_AddMagicWeaponUpExp:"Item_AddMagicWeaponUpExp", # Ôö¼Ó·¨±¦ÉýÐǾÑé
|
ChConfig.Def_Effect_ChatBubbleBox:"Item_ChatBubbleBox", # ¼¤»îÁÄÌìÆøÅÝ¿ò
|
ChConfig.Def_Effect_EmojiPack:"Item_EmojiPack",
|
ChConfig.Def_Effect_ItemGiveWeekPartyPoint:"Item_WeekPartyPoint", # Ôö¼Ó»î¶¯Ñ²Àñ»ý·Ö
|
ChConfig.Def_Effect_ItemGiveWeekPartyPoint1:"Item_WeekPartyPoint", # Ôö¼Ó»î¶¯Ñ²Àñ»ý·Ö
|
ChConfig.Def_Effect_AddRealmExpRate:"Item_AddRealmExpRate", # Ôö¼Ó¾ÛÁéЧÂÊ
|
ChConfig.Def_Effect_TouchMission:"Item_TouchMission", # ´¥·¢ÈÎÎñ½Ó¿Ú
|
#ChConfig.Def_Effect_FamilyImpeach:"Item_FamilyImpeach", # µ¯ÛÀ·û
|
#ChConfig.Def_Effect_ClothesCoatSkin:"Item_ClothesCoatSkin", #¼¤»îʱװƤ·ô
|
#ChConfig.Def_Effect_AddOfficialExp:"Item_AddOfficialExp", # Ôö¼Ó¾ôλ¾Ñé
|
}
|
|
callFuncName = itemTypeCallFuncDic.get(curItemType, "")
|
|
if not callFuncName:
|
callFuncName = itemEffIdCallFuncDic.get(curEffID, "")
|
|
if not callFuncName:
|
chestsIpyData = IpyGameDataPY.GetIpyGameDataNotLog("Chests", itemTypeID)
|
if chestsIpyData:
|
callFuncName = "Item_Chests"
|
|
if callFuncName:
|
pass
|
elif itemTypeID == ChConfig.Def_ItemID_VIPExperience:
|
callFuncName = "Item_VIPExperience" #VIPÌåÑ鿨
|
|
if callFuncName == '':
|
#//Õâ¸öÎïÆ·ÊÇÒ»°ãÎïÆ·, ·µ»ØÍâ²ã¼ÌÐø´¦Àí
|
return -1
|
|
GameWorld.DebugLog("__DealWith_SpecialItem %s" % callFuncName)
|
# ĬÈÏʹÓÃ
|
callFunc = GameWorld.GetExecFunc(UseItem, "%s.BatchUseItem" % callFuncName)
|
if callFunc:
|
return callFunc(curPlayer, curItem, tick, useCnt, exData)
|
|
# ¾É´úÂë¼æÈÝ£¬ÅúÁ¿Ê¹ÓÃÓ¦¸Ãµ÷ÓÃBatchUseItem£¬¶ÔUseItemÑ»·µ÷Óò»ÑϽ÷
|
callFunc = GameWorld.GetExecFunc(UseItem, "%s.UseItem"%callFuncName)
|
|
if not callFunc:
|
GameWorld.ErrLog('###ʹÓÃÎïÆ·Òì³£, ÎÞ·¨²éÕÒ %s Îļþ'%(callFuncName))
|
return
|
|
return callFunc(curPlayer, curItem, tick)
|
#---------------------------------------------------------------------
|
|
|
|
#===============================================================================
|
# //07 16 ʹÓÃСÀ®°È#tagCUseSpeaker
|
# tagCUseSpeaker * GettagCUseSpeaker();
|
#
|
# class IPY_CUseSpeaker
|
# {
|
# public:
|
# //ÊÇ·ñʹÓýðǮ˵»°
|
# int GetUseGold();
|
# //ʹÓÃÎïÆ·Ëµ»°Ê±, ÎïÆ·Index
|
# int GetItemIndex();
|
# //×Ö·û³¤¶È
|
# int GetTextLen();
|
# //size = TextLen
|
# char * GetText();
|
# };
|
#===============================================================================
|
## ʹÓÃÀ®°È
|
# @param index ÎïÆ·Ë÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def UseSpeaker(index, tick):
|
# ·ÏÆú£¬Ê¹Óà A2 17 À®°ÈÁÄÌì #tagCMPYSpeaker
|
|
return
|
|
|
|
## ʹÓÃÎïÆ·Ð¡À®°È
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param itemIndex ÎïÆ·Ë÷Òý
|
# @return СÀ®°ÈµÈ¼¶
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def DoSpeaker_UseItem(curPlayer, itemIndex, speakerType=0):
|
#µÃµ½Íæ¼ÒµÄ±³°ü
|
backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
#µÃµ½µ±Ç°ÎïÆ·
|
curItem = backPack.GetAt(itemIndex)
|
|
#»ñµÃʹÓõÄÀ®°ÈµÈ¼¶
|
speakerLV = __GetSpeakerLV(curPlayer, curItem)
|
|
if not speakerLV or (speakerType and speakerType != speakerLV):
|
return 0
|
|
dataDict = {"ItemID":curItem.GetItemTypeID(), "ItemCount":1, "ItemGUID":curItem.GetGUID()}
|
DataRecordPack.DR_DeleteItem(curPlayer, 'SpeakerUseItem', dataDict)
|
|
ItemControler.SetItemCount(curItem, curItem.GetCount() - 1,
|
curPlayer.GetID(), curPlayer.GetAccID(), curPlayer.GetPlayerName())
|
|
return speakerLV
|
|
### ʹÓýðǮСÀ®°È
|
## @param curPlayer µ±Ç°Íæ¼Ò
|
## @param useGold
|
## @return None or speakerLV
|
## @remarks º¯ÊýÏêϸ˵Ã÷.
|
#def __DoSpeaker_UseGold(curPlayer , useGold):
|
# #ʹÓÃÀ®°ÈµÈ¼¶
|
# speakerLV = 0
|
# #useGold 1:ʹÓýðÀ®°È , 2:ʹÓÃÒøÀ®°È
|
# if useGold == 1:
|
# speakerLV = 3
|
# curItemData = GameWorld.GetGameData().GetItemByTypeID(ChConfig.Def_SpeakerItem_GoldID)
|
# else:
|
# speakerLV = 2
|
# curItemData = GameWorld.GetGameData().GetItemByTypeID(ChConfig.Def_SpeakerItem_SilverID)
|
#
|
# if not curItemData:
|
# GameWorld.Log('###Êý¾Ý¿âÎÞ·¨²éÕÒСÀ®°È')
|
# return speakerLV
|
#
|
# price , priceType = ItemCommon.GetItemSellPrice(curPlayer , curItemData , 1)
|
#
|
# if not PlayerControl.PayMoney(curPlayer, priceType, price):
|
# #ûǮ,·µ»Ø
|
# return speakerLV
|
#
|
# GameWorld.Login_Interface_GoldRec(curPlayer , curItemData.GetItemTypeID() , 1 , curItemData.GetName() , priceType , price)
|
#
|
# return speakerLV
|
|
|
#---------------------------------------------------------------------
|
## »ñÈ¡·¢ÑԵȼ¶
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param curItem ʹÓõÄÎïÆ·
|
# @return ·¢ÑԵȼ¶
|
# @remarks »ñÈ¡·¢ÑԵȼ¶.
|
def __GetSpeakerLV(curPlayer, curItem):
|
#Òì³£ÎïÆ·
|
if not ItemCommon.CheckItemCanUse(curItem):
|
return 0
|
|
if not ItemControler.CheckItemUseLV(curPlayer, curItem):
|
return 0
|
|
#µÃµ½µ±Ç°Ð§¹û
|
curEff = curItem.GetEffectByIndex(0)
|
curEffID = curEff.GetEffectID()
|
|
if curEffID != ChConfig.Def_Effect_ItemSpeak:
|
return 0
|
|
curEffValue = curEff.GetEffectValue(0)
|
|
if curEffValue < 1 or curEffValue > 3:
|
GameWorld.ErrLog("СÀ®°ÈÌî±í´íÎó curEffID = %s, value = %s"%(curEffID, curEffValue), curPlayer.GetPlayerID())
|
return 0
|
|
return curEffValue
|
#---------------------------------------------------------------------
|
## ¼ì²éʹÓÃÎïÆ·µÄÍæ¼ÒÊôÐÔ
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @return ²¼¶ûÖµ
|
# @remarks ¼ì²éʹÓÃÎïÆ·µÄÍæ¼ÒÊôÐÔ.
|
def CheckUseItemSelf_Player(curPlayer):
|
if GameObj.GetHP(curPlayer) <= 0 :
|
return False
|
|
# #Ñ£ÔÎʱ, ²»¿ÉʹÓÃÎïÆ·
|
# if curPlayer.GetAbnormalState() == IPY_GameWorld.sctFaint:
|
# return False
|
|
#ʹÓÃÎïÆ·ÐÐΪ״̬, ÅжϷþÎñ¶ËÏÞÖÆ
|
if not OperControlManager.IsObjCanDoAction(
|
curPlayer,
|
ChConfig.Def_Obj_ActState_ServerAct,
|
IPY_GameWorld.oalUseItem
|
):
|
return False
|
|
#ÔÚïÚ³µÖÐ, ²»¿ÉʹÓÃÎïÆ·
|
if curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvTruck :
|
PlayerControl.NotifyCode(curPlayer, "Old_hgg_0")
|
return False
|
|
#½»Ò×״̬, ²»¿ÉʹÓÃÎïÆ·
|
if curPlayer.GetPlayerAction() == IPY_GameWorld.paTrade:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_372238")
|
return False
|
|
# #GM½ûֹʹÓÃ
|
# if GameWorld.IsGM(curPlayer):
|
# PlayerControl.NotifyCode(curPlayer, "GeRen_admin_59724")
|
# return False
|
|
return True
|
#---------------------------------------------------------------------
|
## ¼ì²éÄÜ·ñʹÓÃÎïÆ·
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param curItem µ±Ç°ÎïÆ·
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None or True
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def UseItemSelf_Item(curPlayer, curItem, tick):
|
|
if curItem.GetType() == ChConfig.Def_ItemType_CanUseByCDTime:
|
cdType = curItem.GetCanPlaceInShortcut() # ÓÉÓÚ GetCDType ×Ö¶ÎÊǹ«¹²CD£¬ËùÒÔµ¥¶ÀÁíÒ»¸öÀàÐÍ
|
# µ¹¼ÆÊ±ÀàÐÍ: 0-ĬÈÏÃ룻1-°´»ñµÃÎïÆ·Ìì
|
if not cdType:
|
curItemPastTime = int(time.time()) - curItem.GetUserAttr(ShareDefine.Def_IudetCreateTime)
|
if curItemPastTime < curItem.GetCDTime():
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_749572")
|
GameWorld.DebugLog("δµ½Ê¹ÓÃʱ¼ä£¬²»¿ÉʹÓÃ! itemID=%s,curItemPastTime=%s < CDTime(%s)"
|
% (curItem.GetItemTypeID(), curItemPastTime, curItem.GetCDTime()))
|
return
|
elif cdType == 1:
|
passDays = GameWorld.GetDiff_Day(int(time.time()), curItem.GetUserAttr(ShareDefine.Def_IudetCreateTime)) + 1
|
if passDays < curItem.GetCDTime():
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_749572")
|
GameWorld.DebugLog("δµ½Ê¹ÓÃʱ¼ä£¬²»¿ÉʹÓÃ! itemID=%s,cdType=%s,passDays=%s < CDTime(%s)"
|
% (curItem.GetItemTypeID(), cdType, passDays, curItem.GetCDTime()))
|
return
|
else:
|
if (tick - curPlayer.GetItemCDStartTime(curItem.GetCDType())) < curItem.GetCDTime():
|
#CDÀäȴʱ¼äδµ½
|
#PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_749572")
|
GameWorld.DebugLog("CDÀäȴʱ¼äδµ½,itemID=%s,CDType=%s,tick(%s)-cdStartTime(%s)=%s < %s"
|
% (curItem.GetItemTypeID(), curItem.GetCDType(), tick, curPlayer.GetItemCDStartTime(curItem.GetCDType()),
|
tick - curPlayer.GetItemCDStartTime(curItem.GetCDType()), curItem.GetCDTime()))
|
return
|
|
#¼ì²éʹÓõȼ¶
|
if curItem.GetUseLV() == 0:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_774045")
|
return
|
|
if curItem.GetUseLV() > curPlayer.GetLV():
|
PlayerControl.NotifyCode(curPlayer, "DJ_Equip_UnUse_Lv")
|
return
|
|
if ItemControler.IsEventItem(curItem):
|
PlayerControl.NotifyCode(curPlayer, "itemuse_chenxin_31379")
|
return
|
|
#Íæ¼ÒÔÚïÚ³µÖÐ,²»ÄÜʹÓÃÎïÆ·
|
if curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvTruck:
|
PlayerControl.NotifyCode(curPlayer, "Old_hgg_0")
|
return
|
|
# #Íæ¼ÒʼþÖÐ, ²»ÄÜʹÓÃÎïÆ·
|
# if (curPlayer.GetPlayerAction() == IPY_GameWorld.paEvent and
|
# not curItem.GetEventCanUse()):
|
# PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_372238")
|
# return
|
|
#Ö°ÒµÏÞÖÆ
|
if not ItemCommon.CheckJob(curPlayer, curItem):
|
PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_31379")
|
return
|
|
#ÎïÆ·Ê¹Óõȼ¶¼ì²é
|
if not ItemControler.CheckItemUseLV(curPlayer, curItem):
|
return
|
|
#===============================================================================
|
# #¼ì²é¶ÔÏóÊÇ·ñÕýÈ·
|
# if curItem.GetUseTag() not in [1,5,12]:
|
# GameWorld.Log("curItem is : %s UseTag is : %s"%(curItem.GetItemTypeID(),curItem.GetUseTag()))
|
# PlayerControl.NotifyCode(curPlayer, "UseResLost09")
|
# return
|
#===============================================================================
|
#------------------------ÌØÊⳡ¾°¼ì²é
|
#FB½ûֹʹÓÃÎïÆ·
|
if FBLogic.DoFBForbidUseItem(curPlayer, curItem):
|
return
|
|
return True
|
|
|
## ÎïÆ·¼ì²éÊÇ·ñ¿ÉÒÔɾ³ý
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param curItem µ±Ç°ÎïÆ·
|
# @return False or True
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def __CheckItemCanDel(curPlayer, curItem):
|
#ÎïÆ·²»´æÔÚ
|
if curItem == None or curItem.IsEmpty():
|
return False
|
|
if curItem.GetIsLocked():
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_644055")
|
return False
|
|
if curItem.GetCanDrop() == 0:
|
PlayerControl.NotifyCode(curPlayer, "UseResLost10")
|
return False
|
|
#°ó¶¨ÎïÆ·²»¿É¶ªÆú
|
if curItem.GetIsBind():
|
PlayerControl.NotifyCode(curPlayer, "UseResLost10")
|
return False
|
|
if ItemControler.IsEventItem(curItem):
|
PlayerControl.NotifyCode(curPlayer, "itemuse_chenxin_31379")
|
return False
|
|
# ÅжÏÊÇ·ñÊǹóÖØÆ·
|
if ItemControler.IsValuableItem(curItem):
|
return False
|
|
return True
|
|
|
#---------------------------------------------------------------------
|
#//A3 02 ¶ªÆú±³°üÎïÆ· #tagPlayerDropItem
|
#
|
#struct tagPlayerDropItem
|
#
|
#{
|
# tagHead Head;
|
# BYTE PackType; //±³°üÀàÐÍ
|
# WORD ItemIndex; //ÎïÆ·ÔÚ±³°üÖÐË÷Òý
|
# WORD DropPosX;
|
# WORD DropPosY; //µôÂäÎïÆ·
|
#};
|
#---------------------------------------------------------------------
|
## Íæ¼Ò¶ªÆúÎïÆ·(·â°ü²ÎÊý)
|
# @param index ÎïÆ·Ë÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
def PlayerDropItem(index, packData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
|
packType = packData.PackType
|
if IPY_GameWorld.rptItem != packType:
|
return
|
|
dropPosX = packData.DropPosX
|
dropPosY = packData.DropPosY
|
# Õϰµã
|
if not GameWorld.GetMap().CanMove(dropPosX, dropPosY):
|
return
|
|
itemIndex = packData.ItemIndex
|
|
#»ñµÃÍæ¼ÒÎïÆ·¹ÜÀíÆ÷
|
ItemManager = curPlayer.GetItemManager()
|
#»ñµÃÍæ¼Ò±³°ü
|
curPack = ItemManager.GetPack(packType)
|
#¸ù¾Ý·â°ü,»ñµÃ±³°üÖеÄÎïÆ·
|
curItem = curPack.GetAt(itemIndex)
|
|
#ÎïÆ·²»´æÔÚ
|
if not ItemCommon.CheckItemCanUse(curItem):
|
return
|
|
#¼ì²éÎïÆ·¿É·ñ¶ªÆú
|
if not __CheckItemCanDel(curPlayer, curItem):
|
return
|
|
#ÒòÈռǼǼÁ¿¹ý´ó,Ìí¼Óɸѡ
|
if ItemControler.ItemNeedRecord(curItem):
|
#Ïêϸ¼Ç¼װ±¸ÐÅÏ¢
|
equipNoteDict = ItemCommon.GetItemNoteDict(curItem, curItem.GetCount())
|
DataRecordPack.DR_DeleteItemInRecycle(curPlayer, equipNoteDict)
|
ItemCommon.DR_DelItem(curPlayer, packType, "DropPackItem", equipNoteDict)
|
|
#ɾ³ýÎïÆ·
|
#ItemManager.DeleteItem(curItem)
|
sightLevel = PlayerControl.GetMapRealmDifficulty(curPlayer)
|
curMapItem = AddMapDropItem(dropPosX, dropPosY, curItem.GetItem(), sightLevel=sightLevel)
|
curMapItem.SetOwnerType(ChConfig.Def_NPCHurtTypePlayer)
|
curMapItem.SetOwnerID(curPlayer.GetPlayerID())
|
|
#Çå³ýÔ±³°üÎïÆ·
|
curItem.Wipe()
|
return
|
|
#---------------------------------------------------------------------
|
#===============================================================================
|
# //07 12 Íæ¼Òɾ³ý³ÆºÅ#tagCDeleteTitle
|
#
|
# struct tagCDeleteTitle
|
# {
|
# tagHead Head;
|
# WORD TitleIndex; //³ÆºÅ±³°üÖеĵڼ¸¸ö
|
# };
|
#===============================================================================
|
## ɾ³ý³ÆºÅ(·â°ü²ÎÊý)
|
# @param index ÎïÆ·Ë÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks //07 12 Íæ¼Òɾ³ý³ÆºÅ#tagCDeleteTitle
|
def DeleteTitle(index, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
#Ҫɾ³ý³ÆºÅµÄλÖÃ
|
sendPack = IPY_GameWorld.IPY_CDeleteTitle()
|
titleIndex = sendPack.GetTitleIndex()
|
#»ñµÃҪɾ³ýµÄ³ÆºÅ
|
itemManager = curPlayer.GetItemManager()
|
curItem = itemManager.GetPack(IPY_GameWorld.rptTitle).GetAt(titleIndex)
|
|
if not ItemCommon.CheckItemCanUse(curItem):
|
#CallcannotDelete Ëø¶¨µÄ³ÆºÅ,ÎÞ·¨É¾³ý
|
PlayerControl.NotifyCode(curPlayer, "CallcannotDelete")
|
return
|
|
DataRecordPack.DR_DeleteItem(curPlayer, "DeleteTitle", {"ItemID":curItem.GetItemTypeID()})
|
#ɾ³ý³ÆºÅ
|
itemManager.DeleteItem(curItem)
|
return
|
#---------------------------------------------------------------------
|
## ´Ó»ØÊÕÕ¾ÖÐÈ¡»ØÎïÆ·(·â°üË÷Òý)
|
# @param index ÎïÆ·Ë÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def GetbackItemInRecycle(index, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
sendPack = IPY_GameWorld.IPY_CGetbackItemInRecycle()
|
#»ØÊÕÕ¾ÖÐÎïÆ·Î»ÖÃ
|
recycleIndex = sendPack.GetRecycleIndex()
|
#»ñµÃÍæ¼ÒÎïÆ·¹ÜÀíÆ÷
|
itemManager = curPlayer.GetItemManager()
|
#»ñµÃ»ØÊÕÕ¾
|
curRecyclePack = itemManager.GetPack(IPY_GameWorld.rptRecycle)
|
#¸ù¾Ý·â°ü,»ñµÃ»ØÊÕÕ¾ÖеÄÎïÆ·¸ñ
|
curRecycleItem = curRecyclePack.GetAt(recycleIndex)
|
#ÎïÆ·²»´æÔÚ
|
if not ItemCommon.CheckItemCanUse(curRecycleItem):
|
return
|
|
#»ñµÃ·ÅÈëµÄÍæ¼Ò±³°üλÖÃ
|
itemPackIndex = sendPack.GetItemIndex()
|
curItemPack = itemManager.GetPack(IPY_GameWorld.rptItem)
|
|
if itemPackIndex >= curItemPack.GetCount() or itemPackIndex < 0:
|
GameWorld.Log("GetbackItemInRecycle -> µ±Ç°¸ñ×Ó±³°üδ´ò¿ª, %s%s"%(itemPackIndex, curItemPack.GetCount()) , curPlayer.GetPlayerID())
|
return
|
|
#»ñµÃÎïÆ·¸öÊý
|
curCount = curRecycleItem.GetCount()
|
curItemID = curRecycleItem.GetItemTypeID()
|
#»Ø¹ºÎïÆ··ÑÓÃ=ÎïÆ·¼þÊý*#»Ø¹ºµ¥¼þÎïÆ··ÑÓÃ
|
curRecycleItemPrice = curCount * ChConfig.Def_RecycleReturnMoney
|
curSilverType = curPlayer.GetUseSilverType()
|
#silverValue = PlayerControl.GetSilver(curPlayer)
|
itemControl = ItemControler.PlayerItemControler(curPlayer)
|
|
#ÊÇ·ñÓÐ×ã¹»µÄ¿Õ¼ä
|
if not itemControl.CanPutInItem(IPY_GameWorld.rptItem, curItemID, curCount, curRecycleItem.GetIsBind()):
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [IPY_GameWorld.rptItem])
|
return
|
|
if not PlayerControl.PayMoney(curPlayer, curSilverType, curRecycleItemPrice, ChConfig.Def_Cost_BuyItemBack,
|
{ChConfig.Def_Cost_Reason_SonKey:curItemID}):
|
return
|
|
ItemControler.DragItem(curPlayer, IPY_GameWorld.rptRecycle, recycleIndex, IPY_GameWorld.rptItem, itemPackIndex, curCount)
|
#---------------------------------------------------------------------
|
## Çå¿Õ»ØÊÕÕ¾(·â°üË÷Òý)
|
# @param index ÎïÆ·Ë÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def ClearRecycle(index, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
#sendPack = IPY_GameWorld.IPY_CClearRecycle()
|
#»ñµÃÍæ¼ÒÎïÆ·¹ÜÀíÆ÷
|
ItemManager = curPlayer.GetItemManager()
|
#»ñµÃ»ØÊÕÕ¾
|
curPack = ItemManager.GetPack(IPY_GameWorld.rptRecycle)
|
#¸ù¾Ý·â°ü,ɾ³ý»ØÊÕÕ¾ÖеÄËùÓÐÎïÆ·
|
for i in range(0, curPack.GetCount()):
|
curItem = curPack.GetAt(i)
|
|
if not ItemCommon.CheckItemCanUse(curItem):
|
continue
|
|
#ɾ³ýÎïÆ·
|
ItemManager.DeleteItem(curItem)
|
|
return
|
|
|
#---------------------------------------------------------------------
|
## Í϶¯ÎïÆ·(·â°üË÷Òý)
|
# @param index ÎïÆ·Ë÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def DragItem(index, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
# if curPlayer.GetPlayerAction() == IPY_GameWorld.paEvent:
|
# GameWorld.Log("Íæ¼ÒʼþÖÐ, ²»ÔÊÐíÍÏ×§")
|
# return
|
clientDrag = IPY_GameWorld.IPY_CDragItem()
|
ItemControler.DragItem(curPlayer, IPY_GameWorld.rptItem, clientDrag.GetSrcIndex(), IPY_GameWorld.rptItem, clientDrag.GetDestIndex(), clientDrag.GetItemCount())
|
return
|
#---------------------------------------------------------------------
|
## ÎïÆ·Ê°È¡¼ì²é(²ÎÊý - > µ±Ç°Íæ¼Ò,µØÍ¼ÎïÆ·,µ±Ç°Ê±¼ä)
|
# @param index ÎïÆ·Ë÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return True or False
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def __CheckPickUpItemTime(curPlayer, mapItem, tick, mapItemID, dropItemNPCID):
|
#ÅжÏÎïÆ·±£»¤Ê±¼ä
|
#Íæ¼Ò»÷ɱµôÂäµÄ
|
if mapItem.GetRemainTick(tick) == 0:
|
return True
|
itemOwnerType = mapItem.GetOwnerType()
|
playerID = curPlayer.GetPlayerID()
|
ownerID = mapItem.GetOwnerID()
|
|
#ËùÓÐÈ˶¼¿ÉÒÔʰȡµÄÎïÆ·
|
if itemOwnerType == ChConfig.Def_NPCHurtTypeAll:
|
return True
|
#¸öÈËÎïÆ·
|
elif itemOwnerType == ChConfig.Def_NPCHurtTypePlayer:
|
if ownerID != playerID:
|
GameWorld.Log("Íæ¼ÒûÓйéÊôȨ£¬²»ÄÜʰȡ! mapItemID=%s,dropItemNPCID=%s,ownerID=%s"
|
% (mapItemID, dropItemNPCID, ownerID), playerID)
|
return False
|
#¶ÓÎéÎïÆ·
|
elif itemOwnerType == ChConfig.Def_NPCHurtTypeTeam:
|
curTeam = curPlayer.GetTeam()
|
if curTeam == None:
|
GameWorld.Log("ûÓжÓÎé²»ÄÜʰȡ¹éÊô¶ÓÎéÎïÆ·! mapItemID=%s,dropItemNPCID=%s,ownerID=%s"
|
% (mapItemID, dropItemNPCID, ownerID), playerID)
|
return False
|
if curTeam.GetTeamID() != ownerID:
|
GameWorld.Log("¶ÓÎéûÓйéÊôȨ£¬²»ÄÜʰȡ! mapItemID=%s,dropItemNPCID=%s,ownerID=%s,curTeamID=%s"
|
% (mapItemID, dropItemNPCID, ownerID, curTeam.GetTeamID()), playerID)
|
return False
|
#ÕóÓªÎïÆ·
|
elif itemOwnerType == ChConfig.Def_NPCHurtTypeFaction:
|
if ownerID != curPlayer.GetFaction():
|
GameWorld.Log("ÕóӪûÓйéÊôȨ£¬²»ÄÜʰȡ! mapItemID=%s,dropItemNPCID=%s,ownerID=%s,curFaction=%s"
|
% (mapItemID, dropItemNPCID, ownerID, curPlayer.GetFaction()), playerID)
|
return False
|
#ÌØÊâÍæ¼ÒID¹éÊô
|
elif itemOwnerType == ChConfig.Def_NPCHurtTypeSpecial:
|
ownerIDList = GetMapItemUserDataValue(mapItem, ShareDefine.Def_MapItemInfo_SpecOwner, [])
|
if playerID not in ownerIDList:
|
GameWorld.Log("Íæ¼ÒûÓйéÊôȨ£¬²»ÄÜʰȡ! mapItemID=%s,dropItemNPCID=%s,ownerIDList=%s"
|
% (mapItemID, dropItemNPCID, ownerIDList), playerID)
|
return False
|
#ÏÉÃ˹éÊô
|
elif itemOwnerType == ChConfig.Def_NPCHurtTypeFamily:
|
if ownerID != curPlayer.GetFamilyID():
|
GameWorld.Log("ÏÉÃËûÓйéÊôȨ£¬²»ÄÜʰȡ! mapItemID=%s,dropItemNPCID=%s,ownerID=%s,curFamilyID=%s"
|
% (mapItemID, dropItemNPCID, ownerID, curPlayer.GetFamilyID()), playerID)
|
return False
|
|
return True
|
|
def GetMapItemUserDataValue(mapItem, dataIndex, defaultValue=None):
|
userData = mapItem.GetUserData()
|
try:
|
userData = eval(userData)
|
except:
|
return defaultValue
|
key = str(dataIndex)
|
if key not in userData:
|
return defaultValue
|
return userData[key]
|
|
#===============================================================================
|
# //07 19 ÍòÄܱ³°üÈ¡³öÎïÆ·#tagCGetAnyWhereItem
|
# tagCGetAnyWhereItem * GettagCGetAnyWhereItem();
|
#
|
# class IPY_CGetAnyWhereItem
|
# {
|
# public:
|
# //ÍòÄܱ³°üµÄindex
|
# int GetAnyWhereItemIndex();
|
# //×Ô¼º±³°üµÄindex
|
# int GetDestIndex();
|
# //ÍòÄܱ³°üÈ¡³öÀàÐÍTAnyWherePackType
|
# int GetAnyWherePackType();
|
# };
|
#===============================================================================
|
## »ñÈ¡ÍòÄܱ³°üÎïÆ·
|
# @param index Íæ¼ÒË÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def GetAnyWhereItem(index , tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
pack = IPY_GameWorld.IPY_CGetAnyWhereItem()
|
srcIndex = pack.GetAnyWhereItemIndex()
|
destIndex = pack.GetDestIndex()
|
anyWherePackType = pack.GetAnyWherePackType()
|
__DoLogic_GetAnyWhereItem(curPlayer , srcIndex , destIndex , anyWherePackType)
|
return
|
|
## ´ÓÍòÄܱ³°üÈ¡ÎïÆ·
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param srcIndex ÍòÄܱ³°üË÷Òý
|
# @param destIndex ±³°üË÷Òý
|
# @param anyWherePackType ±³°üÀàÐÍ
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def __DoLogic_GetAnyWhereItem(curPlayer , srcIndex , destIndex , anyWherePackType):
|
curItem = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptAnyWhere).GetAt(srcIndex)
|
|
if not ItemCommon.CheckItemCanUse(curItem):
|
return
|
|
curItemCount = curItem.GetCount()
|
curItemTypeID = curItem.GetItemTypeID()
|
itemControl = ItemControler.PlayerItemControler(curPlayer)
|
|
if not itemControl.CanPutInItem(IPY_GameWorld.rptItem, curItemTypeID, curItemCount, curItem.GetIsBind()):
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [IPY_GameWorld.rptItem])
|
return
|
|
#ÊÀ½ç¹ã²¥¼«Æ·
|
#__Notify_GoodItem(curPlayer , anyWherePackType , curItem)
|
|
#GeRen_chenxin_341290 ¹§Ï²Äú,»ñµÃ[s1][s2]
|
#PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_341290", [curItemTypeID , curItemCount])
|
|
#֪ͨ·ÅÈëÌØÐ§
|
#curPlayer.Sync_GetItemView(curItemTypeID, curItemCount)
|
|
#È¡»ØÎïÆ·µ½±³°ü
|
ItemControler.DragItem(curPlayer, IPY_GameWorld.rptAnyWhere, srcIndex, IPY_GameWorld.rptItem, destIndex, curItemCount)
|
return
|
|
#---------------------------------------------------------------------
|
#===============================================================================
|
# //07 20 ÎïÆ··ÅÈë·¨±¦±³°ü#tagCPutItemInFabao
|
# tagCPutItemInFabao * GettagCPutItemInFabao();
|
#
|
# class IPY_CPutItemInFabao
|
# {
|
# public:
|
# //·¨±¦µÄIndex
|
# int GetItemIndex();
|
# };
|
#===============================================================================
|
## ²»Ïê
|
# @param
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def PutItemInFabao(index , tick):
|
return
|
|
#---------------------------------------------------------------------
|
#===============================================================================
|
# //07 21 È¡³ö·¨±¦±³°üµÄÎïÆ·#tagCGetBackItemInFabao
|
# tagCGetBackItemInFabao * GettagCGetBackItemInFabao();
|
#
|
# class IPY_CGetBackItemInFabao
|
# {
|
# public:
|
# //È¡³öµÄÄ¿±êλÖÃ
|
# int GetTagItemIndex();
|
# };
|
#===============================================================================
|
## ²»Ïê
|
# @param index
|
# @param tick
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def GetBackItemInFabao(index , tick):
|
return
|
|
##===============================================================================
|
##07 24 tagCDingDianTransport
|
#
|
### ¶¨µã£¨³ÇÊУ©´«ËÍ ºÍ ¶´Ñ¨´«ËÍ £¨ÊÕ°ü²ÎÊý£©
|
## @param index Íæ¼ÒË÷Òý
|
## @param tick µ±Ç°Ê±¼ä
|
## @return None
|
## @remarks º¯ÊýÏêϸ˵Ã÷.
|
#def PointTransport(index, tick):
|
# return
|
# packUseItem = IPY_GameWorld.IPY_CDingDianTransport()
|
# useItemIndex = packUseItem.GetItemIndex()
|
# transportIndex = packUseItem.GetTransportIndex()
|
#
|
# #»ñµÃÍæ¼ÒʹÓõÄÎïÆ·
|
# curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
# backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
# curItem = backPack.GetAt(useItemIndex)
|
#
|
# #¼ì²éÍæ¼Ò״̬ºÍÎïÆ·
|
# if not CheckUseTransformItem(curPlayer, curItem, tick):
|
# return
|
#
|
# #ÅжÏÊôÓÚÄÄÖÖ´«ËÍ
|
# effIndex = curItem.GetEffectByIndex(0)
|
# curEffID = effIndex.GetEffectID()
|
#
|
# #CDÑéÖ¤
|
# if (tick - curPlayer.GetItemCDStartTime(curEffID)) < curItem.GetCDTime():
|
# #CDÀäȴʱ¼äδµ½
|
# PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_749572")
|
# return
|
#
|
# #Åжϲ¢Ö´Ðд«ËÍ
|
# if not __DoTransport(curPlayer, curItem, curEffID, transportIndex, useItemIndex, tick):
|
# return
|
#
|
### Ö´Ðд«ËÍ
|
## @param curPlayer µ±Ç°Íæ¼Ò
|
## @param curItem ʹÓÃÎïÆ·
|
## @param curEffID µ±Ç°Ð§¹û
|
## @param transportIndex ´«Ë͵ãË÷Òý
|
## @param useItemIndex ʹÓõÄÎïÆ·Ë÷Òý
|
## @param tick µ±Ç°Ê±¼ä
|
## @return None
|
## @remarks º¯ÊýÏêϸ˵Ã÷.
|
#def __DoTransport(curPlayer, curItem, curEffID, transportIndex, useItemIndex, tick):
|
# #¶¨µãÁбí
|
# cityPosList = ReadChConfig.GetEvalChConfig('Def_List_City_Pos')
|
# #ɽ¶´Áбí
|
# cavePosList = ReadChConfig.GetEvalChConfig('Def_List_Cave_Pos')
|
#
|
# #¶¨µã
|
# if curEffID == ChConfig.Def_Item_150_Effect:
|
# posList = cityPosList
|
# #ɽ¶´
|
# elif curEffID == ChConfig.Def_Item_152_Effect:
|
# posList = cavePosList
|
# else:
|
# GameWorld.Log('###·Ç·¨Ê¹ÓÃÎïÆ·,Ч¹ûÖµ%s'%(curEffID,), curPlayer.GetPlayerID())
|
# return
|
#
|
# #¼ì²éÔ½½ç
|
# if transportIndex < 0 or transportIndex >= len(posList):
|
# GameWorld.Log('###¶¨µã´«ËÍÔ½½ç--%s'%(transportIndex))
|
# return
|
#
|
# #Ä¿±êµØÍ¼ÅжÏ
|
# if not PlayerControl.CheckTagCountry(curPlayer, posList[transportIndex][0]):
|
# return
|
#
|
# itemID = curItem.GetItemTypeID()
|
#
|
#
|
# #ʹÓÃxxÒ»¸ö
|
# PlayerControl.NotifyCode(curPlayer, "LostRes", [itemID, 1])
|
# #֪ͨ¿Í»§¶Ë
|
# curPlayer.Sync_UseItem(itemID, useItemIndex)
|
# curPlayer.SetItemCD(curItem.GetCDType(), tick)
|
#
|
# #¿Û³ýÎïÆ·£¨ÏȼǼÔÙɾ³ý£¬±ÜÃâµ×²ãÒѾɾ³ý´ËÎïÆ·£©
|
# curItem.SetCount(curItem.GetCount() - 1)
|
#
|
# #Åжϳɹ¦£¬½øÐд«ËÍ
|
# PlayerControl.PlayerResetWorldPos(curPlayer, posList[transportIndex][0], posList[transportIndex][1], posList[transportIndex][2], False)
|
#
|
# #´«ËÍXXµØµãÌáʾ
|
# PlayerControl.NotifyCode(curPlayer, "Map_Deliver_Succeed", [posList[transportIndex][0]])
|
|
#---------------------------------------------------------------------
|
#===============================================================================
|
# //07 26 ÓжÔÏóµÄʹÓÃÎïÆ·#tagCUseItemTag
|
# tagCUseItemTag * GettagCUseItemTag();
|
#
|
# class IPY_CUseItemTag
|
# {
|
# public:
|
# //ÎïÆ·Index
|
# int GetItemIndex();
|
# //ÀàÐÍ
|
# int GetTagType();
|
# //ID
|
# int GetTagID();
|
# };
|
#===============================================================================
|
## Íæ¼ÒʹÓÃÎïÆ·(Ðè»Ø°ü)£¨²ÎÊý·â°ü£©
|
# @param index Íæ¼ÒË÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def PlayerUseItemTag(index , tick):
|
#µÃµ½Íæ¼Ò
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
#Íæ¼ÒʹÓÃÎïÆ·
|
packUseItem = IPY_GameWorld.IPY_CUseItemTag()
|
|
useItemIndex = packUseItem.GetItemIndex()
|
|
backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
curItem = backPack.GetAt(useItemIndex)
|
if not ItemCommon.CheckItemCanUse(curItem):
|
return
|
|
curItemType = curItem.GetType()
|
curItemID = curItem.GetItemTypeID()
|
|
#Ö´ÐÐʹÓÃÎïÆ·Âß¼
|
useItemResult = __DoLogic_PlayerUseItemSelf(curPlayer, useItemIndex, tick)
|
|
#ʹÓÃÎïÆ·Çé¿ö»Ø°ü
|
__SendUseItemBackPack(curPlayer, curItemType, curItemID, useItemResult)
|
return
|
|
#// A3 23 ʹÓÃÎïÆ· #tagCMUseItems
|
#
|
#struct tagCMUseItemsSelect
|
#{
|
# DWORD SelectID; //Ñ¡ÔñÏîID
|
# WORD SelectCnt; //Ñ¡ÔñÊý
|
#};
|
#
|
#struct tagCMUseItems
|
#{
|
# tagHead Head;
|
# BYTE ItemIndex; //ÎïÆ·ÔÚ±³°üÖÐË÷Òý
|
# WORD UseCnt; //ʹÓøöÊý£¬0±íʾȫ²¿Ê¹ÓÃ
|
# DWORD ExData; //ʹÓÃÀ©Õ¹Öµ, ĬÈÏ0, Ñ¡ÔñÎïÆ·±¦Ïäʱ·¢ËÍÑ¡ÔñµÄÎïÆ·ID
|
# BYTE SelectCount; //Ö¸¶¨Ñ¡ÔñÏµ±ÅúÁ¿Ê¹Óõ¥¸öÏä×ÓÐèҪͬʱѡÖжàÖÖÑ¡ÏîʱʹÓøÃÖµ
|
# tagCMUseItemsSelect SelectList[SelectCount];
|
#};
|
def OnUseItems(index, packData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
itemIndex = packData.ItemIndex
|
useCnt = packData.UseCnt
|
exData = packData.ExData
|
selectDict = {}
|
if packData.SelectCount:
|
for selectInfo in packData.SelectList:
|
selectDict[selectInfo.SelectID] = selectInfo.SelectCnt
|
GameWorld.DebugLog("OnUseItems itemIndex=%s,useCnt=%s,exData=%s,selectDict=%s" % (itemIndex, useCnt, exData, selectDict), curPlayer.GetPlayerID())
|
if selectDict:
|
exData = selectDict
|
GameWorld.DebugLog(" ʹÓöàÏîÑ¡Ôñ£¬ÒÔ¶àѡΪ׼! exData=%s" % exData)
|
elif exData:
|
GameWorld.DebugLog(" ʹÓõ¥ÏîÑ¡Ôñ£¬¼æÈݾÉģʽ! exData=%s" % exData)
|
|
backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
curItem = backPack.GetAt(itemIndex)
|
|
if not ItemCommon.CheckItemCanUse(curItem):
|
GameWorld.DebugLog(" ÎïÆ·ÎÞ·¨Ê¹Óã¡")
|
return
|
|
if useCnt <= 0:
|
useCnt = curItem.GetCount()
|
GameWorld.DebugLog(" ûָ¶¨Ê¹ÓøöÊý£¬Ä¬ÈÏʹÓÃÈ«²¿=%s" % useCnt)
|
|
__DoLogic_PlayerUseItemSelf(curPlayer, itemIndex, tick, useCnt, exData)
|
|
return
|
|
#---------------------------------------------------------------------
|
## ʹÓÃÎïÆ·Çé¿ö»Ø°ü
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param useItemType ʹÓõÄÎïÆ·ÀàÐÍ
|
# @param useItemType ʹÓõÄÎïÆ·ID
|
# @param useItemResult ʹÓõÄÎïÆ·Çé¿ö
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def __SendUseItemBackPack(curPlayer, useItemType, useItemID, useItemResult):
|
|
#¿ÉÁ¬ÐøÊ¹ÓÃÎïÆ·ÅäÖà 0:[ÎïÆ·ÀàÐÍ]£¬1:[ÎïÆ·ID]
|
useItem_CanSeriesUse = ReadChConfig.GetEvalChConfig("UseItem_CanSeriesUse")
|
|
#---¿ÉÁ¬ÐøÊ¹ÓÃÎïÆ·Åжϣ¬»Ø°ü---
|
if useItemType in useItem_CanSeriesUse.get(0, []) or useItemID in useItem_CanSeriesUse.get(1, []):
|
# »Ø°ü¸£´üʹÓóɹ¦
|
if useItemResult:
|
curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitUseFuDai, ChConfig.Def_UseFuDai_Sucess)
|
# »Ø°ü¸£´üʹÓÃʧ°Ü
|
else:
|
curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitUseFuDai, ChConfig.Def_UseFuDai_Fail)
|
|
return
|
|
def SendUseItemGetItemResult(curPlayer, useItemID, useCount, getItemInfo, moneyType=0, moneyCount=0):
|
# ֪ͨ¿Í»§¶ËʹÓÃÎïÆ·½á¹û°ü
|
# @param getItemInfo: [{"ItemID":ÎïÆ·ID, "Count":¸öÊý, "IsBind":ÊÇ·ñ°ó¶¨, "IsSuite":ÊÇ·ñÌ××°»¯, "UserData":"×Ô¶¨ÒåÊôÐÔ×Ö·û´®"}, ...]
|
|
getItemInfo = json.dumps(getItemInfo, ensure_ascii=False)
|
getItemInfo = getItemInfo.replace(" ", "")
|
getItemPack = ChPyNetSendPack.tagMCNotifyUseItemGetItem()
|
getItemPack.Clear()
|
getItemPack.UseItemID = useItemID
|
getItemPack.UseCount = useCount
|
getItemPack.GetItemData = str(getItemInfo)
|
getItemPack.GetItemLen = len(getItemPack.GetItemData)
|
getItemPack.MoneyType = moneyType
|
getItemPack.MoneyCount = moneyCount
|
NetPackCommon.SendFakePack(curPlayer, getItemPack)
|
return
|
|
#---------------------------------------------------------------------
|
|
## ×¼±¸½áÊø
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param prepareState ×¼±¸×´Ì¬
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def OnPrepareEnd(curPlayer, prepareState):
|
if prepareState == IPY_GameWorld.pstCatching:
|
callFunc = GameWorld.GetExecFunc(UseItem, "Item_CallNPC.OnPrepareOK")
|
|
if not callFunc:
|
GameWorld.Log('###³ÌÐòÒì³£,ÎÞ·¨²éÕÒÎļþ Item_CallNPC.py"')
|
return
|
|
callFunc(curPlayer, GameWorld.GetGameWorld().GetTick())
|
return
|
return
|
|
#---------------------------------------------------------------------
|
#===============================================================================
|
# //07 33 ʹÓÃÎåÐоí#tagCUseWuXingJuan
|
# tagCUseWuXingJuan * GettagCUseWuXingJuan();
|
#
|
# class IPY_CUseWuXingJuan
|
# {
|
# public:
|
# //ÎïÆ·Index
|
# int GetItemIndex();
|
# //еÄÎåÐÐ
|
# int GetNewWuXing();
|
# };
|
#===============================================================================
|
## ʹÓÃÎåÐоíÖᣨ·â°ü²ÎÊý£©
|
# @param index Íæ¼ÒË÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None or False
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def UseWuXingJuan(index , tick):
|
return
|
|
## ¼ì²âÎïÆ·ÊÇ·ñÊÇÎåÐоíÖá
|
# @param curItem µÈ´ý¼ì²âµÄÎïÆ·
|
# @return ²¼¶ûÖµ
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
#===============================================================================
|
# def CheckWuXingJuan(curItem):
|
# if not ItemCommon.CheckItemCanUse(curItem):
|
# return False
|
#
|
# #Õâ¸öÎïÆ·²»ÊÇÎåÐÐת»»¾íÖá
|
# if curItem.GetEffectByIndex(0).GetEffectID() != ChConfig.Def_Effect_ItemWuXingJuan:
|
# return False
|
#
|
# return True
|
#===============================================================================
|
|
|
## ʹÓûسÇ
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @return None or True
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def UseTownPortal(curPlayer):
|
#¼ì²éÊÇ·ñÊǻسǾí
|
itemIndex = curPlayer.GetDictByKey(ChConfig.Def_Use_Item_303_Index)
|
curItem = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem).GetAt(itemIndex)
|
|
#ÎïÆ·²»´æÔÚ,²»ÊÇ»Ø³Ç¾í²»´¦Àí
|
if not ItemCommon.CheckItemCanUse(curItem) or curItem.GetItemTypeID() != 303:
|
#²»ÄÜ»ñµÃÎïÆ·IDÖ»ÄÜдËÀ£¬·ñÔòÍæ¼ÒÒÆ¶¯½«ÕÒ²»µ½ÎïÆ·£¬»òID²»Æ¥Åä
|
PlayerControl.NotifyCode(curPlayer, "B66BA2D6-0B3C-4177-B3FE66153B638DD0", [303, 303])
|
return
|
|
useCount = 1
|
itemID = curItem.GetItemTypeID()
|
guID = curItem.GetGUID()
|
|
dataDict = {"ItemID":itemID, "ItemCount":useCount, "IsBind":curItem.GetIsBind(),"ItemGUID":guID}
|
DataRecordPack.DR_DeleteItem(curPlayer, 'UseTownPortal', dataDict)
|
|
#ÎïÆ·Ê¹ÓüõÉÙ
|
if curItem.GetCount() > useCount:
|
ItemControler.SetItemCount(curItem, curItem.GetCount() - useCount,
|
curPlayer.GetID(), curPlayer.GetAccID(), curPlayer.GetPlayerName())
|
else:
|
curItem.Clear()
|
|
#PlayerControl.NotifyCode(curPlayer, "LostRes", [itemID, useCount])
|
playerControl = PlayerControl.PlayerControl(curPlayer)
|
#°ÑÈËÎïÉèÖûØÖØÉúµã
|
playerControl.SetToBornPlace()
|
|
return True
|
|
#===============================================================================
|
# 07 39 ʹÓÃÖ¸¶¨ÊýÁ¿µÄÎïÆ· tagCUseItemCount
|
# struct tagCUseItemCount
|
# {
|
# tagHead Head;
|
# BYTE Type; //ÎïÆ·ÀàÐÍ
|
# DWORD Count; //ÎïÆ·ÊýÁ¿
|
# }
|
#===============================================================================
|
|
## 07 39·â°ü ʹÓÃÖ¸¶¨ÊýÁ¿µÄÎïÆ·
|
# @param index Íæ¼ÒË÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return ÎÞ
|
# @remarks ºÍ¿Í»§¶ËÔ¼¶¨µÄÀàÐÍÀ´È¡µÃÖ¸¶¨ÎïÆ·£¬Ä¿Ç°ÓÃÓÚÀëÏß¹Ò»ú£¬¿ÛǬÀ¤Öé
|
def UseOfflineTime(index, tick):
|
return
|
|
|
#===============================================================================
|
# struct tagCPetUseItemByIndex
|
# {
|
# tagHead Head;
|
# BYTE PetIndex; // ³èÎïÔÚ³èÎïÀ¸µÄË÷Òý
|
# WORD ItemIndex;
|
# };
|
#===============================================================================
|
## 16 08·â°ü ʹÓóèÎïµÀ¾ß
|
# @param index Íæ¼ÒË÷Òý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return ÎÞÒâÒå
|
# @remarks
|
def UsePetItem(index, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
pack = IPY_GameWorld.IPY_CPetUseItemByIndex()
|
|
petID = pack.GetPetID()
|
itemIndex = pack.GetItemIndex()
|
|
#»ñµÃÎïÆ·
|
curItem = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem).GetAt(itemIndex)
|
|
if not CheckPlayerUseItemSelf(curPlayer, curItem, tick):
|
#´ËÎïÆ·²»¿ÉʹÓÃ
|
return
|
|
if curItem.GetType() != ChConfig.Def_ItemType_PetItem:
|
#²»ÊdzèÎïµÀ¾ß
|
return
|
|
# ³èÎïУÑé
|
rolePet = curPlayer.GetPetMgr().PetList_Find(petID)
|
|
if rolePet == None:
|
return
|
|
#»º´æÎïÆ·ÊôÐÔ
|
curItemEffectID = curItem.GetEffectByIndex(0).GetEffectID()
|
curItemTypeID = curItem.GetItemTypeID()
|
curItemCDType = curItem.GetCDType()
|
|
callFuncName = ""
|
|
# # Ò×Ë赤
|
# if curItemEffectID == ChConfig.Def_Effect_PetReSet:
|
# callFuncName = "Item_PetReSet.UsePetItem"
|
#
|
# # Ô컯µ¤
|
# elif curItemEffectID == ChConfig.Def_Effect_PetUpdateTalent:
|
# callFuncName = "Item_PetUpdateTalent.UsePetItem"
|
#
|
# # ÉñÆíÖ®Àá
|
# elif curItemEffectID == ChConfig.Def_Effect_PetRePoint:
|
# callFuncName = "Item_PetRePoint.UsePetItem"
|
#
|
# # ³èÎï±äÎïÆ·
|
# elif curItemEffectID == ChConfig.Def_Effect_PetEmptySoul:
|
# callFuncName = "Item_PetEmptySoul.UsePetItem"
|
#
|
# # ÖØÏ´¼¼ÄÜ
|
# elif curItemEffectID == ChConfig.Def_Effect_PetRewashSkill:
|
# callFuncName = "Item_PetRewashSkill.UsePetItem"
|
#
|
# # ÖØÏ´×ÊÖÊ
|
# elif curItemEffectID == ChConfig.Def_Effect_PetReSetTalentl:
|
# callFuncName = "Item_PetReSetTalentl.UsePetItem"
|
|
if callFuncName == '':
|
GameWorld.ErrLog('###ʹÓÃÎïÆ·Òì³£, ÎÞ·¨²éÕÒ %s Ч¹ûID'%(curItemEffectID))
|
return
|
|
callFunc = GameWorld.GetExecFunc(UseItem, callFuncName)
|
|
if not callFunc:
|
GameWorld.ErrLog('###ʹÓÃÎïÆ·Òì³£, ÎÞ·¨²éÕÒ %s Îļþ'%(callFuncName))
|
return
|
|
if not callFunc(curPlayer, rolePet, curItem):
|
#ʹÓÃÎïÆ·Ê§°Ü
|
return
|
|
#------------ʹÓÃÎïÆ·³É¹¦, Ö´ÐÐÏà¹Ø²Ù×÷
|
curPlayer.Sync_UseItem(curItemTypeID, itemIndex)
|
if curItemCDType:
|
curPlayer.SetItemCD(curItemCDType, tick)
|
return
|
|
#---------------------------------------------------------------------
|
|
def DoMapDropItem(curPlayer, itemList, npcID, dropPosX, dropPosY, isOnlySelfSee=True, isDropDisperse=True):
|
if not itemList:
|
return
|
if isDropDisperse:
|
dropItemList = []
|
for itemInfo in itemList:
|
if isinstance(itemInfo, list):
|
itemID, itemCount, isAuctionItem = itemInfo
|
# ÅÄÆ·²»²ð
|
if isAuctionItem:
|
dropItemList.append(itemInfo)
|
continue
|
for _ in xrange(itemCount):
|
dropItemList.append([itemID, 1, isAuctionItem])
|
else:
|
dropItemList.append(itemInfo)
|
else:
|
dropItemList = itemList
|
|
random.shuffle(dropItemList) # ´òÂÒ˳Ðò
|
index = 0
|
playerID = curPlayer.GetPlayerID()
|
gameMap = GameWorld.GetMap()
|
sightLevel = PlayerControl.GetMapRealmDifficulty(curPlayer)
|
for posX, posY in ChConfig.Def_DropItemAreaMatrix:
|
resultX = dropPosX + posX
|
resultY = dropPosY + posY
|
|
if not gameMap.CanMove(resultX, resultY):
|
#Íæ¼Ò²»¿ÉÒÆ¶¯Õâ¸öµã
|
continue
|
|
if index > len(dropItemList) - 1:
|
break
|
|
curItem = dropItemList[index]
|
index += 1
|
if isinstance(curItem, list):
|
itemID, itemCount, isAuctionItem = curItem
|
curItem = ItemControler.GetOutPutItemObj(itemID, itemCount, isAuctionItem, curPlayer=curPlayer)
|
|
if not curItem:
|
continue
|
|
AddMapDropItem(resultX, resultY, curItem, ownerInfo=[ChConfig.Def_NPCHurtTypePlayer, playerID],
|
dropNPCID=npcID, isOnlySelfSee=isOnlySelfSee, sightLevel=sightLevel)
|
return
|
|
## ÔÚµØÉÏÌí¼ÓÎïÆ·(ͳһ½Ó¿Ú)
|
# @param itemPosX λÖÃx
|
# @param itemPosY λÖÃy
|
# @param curItem µ±Ç°ÎïÆ·
|
# @param effIndex ÒªÏÔʾµÄÌØÐ§Ë÷Òý
|
# @param ownerInfo µôÂä¹éÊôÐÅÏ¢[¹éÊôÀàÐÍ, ¹éÊôID, [ÌØÊâ¹éÊôÍæ¼ÒIDÁбí]]
|
# @return ·µ»ØÖµÎÞÒâÒå
|
def AddMapDropItem(itemPosX, itemPosY, curItem, effIndex=0, ownerInfo=[], dropNPCID=0, isOnlySelfSee=False, sightLevel=0):
|
itemDataStr = GetMapDropItemDataStr(curItem, effIndex, ownerInfo, dropNPCID, isOnlySelfSee)
|
|
curMapItem = GameWorld.GetMapItemManager().AddDropItem(itemPosX, itemPosY, curItem,
|
len(itemDataStr), itemDataStr)
|
if ownerInfo:
|
ownerType, ownerID = ownerInfo[:2]
|
curMapItem.SetOwnerType(ownerType)
|
curMapItem.SetOwnerID(ownerID)
|
|
if sightLevel > 0:
|
curMapItem.SetSightLevel(sightLevel)
|
|
if dropNPCID:
|
itemNoteDict = ItemCommon.GetItemNoteDict(curItem, curItem.GetCount())
|
GameWorld.Log("AddMapDropItem mapItemID=%s,ownerType=%s,ownerID=%s,mapItemDataStr=%s,itemNoteDict=%s"
|
% (curMapItem.GetID(), curMapItem.GetOwnerType(), curMapItem.GetOwnerID(), itemDataStr, itemNoteDict))
|
return curMapItem
|
|
def GetMapDropItemDataStr(curItem, effIndex=0, ownerInfo=[], dropNPCID=0, isOnlySelfSee=False):
|
itemData = {}
|
|
if ItemCommon.CheckItemIsEquip(curItem):
|
# Ìí¼Ó×°±¸ÊôÐÔÏÔʾ
|
itemData.update(GetMapEquipInfo(curItem))
|
|
elif curItem.GetCount() > 1:
|
# ½ðÇ®ÊýÁ¿ÏÔʾ
|
itemData[ShareDefine.Def_MapItemInfo_Count] = curItem.GetCount()
|
|
if effIndex > 0:
|
itemData[ShareDefine.Def_MapItemInfo_Effect] = effIndex
|
|
if ownerInfo and len(ownerInfo) > 2 and ownerInfo[2]:
|
itemData[ShareDefine.Def_MapItemInfo_SpecOwner] = ownerInfo[2]
|
#GameWorld.DebugLog("µôÂäÎïÆ·ÌØÊâ¹éÊô: %s" % ownerInfo[2])
|
|
if dropNPCID:
|
itemData[ShareDefine.Def_MapItemInfo_NPCID] = dropNPCID
|
|
if isOnlySelfSee:
|
itemData[ShareDefine.Def_MapItemInfo_OnlySelfSee] = 1
|
|
return json.dumps(itemData, ensure_ascii=False)
|
|
|
## »ñµÃµôÂä×°±¸µÄÏÔʾÐÅÏ¢
|
# @param curItem µ±Ç°ÎïÆ·
|
# @return ·µ»ØÖµÎÞÒâÒå
|
def GetMapEquipInfo(curItem):
|
infoDict = {}
|
|
# Ì××°
|
if curItem.GetIsSuite():
|
infoDict[ShareDefine.Def_MapItemInfo_IsSuite] = 1
|
|
return infoDict
|
|
# ÌØ±ðÉ趨:׿ԽÎïÆ·±Ø´øÎäÆ÷¼¼ÄÜÔöǿЧ¹û£¬Ê¹ÓÃÕßÇëÌØ±ð×¢Òâ
|
## ×°±¸¶¯Ì¬ÊôÐÔ£¬Ö»ÓÃÓÚδÉèÖÃÊôÐÔµÄsingleItem£¬roleItemʹÓöà´Î·¢±³°üˢаü
|
# @param curItem Íæ¼ÒʵÀý
|
# @param equipData
|
# @return
|
def EquipAddAdditionEx(curItem, equipData):
|
# °ó¶¨
|
#if equipData.isBind:
|
# ItemControler.SetItemIsBind(curItem, equipData.isBind)
|
|
if not ItemCommon.CheckItemIsEquip(curItem):
|
return
|
|
#===========================================================================
|
# # Ç¿»¯µÈ¼¶
|
# if equipData.starLV:
|
# curItem.SetItemStarLV(equipData.starLV)
|
# # ´ò¿×
|
# if 0 < equipData.holeCnt <= curItem.GetMaxHoleCount():
|
# curItem.SetCanPlaceStoneCount(equipData.holeCnt)
|
#
|
# # ¸øÏâǶ±¦Ê¯
|
# for i, stoneID in enumerate(equipData.stoneData):
|
# if i > equipData.holeCnt - 1:
|
# break
|
#
|
# if stoneID <= 0:
|
# continue
|
#
|
# curItem.SetStone(i, stoneID)
|
#===========================================================================
|
|
# Ì××°
|
#if equipData.isSuite:
|
# curItem.SetIsSuite(equipData.isSuite)
|
#if equipData.suiteLV:
|
# curItem.SetUserAttr(ShareDefine.Def_IudetSuiteLV, equipData.suiteLV)
|
# ÎïÆ·À´Ô´
|
if equipData.source:
|
curItem.SetUserAttr(ShareDefine.Def_IudetSource, equipData.source)
|
|
# ´«ÆæÊôÐÔ
|
if equipData.legendAttrIDList and equipData.legendAttrValueList:
|
curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrID)
|
curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrValue)
|
for i in xrange(len(equipData.legendAttrIDList)):
|
curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrID, equipData.legendAttrIDList[i])
|
curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrValue, equipData.legendAttrValueList[i])
|
# ´«ÆæÊôÐÔ - Éñ
|
if equipData.legendAttrIDListShen and equipData.legendAttrValueListShen:
|
curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrIDShen)
|
curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrValueShen)
|
for i in xrange(len(equipData.legendAttrIDListShen)):
|
curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrIDShen, equipData.legendAttrIDListShen[i])
|
curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrValueShen, equipData.legendAttrValueListShen[i])
|
# ´«ÆæÊôÐÔ - ÏÉ
|
if equipData.legendAttrIDListXian and equipData.legendAttrValueListXian:
|
curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrIDXian)
|
curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrValueXian)
|
for i in xrange(len(equipData.legendAttrIDListXian)):
|
curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrIDXian, equipData.legendAttrIDListXian[i])
|
curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrValueXian, equipData.legendAttrValueListXian[i])
|
# ´«ÆæÊôÐÔ - ¼«
|
if equipData.legendAttrIDListJi and equipData.legendAttrValueListJi:
|
curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrIDJi)
|
curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrValueJi)
|
for i in xrange(len(equipData.legendAttrIDListJi)):
|
curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrIDJi, equipData.legendAttrIDListJi[i])
|
curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrValueJi, equipData.legendAttrValueListJi[i])
|
|
ItemCommon.MakeEquipGS(curItem)
|
return
|
|
|
## ÅжÏ×°±¸ÊÇ·ñÊǿɼÓǿװ±¸
|
# @param curItem ÎïÆ·ÊµÀý
|
# @return None
|
def CheckItemCanPlus(curItem):
|
|
# ´ÓÇ¿»¯±íÖлñµÃÊý¾Ý
|
if curItem.GetType() in ReadChConfig.GetEvalChConfig("EquipPlus_EquipType"):
|
return True
|
|
return False
|
|
(
|
Def_Discount_ItemType, #ÕÛ¿Û¿¨ÎïÆ·ÀàÐÍ
|
Def_SelectMore_ItemType #¶àÑ¡Àñ°üÎïÆ·ÀàÐÍ
|
) = range(2)
|
|
#// A3 07 ¹ýÆÚÎïÆ·Ðø·Ñ #tagCMItemRenew
|
#
|
#struct tagCMItemRenew
|
#
|
#{
|
# tagHead Head;
|
# WORD ItemIndex; //ÎïÆ·ÔÚ±³°üÖÐË÷Òý
|
# BYTE MoneyType; //½ðÇ®ÀàÐÍ
|
#};
|
def OnItemRenew(index, clientData, tick):
|
## ¹ýÆÚÎïÆ·Ðø·Ñ
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
timeOutItemIndex = clientData.ItemIndex
|
moneyType = clientData.MoneyType #1 ÏÉÓñ 2 °óÓñ
|
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
timeOutItem = itemPack.GetAt(timeOutItemIndex)
|
if not ItemCommon.CheckItemCanUse(timeOutItem):
|
return
|
timeOutItemID =timeOutItem.GetItemTypeID()
|
itemTimeOutDict = IpyGameDataPY.GetFuncEvalCfg('ItemTimeOut')
|
if str(timeOutItemID) not in itemTimeOutDict:
|
GameWorld.DebugLog('ItemTimeOut ûÓиÃÎïÆ·Ðø·ÑÅäÖà timeOutItemID=%s'%timeOutItemID)
|
return
|
if ItemCommon.CheckItemCanUseByExpireTime(timeOutItem):
|
GameWorld.DebugLog('¹ýÆÚÎïÆ·Ðø·Ñ ¸ÃÎïÆ·Î´¹ýÆÚ timeOutItemID=%s'%timeOutItemID)
|
return
|
|
renewInfo = itemTimeOutDict[str(timeOutItemID)]
|
changeItemID = renewInfo[0]
|
if moneyType == 1:
|
needMoney = renewInfo[1]
|
elif moneyType == 2:
|
needMoney = renewInfo[2]
|
else:
|
return
|
if not needMoney:
|
return
|
#¿ÛÇ®
|
infoDict = {ChConfig.Def_Cost_Reason_SonKey:timeOutItemID}
|
if not PlayerControl.PayMoney(curPlayer, moneyType, needMoney, ChConfig.Def_Cost_BuyStoreItem, infoDict):
|
return
|
#ÏÈɾÔÎïÆ·ÔÙ¸øÐÂÎïÆ·
|
ItemCommon.DelItem(curPlayer, timeOutItem, 1, False, "RenewItem")
|
ItemControler.GivePlayerItem(curPlayer, changeItemID, 1, 0, [IPY_GameWorld.rptItem])
|
PlayerControl.NotifyCode(curPlayer, 'Guardian_ContinuePay')
|
return
|
|
#// A3 08 ÎïÆ·¹ýÆÚ #tagCMItemTimeout
|
#
|
#struct tagCMItemTimeout
|
#
|
#{
|
# tagHead Head;
|
# BYTE PackType; //±³°üÀàÐÍ
|
# BYTE ItemIndex; //ÎïÆ·ÔÚ±³°üÖÐË÷Òý
|
# BYTE IsAll; //ÊÇ·ñ´¦ÀíËùÓйýÆÚÎïÆ·
|
#};
|
def OnItemTimeout(index, clientData, tick):
|
packType = clientData.PackType
|
itemIndex = clientData.ItemIndex
|
isAll = clientData.IsAll
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
backPack = curPlayer.GetItemManager().GetPack(packType)
|
if not backPack:
|
return
|
|
if isAll:
|
# 20201223 Ö÷¸ÉÈ¡ÏûÅÄÆ·ÓÐЧʱ³¤É趨
|
# # Ŀǰ½öÕë¶ÔÅÄÆ·
|
# GameWorld.DebugLog("=== Ò»¼ü´¦ÀíËùÓйýÆÚÎïÆ· ===")
|
# curTime = int(time.time())
|
# auctionItemTimeout = IpyGameDataPY.GetFuncCfg("AuctionItem", 1)
|
# for i in xrange(backPack.GetCount()):
|
# curItem = backPack.GetAt(i)
|
# if not ItemCommon.CheckItemCanUse(curItem):
|
# continue
|
# if not ItemControler.GetIsAuctionItem(curItem):
|
# continue
|
# auctionItemCreateTime = curItem.GetUserAttr(ShareDefine.Def_IudetAuctionItemCreateTime)
|
# if not auctionItemCreateTime:
|
# continue
|
# if curTime - auctionItemCreateTime < auctionItemTimeout * 3600:
|
# # δ¹ýÆÚ
|
# continue
|
# GameWorld.DebugLog("Íæ¼ÒÅÄÆ·¹ýÆÚ: i=%s,itemID=%s" % (i, curItem.GetItemTypeID()), curPlayer.GetPlayerID())
|
# ItemControler.SetIsAuctionItem(curItem, False, curPlayer)
|
#
|
# # ÕûÀí±³°ü
|
# ItemControler.ResetItem(curPlayer, packType, 0, 0, tick)
|
return
|
|
curItem = backPack.GetAt(itemIndex)
|
if not ItemCommon.CheckItemCanUse(curItem):
|
GameWorld.DebugLog("ÎïÆ·²»´æÔÚ!")
|
return
|
|
# ÅÄÆ·
|
if ItemControler.GetIsAuctionItem(curItem):
|
GameWorld.DebugLog("Íæ¼ÒÅÄÆ·¹ýÆÚ: itemID=%s" % (curItem.GetItemTypeID()), curPlayer.GetPlayerID())
|
ItemControler.SetIsAuctionItem(curItem, False, curPlayer)
|
return
|
|
|
return
|