- VND
- 9Đ
Xin chào anh em!
Mình cần giúp tăng tỷ lệ ra dòng dame khi đúc vũ khí thần sa kiếm thế 2 offline, phải vào file nào để chỉnh cái gì mong anh em giúp đỡ, xin cảm ơn
Mọi người xem dùm phải file này không
Mình cần giúp tăng tỷ lệ ra dòng dame khi đúc vũ khí thần sa kiếm thế 2 offline, phải vào file nào để chỉnh cái gì mong anh em giúp đỡ, xin cảm ơn
Mọi người xem dùm phải file này không
Mã:
------------------------------------------------------
-- 文件名 :develop.lua
-- 创建者 :dengyong
-- 创建时间:2012-12-29 11:02:14
-- 描 述 :装备养成逻辑
------------------------------------------------------
Item.tbGradeMaxDevelop = {30, 40, 50, 60}; -- 档次下各属性所能最大提升的成长等级
Item.tbDevelopFighPowerRate = {341760, 2142000, 10728000, 54129600}; -- 养成财富与战斗系数比,key是装备档次
Item.tbDevelopGradeOpenDay = {139, 159, 173, 173}; -- 升档时间限制
Item.MAX_GRADE = 5; -- 最大档次等级
Item.DEV_PEEL_RET_RATE = 90; -- 养成剥离返还90%
Item.DEV_STUFF_BREAK_PRICE = 5000; -- 材料拆解单价
Item.RAW_CLASS = "platinum_raw";
Item.DEV_STUFF_CLASS = "platinum_stuff";
Item.DEV_OPEN_DAY = 20130315;
Item.DEV_STUFF_CALC_RATE = 343; -- 材料概率成长衰减系数,分母值
Item.DEV_ATTRIB_MAX_LEV = 300; -- 成长属性理论最大值
Item.tbNeedcastLevel = {
--[装备档次] = {精铸等级要求,不符合时描述}
[3] = {2, "Vũ khí phải đạt tinh chú cấp 2, nhận được bằng danh vọng Lăng Tần Thủy Hoàng-Phát Khâu Môn."},--进阶3档要1级精铸
[4] = {3, "Vũ khí phải đạt tinh chú cấp 3 trác việt, nhận được bằng danh vọng Lăng Tần Thủy Hoàng-Phát Khâu Môn."},--进阶4档要2级精铸
[5] = {4, "Vũ khí phải đạt tinh chú cấp 4 sử thi, nhận được bằng danh vọng Lăng Tần Thủy Hoàng-Phát Khâu Môn."},--进阶5档要3级精铸
};
Item.DEV_CAST_ADD_LEVEL_TXT = {
--精铸对养成属性的提升等级显示
[1] = 2,
[2] = 5,
[3] = 10,
[4] = 3,
}
Item.tbGradeLvDesc = {"Vô Hạ", "Phồn Hoa", "Phong Vân", "Kình Tiếu", "Thiên Địa"};
Item.tbDevStuffName = {"Vô Hạ Dẫn", "Phồn Hoa Dẫn", "Phong Vân Dẫn", "Kình Tiếu Dẫn", "Thiên Địa Dẫn"};
Item.tbPhyTypeStr = {"Nội công", "Ngoại công"};
Item.tbPvTypeStr = {"Chiến", "Hiệp"};
Item.tbBindDesc = {[0] = "<color=yellow>(Không khóa)<color>", [1] = "<color=yellow>(Khóa)<color>"};
Item.tbRawExchange =
{ -- 索引是P值
[1980] = {18,1,1981,1},
[1981] = {18,1,1980,1},
}
Item.tbGradeExpectValue =
{
1000000,
10000000,
100000000,
1000000000,
}
Item.tbRegenStuffNeed = -- 重铸所需材料
{
[1] = {4, 5, 8, 11, 13},
[2] = {1, 1, 1, 1, 1},
};
Item.DEVELOP_PEEL_LIMIT_GRADE = 3; -- 3档及以上的装备需要申请方可剥离
Item.ATTRIB_CONT_DEV_STUFF_NEED = 1; -- 连续性性成长属性升级需要的材料量
Item.tbAttribSkipDevStuffNeed = {4,5,6,7}; -- 跳跃性成长属性升级需要的材料量
Item.tbDevelopGradeRate = {3099, 3264, 3244, 3263}; -- 换档成功率,万分比
Item.tbGradeAttribCount = {4,5,6,7,8}; -- 各个档次实际属性数量
Item.tbDevStuffRandRate = {1000, 100, 10, 1,}; -- 材料宝箱开启材料的初始概率
Item.tbDevStuffGDP = {18,1,1976}; -- 养成材料gdp
Item.DEVELOP_GROWTH_SKIP = 0; -- 成长属性跳跃成长类型
Item.DEVELOP_GROWTH_CONT = 1; -- 成长属性连续成长类型
Item.DEVELOP_REGEN_ATTRIB_ID = 1;
Item.DEVELOP_REGEN_ATTRIB_LEV = 2;
Item.DEVSTUFF_UNBIND_BUFF_ID = 3011;
Item.DEVSTUFF_UNBIND_BUFF_MAX_TIME = 56 * 60 * 60; -- 最大解绑时间
Item.DEVSTUFF_UNBIND_BUFF_VALID_TIME = 48 * 60 * 60; -- 解绑有效时间
Item.TASK_GROUPID_DEVSTUFF_UNBIND = 2241;
Item.TASK_ID_DEVSTUFF_UNBIND = 2;
Item.DEV_GRADE_UP_SUCCEED_TIMES = {3.2, 3.1, 3.1, 3.2}; -- 必成功的倍数
Item.DEV_EQUIP_EXTREN_INDEX = 12; -- 扩展配置
Item.MAX_UP_GRADE_FAILD_TIMES = 4; -- XXX 次数
Item.DEV_EQUIP_SUPPER_RAND_NEED = 5; -- 点睛石洗5攻
Item.c2sFun = Item.c2sFun or {};
----------------------------------------------------材料解绑------------------------------------------------------
-- 切换绑定类型 c2s
function Item:DevStuff_SwitchBind(nPlayerId, nOpType)
local pPlayer = KPlayer.GetPlayerObjById(nPlayerId);
if not pPlayer then
return;
end
if jbreturn:GetMonLimit(pPlayer) > 0 then
me.Msg("Không được dùng tính năng này.");
return;
end
Item:SwitchBindGift_Trigger(nPlayerId, nOpType, Item.SWITCHBIND_DEVSTUFF);
end
-- 检查物品类型
function Item:DevStuff_SwitchBind_Check(pDropItem)
if not pDropItem then
return 0;
end
if pDropItem.szClass ~= Item.DEV_STUFF_CLASS then
me.Msg("Hãy đặt vào nguyên liệu Thần Sa khóa!");
return 0;
end
if pDropItem.nLevel == 4 then
me.Msg("Thần Sa-Kình Tiếu Dẫn rất quý giá, hãy giữ lại dùng!");
return 0;
end
return 1;
end
-- 解绑成功
function Item:DevStuff_PostUnBind(nCount)
me.SetTask(self.TASK_GROUPID_DEVSTUFF_UNBIND, self.TASK_ID_DEVSTUFF_UNBIND, 0);
me.RemoveSkillState(self.DEVSTUFF_UNBIND_BUFF_ID);
Dbg:WriteLog("UnBindDevStuff", "Nhân vật:"..me.szName, "Tài khoản:"..me.szAccount, "Mở khóa thành công "..nCount.." nguyên liệu Thần Sa");
me.PlayerLog(Log.emKPLAYERLOG_TYPE_JOINSPORT, string.format("Mở khóa %s nguyên liệu Thần Sa.", nCount));
me.Msg(string.format("Đã mở khóa thành công %s nguyên liệu Thần Sa.", nCount));
end
-- 申请buf
function Item:ApplyDevStuffUnBind()
local nTime = me.GetTask(self.TASK_GROUPID_DEVSTUFF_UNBIND, self.TASK_ID_DEVSTUFF_UNBIND);
local nCurTime = GetTime();
if nTime > 0 and (nCurTime - nTime) < Item.DEVSTUFF_UNBIND_BUFF_MAX_TIME then
me.Msg("Bạn đã đăng ký.")
return;
end
local nRet = me.AddSkillState(self.DEVSTUFF_UNBIND_BUFF_ID, 1, 2, self.DEVSTUFF_UNBIND_BUFF_MAX_TIME * Env.GAME_FPS, 1, 0, 1)
if nRet == 1 then
me.SetTask(self.TASK_GROUPID_DEVSTUFF_UNBIND, self.TASK_ID_DEVSTUFF_UNBIND, GetTime());
me.Msg("Bạn đã đăng ký mở khóa nguyên liệu Thần Sa.");
me.CallClientScript({"Ui:ServerCall", "UI_EQUIPCOMPOSE", "OnEventResult", Item.ENHANCE_MODE_DEVSTUFF_UNBIND});
end
end
Item.c2sFun["ApplyDevStuffUnBind"] = Item.ApplyDevStuffUnBind;
-- 取消buf
function Item:CancelDevStuffUnBind()
if me.GetTask(self.TASK_GROUPID_DEVSTUFF_UNBIND, self.TASK_ID_DEVSTUFF_UNBIND) <= 0 then
me.Msg("Bạn chưa đăng ký, không thể hủy.")
return;
end
me.SetTask(self.TASK_GROUPID_DEVSTUFF_UNBIND, self.TASK_ID_DEVSTUFF_UNBIND, 0);
me.RemoveSkillState(self.DEVSTUFF_UNBIND_BUFF_ID);
me.Msg("Bạn đã hủy đăng ký mở khóa nguyên liệu Thần Sa.");
me.CallClientScript({"Ui:ServerCall", "UI_EQUIPCOMPOSE", "OnEventResult", Item.ENHANCE_MODE_DEVSTUFF_UNBIND});
end
Item.c2sFun["CancelDevStuffUnBind"] = Item.CancelDevStuffUnBind;
function Item:CheckDevelopCommon(pItem)
if me.IsAccountLock() ~= 0 then
return 0, "Tài khoản đang bị khóa, không thể thao tác!";
end
if MODULE_GAMESERVER then
if Account:Account2CheckIsUse(me, 7) == 0 then
return 0, "Bạn đang đăng nhập trò chơi bằng mật mã phụ, không thể thực hiện thao tác này!";
end
local tbDevelopReGen = me.GetTempTable("Item").tbDevelopReGen;
if tbDevelopReGen and pItem and tbDevelopReGen.dwEquipId == pItem.dwId then
return 0, "";
else
me.GetTempTable("Item").tbDevelopReGen = nil;
end
end
return 1;
end
----------------------------------------------------属性成长------------------------------------------------------
-- 养成一条属性:养成装备、要养成属性的索引
function Item:DevelopAttrib(pItem, nIndex)
local nRet, var = self:CheckCanDevelopAttrib(pItem, nIndex);
if nRet ~= 1 then
me.Msg(var);
return 0;
end
-- 做随机操作,并扣除材料
local nRes, var, var2 = self:CalcAttribDevelop(pItem, nIndex);
local nLogRes = 0;
if nRes == 1 then
local nNewLevel = var;
local nDevLev = pItem.GetAttribDevelopInfo(nIndex);
pItem.SetAttribDevelopInfo(nIndex, nNewLevel);
nRet = pItem.Regenerate(
pItem.nGenre,
pItem.nDetail,
pItem.nParticular,
pItem.nLevel,
pItem.nSeries,
pItem.nEnhTimes,
pItem.nLucky,
pItem.GetGenInfo(),
0,
pItem.dwRandSeed,
pItem.nStrengthen);
if nRet ~= 1 then
pItem.SetAttribDevelopInfo(nIndex, nDevLev);
local szLog = string.format("[%d] dưỡng thành thất bại, tái lập thành %d", nIndex, nDevLev);
Dbg:WriteLog("EquipDevelop", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Regenerate vật phẩm thất bại,"..szLog);
nLogRes = -1;
else
if var2 and type(var2) == "number" and var2 >= 1 then
pItem.Bind(var2);
end
nLogRes = 1;
local szMsg = string.format("Thành công, thuộc tính thứ %d tăng <color=gold>%d cấp<color>, đạt <color=gold>%d<color>",
nIndex, nNewLevel - nDevLev, nNewLevel);
me.Msg(szMsg);
Dialog:SendBlackBoardMsg(me, szMsg);
-- 排行榜
self:ApplyDevelopLadder(pItem);
end
else
me.Msg(var);
Dialog:SendBlackBoardMsg(me, var);
if nRes == 0 then -- 流程被打断了
return 0;
end
nLogRes = 0; -- 现在才是真正的失败
end
-- 埋点
local tbNeed = Item:GetAttribDevelopNeed(pItem.nDevelopGrade) or {};
local szLog = string.format("%s,%d", pItem.SzGDPL("_"), nLogRes);
for _, tbInfo in pairs(tbNeed) do
szLog = szLog..string.format(",%d_%d_%d_%d,%d", unpack(tbInfo));
end
StatLog:WriteStatLog("stat_info", "platinum","develop", me.nId, szLog);
return nLogRes == 1 and 1 or 0;
end
-- 判断某条属性是否可激活:养成装备、要养成属性的索引
function Item:CheckCanDevelopAttrib(pItem, nIndex)
local nRet, var = self:CheckDevelopCommon(pItem)
if nRet == 0 then
return nRet, var;
end
-- 是养成装备
if pItem.IsDevelopEquip() == 0 then
return 0, "Chỉ có vũ khí Thần Sa mới có thể dưỡng thành thuộc tính";
end
local nDevelopGrade = pItem.nDevelopGrade;
if nDevelopGrade >= self.MAX_GRADE then
return 0, "Trang bị đã đạt cấp cao nhất, không cần dưỡng thành tiếp!";
end
local nDevLev = pItem.GetAttribDevelopInfo(nIndex);
if not nDevLev or nDevLev == -1 then
return 0, "Hãy chọn đúng thuộc tính";
elseif nDevLev >= self.tbGradeMaxDevelop[nDevelopGrade] then
return 0, "Thuộc tính đã đạt cấp cao nhất, vũ khí thăng cấp mới được dưỡng thành tiếp";
end
-- 查找所需材料
local nGrowthType = self:GetAttribGrowthType(pItem, nIndex);
if not nGrowthType then
return 0, "Số liệu trang bị bị lỗi!";
end
local tbNeed = self:GetAttribDevelopNeed(nDevelopGrade, nGrowthType);
local nRet, var, varBindTips = self:IsMaterialEngouh(tbNeed, pItem.IsBind());
if nRet == 0 then
return 2, string.format("Tăng thuộc tính cần nguyên liệu %s không đủ!", var)
end
return 1, var, varBindTips;
end
-- 计算装备某条属性本次养成需要相关材料
-- 返回值:{ {g,d,p,l, n}, ..., {g,d,p,l, n} }
function Item:GetAttribDevelopNeed(nDevelopGrade, nGrowthType)
-- local nCount = 0;
-- if nGrowthType == self.DEVELOP_GROWTH_CONT then
-- nCount = self.ATTRIB_CONT_DEV_STUFF_NEED;
-- elseif nGrowthType == self.DEVELOP_GROWTH_SKIP then
-- nCount = self.tbAttribSkipDevStuffNeed[nDevelopGrade] or 0;
-- end
local nCount = self.ATTRIB_CONT_DEV_STUFF_NEED;
if nCount == 0 then
return;
end
local tb =
{
{self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3], nDevelopGrade, nCount};
}
local nValue = 0;
for _, tbNeed in pairs(tb) do
local tbBaseInfo = KItem.GetItemBaseProp(unpack(tbNeed, 1, 4));
if tbBaseInfo then
nValue = nValue + tbBaseInfo.nValue * nCount;
end
end
return tb, nValue;
end
-- 计算属性养成操作结果
-- 返回值:如果不可养成:0、不可原因;如果可以养成且成功:1、养成后属性提升等级;
-- 如果可以养成但失败:2;
function Item:CalcAttribDevelop(pItem, nIndex)
local nDevelopGrade = pItem.nDevelopGrade;
local nGrowthType = self:GetAttribGrowthType(pItem, nIndex);
if not nGrowthType then
return 0, "Hệ thống bị lỗi, hãy liên hệ hỗ trợ!";
end
local tbNeed, nValue = self:GetAttribDevelopNeed(nDevelopGrade, nGrowthType);
if not tbNeed then
return 0, "Nguyên liệu bị lỗi";
end
-- 查找材料是否满足
local nRet, szDesc = self:IsMaterialEngouh(tbNeed);
if nRet == 0 then
return nRet, string.format("Tăng thuộc tính cần nguyên liệu %s không đủ!", szDesc);
end
-- 说明可以养成了,计算养成成功率及成功提升等级
local nCurLv = pItem.GetAttribDevelopInfo(nIndex);
local nRet, tbRate = self:GetAttribDevSetting(nDevelopGrade, nCurLv, nValue, nGrowthType);
if nRet == 0 then
return 0, "Hệ thống bị lỗi, hãy liên hệ hỗ trợ!";
end
-- 扣除材料
local nRet, bWithBind = self:ConsumeItems(tbNeed, Player.emKLOSEITEM_DEVELOP_ATTRIB, pItem.IsBind());
if nRet == 0 then
return 0, "Trừ nguyên liệu thất bại";
end
local nRand = MathRandom(10^6);
local nRandLevel = 0;
for nLev, nRate in pairs(tbRate) do
if nRand <= nRate then
nRandLevel = nLev;
break;
else
nRand = nRand - nRate;
end
end
if nRandLevel > nCurLv then
return 1, nRandLevel, bWithBind;
end
-- 否则是失败了
return 2, "Dưỡng thành thất bại";
end
-- 返回值:tbRate几率表,索引表示提升等级,值表示提升几率(索引为0时表示失败)
function Item:GetAttribDevSetting(nDevelopGrade, nCurLv, nValue, nGrowthType)
local nRet, varRate;
-- if nGrowthType == self.DEVELOP_GROWTH_CONT then
-- nRet, varRate = self:_CalcAttribDevelopRate_Cont(nDevelopGrade, nCurLv, nValue);
-- elseif nGrowthType == self.DEVELOP_GROWTH_SKIP then
-- nRet, varRate = self:_CalcAttribDevelopRate_Skip(nDevelopGrade, nCurLv, nValue);
-- else
-- assert(false);
-- end
nRet, varRate = self:_CalcAttribDevelopRate_Cont(nDevelopGrade, nCurLv, nValue);
if nRet == 0 then
return 0;
end
return nRet, varRate;
end
function Item:GetAttribGrowthType(pItem, nIndex)
-- 是否是连续养成的
local nAttSettingId = self:GetDevelopAttribSettingId(pItem, nIndex);
local tbSetting = KItem.GetDevelopMASetting(nAttSettingId);
if not tbSetting then
return;
end
local nGrowthType = tbSetting.nGrowthType;
return nGrowthType;
end
----------------------------------------------------装备升档------------------------------------------------------
-- 装备升档
function Item:DevelopGrade(pItem, nSucceed)
local nRet, var = self:CheckCanDevelopGrade(pItem, nSucceed);
if nRet ~= 1 then
me.Msg(var);
return 0;
end
local szOldItemName = pItem.szName;
-- 升档会清除装备之前记录的属性养成值
local tbDevInfo = pItem.GetAttribDevelopInfo();
if not tbDevInfo then
return 0;
end
local tbDevInfoNew = {};
for i = 1, #tbDevInfo do
tbDevInfoNew[i] = 0;
end
-- 获取对应升档道具信息
local tbGradeInfo = self:GetGradeSetting(pItem);
if not tbGradeInfo or #tbGradeInfo == 0 then
return 0;
end
local nFaildTimes = self:GetDevEquipUpGradeFaildTimes(pItem);
-- 消耗物品,并随机
local nRet, var = self:CalcGradeDevelop(pItem.nDevelopGrade, pItem.IsBind(), nFaildTimes, nSucceed);
local nLogRes = 0;
local szOldGDPL = pItem.SzGDPL("_");
local nOldDevelop = pItem.nDevelopGrade;
if nRet == 1 then
pItem.SetAttribDevelopInfo(-1, tbDevInfoNew);
local nRet = pItem.Regenerate(
tbGradeInfo[1],
tbGradeInfo[2],
tbGradeInfo[3],
tbGradeInfo[4],
pItem.nSeries,
pItem.nEnhTimes,
pItem.nLucky,
pItem.GetGenInfo(),
0,
pItem.dwRandSeed,
pItem.nStrengthen);
if nRet ~= 1 then
pItem.SetAttribDevelopInfo(-1, tbDevInfo);
local szLog = string.format("Tăng trang bị [%s] thất bại", pItem.SzGDPL());
Dbg:WriteLog("DevelopGrade", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Regenerate vật phẩm thất bại,"..szLog);
nLogRes = -1;
else
if var and type(var) == "number" and var == 1 then
pItem.Bind(var);
end
-- 尝试自动对其属性备份
if (self:AutoUpdateDevWeaponBackupData(pItem) == 1) then
--local szDate = os.date("%Y年%m月%d日%H时%M分", GetTime());
Player:__AlterMsg(me, "Tiến cấp thành công! Thuộc tính của vũ khí đã được cập nhật đồng bộ");
end
local szMsg1 = string.format("<color=gold>%s<color> đã tiến cấp thành <color=gold>%s<color>!!!", szOldItemName, pItem.szName);
me.Msg(szMsg1);
Dialog:SendBlackBoardMsg(me, szMsg1);
-- 家族、好友公告
local szMsg2 = string.format("<color=gold>%s<color> đã tăng cấp thành <color=gold>%s<color>", szOldItemName, pItem.szName);
Player:SendMsgToKinOrTong(me,szMsg2, 1);
me.SendMsgToFriend("Hảo hữu của bạn"..me.szName..szMsg2);
if pItem.nDevelopGrade == 4 then
Dialog:SendInfoBoardMsg(me, szMsg1)-- 屏幕中央黄色
elseif pItem.nDevelopGrade == Item.MAX_GRADE then
--Dialog:GlobalNewsMsg_GS("恭喜"..me.szName..szMsg2) -- 全服公告
GCExcute({"Dialog:GlobalNewsMsg_GC", "Chúc mừng"..me.szName..szMsg2});
end
self:SetDevEquipUpGradeFaildTimes(pItem, 0);
nLogRes = 1;
end
pItem.Sync();
else
me.Msg(var);
Dialog:SendBlackBoardMsg(me, var);
if nRet == 0 then
return 0;
end
nLogRes = 0;
self:SetDevEquipUpGradeFaildTimes(pItem, nFaildTimes + 1);
end
-- 排行榜
self:ApplyDevelopLadder(pItem);
-- 埋点
local tbNeed = Item:GetGradeDevelopNeed(nOldDevelop, nSucceed) or {};
local szLog = string.format("%s,%d", szOldGDPL, nLogRes);
for _, tbInfo in pairs(tbNeed) do
szLog = szLog..string.format(",%d_%d_%d_%d,%d", unpack(tbInfo));
end
StatLog:WriteStatLog("stat_info", "platinum","udpate_lv", me.nId, szLog);
Dbg:WriteLog("DevelopGrade", "Tăng cấp", me.szAccount, me.szName, pItem.szGUID, self:GetRegenInfoLog(pItem.GetGenInfo(), pItem.nDevelopGrade));
return nLogRes == 1 and 1 or 0;
end
-- 判断是否可升档
function Item:CheckCanDevelopGrade(pItem, nSucceed)
local nRet, var = self:CheckDevelopCommon(pItem)
if nRet == 0 then
return nRet, var;
end
-- 是养成装备
if pItem.IsDevelopEquip() == 0 then
return 0, "Hãy đặt vào toàn bộ vũ khí Thần Sa có cấp dưỡng thành tối đa";
end
local nDevelopGrade = pItem.nDevelopGrade;
if nDevelopGrade >= self.MAX_GRADE then
return 0, "Trang bị đã đạt cấp cao nhất";
end
-- 检查武器升档时间
local bTimeFrameLevel119 = TimeFrame:IsOpenLevel119();
if bTimeFrameLevel119 == 1 then
local nNeedDay = self.tbDevelopGradeOpenDay[nDevelopGrade];
local nServerOpenDay = TimeFrame:GetServerOpenDay();
if nNeedDay > nServerOpenDay then
return 0, string.format("Ngày mở server thứ %s, vũ khí của bạn mới có thể tăng cấp tới %s",nNeedDay,self.tbGradeLvDesc[nDevelopGrade]);
end
end
-- 所有属性达档次最高级
local tbAttrib = pItem.GetAttribDevelopInfo();
if not tbAttrib then
return 0, "Số liệu trang bị bị lỗi, hãy liên hệ hỗ trợ!";
end
for i, nDevLev in pairs(tbAttrib) do
if nDevLev ~= -1 and nDevLev < self.tbGradeMaxDevelop[nDevelopGrade] then
return 0, "Thuộc tính dưỡng thành chưa đạt tối đa, không thể tăng thành vũ khí Thần Sa cấp cao hơn";
end
end
-- 档次未达上限 升级到4档要卓越,升级到5档要史诗
if self.tbNeedcastLevel[nDevelopGrade+1] then
local nCastLev = pItem.GetEquipExValue(self.ITEM_TASKVAL_EX_SUBID_CastLevel);
local nActualCastLev = self.tbWeaponCastLevSor[nCastLev] or 0;
if nActualCastLev < self.tbNeedcastLevel[nDevelopGrade+1][1] then
return 2, self.tbNeedcastLevel[nDevelopGrade+1][2];
end
end
-- 查找所需材料
local tbNeed = Item:GetGradeDevelopNeed(nDevelopGrade, nSucceed);
local nRet, szDesc, varBindTips = self:IsMaterialEngouh(tbNeed, pItem.IsBind());
if nRet == 0 then
return 2, string.format("Nguyên liệu %s không đủ!", szDesc);
end
return 1, varBindTips;
end
function Item:CalcGradeDevelop(nDevelopGrade, bBind, nFaildTimes, nSucceed)
local nRate = self:GetGradeDevelopRate(nDevelopGrade);
if not nRate then
return 0, "Hệ thống bị lỗi, hãy liên hệ hỗ trợ!";
end
-- 先消耗
local tbNeed = Item:GetGradeDevelopNeed(nDevelopGrade, nSucceed);
local nRet, bWithBind = self:ConsumeItems(tbNeed, Player.emKLOSEITEM_DEVELOP_GRADE, bBind);
if nRet == 0 then
return 0, "Trừ nguyên liệu thất bại";
end
-- 再随机
if nFaildTimes < self.MAX_UP_GRADE_FAILD_TIMES and (not nSucceed or nSucceed ~= 1) then
local nRand = MathRandom(10000); -- 因为概率是用万分比表示的,所以在10000内随机
if nRand > nRate then
return 2, "Tăng cấp thất bại";
end
end
return 1, bWithBind;
end
-- 升档成功概率,万分比
function Item:GetGradeDevelopRate(nDevelopGrade)
return self.tbDevelopGradeRate[nDevelopGrade];
end
function Item:GetGradeDevelopNeed(nGrade, nSucceed)
local tbNeed =
{
{ {self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3],1, 9}, },
{ {self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3],2, 10}, },
{ {self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3],3, 14}, },
{ {self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3],4, 18}, },
}
local tbRetNeed = tbNeed[nGrade];
if nSucceed and nSucceed == 1 then
for _, _tbNeed in ipairs(tbRetNeed) do
_tbNeed[5] = math.ceil(_tbNeed[5] * self.DEV_GRADE_UP_SUCCEED_TIMES[nGrade]);
end
end
return tbRetNeed;
end
-- 获取升到下一档的道具的GDPL
function Item:GetGradeSetting(pItem)
local nDevelopGrade = pItem.nDevelopGrade;
if not self.tbDevelopGradeSetting or
not self.tbDevelopGradeSetting[nDevelopGrade] or
not self.tbDevelopGradeSetting[nDevelopGrade + 1] then
return;
end
local szGDPL = pItem.SzGDPL();
local nGradeIndex = 0;
for i, szItemId in pairs(self.tbDevelopGradeSetting[nDevelopGrade] or {}) do
if szGDPL == szItemId then
nGradeIndex = i;
break;
end
end
local szInfo = self.tbDevelopGradeSetting[nDevelopGrade + 1][nGradeIndex];
local tbGradeInfo = Lib:SplitStr(szInfo or "");
for i, v in pairs(tbGradeInfo) do
tbGradeInfo[i] = tonumber(v);
end
return tbGradeInfo;
end
----------------------------------------------------重随属性------------------------------------------------------
function Item:ReGenDevelopAttrib(pItem, nGenFlag)
local nPhyType, nPvType = self:GetDevelopAttribType(pItem);
if not nPhyType or not nPvType then
return 0;
end
if nGenFlag < self.DEVELOP_REGEN_ATTRIB_ID or
nGenFlag > self.DEVELOP_REGEN_ATTRIB_LEV then
return 0;
end
local nRet, var = Item:CheckCanRegenAttrib(pItem, nGenFlag);
if nRet == 0 then
me.Msg(var);
return 0;
end
local nSupperDevEquip = 0;
if nGenFlag == self.DEVELOP_REGEN_ATTRIB_ID then
if type(var) ~= "number" then
return 0;
end
nSupperDevEquip = var;
end
local tbNewGenInfo = KItem.ReGenerateDevelopBaseAttrib(
nGenFlag,
pItem.nSeries,
nPhyType,
nPvType,
pItem.nDevelopGrade,
pItem.GetGenInfo(),
{},
0
);
if not tbNewGenInfo then
return 0;
end
-- 消耗!!! 一个重铸符,一个材料
local tbNeed = self:GetReGenNeed(pItem, nGenFlag);
local nRet, bWithBind = self:ConsumeItems(tbNeed, Player.emKLOSEITEM_REGEN_DEVELOP_ATTRIB, pItem.IsBind());
if nRet == 0 then
return 0;
end
--TODO:不用检查以前的缓存变量吗??
local tbTemplate = me.GetTempTable("Item");
tbTemplate.tbDevelopReGen = {};
local tbDevelopReGen = {};
tbDevelopReGen.dwEquipId = pItem.dwId;
tbDevelopReGen.tbNewGenInfo = tbNewGenInfo;
tbDevelopReGen.nBind = math.max(pItem.IsBind(), bWithBind or 0);
tbDevelopReGen.nGenFlag = nGenFlag;
tbTemplate.tbDevelopReGen = tbDevelopReGen;
-- 移除buff
if nSupperDevEquip == 1 then
self:RemoveEnhBuff();
end
self:SetDevEquipUpGradeFaildTimes(pItem, 0);
tbNewGenInfo[self.DEV_EQUIP_EXTREN_INDEX] = 0;
-- 埋点
local szLog = string.format("%s,%d", pItem.SzGDPL("_"), nGenFlag);
for _, tbInfo in pairs(tbNeed) do
szLog = szLog..string.format(",%d_%d_%d_%d,%d", unpack(tbInfo));
end
StatLog:WriteStatLog("stat_info", "platinum","recasting", me.nId, szLog);
return 1, tbNewGenInfo; -- 把新属性表返回,同步给客户端作展示用
end
-- nOperate:0、关闭UI,1、选择旧装备,2、选择新装备
function Item:ReGenDevelopConfirm(dwId, nOperate)
if nOperate == 3 then
me.GetTempTable("Item").tbDevelopReGen = nil;
return 0;
end
local tbTemplate = me.GetTempTable("Item");
local tbDevelopReGen = tbTemplate.tbDevelopReGen;
if not tbDevelopReGen or tbDevelopReGen.dwEquipId ~= dwId then
return 0;
end
local pItem = KItem.GetObjById(dwId);
if not pItem then
return 0;
end
local szRegenInfoLog = string.format("Loại tái lập: %d, kết quả tái lập: %s", tbDevelopReGen.nGenFlag,
self:GetRegenInfoLog(tbDevelopReGen.tbNewGenInfo, pItem.nDevelopGrade));
if nOperate == 2 then -- 选择新装备
local nRet = pItem.Regenerate(
pItem.nGenre,
pItem.nDetail,
pItem.nParticular,
pItem.nLevel,
pItem.nSeries,
pItem.nEnhTimes,
pItem.nLucky,
tbDevelopReGen.tbNewGenInfo,
0,
pItem.dwRandSeed,
pItem.nStrengthen);
if nRet == 0 then
Dbg:WriteLog("ReGenDevelopAttrib", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Regenerate đạo ** thất bại, tái lập thuộc tính trưởng thành thất bại."..szRegenInfoLog);
return 0;
end
pItem.Bind(tbDevelopReGen.nBind);
self:ApplyDevelopLadder(pItem);
local szLog = string.format("Tái lập thuộc tính trang bị {%s_%d}, chọn trang bị đúc mới. %s", pItem.szName, tbDevelopReGen.nGenFlag, szRegenInfoLog);
me.PlayerLog(Log.emKITEMLOG_TYPE_USE, szLog);
Dbg:WriteLog("ReGenDevelopAttrib", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Chọn trang bị đúc ["..nOperate.."]."..pItem.szGUID..szRegenInfoLog);
if tbDevelopReGen.nGenFlag == Item.DEVELOP_REGEN_ATTRIB_ID then
Player:__AlterMsg(me, "Đúc thành công! Nếu vũ khí này có <color=green>giá trị lưu<color>, cần thực hiện <color=green>thao tác lưu<color> lần nữa.");
end
elseif nOperate == 0 or nOperate == 1 then -- 选择取消或旧装备
local szLog = string.format("Tái lập thuộc tính trang bị {%s_%d}, hủy trang bị đúc mới. %s", pItem.szName, tbDevelopReGen.nGenFlag, szRegenInfoLog);
me.PlayerLog(Log.emKITEMLOG_TYPE_USE, szLog);
Dbg:WriteLog("ReGenDevelopAttrib", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Hủy đúc trang bị ["..nOperate.."]."..pItem.szGUID..szRegenInfoLog);
else
Dbg:WriteLog("ReGenDevelopAttrib", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Yêu cầu thao tác không đúng ["..nOperate.."]."..pItem.szGUID..szRegenInfoLog);
end
-- 置空缓存数据
tbTemplate.tbDevelopReGen = nil;
end
function Item:CheckCanRegenAttrib(pItem, nGenFlag)
local nRet, var = self:CheckDevelopCommon()
if nRet == 0 then
return nRet, var;
end
local tbNeed = self:GetReGenNeed(pItem, nGenFlag);
local nRet, szDesc = self:IsMaterialEngouh(tbNeed);
if nRet == 0 then
return 0, string.format("Đúc %s cần nguyên liệu %s không đủ!",
nGenFlag == Item.DEVELOP_REGEN_ATTRIB_ID and "Loại" or "Cấp",
szDesc);
end
-- 极品武器检查
local nSupperDevEquip = 0;
if MODULE_GAMESERVER and nGenFlag == Item.DEVELOP_REGEN_ATTRIB_ID then
nSupperDevEquip = self:IsSupperDevEquip(pItem);
if nSupperDevEquip == 1 then
local nRet, var = self:CheckDevelopPeelTime("Đúc vũ khí Thần Sa cực phẩm");
if nRet ~= 1 then
return 0, var or "";
end
end
end
return 1, nSupperDevEquip;
end
-- 对应等级材料一枚,重铸符一枚
function Item:GetReGenNeed(pItem, nGenFlag)
local nStuffLev = pItem.nDevelopGrade;
if self:IsItemDeveloped(pItem) == 0 then
nStuffLev = nStuffLev - 1;
end
nStuffLev = nStuffLev > 0 and nStuffLev or 1;
if not self.tbRegenStuffNeed[nGenFlag] or
not self.tbRegenStuffNeed[nGenFlag][pItem.nDevelopGrade] then
return;
end
local nStuffCount = self.tbRegenStuffNeed[nGenFlag][pItem.nDevelopGrade]
local tb =
{
{self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3],nStuffLev,nStuffCount},
--{18,1,1199,1,1}, -- 重铸符
};
return tb;
end
----------------------------------------------------养成传承------------------------------------------------------
function Item:DevelopInherit(pDstItem, tbSrcItem)
if not tbSrcItem or #tbSrcItem ~= 1 then
me.Msg("Hãy đặt vào đúng đạo **");
return 0;
end
local pSrcItem = tbSrcItem[1];
local nRet, var = self:CheckCanDevelopInherit(pSrcItem, pDstItem);
if nRet == 0 then
me.Msg(var);
return 0;
end
if type(var) ~= "number" then
return 0;
end
local nSupperDevEquip = var;
local tbNeed = self:GetDevelopInheritNeed(pSrcItem);
-- TODO:被传承的武器会根据消耗的材料进行绑定 对源武器没有影响
local nRet, bWithBind = self:ConsumeItems(tbNeed, Player.emKLOSEITEM_DEVELOP_INHERIT, pDstItem.IsBind());
if nRet == 0 then
me.Msg("Trừ nguyên liệu thất bại");
return 0;
end
local tbSrcGrade, tbDstGrade = self:GetDevelopInheritGradeInfo(pSrcItem, pDstItem);
if not tbSrcGrade or #tbSrcGrade == 0 or
not tbDstGrade or #tbDstGrade == 0 then
return 0;
end
local szSrcGDPL, szDstGDPL = pSrcItem.SzGDPL("_"), pDstItem.SzGDPL("_");
-- 先清除源道具的信息, 养成全变0并降至1档
local tbOrgDevInfo = pSrcItem.GetAttribDevelopInfo();
local tbNewDevInfo = {};
for i = 1, #tbOrgDevInfo do
tbNewDevInfo[i] = 0;
end
pSrcItem.SetAttribDevelopInfo(-1, tbNewDevInfo);
local tbSrcNewGenInfo = pSrcItem.GetGenInfo();
if pSrcItem.nDevelopGrade > 1 then -- 1档以上的武器重随属性类型
tbSrcNewGenInfo = self:GetRegenInfo(
pSrcItem, 1, Item.DEVELOP_REGEN_ATTRIB_ID -- 随机属性类型,等级不变化
);
end
if not tbSrcNewGenInfo then
return 0;
end
local szSrcRegenInfoLog = string.format("Thuộc tính vũ khí gốc [%s%s] trước khi kế thừa: %s, sau khi kế thừa: %s.", pSrcItem.szName, pSrcItem.szGUID,
self:GetRegenInfoLog(pSrcItem.GetGenInfo(), pSrcItem.nDevelopGrade),
self:GetRegenInfoLog(tbSrcNewGenInfo, 1) );
-- 移除buff
if nSupperDevEquip == 1 then
self:RemoveEnhBuff();
end
local nRet = pSrcItem.Regenerate(
tbSrcGrade[1],
tbSrcGrade[2],
tbSrcGrade[3],
tbSrcGrade[4],
pSrcItem.nSeries,
pSrcItem.nEnhTimes,
pSrcItem.nLucky,
tbSrcNewGenInfo, --pSrcItem.GetGenInfo(),
0,
pSrcItem.dwRandSeed,
pSrcItem.nStrengthen);
if nRet == 0 then
pSrcItem.SetAttribDevelopInfo(-1, tbOrgDevInfo);
local szLog = string.format("Regenerate đạo ** gốc [%s%s] thất bại, quay lại! %s", pSrcItem.szName, pSrcItem.szGUID, szSrcRegenInfoLog);
Dbg:WriteLog("DevelopInherit", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, szLog);
return 0;
end
self:ApplyDevelopLadder(pSrcItem);
pSrcItem.Sync();
Dbg:WriteLog("DevelopInherit", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Trang bị gốc Regenerate thành công,"..szSrcRegenInfoLog);
-- 再应用目标道具的信息
local szOldDstItemInfo = self:GetRegenInfoLog(pDstItem.GetGenInfo(), pDstItem.nDevelopGrade);
local tbGradeInfo = {};
pDstItem.SetAttribDevelopInfo(-1, tbOrgDevInfo);
nRet = pDstItem.Regenerate(
tbDstGrade[1],
tbDstGrade[2],
tbDstGrade[3],
tbDstGrade[4],
pDstItem.nSeries,
pDstItem.nEnhTimes,
pDstItem.nLucky,
pDstItem.GetGenInfo(),
0,
pDstItem.dwRandSeed,
pDstItem.nStrengthen);
local szNewDstItemInfo = self:GetRegenInfoLog(pDstItem.GetGenInfo(), pDstItem.nDevelopGrade);
if nRet == 0 then
pDstItem.SetAttribDevelopInfo(-1, tbNewDevInfo);
local szLog = string.format("Regenerate đạo ** gốc [%s%s] thành công, regenerate đạo ** mới [%s%s] thất bại! Thuộc tính trước khi kế thừa %s thuộc tính sau khi kế thừa %s", pSrcItem.szName, pSrcItem.szGUID, pDstItem.szName, pDstItem.szGUID, szOldDstItemInfo, szNewDstItemInfo);
Dbg:WriteLog("DevelopInherit", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, szLog);
else
local szLog = string.format("Regenerate đạo ** gốc [%s%s] thành công, regenerate đạo ** mới [%s%s] thành công! Thuộc tính trước khi kế thừa %s thuộc tính sau khi kế thừa %s", pSrcItem.szName, pSrcItem.szGUID, pDstItem.szName, pDstItem.szGUID, szOldDstItemInfo, szNewDstItemInfo);
Dbg:WriteLog("DevelopInherit", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, szLog);
end
self:ApplyDevelopLadder(pDstItem);
pDstItem.Sync();
if bWithBind and type(bWithBind) == "number" and bWithBind >= 1 then
pDstItem.Bind(bWithBind);
end
-- 不绑定被传承武器被绑定的武器传承后会被绑定
local bSrcItemBind = pSrcItem.IsBind();
if bSrcItemBind == 1 then
pDstItem.Bind(bSrcItemBind);
end
-- 自动存档
if (self:AutoUpdateDevWeaponBackupData(pDstItem) == 1) then
--local szDate = os.date("%Y年%m月%d日%H时%M分", GetTime());
Player:__AlterMsg(me, "Kế thừa thành công! Thuộc tính của vũ khí đã được cập nhật đồng bộ!");
end
self:SetDevEquipUpGradeFaildTimes(pDstItem, 0);
self:SetDevEquipUpGradeFaildTimes(pSrcItem, 0);
-- 埋点
local szLog = string.format("%s,%s", szSrcGDPL, szDstGDPL);
for _, tbInfo in pairs(tbNeed) do
szLog = szLog..string.format(",%d_%d_%d_%d,%d", unpack(tbInfo));
end
StatLog:WriteStatLog("stat_info", "platinum","inherit", me.nId, szLog);
return nRet;
end
function Item:CheckCanDevelopInherit(pSrcItem, pDstItem)
local nRet, var = self:CheckDevelopCommon()
if nRet == 0 then
return nRet, var;
end
if pSrcItem.IsDevelopEquip() == 0 or pDstItem.IsDevelopEquip() == 0 then
return 0, "Vũ khí kế thừa và được kế thừa đều phải là vũ khí Thần Sa";
end
--被传承武器只能是未养成,档次为1的白金武器
local bDeveloped = self:IsItemDeveloped(pDstItem);
if bDeveloped == 1 or pDstItem.nDevelopGrade ~= 1 then
return 0, "Vũ khí được kế thừa phải là vũ khí Thần Sa cấp 1 chưa dưỡng thành";
end
--判断传承武器是否有可传承的价值
bDeveloped = self:IsItemDeveloped(pSrcItem);
if bDeveloped == 0 and pSrcItem.nDevelopGrade == 1 then
return 0, "Vũ khí kế thừa không có điểm dưỡng thành, không thể kế thừa"
end
local tbNeed = self:GetDevelopInheritNeed(pSrcItem);
nRet, var = self:IsMaterialEngouh(tbNeed);
if nRet == 0 then
return 0, string.format("Kế thừa dưỡng thành cần nguyên liệu %s không đủ!", var);
end
-- 两件装备都不能镶有宝石
-- if pSrcItem.IsEquipHasStone() == 1 or
-- pDstItem.IsEquipHasStone() == 1 then
-- return 0, "参与养成传承的武器不能带有宝石";
-- end
-- 极品武器检查
local nSupperDevSrcEquip = 0;
if MODULE_GAMESERVER then
nSupperDevSrcEquip = self:IsSupperDevEquip(pSrcItem);
if nSupperDevSrcEquip == 1 and pSrcItem.nDevelopGrade > 1 then
local nRet, var = self:CheckDevelopPeelTime("Kế thừa dưỡng thành vũ khí Thần Sa cực phẩm");
if nRet ~= 1 then
return 0, var or "";
end
end
end
--local nSupperDevDstEquip = self:IsSupperDevEquip(pDstItem); 被传承的就不限制了 档次必须是1 而且 第五条以上的属性才会重随
return 1, nSupperDevSrcEquip;
end
function Item:IsItemDeveloped(pItem)
local tbDevelopInfo = pItem.GetAttribDevelopInfo();
local bDeveloped = 0;
for _, nValue in pairs(tbDevelopInfo or {}) do
if nValue > 0 then
bDeveloped = 1;
break;
end
end
return bDeveloped;
end
function Item:GetDevelopInheritGradeInfo(pSrcItem, pDstItem)
local nSrcDevGrade = pSrcItem.nDevelopGrade;
if not self.tbDevelopGradeSetting or
not self.tbDevelopGradeSetting[nSrcDevGrade] or
not self.tbDevelopGradeSetting[1] then
return;
end
local nSrcGradeIndex, nDstGradeIndex = 0, 0;
local szSrcGDPL = pSrcItem.SzGDPL();
local szDstGDPL = pDstItem.SzGDPL();
for i, szItemId in pairs(self.tbDevelopGradeSetting[nSrcDevGrade] or {}) do
if szItemId == szSrcGDPL then
nSrcGradeIndex = i;
break;
end
end
for i, szItemId in pairs(self.tbDevelopGradeSetting[1] or {}) do
if szItemId == szDstGDPL then
nDstGradeIndex = i;
break;
end
end
local szSrcGradeInfo = self.tbDevelopGradeSetting[1][nSrcGradeIndex];
local szDstGradeInfo = self.tbDevelopGradeSetting[nSrcDevGrade][nDstGradeIndex];
local tbSrcGradeInfo = Lib:SplitStr(szSrcGradeInfo or "");
local tbDstGradeInfo = Lib:SplitStr(szDstGradeInfo or "");
for i, v in pairs(tbSrcGradeInfo) do
tbSrcGradeInfo[i] = tonumber(v);
end
for i, v in pairs(tbDstGradeInfo) do
tbDstGradeInfo[i] = tonumber(v);
end
return tbSrcGradeInfo, tbDstGradeInfo;
end
-- 需要源道具10%养成期望价值量所对应的材料数量
function Item:GetDevelopInheritNeed(pSrcItem)
local nDevelopGrade = pSrcItem.nDevelopGrade;
local nValue = 0;
for i = 1, nDevelopGrade - 1 do
nValue = nValue + self.tbGradeExpectValue[i];
end
local tbInfo = pSrcItem.GetAttribDevelopInfo();
for i, nLevel in pairs(tbInfo) do
for j = 1, nLevel do
nValue = nValue + self.tbDevelopValueSetting[nDevelopGrade][j];
end
end
local nSuffLevel = nDevelopGrade;
if self:IsItemDeveloped(pSrcItem) == 0 then
nSuffLevel = nSuffLevel - 1;
end
nSuffLevel = nSuffLevel > 0 and nSuffLevel or 1;
local tb = {self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3], nSuffLevel};
local tbItemInfo = KItem.GetItemBaseProp(unpack(tb));
local nCount = math.ceil(nValue * (100 - self.DEV_PEEL_RET_RATE)/tbItemInfo.nValue / 100);
table.insert(tb, nCount);
-- 一个对应等级的材料
return { tb };
end
----------------------------------------------------解绑------------------------------------------------------
function Item:UnBindDevelopEquip(pItem)
if self:CheckDevelopEquipUnBind(pItem) == 0 then
return 0;
end
-- 消耗
local tbNeed = self:GetDevelopUnBindNeed();
if not tbNeed or self:ConsumeItems(tbNeed, Player.emKLOSEITEM_DEVELOP_UNBIND, pItem.IsBind()) == 0 then
return 0, "Trừ nguyên liệu thất bại"
end
-- 清除所有任务数据
local tbTaskData = self:GetItemTaskData(pItem);
self:ClearItemTaskData(pItem); -- 这个不会失败
-- 剥离
local nRet = pItem.Regenerate(
pItem.nGenre,
pItem.nDetail,
pItem.nParticular,
pItem.nLevel,
pItem.nSeries,
0, -- 强化次数清0
pItem.nLucky,
tbNewGenInfo,
0,
pItem.dwRandSeed,
pItem.nStrengthen);
if nRet == 0 then
self:SetItemTaskDataTable(pItem, tbTaskData);
Dbg:WriteLog("DevelopUnBind", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Regenerate đạo ** thất bại!");
return 0;
end
pItem.Bind(0); -- 不绑
return 1;
end
function Item:CheckDevelopEquipUnBind(pEquip)
if pEquip.IsDevelopEquip() == 0 then
return 0;
end
if pEquip.IsBind() == 0 then
return 0, "Trang bị này không khóa!";
end
local tbNeed = self:GetDevelopUnBindNeed();
local nRet, szDesc = self:IsMaterialEngouh(tbNeed);
if nRet == 0 then
return 0, "Nguyên liệu không đủ";
end
return 1;
end
function Item:GetDevelopUnBindNeed()
end
--------------------------------------------------胚子兑换---------------------------------------------------------
function Item:PlatinumRawExchange(pItem)
if me.CountFreeBagCell() < 1 then
return 0, "Hãy chừa ít nhất 1 ô trong túi";
end
local nRet, var = self:CalcRawExchangeResult(pItem);
if nRet == 0 then
me.Msg(var);
return 0;
end
local tbRet = var;
--结果数量不能是0
if tbRet[1][5] == 0 then
me.Msg("Số lượng không đúng, không thể đổi.");
return 0;
end
-- 设置数量为0了会自动删除
local nCostCount = pItem.nCount - tbRet[2][5];
local szOldGDPL = pItem.SzGDPL("_");
if pItem.SetCount(tbRet[2][5], Player.emKLOSEITEM_RAW_EXCHAGE) == 0 then
me.Msg("Hệ thống bị lỗi.");
return 0;
end
me.AddStackItem(tbRet[1][1], tbRet[1][2], tbRet[1][3], tbRet[1][4], nil, tbRet[1][5], Player.emKITEMLOG_TYPE_RAW_EXCHANGE);
-- 埋点
local szLog = string.format("%s,%d,%d_%d_%d_%d,%d", szOldGDPL, nCostCount,unpack(tbRet[1]));
StatLog:WriteStatLog("stat_info", "platinum","use_change", me.nId, szLog);
return 1;
end
function Item:CalcRawExchangeResult(pItem)
if true then
return 0, "Chức năng sắp mở, xin hãy đợi!";
end
local nRet, var = self:CheckDevelopCommon()
if nRet == 0 then
return nRet, var;
end
if pItem.szClass ~= self.RAW_CLASS then
return 0, "Chỉ có phôi vũ khí Thần Sa mới có thể đổi";
end
local tbRet = {};
local nExchangeCount = math.floor(pItem.nCount/2);
local nBalance = pItem.nCount%2;
if nExchangeCount <= 0 then
return 0, "Hãy đặt vào 2 phôi trở lên";
end
-- 兑换结果
tbRet[1] = {unpack(self.tbRawExchange[pItem.nParticular])};
table.insert(tbRet[1], nExchangeCount);
-- 剩余数理
tbRet[2] = {pItem.nGenre, pItem.nDetail, pItem.nParticular, pItem.nLevel, nBalance};
return 1, tbRet;
end
--------------------------------------------------材料拆解---------------------------------------------------------
function Item:BreakupDevStuff(pItem)
local nRet, var, var2 = self:CalcDevStuffBreakResult(pItem);
if nRet == 0 then
me.Msg(var);
return 0;
end
local nCostMoney = self:CalcDevStuffBreakCost(pItem.nCount);
if nCostMoney > me.nCashMoney then
me.Msg("Bạc không đủ.");
return 0;
end
local tbRes = var;
local nNeedCell = var2;
-- 背包空间
if me.CountFreeBagCell() < nNeedCell then
me.Msg(string.format("Cần %d ô túi trống", nNeedCell));
return 0;
end
if me.CostMoney(nCostMoney, Player.emKPAY_DEVSTUFF_BREAKUP) ~= 1 then
return 0;
end
local szLog = string.format("%s,%d", pItem.SzGDPL("_"), pItem.nCount);
local bBind = pItem.IsBind();
if pItem.Delete(me, Player.emKLOSEITEM_DEV_STUFF_BREAKUP) ~= 1 then
return 0;
end
-- 设置时间、绑定类型??
local tbItemInfo = {};
tbItemInfo.bForceBind = bBind;
me.AddStackItem(tbRes[1], tbRes[2], tbRes[3], tbRes[4], tbItemInfo, tbRes[5], Player.emKITEMLOG_TYPE_DEV_STUFF_BREAKUP);
-- 埋点
szLog = szLog..string.format(",%d_%d_%d_%d,%d", unpack(tbRes));
StatLog:WriteStatLog("stat_info", "platinum","demote", me.nId, szLog);
return 1;
end
function Item:CalcDevStuffBreakResult(pItem)
local nRet, var = self:CheckDevelopCommon()
if nRet == 0 then
return nRet, var;
end
if pItem.szClass ~= self.DEV_STUFF_CLASS or
pItem.nLevel < 2 then
return 0, "Hãy đặt vào nguyên liệu cấp 2 trở lên";
end
local tbRet = {pItem.nGenre, pItem.nDetail, pItem.nParticular, pItem.nLevel - 1, pItem.nCount * 3};
local nNeedCell = KItem.GetNeedFreeBag(tbRet[1], tbRet[2], tbRet[3], tbRet[4], nil, tbRet[5]);
return 1, tbRet, nNeedCell;
end
function Item:CalcDevStuffBreakCost(nCount)
return nCount * 2 * self.DEV_STUFF_BREAK_PRICE; -- 相当于产生了两个低级材料
end
--------------------------------------------------养成剥离---------------------------------------------------------
function Item:GetDevPeelRet(pItem)
local nDevGrade = pItem.nDevelopGrade;
local nValue = 0;
local tbRet = {};
for i = 1, nDevGrade -1 do
nValue = self.tbGradeExpectValue[i] * self.DEV_PEEL_RET_RATE/100;
local tbItemInfo = KItem.GetItemBaseProp(self.tbDevStuffGDP[1], self.tbDevStuffGDP[2],self.tbDevStuffGDP[3], i);
tbRet[i] = math.floor(nValue/tbItemInfo.nValue);
end
nValue = 0;
local tbInfo = pItem.GetAttribDevelopInfo();
for i, nLevel in pairs(tbInfo) do
for j = 1, nLevel do
nValue = nValue + self.tbDevelopValueSetting[nDevGrade][j];
end
end
nValue = nValue * self.DEV_PEEL_RET_RATE/100;
local tbItemInfo = KItem.GetItemBaseProp(self.tbDevStuffGDP[1], self.tbDevStuffGDP[2],self.tbDevStuffGDP[3], nDevGrade);
tbRet[nDevGrade] = math.floor(nValue/tbItemInfo.nValue);
return tbRet;
end
function Item:DevelopPeel(pItem)
local nRet, var1, var2, nSupperDevEquip = Item:CheckCanDevPeel(pItem);
if nRet ~= 1 then
me.Msg(var1);
return 0;
end
local tbRet, tbResGDPL = var1, var2;
local szOldGDPL = pItem.SzGDPL("_");
local nOldDevGrade = pItem.nDevelopGrade;
-- 剥离装备
local tbAttribDevInfo = pItem.GetAttribDevelopInfo();
local tbNewInfo = {};
for i, v in pairs(tbAttribDevInfo) do
tbNewInfo[i] = 0;
end
pItem.SetAttribDevelopInfo(-1, tbNewInfo);
-- 重随属性
local tbNewGenInfo = pItem.GetGenInfo();
if pItem.nDevelopGrade > 1 then -- 1档以上的武器重随属性类型
tbNewGenInfo = self:GetRegenInfo(
pItem, 1, Item.DEVELOP_REGEN_ATTRIB_ID -- 随机属性类型,等级不变化
);
end
if not tbNewGenInfo then
return 0;
end
local szGenInfoLog = string.format("%s%s, thuộc tính trước khi tách: %s, sau khi tách: %s.", pItem.szName, pItem.szGUID,
self:GetRegenInfoLog(pItem.GetGenInfo(), pItem.nDevelopGrade),
self:GetRegenInfoLog(tbNewGenInfo, 1) );
local nRet = pItem.Regenerate(
tbResGDPL[1],
tbResGDPL[2],
tbResGDPL[3],
tbResGDPL[4],
pItem.nSeries,
pItem.nEnhTimes,
pItem.nLucky,
tbNewGenInfo, --pItem.GetGenInfo(),
0,
pItem.dwRandSeed,
pItem.nStrengthen);
if nRet ~= 1 then
pItem.SetAttribDevelopInfo(-1, tbAttribDevInfo);
local szLog = string.format("Tách dưỡng thành trang bị [%s] thất bại, %s", pItem.szName, szGenInfoLog);
Dbg:WriteLog("DevelopPeel", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Regenerate vật phẩm thất bại,"..szLog);
return 0;
end
-- 移除buff
if nOldDevGrade >= self.DEVELOP_PEEL_LIMIT_GRADE or nSupperDevEquip == 1 then
self:RemoveEnhBuff();
end
self:SetDevEquipUpGradeFaildTimes(pItem, 0);
-- 埋点
local szLog = szOldGDPL;
local bBind = Item:ShouldStuffBind(pItem);
-- 添加返还材料
for nLevel, nCount in pairs(tbRet) do
if nCount > 0 then
me.AddStackItem(self.tbDevStuffGDP[1], self.tbDevStuffGDP[2], self.tbDevStuffGDP[3],
nLevel, {bForceBind=bBind}, nCount, Player.emKITEMLOG_TYPE_DEVELOP_PEEL);
szLog = szLog..string.format(",%d_%d_%d_%d,%d", self.tbDevStuffGDP[1], self.tbDevStuffGDP[2],
self.tbDevStuffGDP[3], nLevel, nCount);
end
end
StatLog:WriteStatLog("stat_info", "platinum","peer_off", me.nId, szLog);
Dbg:WriteLog("DevelopPeel", "Tên: "..me.szName, "Tài khoản: "..me.szAccount, "Tách thành công,"..szGenInfoLog);
self:ApplyDevelopLadder(pItem);
return 1;
end
function Item:GetDevPeelResItem(pItem)
local nDevGrade = pItem.nDevelopGrade;
if not self.tbDevelopValueSetting or
not self.tbDevelopGradeSetting[1] or
not self.tbDevelopGradeSetting[nDevGrade] then
return;
end
local szGDPL = pItem.SzGDPL();
local nFindIndex = nil;
for i, szItemId in pairs(self.tbDevelopGradeSetting[nDevGrade]) do
if szItemId == szGDPL then
nFindIndex = i;
end
end
if not nFindIndex then
return;
end
local szItemId = self.tbDevelopGradeSetting[1][nFindIndex];
if not szItemId then
return;
end
local tbGDPL = Lib:SplitStr(szItemId);
for i, value in pairs(tbGDPL) do
tbGDPL[i] = tonumber(value);
end
return tbGDPL;
end
-- 判断该装备是否可剥离,可剥离的话,会返回结果信息
function Item:CheckCanDevPeel(pItem)
local nRet, var = self:CheckDevelopCommon()
if nRet == 0 then
return nRet, var;
end
if pItem.IsDevelopEquip() == 0 then
return 0, "Hãy đặt vào vũ khí Thần Sa đã dưỡng thành";
end
if self:IsItemDeveloped(pItem) == 0 and pItem.nDevelopGrade == 1 then
return 0, "Vũ khí này không thể tách";
end
-- 3档以上的装备剥离需要申请
if pItem.nDevelopGrade >= self.DEVELOP_PEEL_LIMIT_GRADE then
local nRet, var = self:CheckDevelopPeelTime("Tách dưỡng thành vũ khí Thần Sa cực phẩm");
if nRet ~= 1 then
return nRet, var;
end
end
-- if pItem.IsEquipHasStone() == 1 then
-- return 0, "参与养成剥离的武器不能带有宝石";
-- end
local tbRet = self:GetDevPeelRet(pItem);
if not tbRet then
return 0, "Không thể nhận thông tin tách của đạo ** này";
end
local nNeed = 0;
for _, nCount in pairs(tbRet or {}) do
if nCount > 0 then
nNeed = nNeed + 1;
end
end
if me.CountFreeBagCell() < nNeed then
return 0, "Túi đầy, cần "..nNeed.." ô túi trống.";
end
local tbResGDPL = self:GetDevPeelResItem(pItem);
if not tbResGDPL then
return 0;
end
-- 极品武器检查
local nSupperDevEquip = 0;
if MODULE_GAMESERVER then
nSupperDevEquip = self:IsSupperDevEquip(pItem);
if nSupperDevEquip == 1 then
local nRet, var = self:CheckDevelopPeelTime("Tách dưỡng thành vũ khí Thần Sa cực phẩm");
if nRet ~= 1 then
return 0, var or "";
end
end
end
return 1, tbRet, tbResGDPL, nSupperDevEquip;
end
function Item:CheckDevelopPeelTime(szReason)
local nTime = me.GetTask(self.TASK_PEEL_APPLY_GID, self.TASK_PEEL_APPLY_TIME);
-- 没有申请过剥离
if nTime <= 0 then
return -1, string.format("Hãy gặp Dã Luyện Đại Sư xin phép %s", szReason);
-- 申请过则判断时间是否在允许段内(申请3小时-剥离3小时)
else
-- 取申请时间差
local nDiffTime = GetTime() - nTime;
-- 出错的情况
if nDiffTime <= 0 then
return -1;
-- 已经申请还不能剥离
elseif nDiffTime <= self.VALID_PEEL_TIME then
return -1, string.format("Vẫn chưa tới thời gian %s, xin chờ chút.", szReason);
-- 过了申请期
elseif nDiffTime >= self.MAX_PEEL_TIME then
me.SetTask(self.TASK_PEEL_APPLY_GID, self.TASK_PEEL_APPLY_TIME, 0);
return -1, string.format("Xin phép %s lần trước đã quá giờ, hãy xin phép lại.", szReason);
end
end
return 1;
end
-------------------------------------------------------------------------------------------------------------------
-- 在背包中查找材料是否足够
-- 注意:传参tbMaterial对同种GDPL的道具要合并,否则检查结果不一定正确
-- bEquipBind 检查是否有足够的非绑定材料 不绑定的装备优先使用不绑定材料 如果使用绑定材料则需要提示
function Item:IsMaterialEngouh(tbMaterial, bEquipBind)
if not tbMaterial or #tbMaterial == 0 then
return 0, "";
end
bEquipBind = bEquipBind or 1;
local bBindTips = 0;
local tbBindMatCount = {};
local tbNoBindMatCount = {};
local nEnough = 0;
local szDesc = "";
local tbEnough = {};
-- 计算非绑定和绑定材料分别有多少
for i, tbItem in pairs(tbMaterial) do
local tbFind = me.FindItemInBags(unpack(tbItem, 1, 4));
tbNoBindMatCount[i] = tbNoBindMatCount[i] or 0;
tbBindMatCount[i] = tbBindMatCount[i] or 0;
for _, tbItem in pairs(tbFind) do
if tbItem.pItem.IsBind() == 0 then
tbNoBindMatCount[i] = tbNoBindMatCount[i] + tbItem.pItem.nCount;
else
tbBindMatCount[i] = tbBindMatCount[i] + tbItem.pItem.nCount;
end
end
szDesc = szDesc..string.format("<color=green>%d<color> <color=green>%s<color>", tbItem[5], KItem.GetNameById(unpack(tbItem, 1, 4)));
local nNeedCount = tbItem[5];
if bEquipBind == 0 and tbNoBindMatCount[i] < nNeedCount then
bBindTips = 1;
end
if tbBindMatCount[i] + tbNoBindMatCount[i] >= nNeedCount then
nEnough = nEnough + 1;
end
end
local bEnough = 0;
if nEnough >= Lib:CountTB(tbMaterial) then
bEnough = 1;
end
return bEnough, szDesc, bBindTips;
end
-- 参数同上
-- bBind = 0 优先消耗不绑定的材料 不足的时候才消耗绑定的材料
-- bBind = 1 优先消耗绑定的材料 不足的时候才消耗绑定的材料
function Item:ConsumeItems(tbNeed, eWay, bBind)
if not tbNeed then
return 0;
end
eWay = eWay or Player.emKLOSEITEM_DEVELOP_ATTRIB;
bBind = bBind or 1;
local bWithBind = bBind or 0;
local nAllNeed = 0;
local nConsumed = 0;
for _, tbItem in pairs(tbNeed or {}) do
local tbFind = me.FindItemInBags(unpack(tbItem, 1, 4));
if not tbFind or #tbFind == 0 then
return 0;
end
nAllNeed = tbItem[5];
nConsumed = nConsumed + nAllNeed;
for _, tbItemInfo in pairs(tbFind) do
local pItem = tbItemInfo.pItem;
local nCount = pItem.nCount;
if bBind == pItem.IsBind() then
if nCount > nAllNeed then
local bRet = pItem.SetCount(nCount - nAllNeed, eWay) or 0;
if bRet == 1 then
nAllNeed = 0;
end
else
if pItem.Delete(me, eWay) == 1 then
nAllNeed = nAllNeed - nCount;
end
end
end
end
if nAllNeed > 0 then
bWithBind = 1;
for _, tbItemInfo in pairs(tbFind) do
local pItem = tbItemInfo.pItem;
local nCount = pItem.nCount;
if bBind ~= pItem.IsBind() then
if nCount > nAllNeed then
local bRet = pItem.SetCount(nCount - nAllNeed, eWay) or 0;
if bRet == 1 then
nAllNeed = 0;
end
else
if pItem.Delete(me, eWay) == 1 then
nAllNeed = nAllNeed - nCount;
end
end
end
end
end
if nAllNeed > 0 then
return 0;
end
end
return 1, bWithBind, nConsumed;
end
function Item:GetRegenInfo(pItem, nDestDevGrade, nGenFlag)
local nPhyType, nPvType = self:GetDevelopAttribType(pItem);
if not nPhyType or not nPvType then
return;
end
if nGenFlag < self.DEVELOP_REGEN_ATTRIB_ID or
nGenFlag > self.DEVELOP_REGEN_ATTRIB_LEV then
return;
end
local tbNewGenInfo = KItem.ReGenerateDevelopBaseAttrib(
nGenFlag,
pItem.nSeries,
nPhyType,
nPvType,
nDestDevGrade,
pItem.GetGenInfo(),
{},
0
);
return tbNewGenInfo;
end
function Item:GetRegenInfoLog(tbInfo, nGrade)
local szLog = "";
if nGrade ~= -1 then
for i = 1, 8 do
if i ~= 1 then
szLog = szLog..",";
end
local nValue = tbInfo[i + 1] or 0;
if nValue == 0 then
szLog = szLog.."0_0";
else
local nId = Lib:LoadBits(nValue, 16, 31);
local nInitRand = Lib:LoadBits(nValue, 8, 15);
local nInitLevel = self:GetDevelopRandLevel(nInitRand, nGrade);
szLog = szLog..string.format("%d_%d", nId, nInitLevel);
end
end
else
for nIndex, data in pairs(tbInfo) do
szLog = szLog..string.format(",%d_%d", nIndex, data);
end
end
return szLog;
end
function Item:GetDevelopAttribType(pItem)
if pItem.IsDevelopEquip() == 0 and pItem.IsDevelopStone() == 0 then
return;
end
local nGenInfo = pItem.GetGenInfo(1);
local nPhyType = Lib:LoadBits(nGenInfo, 8, 15);
local nPvType = Lib:LoadBits(nGenInfo, 0, 7);
return nPhyType, nPvType;
end
-- 生成成长属性的类型
-- nPhyType:1内功,2外功,0不限
-- nPvType:1 pvp, 2 pve
function Item:GenDevelopAttribType(nPhyType, nPvType)
local nType = 0;
nType = Lib:SetBits(nType, nPhyType, 8, 15);
nType = Lib:SetBits(nType, nPvType, 0, 7);
return nType;
end
function Item:GetDevelopEquipFeatureDesc(pItem)
if pItem.IsDevelopEquip() == 0 and pItem.IsDevelopStone() == 0 then
return;
end
local nPhyType, nPvType = self:GetDevelopAttribType(pItem);
local szPhyType = self.tbPhyTypeStr[nPhyType];
local szPvType = self.tbPvTypeStr[nPvType];
return szPhyType, szPvType;
end
function Item:GetDevelopAttribInitLevel(pItem, nIndex)
local nValue = pItem.GetGenInfo(nIndex + 1); -- 要加1,属性是从2开始的
local nInitRand = Lib:LoadBits(nValue, 8, 15);
local nInitLevel = self:GetDevelopRandLevel(nInitRand, pItem.nDevelopGrade);
return nInitLevel;
end
function Item:GetDevelopAttribSettingId(pItem, nIndex)
local nValue = pItem.GetGenInfo(nIndex + 1); -- 要加1,属性是从2开始
return Lib:LoadBits(nValue, 16, 31);
end
function Item:AddDevelopEquip(g,d,p,l,s, phy, pv, eWay)
local tbGenInfo = self:InitGenerateInfo(s, phy, pv);
local tbItemInfo = {};
tbItemInfo.tbGenInfo = tbGenInfo;
tbItemInfo.nSeries = s or -1;
local pItem = me.AddItemEx(g,d,p,l, tbItemInfo, eWay);
if pItem then
self:ApplyDevelopLadder(pItem);
end
return pItem;
end
function Item:InitGenerateInfo(s, phy, pv)
if not s then
s = -1;
end
if not phy then
phy = 1;
end
if not pv then
pv = 1;
end
local tbGenInfo = {};
for i = 1, 12 do
tbGenInfo[i] = 0;
end
tbGenInfo[1] = self:GenDevelopAttribType(phy,pv);
return tbGenInfo;
end
-- 开启材料宝箱
function Item:RandDevStuff()
local tbRate = self.tbDevStuffRandRate;
local nToday = Lib:GetLocalDay(GetTime());
local nOpenDay = Lib:GetLocalDay(Lib:GetDate2Time(self.DEV_OPEN_DAY));
local nDay = nToday - nOpenDay;
local nDay = nDay > 137 and 137 or nDay;
local tbNow = self:CalcDevStuffRateReduction(tbRate, nDay);
local nSumRate = 0;
for i, nRate in pairs(tbNow) do
nSumRate = nSumRate + nRate;
end
local nRand = MathRandom(nSumRate);
for i, nRate in pairs(tbNow) do
nRand = nRand - nRate;
if nRand <= 0 then
return i;
end
end
end
-- 计算当前随机权重
function Item:CalcDevStuffRateReduction(tb, nPassDay)
local nMinLevel = 100; -- 一个足够大的值,远大于系统当前的最大宝石等级
for nLevel, nDay in pairs(tb) do
if nMinLevel > nLevel then
nMinLevel = nLevel;
end
end
local tbRet = {};
-- 最低级的衰减,其它的不变
tbRet = Lib:CopyTB1(tb);
tbRet[nMinLevel] = math.ceil(tb[nMinLevel] - tb[nMinLevel] * nPassDay/self.DEV_STUFF_CALC_RATE);
if tbRet[nMinLevel] < 0 then
tbRet[nMinLevel] = 0;
end
return tbRet;
end
function Item:GetDevAttribDesc(pEquip, nIndex)
local szTitle, szDesc = "", "";
local tbDevMass = pEquip.GetDevelopMass();
local tbMA = tbDevMass[nIndex];
local nDevLev = pEquip.GetAttribDevelopInfo(nIndex);
local nDevGrade = pEquip.nDevelopGrade;
local nAttribId = self:GetDevelopAttribSettingId(pEquip, nIndex);
local tbDevMASetting = KItem.GetDevelopMASetting(nAttribId);
if not tbDevMASetting then
return szTitle, szDesc;
end
szTitle = string.format("<color=gold>%s<color>", tbDevMASetting.szDesc);
szDesc = string.format("<color=cyan>Cấp:<color> <color=gold>%d<color>\n%s\n",
tbMA.nLevel, FightSkill:GetMagicDesc(tbMA.szName, tbMA.tbValue, nil, 1))
if (nDevGrade == Item.MAX_GRADE or nDevLev >= self.tbGradeMaxDevelop[nDevGrade]) then
szDesc = szDesc.."<color=red>Đã dưỡng thành cấp cao nhất<color>\n";
end
szDesc = szDesc.."\n";
local nNextLev, szNext;
if tbDevMASetting.nGrowthType == Item.DEVELOP_GROWTH_SKIP then
szDesc = szDesc.."<color=cyan>Giá trị thuộc tính này chỉ thay đổi ở cấp đặc biệt\n<color>"
nNextLev = KItem.CalcDevAttribNextSkipPoint(nAttribId, tbMA.nLevel);
if not nNextLev then
szDesc = szDesc.."<color=cyan>Giá trị thuộc tính này sẽ không thay đổi<color>\n";
end
szNext = "<color=cyan>Điểm thay đổi kế: <color>"
else
nNextLev = tbMA.nLevel + 1;
szNext = "<color=cyan>Cấp kế: <color>";
end
if nNextLev then
local tbNextMA = KItem.GetRandAttribInfo(nAttribId, nNextLev, 0, Item.MAGIC_VERSION_DEV);
local tbNextValue = {tbNextMA[1].nMin, tbNextMA[2].nMin, tbNextMA[3].nMin};
szDesc = szDesc..string.format("%s <color=gold>cấp %d<color>\n%s", szNext or "", nNextLev,
FightSkill:GetMagicDesc(tbMA.szName, tbNextValue, nil, 1));
end
return szTitle, szDesc;
end
-- 辰砂武器的攻击条数
function Item:GetDevEquipAttackAtrCount(pItem)
if not pItem then
return 0;
end
local nPhyType = self:GetDevelopAttribType(pItem);
if not nPhyType then
return 0;
end
local nSeries = pItem.nSeries;
local nLevel = pItem.nDevelopGrade;
local nAttackCount = 0;
for nIndex = 2, 4 + nLevel do
local nAttSettingId = self:GetDevelopAttribSettingId(pItem, nIndex - 1);
local bAttrackAtrrib = self:IsAttrackAtrrib(nSeries, nPhyType, nAttSettingId);
if bAttrackAtrrib == 1 then
nAttackCount = nAttackCount + 1;
end
end
return nAttackCount;
end
-- 判断是否是大于4攻武器的
function Item:IsSupperDevEquip(pItem)
if not pItem then
return 0;
end
-- 有多少条攻击
local nAttackCount = self:GetDevEquipAttackAtrCount(pItem);
return nAttackCount >= 4 and 1 or 0;
end
-- 移出强化buff
function Item:RemoveEnhBuff()
me.SetTask(self.TASK_PEEL_APPLY_GID, self.TASK_PEEL_APPLY_TIME, 0);
me.RemoveSkillState(1358);
end
-- 升级失败次数
function Item:GetDevEquipUpGradeFaildTimes(pItem)
if pItem then
local nValue = pItem.GetGenInfo(self.DEV_EQUIP_EXTREN_INDEX);
return Lib:LoadBits(nValue, 0, 7);
end
end
function Item:SetDevEquipUpGradeFaildTimes(pItem, nSetValue)
if pItem then
local nValue = pItem.GetGenInfo(self.DEV_EQUIP_EXTREN_INDEX);
nValue = Lib:SetBits(nValue, nSetValue, 0, 7);
pItem.SetGenInfo(self.DEV_EQUIP_EXTREN_INDEX, nValue);
end
end
Chỉnh sửa lần cuối: