local UIWidgetBase = require_ex('Common/Core/UIWidgetBase') CommonMedalNode = HL.Class('CommonMedalNode', UIWidgetBase) CommonMedalNode.m_achievementData = HL.Field(HL.Any) CommonMedalNode.m_level = HL.Field(HL.Number) << 0 CommonMedalNode.m_obtained = HL.Field(HL.Boolean) << false CommonMedalNode.m_plated = HL.Field(HL.Boolean) << false CommonMedalNode.m_maxLevel = HL.Field(HL.Number) << 0 CommonMedalNode.m_state = HL.Field(HL.String) << '' CommonMedalNode._OnFirstTimeInit = HL.Override() << function(self) self:_InitViews() end CommonMedalNode.InitCommonMedalNode = HL.Method(HL.String) << function(self, achievementId) self:_FirstTimeInit() self.m_achievementData = Tables.achievementTable[achievementId] local isEmpty = string.isEmpty(achievementId) or self.m_achievementData == nil if isEmpty then self.view.stateCtrl:SetState("NotObtained") return end self:_LoadData(achievementId) self:_RenderViews() end CommonMedalNode._InitViews = HL.Method() << function(self) self.view.button.onClick:RemoveAllListeners() self.view.button.onClick:AddListener(function() self:_OnClick() end) self:RegisterMessage(MessageConst.ON_ACHIEVEMENT_UPDATE, function(args) if self.m_achievementData ~= nil and not string.isEmpty(self.m_achievementData.achieveId) then self:_LoadData(self.m_achievementData.achieveId) self:_RenderViews() end end) end CommonMedalNode._LoadData = HL.Method(HL.String) << function(self, achievementId) local achievementSystem = GameInstance.player.achievementSystem local succ, playerInfo = achievementSystem.achievementData.achievementInfos:TryGetValue(achievementId) self.m_level = succ and playerInfo.level or 0 self.m_obtained = succ and playerInfo.level >= self.m_achievementData.initLevel self.m_plated = succ and playerInfo.isPlated self.m_maxLevel = self.m_achievementData.initLevel for i, levelInfo in pairs(self.m_achievementData.levelInfos) do self.m_maxLevel = math.max(self.m_maxLevel, levelInfo.achieveLevel) end self.m_state = "Obtained" if not self.m_obtained then self.m_state = "NotObtained" elseif self.m_achievementData.canBePlated and not self.m_plated then self.m_state = "CanPlated" elseif self.m_achievementData.canBePlated and self.m_plated then self.m_state = "Plated" elseif self.m_achievementData.canBeUpgraded and self.m_level < self.m_maxLevel then self.m_state = "CanUpgrade" elseif self.m_achievementData.canBeUpgraded and self.m_level >= self.m_maxLevel then self.m_state = "Upgraded" end end CommonMedalNode._RenderViews = HL.Method() << function(self) if self.m_obtained then local medalBundle = { achievementId = self.m_achievementData.achieveId, level = self.m_level, isPlated = self.m_plated, isRare = self.m_achievementData.applyRareEffect, } self.view.medal:InitMedal(medalBundle) end self.view.stateCtrl:SetState(self.m_state) end CommonMedalNode._OnClick = HL.Method() << function(self) if self.m_achievementData == nil then return end local achievementId = self.m_achievementData.achieveId if not string.isEmpty(achievementId) then Notify(MessageConst.SHOW_ACHIEVEMENT, achievementId) end end HL.Commit(CommonMedalNode) return CommonMedalNode