From a075f7841fb2d0a3b32bf10c8bc2df5bf02d6acb Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期日, 14 十二月 2025 14:24:28 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(贾诩所有技能;5022效果支持配置buff额外属性计算方式;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py | 160 ++++++++++++++++++++++-------------------------------
1 files changed, 66 insertions(+), 94 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
index 57071d1..0bef096 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -25,22 +25,13 @@
import traceback
import random
import ReadChConfig
-import ChItem
-import PlayerSuccess
-import PlayerFamily
+import PlayerActivity
import ChPyNetSendPack
import NetPackCommon
-import Operate_EquipStone
-import PlayerFairyCeremony
-import PlayerActBossTrial
-import PlayerMagicWeapon
import PlayerXiangong
import IpyGameDataPY
-import DataRecordPack
import PlayerGubao
import PyGameData
-import PlayerVip
-import ChEquip
import PlayerHero
import math
@@ -188,24 +179,6 @@
return item
return None
-
-## 检查是否可以换马匹
-# @param curPlayer 当前玩家
-# @return None or True
-# @remarks 函数详细说明.
-def CheckCanEquipHorse(curPlayer):
- if curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvHorse :
- #DJ_Res_Horses_AlreadyEquip 对不起,您处于骑马状态中,操作无效
- PlayerControl.NotifyCode(curPlayer, "DJ_Res_Horses_AlreadyEquip")
- return
-
- horsePack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptHorse)
- if not GetPackIsEmpty(horsePack):
- #Horses_Bag_NoRoom 对不起,您的马匹背包中有物品,操作无效!
- PlayerControl.NotifyCode(curPlayer, "Horses_Bag_NoRoom")
- return
-
- return True
#===============================================================================
# #将物品放入增值栏的一个空位置中,如果失败,替换第一个位置
@@ -510,6 +483,12 @@
itemType = curItem.GetType()
itemID = curItem.GetItemTypeID()
+
+ if itemType in IpyGameDataPY.GetFuncEvalCfg("ItemRecordRule", 4) \
+ or itemID in IpyGameDataPY.GetFuncEvalCfg("ItemRecordRule", 5):
+ GameWorld.DebugLog("不需要记录的物品类型或ID! itemType=%s,itemID=%s" % (itemType, itemID))
+ return False
+
itemTypeMinColorDict = IpyGameDataPY.GetFuncEvalCfg("ItemRecordRule", 1)
if itemType in itemTypeMinColorDict:
minColor = itemTypeMinColorDict[itemType]
@@ -523,11 +502,6 @@
or itemID in IpyGameDataPY.GetFuncEvalCfg("ItemRecordRule", 3):
#GameWorld.DebugLog("需要记录的物品类型或ID! itemType=%s,itemID=%s" % (itemType, itemID))
return True
-
- if itemType in IpyGameDataPY.GetFuncEvalCfg("ItemRecordRule", 4) \
- or itemID in IpyGameDataPY.GetFuncEvalCfg("ItemRecordRule", 5):
- #GameWorld.DebugLog("不需要记录的物品类型或ID! itemType=%s,itemID=%s" % (itemType, itemID))
- return False
#if itemType == ChConfig.Def_ItemType_Rune:
# return IsRuneItemNeedRecord(curItem, curItem.GetUserAttr(ShareDefine.Def_IudetRuneLV))
@@ -833,9 +807,7 @@
if packIndex == ShareDefine.rptRune:
runeSource = tagItem.GetUserAttr(ShareDefine.Def_IudetRuneSource) or 1
setItemKeyData = GetRuneItemKeyData(tagItem.GetItemTypeID(), tagItem.GetUserAttr(ShareDefine.Def_IudetRuneLV), source=runeSource)
- elif packIndex == ShareDefine.rptGatherSoul:
- setItemKeyData = GetGatherSoulItemKeyData(tagItem.GetItemTypeID(), tagItem.GetUserAttr(ShareDefine.Def_IudetGatherSoulLV))
-
+
refreshPlaceList = []
for place in xrange(ItemCommon.GetVPackCnt(packIndex)):
itemKeyData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_VPackItem % (packIndex, place))
@@ -883,12 +855,8 @@
return True
if itemID not in ChConfig.Def_TransformItemIDList:
return False
- if itemID == ChConfig.Def_ItemID_FamilyContribution:
- PlayerFamily.AddPlayerFamilyActiveValue(curPlayer, itemCount, True, ShareDefine.Def_AddFAVReason_UseItem, True)
- elif itemID == ChConfig.Def_ItemID_SilverMoney:
+ if itemID == ChConfig.Def_ItemID_SilverMoney:
PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, itemCount)
- elif itemID == ChConfig.Def_ItemID_FamilyActive:
- PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_FamilyActivity, itemCount)
elif itemID == ChConfig.Def_ItemID_SP:
PlayerControl.PlayerAddZhenQi(curPlayer, itemCount)
elif itemID == ChConfig.Def_ItemID_GoldPaper:
@@ -912,8 +880,6 @@
PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, itemCount, moneyEventName, addDict)
elif itemID == ChConfig.Def_ItemID_FuncSysPrivilege:
PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_FuncSysPrivilege, itemCount)
- elif itemID == ChConfig.Def_ItemID_FCPartyPoint:
- PlayerFairyCeremony.AddFCPartyPoint(curPlayer, itemCount)
elif itemID == ChConfig.Def_ItemID_BTGMPoint:
PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_BTGMPoint, itemCount)
elif itemID == ChConfig.Def_ItemID_GuShenMoney:
@@ -922,8 +888,6 @@
PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_GongdePoint, itemCount)
elif itemID == ChConfig.Def_ItemID_FamilyFlagWarPoint:
PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_FamilyFlagWarPoint, itemCount)
- elif itemID == ChConfig.Def_ItemID_SuccessScore:
- PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_SuccessSocre, itemCount, moneyEventName, addDict)
return True
def __CrossServerPutInItem(self, packIndex, tagItem, event=["", False, {}]):
@@ -936,6 +900,18 @@
itemData = [tagItem.GetItemTypeID(), tagItem.GetCount(), tagItem.GetIsBind(), tagItem.GetUserData()]
itemMsg = {"PlayerID":curPlayer.GetPlayerID(), "ItemData":itemData, "PackIndex":packIndex, "Event":event}
GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_PutInItem, itemMsg, [serverGroupID])
+ return
+
+ def __autoUseByEffectID(self, curPlayer, tagItem, itemEff, itemID, itemCount):
+ effectID = itemEff.GetEffectID()
+
+ # 物品碎片
+ if effectID == ChConfig.Def_Effect_ItemCount:
+ SetItemCountByID(curPlayer, itemID, GetItemCountByID(curPlayer, itemID) + itemCount)
+ # 活跃度
+ elif effectID == ChConfig.Def_Effect_AddActivity:
+ PlayerActivity.DoAddActivity(curPlayer, itemCount)
+
return
## 放入物品
@@ -971,23 +947,16 @@
isNeedRecord = False
itemID = tagItem.GetItemTypeID()
#激活成就的道具
- if tagItem.GetType() in [ChConfig.Def_ItemType_ActiveMWItem, ChConfig.Def_ItemType_ActiveMWItem2]:
- PlayerMagicWeapon.DoActiveMW(curPlayer, tagItem.GetEffectByIndex(0).GetEffectValue(0))
- tagItem.Clear()
- return True
+ #if tagItem.GetType() in [ChConfig.Def_ItemType_ActiveMWItem, ChConfig.Def_ItemType_ActiveMWItem2]:
+ # PlayerMagicWeapon.DoActiveMW(curPlayer, tagItem.GetEffectByIndex(0).GetEffectValue(0))
+ # tagItem.Clear()
+ # return True
itemEff = tagItem.GetEffectByIndex(0)
- #物品碎片
- if itemEff.GetEffectID() == ChConfig.Def_Effect_ItemCount:
- SetItemCountByID(curPlayer, itemID, GetItemCountByID(curPlayer, itemID) + tagItemCount)
+ if itemEff.GetEffectID() in ChConfig.AutoUseItemEffectIDList:
+ self.__autoUseByEffectID(curPlayer, tagItem, itemEff, itemID, tagItemCount)
tagItem.Clear()
return True
- #古宝碎片
- if itemEff.GetEffectID() == ChConfig.Def_Effect_GubaoPiece:
- gubaoID = itemEff.GetEffectValue(0)
- if gubaoID:
- PlayerGubao.AddGubaoPiece(curPlayer, gubaoID, tagItemCount, itemID)
- tagItem.Clear()
- return True
+
#气运
if itemEff.GetEffectID() == ChConfig.Def_Effect_TiandaoQiyun:
isAutoUse = itemEff.GetEffectValue(1)
@@ -996,16 +965,6 @@
PlayerXiangong.AddTiandaoQiyun(curPlayer, addQiyun, {"ItemID":itemID, "ItemCount":tagItemCount, "isAutoUse":1})
tagItem.Clear()
return True
- #直升VIP
- if itemEff.GetEffectID() == ChConfig.Def_Effect_VIPLVCard:
- isAutoUse = itemEff.GetEffectValue(1)
- if isAutoUse:
- tagVIPLV = itemEff.GetEffectValue(0)
- isOK, _ = PlayerVip.UpgradeVIPLV(curPlayer, tagVIPLV)
- if isOK:
- #GameWorld.DebugLog("直升VIP默认使用")
- tagItem.Clear()
- return True
#增加副本次数
if itemEff.GetEffectID() == ChConfig.Def_Effect_AddFBCnt:
isAutoUse = itemEff.GetEffectValue(1)
@@ -1016,11 +975,7 @@
#GameWorld.DebugLog("增加副本次数默认使用! mapID=%s" % mapID)
tagItem.Clear()
return True
- #活动道具自动转化
- if PlayerActBossTrial.CheckActItemAutoTransform(curPlayer, tagItem, itemID, tagItemCount):
- tagItem.Clear()
- return True
-
+
if itemID in ChConfig.Def_TransformItemIDList or tagItem.GetType() == ChConfig.Def_ItemType_AutoUseMoney:
# 直接转化为对应货币的物品仅在放入背包时直接转化,否则还是以真实物品的形式存在,但堆叠上限需要做特殊处理
if packIndex == IPY_GameWorld.rptItem:
@@ -1037,6 +992,9 @@
# isNeedRecord = True # 拍品要记录
else:
maxPackCount = curItemData.GetPackCount()
+
+ if packIndex == IPY_GameWorld.rptIdentify:
+ defaultPile = False # 掉落背包默认不判断堆叠
# 虚拟背包, 默认不做叠加
if packIndex in ShareDefine.Def_VPack_TypeList:
@@ -1251,14 +1209,6 @@
def GetRuneItemIsLock(keyData): return keyData / 1000000000
def GetRuneItemSource(keyData): return keyData % 1000000000 / 100000000
def IsRuneItemNeedRecord(curItem, plusLV):
- return plusLV > 0 or curItem.GetItemColor() >= ChConfig.Def_Quality_Orange
-
-# 聚魂物品存储字典数值数据结构: 前5位为物品ID, 6~8位为强化等级
-def GetGatherSoulItemKeyData(itemID, GatherSoulLV):
- return min(GatherSoulLV, 999) * 100000 + itemID
-def GetGatherSoulItemID(keyData): return keyData % 100000
-def GetGatherSoulItemPlusLV(keyData): return keyData % 100000000 / 100000
-def IsGatherSoulItemNeedRecord(curItem, plusLV):
return plusLV > 0 or curItem.GetItemColor() >= ChConfig.Def_Quality_Orange
def SetVPackItemKeyData(curPlayer, packIndex, place, keyData, isSync=True):
@@ -2055,11 +2005,11 @@
return False
if isAuctionItem:
- ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)
- if not ipyData:
- GameWorld.ErrLog("非拍卖物品,默认转为非拍品! itemID=%s,itemCount=%s,isAuctionItem=%s"
- % (itemID, itemCount, isAuctionItem), curPlayer.GetPlayerID())
- isAuctionItem = 0
+ #ipyData = None #IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)
+ #if not ipyData:
+ # GameWorld.ErrLog("非拍卖物品,默认转为非拍品! itemID=%s,itemCount=%s,isAuctionItem=%s"
+ # % (itemID, itemCount, isAuctionItem), curPlayer.GetPlayerID())
+ isAuctionItem = 0
defaultPack = IPY_GameWorld.rptItem if not packIndexList else packIndexList[0]
packIndex = ChConfig.GetItemPackType(curItemData, defaultPack)
@@ -2174,11 +2124,32 @@
def GetItemCountByID(curPlayer, itemID):
return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemCount % itemID)
def SetItemCountByID(curPlayer, itemID, itemCount, isSync=True):
+ befCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemCount % itemID)
itemCount = max(0, min(itemCount, ChConfig.Def_UpperLimit_DWord))
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ItemCount % itemID, itemCount)
+
+ # 检查碎片溢出自动转化,数量增加时才检查
+ if itemCount > befCount:
+ #GameWorld.DebugLog("碎片数量增加,检查溢出! itemID=%s,itemCount=%s,befCount=%s" % (itemID, itemCount, befCount))
+ if PlayerGubao.AutoTransGubaoPiece(curPlayer, itemID):
+ PyGameData.g_transItemSign = 1
+
if isSync:
Sync_AutoItemCount(curPlayer, [itemID])
return itemCount
+def CheckItemEnoughByID(curPlayer, itemID, needCount):
+ itemCount = GetItemCountByID(curPlayer, itemID)
+ if itemCount < needCount:
+ GameWorld.DebugLog("物品碎片不足! itemID=%s,itemCount=%s < %s" % (itemID, itemCount, needCount))
+ return False
+ return True
+def DelItemCountByID(curPlayer, itemID, delCount, isSync=True):
+ itemCount = GetItemCountByID(curPlayer, itemID)
+ if itemCount < delCount:
+ GameWorld.DebugLog("扣除物品碎片不足! itemID=%s,itemCount=%s < %s" % (itemID, itemCount, delCount))
+ return False
+ SetItemCountByID(curPlayer, itemID, itemCount - delCount, isSync)
+ return True
## 设置物品数量
# @param item 物品实例
@@ -2221,12 +2192,8 @@
if itemData.GetItemTypeID() in ChConfig.Def_TransformItemIDList or itemData.GetType() == ChConfig.Def_ItemType_AutoUseMoney:
return True
itemEff = itemData.GetEffectByIndex(0)
- if itemEff.GetEffectID() == ChConfig.Def_Effect_ItemCount:
+ if itemEff.GetEffectID() in ChConfig.AutoUseItemEffectIDList:
return True
- if itemEff.GetEffectID() == ChConfig.Def_Effect_GubaoPiece:
- gubaoID = itemEff.GetEffectValue(0)
- if gubaoID:
- return True
return False
def GetOutPutItemObj(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, setAttrDict=None):
@@ -2356,7 +2323,11 @@
def CheckPackSpaceEnough(curPlayer, itemList, isNotify=True):
## 检查玩家对应背包是否足够放入物品
needPackSpaceDict = {}
- for itemID, itemCnt, isAuctionItem in itemList:
+ for itemInfo in itemList:
+ if not itemInfo:
+ continue
+ itemID, itemCnt = itemInfo[:2]
+ isAuctionItem = itemInfo[2] if len(itemInfo) > 2 else 0
curItem = GameWorld.GetGameData().GetItemByTypeID(itemID)
if not curItem:
return False
@@ -2445,7 +2416,8 @@
continue
item = ChPyNetSendPack.tagMCGiveAwardItem()
item.ItemID = itemID
- item.Count = itemCount
+ item.Count = itemCount % ChConfig.Def_PerPointValue
+ item.CountEx = itemCount / ChConfig.Def_PerPointValue
item.IsBind = isBind
clientPack.ItemList.append(item)
clientPack.ItemLen = len(clientPack.ItemList)
--
Gitblit v1.8.0