diff --git a/lua/app/common/bi_report.lua b/lua/app/common/bi_report.lua index cdbd7bce..fa81f170 100644 --- a/lua/app/common/bi_report.lua +++ b/lua/app/common/bi_report.lua @@ -103,6 +103,9 @@ BIReport.ITEM_GET_TYPE = { DUNGEON_SHARDS_CHALLENGE = "DungeonShardsChallenge", -- 碎片副本挑战 DUNGEON_SHARDS_END = "DungeonShardsEnd", -- 碎片副本结算 DUNGEON_SHARDS_SWEEP = "DungeonShardsSweep", -- 碎片副本扫荡 + CHANGE_NAME = "ChangeName", -- 重命名 + CHANGE_AVATAR = "ChangeAvatar", -- 修改头像 + CHANGE_FRAME = "ChangeFrame", -- 修改头像框 } BIReport.ADS_CLICK_TYPE = { diff --git a/lua/app/common/event_manager.lua b/lua/app/common/event_manager.lua index 3fbc8755..72b52f12 100644 --- a/lua/app/common/event_manager.lua +++ b/lua/app/common/event_manager.lua @@ -36,6 +36,9 @@ EventManager.CUSTOM_EVENT = { CDKEY_FINISH = "CDKEY_FINISH", -- CDKEY DUNGEON_CHALLENGE = "DUNGEON_CHALLENGE",-- 副本开始挑战 DUNGEON_SWEEP = "DUNGEON_SWEEP",-- 副本开始扫荡 + PLAYER_INFO_CLICK_AVATAR = "PLAYER_INFO_CLICK_AVATAR",-- 个人信息选择头像 + PLAYER_INFO_CLICK_FRAME = "PLAYER_INFO_CLICK_FRAME",-- 个人信息选择头像框 + RENAME_SUCCESS = "RENAME_SUCCESS",-- 重命名成功 -- BORAD_TOUCH_BEGIN = "BORAD_TOUCH_BEGIN", -- BORAD_TOUCH_OVER = "BORAD_TOUCH_OVER" } diff --git a/lua/app/common/local_data.lua b/lua/app/common/local_data.lua index 22c4227d..ea225337 100644 --- a/lua/app/common/local_data.lua +++ b/lua/app/common/local_data.lua @@ -31,6 +31,7 @@ local LOCAL_DATA_KEY = { GATE = "GATE", BOUNTY_POP_TIME = "BOUNTY_POP_TIME", CHALLENGE_TASK_POP_TIME = "CHALLENGE_TASK_POP_TIME", + NEW_AVATAR_AND_FRAME = "NEW_AVATAR_AND_FRAME", SHOP_DISCOUNT_RED_POINT_TIME = "SHOP_DISCOUNT_RED_POINT_TIME", } @@ -375,4 +376,21 @@ function LocalData:setShopDiscountRedPointTime(time) self:setInt(LOCAL_DATA_KEY.SHOP_DISCOUNT_RED_POINT_TIME, time) end +function LocalData:getNewAvatarAndFrame() + local info = json.decode(self:getString(LOCAL_DATA_KEY.NEW_AVATAR_AND_FRAME, "{}")) + -- Logger.logHighlight("获取新头像/头像框状态") + -- Logger.printTable(info) + return info +end + +function LocalData:setNewAvatarAndFrame(info) + -- Logger.logHighlight("保存新头像/头像框状态") + -- Logger.printTable(info) + if not info then + return + end + local str = json.encode(info) + self:setString(LOCAL_DATA_KEY.NEW_AVATAR_AND_FRAME, str) +end + return LocalData \ No newline at end of file diff --git a/lua/app/global/global_const.lua b/lua/app/global/global_const.lua index 6ca1925a..05f2e453 100644 --- a/lua/app/global/global_const.lua +++ b/lua/app/global/global_const.lua @@ -60,6 +60,8 @@ GConst.WAIT_NET_RSP_TIME = 8 -- 与服务器交互的等待回复时间 GConst.INVALID = -1 GConst.DEPTH_BUFFER = 24 +GConst.NAME_MAX_LENTH = 12 + GConst.EMPTY_STRING = "" GConst.EMPTY_TABLE = {} setmetatable(GConst.EMPTY_TABLE, { @@ -186,6 +188,7 @@ GConst.ATLAS_PATH = { UI_LOGIN = "assets/arts/atlas/ui/login.asset", ICON_SKILL = "assets/arts/atlas/icon/skill.asset", ICON_SKILL_BIG = "assets/arts/atlas/icon/skill_big.asset", + ICON_AVATAR = "assets/arts/atlas/icon/avatar.asset", ICON_HERO = "assets/arts/atlas/icon/hero.asset", ICON_HERO_2 = "assets/arts/atlas/icon/hero_2.asset", ICON_SKILL_ROGUE = "assets/arts/atlas/icon/skill_rogue.asset", @@ -592,6 +595,7 @@ end GConst.ERROR_STR = { SUCCESS = "SUCCESS", + NAME_HAS_EXISTED = "NAME_HAS_EXISTED", } return GConst \ No newline at end of file diff --git a/lua/app/module/player/player_manager.lua b/lua/app/module/player/player_manager.lua index b477c407..9a42b039 100644 --- a/lua/app/module/player/player_manager.lua +++ b/lua/app/module/player/player_manager.lua @@ -26,4 +26,53 @@ function PlayerManager:onLevelUpFinish(result) end end +-- 修改昵称 +function PlayerManager:reqChangeNickname(changeName) + self:sendMessage(ProtoMsgType.FromMsgEnum.ChangeNameReq, {name = changeName}, {}, self.respChangeNickname, BIReport.ITEM_GET_TYPE.CHANGE_NAME) +end + +function PlayerManager:respChangeNickname(result) + if result.err_code == GConst.ERROR_STR.SUCCESS then + DataManager.PlayerData:setNickname(result.reqData.name) + EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.RENAME_SUCCESS) + elseif result.err_code == GConst.ERROR_STR.NAME_HAS_EXISTED then + GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.CANNOT_RENAME_DESC_4)) + end +end + +-- 修改头像 +function PlayerManager:reqChangeAvatar(changeId) + self:sendMessage(ProtoMsgType.FromMsgEnum.ChangeAvatarReq, {id = changeId}, {}, self.respChangeAvatar, BIReport.ITEM_GET_TYPE.CHANGE_AVATAR) +end + +function PlayerManager:respChangeAvatar(result) + if result.err_code == GConst.ERROR_STR.SUCCESS then + DataManager.PlayerData:setAvatarUsing(result.reqData.id) + end +end + +-- 修改头像框 +function PlayerManager:reqChangeFrame(changeId) + self:sendMessage(ProtoMsgType.FromMsgEnum.ChangeAvatarFrameReq, {id = changeId}, {}, self.respChangeFrame, BIReport.ITEM_GET_TYPE.CHANGE_FRAME) +end + +function PlayerManager:respChangeFrame(result) + if result.err_code == GConst.ERROR_STR.SUCCESS then + DataManager.PlayerData:setFrameUsing(result.reqData.id) + end +end + +-- 检查解锁头像 +function PlayerManager:checkUnlockAvatar(heroId) + local unlockIds = DataManager.PlayerData:getCanUnlockAvatarIds(heroId) + table.foreach(unlockIds, function (idx, id) + DataManager.PlayerData:setAvatarUnlock(id) + end) +end + +-- 解锁头像框 +function PlayerManager:unlockAvatarFrame(id) + -- 暂无解锁逻辑 +end + return PlayerManager \ No newline at end of file diff --git a/lua/app/ui/currency_bar/currency_bar.lua b/lua/app/ui/currency_bar/currency_bar.lua index d7ea7df8..b8bf6080 100644 --- a/lua/app/ui/currency_bar/currency_bar.lua +++ b/lua/app/ui/currency_bar/currency_bar.lua @@ -1,10 +1,10 @@ local Component = require (GConst.TYPEOF_LUA_CLASS.LUA_COMPONENT) local CurrencyBar = class("CurrencyBar", Component) -CurrencyBar.cellWidth = 174 +CurrencyBar.cellWidth = 162 CurrencyBar.cellHeight = 40 -local OFFSET_X = -27 +local OFFSET_X = -20 local OFFSET_Y = -40 function CurrencyBar:init() diff --git a/lua/app/ui/main_city/main_city_ui.lua b/lua/app/ui/main_city/main_city_ui.lua index be0e6d4f..78c3d254 100644 --- a/lua/app/ui/main_city/main_city_ui.lua +++ b/lua/app/ui/main_city/main_city_ui.lua @@ -593,14 +593,34 @@ function MainCityUI:setSideBarVisible(visible) end function MainCityUI:initPlayerInfo() - self.playerSlider = self.uiMap["main_ui.player_node.slider"] - self.playerLvTx = self.uiMap["main_ui.player_node.lv"] + self.playerSlider = self.uiMap["main_ui.player_node.info.slider.img_prog"] + self.playerLvTx = self.uiMap["main_ui.player_node.info.slider.tx_lv"] + self.playerNameTx = self.uiMap["main_ui.player_node.info.tx_name"] + self.playerAvatarImg = self.uiMap["main_ui.player_node.avatar.img_avatar"] + self.playerFrameImg = self.uiMap["main_ui.player_node.avatar.img_frame"] + self.playerAvatar = self.uiMap["main_ui.player_node.avatar"] + self.uiMap["main_ui.player_node"]:addClickListener(function () + UIManager:showUI("app/ui/player_info/player_info_ui") + end) end function MainCityUI:refreshPlayerInfo() local lv = DataManager.PlayerData:getLv() - self.playerLvTx:setText(GConst.INT_TO_STRING[lv] or tostring(lv)) + self.playerLvTx:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_1, lv)) self.playerSlider:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER).value = DataManager.PlayerData:getExpPercent() + self.playerNameTx:setText(DataManager.PlayerData:getNickname()) + self.playerAvatarImg:setSprite(GConst.ATLAS_PATH.ICON_HERO, DataManager.PlayerData:getAvatarIconId(DataManager.PlayerData:getUsingAvatarId()), function() + self.playerAvatarImg:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE):SetNativeSize() + end) + self.playerFrameImg:setSprite(GConst.ATLAS_PATH.ICON_AVATAR, DataManager.PlayerData:getFrameIconId(DataManager.PlayerData:getUsingFrameId()), function() + self.playerFrameImg:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE):SetNativeSize() + end) + + if DataManager.PlayerData:hasNewAvatar() or DataManager.PlayerData:hasNewFrame() then + self.playerAvatar:addRedPoint(50, 50, 0.7) + else + self.playerAvatar:removeRedPoint() + end end function MainCityUI:initTopNode() diff --git a/lua/app/ui/player_info.meta b/lua/app/ui/player_info.meta new file mode 100644 index 00000000..b7dd42dc --- /dev/null +++ b/lua/app/ui/player_info.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f2be842a1b528e343b2ebc38a2c2ea26 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/lua/app/ui/player_info/avatar_cell.lua b/lua/app/ui/player_info/avatar_cell.lua new file mode 100644 index 00000000..1a6925c4 --- /dev/null +++ b/lua/app/ui/player_info/avatar_cell.lua @@ -0,0 +1,35 @@ +local AvatarCell = class("AvatarCell", BaseCell) + +function AvatarCell:init() + self.uiMap = self:getUIMap() + + self.imgAvatar = self.uiMap["avatar_cell.img_avatar"] + self.lock = self.uiMap["avatar_cell.lock"] + self.use = self.uiMap["avatar_cell.use"] + self.txUse = self.uiMap["avatar_cell.use.tx_use"] + self.select = self.uiMap["avatar_cell.select"] + + self.txUse:setText(I18N:getGlobalText(I18N.GlobalConst.ON_USING_DESC)) + + self:addClickListener(function() + EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.PLAYER_INFO_CLICK_AVATAR, self.id) + end) +end + +function AvatarCell:refresh(id, isSelect) + self.id = id + + -- 红点 + if DataManager.PlayerData:isNewAvatar(self.id) then + self.baseObject:addRedPoint(45, 45, 0.6) + else + self.baseObject:removeRedPoint() + end + + self.select:setActive(isSelect) + self.imgAvatar:setSprite(GConst.ATLAS_PATH.ICON_HERO, DataManager.PlayerData:getAvatarIconId(self.id)) + self.lock:setActive(not DataManager.PlayerData:isAvatarUnlock(self.id)) + self.use:setActive(DataManager.PlayerData:getUsingAvatarId() == self.id) +end + +return AvatarCell \ No newline at end of file diff --git a/lua/app/ui/player_info/avatar_cell.lua.meta b/lua/app/ui/player_info/avatar_cell.lua.meta new file mode 100644 index 00000000..bf31d41b --- /dev/null +++ b/lua/app/ui/player_info/avatar_cell.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 54c0ca559bd35dd4793dae969f0cda92 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/ui/player_info/frame_cell.lua b/lua/app/ui/player_info/frame_cell.lua new file mode 100644 index 00000000..2237bdff --- /dev/null +++ b/lua/app/ui/player_info/frame_cell.lua @@ -0,0 +1,35 @@ +local FrameCell = class("FrameCell", BaseCell) + +function FrameCell:init() + self.uiMap = self:getUIMap() + + self.imgFrame = self.uiMap["frame_cell.img_frame"] + self.lock = self.uiMap["frame_cell.lock"] + self.use = self.uiMap["frame_cell.use"] + self.txUse = self.uiMap["frame_cell.use.tx_use"] + self.select = self.uiMap["frame_cell.select"] + + self.txUse:setText(I18N:getGlobalText(I18N.GlobalConst.ON_USING_DESC)) + + self:addClickListener(function() + EventManager:dispatchEvent(EventManager.CUSTOM_EVENT.PLAYER_INFO_CLICK_FRAME, self.id) + end) +end + +function FrameCell:refresh(id, isSelect) + self.id = id + + -- 红点 + if DataManager.PlayerData:isNewFrame(self.id) then + self.baseObject:addRedPoint(45, 45, 0.6) + else + self.baseObject:removeRedPoint() + end + + self.select:setActive(isSelect) + self.imgFrame:setSprite(GConst.ATLAS_PATH.ICON_AVATAR, DataManager.PlayerData:getFrameIconId(self.id)) + self.lock:setActive(not DataManager.PlayerData:isFrameUnlock(self.id)) + self.use:setActive(DataManager.PlayerData:getUsingFrameId() == self.id) +end + +return FrameCell \ No newline at end of file diff --git a/lua/app/ui/player_info/frame_cell.lua.meta b/lua/app/ui/player_info/frame_cell.lua.meta new file mode 100644 index 00000000..22ab28f3 --- /dev/null +++ b/lua/app/ui/player_info/frame_cell.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 9011185917b95e447b6962cc50a24452 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/ui/player_info/player_info_ui.lua b/lua/app/ui/player_info/player_info_ui.lua new file mode 100644 index 00000000..2c264575 --- /dev/null +++ b/lua/app/ui/player_info/player_info_ui.lua @@ -0,0 +1,238 @@ +local PlayerInfoUI = class("PlayerInfoUI", BaseUI) + +local TAG = { + AVATAR = 1, + FRAME = 2, +} + +function PlayerInfoUI:isFullScreen() + return false +end + +function PlayerInfoUI:getPrefabPath() + return "assets/prefabs/ui/player_info/player_info_ui.prefab" +end + +function PlayerInfoUI:ctor() + self.selectAvatarId = DataManager.PlayerData:getUsingAvatarId() + self.selectFrameId = DataManager.PlayerData:getUsingFrameId() +end + +function PlayerInfoUI:onCover() +end + +function PlayerInfoUI:onReshow() +end + +function PlayerInfoUI:onClose() +end + +function PlayerInfoUI:onLoadRootComplete() + self.uiMap = self.root:genAllChildren() + + self.txTitle = self.uiMap["player_info_ui.bg.title.tx_title"] + self.imgAvatar = self.uiMap["player_info_ui.bg.info.avatar.img_avatar"] + self.imgFrame = self.uiMap["player_info_ui.bg.info.avatar.img_frame"] + self.expProg = self.uiMap["player_info_ui.bg.info.exp.exp_prog"] + self.txLevel = self.uiMap["player_info_ui.bg.info.exp.level.tx_level"] + self.txName = self.uiMap["player_info_ui.bg.info.nickname.tx_name"] + self.btnRename = self.uiMap["player_info_ui.bg.info.nickname.btn_rename"] + self.tagAvatar = self.uiMap["player_info_ui.bg.list.tags.tag_avatar"] + self.selectAvatar = self.uiMap["player_info_ui.bg.list.tags.tag_avatar.select"] + self.txAvatar = self.uiMap["player_info_ui.bg.list.tags.tag_avatar.tx_avatar"] + self.txAvatarS = self.uiMap["player_info_ui.bg.list.tags.tag_avatar.select.tx_avatar_s"] + self.tagFrame = self.uiMap["player_info_ui.bg.list.tags.tag_frame"] + self.selectFrame = self.uiMap["player_info_ui.bg.list.tags.tag_frame.select"] + self.txFrame = self.uiMap["player_info_ui.bg.list.tags.tag_frame.tx_frame"] + self.txFrameS = self.uiMap["player_info_ui.bg.list.tags.tag_frame.select.tx_frame_s"] + self.scrollrectAvatar = self.uiMap["player_info_ui.bg.list.scrollrect_avatar"] + self.scrollrectFrame = self.uiMap["player_info_ui.bg.list.scrollrect_frame"] + self.txDesc = self.uiMap["player_info_ui.bg.tx_desc"] + self.btnUse = self.uiMap["player_info_ui.bg.btn_use"] + self.txUse = self.uiMap["player_info_ui.bg.btn_use.tx_use"] + self.btnClose = self.uiMap["player_info_ui.bg.btn_close"] + + self.curTag = TAG.AVATAR + + self.tagAvatar:addClickListener(function() + self:refreshScrollrect(TAG.AVATAR) + end) + self.tagFrame:addClickListener(function() + self:refreshScrollrect(TAG.FRAME) + end) + self.btnRename:addClickListener(function() + UIManager:showUI("app/ui/player_info/rename_ui") + self:closeUI() + end) + self.btnUse:addClickListener(function() + if self.curTag == TAG.AVATAR then + ModuleManager.PlayerManager:reqChangeAvatar(self.selectAvatarId) + elseif self.curTag == TAG.FRAME then + ModuleManager.PlayerManager:reqChangeFrame(self.selectFrameId) + end + end) + self.btnClose:addClickListener(function() + self:closeUI() + end) + self:addEventListener(EventManager.CUSTOM_EVENT.PLAYER_INFO_CLICK_AVATAR, function(id) + if self.selectAvatarId == id then + return + end + if DataManager.PlayerData:isNewAvatar(id) then + DataManager.PlayerData:setNewAvatarStatus(id, false) + end + self.selectAvatarId = id + self.scrollRectCompAvatar:updateAllCell() + self:refreshDesc() + end) + self:addEventListener(EventManager.CUSTOM_EVENT.PLAYER_INFO_CLICK_FRAME, function(id) + if self.selectFrameId == id then + return + end + if DataManager.PlayerData:isNewFrame(id) then + DataManager.PlayerData:setNewFrameStatus(id, false) + end + self.selectFrameId = id + self.scrollRectCompFrame:updateAllCell() + self:refreshDesc() + end) + self:bind(DataManager.PlayerData, "dirty", function() + self:onRefresh() + end) +end + +function PlayerInfoUI:onRefresh() + self:refreshScrollrect() + + self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.PLAYER_INFO)) + self.imgAvatar:setSprite(GConst.ATLAS_PATH.ICON_HERO, DataManager.PlayerData:getAvatarIconId(DataManager.PlayerData:getUsingAvatarId())) + self.imgFrame:setSprite(GConst.ATLAS_PATH.ICON_AVATAR, DataManager.PlayerData:getFrameIconId(DataManager.PlayerData:getUsingFrameId())) + local lv = DataManager.PlayerData:getLv() + local exp = DataManager.PlayerData:getExpPercent() + self.txLevel:setText(GConst.INT_TO_STRING[lv] or tostring(lv)) + self.expProg:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER).value = exp + self.txName:setText(DataManager.PlayerData:getNickname()) + self.txAvatar:setText(I18N:getGlobalText(I18N.GlobalConst.AVATAR_HEAD_DESC)) + self.txAvatarS:setText(I18N:getGlobalText(I18N.GlobalConst.AVATAR_HEAD_DESC)) + self.txFrame:setText(I18N:getGlobalText(I18N.GlobalConst.AVATAR_HEAD_FRAME_DESC)) + self.txFrameS:setText(I18N:getGlobalText(I18N.GlobalConst.AVATAR_HEAD_FRAME_DESC)) + + -- 红点 + if DataManager.PlayerData:hasNewAvatar() then + self.tagAvatar:addRedPoint(120, 20, 0.6) + else + self.tagAvatar:removeRedPoint() + end + if DataManager.PlayerData:hasNewFrame() then + self.tagFrame:addRedPoint(120, 20, 0.6) + else + self.tagFrame:removeRedPoint() + end +end + +function PlayerInfoUI:refreshScrollrect(selectTag) + if selectTag ~= nil then + self.curTag = selectTag + end + + if self.curTag == TAG.AVATAR then + self:showAvatar() + elseif self.curTag == TAG.FRAME then + self:showFrame() + end +end + +-- 显示头像列表 +function PlayerInfoUI:showAvatar() + self.ids = DataManager.PlayerData:getShowAvatarIds() + + self.selectAvatar:setActive(true) + self.scrollrectAvatar:setActive(true) + self.selectFrame:setActive(false) + self.scrollrectFrame:setActive(false) + + if self.scrollRectCompAvatar == nil then + self.scrollRectCompAvatar = self.scrollrectAvatar:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE) + self.scrollRectCompAvatar:addInitCallback(function() + return "app/ui/player_info/avatar_cell" + end) + self.scrollRectCompAvatar:addRefreshCallback(function(index, cell) + cell:refresh(self.ids[index], self.ids[index] == self.selectAvatarId) + end) + self.scrollRectCompAvatar:clearCells() + self.scrollRectCompAvatar:refillCells(#self.ids) + else + self.scrollRectCompAvatar:updateAllCell() + end + + self:refreshDesc() +end + +-- 显示框列表 +function PlayerInfoUI:showFrame() + self.ids = DataManager.PlayerData:getShowFrameIds() + + self.selectAvatar:setActive(false) + self.scrollrectAvatar:setActive(false) + self.selectFrame:setActive(true) + self.scrollrectFrame:setActive(true) + + if self.scrollRectCompFrame == nil then + self.scrollRectCompFrame = self.scrollrectFrame:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE) + self.scrollRectCompFrame:addInitCallback(function() + return "app/ui/player_info/frame_cell" + end) + self.scrollRectCompFrame:addRefreshCallback(function(index, cell) + cell:refresh(self.ids[index], self.ids[index] == self.selectFrameId) + end) + self.scrollRectCompFrame:clearCells() + self.scrollRectCompFrame:refillCells(#self.ids) + else + self.scrollRectCompFrame:updateAllCell() + end + + self:refreshDesc() +end + +-- 刷新描述 +function PlayerInfoUI:refreshDesc() + if self.curTag == TAG.AVATAR then + self.txDesc:setText(DataManager.PlayerData:getAvatarDesc(self.selectAvatarId)) + if DataManager.PlayerData:isAvatarUnlock(self.selectAvatarId) and DataManager.PlayerData:getUsingAvatarId() ~= self.selectAvatarId then + -- 已解锁,未使用 + self.btnUse:setTouchEnable(true) + self.btnUse:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_green_1") + self.txUse:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_8)) + else + self.btnUse:setTouchEnable(false) + self.btnUse:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_grey_1") + if DataManager.PlayerData:getUsingAvatarId() == self.selectAvatarId then + -- 已解锁,已使用 + self.txUse:setText(I18N:getGlobalText(I18N.GlobalConst.ON_USING_DESC)) + else + -- 未解锁 + self.txUse:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_7)) + end + end + elseif self.curTag == TAG.FRAME then + self.txDesc:setText(DataManager.PlayerData:getFrameDesc(self.selectFrameId)) + if DataManager.PlayerData:isAvatarUnlock(self.selectFrameId) and DataManager.PlayerData:getUsingFrameId() ~= self.selectFrameId then + -- 已解锁,未使用 + self.btnUse:setTouchEnable(true) + self.btnUse:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_green_1") + self.txUse:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_8)) + else + self.btnUse:setTouchEnable(false) + self.btnUse:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_grey_1") + if DataManager.PlayerData:getUsingFrameId() == self.selectFrameId then + -- 已解锁,已使用 + self.txUse:setText(I18N:getGlobalText(I18N.GlobalConst.ON_USING_DESC)) + else + -- 未解锁 + self.txUse:setText(I18N:getGlobalText(I18N.GlobalConst.HERO_DESC_7)) + end + end + end +end + +return PlayerInfoUI \ No newline at end of file diff --git a/lua/app/ui/player_info/player_info_ui.lua.meta b/lua/app/ui/player_info/player_info_ui.lua.meta new file mode 100644 index 00000000..a11e7196 --- /dev/null +++ b/lua/app/ui/player_info/player_info_ui.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 679d5350053753147927126ec528fd90 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/ui/player_info/rename_ui.lua b/lua/app/ui/player_info/rename_ui.lua new file mode 100644 index 00000000..73eb76bd --- /dev/null +++ b/lua/app/ui/player_info/rename_ui.lua @@ -0,0 +1,109 @@ +local RenameUI = class("RenameUI", BaseUI) + +function RenameUI:isFullScreen() + return false +end + +function RenameUI:getPrefabPath() + return "assets/prefabs/ui/player_info/rename_ui.prefab" +end + +function RenameUI:ctor() +end + +function RenameUI:onCover() +end + +function RenameUI:onReshow() +end + +function RenameUI:onClose() +end + +function RenameUI:onLoadRootComplete() + self.uiMap = self.root:genAllChildren() + + self.txTitle = self.uiMap["rename_ui.bg.title.tx_title"] + self.txDesc = self.uiMap["rename_ui.bg.tx_desc"] + self.input = self.uiMap["rename_ui.bg.input"] + self.txTips = self.uiMap["rename_ui.bg.group.tx_tips"] + self.btnOk = self.uiMap["rename_ui.bg.group.btn_ok"] + self.iconCost = self.uiMap["rename_ui.bg.group.btn_ok.icon"] + self.txConst = self.uiMap["rename_ui.bg.group.btn_ok.tx_const"] + self.txFree = self.uiMap["rename_ui.bg.group.btn_ok.tx_free"] + self.closeBtn = self.uiMap["rename_ui.bg.close_btn"] + self.inputField = self.input:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TMP_INPUT_FIELD) + + self.inputField.text = "" + self.txTitle:setText(I18N:getGlobalText(I18N.GlobalConst.RENAME_DESC)) + self.txDesc:setText(I18N:getGlobalText(I18N.GlobalConst.ENTER_NAME_DESC)) + + if DataManager.PlayerData:isFreeRename() then + self.txTips:setActive(true) + self.txFree:setActive(true) + self.iconCost:setActive(false) + self.txConst:setActive(false) + self.txTips:setText(I18N:getGlobalText(I18N.GlobalConst.FREE_THIS_TIME_DESC)) + self.txFree:setText(I18N:getGlobalText(I18N.GlobalConst.STR_FREE)) + else + local const = DataManager.PlayerData:getRenameCost() + self.constId = GFunc.getRewardId(const) + self.constType = GFunc.getRewardType(const) + self.constNum = GFunc.getRewardNum(const) + + self.txTips:setActive(false) + self.txFree:setActive(false) + self.iconCost:setActive(true) + self.txConst:setActive(true) + self.iconCost:setSprite(GFunc.getRewardIconRes(self.constType, self.constId)) + + if not GFunc.checkCost(self.constId, self.constNum) then + -- 不满足 + self.btnOk:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_grey_1") + self.txConst:setText("x" .. self.constNum .. "") + else + self.btnOk:setSprite(GConst.ATLAS_PATH.COMMON, "common_btn_green_1") + self.txConst:setText("x" .. self.constNum) + end + GFunc.centerImgAndTx(self.iconCost, self.txConst) + end + + self.btnOk:addClickListener(function () + if self.constId ~= nil and self.constNum ~= nil and not GFunc.checkCost(self.constId, self.constNum, true) then + return + end + self:onRename() + end) + self.closeBtn:addClickListener(function () + UIManager:showUI("app/ui/player_info/player_info_ui") + self:closeUI() + end) + self:addEventListener(EventManager.CUSTOM_EVENT.RENAME_SUCCESS, function() + UIManager:showUI("app/ui/player_info/player_info_ui") + self:closeUI() + end) +end + +function RenameUI:onRefresh() +end + +function RenameUI:onRename() + local input = self.inputField.text + + if #input == 0 or GFunc.getIsAllSpaceStr(input) then + GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.CANNOT_RENAME_DESC_1)) + return + end + if GFunc.getTextLen2(input) > GConst.NAME_MAX_LENTH then + GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.CANNOT_RENAME_DESC_2)) + return + end + if CS.XLua.Utils.IsSpecialChar(input) then + GFunc.showToast(I18N:getGlobalText(I18N.GlobalConst.CANNOT_RENAME_DESC_3)) + return + end + + ModuleManager.PlayerManager:reqChangeNickname(input) +end + +return RenameUI \ No newline at end of file diff --git a/lua/app/ui/player_info/rename_ui.lua.meta b/lua/app/ui/player_info/rename_ui.lua.meta new file mode 100644 index 00000000..d53d82b8 --- /dev/null +++ b/lua/app/ui/player_info/rename_ui.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 91317e38be4ffd243aac5e8edc191395 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 3b8b241bab4a4ac9a22fcce9c64f1242, type: 3} diff --git a/lua/app/userdata/hero/hero_data.lua b/lua/app/userdata/hero/hero_data.lua index e9eb69fd..e3d91c24 100644 --- a/lua/app/userdata/hero/hero_data.lua +++ b/lua/app/userdata/hero/hero_data.lua @@ -116,6 +116,7 @@ function HeroData:setHeroLv(id, lv) if not entity:isActived() then self.data.activeCount = self.data.activeCount + 1 ModuleManager.TaskManager:addTaskProgress(GConst.TaskConst.TASK_TYPE.X_NEW_HERO_GOT) + ModuleManager.PlayerManager:checkUnlockAvatar(id) activeBefore = false end entity:setLv(lv) diff --git a/lua/app/userdata/player/player_data.lua b/lua/app/userdata/player/player_data.lua index f566afcf..b268bf9e 100644 --- a/lua/app/userdata/player/player_data.lua +++ b/lua/app/userdata/player/player_data.lua @@ -27,6 +27,16 @@ function PlayerData:init(data) end end + if self.data.playInfo == nil then + self.data.playInfo = {} + end + self.data.playInfo.nickName = basicInfo.name + self.data.playInfo.nameChanged = basicInfo.name_changed + self.data.playInfo.usingAvatarId = basicInfo.avatar + self.data.playInfo.usingFrameId = basicInfo.avatar_frame + self.data.playInfo.unlockAvatar = data.bag.avatars + self.data.playInfo.unlockFrame = data.bag.avatar_frames + local energyLimit = data.energy_limit or GConst.EMPTY_TABLE self.data.vitGemCount = energyLimit.diamond_count or 0 self.data.vitADCount = energyLimit.ad_count or 0 @@ -215,4 +225,251 @@ function PlayerData:checkIfCanShowModuleUnlock(chapterId) self.showModuleUnlockChapter = chapterId end +-- 头像------------------------------------------------------------------------------------ + +-- 获取玩家昵称 +function PlayerData:getNickname() + if self.data.playInfo.nickName == nil or #self.data.playInfo.nickName == 0 then + self.data.playInfo.nickName = I18N:getGlobalText(I18N.GlobalConst.NEW_PLAYER) + end + return self.data.playInfo.nickName +end + +-- 设置玩家昵称 +function PlayerData:setNickname(name) + self.data.playInfo.nickName = name + self:markDirty() +end + +-- 是否可以免费修改昵称 +function PlayerData:isFreeRename() + return not self.data.playInfo.nameChanged +end + +-- 获取修改昵称的花费 +function PlayerData:getRenameCost() + return GFunc.getConstReward("change_name_cost") +end + +-- 头像------------------------------------------------------------------------------------ + +-- 获取玩家当前使用的头像 +function PlayerData:getUsingAvatarId() + return self.data.playInfo.usingAvatarId +end + +-- 设置玩家使用的头像 +function PlayerData:setAvatarUsing(id) + self.data.playInfo.usingAvatarId = id + self.data.playInfo.nameChanged = true + self:markDirty() +end + +-- 获取头像icon id +function PlayerData:getAvatarIconId(id) + return ConfigManager:getConfig("avatar")[id].iconId +end + +-- 头像是否解锁 +function PlayerData:isAvatarUnlock(id) + if self.data.playInfo.unlockAvatar == nil then + return false + end + return self.data.playInfo.unlockAvatar[id] ~= nil +end + +-- 设置头像解锁 +function PlayerData:setAvatarUnlock(id) + Logger.logHighlight("解锁头像:"..id) + if self.data.playInfo.unlockAvatar == nil then + self.data.playInfo.unlockAvatar = {} + end + self.data.playInfo.unlockAvatar[id] = Time:getServerTime() + self:setNewAvatarStatus(id, true) +end + +-- 获取头像描述 +function PlayerData:getAvatarDesc(id) + return I18N:getText("avatar", id, "desc") +end + +-- 是否有新头像 +function PlayerData:hasNewAvatar() + local newIds = LocalData:getNewAvatarAndFrame() + if newIds.avatar == nil or #newIds.avatar == 0 then + return false + end + return true +end + +-- 是否是新头像 +function PlayerData:isNewAvatar(id) + local newIds = LocalData:getNewAvatarAndFrame() + if newIds.avatar ~= nil then + return table.containValue(newIds.avatar, id) + end + return false +end + +-- 设置新头像状态 +function PlayerData:setNewAvatarStatus(id, isNew) + local newIds = LocalData:getNewAvatarAndFrame() + if newIds.avatar == nil then + newIds.avatar = {} + end + + if isNew then + table.insert(newIds.avatar, id) + else + table.removebyvalue(newIds.avatar, id, true) + end + LocalData:setNewAvatarAndFrame(newIds) + self:markDirty() +end + +-- 是否显示头像(已解锁+未解锁可显示) +function PlayerData:isShowAvatar(id) + if self:isAvatarUnlock(id) then + return true + end + -- 判断未解锁时是否显示 + return not ConfigManager:getConfig("avatar")[id].unlock_show +end + +-- 获取可以显示的所有头像id +function PlayerData:getShowAvatarIds() + local unlockIds = table.keys(self.data.playInfo.unlockAvatar) + local lockIds = {} + for id, data in pairs(ConfigManager:getConfig("avatar")) do + if (not self:isAvatarUnlock(id)) and self:isShowAvatar(id) then + table.insert(lockIds, id) + end + end + table.sort(unlockIds, function(a, b) + return a < b + end) + table.sort(lockIds, function(a, b) + return a < b + end) + return table.addArray(unlockIds, lockIds) +end + +-- 获取可解锁的头像id列表 +function PlayerData:getCanUnlockAvatarIds(heroId) + local ids = {} + for id, data in pairs(ConfigManager:getConfig("avatar")) do + if not self:isAvatarUnlock(id) and data.hero == heroId then + table.insert(ids, id) + end + end + return ids +end + +-- 头像框----------------------------------------------------------------------------------- + +-- 获取玩家当前使用的头像框 +function PlayerData:getUsingFrameId() + return self.data.playInfo.usingFrameId +end + +-- 设置玩家使用的头像框 +function PlayerData:setFrameUsing(id) + self.data.playInfo.usingFrameId = id + self:markDirty() +end + +-- 获取框icon id +function PlayerData:getFrameIconId(id) + return ConfigManager:getConfig("avatar_frame")[id].iconId +end + +-- 头像框是否解锁 +function PlayerData:isFrameUnlock(id) + if self.data.playInfo.unlockFrame == nil then + return false + end + return self.data.playInfo.unlockFrame[id] ~= nil +end + +-- 设置头像框解锁 +function PlayerData:setFrameUnlock(id) + Logger.logHighlight("解锁头像框:"..id) + if self.data.playInfo.unlockFrame == nil then + self.data.playInfo.unlockFrame = {} + end + self.data.playInfo.unlockFrame[id] = Time:getServerTime() + self:setNewFrameStatus(id, true) +end + +-- 获取头像框描述 +function PlayerData:getFrameDesc(id) + return I18N:getText("avatar_frame", id, "desc") +end + +-- 是否有新头像框 +function PlayerData:hasNewFrame() + local newIds = LocalData:getNewAvatarAndFrame() + if newIds.frame == nil or #newIds.frame == 0 then + return false + end + return true +end + +-- 是否是新头像框 +function PlayerData:isNewFrame(id) + local newIds = LocalData:getNewAvatarAndFrame() + if newIds.frame ~= nil then + return table.containValue(newIds.frame, id) + end + return false +end + +-- 设置新头像框状态 +function PlayerData:setNewFrameStatus(id, isNew) + local newIds = LocalData:getNewAvatarAndFrame() + if newIds.frame == nil then + newIds.frame = {} + end + + if isNew then + table.insert(newIds.frame, id) + else + table.removebyvalue(newIds.frame, id, true) + end + LocalData:setNewAvatarAndFrame(newIds) + self:markDirty() +end + +-- 是否显示头像框(已解锁+未解锁可显示) +function PlayerData:isShowFrame(id) + if self:isFrameUnlock(id) then + return true + end + -- 判断未解锁时是否显示 + local lock_show = ConfigManager:getConfig("avatar_frame")[id].unlock_show + if lock_show ~= nil then + return not lock_show + else + return true + end +end + +-- 获取可以显示的所有头像框id(已解锁小id>已解锁大id>未解锁小id>未解锁大id) +function PlayerData:getShowFrameIds() + local unlockIds = table.keys(self.data.playInfo.unlockFrame) + local lockIds = {} + for id, data in pairs(ConfigManager:getConfig("avatar_frame")) do + if (not self:isFrameUnlock(id)) and self:isShowFrame(id) then + table.insert(lockIds, id) + end + end + table.sort(unlockIds, function(a, b) + return a < b + end) + table.sort(lockIds, function(a, b) + return a < b + end) + return table.addArray(unlockIds, lockIds) +end + return PlayerData \ No newline at end of file