BaseCell = autoImport("BaseCell") HeadIconCell = class("HeadIconCell", BaseCell) HeadIconCell.path = ResourcePathHelper.UICell("HeadIconCell") HeadIconCell.State = { StandFace = 1, Blink = 2, Emoji = 3, UnActive = 4, } HeadVoiceState = { Open = 1, Close = 2, Ban = 3, } HeadIconCell.BlinkConfig = Table_Avatar[1] --眨眼間隔時間區間 HeadIconCell.BlinkTimeCheck = {2000,5000} function HeadIconCell:Init() self.active = true self.state = HeadIconCell.State.StandFace self:FindObjs() end function HeadIconCell:CreateSelf(parent) if(parent) then self.gameObject = self:CreateObj(HeadIconCell.path,parent) self:FindObjs() end end function HeadIconCell:SetClickEnable(val) if(self.clickObj~=nil) then self.clickObj.gameObject:SetActive(val) end end function HeadIconCell:SetScale(scale) if(self.gameObject)then self.gameObject.transform.localScale = Vector3.one * scale end end function HeadIconCell:FindObjs() if(self.gameObject) then --基礎點選 self.clickObj = self.gameObject:GetComponent(UIWidget) else return end --框 self.frameSp = self:FindGO("Frame"):GetComponent(UISprite) --頭飾后層 self.headAccessoryback = self:FindGO("Head_Accessory_back"):GetComponent(UISprite) --頭髮后層 self.hairback = self:FindGO("Hair_back"):GetComponent(UISprite) --身體 self.body = self:FindGO("Body"):GetComponent(UISprite) --基礎臉部 self.baseFace = self:FindGO("BaseFace"):GetComponent(UISprite) --美瞳 self.eye = self:FindGO("Eye"):GetComponent(UISprite) --頭髮前層 self.hairfront = self:FindGO("Hair_front"):GetComponent(UISprite) --髮飾 self.hairAccessory = self:FindGO("Hair_Accessory"):GetComponent(UISprite) --頭飾前層 self.headAccessoryfront = self:FindGO("Head_Accessory_front"):GetComponent(UISprite) --臉飾 self.faceAccessory = self:FindGO("Face_Accessory"):GetComponent(UISprite) --嘴飾 self.mouthAccessory = self:FindGO("Mouth_Accessory"):GetComponent(UISprite) --avatar部件組 self.avatarPars = self:FindGO("FaceParts") --單張icon self.simpleIcon = self:FindGO("SimpleHeadIcon"):GetComponent(UISprite) self.Voice = self:FindGO("Voice") self.Voice_VoiceOpen = self:FindGO("VoiceOpen",self.Voice) self.Voice_VoiceOpen_Bar1 = self:FindGO("Bar1",self.Voice_VoiceOpen) self.Voice_VoiceOpen_Bar2 = self:FindGO("Bar2",self.Voice_VoiceOpen) self.Voice_VoiceOpen_Bar3 = self:FindGO("Bar3",self.Voice_VoiceOpen) --ban self.Voice_VoiceClose = self:FindGO("VoiceClose",self.Voice) if self.Voice_VoiceOpen then self.Voice_VoiceOpen.gameObject:SetActive(false) self.Voice_VoiceClose.gameObject:SetActive(false) end end function HeadIconCell:SetVoiceState(voiceState) if voiceState == HeadVoiceState.Open then self.Voice.gameObject:SetActive(true) self.Voice_VoiceOpen.gameObject:SetActive(true) self.Voice_VoiceClose.gameObject:SetActive(false) elseif voiceState == HeadVoiceState.Close then self.Voice.gameObject:SetActive(false) self.Voice_VoiceOpen.gameObject:SetActive(false) self.Voice_VoiceClose.gameObject:SetActive(false) elseif voiceState == HeadVoiceState.Ban then self.Voice.gameObject:SetActive(true) self.Voice_VoiceOpen.gameObject:SetActive(false) self.Voice_VoiceClose.gameObject:SetActive(true) end end function HeadIconCell:SetMinDepth(minDepth) self:SetDepth(self.clickObj,minDepth) self:SetDepth(self.frameSp,minDepth+1) self:SetDepth(self.headAccessoryback,minDepth+2) self:SetDepth(self.hairback,minDepth+3) self:SetDepth(self.simpleIcon, minDepth+3) self:SetDepth(self.body,minDepth+4) self:SetDepth(self.baseFace,minDepth+5) self:SetDepth(self.eye,minDepth+6) self:SetDepth(self.hairfront,minDepth+7) self:SetDepth(self.hairAccessory,minDepth+8) self:SetDepth(self.headAccessoryfront,minDepth+9) self:SetDepth(self.faceAccessory,minDepth+10) self:SetDepth(self.mouthAccessory,minDepth+11) end function HeadIconCell:SetDepth(widget,depth) if(widget~=nil) then widget.depth = depth end end function HeadIconCell:SetCreatureID(guid) self.id = guid self:InitEmoji() end function HeadIconCell:InitEmoji() if(self.id and self.syncEmoji) then --初始化表情 local initEmojiID = FunctionPlayerHead.Me():GetEmojiCache(self.id) if(initEmojiID) then self:TryPlayEmojiID(initEmojiID) end end end function HeadIconCell:SetEnabelEmojiFace(val) self.enableEmojiFace = val if(not self.enableEmojiFace) then self:ForceToStandFace() end end --舊版的獲取face圖集里,單張頭像的 function HeadIconCell:SetSimpleIcon(icon) self:SetEnabelEmojiFace(false) self:Hide(self.avatarPars) self:Show(self.simpleIcon.gameObject) if(self.simpleIcon~=nil and icon~=nil) then IconManager:SetFaceIcon(icon, self.simpleIcon) end end --頭像avatar模式 function HeadIconCell:SetData(data) self.data = data local hairID,headID,faceID,mouthID,bodyID,eyeID = self:ParseDisplayLogic(self.data.hairID, self.data.headID, self.data.faceID, self.data.mouthID, self.data.bodyID, self.data.eyeID) local bodydata = Table_Body[bodyID] if bodydata ~= nil and bodydata.HeadIcon ~= "" then self:SetSimpleIcon(bodydata.HeadIcon) return end self:SetEnabelEmojiFace(true) if(self.data~=nil and self.data.id~=nil) then self:SetCreatureID(self.data.id) end self:Show(self.avatarPars) self:Hide(self.simpleIcon.gameObject) self:SetHairColor(self.data.hairID,self.data.haircolor) self:SetHair(hairID) self:SetHairAccessory(hairID) self:SetBody(bodyID) self:SetFace(self.data.gender) self:SetHeadAccessory(headID) self:SetFaceAccessory(faceID) self:SetMouthAccessory(mouthID) self:SetEye(eyeID) if self.data.blink ~= nil then self:SetBlinkEnable(self.data.blink) end end local parts = Asset_Role.CreatePartArray() local PartIndex = Asset_Role.PartIndexEx --return hairID,headID,faceID,mouthID function HeadIconCell:ParseDisplayLogic(hairID,headID,faceID,mouthID,bodyID,eyeID) parts[PartIndex.Hair] = hairID or 0 parts[PartIndex.Head] = headID or 0 parts[PartIndex.Face] = faceID or 0 parts[PartIndex.Mouth] = mouthID or 0 parts[PartIndex.Body] = bodyID or 0 parts[PartIndex.Eye] = eyeID or 0 Asset_Role.PreprocessParts(parts, 0) return parts[PartIndex.Hair], parts[PartIndex.Head], parts[PartIndex.Face], parts[PartIndex.Mouth], parts[PartIndex.Body], parts[PartIndex.Eye] end function HeadIconCell:SetClickWidthHeight(w,h) if(self.clickObj~=nil) then self.clickObj.width = w self.clickObj.height = h end end function HeadIconCell:MakePixelPerfect(uiwidget) if(uiwidget~=nil) then uiwidget:MakePixelPerfect() end end function HeadIconCell:SetHair(hairID) if(hairID~=nil) then local hair = Table_HairStyle[hairID] if(hair) then self:Show(self.hairback.gameObject) self:Show(self.hairfront.gameObject) --set back if hair.HairBack then self:SetSpriteName(self.hairback,hair.HairBack) else errorLog(string.format("HeadIconCell SetHair : %s HairBack = nil",tostring(hairID))) end --set front if hair.HairFront then self:SetSpriteName(self.hairfront,hair.HairFront) else errorLog(string.format("HeadIconCell SetHair : %s HairFront = nil",tostring(hairID))) end self:MakePixelPerfect(self.hairback) self:MakePixelPerfect(self.hairfront) else self:Hide(self.hairback.gameObject) self:Hide(self.hairfront.gameObject) -- errorLog("HeadIconCell try set Hair but cannot find config,id is :"..hairID) end else -- errorLog("HeadIconCell try set Hair but hairID is nil") end end function HeadIconCell:SetHairAccessory(hairID) if(hairID~=nil) then local hair = Table_HairStyle[hairID] if(hair) then self:Show(self.hairAccessory.gameObject) if hair.HairAdornment then self:SetSpriteName(self.hairAccessory,hair.HairAdornment) else errorLog(string.format("HeadIconCell SetHairAccessory : %s HairAdornment = nil",tostring(hairID))) end self:MakePixelPerfect(self.hairAccessory) else self:Hide(self.hairAccessory.gameObject) -- errorLog("HeadIconCell try set HairAccessory but cannot find config,id is :"..hairID) end else -- errorLog("HeadIconCell try set HairAccessory but hairID is nil") end end function HeadIconCell:SetHairColor(hairID,hairColorID,refresh) hairColorID = hairColorID or 0 if(hairColorID~=nil) then self.hairID = hairID self.hairColorID = hairColorID local hair = Table_HairStyle[hairID] if(self.active) then if(hair) then if hair.PaintColor_Parsed then local c = hair.PaintColor_Parsed[hairColorID] --TODO美術需求暫時不變色 --set back if(c) then self.hairback.color = c self.hairfront.color = c end else errorLog("HeadIconCell SetHairColor : PaintColor_Parsed = nil") end elseif(not refresh) then -- errorLog("HeadIconCell try set HairColor but cannot find config,id is :"..hairColorID.." "..hairID) end end elseif(not refresh) then -- errorLog("HeadIconCell try set HairColor but hairColorID is nil") end end function HeadIconCell:SetBody(bodyID) if(bodyID~=nil) then local body = Table_Body[bodyID] if(body) then local bodyStr = body.AvatarBody; if(bodyStr==nil or bodyStr == "")then bodyStr = "Body_"..body.Texture; end self:SetSpriteName(self.body,bodyStr) self:MakePixelPerfect(self.body) else -- errorLog("HeadIconCell try set Body but cannot find config,id is :"..bodyID) end else -- errorLog("HeadIconCell try set Body but bodyID is nil") end end function HeadIconCell:SetFace(sex) if(sex~=nil) then if(self.sex ~= sex) then self.sex = sex self:RefreshFace() end else -- errorLog("HeadIconCell try set Face but sex is nil") end end function HeadIconCell:SetHeadAccessory(headAccessory) if headAccessory and headAccessory ~= 0 then local assesories = Table_Assesories[headAccessory] if assesories then self:Show(self.headAccessoryback.gameObject) self:Show(self.headAccessoryfront.gameObject) if assesories.Back then local isSet = IconManager:SetHeadAccessoryBackIcon(assesories.Back, self.headAccessoryback) self.headAccessoryback.gameObject:SetActive(isSet) self:MakePixelPerfect(self.headAccessoryback) end if assesories.Front then local isSet = IconManager:SetHeadAccessoryFrontIcon(assesories.Front, self.headAccessoryfront) self.headAccessoryfront.gameObject:SetActive(isSet) self:MakePixelPerfect(self.headAccessoryfront) end return end end self:Hide(self.headAccessoryback.gameObject) self:Hide(self.headAccessoryfront.gameObject) end function HeadIconCell:SetFaceAccessory(faceAccessory) if faceAccessory and faceAccessory ~= 0 then local assesories = Table_Assesories[faceAccessory] if assesories then self:Show(self.faceAccessory.gameObject) if assesories.Front then local isSet = IconManager:SetHeadFaceMouthIcon(assesories.Front, self.faceAccessory) self.faceAccessory.gameObject:SetActive(isSet) self:MakePixelPerfect(self.faceAccessory) end return end end self:Hide(self.faceAccessory.gameObject) end function HeadIconCell:SetMouthAccessory(mouthAccessory) if mouthAccessory and mouthAccessory ~= 0 then local assesories = Table_Assesories[mouthAccessory] if assesories then self:Show(self.mouthAccessory.gameObject) if assesories.Front then local isSet = IconManager:SetHeadFaceMouthIcon(assesories.Front, self.mouthAccessory) self.mouthAccessory.gameObject:SetActive(isSet) self:MakePixelPerfect(self.mouthAccessory) end return end end self:Hide(self.mouthAccessory.gameObject) end function HeadIconCell:SetEye(eye) if eye and eye ~= 0 then self:Show(self.eye.gameObject) local data = Table_Eye[eye] if data and data.HeadImage then local isSet = IconManager:SetEyeIcon(data.HeadImage, self.eye) self.eye.gameObject:SetActive(isSet) self:MakePixelPerfect(self.eye) if #data.EyeColor > 0 then local hasColor,eyeColor = ColorUtil.TryParseFromNumber(data.EyeColor[1]) self.eye.color = eyeColor end end else self:Hide(self.eye.gameObject) end end function HeadIconCell:SetSpriteName(sprite,name) if(sprite~=nil) then if(sprite.atlas~=nil) then if(sprite.atlas:GetSprite(name)~=nil) then sprite.spriteName = name self:Show(sprite.gameObject) else sprite.spriteName = nil self:Hide(sprite.gameObject) end end end end function HeadIconCell:SetActive(val,emojiChange) if(self.active~=val) then self.active = val if(val) then ColorUtil.WhiteUIWidget(self.headAccessoryback) ColorUtil.WhiteUIWidget(self.body) ColorUtil.WhiteUIWidget(self.baseFace) ColorUtil.WhiteUIWidget(self.eye) ColorUtil.WhiteUIWidget(self.hairAccessory) ColorUtil.WhiteUIWidget(self.simpleIcon) ColorUtil.WhiteUIWidget(self.headAccessoryfront) ColorUtil.WhiteUIWidget(self.faceAccessory) ColorUtil.WhiteUIWidget(self.mouthAccessory) self:SetHairColor(self.hairID,self.hairColorID,true) else ColorUtil.ShaderGrayUIWidget(self.headAccessoryback) ColorUtil.ShaderGrayUIWidget(self.hairback) ColorUtil.ShaderGrayUIWidget(self.body) ColorUtil.ShaderGrayUIWidget(self.baseFace) ColorUtil.ShaderGrayUIWidget(self.eye) ColorUtil.ShaderGrayUIWidget(self.hairfront) ColorUtil.ShaderGrayUIWidget(self.hairAccessory) ColorUtil.ShaderGrayUIWidget(self.headAccessoryfront) ColorUtil.ShaderGrayUIWidget(self.faceAccessory) ColorUtil.ShaderGrayUIWidget(self.mouthAccessory) ColorUtil.ShaderLightGrayUIWidget(self.simpleIcon) end end if(emojiChange) then if(val)then if(self.state == HeadIconCell.State.UnActive) then self:SetFaceState(HeadIconCell.State.StandFace) end else self:SetFaceState(HeadIconCell.State.UnActive) end end end function HeadIconCell:SetBlinkEnable(val) if(val) then self:ResetBlinkTime() TimeTickManager.Me():CreateTick(0,500,self.TryBlink,self) else if(self.state == HeadIconCell.State.Blink) then self:SetFaceState(HeadIconCell.State.StandFace) end TimeTickManager.Me():ClearTick(self) end end function HeadIconCell:ResetBlinkTime() self.blinkInteval = 0 self.blinkTime = math.random(HeadIconCell.BlinkTimeCheck[1],HeadIconCell.BlinkTimeCheck[2]) end function HeadIconCell:TryBlink(delta) if(GameObjectUtil.Instance:ObjectIsNULL(self.gameObject)) then TimeTickManager.Me():ClearTick(self) end self.blinkInteval = self.blinkInteval + delta if(self.blinkInteval>=self.blinkTime) then self:ResetBlinkTime() if(self.state == HeadIconCell.State.StandFace and not self.isEmojiInCD) then if(math.random(1,10000)<=HeadIconCell.BlinkConfig.Probability) then self:SetFaceState(HeadIconCell.State.Blink) LeanTween.delayedCall(self.gameObject,HeadIconCell.BlinkConfig.Duration,function () if(self.state == HeadIconCell.State.Blink) then self:SetFaceState(HeadIconCell.State.StandFace) end end) end end end end function HeadIconCell:RefreshFace() if(GameObjectUtil.Instance:ObjectIsNULL(self.gameObject)) then return end local face if(self.state == HeadIconCell.State.Emoji)then local config = Table_Avatar[self.currentEmojiID] if config then face = config.NameEn self:Hide(self.eye.gameObject) end else self.currentEmojiID = nil if(self.state == HeadIconCell.State.StandFace) then face = "Head_stand" self:Show(self.eye.gameObject) elseif(self.state == HeadIconCell.State.Blink)then face = "Head_closeeye" self:Hide(self.eye.gameObject) elseif(self.state == HeadIconCell.State.UnActive)then face = "Head_closeeye" self:Hide(self.eye.gameObject) end end if(face~=nil) then face = face.."_"..(self.sex==RoleConfig.Gender.Male and "M" or "F") self:SetSpriteName(self.baseFace,face) self:MakePixelPerfect(self.baseFace) end end function HeadIconCell:SetFaceState(state) self.state = state self:RefreshFace() end function HeadIconCell:ForceToStandFace() self.isEmojiInCD = false self:SetFaceState(HeadIconCell.State.StandFace) end function HeadIconCell:TryPlayEmojiID(emojiID) if(self.enableEmojiFace) then local config = Table_Avatar[emojiID] if(config and self:IsPlayEmoji(config)) then local duration = config.Duration local cd = 1 if(self.currentEmojiID ~= emojiID) then self.currentEmojiID = emojiID self:SetFaceState(HeadIconCell.State.Emoji) self.isEmojiInCD = true if(duration~=0) then LeanTween.cancel(self.gameObject) --表情持續duration時間 LeanTween.delayedCall(duration, function () if(self.state==HeadIconCell.State.Emoji) then self:SetFaceState(HeadIconCell.State.StandFace) end end) --表情持續時間后,有1秒的無法再次播放表情的CD LeanTween.delayedCall(duration + 1, function () self.isEmojiInCD = false end) end end end end end function HeadIconCell:IsPlayEmoji(config) if self.state < HeadIconCell.State.Emoji and not self.isEmojiInCD then return true elseif self.state == HeadIconCell.State.Emoji then local curConfig = Table_Avatar[self.currentEmojiID] if curConfig and config.Priority and curConfig.Priority then if config.Priority < curConfig.Priority then return true end end end return false end function HeadIconCell:ServerSyncEmoji(sdata) if(sdata.charid == self.id) then self:TryPlayEmojiID(sdata.expressionid) end end function HeadIconCell:ServerSyncDefautEmoji(sdata) if(sdata.charid == self.id) then if(self.state ~= HeadIconCell.State.UnActive) then self:ForceToStandFace() end end end function HeadIconCell:EnableBlinkEye() self:SetBlinkEnable(true) end function HeadIconCell:HideFrame() self.frameSp.gameObject:SetActive(false) end function HeadIconCell:OnAdd() self.syncEmoji = true self:InitEmoji() FunctionPlayerHead.Me():AddEventListener(FunctionPlayerHead.PlayDefaultEmojiEvent,self.ServerSyncDefautEmoji,self) FunctionPlayerHead.Me():AddEventListener(FunctionPlayerHead.PlayEmojiEvent,self.ServerSyncEmoji,self) FunctionPlayerHead.Me():AddEventListener(FunctionPlayerHead.EnableBlinkEye,self.EnableBlinkEye,self) end function HeadIconCell:OnRemove() self.syncEmoji = false FunctionPlayerHead.Me():RemoveEventListener(FunctionPlayerHead.PlayDefaultEmojiEvent,self.ServerSyncDefautEmoji,self) FunctionPlayerHead.Me():RemoveEventListener(FunctionPlayerHead.PlayEmojiEvent,self.ServerSyncEmoji,self) FunctionPlayerHead.Me():RemoveEventListener(FunctionPlayerHead.EnableBlinkEye,self.EnableBlinkEye,self) TimeTickManager.Me():ClearTick(self) end MyHeadIconCell = class("MyHeadIconCell",HeadIconCell) function MyHeadIconCell:Refresh() local myself = Game.Myself if(myself) then local userData = myself.data.userdata if(userData) then local hairID = userData:Get(UDEnum.HAIR) or nil local bodyID = userData:Get(UDEnum.BODY) or nil local sex = userData:Get(UDEnum.SEX) or nil local haircolor = userData:Get(UDEnum.HAIRCOLOR) or nil local headID = userData:Get(UDEnum.HEAD) or nil local faceID = userData:Get(UDEnum.FACE) or nil local mouthID = userData:Get(UDEnum.MOUTH) or nil local eye = userData:Get(UDEnum.EYE) or nil self:SetHairColor(hairID,haircolor) hairID,headID,faceID,mouthID = self:ParseDisplayLogic(hairID, headID, faceID, mouthID) self:SetHair(hairID) self:SetHairAccessory(hairID) self:SetBody(bodyID) self:SetFace(sex) self:SetHeadAccessory(headID) self:SetFaceAccessory(faceID) self:SetMouthAccessory(mouthID) self:SetEye(eye) end end end