[KT] KT2 cần giúp tăng tỷ lệ đúc thần sa
Hello & Welcome to our community. Is this your first visit? Đăng Ký
Follow us on
Follow us on Facebook Follow us on Twitter Linked In Flickr Watch us on YouTube My Space Blogger
 
Kết quả 1 đến 2 của 2
  1. #1
    Thành Viên
    Ngày tham gia
    Dec 2014
    Bài viết
    216
    Thanks
    116
    Thanked 91 Times in 18 Posts

    Icon14 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 trong đoạn code này không chỉ với
    Code:
    ------------------------------------------------------
    -- 文件名 :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 cụ 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 cụ");
    		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 cụ 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 cụ gốc [%s%s] thành công, regenerate đạo cụ 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 cụ gốc [%s%s] thành công, regenerate đạo cụ 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 cụ 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 cụ 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
    Lần sửa cuối bởi lqthanh85bl, ngày 07-01-21 lúc 08:03 PM.
    Khách viếng thăm hãy cùng lqthanh85bl xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  2. #2
    Thành Viên
    Ngày tham gia
    Aug 2011
    Bài viết
    34
    Thanks
    8
    Thanked 2 Times in 2 Posts

    Ðề: KT2 cần giúp tăng tỷ lệ đúc thần sa

    Trích dẫn Gửi bởi lqthanh85bl [Only registered and activated users can see links. ]
    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 trong đoạn code này không chỉ với
    Code:
    ------------------------------------------------------
    -- 文件名 :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 cụ 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 cụ");
    		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 cụ 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 cụ gốc [%s%s] thành công, regenerate đạo cụ 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 cụ gốc [%s%s] thành công, regenerate đạo cụ 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 cụ 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 cụ 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
    anh hướng dẫn em tải và cài game với ạ. Link die hết rồi ạ
    Khách viếng thăm hãy cùng quangdong92 xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

 

 

Các Chủ đề tương tự

  1. [KT] Lãnh thỗ gia tộc - đục lỗ 3 KT2
    Bởi shinrenkyo trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 4
    Bài viết cuối: 15-10-15, 08:28 PM
  2. [MU] cho mình hỏi cách tăng giảm EXP theo level tăng lên?
    Bởi nanhtuan81 trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 1
    Bài viết cuối: 14-05-13, 01:07 PM
  3. [MU] Nan giải : CPU tăng do log sever tăng
    Bởi thuynga trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 31
    Bài viết cuối: 09-07-12, 09:57 PM
  4. [Beta ] giảm lag,tăng độ mượt tăng animation
    Bởi knight06 trong diễn đàn Releases
    Trả lời: 12
    Bài viết cuối: 16-09-11, 02:31 PM
  5. Hỏi ? cách tăng tiền zen khi đánh quái rớt và Tăng exp đánh quái
    Bởi kiddj1 trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 0
    Bài viết cuối: 21-04-11, 05:28 PM

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •  
Múi giờ GMT +7. Bây giờ là 04:45 PM.
vBulletin®, Copyright ©2000-2011, Jelsoft Enterprises Ltd.
CLBGamesVN không chịu trách nhiệm về Luật Bản Quyền của các tài liệu, bài viết v.v...được đăng tải trên diễn đàn này.
Diễn đàn phát triển dưới sự đóng góp của tất cả thành viên. BQT chỉ là những người thành lập ra sân chơi, quản lý và duy trì về mặt kỹ thuật, nội dung khi hợp lệ.