From 5a3bb2e53454800a55bca0d911050e8dd9a69c27 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 13 三月 2026 10:45:08 +0800
Subject: [PATCH] 556 【付费功能】时装商店-服务端
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py | 237 +++++++++++++++++-----------------------------------------
1 files changed, 70 insertions(+), 167 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 ed41b74..54a1cc8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -25,18 +25,14 @@
import traceback
import random
import ReadChConfig
-import ChItem
-import PlayerSuccess
-import PlayerFamily
+import PlayerActivity
import ChPyNetSendPack
import NetPackCommon
-import PlayerXiangong
import IpyGameDataPY
-import DataRecordPack
import PlayerGubao
import PyGameData
-import ChEquip
import PlayerHero
+import PlayerMail
import math
import time
@@ -183,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
#===============================================================================
# #将物品放入增值栏的一个空位置中,如果失败,替换第一个位置
@@ -505,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]
@@ -518,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))
@@ -876,41 +855,6 @@
return True
if itemID not in ChConfig.Def_TransformItemIDList:
return False
- if itemID == ChConfig.Def_ItemID_SilverMoney:
- PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, itemCount)
- elif itemID == ChConfig.Def_ItemID_SP:
- PlayerControl.PlayerAddZhenQi(curPlayer, itemCount)
- elif itemID == ChConfig.Def_ItemID_GoldPaper:
- PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, itemCount, moneyEventName, addDict)
- elif itemID == ChConfig.Def_ItemID_RealmPoint:
- PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint, itemCount)
- elif itemID == ChConfig.Def_ItemID_BossReborn:
- msgStr = str(itemCount)
- GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'AddBossRebornPoint', msgStr, len(msgStr))
- elif itemID == ChConfig.Def_ItemID_Ysog:
- PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_Ysog, itemCount)
- elif itemID == ChConfig.Def_ItemID_SoulDust:
- PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_SoulDust, itemCount)
- elif itemID == ChConfig.Def_ItemID_SoulSplinters:
- PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_SoulSplinters, itemCount)
- elif itemID == ChConfig.Def_ItemID_SoulCore:
- PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_SoulCore, itemCount)
- elif itemID == ChConfig.Def_ItemID_Honor:
- PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_Honor, itemCount)
- elif itemID == ChConfig.Def_ItemID_GoldMoney:
- 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_BTGMPoint:
- PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_BTGMPoint, itemCount)
- elif itemID == ChConfig.Def_ItemID_GuShenMoney:
- PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_GuShenMoney, itemCount)
- elif itemID == ChConfig.Def_ItemID_GongdePoint:
- 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, {}]):
@@ -923,6 +867,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
## 放入物品
@@ -963,26 +919,15 @@
# 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)
- if isAutoUse:
- addQiyun = itemEff.GetEffectValue(0) * tagItemCount
- PlayerXiangong.AddTiandaoQiyun(curPlayer, addQiyun, {"ItemID":itemID, "ItemCount":tagItemCount, "isAutoUse":1})
- tagItem.Clear()
- return True
+
+ if PlayerHero.AutoChangeToSkinPoint(curPlayer, tagItem):
+ tagItem.Clear()
+ return True
+
#增加副本次数
if itemEff.GetEffectID() == ChConfig.Def_Effect_AddFBCnt:
isAutoUse = itemEff.GetEffectValue(1)
@@ -1029,7 +974,7 @@
#itemFactory = GameWorld.GetItemFactory()
#isBind = tagItem.GetIsBind()
# 目前暂只记录放入背包的
- if not isNeedRecord and packIndex in [IPY_GameWorld.rptItem, ShareDefine.rptTreasure, ShareDefine.rptRune, ShareDefine.rptGatherSoul, ShareDefine.rptDogzItem]:
+ if not isNeedRecord and packIndex in ShareDefine.NeedRecordRPType:
isNeedRecord = ItemNeedRecord(tagItem) or isForceEvent
putResult = False
@@ -1721,74 +1666,9 @@
return
def ResetHeroPack(curPlayer, curPack, beingIndex, endIndex):
- itemList = []
- for i in range(beingIndex, endIndex + 1):
- curRoleItem = curPack.GetAt(i)
- if curRoleItem.IsEmpty():
- continue
- curItem = curRoleItem.GetItem()
- itemList.append(curItem)
- itemList.sort(__CmpHeroPack)
-
- curPack.WipePack(beingIndex, endIndex)
- putPlace = beingIndex
- for item in itemList:
- curPack.GetAt(putPlace).AssignItem(item, False)
- putPlace += 1
-
+ ## 前端自行排序
return
-def __CmpHeroPack(item1, item2):
- '''排序规则:上阵武将排前,未上阵武将排后,再各自按照以下规则排序
- 武将等级>突破等级>武将星级>武将品质>武将ID
- '''
-
- posNum1, posNum2 = 0, 0
- for lpIndex in range(item1.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)):
- lineupValue = item1.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
- lineupID, _, posNum = PlayerHero.GetLineupValue(lineupValue)
- if lineupID != ShareDefine.Lineup_Main:
- continue
- posNum1 = posNum
- break
-
- for lpIndex in range(item2.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)):
- lineupValue = item2.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
- lineupID, _, posNum = PlayerHero.GetLineupValue(lineupValue)
- if lineupID != ShareDefine.Lineup_Main:
- continue
- posNum2 = posNum
- break
-
- if (posNum1 and posNum2) or (not posNum1 and not posNum2):
- lv1 = item1.GetUserAttr(ShareDefine.Def_IudetHeroLV)
- lv2 = item2.GetUserAttr(ShareDefine.Def_IudetHeroLV)
- if lv1 == lv2:
- bLV1 = item1.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
- bLV2 = item2.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
- if bLV1 == bLV2:
- star1 = item1.GetUserAttr(ShareDefine.Def_IudetHeroStar)
- star2 = item2.GetUserAttr(ShareDefine.Def_IudetHeroStar)
- if star1 == star2:
- heroID1 = item1.GetItemTypeID()
- heroID2 = item2.GetItemTypeID()
- ipyData1 = IpyGameDataPY.GetIpyGameData("Hero", heroID1)
- ipyData2 = IpyGameDataPY.GetIpyGameData("Hero", heroID2)
- quality1 = ipyData1.GetQuality() if ipyData1 else 0
- quality2 = ipyData2.GetQuality() if ipyData2 else 0
- if quality1 == quality2:
- return cmp(heroID1, heroID2)
- return -cmp(quality1, quality2)
- return -cmp(star1, star2)
- return -cmp(bLV1, bLV2)
- return -cmp(lv1, lv2)
- elif posNum1:
- return -1
- elif posNum2:
- return 1
- else:
- return cmp(item1.GetItemTypeID(), item2.GetItemTypeID())
-
#===============================================================================
#Python 版重整物品
# def ResetItem(curPlayer, curPackIndex, tick):
@@ -2023,11 +1903,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)
@@ -2129,24 +2009,51 @@
GameWorld.ErrLog('DoLogic_PutItemInPack Error 物品无法放入背包')
return False
+def GetIsBindValue(isBind=0, srcSign=0):
+ ## 获取IsBind值,适用于配置或者通知前端特殊标记用,兼容是否绑定/拍品设定
+ # @param isBind: 可支持原绑定/拍品逻辑,如果该项目没有该逻辑暂时默认都为0
+ # @param srcSign: 标记物品特殊来源,如xx特权额外产出等
+ return srcSign * 10 + isBind
+
## 是否拍品
-def GetIsAuctionItem(curItem): return curItem.GetIsBind()
+def GetIsAuctionItem(curItem): return 0#curItem.GetIsBind()
def SetIsAuctionItem(curItem, isAuctionItem, curPlayer=None):
- curItem.SetIsBind(isAuctionItem)
-
- if isAuctionItem:
- curItem.SetUserAttr(ShareDefine.Def_IudetAuctionItemCreateTime, int(time.time()))
- return
+ #curItem.SetIsBind(isAuctionItem)
+ #
+ #if isAuctionItem:
+ # curItem.SetUserAttr(ShareDefine.Def_IudetAuctionItemCreateTime, int(time.time()))
+ # return
return
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 物品实例
@@ -2189,12 +2096,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):
@@ -2372,7 +2275,7 @@
break
if isSendMail:
- PlayerControl.SendMailByKey(mailKey, [curPlayer.GetPlayerID()], giveItemList)
+ PlayerMail.SendMailByKey(mailKey, curPlayer.GetPlayerID(), giveItemList)
GameWorld.DebugLog("GivePlayerItemOrMail背包空间不够,发送邮件: mailItemList=%s" % str(giveItemList), curPlayer.GetPlayerID())
else:
for itemID, itemCnt, isAuctionItem in giveItemList:
@@ -2479,7 +2382,7 @@
if notifyMailKey:
paramList = [itemID, itemID, recycleCount]
- PlayerControl.SendMailByKey(notifyMailKey, [playerID], addItemList, paramList)
+ PlayerMail.SendMailByKey(notifyMailKey, playerID, addItemList, paramList)
elif addItemList:
GivePlayerItemOrMail(curPlayer, addItemList, event=["RecycleItem", False, {"RecycleItemID":itemID}])
--
Gitblit v1.8.0