2025-06-04 05:02:57 +08:00

925 lines
22 KiB
Plaintext

autoImport("RefineTypeData")
BlackSmithProxy = class('BlackSmithProxy', pm.Proxy)
BlackSmithProxy.Instance = nil;
BlackSmithProxy.NAME = "BlackSmithProxy"
BlackSmithProxy.RefineLimitQuality = 3
--玩家自身的管理
function BlackSmithProxy:ctor(proxyName, data)
self.proxyName = proxyName or BlackSmithProxy.NAME
if(BlackSmithProxy.Instance == nil) then
BlackSmithProxy.Instance = self
end
if data ~= nil then
self:setData(data)
end
-- self:InitMaster()
self:ParseRefineConfig()
self:InitHighRefineCompose();
self:IntiHighRefine();
end
function BlackSmithProxy:onRegister()
end
function BlackSmithProxy:onRemove()
end
function BlackSmithProxy:ParseRefineConfig()
self.refineDataMap = {}
local data
local t
local refineTypeData
for k,v in pairs(Table_EquipRefine) do
data = v
for j=1,#data.EuqipType do
t = data.EuqipType[j]
refineTypeData = self.refineDataMap[t]
if(not refineTypeData) then
refineTypeData = RefineTypeData.new(t)
self.refineDataMap[t] = refineTypeData
end
refineTypeData:AddData(data)
end
end
end
function BlackSmithProxy:InitMaster()
self.strengthMaster = {}
self.refineMaster = {}
local data
local index
for i=1,#Table_EquipMaster do
data = Table_EquipMaster[i]
if(data.type=="StrengthenMaster") then
index = #self.strengthMaster+1
self.strengthMaster[index] = data
elseif(data.type=="RefineMaster")then
index = #self.refineMaster+1
self.refineMaster[index] = data
end
data.dynamicIndex = index
end
end
function BlackSmithProxy:SearchMasterByLv(array,lv)
for i=1,#array do
if(array[i].Needlv == lv) then
return array[i]
end
end
return nil
end
function BlackSmithProxy:GetSafeRefineClamp(islottery)
local cfg = islottery and GameConfig.SafeRefineEquipCostLottery or GameConfig.SafeRefineEquipCost;
local min, max;
for k, v in pairs(cfg)do
local s = v;
if(type(v) == "table")then
s = v[1];
end
if(s ~= 0)then
min = min == nil and k or math.min(min, k);
max = max == nil and k or math.max(max, k);
end
end
return min, max;
end
function BlackSmithProxy:GetNextStrengthMaster(data)
return self.strengthMaster[(data and data.dynamicIndex or 0) + 1]
end
function BlackSmithProxy:GetNextRefineMaster(data)
return self.refineMaster[(data and data.dynamicIndex or 0) + 1]
end
function BlackSmithProxy:GetStrengthMaster(lv)
return self:SearchMasterByLv(self.strengthMaster,lv)
end
function BlackSmithProxy:GetRefineEquips(valid_equiptype_map, includeFashion)
local result = {};
if(includeFashion)then
local fashionEquips = BagProxy.Instance.fashionBag:GetItems();
local equipInfo;
for i=1,#fashionEquips do
equipInfo = fashionEquips[i].equipInfo;
if(equipInfo)then
if(valid_equiptype_map)then
if(valid_equiptype_map[equipInfo.equipData.EquipType])then
if(equipInfo:CanRefine())then
table.insert(result, fashionEquips[i]);
end
end
else
if(equipInfo:CanRefine())then
table.insert(result, fashionEquips[i]);
end
end
end
end
end
local roleEquips = BagProxy.Instance.roleEquip:GetItems();
local equipInfo;
for i=1,#roleEquips do
equipInfo = roleEquips[i].equipInfo;
if(equipInfo)then
if(valid_equiptype_map)then
if(valid_equiptype_map[equipInfo.equipData.EquipType])then
if(equipInfo:CanRefine())then
table.insert(result, roleEquips[i]);
end
end
else
if(equipInfo:CanRefine())then
table.insert(result, roleEquips[i]);
end
end
end
end
local items = BagProxy.Instance:GetBagEquipTab():GetItems();
for i=1,#items do
equipInfo = items[i].equipInfo;
if(equipInfo)then
if(valid_equiptype_map)then
if(valid_equiptype_map[equipInfo.equipData.EquipType])then
if(equipInfo:CanRefine())then
table.insert(result, items[i]);
end
end
else
if(equipInfo:CanRefine())then
table.insert(result, items[i]);
end
end
end
end
table.sort(result, BlackSmithProxy.SortRefineEquips)
return result;
end
function BlackSmithProxy.SortRefineEquips(l, r)
local leuqipInfo = l.equipInfo;
local reuqipInfo = r.equipInfo;
if(l.equiped ~= r.equiped)then
return l.equiped > r.equiped;
end
if(l.staticData.id ~= r.staticData.id)then
return l.staticData.id > r.staticData.id;
end
return leuqipInfo.refinelv > reuqipInfo.refinelv;
end
function BlackSmithProxy:GetRefineMaster(lv)
return self:SearchMasterByLv(self.refineMaster,lv)
end
function BlackSmithProxy:MaxStrengthLevel(item)
local retValue = 0
-- local equip = item.equipInfo;
-- retValue = equip.equipData.EnhanceMaxlv
retValue = MyselfProxy.Instance:RoleLevel()
return retValue
end
function BlackSmithProxy:SetEquipOptDiscounts(etype, params)
if(self.equipOptDiscount_Map == nil)then
self.equipOptDiscount_Map = {};
end
local discounts = self.equipOptDiscount_Map[etype];
if(discounts == nil)then
discounts = {};
if self.equipOptDiscount_Map==nil or self.equipOptDiscount_Map[etype]==nil then
do return end
end
self.equipOptDiscount_Map[etype] = discounts;
else
TableUtility.ArrayClear(discounts);
end
if(params ~= nil and params[2])then
TableUtility.ArrayShallowCopy(discounts, params);
end
end
function BlackSmithProxy:GetEquipOptDiscounts(etype)
if(self.equipOptDiscount_Map == nil)then
return _EmptyTable;
end
return self.equipOptDiscount_Map[etype];
end
function BlackSmithProxy:GetSafeRefineCostEquipNum(refinelv, islottery)
if(refinelv == nil)then
return;
end
local cfg = islottery and GameConfig.SafeRefineEquipCostLottery or GameConfig.SafeRefineEquipCost;
local scfg = cfg[refinelv];
if(scfg == nil)then
return;
end
local indiscount = self:GetEquipOptDiscounts(ActivityCmd_pb.GACTIVITY_SAFE_REFINE_DISCOUNT);
indiscount = indiscount and indiscount[2] or false;
local result;
if(type(scfg) == "table")then
result = indiscount and scfg[2] or scfg[1];
else
result = scfg;
end
return result;
end
-- materials begin
function BlackSmithProxy.SortMaterialEquips(equipA, equipB)
local slotA, slotB = equipA.cardSlotNum, equipB.cardSlotNum;
if(slotA ~= slotB)then
return slotA < slotB;
end
local equipInfoA, equipInfoB = equipA.equipInfo, equipB.equipInfo;
if(equipInfoA.equiplv ~= equipInfoB.equiplv)then
return equipInfoA.equiplv < equipInfoB.equiplv;
end
if(equipInfoA.refinelv ~= equipInfoB.refinelv)then
return equipInfoA.refinelv < equipInfoB.refinelv;
end
local equipA_hasEnchant = equipA.enchantInfo and equipA.enchantInfo:HasAttri() or false;
local equipB_hasEnchant = equipB.enchantInfo and equipB.enchantInfo:HasAttri() or false;
if(equipA_hasEnchant ~= equipB_hasEnchant)then
return not equipA_hasEnchant;
end
local equipA_CardNum = equipA:GetEquipedCardNum();
local equipB_CardNum = equipB:GetEquipedCardNum();
if(equipA_CardNum ~= equipB_CardNum)then
return equipA_CardNum < equipB_CardNum;
end
if(equipInfoA.strengthlv2 ~= equipInfoB.strengthlv2)then
return equipInfoA.strengthlv2 < equipInfoB.strengthlv2;
end
if(equipInfoA.strengthlv ~= equipInfoB.strengthlv)then
return equipInfoA.strengthlv < equipInfoB.strengthlv;
end
return equipA.staticData.id < equipB.staticData.id;
end
function BlackSmithProxy:GetMaterialEquips_ByEquipId(equipid, count, filterDamage, filterFunc, bagTypes, matchCall, matchCallParam)
local equips;
if(bagTypes == nil)then
equips = BagProxy.Instance:GetItemsByStaticID(equipid, BagProxy.BagType.MainBag);
else
equips = {};
local bagData, items;
for i=1,#bagTypes do
bagData = BagProxy.Instance:GetBagByType(bagTypes[i]);
items = bagData:GetItems();
for j=1,#items do
if(items[j].staticData.id == equipid)then
table.insert(equips, items[j]);
end
end
end
end
if(equips == nil or #equips == 0)then
return _EmptyTable;
end
table.sort(equips, BlackSmithProxy.SortMaterialEquips)
local result = {};
for i=1, #equips do
if(equips[i].equipInfo.refinelv <= GameConfig.Item.material_max_refine)then
local valid = true;
if(filterFunc)then
valid = filterFunc(equips[i]);
end
if(valid)then
if(filterDamage)then
if(not equips[i].equipInfo.damage)then
if(matchCall)then
matchCall(matchCallParam, equips[i]);
end
table.insert(result, equips[i]);
end
else
if(matchCall)then
matchCall(matchCallParam, equips[i]);
end
table.insert(result, equips[i]);
end
end
end
if(count and #result == count)then
break;
end
end
return result;
end
local Func_CheckEquip_SameVID = function (itemA, itemB, includeSelf)
if(itemA == nil or itemB == nil)then
return false;
end
if(itemA.id == itemB.id)then
return includeSelf == true;
end
if(itemA.equipInfo == nil or itemB.equipInfo == nil)then
return false;
end
local vid_a = itemA.equipInfo.equipData.VID;
local vid_b = itemB.equipInfo.equipData.VID;
if(vid_a and vid_b)then
return math.floor(vid_a/10000) == math.floor(vid_b/10000) and vid_a%1000 == vid_b%1000;
end
return false;
end
local Func_CheckEquip_IsComposeMaterial = function (item, checkItem)
local sid = item.staticData.id;
local sData = sid and Table_EquipCompose[sid];
if(sData == nil)then
return false;
end
local mainEquipId = sData.Material[1].id;
local mainItem = ItemData.new("Temp", mainEquipId);
return Func_CheckEquip_SameVID(mainItem, checkItem, false);
end
function BlackSmithProxy:GetMaterialEquips_ByVID(itemData, bagTypes, matchCall, matchCallParam)
if(itemData == nil or itemData.equipInfo == nil)then
return _EmptyTable;
end
local result = {};
local isComposeEquip = Table_EquipCompose[itemData.staticData.id] ~= nil;
local bagProxy = BagProxy.Instance;
local material_max_refine = GameConfig.Item.material_max_refine;
if(bagTypes == nil)then
local bagItems = bagProxy.bagData:GetItems();
for i=1,#bagItems do
local item = bagItems[i];
local valid
if(isComposeEquip)then
valid = Func_CheckEquip_IsComposeMaterial(itemData, item)
else
valid = Func_CheckEquip_SameVID(itemData, item)
end
if( valid and item.equipInfo.refinelv <= material_max_refine)then
if(matchCall)then
matchCall(matchCallParam, item);
end
table.insert(result, item);
end
end
else
local bagData, bagItems;
for i=1,#bagTypes do
bagData = bagProxy:GetBagByType(bagTypes[i]);
bagItems = bagData:GetItems();
for j=1,#bagItems do
local item = bagItems[j];
local valid
if(isComposeEquip)then
valid = Func_CheckEquip_IsComposeMaterial(itemData, item)
else
valid = Func_CheckEquip_SameVID(itemData, item)
end
if(valid and item.equipInfo.refinelv <= material_max_refine)then
if(matchCall)then
matchCall(matchCallParam, item);
end
table.insert(result, item);
end
end
end
end
table.sort(result, BlackSmithProxy.SortMaterialEquips)
return result;
end
-- materials end
function BlackSmithProxy:MaxRefineLevelByData(staticData)
if(staticData == nil)then
return 0;
end
local refineMaxLevel1 = nil;
local refineType = self.refineDataMap[staticData.Type]
if(refineType) then
refineMaxLevel1 = refineType:GetRefineMaxLevel(staticData.Quality)
end
local refineMaxLevel2 = nil;
local equipData = Table_Equip[staticData.id];
if(equipData)then
refineMaxLevel2 = equipData.RefineMaxlv;
end
if(refineMaxLevel1)then
if(refineMaxLevel2)then
return math.min(refineMaxLevel1, refineMaxLevel2);
end
return refineMaxLevel1;
end
return 0
end
function BlackSmithProxy:GetRefineData(itemType,quality,refineLevel)
local refineType = self.refineDataMap[itemType]
if(refineType) then
if(refineLevel==0) then refineLevel = 1 end
return refineType:GetData(quality,refineLevel)
end
return nil
end
function BlackSmithProxy:GetComposeIDsByItemData(itemData,isSafe)
local refineType = self.refineDataMap[itemData.staticData.Type]
if(refineType) then
local refinelv = itemData.equipInfo.refinelv
refinelv =refinelv+1
local maxRefineLv = self:MaxRefineLevelByData(itemData.staticData)
if(refinelv>maxRefineLv)then
refinelv=maxRefineLv
end
local data=refineType:GetData(itemData.staticData.Quality,refinelv)
if(data)then
if(isSafe)then
for i=1,#data.SafeRefineCost do
if(data.SafeRefineCost[i].color==itemData.staticData.Quality)then
return data.SafeRefineCost[i].id
end
end
else
for i=1,#data.RefineCost do
if(data.RefineCost[i].color==itemData.staticData.Quality)then
return data.RefineCost[i].id
end
end
end
end
end
return nil
end
function BlackSmithProxy:GetExtraSuccesssByStaicID(staticID)
for i=1,#GameConfig.EquipRefineRate do
if(staticID==GameConfig.EquipRefineRate[i].itemid)then
return GameConfig.EquipRefineRate[i].rate
end
end
return 0
end
function BlackSmithProxy:InitHighRefineCompose()
if(Table_HighRefineMatCompose == nil)then
return;
end
self.highRefineCompose_GroupMap = {};
for id, data in pairs(Table_HighRefineMatCompose)do
local groupId = data.GroupId;
local cache = self.highRefineCompose_GroupMap[groupId];
if(cache == nil)then
cache = {};
self.highRefineCompose_GroupMap[groupId] = cache;
end
table.insert(cache, data);
end
end
function BlackSmithProxy:GetHighRefineComposeData(groupId)
if(self.highRefineCompose_GroupMap)then
return self.highRefineCompose_GroupMap[groupId];
end
return _EmptyTable;
end
function BlackSmithProxy:IntiHighRefine()
if(Table_HighRefine == nil)then
return;
end
self.highRefineData_Map = {};
for id, data in pairs(Table_HighRefine)do
local t = self.highRefineData_Map[ data.PosType ];
if(t == nil)then
t = {};
self.highRefineData_Map[ data.PosType ] = t;
end
local level = data.Level;
local levelType = math.floor(level/1000);
local tt = t[levelType];
if(tt == nil)then
tt = {};
t[levelType] = tt;
end
local singlelevel = level % 1000;
tt[singlelevel] = data;
-- equalPos begin
local equalPos = data.EqualPos;
for i=1,#equalPos do
local t = self.highRefineData_Map[ equalPos[i] ];
if(t == nil)then
t = {};
self.highRefineData_Map[ equalPos[i] ] = t;
end
local level = data.Level;
local levelType = math.floor(level/1000);
local tt = t[levelType];
if(tt == nil)then
tt = {};
t[levelType] = tt;
end
local singlelevel = level % 1000;
tt[singlelevel] = data;
end
-- equalPos end
end
end
function BlackSmithProxy:GetHighRefineData(posType, levelType, level)
if(self.highRefineData_Map == nil)then
return;
end
if(posType == nil)then
return;
end
local t = self.highRefineData_Map[posType];
if(levelType == nil)then
return t;
end
if(t == nil)then
return nil;
end
t = t[levelType];
if(level == nil)then
return t;
end
if(t == nil)then
return nil;
end
return t[level];
end
function BlackSmithProxy:GetMaxHRefineTypeOrLevel(pos, ttype)
if(ttype == nil)then
local _,unlockTypes = self:GetHighRefinePoses();
local types = unlockTypes and unlockTypes[pos];
if(types)then
local maxType = 0;
for i=1,#types do
maxType = math.max(types[i], maxType);
end
return maxType;
end
end
local ds = self:GetHighRefineData(pos, ttype);
if(ds)then
return #ds;
end
return 0;
end
function BlackSmithProxy:GetShowHRefineDatas(pos)
local maxType = self:GetMaxHRefineTypeOrLevel(pos);
local showlvType = maxType;
for i=1,maxType do
local nowlv = self:GetPlayerHRefineLevel(pos, i);
if(nowlv < 10)then
showlvType = i;
break;
end
end
return self:GetHighRefineData(pos, showlvType), showlvType;
end
function BlackSmithProxy:SetPlayerHRefineLevels(server_highRefineDatas)
if(server_highRefineDatas == nil)then
return;
end
self.playerHRefineLevelMap = {};
for i=1,#server_highRefineDatas do
self:SetPlayerHRefineLevel(server_highRefineDatas[i]);
end
end
function BlackSmithProxy:SetPlayerHRefineLevel(server_highRefineData)
if(server_highRefineData == nil)then
return;
end
local t = self.playerHRefineLevelMap[server_highRefineData.pos];
if(t == nil)then
t = {};
self.playerHRefineLevelMap[server_highRefineData.pos] = t;
end
for j=1,#server_highRefineData.level do
local lv = server_highRefineData.level[j];
local levelType = math.floor(lv/1000)
local reallevel = lv % 1000;
t[levelType] = reallevel;
end
end
function BlackSmithProxy:GetPlayerHRefineLevel(pos, levelType)
if(self.playerHRefineLevelMap == nil)then
return 0;
end
local poslvs = self.playerHRefineLevelMap[pos];
return poslvs and poslvs[levelType] or 0;
end
function BlackSmithProxy:HelpGetMyHRefineEffects(config_data, refinelv)
local myclass = MyselfProxy.Instance:GetMyProfession()
return self:HelpGet_SingleHRefineEffects(config_data, myclass, refinelv);
end
function BlackSmithProxy:Get_TotalHRefineEffect_Map(equipPos, typelevel, hrlevel, class, limitRefinelv)
local datas = self:GetHighRefineData(equipPos, typelevel);
local resuleEffectMap = {};
for i=1,hrlevel do
local s_effectmap = self:get_SingleHRefineEffects_Map(datas[i], class, limitRefinelv)
if(s_effectmap)then
for ek, ev in pairs(s_effectmap)do
if(ek ~= "Job")then
local ov = resuleEffectMap[ ek ] or 0;
resuleEffectMap[ ek ] = ov + ev;
end
end
end
end
return resuleEffectMap;
end
function BlackSmithProxy:get_SingleHRefineEffects_Map(config_data, class, refinelv)
if(refinelv)then
if(config_data.RefineLv > refinelv)then
return;
end
end
local effect = config_data.Effect;
for i=1,#effect do
local jobs = effect[i].Job
for j=1,#jobs do
if(jobs[j] == class)then
return effect[i];
end
end
end
return nil;
end
function BlackSmithProxy:GetMyHRefineEffects(pos, typelevel, refinelv)
if(pos == nil)then
return _EmptyTable;
end
local resuleEffectMap;
local myclass = MyselfProxy.Instance:GetMyProfession()
if(typelevel ~= nil)then
local level = self:GetPlayerHRefineLevel(pos, typelevel);
resuleEffectMap = self:Get_TotalHRefineEffect_Map(pos,
typelevel,
level,
myclass,
refinelv);
else
resuleEffectMap = {};
local maxType = self:GetMaxHRefineTypeOrLevel(pos);
for k=1,maxType do
local level = self:GetPlayerHRefineLevel(pos, k);
local effectmap = self:Get_TotalHRefineEffect_Map(pos,
k,
level,
myclass,
refinelv);
for ek, ev in pairs(effectmap)do
local v = resuleEffectMap[ ek ] or 0;
resuleEffectMap[ ek ] = v + ev;
end
end
end
local effects = {};
for k,v in pairs(resuleEffectMap)do
table.insert(effects, {k, v});
end
return effects;
end
function BlackSmithProxy:IsHighRefineUnlock()
-- GameConfig.BranchForbid
if(EnvChannel.Channel.Name == EnvChannel.ChannelConfig.Alpha.Name or
EnvChannel.Channel.Name == EnvChannel.ChannelConfig.Release.Name)then
return false;
end
return true;
end
function BlackSmithProxy:GetHighRefinePoses()
local gbData = GuildBuildingProxy.Instance:GetBuildingDataByType(GuildBuildingProxy.Type.EGUILDBUILDING_HIGH_REFINE);
if(gbData == nil)then
return;
end
local unlockParam = gbData.staticData.UnlockParam;
local result = {};
if(unlockParam and unlockParam.hrefine_part)then
for site,_ in pairs(unlockParam.hrefine_part)do
table.insert(result, site);
end
table.sort(result, function (a,b)
return a < b;
end);
end
return result, unlockParam.hrefine_part;
end
local _EnchantCost = {};
function BlackSmithProxy:GetEnchantCost(enchantType, itemType)
TableUtility.ArrayClear(_EnchantCost);
local costConfig = GameConfig.EquipEnchant and GameConfig.EquipEnchant.SpecialCost;
if(costConfig)then
local config = costConfig[enchantType][itemType];
if(config ~= nil)then
local zenyCost;
for i=#config,1,-1 do
if(config[i].itemid == 100)then
zenyCost = config[i].num;
else
table.insert(_EnchantCost, config[i])
end
end
return _EnchantCost, zenyCost or 0;
end
end
local cost = EnchantEquipUtil.Instance:GetEnchantCost(enchantType)
if(cost)then
table.insert(_EnchantCost, cost.ItemCost)
return _EnchantCost, cost.ZenyCost or 0;
end
end
local Enchant_UnlockMenuId =
{
[SceneItem_pb.EENCHANTTYPE_PRIMARY] = 71,
[SceneItem_pb.EENCHANTTYPE_MEDIUM] = 72,
[SceneItem_pb.EENCHANTTYPE_SENIOR] = 73,
}
-- 玩家是否可以提升已裝備裝備的附魔屬性
function BlackSmithProxy:CanBetter_EquipEnchantInfo()
local unlockFunc = FunctionUnLockFunc.Me();
local maxEnchantType;
for enchantType, menuId in pairs(Enchant_UnlockMenuId)do
if(unlockFunc:CheckCanOpen(menuId))then
if(maxEnchantType == nil or enchantType > maxEnchantType)then
maxEnchantType = enchantType;
end
end
end
local roleEquipBag = BagProxy.Instance:GetRoleEquipBag();
local items = roleEquipBag:GetItems();
if(#items == 0)then
return false;
end
if(maxEnchantType == nil)then
return false;
end
local item
for i=1,#items do
item = items[i];
if(self:CheckItemEnchant_CanBetter(item, maxEnchantType))then
return true;
end
end
return false;
end
function BlackSmithProxy:CheckItemEnchant_CanBetter(item, maxEnchantType)
local equipInfo = item and item.equipInfo;
if(equipInfo == nil or not equipInfo:CanEnchant())then
return false;
end
local lcondition_enchantType = nil;
local enchantInfo = item.enchantInfo;
if(enchantInfo == nil)then
lcondition_enchantType = SceneItem_pb.EENCHANTTYPE_PRIMARY;
else
lcondition_enchantType = enchantInfo.enchantType + 1;
end
if(maxEnchantType and lcondition_enchantType > maxEnchantType)then
return false;
end
local itemType = item.staticData.Type;
local enchantCost, zenyCost = self:GetEnchantCost(lcondition_enchantType, itemType);
local rob = MyselfProxy.Instance:GetROB();
if(rob < zenyCost)then
return false;
end
if(enchantCost ~= nil)then
local bagProxy = BagProxy.Instance;
local search_bagtypes = bagProxy:Get_PackageMaterialCheck_BagTypes(BagProxy.MaterialCheckBag_Type.Enchant);
for _,cost in pairs(enchantCost)do
for itemid, needNum in pairs(cost)do
local items = bagProxy:GetMaterialItems_ByItemId(itemid, search_bagtypes);
local haveNum = 0;
for i=1,#items do
haveNum = haveNum + items[i].num;
end
if(haveNum < needNum)then
return false;
end
end
end
end
return true;
end