[KT] KT2 cần giúp tăng tỷ lệ đúc thần sa

Xin chào anh em!
Mình cần giúp tăng tỷ lệ ra dòng dame khi đúc vũ khí thần sa kiếm thế 2 offline, phải vào file nào để chỉnh cái gì mong anh em giúp đỡ, xin cảm ơn
Mọi người xem dùm phải file này không
Mã:
------------------------------------------------------
-- 文件名 :develop.lua
-- 创建者 :dengyong
-- 创建时间:2012-12-29 11:02:14
-- 描  述  :装备养成逻辑
------------------------------------------------------


Item.tbGradeMaxDevelop 		= {30, 40, 50, 60};		-- 档次下各属性所能最大提升的成长等级
Item.tbDevelopFighPowerRate = {341760, 2142000, 10728000, 54129600};	-- 养成财富与战斗系数比,key是装备档次
Item.tbDevelopGradeOpenDay	= {139, 159, 173, 173};	-- 升档时间限制
Item.MAX_GRADE		   		= 5;					-- 最大档次等级
Item.DEV_PEEL_RET_RATE		= 90;					-- 养成剥离返还90%
Item.DEV_STUFF_BREAK_PRICE	= 5000;					-- 材料拆解单价
Item.RAW_CLASS				= "platinum_raw";
Item.DEV_STUFF_CLASS		= "platinum_stuff";
Item.DEV_OPEN_DAY			= 20130315;
Item.DEV_STUFF_CALC_RATE	= 343;					-- 材料概率成长衰减系数,分母值
Item.DEV_ATTRIB_MAX_LEV		= 300;					-- 成长属性理论最大值
Item.tbNeedcastLevel = {
	--[装备档次]	= {精铸等级要求,不符合时描述}
		[3] = {2, "Vũ khí phải đạt tinh chú cấp 2, nhận được bằng danh vọng Lăng Tần Thủy Hoàng-Phát Khâu Môn."},--进阶3档要1级精铸
		[4] = {3, "Vũ khí phải đạt tinh chú cấp 3 trác việt, nhận được bằng danh vọng Lăng Tần Thủy Hoàng-Phát Khâu Môn."},--进阶4档要2级精铸
		[5] = {4, "Vũ khí phải đạt tinh chú cấp 4 sử thi, nhận được bằng danh vọng Lăng Tần Thủy Hoàng-Phát Khâu Môn."},--进阶5档要3级精铸
	};
Item.DEV_CAST_ADD_LEVEL_TXT = {
	--精铸对养成属性的提升等级显示
	[1] = 2,
	[2] = 5,
	[3] = 10,
	[4] = 3,
}	
Item.tbGradeLvDesc			= {"Vô Hạ", "Phồn Hoa", "Phong Vân", "Kình Tiếu", "Thiên Địa"};
Item.tbDevStuffName 		= {"Vô Hạ Dẫn", "Phồn Hoa Dẫn", "Phong Vân Dẫn", "Kình Tiếu Dẫn", "Thiên Địa Dẫn"};
Item.tbPhyTypeStr			= {"Nội công", "Ngoại công"};
Item.tbPvTypeStr			= {"Chiến", "Hiệp"};
Item.tbBindDesc				= {[0] = "<color=yellow>(Không khóa)<color>", [1] = "<color=yellow>(Khóa)<color>"};
Item.tbRawExchange 			= 
{	-- 索引是P值
	[1980]	= {18,1,1981,1},
	[1981]	= {18,1,1980,1},
}
Item.tbGradeExpectValue 	=
{
	1000000,
	10000000,
	100000000,
	1000000000,	
}
Item.tbRegenStuffNeed = 		-- 重铸所需材料
{
	[1]	= {4, 5, 8, 11, 13},
	[2] = {1, 1, 1, 1, 1},	
};
Item.DEVELOP_PEEL_LIMIT_GRADE	= 3;				-- 3档及以上的装备需要申请方可剥离
Item.ATTRIB_CONT_DEV_STUFF_NEED = 1;				-- 连续性性成长属性升级需要的材料量
Item.tbAttribSkipDevStuffNeed = {4,5,6,7};			-- 跳跃性成长属性升级需要的材料量
Item.tbDevelopGradeRate = {3099, 3264, 3244, 3263};	-- 换档成功率,万分比
Item.tbGradeAttribCount	= {4,5,6,7,8};				-- 各个档次实际属性数量
Item.tbDevStuffRandRate = {1000, 100, 10, 1,};		-- 材料宝箱开启材料的初始概率


Item.tbDevStuffGDP 	= {18,1,1976};		-- 养成材料gdp


Item.DEVELOP_GROWTH_SKIP	= 0;		-- 成长属性跳跃成长类型
Item.DEVELOP_GROWTH_CONT	= 1;		-- 成长属性连续成长类型


Item.DEVELOP_REGEN_ATTRIB_ID   = 1;
Item.DEVELOP_REGEN_ATTRIB_LEV  = 2;


Item.DEVSTUFF_UNBIND_BUFF_ID = 3011;
Item.DEVSTUFF_UNBIND_BUFF_MAX_TIME = 56 * 60 * 60; -- 最大解绑时间
Item.DEVSTUFF_UNBIND_BUFF_VALID_TIME = 48 * 60 * 60; -- 解绑有效时间
Item.TASK_GROUPID_DEVSTUFF_UNBIND = 2241;
Item.TASK_ID_DEVSTUFF_UNBIND	  = 2;


Item.DEV_GRADE_UP_SUCCEED_TIMES		= {3.2, 3.1, 3.1, 3.2}; -- 必成功的倍数
Item.DEV_EQUIP_EXTREN_INDEX			= 12;					-- 扩展配置
Item.MAX_UP_GRADE_FAILD_TIMES		= 4;					-- XXX 次数
Item.DEV_EQUIP_SUPPER_RAND_NEED		= 5;					-- 点睛石洗5攻


Item.c2sFun = Item.c2sFun or {};


----------------------------------------------------材料解绑------------------------------------------------------


-- 切换绑定类型 c2s
function Item:DevStuff_SwitchBind(nPlayerId, nOpType)
	local pPlayer = KPlayer.GetPlayerObjById(nPlayerId);
	if not pPlayer then
		return;
	end
	
	if jbreturn:GetMonLimit(pPlayer) > 0 then
		me.Msg("Không được dùng tính năng này.");
		return;
	end
	
	Item:SwitchBindGift_Trigger(nPlayerId, nOpType, Item.SWITCHBIND_DEVSTUFF);
end


-- 检查物品类型
function Item:DevStuff_SwitchBind_Check(pDropItem)
	if not pDropItem then
		return 0;
	end
	
	if pDropItem.szClass ~= Item.DEV_STUFF_CLASS then
		me.Msg("Hãy đặt vào nguyên liệu Thần Sa khóa!");
		return 0;
	end
	
	if pDropItem.nLevel == 4 then
		me.Msg("Thần Sa-Kình Tiếu Dẫn rất quý giá, hãy giữ lại dùng!");
		return 0;
	end
	
	return 1;
end


-- 解绑成功
function Item:DevStuff_PostUnBind(nCount)
	me.SetTask(self.TASK_GROUPID_DEVSTUFF_UNBIND, self.TASK_ID_DEVSTUFF_UNBIND, 0);
	me.RemoveSkillState(self.DEVSTUFF_UNBIND_BUFF_ID);
	
	Dbg:WriteLog("UnBindDevStuff", "Nhân vật:"..me.szName, "Tài khoản:"..me.szAccount, "Mở khóa thành công "..nCount.." nguyên liệu Thần Sa");
	me.PlayerLog(Log.emKPLAYERLOG_TYPE_JOINSPORT, string.format("Mở khóa %s nguyên liệu Thần Sa.", nCount));
	me.Msg(string.format("Đã mở khóa thành công %s nguyên liệu Thần Sa.", nCount));
end


-- 申请buf
function Item:ApplyDevStuffUnBind()
	local nTime = me.GetTask(self.TASK_GROUPID_DEVSTUFF_UNBIND, self.TASK_ID_DEVSTUFF_UNBIND);
	local nCurTime = GetTime();
	if nTime > 0 and (nCurTime - nTime) < Item.DEVSTUFF_UNBIND_BUFF_MAX_TIME then
		me.Msg("Bạn đã đăng ký.")
		return;
	end
	local nRet = me.AddSkillState(self.DEVSTUFF_UNBIND_BUFF_ID, 1, 2, self.DEVSTUFF_UNBIND_BUFF_MAX_TIME * Env.GAME_FPS, 1, 0, 1)
	if nRet == 1 then
		me.SetTask(self.TASK_GROUPID_DEVSTUFF_UNBIND, self.TASK_ID_DEVSTUFF_UNBIND, GetTime());
		me.Msg("Bạn đã đăng ký mở khóa nguyên liệu Thần Sa.");
		me.CallClientScript({"Ui:ServerCall", "UI_EQUIPCOMPOSE", "OnEventResult", Item.ENHANCE_MODE_DEVSTUFF_UNBIND});
	end
end


Item.c2sFun["ApplyDevStuffUnBind"] = Item.ApplyDevStuffUnBind;


-- 取消buf
function Item:CancelDevStuffUnBind()
	if me.GetTask(self.TASK_GROUPID_DEVSTUFF_UNBIND, self.TASK_ID_DEVSTUFF_UNBIND) <= 0 then
		me.Msg("Bạn chưa đăng ký, không thể hủy.")
		return;
	end
	me.SetTask(self.TASK_GROUPID_DEVSTUFF_UNBIND, self.TASK_ID_DEVSTUFF_UNBIND, 0);
	me.RemoveSkillState(self.DEVSTUFF_UNBIND_BUFF_ID);
	me.Msg("Bạn đã hủy đăng ký mở khóa nguyên liệu Thần Sa.");
	me.CallClientScript({"Ui:ServerCall", "UI_EQUIPCOMPOSE", "OnEventResult", Item.ENHANCE_MODE_DEVSTUFF_UNBIND});
end


Item.c2sFun["CancelDevStuffUnBind"] = Item.CancelDevStuffUnBind;


function Item:CheckDevelopCommon(pItem)
	if me.IsAccountLock() ~= 0 then
		return 0, "Tài khoản đang bị khóa, không thể thao tác!";
	end
	if MODULE_GAMESERVER then
		if Account:Account2CheckIsUse(me, 7) == 0 then
			return 0, "Bạn đang đăng nhập trò chơi bằng mật mã phụ, không thể thực hiện thao tác này!";
		end
		local tbDevelopReGen = me.GetTempTable("Item").tbDevelopReGen;
		if tbDevelopReGen and pItem and tbDevelopReGen.dwEquipId == pItem.dwId then
			return 0, "";
		else
			me.GetTempTable("Item").tbDevelopReGen = nil;
		end
	end
	return 1;
end


----------------------------------------------------属性成长------------------------------------------------------


-- 养成一条属性:养成装备、要养成属性的索引
function Item:DevelopAttrib(pItem, nIndex)
	local nRet, var = self:CheckCanDevelopAttrib(pItem, nIndex);
	if nRet ~= 1 then
		me.Msg(var);
		return 0;
	end
	
	-- 做随机操作,并扣除材料
	local nRes, var, var2 = self:CalcAttribDevelop(pItem, nIndex);
	local nLogRes = 0;
	if nRes == 1 then
		local nNewLevel = var;
		local nDevLev = pItem.GetAttribDevelopInfo(nIndex);
		pItem.SetAttribDevelopInfo(nIndex, nNewLevel);
		nRet = pItem.Regenerate(
			pItem.nGenre, 
			pItem.nDetail,
			pItem.nParticular, 
			pItem.nLevel,
			pItem.nSeries,
			pItem.nEnhTimes,
			pItem.nLucky,
			pItem.GetGenInfo(),
			0,
			pItem.dwRandSeed,
			pItem.nStrengthen);
			
		if nRet ~= 1 then
			pItem.SetAttribDevelopInfo(nIndex, nDevLev);
			local szLog = string.format("[%d] dưỡng thành thất bại, tái lập thành %d", nIndex, nDevLev);
			Dbg:WriteLog("EquipDevelop", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Regenerate vật phẩm thất bại,"..szLog);
			nLogRes = -1;
		else
			if var2 and type(var2) == "number" and var2 >= 1 then
				pItem.Bind(var2);
			end
			
			nLogRes = 1;
			local szMsg = string.format("Thành công, thuộc tính thứ %d tăng <color=gold>%d cấp<color>, đạt <color=gold>%d<color>", 
				nIndex, nNewLevel - nDevLev, nNewLevel);
			me.Msg(szMsg);			
			Dialog:SendBlackBoardMsg(me, szMsg);
			
			-- 排行榜
			self:ApplyDevelopLadder(pItem);
		end
	else
		me.Msg(var);
		Dialog:SendBlackBoardMsg(me, var);
		if nRes == 0 then	-- 流程被打断了
			return 0;
		end
		nLogRes = 0;	-- 现在才是真正的失败
	end
	
	-- 埋点
	local tbNeed = Item:GetAttribDevelopNeed(pItem.nDevelopGrade) or {};
	local szLog = string.format("%s,%d", pItem.SzGDPL("_"), nLogRes);
	for _, tbInfo in pairs(tbNeed) do
		szLog = szLog..string.format(",%d_%d_%d_%d,%d", unpack(tbInfo));
	end
	StatLog:WriteStatLog("stat_info", "platinum","develop", me.nId, szLog);
	
	return nLogRes == 1 and 1 or 0;
end


-- 判断某条属性是否可激活:养成装备、要养成属性的索引
function Item:CheckCanDevelopAttrib(pItem, nIndex)
	local nRet, var = self:CheckDevelopCommon(pItem)
	if nRet == 0 then
		return nRet, var;
	end
	
	-- 是养成装备
	if pItem.IsDevelopEquip() == 0 then
		return 0, "Chỉ có vũ khí Thần Sa mới có thể dưỡng thành thuộc tính";
	end
	
	local nDevelopGrade = pItem.nDevelopGrade;
	if nDevelopGrade >= self.MAX_GRADE then
		return 0, "Trang bị đã đạt cấp cao nhất, không cần dưỡng thành tiếp!";
	end
	
	local nDevLev = pItem.GetAttribDevelopInfo(nIndex);
	if not nDevLev or nDevLev == -1 then
		return 0, "Hãy chọn đúng thuộc tính";
	elseif nDevLev >= self.tbGradeMaxDevelop[nDevelopGrade] then
		return 0, "Thuộc tính đã đạt cấp cao nhất, vũ khí thăng cấp mới được dưỡng thành tiếp";
	end
	
	-- 查找所需材料
	local nGrowthType = self:GetAttribGrowthType(pItem, nIndex);
	if not nGrowthType then
		return 0, "Số liệu trang bị bị lỗi!";
	end
	
	local tbNeed = self:GetAttribDevelopNeed(nDevelopGrade, nGrowthType);
	local nRet, var, varBindTips = self:IsMaterialEngouh(tbNeed, pItem.IsBind());
	if nRet == 0 then
		return 2, string.format("Tăng thuộc tính cần nguyên liệu %s không đủ!", var)
	end
	
	return 1, var, varBindTips;
end


-- 计算装备某条属性本次养成需要相关材料
-- 返回值:{ {g,d,p,l, n}, ..., {g,d,p,l, n} }
function Item:GetAttribDevelopNeed(nDevelopGrade, nGrowthType)	
--	local nCount = 0;
--	if nGrowthType == self.DEVELOP_GROWTH_CONT then
--		nCount = self.ATTRIB_CONT_DEV_STUFF_NEED;
--	elseif nGrowthType == self.DEVELOP_GROWTH_SKIP then
--		nCount = self.tbAttribSkipDevStuffNeed[nDevelopGrade] or 0;
--	end
	local nCount = self.ATTRIB_CONT_DEV_STUFF_NEED;
	
	if nCount == 0 then
		return;
	end


	local tb = 
	{
		{self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3], nDevelopGrade, nCount};
	}
	
	local nValue = 0;
	for _, tbNeed in pairs(tb) do
		local tbBaseInfo = KItem.GetItemBaseProp(unpack(tbNeed, 1, 4));
		if tbBaseInfo then
			nValue = nValue + tbBaseInfo.nValue * nCount;
		end
	end
	
	return tb, nValue;
end


-- 计算属性养成操作结果
-- 返回值:如果不可养成:0、不可原因;如果可以养成且成功:1、养成后属性提升等级;
-- 如果可以养成但失败:2;
function Item:CalcAttribDevelop(pItem, nIndex)
	local nDevelopGrade = pItem.nDevelopGrade;
	local nGrowthType = self:GetAttribGrowthType(pItem, nIndex);
	if not nGrowthType then
		return 0, "Hệ thống bị lỗi, hãy liên hệ hỗ trợ!";
	end
	
	local tbNeed, nValue = self:GetAttribDevelopNeed(nDevelopGrade, nGrowthType);
	if not tbNeed then
		return 0, "Nguyên liệu bị lỗi";
	end
	
	-- 查找材料是否满足
	local nRet, szDesc = self:IsMaterialEngouh(tbNeed);
	if nRet == 0 then
		return nRet, string.format("Tăng thuộc tính cần nguyên liệu %s không đủ!", szDesc);
	end
	
	-- 说明可以养成了,计算养成成功率及成功提升等级
	local nCurLv = pItem.GetAttribDevelopInfo(nIndex);
	local nRet, tbRate = self:GetAttribDevSetting(nDevelopGrade, nCurLv, nValue, nGrowthType);
	if nRet == 0 then
		return 0, "Hệ thống bị lỗi, hãy liên hệ hỗ trợ!";
	end
	
	-- 扣除材料
	local nRet, bWithBind = self:ConsumeItems(tbNeed, Player.emKLOSEITEM_DEVELOP_ATTRIB, pItem.IsBind());
	if nRet == 0 then
		return 0, "Trừ nguyên liệu thất bại";
	end
	
	local nRand = MathRandom(10^6);
	local nRandLevel = 0;
	for nLev, nRate in pairs(tbRate) do
		if nRand <= nRate then
			nRandLevel = nLev;
			break;
		else
			nRand = nRand - nRate;
		end
	end
	
	if nRandLevel > nCurLv then
		return 1, nRandLevel, bWithBind;
	end
	
	-- 否则是失败了
	return 2, "Dưỡng thành thất bại";
end


-- 返回值:tbRate几率表,索引表示提升等级,值表示提升几率(索引为0时表示失败)
function Item:GetAttribDevSetting(nDevelopGrade, nCurLv, nValue, nGrowthType)
	local nRet, varRate;
--	if nGrowthType == self.DEVELOP_GROWTH_CONT then
--		nRet, varRate = self:_CalcAttribDevelopRate_Cont(nDevelopGrade, nCurLv, nValue);
--	elseif nGrowthType == self.DEVELOP_GROWTH_SKIP then
--		nRet, varRate = self:_CalcAttribDevelopRate_Skip(nDevelopGrade, nCurLv, nValue);
--	else
--		assert(false);
--	end	
	nRet, varRate = self:_CalcAttribDevelopRate_Cont(nDevelopGrade, nCurLv, nValue);
	
	if nRet == 0 then
		return 0;
	end
	
	return nRet, varRate;
end


function Item:GetAttribGrowthType(pItem, nIndex)
	-- 是否是连续养成的
	local nAttSettingId = self:GetDevelopAttribSettingId(pItem, nIndex);
	local tbSetting = KItem.GetDevelopMASetting(nAttSettingId);
	if not tbSetting then
		return;
	end
	
	local nGrowthType = tbSetting.nGrowthType;
	return nGrowthType;
end


----------------------------------------------------装备升档------------------------------------------------------


-- 装备升档
function Item:DevelopGrade(pItem, nSucceed)
	local nRet, var = self:CheckCanDevelopGrade(pItem, nSucceed);
	if nRet ~= 1 then
		me.Msg(var);
		return 0;
	end


	local szOldItemName = pItem.szName;
	-- 升档会清除装备之前记录的属性养成值	
	local tbDevInfo = pItem.GetAttribDevelopInfo();
	if not tbDevInfo then
		return 0;
	end
	local tbDevInfoNew = {};
	for i = 1, #tbDevInfo do 
		tbDevInfoNew[i] = 0;
	end


	-- 获取对应升档道具信息
	local tbGradeInfo = self:GetGradeSetting(pItem);
	if not tbGradeInfo or #tbGradeInfo == 0 then
		return 0;
	end
	
	local nFaildTimes = self:GetDevEquipUpGradeFaildTimes(pItem);
	-- 消耗物品,并随机
	local nRet, var = self:CalcGradeDevelop(pItem.nDevelopGrade, pItem.IsBind(), nFaildTimes, nSucceed);
	local nLogRes = 0;
	local szOldGDPL = pItem.SzGDPL("_");
	local nOldDevelop = pItem.nDevelopGrade;
	if nRet == 1 then
		pItem.SetAttribDevelopInfo(-1, tbDevInfoNew);
		local nRet = pItem.Regenerate(
			tbGradeInfo[1], 
			tbGradeInfo[2],
			tbGradeInfo[3], 
			tbGradeInfo[4],
			pItem.nSeries,
			pItem.nEnhTimes,
			pItem.nLucky,
			pItem.GetGenInfo(),
			0,
			pItem.dwRandSeed,
			pItem.nStrengthen);
		
		if nRet ~= 1 then
			pItem.SetAttribDevelopInfo(-1, tbDevInfo);
			local szLog = string.format("Tăng trang bị [%s] thất bại", pItem.SzGDPL());
			Dbg:WriteLog("DevelopGrade", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Regenerate vật phẩm thất bại,"..szLog);
			nLogRes = -1;
		else
			if var and type(var) == "number" and var == 1 then
				pItem.Bind(var);
			end
			
			-- 尝试自动对其属性备份
			if (self:AutoUpdateDevWeaponBackupData(pItem) == 1) then
				--local szDate = os.date("%Y年%m月%d日%H时%M分", GetTime());
				Player:__AlterMsg(me, "Tiến cấp thành công! Thuộc tính của vũ khí đã được cập nhật đồng bộ");
			end
							
			local szMsg1 = string.format("<color=gold>%s<color> đã tiến cấp thành <color=gold>%s<color>!!!", szOldItemName, pItem.szName);
			me.Msg(szMsg1);
			Dialog:SendBlackBoardMsg(me, szMsg1);
			-- 家族、好友公告
			local szMsg2 = string.format("<color=gold>%s<color> đã tăng cấp thành <color=gold>%s<color>", szOldItemName, pItem.szName);
			Player:SendMsgToKinOrTong(me,szMsg2, 1);
			me.SendMsgToFriend("Hảo hữu của bạn"..me.szName..szMsg2);	
			if pItem.nDevelopGrade == 4 then
				Dialog:SendInfoBoardMsg(me, szMsg1)-- 屏幕中央黄色
			elseif pItem.nDevelopGrade == Item.MAX_GRADE then
				--Dialog:GlobalNewsMsg_GS("恭喜"..me.szName..szMsg2)	-- 全服公告
				GCExcute({"Dialog:GlobalNewsMsg_GC", "Chúc mừng"..me.szName..szMsg2});
			end
			self:SetDevEquipUpGradeFaildTimes(pItem, 0);
			nLogRes = 1;
		end
		pItem.Sync();
	else
		me.Msg(var);
		Dialog:SendBlackBoardMsg(me, var);
		if nRet == 0 then
			return 0;
		end
		nLogRes = 0;
		
		self:SetDevEquipUpGradeFaildTimes(pItem, nFaildTimes + 1);
	end
	
	-- 排行榜
	self:ApplyDevelopLadder(pItem);
	
	-- 埋点
	local tbNeed = Item:GetGradeDevelopNeed(nOldDevelop, nSucceed) or {};
	local szLog = string.format("%s,%d", szOldGDPL, nLogRes);
	for _, tbInfo in pairs(tbNeed) do
		szLog = szLog..string.format(",%d_%d_%d_%d,%d", unpack(tbInfo));
	end
	StatLog:WriteStatLog("stat_info", "platinum","udpate_lv", me.nId, szLog);
	
	Dbg:WriteLog("DevelopGrade", "Tăng cấp", me.szAccount, me.szName, pItem.szGUID, self:GetRegenInfoLog(pItem.GetGenInfo(), pItem.nDevelopGrade));
	
	return nLogRes == 1 and 1 or 0;
end


-- 判断是否可升档
function Item:CheckCanDevelopGrade(pItem, nSucceed)
	local nRet, var = self:CheckDevelopCommon(pItem)
	if nRet == 0 then
		return nRet, var;
	end
	
	-- 是养成装备
	if pItem.IsDevelopEquip() == 0 then
		return 0, "Hãy đặt vào toàn bộ vũ khí Thần Sa có cấp dưỡng thành tối đa";
	end
	
	local nDevelopGrade = pItem.nDevelopGrade;	
	if nDevelopGrade >= self.MAX_GRADE then
		return 0, "Trang bị đã đạt cấp cao nhất";
	end
	
	-- 检查武器升档时间
	local bTimeFrameLevel119 = TimeFrame:IsOpenLevel119();
	if bTimeFrameLevel119 == 1 then
		local nNeedDay = self.tbDevelopGradeOpenDay[nDevelopGrade];
		local nServerOpenDay = TimeFrame:GetServerOpenDay();
		if nNeedDay > nServerOpenDay then
			return 0, string.format("Ngày mở server thứ %s, vũ khí của bạn mới có thể tăng cấp tới %s",nNeedDay,self.tbGradeLvDesc[nDevelopGrade]);
		end
	end
	-- 所有属性达档次最高级
	local tbAttrib = pItem.GetAttribDevelopInfo();
	if not tbAttrib then
		return 0, "Số liệu trang bị bị lỗi, hãy liên hệ hỗ trợ!";
	end
	for i, nDevLev in pairs(tbAttrib) do
		if nDevLev ~= -1 and nDevLev < self.tbGradeMaxDevelop[nDevelopGrade] then
			return 0, "Thuộc tính dưỡng thành chưa đạt tối đa, không thể tăng thành vũ khí Thần Sa cấp cao hơn";
		end
	end
	
	-- 档次未达上限 升级到4档要卓越,升级到5档要史诗
	if self.tbNeedcastLevel[nDevelopGrade+1] then
		local nCastLev = pItem.GetEquipExValue(self.ITEM_TASKVAL_EX_SUBID_CastLevel);
		local nActualCastLev = self.tbWeaponCastLevSor[nCastLev] or 0;
		if nActualCastLev < self.tbNeedcastLevel[nDevelopGrade+1][1] then
			return 2, self.tbNeedcastLevel[nDevelopGrade+1][2];
		end
		
	end	
	
	-- 查找所需材料
	local tbNeed = Item:GetGradeDevelopNeed(nDevelopGrade, nSucceed);
	local nRet, szDesc, varBindTips = self:IsMaterialEngouh(tbNeed, pItem.IsBind());
	if nRet == 0 then
		return 2, string.format("Nguyên liệu %s không đủ!", szDesc);
	end
	
	return 1, varBindTips;
end


function Item:CalcGradeDevelop(nDevelopGrade, bBind, nFaildTimes, nSucceed)
	local nRate = self:GetGradeDevelopRate(nDevelopGrade);
	if not nRate then
		return 0, "Hệ thống bị lỗi, hãy liên hệ hỗ trợ!";
	end
	
	-- 先消耗
	local tbNeed = Item:GetGradeDevelopNeed(nDevelopGrade, nSucceed);
	local nRet, bWithBind = self:ConsumeItems(tbNeed, Player.emKLOSEITEM_DEVELOP_GRADE, bBind);
	if nRet == 0 then
		return 0, "Trừ nguyên liệu thất bại";
	end
	
	-- 再随机
	if nFaildTimes < self.MAX_UP_GRADE_FAILD_TIMES and (not nSucceed or nSucceed ~= 1) then
		local nRand = MathRandom(10000);		-- 因为概率是用万分比表示的,所以在10000内随机
		if nRand > nRate then
			return 2, "Tăng cấp thất bại";
		end
	end


	return 1, bWithBind;
end


-- 升档成功概率,万分比
function Item:GetGradeDevelopRate(nDevelopGrade)
	return self.tbDevelopGradeRate[nDevelopGrade];
end


function Item:GetGradeDevelopNeed(nGrade, nSucceed)
	local tbNeed = 
	{
		{ {self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3],1, 9}, },
		{ {self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3],2, 10}, },
		{ {self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3],3, 14}, },
		{ {self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3],4, 18}, },
	}
	
	local tbRetNeed = tbNeed[nGrade];
	if nSucceed and nSucceed == 1 then
		for _, _tbNeed in ipairs(tbRetNeed) do
			_tbNeed[5] = math.ceil(_tbNeed[5] * self.DEV_GRADE_UP_SUCCEED_TIMES[nGrade]);
		end
	end
	
	return tbRetNeed;
end


-- 获取升到下一档的道具的GDPL
function Item:GetGradeSetting(pItem)
	local nDevelopGrade = pItem.nDevelopGrade;
	if not self.tbDevelopGradeSetting or 
		not self.tbDevelopGradeSetting[nDevelopGrade] or
		not self.tbDevelopGradeSetting[nDevelopGrade + 1] then
		return;
	end
	
	local szGDPL = pItem.SzGDPL();
	local nGradeIndex = 0;
	for i, szItemId in pairs(self.tbDevelopGradeSetting[nDevelopGrade] or {}) do
		if szGDPL == szItemId then
			nGradeIndex = i;
			break;
		end
	end
	local szInfo = self.tbDevelopGradeSetting[nDevelopGrade + 1][nGradeIndex];
	local tbGradeInfo = Lib:SplitStr(szInfo or "");
	for i, v in pairs(tbGradeInfo) do
		tbGradeInfo[i] = tonumber(v);
	end
	
	return tbGradeInfo;
end
----------------------------------------------------重随属性------------------------------------------------------
function Item:ReGenDevelopAttrib(pItem, nGenFlag)
	local nPhyType, nPvType = self:GetDevelopAttribType(pItem);
	if not nPhyType or not nPvType then
		return 0;
	end
	
	if nGenFlag < self.DEVELOP_REGEN_ATTRIB_ID or 
	   nGenFlag > self.DEVELOP_REGEN_ATTRIB_LEV  then
	   	return 0;
	end
	
	local nRet, var = Item:CheckCanRegenAttrib(pItem, nGenFlag);
	if nRet == 0 then
		me.Msg(var);
		return 0;
	end
	
	local nSupperDevEquip = 0;
	if nGenFlag == self.DEVELOP_REGEN_ATTRIB_ID then
		if type(var) ~= "number" then
			return 0;
		end
		
		nSupperDevEquip = var;
	end
	
	local tbNewGenInfo = KItem.ReGenerateDevelopBaseAttrib(
		nGenFlag,
		pItem.nSeries,
		nPhyType,
		nPvType,
		pItem.nDevelopGrade,
		pItem.GetGenInfo(),
		{},
		0
	);
	if not tbNewGenInfo then
		return 0;
	end


	-- 消耗!!! 一个重铸符,一个材料	
	local tbNeed = self:GetReGenNeed(pItem, nGenFlag);
	local nRet, bWithBind = self:ConsumeItems(tbNeed, Player.emKLOSEITEM_REGEN_DEVELOP_ATTRIB, pItem.IsBind());
	if nRet == 0 then
		return 0;
	end
	
	--TODO:不用检查以前的缓存变量吗??
	local tbTemplate = me.GetTempTable("Item");
	tbTemplate.tbDevelopReGen = {};
	local tbDevelopReGen = {};
	tbDevelopReGen.dwEquipId = pItem.dwId;
	tbDevelopReGen.tbNewGenInfo = tbNewGenInfo;
	tbDevelopReGen.nBind = math.max(pItem.IsBind(), bWithBind or 0);
	tbDevelopReGen.nGenFlag = nGenFlag;
	tbTemplate.tbDevelopReGen = tbDevelopReGen;	
	
	-- 移除buff
	if nSupperDevEquip == 1 then
		self:RemoveEnhBuff();
	end
	
	self:SetDevEquipUpGradeFaildTimes(pItem, 0);
	tbNewGenInfo[self.DEV_EQUIP_EXTREN_INDEX] = 0;
	
	-- 埋点
	local szLog = string.format("%s,%d", pItem.SzGDPL("_"), nGenFlag);
	for _, tbInfo in pairs(tbNeed) do
		szLog = szLog..string.format(",%d_%d_%d_%d,%d", unpack(tbInfo));
	end
	StatLog:WriteStatLog("stat_info", "platinum","recasting", me.nId, szLog);
	
	return 1, tbNewGenInfo;		-- 把新属性表返回,同步给客户端作展示用
end


-- nOperate:0、关闭UI,1、选择旧装备,2、选择新装备
function Item:ReGenDevelopConfirm(dwId, nOperate)
	if nOperate == 3 then
		me.GetTempTable("Item").tbDevelopReGen = nil;
		return 0;
	end
	
	local tbTemplate = me.GetTempTable("Item");
	local tbDevelopReGen = tbTemplate.tbDevelopReGen;
	if not tbDevelopReGen or tbDevelopReGen.dwEquipId ~= dwId then
		return 0;
	end
	local pItem = KItem.GetObjById(dwId);
	if not pItem then
		return 0;
	end


	local szRegenInfoLog = string.format("Loại tái lập: %d, kết quả tái lập: %s", tbDevelopReGen.nGenFlag, 
		self:GetRegenInfoLog(tbDevelopReGen.tbNewGenInfo, pItem.nDevelopGrade));


	if nOperate == 2 then		-- 选择新装备			
		local nRet = pItem.Regenerate(
			pItem.nGenre, 
			pItem.nDetail,
			pItem.nParticular, 
			pItem.nLevel,
			pItem.nSeries,
			pItem.nEnhTimes,
			pItem.nLucky,
			tbDevelopReGen.tbNewGenInfo,
			0,
			pItem.dwRandSeed,
			pItem.nStrengthen);
			
		if nRet == 0 then
			Dbg:WriteLog("ReGenDevelopAttrib", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Regenerate đạo ** thất bại, tái lập thuộc tính trưởng thành thất bại."..szRegenInfoLog);
			return 0;
		end	
		pItem.Bind(tbDevelopReGen.nBind);
		self:ApplyDevelopLadder(pItem);
		
		local szLog = string.format("Tái lập thuộc tính trang bị {%s_%d}, chọn trang bị đúc mới. %s", pItem.szName, tbDevelopReGen.nGenFlag, szRegenInfoLog);
		me.PlayerLog(Log.emKITEMLOG_TYPE_USE, szLog);
		Dbg:WriteLog("ReGenDevelopAttrib", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Chọn trang bị đúc ["..nOperate.."]."..pItem.szGUID..szRegenInfoLog);
		
		if tbDevelopReGen.nGenFlag == Item.DEVELOP_REGEN_ATTRIB_ID then
			Player:__AlterMsg(me, "Đúc thành công! Nếu vũ khí này có <color=green>giá trị lưu<color>, cần thực hiện <color=green>thao tác lưu<color> lần nữa.");
		end
	elseif nOperate == 0 or nOperate == 1 then	-- 选择取消或旧装备
		local szLog = string.format("Tái lập thuộc tính trang bị {%s_%d}, hủy trang bị đúc mới. %s", pItem.szName, tbDevelopReGen.nGenFlag, szRegenInfoLog);
		me.PlayerLog(Log.emKITEMLOG_TYPE_USE, szLog);
		Dbg:WriteLog("ReGenDevelopAttrib", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Hủy đúc trang bị ["..nOperate.."]."..pItem.szGUID..szRegenInfoLog);
	else
		Dbg:WriteLog("ReGenDevelopAttrib", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Yêu cầu thao tác không đúng ["..nOperate.."]."..pItem.szGUID..szRegenInfoLog);
	end	
	
	-- 置空缓存数据
	tbTemplate.tbDevelopReGen = nil;
end


function Item:CheckCanRegenAttrib(pItem, nGenFlag)
	local nRet, var = self:CheckDevelopCommon()
	if nRet == 0 then
		return nRet, var;
	end
	
	local tbNeed = self:GetReGenNeed(pItem, nGenFlag);
	local nRet, szDesc = self:IsMaterialEngouh(tbNeed);
	if nRet == 0 then
		return 0, string.format("Đúc %s cần nguyên liệu %s không đủ!", 
			nGenFlag == Item.DEVELOP_REGEN_ATTRIB_ID and "Loại" or "Cấp",
			szDesc);
	end
	
	-- 极品武器检查
	local nSupperDevEquip = 0;
	if MODULE_GAMESERVER and nGenFlag == Item.DEVELOP_REGEN_ATTRIB_ID then
		nSupperDevEquip = self:IsSupperDevEquip(pItem);
		if nSupperDevEquip == 1 then
			local nRet, var = self:CheckDevelopPeelTime("Đúc vũ khí Thần Sa cực phẩm");
			if nRet ~= 1 then
				return 0, var or "";
			end
		end
	end
	
	return 1, nSupperDevEquip;
end


-- 对应等级材料一枚,重铸符一枚
function Item:GetReGenNeed(pItem, nGenFlag)
	local nStuffLev = pItem.nDevelopGrade;
	if self:IsItemDeveloped(pItem) == 0 then
		nStuffLev = nStuffLev - 1;
	end	
	nStuffLev = nStuffLev > 0 and nStuffLev or 1;
	
	if not self.tbRegenStuffNeed[nGenFlag] or 
		not self.tbRegenStuffNeed[nGenFlag][pItem.nDevelopGrade] then
		return;		
	end
	local nStuffCount = self.tbRegenStuffNeed[nGenFlag][pItem.nDevelopGrade]
	
	local tb = 
	{
		{self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3],nStuffLev,nStuffCount},
		--{18,1,1199,1,1},		-- 重铸符
	};
	
	return tb;
end
----------------------------------------------------养成传承------------------------------------------------------
function Item:DevelopInherit(pDstItem, tbSrcItem)
	if not tbSrcItem or #tbSrcItem ~= 1 then
		me.Msg("Hãy đặt vào đúng đạo **");
		return 0;
	end
	local pSrcItem = tbSrcItem[1];
	
	local nRet, var = self:CheckCanDevelopInherit(pSrcItem, pDstItem);
	if nRet == 0 then
		me.Msg(var);
		return 0;
	end
	
	if type(var) ~= "number" then
		return 0;
	end
	
	local nSupperDevEquip = var;
	
	local tbNeed = self:GetDevelopInheritNeed(pSrcItem);
	-- TODO:被传承的武器会根据消耗的材料进行绑定 对源武器没有影响
	local nRet, bWithBind = self:ConsumeItems(tbNeed, Player.emKLOSEITEM_DEVELOP_INHERIT, pDstItem.IsBind());
	if nRet == 0 then
		me.Msg("Trừ nguyên liệu thất bại");
		return 0;
	end
	local tbSrcGrade, tbDstGrade = self:GetDevelopInheritGradeInfo(pSrcItem, pDstItem);
	if not tbSrcGrade or #tbSrcGrade == 0 or
		 not tbDstGrade or #tbDstGrade == 0  then
		return 0;
	end
	
	local szSrcGDPL, szDstGDPL = pSrcItem.SzGDPL("_"), pDstItem.SzGDPL("_");
	
	-- 先清除源道具的信息, 养成全变0并降至1档
	local tbOrgDevInfo = pSrcItem.GetAttribDevelopInfo();
	local tbNewDevInfo = {};
	for i = 1, #tbOrgDevInfo do
		tbNewDevInfo[i] = 0;
	end
	pSrcItem.SetAttribDevelopInfo(-1, tbNewDevInfo);
	local tbSrcNewGenInfo = pSrcItem.GetGenInfo();
	if pSrcItem.nDevelopGrade > 1 then		-- 1档以上的武器重随属性类型
		tbSrcNewGenInfo = self:GetRegenInfo(
			pSrcItem, 1,  Item.DEVELOP_REGEN_ATTRIB_ID		-- 随机属性类型,等级不变化
		);
	end
	if not tbSrcNewGenInfo then
		return 0;
	end
	
	local szSrcRegenInfoLog = string.format("Thuộc tính vũ khí gốc [%s%s] trước khi kế thừa: %s, sau khi kế thừa: %s.", pSrcItem.szName, pSrcItem.szGUID,
		self:GetRegenInfoLog(pSrcItem.GetGenInfo(), pSrcItem.nDevelopGrade), 
		self:GetRegenInfoLog(tbSrcNewGenInfo, 1) );
			
	-- 移除buff
	if nSupperDevEquip == 1 then
		self:RemoveEnhBuff();
	end
	
	local nRet = pSrcItem.Regenerate(
		tbSrcGrade[1], 
		tbSrcGrade[2],
		tbSrcGrade[3], 
		tbSrcGrade[4],
		pSrcItem.nSeries,
		pSrcItem.nEnhTimes,
		pSrcItem.nLucky,
		tbSrcNewGenInfo, --pSrcItem.GetGenInfo(),
		0,
		pSrcItem.dwRandSeed,
		pSrcItem.nStrengthen);


	if nRet == 0 then
		pSrcItem.SetAttribDevelopInfo(-1, tbOrgDevInfo);
		local szLog = string.format("Regenerate đạo ** gốc [%s%s] thất bại, quay lại! %s", pSrcItem.szName, pSrcItem.szGUID, szSrcRegenInfoLog);
		Dbg:WriteLog("DevelopInherit", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, szLog);
		return 0;
	end
	self:ApplyDevelopLadder(pSrcItem);
	pSrcItem.Sync();
	Dbg:WriteLog("DevelopInherit", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Trang bị gốc Regenerate thành công,"..szSrcRegenInfoLog);	
	
	-- 再应用目标道具的信息
	local szOldDstItemInfo = self:GetRegenInfoLog(pDstItem.GetGenInfo(), pDstItem.nDevelopGrade);
	local tbGradeInfo = {};
	pDstItem.SetAttribDevelopInfo(-1, tbOrgDevInfo);
	nRet = pDstItem.Regenerate(
		tbDstGrade[1], 
		tbDstGrade[2],
		tbDstGrade[3], 
		tbDstGrade[4],
		pDstItem.nSeries,
		pDstItem.nEnhTimes,
		pDstItem.nLucky,
		pDstItem.GetGenInfo(),
		0,
		pDstItem.dwRandSeed,
		pDstItem.nStrengthen);
	local szNewDstItemInfo = self:GetRegenInfoLog(pDstItem.GetGenInfo(), pDstItem.nDevelopGrade);
	if nRet == 0 then
		pDstItem.SetAttribDevelopInfo(-1, tbNewDevInfo);
		local szLog = string.format("Regenerate đạo ** gốc [%s%s] thành công, regenerate đạo ** mới [%s%s] thất bại! Thuộc tính trước khi kế thừa %s thuộc tính sau khi kế thừa %s", pSrcItem.szName, pSrcItem.szGUID, pDstItem.szName, pDstItem.szGUID, szOldDstItemInfo, szNewDstItemInfo);
		Dbg:WriteLog("DevelopInherit", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, szLog);
	else
		local szLog = string.format("Regenerate đạo ** gốc [%s%s] thành công, regenerate đạo ** mới [%s%s] thành công! Thuộc tính trước khi kế thừa %s thuộc tính sau khi kế thừa %s", pSrcItem.szName, pSrcItem.szGUID, pDstItem.szName, pDstItem.szGUID, szOldDstItemInfo, szNewDstItemInfo);
		Dbg:WriteLog("DevelopInherit", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, szLog);
	end
	self:ApplyDevelopLadder(pDstItem);
	pDstItem.Sync();
	if bWithBind and type(bWithBind) == "number" and bWithBind >= 1 then
		pDstItem.Bind(bWithBind);
	end
	-- 不绑定被传承武器被绑定的武器传承后会被绑定
	local bSrcItemBind = pSrcItem.IsBind();
	if bSrcItemBind == 1 then
		pDstItem.Bind(bSrcItemBind);
	end
	
	-- 自动存档
	if (self:AutoUpdateDevWeaponBackupData(pDstItem) == 1) then
		--local szDate = os.date("%Y年%m月%d日%H时%M分", GetTime());
		Player:__AlterMsg(me, "Kế thừa thành công! Thuộc tính của vũ khí đã được cập nhật đồng bộ!");
	end
	
	self:SetDevEquipUpGradeFaildTimes(pDstItem, 0);
	self:SetDevEquipUpGradeFaildTimes(pSrcItem, 0);
	
	-- 埋点
	local szLog = string.format("%s,%s", szSrcGDPL, szDstGDPL);
	for _, tbInfo in pairs(tbNeed) do
		szLog = szLog..string.format(",%d_%d_%d_%d,%d", unpack(tbInfo));
	end
	StatLog:WriteStatLog("stat_info", "platinum","inherit", me.nId, szLog);
	
	return nRet;
end


function Item:CheckCanDevelopInherit(pSrcItem, pDstItem)
	local nRet, var = self:CheckDevelopCommon()
	if nRet == 0 then
		return nRet, var;
	end
	
	if pSrcItem.IsDevelopEquip() == 0 or pDstItem.IsDevelopEquip() == 0 then
		return 0, "Vũ khí kế thừa và được kế thừa đều phải là vũ khí Thần Sa";
	end
	
	--被传承武器只能是未养成,档次为1的白金武器
	local bDeveloped = self:IsItemDeveloped(pDstItem);
	if bDeveloped == 1 or pDstItem.nDevelopGrade ~= 1 then
		return 0, "Vũ khí được kế thừa phải là vũ khí Thần Sa cấp 1 chưa dưỡng thành";
	end
	
	--判断传承武器是否有可传承的价值
	bDeveloped = self:IsItemDeveloped(pSrcItem);
	if bDeveloped == 0 and pSrcItem.nDevelopGrade == 1 then
		return 0, "Vũ khí kế thừa không có điểm dưỡng thành, không thể kế thừa"
	end
	
	local tbNeed = self:GetDevelopInheritNeed(pSrcItem);
	nRet, var = self:IsMaterialEngouh(tbNeed);
	if nRet == 0 then
		return 0, string.format("Kế thừa dưỡng thành cần nguyên liệu %s không đủ!", var);
	end
	
	-- 两件装备都不能镶有宝石
--	if pSrcItem.IsEquipHasStone() == 1 or 
--		pDstItem.IsEquipHasStone() == 1 then
--		return 0, "参与养成传承的武器不能带有宝石";		
--	end


	-- 极品武器检查
	local nSupperDevSrcEquip = 0;
	if MODULE_GAMESERVER then
		nSupperDevSrcEquip = self:IsSupperDevEquip(pSrcItem);
		if nSupperDevSrcEquip == 1 and pSrcItem.nDevelopGrade > 1 then
			local nRet, var = self:CheckDevelopPeelTime("Kế thừa dưỡng thành vũ khí Thần Sa cực phẩm");
			if nRet ~= 1 then
				return 0, var or "";
			end
		end
	end
	--local nSupperDevDstEquip = self:IsSupperDevEquip(pDstItem); 被传承的就不限制了 档次必须是1 而且 第五条以上的属性才会重随
	
	return 1, nSupperDevSrcEquip;
end


function Item:IsItemDeveloped(pItem)
	local tbDevelopInfo = pItem.GetAttribDevelopInfo();
	local bDeveloped = 0;
	for _, nValue in pairs(tbDevelopInfo or {}) do
		if nValue > 0 then
			bDeveloped = 1;
			break;
		end
	end
	return bDeveloped;
end


function Item:GetDevelopInheritGradeInfo(pSrcItem, pDstItem)
	local nSrcDevGrade = pSrcItem.nDevelopGrade;
	if not self.tbDevelopGradeSetting or 
		not self.tbDevelopGradeSetting[nSrcDevGrade] or
		not self.tbDevelopGradeSetting[1] then
		return;
	end
	
	local nSrcGradeIndex, nDstGradeIndex = 0, 0;
	local szSrcGDPL = pSrcItem.SzGDPL();
	local szDstGDPL = pDstItem.SzGDPL();
	for i, szItemId in pairs(self.tbDevelopGradeSetting[nSrcDevGrade] or {}) do
		if szItemId == szSrcGDPL then
			nSrcGradeIndex = i;
			break;
		end
	end
	
	for i, szItemId in pairs(self.tbDevelopGradeSetting[1] or {}) do
		if szItemId == szDstGDPL then
			nDstGradeIndex = i;
			break;
		end
	end
	
	local szSrcGradeInfo = self.tbDevelopGradeSetting[1][nSrcGradeIndex];
	local szDstGradeInfo = self.tbDevelopGradeSetting[nSrcDevGrade][nDstGradeIndex];
	
	local tbSrcGradeInfo = Lib:SplitStr(szSrcGradeInfo or "");
	local tbDstGradeInfo = Lib:SplitStr(szDstGradeInfo or "");
	
	for i, v in pairs(tbSrcGradeInfo) do
		tbSrcGradeInfo[i] = tonumber(v);
	end
	for i, v in pairs(tbDstGradeInfo) do
		tbDstGradeInfo[i] = tonumber(v);
	end
	
	return tbSrcGradeInfo, tbDstGradeInfo;	
end


-- 需要源道具10%养成期望价值量所对应的材料数量
function Item:GetDevelopInheritNeed(pSrcItem)
	local nDevelopGrade = pSrcItem.nDevelopGrade;
	
	local nValue = 0;
	for i = 1, nDevelopGrade - 1 do 
		nValue = nValue + self.tbGradeExpectValue[i];
	end
	
	local tbInfo = pSrcItem.GetAttribDevelopInfo();
	for i, nLevel in pairs(tbInfo) do
		for j = 1, nLevel do
			nValue = nValue + self.tbDevelopValueSetting[nDevelopGrade][j];
		end
	end
	
	local nSuffLevel = nDevelopGrade;
	if self:IsItemDeveloped(pSrcItem) == 0 then
		nSuffLevel = nSuffLevel - 1;
	end
	nSuffLevel = nSuffLevel > 0 and nSuffLevel or 1;	
	
	local tb = {self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3], nSuffLevel};
	local tbItemInfo = KItem.GetItemBaseProp(unpack(tb));
	local nCount = math.ceil(nValue * (100 - self.DEV_PEEL_RET_RATE)/tbItemInfo.nValue / 100);
	table.insert(tb, nCount);
	
	-- 一个对应等级的材料
	return  { tb };
end
----------------------------------------------------解绑------------------------------------------------------
function Item:UnBindDevelopEquip(pItem)
	if self:CheckDevelopEquipUnBind(pItem) == 0 then
		return 0;
	end
	
	-- 消耗
	local tbNeed = self:GetDevelopUnBindNeed();
	if not tbNeed or self:ConsumeItems(tbNeed, Player.emKLOSEITEM_DEVELOP_UNBIND, pItem.IsBind()) == 0 then
		return 0, "Trừ nguyên liệu thất bại"
	end
	
	-- 清除所有任务数据
	local tbTaskData = self:GetItemTaskData(pItem);
	self:ClearItemTaskData(pItem);	-- 这个不会失败
	
	-- 剥离
	local nRet = pItem.Regenerate(
		pItem.nGenre, 
		pItem.nDetail,
		pItem.nParticular, 
		pItem.nLevel,
		pItem.nSeries,
		0,				-- 强化次数清0
		pItem.nLucky,
		tbNewGenInfo,
		0,
		pItem.dwRandSeed,
		pItem.nStrengthen);
	
	if nRet == 0 then
		self:SetItemTaskDataTable(pItem, tbTaskData);
		Dbg:WriteLog("DevelopUnBind", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Regenerate đạo ** thất bại!");
		return 0;
	end
	
	pItem.Bind(0);	-- 不绑
	return 1;
end


function Item:CheckDevelopEquipUnBind(pEquip)
	if pEquip.IsDevelopEquip() == 0 then
		return 0;
	end
	
	if pEquip.IsBind() == 0 then
		return 0, "Trang bị này không khóa!";
	end
	
	local tbNeed = self:GetDevelopUnBindNeed();
	local nRet, szDesc = self:IsMaterialEngouh(tbNeed);
	if nRet == 0 then
		return 0, "Nguyên liệu không đủ";
	end
	
	return 1;
end


function Item:GetDevelopUnBindNeed()
	
end


--------------------------------------------------胚子兑换---------------------------------------------------------
function Item:PlatinumRawExchange(pItem)
	if me.CountFreeBagCell() < 1 then
		return 0, "Hãy chừa ít nhất 1 ô trong túi";
	end
	
	local nRet, var = self:CalcRawExchangeResult(pItem);
	if nRet == 0 then
		me.Msg(var);
		return 0;
	end
	
	local tbRet = var;
	--结果数量不能是0
	if tbRet[1][5] == 0 then
		me.Msg("Số lượng không đúng, không thể đổi.");
		return 0;
	end
	
	-- 设置数量为0了会自动删除
	local nCostCount = pItem.nCount - tbRet[2][5];
	local szOldGDPL = pItem.SzGDPL("_");
	if pItem.SetCount(tbRet[2][5], Player.emKLOSEITEM_RAW_EXCHAGE) == 0 then
		me.Msg("Hệ thống bị lỗi.");
		return 0;
	end
	
	me.AddStackItem(tbRet[1][1], tbRet[1][2], tbRet[1][3], tbRet[1][4], nil, tbRet[1][5], Player.emKITEMLOG_TYPE_RAW_EXCHANGE);	
	
	-- 埋点
	local szLog = string.format("%s,%d,%d_%d_%d_%d,%d", szOldGDPL, nCostCount,unpack(tbRet[1]));
	StatLog:WriteStatLog("stat_info", "platinum","use_change", me.nId, szLog);
	
	return 1;	
end


function Item:CalcRawExchangeResult(pItem)
	if true then
		return 0, "Chức năng sắp mở, xin hãy đợi!";
	end
	
	local nRet, var = self:CheckDevelopCommon()
	if nRet == 0 then
		return nRet, var;
	end
	
	if pItem.szClass ~= self.RAW_CLASS then
		return 0, "Chỉ có phôi vũ khí Thần Sa mới có thể đổi";
	end
	
	local tbRet = {};
	local nExchangeCount = math.floor(pItem.nCount/2);
	local nBalance = pItem.nCount%2;
	
	if nExchangeCount <= 0 then
		return 0, "Hãy đặt vào 2 phôi trở lên";
	end
	
	-- 兑换结果
	tbRet[1] = {unpack(self.tbRawExchange[pItem.nParticular])};
	table.insert(tbRet[1], nExchangeCount);
	-- 剩余数理
	tbRet[2] = {pItem.nGenre, pItem.nDetail, pItem.nParticular, pItem.nLevel, nBalance};	
	
	return 1, tbRet;
end
--------------------------------------------------材料拆解---------------------------------------------------------
function Item:BreakupDevStuff(pItem)
	local nRet, var, var2 = self:CalcDevStuffBreakResult(pItem);
	if nRet == 0 then
		me.Msg(var);
		return 0;
	end
	
	local nCostMoney = self:CalcDevStuffBreakCost(pItem.nCount);
	if nCostMoney > me.nCashMoney then
		me.Msg("Bạc không đủ.");
		return 0;
	end
	
	local tbRes = var;
	local nNeedCell = var2;
	-- 背包空间
	if me.CountFreeBagCell() < nNeedCell then
		me.Msg(string.format("Cần %d ô túi trống", nNeedCell));
		return 0;
	end	
	
	if me.CostMoney(nCostMoney, Player.emKPAY_DEVSTUFF_BREAKUP) ~= 1 then
		return 0;
	end
	
	local szLog = string.format("%s,%d", pItem.SzGDPL("_"), pItem.nCount);
	local bBind = pItem.IsBind();
	if pItem.Delete(me, Player.emKLOSEITEM_DEV_STUFF_BREAKUP) ~= 1 then
		return 0;


	end
	
	-- 设置时间、绑定类型??
	local tbItemInfo = {};
	tbItemInfo.bForceBind = bBind;
	me.AddStackItem(tbRes[1], tbRes[2], tbRes[3], tbRes[4], tbItemInfo, tbRes[5], Player.emKITEMLOG_TYPE_DEV_STUFF_BREAKUP);
	
	-- 埋点
	szLog = szLog..string.format(",%d_%d_%d_%d,%d", unpack(tbRes));
	StatLog:WriteStatLog("stat_info", "platinum","demote", me.nId, szLog);
	
	return 1;
end


function Item:CalcDevStuffBreakResult(pItem)
	local nRet, var = self:CheckDevelopCommon()
	if nRet == 0 then
		return nRet, var;
	end
	
	if pItem.szClass ~= self.DEV_STUFF_CLASS or
		pItem.nLevel < 2 then
		return 0, "Hãy đặt vào nguyên liệu cấp 2 trở lên";
	end
	
	local tbRet = {pItem.nGenre, pItem.nDetail, pItem.nParticular, pItem.nLevel - 1, pItem.nCount * 3};
	local nNeedCell = KItem.GetNeedFreeBag(tbRet[1], tbRet[2], tbRet[3], tbRet[4], nil, tbRet[5]);
	
	return 1, tbRet, nNeedCell;
end


function Item:CalcDevStuffBreakCost(nCount)
	return nCount * 2 * self.DEV_STUFF_BREAK_PRICE;		-- 相当于产生了两个低级材料
end


--------------------------------------------------养成剥离---------------------------------------------------------
function Item:GetDevPeelRet(pItem)
	local nDevGrade = pItem.nDevelopGrade;
	
	local nValue = 0;
	local tbRet = {};
	for i = 1, nDevGrade -1 do
		nValue = self.tbGradeExpectValue[i] * self.DEV_PEEL_RET_RATE/100;
		local tbItemInfo = KItem.GetItemBaseProp(self.tbDevStuffGDP[1], self.tbDevStuffGDP[2],self.tbDevStuffGDP[3], i);
		tbRet[i] = math.floor(nValue/tbItemInfo.nValue);
	end
	
	nValue = 0;
	local tbInfo = pItem.GetAttribDevelopInfo();
	for i, nLevel in pairs(tbInfo) do
		for j = 1, nLevel do
			nValue = nValue + self.tbDevelopValueSetting[nDevGrade][j];
		end
	end
	nValue = nValue * self.DEV_PEEL_RET_RATE/100;
	local tbItemInfo = KItem.GetItemBaseProp(self.tbDevStuffGDP[1], self.tbDevStuffGDP[2],self.tbDevStuffGDP[3], nDevGrade);
	tbRet[nDevGrade] = math.floor(nValue/tbItemInfo.nValue);
	
	return tbRet;
end


function Item:DevelopPeel(pItem)
	local nRet, var1, var2, nSupperDevEquip = Item:CheckCanDevPeel(pItem);
	if nRet ~= 1 then
		me.Msg(var1);
		return 0;
	end
	
	local tbRet, tbResGDPL = var1, var2;
	local szOldGDPL = pItem.SzGDPL("_");
	local nOldDevGrade = pItem.nDevelopGrade;
	
	-- 剥离装备
	local tbAttribDevInfo = pItem.GetAttribDevelopInfo();
	local tbNewInfo = {};
	for i, v in pairs(tbAttribDevInfo) do
		tbNewInfo[i] = 0;
	end
	pItem.SetAttribDevelopInfo(-1, tbNewInfo);
	-- 重随属性
	local tbNewGenInfo = pItem.GetGenInfo();
	if pItem.nDevelopGrade > 1 then		-- 1档以上的武器重随属性类型
		tbNewGenInfo = self:GetRegenInfo(
			pItem, 1,  Item.DEVELOP_REGEN_ATTRIB_ID		-- 随机属性类型,等级不变化
		);
	end
	if not tbNewGenInfo then
		return 0;
	end
	
	local szGenInfoLog = string.format("%s%s, thuộc tính trước khi tách: %s, sau khi tách: %s.", pItem.szName, pItem.szGUID,
		self:GetRegenInfoLog(pItem.GetGenInfo(), pItem.nDevelopGrade), 
		self:GetRegenInfoLog(tbNewGenInfo, 1) );
			
	
	
	local nRet = pItem.Regenerate(
		tbResGDPL[1], 
		tbResGDPL[2], 
		tbResGDPL[3], 
		tbResGDPL[4], 
		pItem.nSeries,
		pItem.nEnhTimes,
		pItem.nLucky,
		tbNewGenInfo, --pItem.GetGenInfo(),
		0,
		pItem.dwRandSeed,
		pItem.nStrengthen);
	if nRet ~= 1 then
		pItem.SetAttribDevelopInfo(-1, tbAttribDevInfo);
		local szLog = string.format("Tách dưỡng thành trang bị [%s] thất bại, %s", pItem.szName, szGenInfoLog);
		Dbg:WriteLog("DevelopPeel", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Regenerate vật phẩm thất bại,"..szLog);
		return 0;
	end
	
	-- 移除buff
	if nOldDevGrade >= self.DEVELOP_PEEL_LIMIT_GRADE or nSupperDevEquip == 1 then
		self:RemoveEnhBuff();
	end
	self:SetDevEquipUpGradeFaildTimes(pItem, 0);
	
	-- 埋点
	local szLog = szOldGDPL;
	local bBind = Item:ShouldStuffBind(pItem);
	-- 添加返还材料
	for nLevel, nCount in pairs(tbRet) do
		if nCount > 0 then
			me.AddStackItem(self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3], 
				nLevel, {bForceBind=bBind}, nCount, Player.emKITEMLOG_TYPE_DEVELOP_PEEL);
			szLog = szLog..string.format(",%d_%d_%d_%d,%d", self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], 
				self.tbDevStuffGDP[3], nLevel, nCount);
		end
	end
	StatLog:WriteStatLog("stat_info", "platinum","peer_off", me.nId, szLog);
	
	Dbg:WriteLog("DevelopPeel", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Tách thành công,"..szGenInfoLog);
	
	self:ApplyDevelopLadder(pItem);
	
	return 1;
end


function Item:GetDevPeelResItem(pItem)
	local nDevGrade = pItem.nDevelopGrade;
	
	if not self.tbDevelopValueSetting or 
		not self.tbDevelopGradeSetting[1] or
		not self.tbDevelopGradeSetting[nDevGrade] then
		return;
	end
	
	local szGDPL = pItem.SzGDPL();
	local nFindIndex = nil;
	for i, szItemId in pairs(self.tbDevelopGradeSetting[nDevGrade]) do
		if szItemId == szGDPL then
			nFindIndex = i;
		end
	end
	
	if not nFindIndex then
		return;
	end
	
	local szItemId = self.tbDevelopGradeSetting[1][nFindIndex];
	if not szItemId then
		return;
	end
	
	local tbGDPL = Lib:SplitStr(szItemId);
	for i, value in pairs(tbGDPL) do
		tbGDPL[i] = tonumber(value);
	end
	
	return tbGDPL;
end


-- 判断该装备是否可剥离,可剥离的话,会返回结果信息
function Item:CheckCanDevPeel(pItem)
	local nRet, var = self:CheckDevelopCommon()
	if nRet == 0 then
		return nRet, var;
	end
	
	if pItem.IsDevelopEquip() == 0 then
		return 0, "Hãy đặt vào vũ khí Thần Sa đã dưỡng thành";
	end
	
	if self:IsItemDeveloped(pItem) == 0 and pItem.nDevelopGrade == 1 then
		return 0, "Vũ khí này không thể tách";
	end
	
	-- 3档以上的装备剥离需要申请
	if pItem.nDevelopGrade >= self.DEVELOP_PEEL_LIMIT_GRADE then
		local nRet, var = self:CheckDevelopPeelTime("Tách dưỡng thành vũ khí Thần Sa cực phẩm");
		if nRet ~= 1 then
			return nRet, var;
		end
	end


--	if pItem.IsEquipHasStone() == 1 then
--		return 0, "参与养成剥离的武器不能带有宝石";
--	end
	
	local tbRet = self:GetDevPeelRet(pItem);
	if not tbRet then
		return 0, "Không thể nhận thông tin tách của đạo ** này";
	end
	
	local nNeed = 0;
	for _, nCount in pairs(tbRet or {}) do
		if nCount > 0 then
			nNeed = nNeed + 1;
		end
	end
	if me.CountFreeBagCell() < nNeed then
		return 0, "Túi đầy, cần "..nNeed.." ô túi trống.";
	end
	
	local tbResGDPL = self:GetDevPeelResItem(pItem);
	if not tbResGDPL then
		return 0;
	end
	
	-- 极品武器检查
	local nSupperDevEquip = 0;
	if MODULE_GAMESERVER then
		nSupperDevEquip = self:IsSupperDevEquip(pItem);
		if nSupperDevEquip == 1 then
			local nRet, var = self:CheckDevelopPeelTime("Tách dưỡng thành vũ khí Thần Sa cực phẩm");
			if nRet ~= 1 then
				return 0, var or "";
			end
		end
	end
	
	return 1, tbRet, tbResGDPL, nSupperDevEquip;
end


function Item:CheckDevelopPeelTime(szReason)
	local nTime = me.GetTask(self.TASK_PEEL_APPLY_GID, self.TASK_PEEL_APPLY_TIME);
	-- 没有申请过剥离
	if nTime <= 0 then
		return -1, string.format("Hãy gặp Dã Luyện Đại Sư xin phép %s", szReason);
	
	-- 申请过则判断时间是否在允许段内(申请3小时-剥离3小时)
	else
		-- 取申请时间差
		local nDiffTime = GetTime() - nTime;
		-- 出错的情况
		if nDiffTime <= 0 then 
			return -1;
			
		-- 已经申请还不能剥离
		elseif nDiffTime <= self.VALID_PEEL_TIME then
			return -1, string.format("Vẫn chưa tới thời gian %s, xin chờ chút.", szReason);
			
		-- 过了申请期
		elseif nDiffTime >= self.MAX_PEEL_TIME then
			me.SetTask(self.TASK_PEEL_APPLY_GID, self.TASK_PEEL_APPLY_TIME, 0);
			return -1, string.format("Xin phép %s lần trước đã quá giờ, hãy xin phép lại.", szReason);
		end
	end
	
	return 1;
end


-------------------------------------------------------------------------------------------------------------------
-- 在背包中查找材料是否足够
-- 注意:传参tbMaterial对同种GDPL的道具要合并,否则检查结果不一定正确
-- bEquipBind 检查是否有足够的非绑定材料 不绑定的装备优先使用不绑定材料 如果使用绑定材料则需要提示
function Item:IsMaterialEngouh(tbMaterial, bEquipBind)
	if not tbMaterial or #tbMaterial == 0 then
		return 0, "";
	end
	
	bEquipBind = bEquipBind or 1;
	local bBindTips = 0;
	local tbBindMatCount = {};
	local tbNoBindMatCount = {};
	local nEnough = 0;
	local szDesc = "";
	local tbEnough = {};
	-- 计算非绑定和绑定材料分别有多少
	for i, tbItem in pairs(tbMaterial) do
		local tbFind = me.FindItemInBags(unpack(tbItem, 1, 4));
		tbNoBindMatCount[i] = tbNoBindMatCount[i] or 0;
		tbBindMatCount[i] = tbBindMatCount[i] or 0;
		for _, tbItem in pairs(tbFind) do
			if tbItem.pItem.IsBind() == 0 then
				tbNoBindMatCount[i] = tbNoBindMatCount[i] + tbItem.pItem.nCount;
			else
				tbBindMatCount[i] = tbBindMatCount[i] + tbItem.pItem.nCount;
			end
		end
		szDesc = szDesc..string.format("<color=green>%d<color> <color=green>%s<color>", tbItem[5], KItem.GetNameById(unpack(tbItem, 1, 4)));
		local nNeedCount = tbItem[5];
		if bEquipBind == 0 and tbNoBindMatCount[i] < nNeedCount then
			bBindTips = 1;
		end
		if tbBindMatCount[i] + tbNoBindMatCount[i] >= nNeedCount then
			nEnough = nEnough + 1;
		end
	end
	local bEnough = 0;
	if nEnough >= Lib:CountTB(tbMaterial) then
		bEnough = 1;
	end
	
	return bEnough, szDesc, bBindTips;
end


-- 参数同上
-- bBind = 0 优先消耗不绑定的材料 不足的时候才消耗绑定的材料
-- bBind = 1 优先消耗绑定的材料 不足的时候才消耗绑定的材料
function Item:ConsumeItems(tbNeed, eWay, bBind)
	if not tbNeed then
		return 0;
	end
	
	eWay = eWay or Player.emKLOSEITEM_DEVELOP_ATTRIB;
	bBind = bBind or 1;
	local bWithBind = bBind or 0;
	local nAllNeed = 0;
	local nConsumed = 0;
	for _, tbItem in pairs(tbNeed or {}) do
		local tbFind = me.FindItemInBags(unpack(tbItem, 1, 4));
		if not tbFind or #tbFind == 0 then
			return 0;
		end
		nAllNeed = tbItem[5];
		nConsumed = nConsumed + nAllNeed;
		for _, tbItemInfo in pairs(tbFind) do
			local pItem = tbItemInfo.pItem;
			local nCount = pItem.nCount;
			if bBind == pItem.IsBind() then
				if nCount > nAllNeed then
					local bRet = pItem.SetCount(nCount - nAllNeed, eWay) or 0;
					if bRet == 1 then
						nAllNeed = 0;
					end
				else
					if pItem.Delete(me, eWay) == 1 then
						nAllNeed = nAllNeed - nCount;
					end
				end
			end
		end
		if nAllNeed > 0 then
			bWithBind = 1;
			for _, tbItemInfo in pairs(tbFind) do
				local pItem = tbItemInfo.pItem;
				local nCount = pItem.nCount;
				if bBind ~= pItem.IsBind() then
					if nCount > nAllNeed then
						local bRet = pItem.SetCount(nCount - nAllNeed, eWay) or 0;
						if bRet == 1 then
							nAllNeed = 0;
						end
					else
						if pItem.Delete(me, eWay) == 1 then
							nAllNeed = nAllNeed - nCount;
						end
					end
				end
			end
		end
		if nAllNeed > 0 then
			return 0;
		end
	end
	
	return 1, bWithBind, nConsumed;
end


function Item:GetRegenInfo(pItem, nDestDevGrade, nGenFlag)
	local nPhyType, nPvType = self:GetDevelopAttribType(pItem);
	if not nPhyType or not nPvType then
		return;
	end
	
	if nGenFlag < self.DEVELOP_REGEN_ATTRIB_ID or 
	   nGenFlag > self.DEVELOP_REGEN_ATTRIB_LEV  then
	   	return;
	end
	
	local tbNewGenInfo = KItem.ReGenerateDevelopBaseAttrib(
		nGenFlag,
		pItem.nSeries,
		nPhyType,
		nPvType,
		nDestDevGrade,
		pItem.GetGenInfo(),
		{},
		0
	);
	return tbNewGenInfo;
end


function Item:GetRegenInfoLog(tbInfo, nGrade)
	local szLog = "";
	
	if nGrade ~= -1 then
		for i = 1, 8 do 
			if i ~= 1 then
				szLog = szLog..",";
			end
			local nValue = tbInfo[i + 1] or 0;
			if nValue == 0 then
				szLog = szLog.."0_0";
			else
				local nId = Lib:LoadBits(nValue, 16, 31);
				local nInitRand = Lib:LoadBits(nValue, 8, 15);
				local nInitLevel = self:GetDevelopRandLevel(nInitRand, nGrade);			
				szLog = szLog..string.format("%d_%d", nId, nInitLevel);
			end
		end
	else
		for nIndex, data in pairs(tbInfo) do
			szLog = szLog..string.format(",%d_%d", nIndex, data);
		end
	end
	
	return szLog;
end


function Item:GetDevelopAttribType(pItem)
	if pItem.IsDevelopEquip() == 0 and pItem.IsDevelopStone() == 0 then
		return;
	end
	
	local nGenInfo = pItem.GetGenInfo(1);
	local nPhyType = Lib:LoadBits(nGenInfo, 8, 15);
	local nPvType = Lib:LoadBits(nGenInfo, 0, 7);
	
	return nPhyType, nPvType;
end


-- 生成成长属性的类型
-- nPhyType:1内功,2外功,0不限
-- nPvType:1 pvp, 2 pve 
function Item:GenDevelopAttribType(nPhyType, nPvType)
	local nType = 0;
	nType = Lib:SetBits(nType, nPhyType, 8, 15);
	nType = Lib:SetBits(nType, nPvType, 0, 7);
	return nType;
end


function Item:GetDevelopEquipFeatureDesc(pItem)
	if pItem.IsDevelopEquip() == 0 and pItem.IsDevelopStone() == 0 then
		return;
	end
	
	local nPhyType, nPvType = self:GetDevelopAttribType(pItem);
	
	local szPhyType = self.tbPhyTypeStr[nPhyType];
	local szPvType = self.tbPvTypeStr[nPvType];
	
	return szPhyType, szPvType;
end


function Item:GetDevelopAttribInitLevel(pItem, nIndex)
	local nValue = pItem.GetGenInfo(nIndex + 1);	-- 要加1,属性是从2开始的
	local nInitRand = Lib:LoadBits(nValue, 8, 15);
	local nInitLevel = self:GetDevelopRandLevel(nInitRand, pItem.nDevelopGrade);
	return nInitLevel;
end


function Item:GetDevelopAttribSettingId(pItem, nIndex)
	local nValue = pItem.GetGenInfo(nIndex + 1);	-- 要加1,属性是从2开始
	return Lib:LoadBits(nValue, 16, 31);
end


function Item:AddDevelopEquip(g,d,p,l,s, phy, pv, eWay)
	local tbGenInfo = self:InitGenerateInfo(s, phy, pv);
	local tbItemInfo = {};
	tbItemInfo.tbGenInfo = tbGenInfo;
	tbItemInfo.nSeries = s or -1;
	local pItem = me.AddItemEx(g,d,p,l, tbItemInfo, eWay);
	if pItem then
		self:ApplyDevelopLadder(pItem);
	end
	return pItem;
end


function Item:InitGenerateInfo(s, phy, pv)
	if not s then
		s = -1;
	end	
	if not phy then
		phy = 1;
	end
	if not pv then
		pv = 1;
	end


	local tbGenInfo = {};
	for i = 1, 12 do
	    tbGenInfo[i] = 0;
	end
	tbGenInfo[1] = self:GenDevelopAttribType(phy,pv);
	return tbGenInfo;
end


-- 开启材料宝箱
function Item:RandDevStuff()
	local tbRate = self.tbDevStuffRandRate;
	
	local nToday = Lib:GetLocalDay(GetTime());
	local nOpenDay = Lib:GetLocalDay(Lib:GetDate2Time(self.DEV_OPEN_DAY));
	local nDay = nToday - nOpenDay;
	local nDay = nDay > 137 and 137 or nDay;
	local tbNow = self:CalcDevStuffRateReduction(tbRate, nDay);
		
	local nSumRate = 0;
	for i, nRate in pairs(tbNow) do
		nSumRate = nSumRate + nRate;
	end
	
	local nRand = MathRandom(nSumRate);
	for i, nRate in pairs(tbNow) do
		nRand = nRand - nRate;
		if nRand <= 0 then
			return i;
		end
	end
end


-- 计算当前随机权重
function Item:CalcDevStuffRateReduction(tb, nPassDay)
	local nMinLevel = 100;		-- 一个足够大的值,远大于系统当前的最大宝石等级
	for nLevel, nDay in pairs(tb) do
		if nMinLevel > nLevel then
			nMinLevel = nLevel;
		end
	end
	
	local tbRet = {};
	
	-- 最低级的衰减,其它的不变
	tbRet = Lib:CopyTB1(tb);
	tbRet[nMinLevel] = math.ceil(tb[nMinLevel] - tb[nMinLevel] * nPassDay/self.DEV_STUFF_CALC_RATE);
	if tbRet[nMinLevel] < 0 then
		tbRet[nMinLevel] = 0;
	end
		
	return tbRet;
	
end


function Item:GetDevAttribDesc(pEquip, nIndex)
	local szTitle, szDesc = "", "";
	
	local tbDevMass = pEquip.GetDevelopMass();
	local tbMA = tbDevMass[nIndex];
	local nDevLev = pEquip.GetAttribDevelopInfo(nIndex);
	local nDevGrade = pEquip.nDevelopGrade;
	local nAttribId = self:GetDevelopAttribSettingId(pEquip, nIndex);
	local tbDevMASetting = KItem.GetDevelopMASetting(nAttribId);
	if not tbDevMASetting then
		return szTitle, szDesc;
	end
	
	szTitle = string.format("<color=gold>%s<color>", tbDevMASetting.szDesc);
	szDesc = string.format("<color=cyan>Cấp:<color> <color=gold>%d<color>\n%s\n", 
		tbMA.nLevel, FightSkill:GetMagicDesc(tbMA.szName, tbMA.tbValue, nil, 1))
	if (nDevGrade == Item.MAX_GRADE or nDevLev >= self.tbGradeMaxDevelop[nDevGrade]) then
		szDesc = szDesc.."<color=red>Đã dưỡng thành cấp cao nhất<color>\n";
	end
	szDesc = szDesc.."\n";
	
	local nNextLev, szNext;
	if tbDevMASetting.nGrowthType == Item.DEVELOP_GROWTH_SKIP then
		szDesc = szDesc.."<color=cyan>Giá trị thuộc tính này chỉ thay đổi ở cấp đặc biệt\n<color>"
		nNextLev = KItem.CalcDevAttribNextSkipPoint(nAttribId, tbMA.nLevel);
		if not nNextLev then
			szDesc = szDesc.."<color=cyan>Giá trị thuộc tính này sẽ không thay đổi<color>\n";
		end
		szNext = "<color=cyan>Điểm thay đổi kế: <color>"
	else
		nNextLev = tbMA.nLevel + 1;
		szNext = "<color=cyan>Cấp kế: <color>";
	end
	
	if nNextLev then
		local tbNextMA = KItem.GetRandAttribInfo(nAttribId, nNextLev, 0, Item.MAGIC_VERSION_DEV);
		local tbNextValue = {tbNextMA[1].nMin, tbNextMA[2].nMin, tbNextMA[3].nMin};
		szDesc = szDesc..string.format("%s <color=gold>cấp %d<color>\n%s", szNext or "", nNextLev, 
			FightSkill:GetMagicDesc(tbMA.szName, tbNextValue, nil, 1));
	end
			
	return szTitle, szDesc;
end


-- 辰砂武器的攻击条数
function Item:GetDevEquipAttackAtrCount(pItem)
	if not pItem then
		return 0;
	end
	
	local nPhyType = self:GetDevelopAttribType(pItem);
	if not nPhyType then
		return 0;
	end
	
	local nSeries = pItem.nSeries;
	local nLevel  = pItem.nDevelopGrade;
	
	local nAttackCount = 0;
	for nIndex = 2, 4 + nLevel do
		local nAttSettingId = self:GetDevelopAttribSettingId(pItem, nIndex - 1);
		local bAttrackAtrrib = self:IsAttrackAtrrib(nSeries, nPhyType, nAttSettingId);
		if bAttrackAtrrib == 1 then
			nAttackCount = nAttackCount + 1;
		end
	end
	
	return nAttackCount;
end


-- 判断是否是大于4攻武器的
function Item:IsSupperDevEquip(pItem)
	if not pItem then
		return 0;
	end
	
	-- 有多少条攻击
	local nAttackCount = self:GetDevEquipAttackAtrCount(pItem);
	return nAttackCount >= 4 and 1 or 0;
end


-- 移出强化buff
function Item:RemoveEnhBuff()
	me.SetTask(self.TASK_PEEL_APPLY_GID, self.TASK_PEEL_APPLY_TIME, 0);
	me.RemoveSkillState(1358);
end


-- 升级失败次数 
function Item:GetDevEquipUpGradeFaildTimes(pItem)
	if pItem then
		local nValue = pItem.GetGenInfo(self.DEV_EQUIP_EXTREN_INDEX);
		return Lib:LoadBits(nValue, 0, 7);
	end
end


function Item:SetDevEquipUpGradeFaildTimes(pItem, nSetValue)
	if pItem then
		local nValue = pItem.GetGenInfo(self.DEV_EQUIP_EXTREN_INDEX);
		nValue = Lib:SetBits(nValue, nSetValue, 0, 7);
		pItem.SetGenInfo(self.DEV_EQUIP_EXTREN_INDEX, nValue);
	end
end
 
Chỉnh sửa lần cuối:
Bên trên