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