471 lines
12 KiB
Plaintext
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 |