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

471 lines
12 KiB
Plaintext

EquipInfo = class("EquipInfo")
EquipTypeEnum = {
Weapon = 1,
Cloth = 2,
Shield = 3,
Cloak = 4,
Shoes = 5,
Ring = 6,
Necklace = 7,
Accessory = 8,
Back = 9,
Mount = 12, -- 坐騎
}
local forbitFun = {
Enchant = 1,
Strength = 2,
Refine = 4,
}
function EquipInfo:ctor(staticData)
self.equiped = 0
self.equipData = nil
self.upgradeData = nil
self.upgrade_MaxLv = 0
self.professCanUse = nil
self:ResetData(staticData)
end
function EquipInfo:ResetData(staticData)
self.equipData = staticData
self.upgradeData = staticData and Table_EquipUpgrade[staticData.id]
if(self.upgradeData)then
self.upgrade_MaxLv = 0;
while self:GetUpgradeMagerialsByEquipLv(self.upgrade_MaxLv + 1) ~= nil do
self.upgrade_MaxLv = self.upgrade_MaxLv + 1;
end
if(self.upgrade_MaxLv ~= 0 and self.upgradeData.Product)then
self.upgrade_MaxLv = self.upgrade_MaxLv - 1;
end
end
if(self.staticData~=nil) then
self.staticData.id = staticId
end
self:Set()
self:InitEquipCanUse()
if(Table_Artifact and Table_Artifact[staticData.id])then
self.artifact_lv = Table_Artifact[staticData.id].Level;
end
end
function EquipInfo:Set(serverData)
self.strengthlv = serverData and serverData.strengthlv or 0
self.strengthlv2 = serverData and serverData.strengthlv2 or 0
self.refinelv = serverData and serverData.refinelv or 0
--目前等級段的經驗值
self.refineexp = serverData and serverData.refineexp or 0
self.damage = serverData and serverData.damage or false;
self.equiplv = serverData and serverData.lv or 0;
self.color = serverData and serverData.color;
self.breakstarttime = serverData and serverData.breakstarttime;
self.breakendtime = serverData and serverData.breakendtime;
if(self.breakstarttime and self.breakendtime)then
self.breakduration = self.breakendtime - self.breakstarttime;
else
self.breakduration = nil;
end
-- 裝備的 buffid(特色屬性)
if(not self.uniqueEffect)then
local eudata = self.equipData.UniqueEffect;
self.uniqueEffect = {};
if(eudata) then
for k,v in pairs(eudata) do
for vk,vv in pairs(v)do
if(vk~="type")then
self.uniqueEffect = TableUtil.InsertArray(self.uniqueEffect, vv);
end
end
end
end
if(#self.uniqueEffect>0)then
self.activeUniqueEffect = {};
end
end
if(not self.pvp_uniqueEffect)then
self.pvp_uniqueEffect = {};
local epvpudata = self.equipData.PVPUniqueEffect;
if(epvpudata and epvpudata~=_EmptyTable)then
for k,v in pairs(epvpudata)do
for vk,vv in pairs(v)do
if(vk~="type")then
self.pvp_uniqueEffect = TableUtil.InsertArray(self.pvp_uniqueEffect, vv);
end
end
end
end
end
if(self.activeUniqueEffect and serverData and serverData.buffid)then
for i=1,#serverData.buffid do
self.activeUniqueEffect[serverData.buffid[i]] = true;
end
end
end
function EquipInfo:GetReplaceValues()
if(self.equipData) then
return self.equipData.ReplaceValues or 0
end
return 0
end
function EquipInfo:GetEffect()
if(self.equipData) then
return next(self.equipData.Effect)
end
return nil,nil
end
function EquipInfo:InitEquipCanUse()
local equpType = GameConfig.EquipType;
if(self.equipData~=nil and self.equipData.EquipType) then
self.site = equpType[self.equipData.EquipType] and equpType[self.equipData.EquipType].site
if(self.equipData.EquipCanUseProfess ==nil) then
self.equipData.EquipCanUseProfess = {}
for i=1,#self.equipData.CanEquip do
self.equipData.EquipCanUseProfess[self.equipData.CanEquip[i]] = self.equipData.CanEquip[i]
end
end
self.professCanUse = self.equipData.EquipCanUseProfess
else
self.site = {};
end
end
function EquipInfo:CanUseByProfess( pro )
return (self.professCanUse~=nil and (self.professCanUse[0]~=nil or self.professCanUse[pro]~=nil))
end
function EquipInfo:GetEquipType()
if(self.equipData~=nil) then return self.equipData.EquipType
else return nil end
end
function EquipInfo:GetEquipSite()
return self.site
end
function EquipInfo:GetUniqueEffect()
if(self.activeUniqueEffect)then
local result = {};
for i=1,#self.uniqueEffect do
local temp = {};
temp.id = self.uniqueEffect[i];
temp.active = self.activeUniqueEffect[temp.id];
table.insert(result, temp);
end
return result;
end
end
function EquipInfo:GetPvpUniqueEffect()
if(self.activeUniqueEffect)then
local result = {};
for i=1,#self.pvp_uniqueEffect do
local temp = {};
temp.id = self.pvp_uniqueEffect[i];
temp.active = self.activeUniqueEffect[temp.id];
table.insert(result, temp);
end
return result;
end
end
function EquipInfo:IsWeapon()
return self.equipData.EquipType ==EquipTypeEnum.Weapon
end
function EquipInfo:BasePropStr()
local effects ={{effect = self.equipData.Effect,name = "normal",lv = 1}}
return PropUtil.FormatEffectsByProp(effects,false," +")
end
function EquipInfo:RefineAndStrInfo(refinelv,strengthlv)
refinelv = refinelv or self.refinelv
strengthlv = strengthlv or self.strengthlv
if(whole == nil) then whole = true end
if(same == nil) then same = true end
local effects = {{effect = self.equipData.Effect,name = "normal",lv = 1}
,{effect = self.equipData.EffectAdd,name = "str",lv = strengthlv}
,{effect = self.equipData.RefineEffect,name = "refine",lv = refinelv}}
return PropUtil.FormatEffectsByProp(effects,false," +")
end
function EquipInfo:StrengthInfo(level,whole,same)
level = level or self.strengthlv
if(whole == nil) then whole = true end
if(same == nil) then same = true end
if(whole) then
local effects = {{effect = self.equipData.Effect,name = "normal",lv = 1}
,{effect = self.equipData.EffectAdd,name = "str",lv = level}}
return PropUtil.FormatEffectsByProp(effects,same," +")
else
local effectAdd = self.equipData.EffectAdd
local effects = {}
for k,v in pairs(effectAdd) do
local data ={}
data.name = k
data.value = v
table.insert(effects,data)
end
return PropUtil.FormatEffects(effects,level," +")
end
end
function EquipInfo:RefineInfo(level,whole,same,sperator)
level = level or self.refinelv
sperator = sperator or " +"
if(whole == nil) then whole = false end
if(same == nil) then same = true end
if(whole) then
local effects = {{effect = self.equipData.Effect,name = "normal",lv = 1}
,{effect = self.equipData.RefineEffect,name = "refine",lv = level}}
return PropUtil.FormatEffectsByProp(effects,same, sperator)
else
local effectAdd = self.equipData.RefineEffect
local effects = {}
for k,v in pairs(effectAdd) do
local data ={}
data.name = k
data.value = v
table.insert(effects,data)
end
return PropUtil.FormatEffects(effects,level, sperator)
end
end
function EquipInfo:SetStrengthRefine(strengthlv, refinelv)
self.strengthlv = strengthlv;
self.refinelv = refinelv;
end
function EquipInfo:GetUpgradeMagerialsByEquipLv(equiplv)
if(nil == self.upgradeData)then
return nil;
end
equiplv = equiplv or self.equiplv;
local materialsKey = "Material_" .. tostring(equiplv);
local materials = self.upgradeData[materialsKey];
if(materials and #materials > 0)then
return materials;
end
return nil;
end
function EquipInfo:CanUpgrade()
if(self.upgradeData ~= nil)then
return self:GetUpgradeMagerialsByEquipLv(self.equiplv + 1) ~= nil;
end
return false;
end
function EquipInfo:CanUpgrade_ByClassDepth(classdepth, equiplv)
if(not self.upgradeData)then
return false;
end
local classDepthLimit_2 = self.upgradeData.ClassDepthLimit_2;
if(classDepthLimit_2 and classdepth < 2)then
if(equiplv >= classDepthLimit_2)then
return false, 2;
end
end
return true;
end
function EquipInfo:CanUpgradeInfoBeEffect_ByClassDepth(classdepth, equiplv)
if(not self.upgradeData)then
return false;
end
local classDepthLimit_2 = self.upgradeData.ClassDepthLimit_2;
if(classDepthLimit_2 and classdepth < 2)then
if(equiplv and equiplv >= classDepthLimit_2)then
return false, 2;
end
end
return true;
end
function EquipInfo:GetUpgradeBuffIdByEquipLv(equiplv)
if(nil == self.upgradeData)then
return nil;
end
equiplv = equiplv or self.equiplv;
local buffKey = "BuffID_" .. tostring(equiplv);
return self.upgradeData[buffKey];
end
function EquipInfo:CanStrength()
if(not self:CanStrength_ByStaticData())then
return false;
end
return self:CanStrength_ByServerData();
end
function EquipInfo:CanStrength_ByStaticData()
--step1.靜態配置
if(self.equipData.ForbidFuncBit~=nil) then
if(self.equipData.ForbidFuncBit & forbitFun.Strength > 0) then
return false
end
end
--step2.規則
if(self.equipData and self.equipData.EquipType)then
local config = GameConfig.EquipType[self.equipData.EquipType];
local sites = config and config.site
sites = type(sites)=="table" and sites or {};
return type(sites[1])=="number" and sites[1]~=0;
end
return false
end
function EquipInfo:CanStrength_ByServerData()
return true;
end
function EquipInfo:CanRefine()
if(not self:CanRefine_ByStaticData())then
return false;
end
return self:CanRefine_ByServerData();
end
function EquipInfo:CanRefine_ByStaticData()
if(self.equipData.EquipType==12)then
return false
end
if(self.equipData.ForbidFuncBit==nil) then
return true
end
return self.equipData.ForbidFuncBit & forbitFun.Refine <= 0
end
function EquipInfo:CanRefine_ByServerData()
return true;
end
function EquipInfo:CanEnchant()
local equipID = self.equipData.id;
local itemType = equipID and Table_Item[equipID] and Table_Item[equipID].Type;
local isfashion = itemType and BagProxy.fashionType[itemType] or false
if(isfashion and GameConfig.SystemForbid.FashionEquipEnchant)then
return false;
end
if(not self:CanEnchant_ByStaticData())then
return false;
end
return self:CanRefine_ByServerData();
end
function EquipInfo:CanEnchant_ByStaticData()
if(self.equipData.ForbidFuncBit==nil) then
return true
end
return self.equipData.ForbidFuncBit & forbitFun.Enchant <= 0
end
function EquipInfo:CanEnchant_ByServerData()
return true;
end
function EquipInfo:Clone(other)
self:Set(other)
self.equiplv = other.equiplv
self.site = other.site
end
-- return Prop
function EquipInfo:SetUpgradeCheckDirty()
self.upgrade_checkdirty = true;
end
function EquipInfo.GetEquipCheckTypes()
local pacakgeCheck = GameConfig.PackageMaterialCheck;
local upgradeCheckTypes;
if(pacakgeCheck)then
upgradeCheckTypes = pacakgeCheck.upgrade or pacakgeCheck.default;
else
upgradeCheckTypes = {1,9};
end
return upgradeCheckTypes;
end
function EquipInfo:CheckCanUpgradeSuccess(isMyEquip, item_guid)
if(self.upgradeData == nil)then
return false;
end
if(not self:CanUpgrade())then
return false;
end
if(self.upgrade_checkdirty == false)then
return self.canUpgrade_success;
end
self.upgrade_checkdirty = false;
self.canUpgrade_success = false;
local equiplv = self.equiplv;
if(isMyEquip)then
local myClass = Game.Myself.data.userdata:Get(UDEnum.PROFESSION);
local classDepth = ProfessionProxy.Instance:GetDepthByClassId(myClass);
if(not self:CanUpgrade_ByClassDepth(classDepth, equiplv + 1))then
return false;
end
end
local materialsKey = "Material_" .. (equiplv+1);
local cost = self.upgradeData[materialsKey];
local _BlackSmithProxy, _BagProxy, searchItems = BlackSmithProxy.Instance, BagProxy.Instance;
for i=1,#cost do
local sc = cost[i];
local searchNum = 0;
if(sc.id ~= 100)then
if(ItemData.CheckIsEquip(sc.id))then
searchItems = _BlackSmithProxy:GetMaterialEquips_ByEquipId(sc.id, nil, true, nil, self:GetEquipCheckTypes(), function (param, itemData)
if(itemData.equipInfo ~= self)then
searchNum = searchNum + itemData.num;
end
end);
else
searchItems = _BagProxy:GetMaterialItems_ByItemId(sc.id, self.GetEquipCheckTypes());
for j=1,#searchItems do
searchNum = searchNum + searchItems[j].num;
end
end
else
searchNum = Game.Myself.data.userdata:Get(UDEnum.SILVER);
end
if(searchNum < sc.num)then
self.canUpgrade_success = false;
return false;
end
end
self.canUpgrade_success = true;
return true;
end
function EquipInfo:IsMount()
return self.equipData.EquipType ==EquipTypeEnum.Mount
end