PDA

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



lqthanh85bl
07-01-21, 03:08 PM
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



------------------------------------------------------
-- 文件名 :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_C astLevel);
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); -- 因为概率是用万分比表示的,所以在10 000内随机
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

quangdong92
08-01-21, 09:55 PM
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



------------------------------------------------------
-- 文件名 :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_C astLevel);
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); -- 因为概率是用万分比表示的,所以在10 000内随机
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 ạ