PGRData/Script/matrix/xentity/xequip/XEquip.lua

408 lines
11 KiB
Lua
Raw Normal View History

local next = next
local tableInsert = table.insert
local XEquip = XClass(nil, "XEquip")
local Default = {
Id = 0,
TemplateId = 0,
CharacterId = 0,
Level = 1,
Exp = 0,
Breakthrough = 0,
CreateTime = 0,
IsLock = false,
IsRecycle = false,
AwakeSlotList = {},
AwakeSlotListCheck = {},
}
function XEquip.GetDefaultFields()
return Default
end
--[[装备共鸣表结构
ResonanceInfo = {
Slot = slot,
Type = XEquipConfig.EquipResonanceType.Attrib,
CharacterId = 0,
TemplateId = 0,
}
]]
--[[/// 意识自动回收设置
[MessagePackObject(keyAsPropertyName: true)]
public class XChipRecycleSite
{
//
public List<int> RecycleStar = new List<int>();
// , 0
public int Days;
}
]]
function XEquip:Ctor(protoData)
for key, v in pairs(Default) do
self[key] = v
end
self:SyncData(protoData)
end
function XEquip:SyncData(protoData)
self.Id = protoData.Id
self.TemplateId = protoData.TemplateId
self.CharacterId = protoData.CharacterId
self.Level = protoData.Level
self.Exp = protoData.Exp
self.Breakthrough = protoData.Breakthrough
self.CreateTime = protoData.CreateTime
self.IsLock = protoData.IsLock
self.IsRecycle = protoData.IsRecycle
2024-09-01 20:49:41 +00:00
self:SetOverrunData(protoData.WeaponOverrunData)
if protoData.ResonanceInfo and next(protoData.ResonanceInfo) then
self.ResonanceInfo = {}
for _, info in pairs(protoData.ResonanceInfo) do
self.ResonanceInfo[info.Slot] = info
end
else
self.ResonanceInfo = nil
end
if protoData.UnconfirmedResonanceInfo and next(protoData.UnconfirmedResonanceInfo) then
self.UnconfirmedResonanceInfo = {}
for _, info in pairs(protoData.UnconfirmedResonanceInfo) do
self.UnconfirmedResonanceInfo[info.Slot] = info
end
else
self.UnconfirmedResonanceInfo = nil
end
self.AwakeSlotListCheck = {}
if protoData.AwakeSlotList and next(protoData.AwakeSlotList) then
self.AwakeSlotList = protoData.AwakeSlotList
for _, slot in pairs(self.AwakeSlotList) do
self.AwakeSlotListCheck[slot] = true
end
end
end
--@isSelect: 是否自选的技能
function XEquip:Resonance(resonanceInfo, isSelect)
local slot = resonanceInfo.Slot
local info = self.ResonanceInfo and self.ResonanceInfo[slot]
if not info then
self.ResonanceInfo = self.ResonanceInfo and self.ResonanceInfo or {}
self.ResonanceInfo[slot] = resonanceInfo
else
if not isSelect then
self.UnconfirmedResonanceInfo = self.UnconfirmedResonanceInfo and self.UnconfirmedResonanceInfo or {}
if resonanceInfo and next(resonanceInfo) then
self.UnconfirmedResonanceInfo[slot] = resonanceInfo
end
else
self.ResonanceInfo[slot] = resonanceInfo
end
end
self:SetRecycle(false)
end
function XEquip:ResonanceConfirm(slot, isUse)
local info = self.UnconfirmedResonanceInfo and self.UnconfirmedResonanceInfo[slot]
if not info then return end
self.ResonanceInfo[slot] = isUse and info or self.ResonanceInfo[slot]
if self.UnconfirmedResonanceInfo then
self.UnconfirmedResonanceInfo[slot] = nil
self.UnconfirmedResonanceInfo = next(self.UnconfirmedResonanceInfo) and self.UnconfirmedResonanceInfo or nil
end
self:SetRecycle(false)
end
function XEquip:SetAwake(slot)
local awakeSlotList = {}
self.AwakeSlotListCheck[slot] = true
for tmpSlot in pairs(self.AwakeSlotListCheck) do
tableInsert(awakeSlotList, tmpSlot)
end
self.AwakeSlotList = awakeSlotList
self:SetRecycle(false)
end
function XEquip:PutOn(characterId)
characterId = characterId or 0
self.CharacterId = characterId
self:SetRecycle(false)
end
function XEquip:TakeOff()
self.CharacterId = 0
end
function XEquip:SetLock(isLock)
self.IsLock = isLock and true or false
self:SetRecycle(false)
end
function XEquip:SetRecycle(isRecycle)
self.IsRecycle = isRecycle and true or false
end
function XEquip:BreakthroughOneTime()
self.Breakthrough = self.Breakthrough + 1
self.Level = 1
self.Exp = 0
self:SetRecycle(false)
end
function XEquip:SetBreakthrough(breakthrough)
self.Breakthrough = breakthrough
end
function XEquip:SetLevel(level)
self.Level = level
self:SetRecycle(false)
end
function XEquip:SetExp(exp)
self.Exp = exp
end
function XEquip:IsEquipPosAwaken(slot)
return self.AwakeSlotListCheck[slot] and true or false
end
function XEquip:GetEquipViewModel()
local viewModelScript
2024-09-01 20:49:41 +00:00
if self:IsWeapon() then
viewModelScript = require("XEntity/XEquip/XWeaponViewModel")
else
viewModelScript = require("XEntity/XEquip/XEquipViewModel")
end
local viewModel = viewModelScript.New(self.TemplateId)
local data = {}
for key, _ in pairs(Default) do
data[key] = self[key]
end
viewModel:UpdateWithData(data)
return viewModel
end
2024-09-01 20:49:41 +00:00
-- 是否有穿戴在角色身上
function XEquip:IsWearing()
return self.CharacterId and self.CharacterId > 0
end
-- 是否是装备
function XEquip:IsWeapon()
local equipSite = XMVCA:GetAgency(ModuleId.XEquip):GetEquipSite(self.TemplateId)
local isWeapon = equipSite == XEnumConst.EQUIP.EQUIP_SITE.WEAPON
return isWeapon
end
-- 是否是意识
-- 传site则判断是否是对应位置的意识
function XEquip:IsAwareness(site)
local equipSite = XMVCA:GetAgency(ModuleId.XEquip):GetEquipSite(self.TemplateId)
if site then
return equipSite == site
else
local isAwareness = equipSite >= XEnumConst.EQUIP.EQUIP_SITE.AWARENESS.ONE and equipSite <= XEnumConst.EQUIP.EQUIP_SITE.AWARENESS.SIX
return isAwareness
end
end
-- 获取品质横图
function XEquip:GetEquipQualityPath()
if self.OverrunData and self.OverrunData.Level > 0 then
local deregulateUICfg = XEquipConfig.GetWeaponDeregulateUICfg(self.OverrunData.Level)
return deregulateUICfg.IconQuality
end
return XDataCenter.EquipManager.GetEquipQualityPath(self.TemplateId)
end
-- 获取品质横特效
function XEquip:GetEquipQualityEffectPath()
if self.OverrunData and self.OverrunData.Level > 0 then
local deregulateUICfg = XEquipConfig.GetWeaponDeregulateUICfg(self.OverrunData.Level)
return deregulateUICfg.IconQualityEffect
end
return
end
-- 获取品质竖图
function XEquip:GetEquipBgPath()
if self.OverrunData and self.OverrunData.Level > 0 then
local deregulateUICfg = XEquipConfig.GetWeaponDeregulateUICfg(self.OverrunData.Level)
return deregulateUICfg.ItemsQuality
end
return XDataCenter.EquipManager.GetEquipBgPath(self.TemplateId)
end
-- 获取品质竖特效
function XEquip:GetEquipBgEffectPath()
if self.OverrunData and self.OverrunData.Level > 0 then
local deregulateUICfg = XEquipConfig.GetWeaponDeregulateUICfg(self.OverrunData.Level)
return deregulateUICfg.ItemsQualityEffect
end
return
end
--#region 共鸣
-- 获取共鸣数据表key为Pos
function XEquip:GetResonanceInfoDic()
return self.ResonanceInfo or {}
end
-- 获取对应位置的共鸣信息
function XEquip:GetResonanceInfo(pos)
return self.ResonanceInfo and self.ResonanceInfo[pos] or nil
end
-- 是否共鸣过
function XEquip:IsResonance()
return self.ResonanceInfo ~= nil and next(self.ResonanceInfo)
end
-- 获取共鸣的数量
function XEquip:GetResonanceCount()
local count = 0
if self.ResonanceInfo then
for _, info in pairs(self.ResonanceInfo) do
if info then
count = count + 1
end
end
end
return count
end
-- 获取共鸣绑定的角色ID
function XEquip:GetResonanceBindCharacterId(pos)
if self.ResonanceInfo and self.ResonanceInfo[pos] then
return self.ResonanceInfo[pos].CharacterId
else
return 0
end
end
-- 共鸣技能是否有绑定角色ID
function XEquip:IsResonanceBindCharacter(characterId)
if not self.ResonanceInfo then
return false
end
for _, info in pairs(self.ResonanceInfo) do
if info.CharacterId == characterId then
return true
end
end
return false
end
--#endregion 共鸣
--#region 武器超限
-- 设置超限数据
function XEquip:SetOverrunData(overrunData)
self.OverrunData = overrunData
self.OverrunCanBlindSuit = self:CheckCanBlindSuit()
end
-- 获取超限等级
function XEquip:GetOverrunLevel()
return self.OverrunData and self.OverrunData.Level or 0
end
-- 获取超限选择的意识套装
function XEquip:GetOverrunChoseSuit()
return self.OverrunData and self.OverrunData.ChoseSuit or 0
end
-- 获取超限已激活意识列表
function XEquip:GetOverrunActiveSuits()
return self.OverrunData and self.OverrunData.ActiveSuits or {}
end
-- 是否可以超限
function XEquip:CanOverrun()
return XEquipConfig.CanOverrunByTemplateId(self.TemplateId)
end
-- 是否已经超限
function XEquip:IsOverrun()
return self:GetOverrunLevel() > 0
end
-- 是否可绑定意识套装
function XEquip:IsOverrunCanBlindSuit()
return self.OverrunCanBlindSuit
end
-- 武器超限是否可绑定套装
function XEquip:CheckCanBlindSuit()
local cfg = XEquipConfig.GetWeaponOverrunSuitCfgByTemplateId(self.TemplateId)
if not cfg then
return false
end
return self:GetOverrunLevel() >= cfg.Level
end
-- 超限绑定的意识是否匹配角色类型
-- 可传characterId判断与当前绑定的意识是否匹配
function XEquip:IsOverrunBlindMatch(characterId)
local choseSuit = self:GetOverrunChoseSuit()
if choseSuit == 0 then
return true
end
if not self:IsWearing() and not characterId then
return true
end
characterId = characterId or self.CharacterId
local charType = XCharacterConfigs.GetCharacterType(characterId)
local suitCharType = XEquipConfig.GetSuitCharacterType(choseSuit)
if suitCharType == XEquipConfig.UserType.All or suitCharType == charType then
return true
end
return false
end
-- 超限增加的战力
function XEquip:GetOverrunAbility()
local lv = self:GetOverrunLevel()
if lv < 1 then
return 0
end
local ability = 0
local overrunCfgs = XEquipConfig.GetWeaponOverrunCfgsByTemplateId(self.TemplateId)
for _, overrunCfg in ipairs(overrunCfgs) do
if lv >= overrunCfg.Level then
if overrunCfg.OverrunType == XEquipConfig.WeaponOverrunUnlockType.Suit then
if self:GetOverrunChoseSuit() ~= 0 and self:IsOverrunBlindMatch() then
ability = ability + overrunCfg.Ability
end
else
ability = ability + overrunCfg.Ability
end
end
end
return ability
end
-- 是否显示超限红点
function XEquip:IsShowOverrunRed()
return self:GetOverrunChoseSuit() == 0 and self:CheckCanBlindSuit()
end
--#endregion 武器超限
return XEquip