From 3b175a59ca82550a31863f4835548eec8a583b96 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 15 十二月 2023 16:59:01 +0800
Subject: [PATCH] 10033 【后端】仙树升级系统及砍树产出规则(装备属性产出规则修改)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py               |  400 ------------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                      |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py                      |   74 ---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/MakeItemCount.py        |   41 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCompensationTube.py    |   37 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py               |   14 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py             |    2 
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_AddPersonalCompensation.py               |    5 
 /dev/null                                                                                               |   60 --
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py       |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py          |  229 ++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGameEvent.py           |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                    |  209 +++++----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerNewGuyCard.py          |   10 
 PySysDB/PySysDBPY.h                                                                                     |   79 +-
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                           |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py             |   18 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyStore.py         |    5 
 19 files changed, 448 insertions(+), 759 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index aeddf7d..c6ac5fa 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -228,45 +228,6 @@
 	list		AttrValue;	//属性值
 };
 
-//装备传奇属性条数表
-
-struct tagEquipLegendAttrCount
-{
-	BYTE		_ItemType;	//物品类型
-	BYTE		_ItemColor;	//物品颜色
-	BYTE		_IsSuit;	//是否套装
-	BYTE		_ItemQuality;	//物品星级
-	list		LegendAttrCountInfo;	//传奇属性条数信息 [[条数, [属性类型库编号, ...]], ...]
-};
-
-//装备传奇属性类型表
-
-struct tagEquipLegendAttrType
-{
-	BYTE		_ItemType;	//物品类型
-	dict		LegendAttrTypeLib;	//传奇属性类型库 {属性类型库编号:[属性ID,...], ...}
-};
-
-//装备传奇属性值库表
-
-struct tagEquipLegendAttrLib
-{
-	BYTE		_LegendAttrID;	//传奇属性ID
-	dict		LegendAttrLib;	//属性库信息 {库编号:[随机数值, ...], ...}
-};
-
-//装备传奇属性等级数值表
-
-struct tagEquipLegendAttrValue
-{
-	BYTE		_ItemType;	//物品类型
-	BYTE		_ItemClassLV;	//物品阶级
-	BYTE		_ItemColor;	//物品颜色
-	BYTE		_IsSuit;	//是否套装
-	BYTE		_ItemQuality;	//物品星级
-	dict		LVLegendAttrLibNumInfo;	//属性ID等级段对应数值库编号 {属性ID:{等级:库编号, ...}}
-};
-
 //神兽表
 
 struct tagDogz
@@ -950,6 +911,41 @@
 	BYTE		WeekResetType;	//每周次数重置类型; 0-不重置,1-0点,2-5点
 };
 
+//装备品质表
+
+struct tagEquipColor
+{
+	BYTE		_EquipColor;	// 装备颜色
+	list		RangeLV;		// 等级范围
+	list		RangeRand;		// 随机上下限范围
+	BYTE		BattleAttrCount;	// 战斗属性条数
+	BYTE		BattleDefAttrCount;	// 战斗抗性条数
+	list		RangeFaintRate;		// 击晕范围
+	list		RangeFaintDefRate;		// 抗击晕范围
+	list		RangeSuperHitRate;		// 暴击范围
+	list		RangeSuperHitRateReduce;		// 抗暴击范围
+	list		RangeComboRate;		// 连击范围
+	list		RangeComboDefRate;		// 抗连击范围
+	list		RangeMissRate;		// 闪避范围
+	list		RangeMissDefRate;		// 抗闪避范围
+	list		RangeAtkBackRate;		// 反击范围
+	list		RangeAtkBackDefRate;		// 抗反击范围
+	list		RangeSuckHPPer;		// 吸血范围
+	list		RangeSuckHPDefPer;		// 抗吸血范围
+};
+
+//装备品质部位表
+
+struct tagEquipColorPlace
+{
+	BYTE		_EquipColor;	// 装备颜色
+	BYTE		_EquipPlace;	// 装备部位
+	list		RangeAtk;		// 攻击范围
+	list		RangeHP;		// 生命范围
+	list		RangeDef;		// 防御范围
+	list		RangeAtkSpeed;		// 攻速范围
+};
+
 //装备评分属性系数表
 
 struct tagEquipGSParam
@@ -1106,8 +1102,11 @@
 
 struct tagAppointItem
 {
-	DWORD		_ID;	//定制物品ID
+	DWORD		_ID;	//定制ID
 	BYTE		CancelUseLimit;	//穿戴限制(除职业)
+	WORD		ItemLV;	//物品等级
+	list		BaseAttrID;	//基础属性ID
+	list		BaseAttrValue;	//基础属性值
 	list		LegendAttrID;	//传奇属性ID
 	list		LegendAttrValue;	//传奇属性值
 };
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_AddPersonalCompensation.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_AddPersonalCompensation.py
index 11f4b33..ddb4ada 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_AddPersonalCompensation.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_AddPersonalCompensation.py
@@ -29,6 +29,7 @@
 import GMCommon
 import uuid
 import ChConfig
+import ShareDefine
 #---------------------------------------------------------------------
 
 
@@ -139,6 +140,7 @@
     if addItemDict['Count'] == 0:
         return {}
     addItemDict['IsAuctionItem'] = GameWorld.ToIntDef(gmCmdDict.get('IsBind%s'%itemIndexStr, '0'))
+    appointID = GameWorld.ToIntDef(gmCmdDict.get('AppointID%s'%itemIndexStr, '0'))
     #添加UserData信息
     addItemDict['UserData'] = ''
     UserDataDict = {}
@@ -169,6 +171,9 @@
             continue
         itemUserData[key] = value
         
+    if appointID:
+        itemUserData[ShareDefine.Def_CItemKey_AppointID] = appointID
+        
     if itemUserData:
         addItemDict['UserData'] = '%s'%itemUserData
         
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index ff9b203..86b41af 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1570,6 +1570,8 @@
 Def_IudetMapLoaction = 15  # 物品记录地图坐标[mapid, posx, posy]
 Def_IudetLegendAttrID = 17  # 物品传奇属性ID列表
 Def_IudetLegendAttrValue = 19  # 物品传奇属性值列表
+Def_IudetBaseAttrID = 21  # 物品基础属性ID列表,适用于随机范围基础属性(非物品表配置的固定属性)
+Def_IudetBaseAttrValue = 23  # 物品基础属性值列表
 Def_IudetPartSuiteLV = 25  # 部位套装等级 [套装类型1等级, 套装类型2等级, ...]
 Def_IudetWingMaterialItemID = 27  # 翅膀精炼材料ID列表
 Def_IudetWingMaterialItemCount = 29  # 翅膀精炼材料个数列表
@@ -1587,6 +1589,7 @@
 Def_IudetItemColor = 16  # 物品颜色,如果该值没有就取物品
 Def_IudetItemCount = 18  # 物品个数,支持20亿,目前仅特殊转化物品会用到
 Def_IudetCancelUseLimit = 20  # 物品取消使用限制
+Def_IudetItemLV = 22  # 物品等级,适用于动态物品等级(非物品表配置的固定等级)
 Def_IudetSource = 24  # 物品来源
 Def_IudetSuiteLV = 30  # 套装等级
 Def_IudetHasOpenCnt = 32  # 物品累积开启次数
@@ -1610,6 +1613,9 @@
 Def_IudetPet_Skill = 201  # 技能列表
 
 Def_IudetHorsePetSkinIndex = 210  # 骑宠觉醒外观索引
+
+# 以下为自定义的设置物品属性key
+Def_CItemKey_AppointID = "AppointID"
 # ----------------------------------------------------
 
 # 宠物物品数据状态
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
index b6efd84..4fa2f10 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
@@ -20,7 +20,7 @@
 # @change: "2013-07-19 20:00" Alee 添加回购
 # @change: "2013-07-22 17:00" Alee 物品可按数量购买
 # @change: "2013-10-12 21:10" Alee 系统提示
-# @change: "2013-10-22 11:10" Alee 物品技能增强效果,统一函数EquipAddAdditionEx
+# @change: "2013-10-22 11:10" Alee 物品技能增强效果,统一函数
 # @change: "2013-11-08 22:30" Alee 商城添加打孔
 # @change: "2013-11-19 11:00" hxp 修改出售物品判断金钱上限逻辑
 # @change: "2014-01-16 13:54" xmnathan 战盟商城购买
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
index 05649d6..16e6f4a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
@@ -2889,14 +2889,6 @@
         GameWorld.Log('###创造任务物品失败, itemID = %s' % (itemID))
         return
     
-    #tmpEquipData = ItemControler.SingleEquipTmpData()
-    #tmpEquipData.starLV = starLV
-    #tmpEquipData.holeCnt = holeCount
-    #tmpEquipData.isSuite = isSuite
-    #tmpEquipData.isBind = bind
-    
-    #ChItem.EquipAddAdditionEx(curSingleItem, tmpEquipData)
-    
     return curSingleItem
 
 #---------------------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/AddLegendAttr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/AddLegendAttr.py
deleted file mode 100644
index 8d7d709..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/AddLegendAttr.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-##@package GM.Commands.AddLegendAttr
-#
-# @todo:添加/重新生成传奇属性
-# @author hxp
-# @date 2017-08-23
-# @version 1.0
-#
-# 详细描述: 添加/重新生成传奇属性
-#
-#-------------------------------------------------------------------------------
-#"""Version = 2017-08-23 23:00"""
-#-------------------------------------------------------------------------------
-
-import GameWorld
-import ItemCommon
-import ItemControler
-import IPY_GameWorld
-
-#---------------------------------------------------------------------
-#逻辑实现
-## GM命令执行入口
-#  @param curPlayer 当前玩家
-#  @param cmdList 参数列表 [index,attrIndexList]
-#  @return None
-def OnExec(curPlayer, cmdList):
-    cmdlen = len(cmdList)
-    if cmdlen < 1:
-        GameWorld.DebugAnswer(curPlayer, "重新随机传奇属性: AddLegendAttr 背包格子索引")
-        GameWorld.DebugAnswer(curPlayer, "部位所有传奇属性: AddLegendAttr 背包格子索引 1")
-        return
-    
-    #获取物品
-    index = cmdList[0]
-    curItem = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem).GetAt(index)
-    if not ItemCommon.CheckItemIsEquip(curItem):
-        GameWorld.DebugAnswer(curPlayer, "非装备无法获得传奇属性!")
-        return
-    
-    isAllAttr = cmdList[1] if len(cmdList) > 1 else 0
-    legendAttrInfo = ItemControler.GetAddEquipLegendAttr(curItem, curPlayer, isAllAttr)
-    if not legendAttrInfo:
-        GameWorld.DebugAnswer(curPlayer, "获取该装备传奇属性失败或没有传奇属性!")
-        return
-    ItemControler.SetEquipLegendAttr(curItem, legendAttrInfo)
-    
-    if legendAttrInfo[2]:
-        GameWorld.DebugAnswer(curPlayer, "神传奇属性:%s %s" % (legendAttrInfo[2], legendAttrInfo[3]))
-    if legendAttrInfo[4]:
-        GameWorld.DebugAnswer(curPlayer, "仙传奇属性:%s %s" % (legendAttrInfo[4], legendAttrInfo[5]))
-    if legendAttrInfo[6]:
-        GameWorld.DebugAnswer(curPlayer, "极传奇属性:%s %s" % (legendAttrInfo[6], legendAttrInfo[7]))
-    if legendAttrInfo[0]:
-        GameWorld.DebugAnswer(curPlayer, "传奇属性:%s %s" % (legendAttrInfo[0], legendAttrInfo[1]))
-        
-    return
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py
index 667abfe..ee60030 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py
@@ -15,7 +15,7 @@
 # @change: "2013-05-10 17:00" wdb 装备增加属性封装
 # @change: "2013-05-20 15:00" wdb 装备附加属性接口修改
 # @change: "2013-06-03 14:00" wdb 修改卓越属性表名为特殊属性
-# @change: "2013-10-21 15:10" Alee 物品技能增强效果,统一函数EquipAddAdditionEx
+# @change: "2013-10-21 15:10" Alee 物品技能增强效果,统一函数
 #---------------------------------------------------------------------
 #"""Version = 2013-10-21 15:10"""
 #---------------------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/MakeItemCount.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/MakeItemCount.py
index 319702e..c6eeb37 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/MakeItemCount.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/MakeItemCount.py
@@ -13,21 +13,12 @@
 # @change: "2015-12-11 16:00" hxp 增加基础属性比例支持
 #
 # 模块详细说明
-#导入
 
 import IPY_GameWorld
 import ItemControler
+import ShareDefine
 import GameWorld
 import ChConfig
-import ItemCommon
-
-#---------------------------------------------------------------------
-#全局变量
-#---------------------------------------------------------------------
-"""Version = 2015-12-11 16:00"""
-#---------------------------------------------------------------------
-#逻辑实现
-
 
 ## GM命令执行入口
 #  @param curPlayer 当前玩家
@@ -38,14 +29,14 @@
     
     #输入命令格式错误
     if len(msgList) < 1:
-        GameWorld.DebugAnswer(curPlayer, "MakeItemCount ID (个数  拍品组数 全部传奇属性)")
+        GameWorld.DebugAnswer(curPlayer, "MakeItemCount ID (个数  拍品组数  定制ID)")
         return
     
     event = [ChConfig.ItemGive_GMMake, False, {"CMD":"MakeItemCount"}]
     itemID = msgList[0]
     itemCount = msgList[1] if len(msgList) > 1 else 1
     auctionGroup = msgList[2] if len(msgList) > 2 else 0
-    isAllAttr = msgList[3] if len(msgList) > 3 else 0
+    appointID = msgList[3] if len(msgList) > 3 else 0
     
     itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
     if not itemData:
@@ -58,32 +49,14 @@
             GameWorld.DebugAnswer(curPlayer, "放入物品失败!")
         return
     
-    playerItemControler = ItemControler.PlayerItemControler(curPlayer)
+    setAttrDict = {ShareDefine.Def_CItemKey_AppointID:appointID}
     
     # 拍品
     if auctionGroup > 0:
         for _ in xrange(auctionGroup):
-            if not ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, True, [IPY_GameWorld.rptItem], event=event):
+            if not ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, True, [IPY_GameWorld.rptItem], event=event, setAttrDict=setAttrDict):
                 GameWorld.DebugAnswer(curPlayer, "###放入物品失败!")
     else:
-        if not ItemCommon.GetIsEquip(itemData):
-            if not ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, False, [IPY_GameWorld.rptItem], event=event):
-                GameWorld.DebugAnswer(curPlayer, "###放入物品失败!")
-        else:
-            for _ in xrange(itemCount):
-                __DoGMGivePlayerItem(curPlayer, playerItemControler, itemID, 1, False, isAllAttr, event)
+        if not ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, False, [IPY_GameWorld.rptItem], event=event, setAttrDict=setAttrDict):
+            GameWorld.DebugAnswer(curPlayer, "###放入物品失败!")
     return
-
-def __DoGMGivePlayerItem(curPlayer, playerItemControler, itemID, count, isAuctionItem, isAllAttr, event):
-    if ItemControler.GetAppointItemRealID(itemID):
-        ItemControler.GivePlayerAppointItem(curPlayer, itemID, isAuctionItem, event=event)
-        return
-    curItem = ItemControler.GetOutPutItemObj(itemID, count, isAuctionItem, curPlayer=curPlayer, isAllAttr=isAllAttr)
-    if not playerItemControler.PutInItem(IPY_GameWorld.rptItem, curItem, event=event):
-        GameWorld.DebugAnswer(curPlayer, "放入物品失败!")
-        
-    return
-
-    
-    
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 0c50ceb..0f160f9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -206,33 +206,6 @@
                         ("list", "AttrValue", 0),
                         ),
 
-                "EquipLegendAttrCount":(
-                        ("BYTE", "ItemType", 1),
-                        ("BYTE", "ItemColor", 1),
-                        ("BYTE", "IsSuit", 1),
-                        ("BYTE", "ItemQuality", 1),
-                        ("list", "LegendAttrCountInfo", 0),
-                        ),
-
-                "EquipLegendAttrType":(
-                        ("BYTE", "ItemType", 1),
-                        ("dict", "LegendAttrTypeLib", 0),
-                        ),
-
-                "EquipLegendAttrLib":(
-                        ("BYTE", "LegendAttrID", 1),
-                        ("dict", "LegendAttrLib", 0),
-                        ),
-
-                "EquipLegendAttrValue":(
-                        ("BYTE", "ItemType", 1),
-                        ("BYTE", "ItemClassLV", 1),
-                        ("BYTE", "ItemColor", 1),
-                        ("BYTE", "IsSuit", 1),
-                        ("BYTE", "ItemQuality", 1),
-                        ("dict", "LVLegendAttrLibNumInfo", 0),
-                        ),
-
                 "Dogz":(
                         ("BYTE", "DogzID", 1),
                         ("list", "BaseAttrTypes", 0),
@@ -778,6 +751,35 @@
                         ("BYTE", "WeekResetType", 0),
                         ),
 
+                "EquipColor":(
+                        ("BYTE", "EquipColor", 1),
+                        ("list", "RangeLV", 0),
+                        ("list", "RangeRand", 0),
+                        ("BYTE", "BattleAttrCount", 0),
+                        ("BYTE", "BattleDefAttrCount", 0),
+                        ("list", "RangeFaintRate", 0),
+                        ("list", "RangeFaintDefRate", 0),
+                        ("list", "RangeSuperHitRate", 0),
+                        ("list", "RangeSuperHitRateReduce", 0),
+                        ("list", "RangeComboRate", 0),
+                        ("list", "RangeComboDefRate", 0),
+                        ("list", "RangeMissRate", 0),
+                        ("list", "RangeMissDefRate", 0),
+                        ("list", "RangeAtkBackRate", 0),
+                        ("list", "RangeAtkBackDefRate", 0),
+                        ("list", "RangeSuckHPPer", 0),
+                        ("list", "RangeSuckHPDefPer", 0),
+                        ),
+
+                "EquipColorPlace":(
+                        ("BYTE", "EquipColor", 1),
+                        ("BYTE", "EquipPlace", 1),
+                        ("list", "RangeAtk", 0),
+                        ("list", "RangeHP", 0),
+                        ("list", "RangeDef", 0),
+                        ("list", "RangeAtkSpeed", 0),
+                        ),
+
                 "EquipGSParam":(
                         ("BYTE", "ClassLV", 1),
                         ("BYTE", "EquipColor", 1),
@@ -905,6 +907,9 @@
                 "AppointItem":(
                         ("DWORD", "ID", 1),
                         ("BYTE", "CancelUseLimit", 0),
+                        ("WORD", "ItemLV", 0),
+                        ("list", "BaseAttrID", 0),
+                        ("list", "BaseAttrValue", 0),
                         ("list", "LegendAttrID", 0),
                         ("list", "LegendAttrValue", 0),
                         ),
@@ -2606,64 +2611,6 @@
     def GetAttrType(self): return self.AttrType # 属性类型
     def GetAttrValue(self): return self.AttrValue # 属性值
 
-# 装备传奇属性条数表
-class IPY_EquipLegendAttrCount():
-    
-    def __init__(self):
-        self.ItemType = 0
-        self.ItemColor = 0
-        self.IsSuit = 0
-        self.ItemQuality = 0
-        self.LegendAttrCountInfo = []
-        return
-        
-    def GetItemType(self): return self.ItemType # 物品类型
-    def GetItemColor(self): return self.ItemColor # 物品颜色
-    def GetIsSuit(self): return self.IsSuit # 是否套装
-    def GetItemQuality(self): return self.ItemQuality # 物品星级
-    def GetLegendAttrCountInfo(self): return self.LegendAttrCountInfo # 传奇属性条数信息 [[条数, [属性类型库编号, ...]], ...]
-
-# 装备传奇属性类型表
-class IPY_EquipLegendAttrType():
-    
-    def __init__(self):
-        self.ItemType = 0
-        self.LegendAttrTypeLib = {}
-        return
-        
-    def GetItemType(self): return self.ItemType # 物品类型
-    def GetLegendAttrTypeLib(self): return self.LegendAttrTypeLib # 传奇属性类型库 {属性类型库编号:[属性ID,...], ...}
-
-# 装备传奇属性值库表
-class IPY_EquipLegendAttrLib():
-    
-    def __init__(self):
-        self.LegendAttrID = 0
-        self.LegendAttrLib = {}
-        return
-        
-    def GetLegendAttrID(self): return self.LegendAttrID # 传奇属性ID
-    def GetLegendAttrLib(self): return self.LegendAttrLib # 属性库信息 {库编号:[随机数值, ...], ...}
-
-# 装备传奇属性等级数值表
-class IPY_EquipLegendAttrValue():
-    
-    def __init__(self):
-        self.ItemType = 0
-        self.ItemClassLV = 0
-        self.ItemColor = 0
-        self.IsSuit = 0
-        self.ItemQuality = 0
-        self.LVLegendAttrLibNumInfo = {}
-        return
-        
-    def GetItemType(self): return self.ItemType # 物品类型
-    def GetItemClassLV(self): return self.ItemClassLV # 物品阶级
-    def GetItemColor(self): return self.ItemColor # 物品颜色
-    def GetIsSuit(self): return self.IsSuit # 是否套装
-    def GetItemQuality(self): return self.ItemQuality # 物品星级
-    def GetLVLegendAttrLibNumInfo(self): return self.LVLegendAttrLibNumInfo # 属性ID等级段对应数值库编号 {属性ID:{等级:库编号, ...}}
-
 # 神兽表
 class IPY_Dogz():
     
@@ -3798,6 +3745,66 @@
     def GetWeekTimes(self): return self.WeekTimes # 每周次数, 0为不限制
     def GetWeekResetType(self): return self.WeekResetType # 每周次数重置类型; 0-不重置,1-0点,2-5点
 
+# 装备品质表
+class IPY_EquipColor():
+    
+    def __init__(self):
+        self.EquipColor = 0
+        self.RangeLV = []
+        self.RangeRand = []
+        self.BattleAttrCount = 0
+        self.BattleDefAttrCount = 0
+        self.RangeFaintRate = []
+        self.RangeFaintDefRate = []
+        self.RangeSuperHitRate = []
+        self.RangeSuperHitRateReduce = []
+        self.RangeComboRate = []
+        self.RangeComboDefRate = []
+        self.RangeMissRate = []
+        self.RangeMissDefRate = []
+        self.RangeAtkBackRate = []
+        self.RangeAtkBackDefRate = []
+        self.RangeSuckHPPer = []
+        self.RangeSuckHPDefPer = []
+        return
+        
+    def GetEquipColor(self): return self.EquipColor #  装备颜色
+    def GetRangeLV(self): return self.RangeLV #  等级范围
+    def GetRangeRand(self): return self.RangeRand #  随机上下限范围
+    def GetBattleAttrCount(self): return self.BattleAttrCount #  战斗属性条数
+    def GetBattleDefAttrCount(self): return self.BattleDefAttrCount #  战斗抗性条数
+    def GetRangeFaintRate(self): return self.RangeFaintRate #  击晕范围
+    def GetRangeFaintDefRate(self): return self.RangeFaintDefRate #  抗击晕范围
+    def GetRangeSuperHitRate(self): return self.RangeSuperHitRate #  暴击范围
+    def GetRangeSuperHitRateReduce(self): return self.RangeSuperHitRateReduce #  抗暴击范围
+    def GetRangeComboRate(self): return self.RangeComboRate #  连击范围
+    def GetRangeComboDefRate(self): return self.RangeComboDefRate #  抗连击范围
+    def GetRangeMissRate(self): return self.RangeMissRate #  闪避范围
+    def GetRangeMissDefRate(self): return self.RangeMissDefRate #  抗闪避范围
+    def GetRangeAtkBackRate(self): return self.RangeAtkBackRate #  反击范围
+    def GetRangeAtkBackDefRate(self): return self.RangeAtkBackDefRate #  抗反击范围
+    def GetRangeSuckHPPer(self): return self.RangeSuckHPPer #  吸血范围
+    def GetRangeSuckHPDefPer(self): return self.RangeSuckHPDefPer #  抗吸血范围
+
+# 装备品质部位表
+class IPY_EquipColorPlace():
+    
+    def __init__(self):
+        self.EquipColor = 0
+        self.EquipPlace = 0
+        self.RangeAtk = []
+        self.RangeHP = []
+        self.RangeDef = []
+        self.RangeAtkSpeed = []
+        return
+        
+    def GetEquipColor(self): return self.EquipColor #  装备颜色
+    def GetEquipPlace(self): return self.EquipPlace #  装备部位
+    def GetRangeAtk(self): return self.RangeAtk #  攻击范围
+    def GetRangeHP(self): return self.RangeHP #  生命范围
+    def GetRangeDef(self): return self.RangeDef #  防御范围
+    def GetRangeAtkSpeed(self): return self.RangeAtkSpeed #  攻速范围
+
 # 装备评分属性系数表
 class IPY_EquipGSParam():
     
@@ -4061,12 +4068,18 @@
     def __init__(self):
         self.ID = 0
         self.CancelUseLimit = 0
+        self.ItemLV = 0
+        self.BaseAttrID = []
+        self.BaseAttrValue = []
         self.LegendAttrID = []
         self.LegendAttrValue = []
         return
         
-    def GetID(self): return self.ID # 定制物品ID
+    def GetID(self): return self.ID # 定制ID
     def GetCancelUseLimit(self): return self.CancelUseLimit # 穿戴限制(除职业)
+    def GetItemLV(self): return self.ItemLV # 物品等级
+    def GetBaseAttrID(self): return self.BaseAttrID # 基础属性ID
+    def GetBaseAttrValue(self): return self.BaseAttrValue # 基础属性值
     def GetLegendAttrID(self): return self.LegendAttrID # 传奇属性ID
     def GetLegendAttrValue(self): return self.LegendAttrValue # 传奇属性值
 
@@ -6940,14 +6953,6 @@
         self.ipyItemPlusMaxLen = len(self.ipyItemPlusMaxCache)
         self.ipyRoleEquipStarsCache = self.__LoadFileData("RoleEquipStars", IPY_RoleEquipStars)
         self.ipyRoleEquipStarsLen = len(self.ipyRoleEquipStarsCache)
-        self.ipyEquipLegendAttrCountCache = self.__LoadFileData("EquipLegendAttrCount", IPY_EquipLegendAttrCount)
-        self.ipyEquipLegendAttrCountLen = len(self.ipyEquipLegendAttrCountCache)
-        self.ipyEquipLegendAttrTypeCache = self.__LoadFileData("EquipLegendAttrType", IPY_EquipLegendAttrType)
-        self.ipyEquipLegendAttrTypeLen = len(self.ipyEquipLegendAttrTypeCache)
-        self.ipyEquipLegendAttrLibCache = self.__LoadFileData("EquipLegendAttrLib", IPY_EquipLegendAttrLib)
-        self.ipyEquipLegendAttrLibLen = len(self.ipyEquipLegendAttrLibCache)
-        self.ipyEquipLegendAttrValueCache = self.__LoadFileData("EquipLegendAttrValue", IPY_EquipLegendAttrValue)
-        self.ipyEquipLegendAttrValueLen = len(self.ipyEquipLegendAttrValueCache)
         self.ipyDogzCache = self.__LoadFileData("Dogz", IPY_Dogz)
         self.ipyDogzLen = len(self.ipyDogzCache)
         self.ipyDogzEquipPlusCache = self.__LoadFileData("DogzEquipPlus", IPY_DogzEquipPlus)
@@ -7036,6 +7041,10 @@
         self.ipyNPCCustomRefreshLen = len(self.ipyNPCCustomRefreshCache)
         self.ipyDailyActionCache = self.__LoadFileData("DailyAction", IPY_DailyAction)
         self.ipyDailyActionLen = len(self.ipyDailyActionCache)
+        self.ipyEquipColorCache = self.__LoadFileData("EquipColor", IPY_EquipColor)
+        self.ipyEquipColorLen = len(self.ipyEquipColorCache)
+        self.ipyEquipColorPlaceCache = self.__LoadFileData("EquipColorPlace", IPY_EquipColorPlace)
+        self.ipyEquipColorPlaceLen = len(self.ipyEquipColorPlaceCache)
         self.ipyEquipGSParamCache = self.__LoadFileData("EquipGSParam", IPY_EquipGSParam)
         self.ipyEquipGSParamLen = len(self.ipyEquipGSParamCache)
         self.ipySuccessCache = self.__LoadFileData("Success", IPY_Success)
@@ -7562,14 +7571,6 @@
     def GetItemPlusMaxByIndex(self, index): return self.ipyItemPlusMaxCache[index]
     def GetRoleEquipStarsCount(self): return self.ipyRoleEquipStarsLen
     def GetRoleEquipStarsByIndex(self, index): return self.ipyRoleEquipStarsCache[index]
-    def GetEquipLegendAttrCountCount(self): return self.ipyEquipLegendAttrCountLen
-    def GetEquipLegendAttrCountByIndex(self, index): return self.ipyEquipLegendAttrCountCache[index]
-    def GetEquipLegendAttrTypeCount(self): return self.ipyEquipLegendAttrTypeLen
-    def GetEquipLegendAttrTypeByIndex(self, index): return self.ipyEquipLegendAttrTypeCache[index]
-    def GetEquipLegendAttrLibCount(self): return self.ipyEquipLegendAttrLibLen
-    def GetEquipLegendAttrLibByIndex(self, index): return self.ipyEquipLegendAttrLibCache[index]
-    def GetEquipLegendAttrValueCount(self): return self.ipyEquipLegendAttrValueLen
-    def GetEquipLegendAttrValueByIndex(self, index): return self.ipyEquipLegendAttrValueCache[index]
     def GetDogzCount(self): return self.ipyDogzLen
     def GetDogzByIndex(self, index): return self.ipyDogzCache[index]
     def GetDogzEquipPlusCount(self): return self.ipyDogzEquipPlusLen
@@ -7658,6 +7659,10 @@
     def GetNPCCustomRefreshByIndex(self, index): return self.ipyNPCCustomRefreshCache[index]
     def GetDailyActionCount(self): return self.ipyDailyActionLen
     def GetDailyActionByIndex(self, index): return self.ipyDailyActionCache[index]
+    def GetEquipColorCount(self): return self.ipyEquipColorLen
+    def GetEquipColorByIndex(self, index): return self.ipyEquipColorCache[index]
+    def GetEquipColorPlaceCount(self): return self.ipyEquipColorPlaceLen
+    def GetEquipColorPlaceByIndex(self, index): return self.ipyEquipColorPlaceCache[index]
     def GetEquipGSParamCount(self): return self.ipyEquipGSParamLen
     def GetEquipGSParamByIndex(self, index): return self.ipyEquipGSParamCache[index]
     def GetSuccessCount(self): return self.ipySuccessLen
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
index 4d9c945..c1688ac 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
@@ -1914,80 +1914,6 @@
            
     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
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 42f5236..c3bd747 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -1258,10 +1258,7 @@
                     itemNoteDict = ItemCommon.GetItemNoteDict(item, canPutinCount, packItemCount, canPutinCount)
                     ItemCommon.DR_GetItem(curPlayer, packIndex, eventName, itemNoteDict, addDict)
             else:
-                #可以放下
-                if isEquip:
-                    self.CheckEquipAttr(packIndex, tagItem)
-                    
+                   
                 if tagItem.GetGameWorldItemType() == IPY_GameWorld.gwitRoleItem:
                     item.PutIn(tagItem)
                 elif tagItem.GetGameWorldItemType() == IPY_GameWorld.gwitSingleItem:
@@ -1278,27 +1275,6 @@
         #放入东西
         return putResult
     
-    def CheckEquipAttr(self, packType, curItem):
-        legendAttrIDCount = curItem.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrID)
-        legendAttrValueCount = curItem.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrValue)
-        
-        if legendAttrIDCount and legendAttrValueCount and legendAttrIDCount == legendAttrValueCount:
-            return
-        
-        curPlayer = self.__Player
-        legendAttrInfo = GetAddEquipLegendAttr(curItem, curPlayer)
-        if not legendAttrInfo:
-            return
-        
-        curPlayer = self.__Player
-        srcScore = ItemCommon.GetEquipGearScore(curItem)
-        SetEquipLegendAttr(curItem, legendAttrInfo)
-        ItemCommon.MakeEquipGS(curItem)
-        updScore = ItemCommon.GetEquipGearScore(curItem)
-        GameWorld.DebugLog("传奇属性异常,重新刷新一次属性: packType=%s,itemID=%s,srcScore=%s,updScore=%s" 
-                         % (packType, curItem.GetItemTypeID(), srcScore, updScore), curPlayer.GetPlayerID())
-        return
-
     ## 是否能放入物品 
     #  @param packIndex 背包索引
     #  @param curItemID 当前物品ID
@@ -2083,7 +2059,7 @@
         
     return
 
-def GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, packIndexList, event=["", False, {}]):
+def GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, packIndexList, event=["", False, {}], setAttrDict=None):
     '''给玩家物品
     @param isAuctionItem: 是否拍品
     '''
@@ -2118,134 +2094,21 @@
         #不可放入
         return False
     
-    #定制物品
-    if GetAppointItemRealID(itemID):
-        isOK = False
-        for _ in xrange(itemCount):
-            if GivePlayerAppointItem(curPlayer, itemID, isAuctionItem, event):
-                isOK = True # 只要有成功的就返回成功,防止异常情况失败可能导致被刷
-        return isOK
-    
     #装备
     if ItemCommon.GetIsEquip(curItemData):
         isOK = False
         for _ in xrange(itemCount):
-            outPutEquip = GetOutPutItemObj(itemID, 1, isAuctionItem, curPlayer=curPlayer)
+            outPutEquip = GetOutPutItemObj(itemID, 1, isAuctionItem, curPlayer=curPlayer, setAttrDict=setAttrDict)
             if not outPutEquip:
                 return isOK
             if DoLogic_PutItemInPack(curPlayer, outPutEquip, event, packIndexList):
                 isOK = True # 只要有成功的就返回成功,防止异常情况失败可能导致被刷
         return isOK
     
-    giveItem = GetOutPutItemObj(itemID, itemCount, isAuctionItem, curPlayer=curPlayer)
+    giveItem = GetOutPutItemObj(itemID, itemCount, isAuctionItem, curPlayer=curPlayer, setAttrDict=setAttrDict)
     if not giveItem:
         return False
     return DoLogic_PutItemInPack(curPlayer, giveItem, event, packIndexList)
-
-
-def GivePlayerAppointItem(curPlayer, appointID, isAuctionItem, event=["", False, {}]):
-    '''给玩家定制物品表物品,定制物品默认个数1
-    @param appointID 定制表ID
-    @param isAuctionItem 是否拍品
-    '''
-    itemDictData = GetAppointItemDictData(appointID, isAuctionItem)
-    if not itemDictData:
-        return False
-    
-    return GivePlayerEquip(curPlayer, itemDictData, event=event)
-
-def GetAppointItemDictData(appointID, isAuctionItem):
-    '''获取定制表物品数据,定制物品默认个数1
-    @param appointID 定制表ID
-    @param isAuctionItem 是否拍品
-    '''
-    itemID = GetAppointItemRealID(appointID)
-    if not itemID:
-        return {}
-    ipyData = IpyGameDataPY.GetIpyGameData("AppointItem", appointID)
-    if not ipyData:
-        return {}
-    itemDictData = {}
-   
-    itemDictData['legendAttrID'] = ipyData.GetLegendAttrID()
-    itemDictData['legendAttrValue'] = ipyData.GetLegendAttrValue()
-    itemDictData['ItemID'] = itemID
-    itemDictData['CancelUseLimit'] = ipyData.GetCancelUseLimit()
-    
-    itemDictData['IsAuctionItem'] = isAuctionItem
-    
-    return itemDictData
-
-def GetAppointItemRealID(itemID):
-    '''获取定制物品对应的真实物品ID'''
-    curItem = GameWorld.GetGameData().GetItemByTypeID(itemID)
-    if not curItem:
-        return 0
-    curEff = curItem.GetEffectByIndex(0)
-    curEffID = curEff.GetEffectID()
-    if curEffID != ChConfig.Def_Effect_AppointItem:
-        return 0
-    return curEff.GetEffectValue(0)
-
-## 根据物品data字典给玩家装备/翅膀
-#  @param curPlayer:玩家实例
-#  @param itemData:物品数据
-#  @param packType:背包类型
-#  @param defaultPile 默认先判断是否能进行物品堆叠
-#  @return None
-def GivePlayerEquip(curPlayer, itemData, event=["", False, {}], packType=[IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere],
-                    defaultPile=True):
-    equipItem = GetItemByData(itemData)
-    #将物品放入背包
-    return DoLogic_PutItemInPack(curPlayer, equipItem, event, packType, defaultPile)
-
-
-## 根据物品data字典创建物品
-#  @param itemData:物品数据
-#  @return ItemObj
-def GetItemByData(itemData):
-    if not itemData:
-        return
-    
-    itemID = int(itemData.get('ItemID', 0))
-    isAuctionItem = int(itemData.get('IsAuctionItem', 0))
-    equipItem = ItemCommon.CreateSingleItem(itemID, isAuctionItem=isAuctionItem)
-    if not equipItem:
-        return
-    
-    tmpEquipData = SingleEquipTmpData()
-    
-    #tmpEquipData.starLV = int(itemData.get('StarLV', '0'))
-    #tmpEquipData.holeCnt = int(itemData.get('HoleCount', '0'))
-    #tmpEquipData.stoneData = eval(itemData.get('StoneData', '[]'))
-    tmpEquipData.isBind = isAuctionItem
-    #tmpEquipData.isSuite = int(itemData.get('IsSuit', '0'))
-    #tmpEquipData.suiteLV = int(itemData.get('SuiteLV', '0'))
-    #if tmpEquipData.suiteLV:
-    #    tmpEquipData.isSuite = 1
-    tmpEquipData.source = int(itemData.get('Source', str(ShareDefine.Item_Source_Unkown)))
-    
-    tmpEquipData.legendAttrIDList = itemData.get('legendAttrID', [])
-    tmpEquipData.legendAttrValueList = itemData.get('legendAttrValue', [])
-    
-    # 装备附加属性
-    ChItem.EquipAddAdditionEx(equipItem, tmpEquipData)
-    
-    if "UserData" in itemData:
-        userData = itemData["UserData"]
-        equipItem.SetUserData(userData, len(userData))
-        
-    if "EquipGS" in itemData:
-        equipGS = int(itemData["EquipGS"])
-        ItemCommon.SetEquipGearScore(equipItem, equipGS)
-    
-        
-    # 取消等级限制
-    if itemData.get('CancelUseLimit', 0):
-        equipItem.SetUserAttr(ShareDefine.Def_IudetCancelUseLimit, 1)
-        
-    return equipItem
-
 
 #---------------------------------------------------------------------
 ## 执行物品放入背包逻辑
@@ -2285,42 +2148,17 @@
 def SetIsAuctionItem(curItem, isAuctionItem, curPlayer=None):
     curItem.SetIsBind(isAuctionItem)
     
-    if isAuctionItem:
-        curItem.SetUserAttr(ShareDefine.Def_IudetAuctionItemCreateTime, int(time.time()))
-        return
+    # 20201223 主干取消拍品有效时长设定
+    #if isAuctionItem:
+    #    curItem.SetUserAttr(ShareDefine.Def_IudetAuctionItemCreateTime, int(time.time()))
+    #    return
     
-    if not curPlayer:
-        return
+    #if not curPlayer:
+    #    return
     
-    if ItemCommon.GetIsEquip(curItem):
-        legendAttrIDCnt = curItem.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrID)
-        legendAttrValueCnt = curItem.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrValue)
-        if legendAttrIDCnt and legendAttrIDCnt == legendAttrValueCnt:
-            legendAttrInfo = GetEquipLegendAttrGroup(curItem)
-            #GameWorld.DebugLog("已经有传奇属性的拍品: %s" % str(legendAttrInfo))
-        else:
-            # 生成传奇属性
-            legendAttrInfo = GetAddEquipLegendAttr(curItem, curPlayer)
-            #GameWorld.DebugLog("重新生成传奇属性的拍品: %s" % str(legendAttrInfo))
-            if not legendAttrInfo:
-                return
-            
-        updateDict = {}
-        if legendAttrInfo[0]:
-            updateDict[ShareDefine.Def_IudetLegendAttrID] = legendAttrInfo[0]
-            updateDict[ShareDefine.Def_IudetLegendAttrValue] = legendAttrInfo[1]
-        if legendAttrInfo[2]:
-            updateDict[ShareDefine.Def_IudetLegendAttrIDShen] = legendAttrInfo[2]
-            updateDict[ShareDefine.Def_IudetLegendAttrValueShen] = legendAttrInfo[3]
-        if legendAttrInfo[4]:
-            updateDict[ShareDefine.Def_IudetLegendAttrIDXian] = legendAttrInfo[4]
-            updateDict[ShareDefine.Def_IudetLegendAttrValueXian] = legendAttrInfo[5]
-        if legendAttrInfo[6]:
-            updateDict[ShareDefine.Def_IudetLegendAttrIDJi] = legendAttrInfo[6]
-            updateDict[ShareDefine.Def_IudetLegendAttrValueJi] = legendAttrInfo[7]
-            
-        delKeyList = [ShareDefine.Def_IudetAuctionItemCreateTime]
-        ItemCommon.UpdateItemUserData(curItem, updateDict, delKeyList, isUpdateGS=True)
+    #if ItemCommon.GetIsEquip(curItem):
+    #   delKeyList = [ShareDefine.Def_IudetAuctionItemCreateTime]
+    #    ItemCommon.UpdateItemUserData(curItem, updateDict, delKeyList, isUpdateGS=True)
         
     return
 
@@ -2404,157 +2242,18 @@
     #---无空位置,替换---
     return placeList[0]
 
-def GetOutPutItemObj(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, isAllAttr=False):
+def GetOutPutItemObj(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, setAttrDict=None):
     ''' 获取功能产出的物品实例
     @param isAuctionItem: 是否拍品,默认非拍品
     @param expireTime: 有效时间,时间单位由时效类型决定
     @param curPlayer: 产出该物品时的玩家,物品某些属性由玩家等级决定,如传奇属性
-    @param isAllAttr: 是否生成该装备所有属性,GM创建物品时用,需验证相关权限
+    @param setAttrDict: 直接设置物品的属性 {key:value, ...} key支持  ShareDefine.Def_IudetXXX字符串 或 自定key
     '''
-    curItem = ItemCommon.CreateSingleItem(itemID, itemCount, isAuctionItem, expireTime)
+    curItem = ItemCommon.CreateSingleItem(itemID, itemCount, isAuctionItem, expireTime, curPlayer, setAttrDict)
     if not curItem:
         GameWorld.ErrLog("产出物品异常,无法创建物品 = %s" % (itemID))
         return
-    
-    # 非装备,无需设置属性
-    if not ItemCommon.CheckItemIsEquip(curItem):
-        return curItem
-    
-    # 定制物品
-    if GetAppointItemRealID(itemID):
-        curItem.Clear()
-        #GameWorld.DebugLog("清除给定制物品之前已经创建的物品ID=%s" % itemID)
-        return GetItemByData(GetAppointItemDictData(itemID, isAuctionItem))
-    
-#    # 拍品不处理其他属性
-#    if isAuctionItem:
-#        return curItem
-    
-    tmpEquipData = SingleEquipTmpData()
-    
-    # 传奇属性
-    legendAttrInfo = GetAddEquipLegendAttr(curItem, curPlayer, isAllAttr)
-    if legendAttrInfo:
-        tmpEquipData.legendAttrIDList = legendAttrInfo[0]
-        tmpEquipData.legendAttrValueList = legendAttrInfo[1]
-        tmpEquipData.legendAttrIDListShen = legendAttrInfo[2]
-        tmpEquipData.legendAttrValueListShen = legendAttrInfo[3]
-        tmpEquipData.legendAttrIDListXian = legendAttrInfo[4]
-        tmpEquipData.legendAttrValueListXian = legendAttrInfo[5]
-        tmpEquipData.legendAttrIDListJi = legendAttrInfo[6]
-        tmpEquipData.legendAttrValueListJi = legendAttrInfo[7]
-        
-    # 其他装备属性
-    ChItem.EquipAddAdditionEx(curItem, tmpEquipData)
     return curItem
-
-def GetAddEquipLegendAttr(curItem, curPlayer, isAllAttr=False):
-    '''获取生成到装备上的传奇属性
-    @return: None 或者  [传奇属性效果ID列表], [属性值列表], [神ID], [神值], [仙ID], [仙值], [极ID], [极值]
-    '''
-#    if GetIsAuctionItem(curItem):
-#        #GameWorld.DebugLog("拍品无法生成传奇属性!")
-#        return
-    itemID = curItem.GetItemTypeID()
-    itemType = curItem.GetType()
-    itemColor = curItem.GetItemColor()
-    itemQuality = curItem.GetItemQuality()
-    isSuit = 1 if curItem.GetSuiteID() else 0
-    
-    ipyData = IpyGameDataPY.GetIpyGameDataNotLog("EquipShenAttr", itemID)
-    if ipyData:
-        return ipyData.GetLegendAttrIDList(), ipyData.GetLegendAttrValueList(), \
-                ipyData.GetShenAttrIDList(), ipyData.GetShenAttrValueList(), \
-                ipyData.GetXianAttrIDList(), ipyData.GetXianAttrValueList(), \
-                ipyData.GetJiAttrIDList(), ipyData.GetJiAttrValueList()
-                
-    # 1. 定条数
-    attrCountIpyData = IpyGameDataPY.GetIpyGameDataNotLog("EquipLegendAttrCount", itemType, itemColor, isSuit, itemQuality)
-    if not attrCountIpyData:
-        if itemColor >= ChConfig.Def_Quality_Purple:
-            GameWorld.DebugLog("该装备没有传奇属性: itemID=%s" % (itemID))
-        return
-    legendAttrCountInfoList = attrCountIpyData.GetLegendAttrCountInfo() # 传奇属性条数信息 [[条数, [属性类型库编号, ...]], ...]
-    if not legendAttrCountInfoList:
-        return
-    
-    if curPlayer:
-        playerID, playerLV = curPlayer.GetPlayerID(), curPlayer.GetLV()
-    else:
-        playerID = 0
-        playerLV = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
-        GameWorld.Log("生成装备传奇属性时没有玩家等级, 取当前世界等级! itemID=%s,worldLV=%s" % (itemID, playerLV))
-        
-    # 2. 定属性ID
-    attrTypeIpyData = IpyGameDataPY.GetIpyGameData("EquipLegendAttrType", itemType)
-    if not attrTypeIpyData:
-        return
-    legendAttrTypeLibDict = attrTypeIpyData.GetLegendAttrTypeLib() # 传奇属性类型库 {属性类型库编号:[属性ID,...], ...}
-    
-    curLegAttrIDList = []
-    curLegAttrValueList = []
-    itemClassLV = ItemCommon.GetItemClassLV(curItem)
-    if isAllAttr:
-        if curPlayer.GetGMLevel() != 90:
-            return
-        for attrIDList in legendAttrTypeLibDict.values():
-            curLegAttrIDList += attrIDList
-        #GameWorld.DebugLog("所有传奇属性: %s" % (curLegAttrIDList), playerID)
-    else:
-        #GameWorld.DebugLog("随机传奇属性: itemID=%s,itemType=%s,itemClassLV=%s,itemColor=%s,isSuit=%s" 
-        #                   % (itemID, itemType, itemClassLV, itemColor, isSuit), playerID)
-        for attrCount, libNumList in legendAttrCountInfoList:
-            attrIDList = []
-            for libNum in libNumList:
-                attrIDList.extend(legendAttrTypeLibDict.get(libNum, []))
-            for curAttrID in curLegAttrIDList:
-                if curAttrID in attrIDList:
-                    attrIDList.remove(curAttrID)
-            if len(attrIDList) < attrCount:
-                GameWorld.ErrLog("装备传奇属性ID库配置不够条数随机!itemID=%s,itemType=%s,legendAttrCountInfoList=%s,legendAttrTypeLibDict=%s" 
-                                 % (itemID, itemType, legendAttrCountInfoList, legendAttrTypeLibDict), playerID)
-                return
-            curLegAttrIDList += random.sample(attrIDList, attrCount)
-            #GameWorld.DebugLog("    随机传奇属性: attrCount=%s,libNumList=%s,attrIDList=%s,curLegAttrIDList=%s" 
-            #                   % (attrCount, libNumList, attrIDList, curLegAttrIDList), playerID)
-            
-    # 3. 定数值
-    attrValueIpyData = IpyGameDataPY.GetIpyGameData("EquipLegendAttrValue", itemType, itemClassLV, itemColor, isSuit, itemQuality)
-    if not attrValueIpyData:
-        GameWorld.ErrLog("传奇属性等级数值表找不到配置!itemID=%s,itemType=%s,itemClassLV=%s,itemColor=%s,isSuit=%s,itemQuality=%s" 
-                         % (itemID, itemType, itemClassLV, itemColor, isSuit, itemQuality), playerID)
-        return
-    
-    attrLVLibNumDict = attrValueIpyData.GetLVLegendAttrLibNumInfo() # {属性ID:{等级:库编号, ...}}
-    for attrID in curLegAttrIDList:
-        if attrID not in attrLVLibNumDict:
-            GameWorld.ErrLog("传奇属性等级数值表没有配置属性ID对应等级库编号!itemID=%s,itemType=%s,itemClassLV=%s,itemColor=%s,isSuit=%s,attrID=%s" 
-                             % (itemID, itemType, itemClassLV, itemColor, isSuit, attrID), playerID)
-            return
-        curLibNum = None
-        lvAttrLibList = attrLVLibNumDict[attrID]
-        for lv, libNum in lvAttrLibList:
-            if playerLV <= lv:
-                curLibNum = libNum
-                break
-        if curLibNum == None:
-            GameWorld.ErrLog("传奇属性等级数值表找不到属性ID对应等级库编号!itemID=%s,itemType=%s,itemClassLV=%s,itemColor=%s,isSuit=%s,attrID=%s,playerLV=%s" 
-                             % (itemID, itemType, itemClassLV, itemColor, isSuit, attrID, playerLV), playerID)
-            return
-        attrLibIpyData = attrValueIpyData = IpyGameDataPY.GetIpyGameData("EquipLegendAttrLib", attrID)
-        if not attrLibIpyData:
-            GameWorld.ErrLog("传奇属性库不存在传奇属性ID配置!itemID=%s,attrID=%s" % (itemID, attrID), playerID)
-            return
-        attrLibDict = attrLibIpyData.GetLegendAttrLib() # {库编号:[随机数值, ...], ...}
-        if curLibNum not in attrLibDict:
-            GameWorld.ErrLog("传奇属性库编号不存在!itemID=%s,attrID=%s,curLibNum=%s" % (itemID, attrID, curLibNum), playerID)
-            return
-        valueList = attrLibDict[curLibNum]
-        attrValue = random.choice(valueList)
-        curLegAttrValueList.append(attrValue)
-        #GameWorld.DebugLog("    随机属性: attrID=%s,attrValue=%s,playerLV=%s,curLibNum=%s,valueList=%s" 
-        #                   % (attrID, attrValue, playerLV, curLibNum, valueList), playerID)
-    return curLegAttrIDList, curLegAttrValueList, [], [], [], [], [], []
 
 def GetEquipLegendAttrAll(curItem):
     ## 获取装备传奇属性 - 所有分组合并返回
@@ -2599,73 +2298,6 @@
             jiAttrValueList.append(curItem.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrValueJi, i))
             
     return legAttrIDList, legAttrValueList, shenAttrIDList, shenAttrValueList, xianAttrIDList, xianAttrValueList, jiAttrIDList, jiAttrValueList
-
-def SetEquipLegendAttr(curItem, legendAttrInfo):
-    ## 设置装备传奇属性
-    
-    legAttrIDList, legAttrValueList, shenAttrIDList, shenAttrValueList, \
-        xianAttrIDList, xianAttrValueList, jiAttrIDList, jiAttrValueList = legendAttrInfo
-                       
-    # 普通传奇属性
-    if legAttrIDList and legAttrValueList and len(legAttrIDList) == len(legAttrValueList):
-        curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrID)
-        curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrValue)
-        for i in xrange(len(legAttrIDList)):
-            curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrID, legAttrIDList[i])
-            curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrValue, legAttrValueList[i])
-    
-    # 神 传奇属性
-    if shenAttrIDList and shenAttrValueList and len(shenAttrIDList) == len(shenAttrValueList):
-        curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrIDShen)
-        curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrValueShen)
-        for i in xrange(len(shenAttrIDList)):
-            curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrIDShen, shenAttrIDList[i])
-            curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrValueShen, shenAttrValueList[i])
-    
-    # 仙 传奇属性
-    if xianAttrIDList and xianAttrValueList and len(xianAttrIDList) == len(xianAttrValueList):
-        curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrIDXian)
-        curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrValueXian)
-        for i in xrange(len(xianAttrIDList)):
-            curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrIDXian, xianAttrIDList[i])
-            curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrValueXian, xianAttrValueList[i])
-            
-    # 极 传奇属性
-    if jiAttrIDList and jiAttrValueList and len(jiAttrIDList) == len(jiAttrValueList):
-        curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrIDJi)
-        curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrValueJi)
-        for i in xrange(len(jiAttrIDList)):
-            curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrIDJi, jiAttrIDList[i])
-            curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrValueJi, jiAttrValueList[i])
-            
-    return
-
-##创建物品所需的动态数据
-#
-# 便于统一修改
-class SingleEquipTmpData():
-    
-    ## 初始化
-    #  @param 
-    #  @return None
-    def __init__(self):
-        self.starLV = 0 # 强化等级(星数)
-        self.holeCnt = 0
-        self.stoneData = [] # 宝石列表
-        self.isSuite = False
-        self.suiteLV = 0 #套装等级
-        self.isBind = False
-        
-        self.source = ShareDefine.Item_Source_Unkown    #物品来源
-        self.legendAttrIDList = [] # 传奇属性ID
-        self.legendAttrValueList = [] # 传奇属性值
-        self.legendAttrIDListShen = [] # 传奇属性ID - 神
-        self.legendAttrValueListShen = [] # 传奇属性值 - 神
-        self.legendAttrIDListXian = [] # 传奇属性ID - 仙
-        self.legendAttrValueListXian = [] # 传奇属性值 - 仙
-        self.legendAttrIDListJi = [] # 传奇属性ID - 极
-        self.legendAttrValueListJi = [] # 传奇属性值 - 极
-        return
     
 def ClearPack(curPlayer, packType):
     ## 清空指定背包
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
index 1667c9c..6d249ee 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
@@ -304,7 +304,7 @@
     GameWorld.DebugLog("物品过期时间" + timeStr)
     return GameWorld.ChangeTimeStrToNum(timeStr)
 
-def CreateSingleItem(itemID, itemCount=1, isAuctionItem=False, expireTime=0):
+def CreateSingleItem(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, setAttrDict=None):
     ''' 创建物品
     @param isAuctionItem: 是否拍品,默认非拍品
     @param expireTime: 有效时间,时间单位由时效类型决定
@@ -356,9 +356,236 @@
     if expireTime > 0:
         curSingleItem.SetUserAttr(ShareDefine.Def_IudetExpireTime, expireTime)
         
+    # 装备
+    if GetIsEquip(curSingleItem):
+        setAttrDict = GetCreateEquipAttr(curSingleItem, curPlayer, setAttrDict)
+        if setAttrDict == None:
+            curSingleItem.Clear()
+            return
+    AddCreateItemAttr(curSingleItem, setAttrDict)
+    
     #这里返回的是SingleItem , 如果创建了,未使用,会找出C++内存泄露!!!
     return curSingleItem
 
+def AddCreateItemAttr(curItem, setAttrDict):
+    ## 设置生成装备所有属性
+    for key, value in setAttrDict.items():
+        key = GameWorld.ToIntDef(key, key)
+        # 需支持
+        # 1. UserData格式: {'19': ['1889', '2034', '893', '927'], '50': ['1702622046'], '17': ['39', '33', '34', '9']}
+        # 2. 自定义字典: {"key":value, ...} key支持自定义或与UserData的key,value支持数值或列表,列表元素支持字符串或数值,均默认转为数值
+        # 数值类型的默认为UserData属性 
+        if isinstance(key, int):
+            if key % 2 == 0: # 偶数是单数值
+                v = 0
+                if isinstance(value, int):
+                    v = value
+                elif (isinstance(value, list) or isinstance(value, tuple)) and value:
+                    v = GameWorld.ToIntDef(value[0], 0)
+                curItem.SetUserAttr(key, v)
+            elif isinstance(value, list) or isinstance(value, tuple): # 单数一定是要列表
+                curItem.ClearUserAttr(key)
+                for v in value:
+                    v = GameWorld.ToIntDef(v, 0)
+                    curItem.AddUserAttr(key, v)
+        # 其他指定字符串类型属性
+        else:
+            GameWorld.Log("###AddCreateItemAttr unknown key:%s, value:%s, itemID=%s" % (key, value, curItem.GetItemTypeID()))
+            
+    MakeEquipGS(curItem)
+    return
+
+def GetCreateEquipAttr(curItem, curPlayer=None, setAttrDict=None):
+    '''获取生成装备所有属性
+    @param curPlayer: 可能为None
+    @param setAttrDict: 直接设置物品的属性 {key:value, ...} key支持  ShareDefine.Def_IudetXXX字符串 或 自定key
+    @return: None - 异常情况,物品实例需要clear
+            equipAttrDict - 生成后的最新属性k:v字典,可直接用于 SetCreateEquipAttr
+    '''
+    if setAttrDict == None:
+        setAttrDict = {}
+    equipAttrDict = {}
+    playerID = 0 if not curPlayer else curPlayer.GetPlayerID()
+    itemID = curItem.GetItemTypeID()
+    
+    appointID = setAttrDict.get(ShareDefine.Def_CItemKey_AppointID)
+    # 定制属性ID
+    if appointID > 0:
+        ipyData = IpyGameDataPY.GetIpyGameData("AppointItem", appointID)
+        if not ipyData:
+            return
+        if ipyData.GetCancelUseLimit():
+            equipAttrDict[str(ShareDefine.Def_IudetCancelUseLimit)] = 1
+        equipAttrDict[str(ShareDefine.Def_IudetItemLV)] = ipyData.GetItemLV()
+        equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = ipyData.GetBaseAttrID()
+        equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = ipyData.GetBaseAttrValue()
+        equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = ipyData.GetLegendAttrID()
+        equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = ipyData.GetLegendAttrValue()
+        GameWorld.DebugLog("    装备定制属性: itemID=%s,appointID=%s,equipAttrDict=%s,setAttrDict=%s" % (itemID, appointID, equipAttrDict, setAttrDict), playerID)
+        return equipAttrDict
+    
+    # 以下为常规生成属性逻辑
+    itemColor = curItem.GetItemColor()
+    equipPlace = curItem.GetEquipPlace()
+    
+    if curPlayer:
+        playerID, playerLV = curPlayer.GetPlayerID(), curPlayer.GetLV()
+    else:
+        playerLV = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
+        GameWorld.DebugLog("生成装备时没有玩家等级, 取当前世界等级! itemID=%s,worldLV=%s" % (itemID, playerLV), playerID)
+        
+    colorIpyData = IpyGameDataPY.GetIpyGameData("EquipColor", itemColor)
+    colorPlaceIpyData = IpyGameDataPY.GetIpyGameData("EquipColorPlace", itemColor, equipPlace)
+    if not colorIpyData or not colorPlaceIpyData:
+        GameWorld.ErrLog("生成装备时找不到对应配置! itemID=%s,itemColor=%s,equipPlace=%s" % (itemID, itemColor, equipPlace), playerID)
+        return
+    GameWorld.DebugLog("随机装备属性! itemID=%s,itemColor=%s,equipPlace=%s,setAttrDict=%s" % (itemID, itemColor, equipPlace, setAttrDict), playerID)
+    
+    itemLV = setAttrDict.get(str(ShareDefine.Def_IudetItemLV), 0)
+    if not itemLV:
+        # 随机等级
+        lowLV, highLV = IpyGameDataPY.GetFuncEvalCfg("EquipRandRule", 1)
+        randLVList = range(max(playerLV - lowLV, 1), playerLV + highLV)
+        itemLV = random.choice(randLVList)
+    equipAttrDict[str(ShareDefine.Def_IudetItemLV)] = itemLV
+    
+    reRatio = 0 # 参考基准值所在比率 0~1
+    lvMin, lvMax = colorIpyData.GetRangeLV() # 品质对应的等级范围
+    if itemLV <= lvMin:
+        reRatio = 0
+    elif itemLV >= lvMax:
+        reRatio = 1
+    else:
+        reRatio = (itemLV - lvMin) / float(lvMax - lvMin)
+    GameWorld.DebugLog("    itemLV=%s,lvMin=%s,lvMax=%s,reRatio=%s,playerLV=%s" % (itemLV, lvMin, lvMax, reRatio, playerLV), playerID)
+    
+    baseAttrIDList = setAttrDict.get(str(ShareDefine.Def_IudetBaseAttrID))
+    baseAttrValueList = setAttrDict.get(str(ShareDefine.Def_IudetBaseAttrValue))
+    # 这里注意None为未指定,支持当空列表[]时为不给该属性
+    if baseAttrIDList != None and baseAttrValueList != None and len(baseAttrIDList) == len(baseAttrValueList):
+        equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = baseAttrIDList
+        equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = baseAttrValueList
+    else:
+        __RandCreateEquipBaseAttr(reRatio, colorPlaceIpyData, equipAttrDict)
+        
+    legendAttrIDList = setAttrDict.get(str(ShareDefine.Def_IudetLegendAttrID))
+    legendAttrValueList = setAttrDict.get(str(ShareDefine.Def_IudetLegendAttrValue))
+    if legendAttrIDList != None and legendAttrValueList != None and len(legendAttrIDList) == len(legendAttrValueList):
+        equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = legendAttrIDList
+        equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = legendAttrValueList
+    else:
+        __RandCreateEquipLegendAttr(reRatio, colorIpyData, equipAttrDict)
+        
+    # 神仙极属性可在这里扩展...
+    
+    GameWorld.DebugLog("    装备最终属性: equipAttrDict=%s,setAttrDict=%s" % (equipAttrDict, setAttrDict), playerID)
+    return equipAttrDict
+
+def __RandCreateEquipBaseAttr(reRatio, colorPlaceIpyData, setAttrDict):
+    ## 随机装备基础属性
+    baseAttrDict = {ShareDefine.Def_Effect_Atk:colorPlaceIpyData.GetRangeAtk(),
+                    ShareDefine.Def_Effect_MaxHP:colorPlaceIpyData.GetRangeHP(),
+                    ShareDefine.Def_Effect_Def:colorPlaceIpyData.GetRangeDef(),
+                    ShareDefine.Def_Effect_AtkSpeed:colorPlaceIpyData.GetRangeAtkSpeed(),
+                    }
+    upDownRateList = IpyGameDataPY.GetFuncEvalCfg("EquipRandRule", 2)
+    baseAttrIDList, baseAttrValueList = [], []
+    for attrID in [ShareDefine.Def_Effect_Atk, ShareDefine.Def_Effect_MaxHP, ShareDefine.Def_Effect_Def, ShareDefine.Def_Effect_AtkSpeed]:
+        valueList = baseAttrDict[attrID]
+        atkValue = __GetRandAttrValueByRatio(valueList, reRatio, upDownRateList)
+        if not atkValue:
+            continue
+        baseAttrIDList.append(attrID)
+        baseAttrValueList.append(atkValue)
+    if baseAttrIDList:
+        setAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = baseAttrIDList
+        setAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = baseAttrValueList
+    GameWorld.DebugLog("    baseAttrIDList=%s,baseAttrValueList=%s" % (baseAttrIDList, baseAttrValueList))
+    return
+
+def __RandCreateEquipLegendAttr(reRatio, colorIpyData, setAttrDict):
+    ## 随机装备传奇属性
+    upDownRateList = colorIpyData.GetRangeRand()
+    battleAttrCount = colorIpyData.GetBattleAttrCount() # 战斗属性条数
+    battleDefAttrCount = colorIpyData.GetBattleDefAttrCount() #战斗抗性条数
+    if not battleAttrCount and not battleDefAttrCount:
+        return
+    
+    # 注: 闪避率-对应原闪避值;抗闪避-对应原命中值
+    battleAttrDict = {ShareDefine.Def_Effect_FaintRate:colorIpyData.GetRangeFaintRate(),
+                      ShareDefine.Def_Effect_SuperHitRate:colorIpyData.GetRangeSuperHitRate(),
+                      ShareDefine.Def_Effect_ComboRate:colorIpyData.GetRangeComboRate(),
+                      ShareDefine.Def_Effect_Miss:colorIpyData.GetRangeMissRate(),
+                      ShareDefine.Def_Effect_AtkBackRate:colorIpyData.GetRangeAtkBackRate(),
+                      ShareDefine.Def_Effect_SuckHPPer:colorIpyData.GetRangeSuckHPPer(),
+                      }
+    battleDefAttrDict = {ShareDefine.Def_Effect_FaintDefRate:colorIpyData.GetRangeFaintDefRate(),
+                         ShareDefine.Def_Effect_SuperHitRateReduce:colorIpyData.GetRangeSuperHitRateReduce(),
+                         ShareDefine.Def_Effect_ComboDefRate:colorIpyData.GetRangeComboDefRate(),
+                         ShareDefine.Def_Effect_Hit:colorIpyData.GetRangeMissDefRate(),
+                         ShareDefine.Def_Effect_AtkBackDefRate:colorIpyData.GetRangeAtkBackDefRate(),
+                         ShareDefine.Def_Effect_SuckHPDefPer:colorIpyData.GetRangeSuckHPDefPer(),
+                         }
+    
+    # 没有配置值的属性不产出,打乱顺序后直接取限制条数前x个即为随机的属性ID
+    # 战斗属性
+    for k, v in battleAttrDict.items():
+        if not v:
+            battleAttrDict.pop(k)
+    battleAttrIDList = battleAttrDict.keys()
+    battleAttrIDList and random.shuffle(battleAttrIDList)
+    battleAttrIDList = battleAttrIDList[:battleAttrCount]
+    batAttrIDList, batAttrValueList= [], []
+    for attrID in battleAttrIDList:
+        atkValue = __GetRandAttrValueByRatio(battleAttrDict[attrID], reRatio, upDownRateList)
+        if not atkValue:
+            continue
+        batAttrIDList.append(attrID)
+        batAttrValueList.append(atkValue)
+    GameWorld.DebugLog("    战斗属性条数=%s,IDList=%s,ValueList=%s" % (battleAttrCount, batAttrIDList, batAttrValueList))    
+    
+    # 战斗抗性
+    for k, v in battleDefAttrDict.items():
+        if not v:
+            battleDefAttrDict.pop(k)
+    battleDefAttrIDList = battleDefAttrDict.keys()
+    battleDefAttrIDList and random.shuffle(battleDefAttrIDList)
+    battleDefAttrIDList = battleDefAttrIDList[:battleDefAttrCount]
+    batDefAttrIDList, batDefAttrValueList= [], []
+    for attrID in battleDefAttrIDList:
+        atkValue = __GetRandAttrValueByRatio(battleDefAttrDict[attrID], reRatio, upDownRateList)
+        if not atkValue:
+            continue
+        batDefAttrIDList.append(attrID)
+        batDefAttrValueList.append(atkValue)
+    GameWorld.DebugLog("    战斗抗性条数=%s,IDList=%s,ValueList=%s" % (battleDefAttrCount, batDefAttrIDList, batDefAttrValueList))
+    
+    # 全部放在传奇属性里
+    legendAttrIDList = batAttrIDList + batDefAttrIDList
+    legendAttrValueList = batAttrValueList + batDefAttrValueList
+    if legendAttrIDList:
+        setAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = legendAttrIDList
+        setAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = legendAttrValueList
+    GameWorld.DebugLog("    legendAttrIDList=%s,legendAttrValueList=%s" % (legendAttrIDList, legendAttrValueList))
+    return
+
+def __GetRandAttrValueByRatio(valueList, reRatio, upDownRateList):
+    ## 根据参考比例随机属性值
+    valueMin, valueMax = valueList
+    if reRatio < 0 or reRatio > 1:
+        # 不合法的参考比例,默认最小值,合法值为0~1,包含0跟1
+        return valueMin
+    diffValue = valueMax - valueMin
+    reValue = valueMin + int(diffValue * reRatio) # 参考值
+    
+    downRate, upRate = upDownRateList
+    randValueMin = int(reValue - math.ceil(diffValue * downRate / 10000.0)) # 至少-1
+    randValueMax = int(reValue + math.ceil(diffValue * upRate / 10000.0)) # 至少+1
+    randValue = random.randint(randValueMin, randValueMax)
+    GameWorld.DebugLog("        valueList=%s,reRatio=%s,upDownRateList=%s,diffValue=%s,reValue=%s,%s~%s,%s" 
+                       % (valueList, reRatio, upDownRateList, diffValue, reValue, randValueMin, randValueMax, randValue))
+    return randValue
+
 def UpdateItemUserData(curItem, updateDict={}, delKeyList=[], isUpdateGS=False):
     ''' 更新物品UserData数据
     @param curItem: IPY_SingleItem 或  IPY_RoleItem
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCompensationTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCompensationTube.py
index 10bd97f..cb15b13 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCompensationTube.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCompensationTube.py
@@ -145,35 +145,18 @@
     for i in xrange(curPackData.Count):
         curPackItem = curPackData.Items[i]
         itemID = curPackItem.ItemID
-        isAuctionItem = curPackItem.IsBind and not auctionItemTimeout
-        if ItemControler.GetAppointItemRealID(itemID):
-            curCreateItem = ItemControler.GetItemByData(ItemControler.GetAppointItemDictData(itemID, isAuctionItem))
-        else:
-            curCreateItem = ItemCommon.CreateSingleItem(itemID, curPackItem.Count, isAuctionItem)
-        if not curCreateItem:
-            GameWorld.ErrLog("OnGMRequestCompensationResult CreateSingleItem %s Err "%itemID)
+        itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
+        if not itemData:
             continue
-        
-        ##UserData包含了追加属性不完整,这里需要补齐
-        userDataCreateTime = 0
-        if curPackItem.UserDataLen: 
-            UserDataDict = eval(curPackItem.UserData)
-            #设置UserData
-            UserData = "%s"%UserDataDict
-            curCreateItem.SetUserData(UserData, len(UserData))
-            userDataCreateTime = curCreateItem.GetUserAttr(ShareDefine.Def_IudetAuctionItemCreateTime)
+        isAuctionItem = curPackItem.IsBind and not auctionItemTimeout
+        setAttrDict = {} if not curPackItem.UserDataLen else eval(curPackItem.UserData)            
+        if not ItemControler.GivePlayerItem(curPlayer, itemID, curPackItem.Count, isAuctionItem, [IPY_GameWorld.rptItem], 
+                                            event=[ChConfig.ItemGive_Mail, False, {"MailGUID":curPackData.GUID}], setAttrDict=setAttrDict):
+            GameWorld.ErrLog("OnGMRequestCompensationResult GivePlayerItem %s False" % itemID)
+            continue
+        if isPaimaiMail and ItemCommon.GetIsEquip(itemData):
+            EventShell.EventRespons_BuyAuctionEquip(curPlayer, itemData.GetItemColor())
             
-        if isAuctionItem and auctionItemCreateTime and not userDataCreateTime:
-            curCreateItem.SetUserAttr(ShareDefine.Def_IudetAuctionItemCreateTime, auctionItemCreateTime)
-            
-        ItemCommon.MakeEquipGS(curCreateItem)
-        
-        if isPaimaiMail and ItemCommon.CheckItemIsEquip(curCreateItem):
-            EventShell.EventRespons_BuyAuctionEquip(curPlayer, curCreateItem.GetItemColor())
-            
-        #放入玩家背包
-        ItemControler.PlayerItemControler(curPlayer).PutInItem(IPY_GameWorld.rptItem, curCreateItem, 
-                                                               event=[ChConfig.ItemGive_Mail, False, {"MailGUID":curPackData.GUID}])
     moneySource = curPackData.MoneySource + ChConfig.Def_GiveMoney_Unknown # 存值时为byte类型,使用时需还原回来
     if curPackData.Gold != 0:
         PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, curPackData.Gold, moneySource)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 790fbfe..4e91bdd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -494,19 +494,15 @@
             combineItemList.append(mailItem)
             continue
         
-        if len(mailItem) != 3:
+        if len(mailItem) < 3:
             continue
         
-        itemID, itemCnt, isAuctionItem = mailItem
-        
-        if ItemControler.GetAppointItemRealID(itemID):
-            # 定制物品转化为物品信息字典
-            appointItemObj = ItemControler.GetItemByData(ItemControler.GetAppointItemDictData(itemID, isAuctionItem))
-            if not appointItemObj:
-                GameWorld.ErrLog("邮件定制物品转化失败!itemID, itemCnt, isAuctionItem" % (itemID, itemCnt, isAuctionItem))
-                continue
-            combineItemList.append(ItemCommon.GetMailItemDict(appointItemObj))
-            appointItemObj.Clear()
+        itemID, itemCnt, isAuctionItem = mailItem[:3]
+        appointID = mailItem[3] if len(mailItem) > 3 else 0
+        if appointID:
+            UserData = {ShareDefine.Def_CItemKey_AppointID:appointID}
+            itemDict = {'ItemID':itemID, 'Count':itemCnt, 'IsAuctionItem':isAuctionItem, 'UserData':UserData}
+            combineItemList.append(str(itemDict))
         elif isAuctionItem:
             combineItemList.append((itemID, itemCnt, isAuctionItem))
         else:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyStore.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyStore.py
index 724d491..38d2799 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyStore.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyStore.py
@@ -251,8 +251,9 @@
     
     # 给物品
     if itemDict:
-        itemDict['IsBind'] = isBind
-        ItemControler.GivePlayerEquip(curPlayer, itemDict, event=[ChConfig.ItemGive_FamilyStore, False, {}])
+        pass
+        #itemDict['IsBind'] = isBind
+        #ItemControler.GivePlayerEquip(curPlayer, itemDict, event=[ChConfig.ItemGive_FamilyStore, False, {}])
     else:
         ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem], 
                                      event=[ChConfig.ItemGive_FamilyStore, False, {}])
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGameEvent.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGameEvent.py
index b9f5639..a8d7a35 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGameEvent.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGameEvent.py
@@ -451,7 +451,7 @@
         ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, 
                                      [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere])
     elif itemType == 1:
-        ItemControler.GivePlayerAppointItem(curPlayer, itemID, False)
+        pass #定制物品
     
     else:
         GameWorld.ErrLog("钓鱼奖励类型不支持itemType=%s" % itemType, curPlayer.GetPlayerID())
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerNewGuyCard.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerNewGuyCard.py
index 643e9e5..86d1b97 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerNewGuyCard.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerNewGuyCard.py
@@ -47,6 +47,7 @@
 import EventReport
 import ItemCommon
 import DataRecordPack
+import ShareDefine
 import PlayerCoin
 
 import md5
@@ -539,12 +540,9 @@
     succGiveItemList = []
     for itemInfo in awardItemList:
         itemID, itemCount, itemBind = itemInfo[:3]
-        isAppoint = itemInfo[3] if len(itemInfo) > 3 else 0
-        
-        if isAppoint:
-            isOK = ItemControler.GivePlayerAppointItem(curPlayer, itemID, False)
-        else:
-            isOK = ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem])
+        appointID = itemInfo[3] if len(itemInfo) > 3 else 0
+        setAttrDict = {ShareDefine.Def_CItemKey_AppointID:appointID}
+        isOK = ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem], setAttrDict=setAttrDict)
         if isOK:
             succGiveItemList.append(itemInfo)
             
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
index 2a05c49..c66182b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -1140,13 +1140,13 @@
     elif equipPlace == ShareDefine.retWing:
         PlayerControl.NotifyCode(curPlayer, 'WingTiyan_Timeout')
         
-    tryItemDict = IpyGameDataPY.GetFuncEvalCfg('FirstGoldTryItem', 1, {})
-    tryItemID = tryItemDict.get(curPlayer.GetJob(), 0)
-    if tryItemID and ItemControler.GetAppointItemRealID(tryItemID) == equipID:
-        #首充试用武器过期并且还没首充的提示()
-        if not curPlayer.GetChangeCoinPointTotal():
-            PlayerControl.NotifyCode(curPlayer, 'FirstGoldWPOver')
-            PlayerGoldGift.FirstGoldTryItemOutTime(curPlayer)
+    #tryItemDict = IpyGameDataPY.GetFuncEvalCfg('FirstGoldTryItem', 1, {})
+    #tryItemID = tryItemDict.get(curPlayer.GetJob(), 0)
+    #if tryItemID and ItemControler.GetAppointItemRealID(tryItemID) == equipID:
+    #    #首充试用武器过期并且还没首充的提示()
+    #    if not curPlayer.GetChangeCoinPointTotal():
+    #        PlayerControl.NotifyCode(curPlayer, 'FirstGoldWPOver')
+    #        PlayerGoldGift.FirstGoldTryItemOutTime(curPlayer)
             
     return True
 #---------------------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index ff9b203..86b41af 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1570,6 +1570,8 @@
 Def_IudetMapLoaction = 15  # 物品记录地图坐标[mapid, posx, posy]
 Def_IudetLegendAttrID = 17  # 物品传奇属性ID列表
 Def_IudetLegendAttrValue = 19  # 物品传奇属性值列表
+Def_IudetBaseAttrID = 21  # 物品基础属性ID列表,适用于随机范围基础属性(非物品表配置的固定属性)
+Def_IudetBaseAttrValue = 23  # 物品基础属性值列表
 Def_IudetPartSuiteLV = 25  # 部位套装等级 [套装类型1等级, 套装类型2等级, ...]
 Def_IudetWingMaterialItemID = 27  # 翅膀精炼材料ID列表
 Def_IudetWingMaterialItemCount = 29  # 翅膀精炼材料个数列表
@@ -1587,6 +1589,7 @@
 Def_IudetItemColor = 16  # 物品颜色,如果该值没有就取物品
 Def_IudetItemCount = 18  # 物品个数,支持20亿,目前仅特殊转化物品会用到
 Def_IudetCancelUseLimit = 20  # 物品取消使用限制
+Def_IudetItemLV = 22  # 物品等级,适用于动态物品等级(非物品表配置的固定等级)
 Def_IudetSource = 24  # 物品来源
 Def_IudetSuiteLV = 30  # 套装等级
 Def_IudetHasOpenCnt = 32  # 物品累积开启次数
@@ -1610,6 +1613,9 @@
 Def_IudetPet_Skill = 201  # 技能列表
 
 Def_IudetHorsePetSkinIndex = 210  # 骑宠觉醒外观索引
+
+# 以下为自定义的设置物品属性key
+Def_CItemKey_AppointID = "AppointID"
 # ----------------------------------------------------
 
 # 宠物物品数据状态

--
Gitblit v1.8.0