chenwb10023 12 ساعت پیش
والد
کامیت
9987456f53
53فایلهای تغییر یافته به همراه1362 افزوده شده و 116 حذف شده
  1. BIN
      assets/bundle/FGUI/Chat/Chat.bin
  2. BIN
      assets/bundle/FGUI/Chat/Chat_atlas0.png
  3. 38 0
      assets/bundle/FGUI/Chat/Chat_atlas0.png.meta
  4. BIN
      assets/bundle/FGUI/Home/Home.bin
  5. 1 1
      assets/json/chapterLayout.json
  6. 3 0
      assets/json/dropData.json
  7. 6 0
      assets/json/dropData.json.meta
  8. 4 0
      assets/json/emitterBasicLevel.json
  9. 6 0
      assets/json/emitterBasicLevel.json.meta
  10. 6 6
      assets/json/emitterInfo.json
  11. 8 8
      assets/json/equipInfo.json
  12. 7 3
      assets/script/common/gameCfg.ts
  13. 18 14
      assets/script/common/xlsConfig.ts
  14. 48 11
      assets/script/data/model/Chat/ChatModel.ts
  15. 2 2
      assets/script/frameWork/fgui/mvc/FguiView.ts
  16. 125 3
      assets/script/logic/fgui/Chat/Chat/ChatCtrl.ts
  17. 96 0
      assets/script/logic/fgui/Chat/Chat/ChatItem.ts
  18. 10 0
      assets/script/logic/fgui/Chat/Chat/ChatItem.ts.meta
  19. 38 0
      assets/script/logic/fgui/Common/PopUpFifthView.ts
  20. 10 0
      assets/script/logic/fgui/Common/PopUpFifthView.ts.meta
  21. 35 0
      assets/script/logic/fgui/Common/PopUpForthView.ts
  22. 10 0
      assets/script/logic/fgui/Common/PopUpForthView.ts.meta
  23. 95 0
      assets/script/logic/fgui/Common/PopUpSecondView.ts
  24. 10 0
      assets/script/logic/fgui/Common/PopUpSecondView.ts.meta
  25. 84 0
      assets/script/logic/fgui/Common/PopUpThirdView.ts
  26. 10 0
      assets/script/logic/fgui/Common/PopUpThirdView.ts.meta
  27. 39 6
      assets/script/logic/fgui/Home/Home/HomeChatCom.ts
  28. 5 0
      assets/script/logic/fgui/Home/Home/HomeCtrl.ts
  29. 29 0
      assets/script/shared/admin/PtlgameError.ts
  30. 10 0
      assets/script/shared/admin/PtlgameError.ts.meta
  31. 24 0
      assets/script/shared/admin/PtlroleDataEdit.ts
  32. 10 0
      assets/script/shared/admin/PtlroleDataEdit.ts.meta
  33. 23 0
      assets/script/shared/admin/PtlsevData.ts
  34. 10 0
      assets/script/shared/admin/PtlsevData.ts.meta
  35. 25 0
      assets/script/shared/admin/PtlsevDataEdit.ts
  36. 10 0
      assets/script/shared/admin/PtlsevDataEdit.ts.meta
  37. 26 0
      assets/script/shared/chat/PtlChatHistory.ts
  38. 10 0
      assets/script/shared/chat/PtlChatHistory.ts.meta
  39. 14 4
      assets/script/shared/chat/PtlChatSend.ts
  40. 3 1
      assets/script/shared/chat/server/MsgChatNew_s.ts
  41. 9 0
      assets/script/shared/common/MsgItemsRwd.ts
  42. 10 0
      assets/script/shared/common/MsgItemsRwd.ts.meta
  43. 9 5
      assets/script/shared/hc/PtlHcInfo.ts
  44. 1 1
      assets/script/shared/item/PtlItemInfo.ts
  45. 1 1
      assets/script/shared/item/server/MsgItemChange_s.ts
  46. 385 46
      assets/script/shared/serviceProto.ts
  47. 8 2
      fgui-project/assets/Chat/Chat.xml
  48. 12 0
      fgui-project/assets/Chat/Components/ChatLeftItem.xml
  49. 12 0
      fgui-project/assets/Chat/Components/ChatRightItem.xml
  50. BIN
      fgui-project/assets/Chat/Images/Img_zjm_liaotiandi.png
  51. BIN
      fgui-project/assets/Chat/Images/chat_bot.png
  52. 4 0
      fgui-project/assets/Chat/package.xml
  53. 3 2
      fgui-project/assets/Home/Components/ChatCom.xml

BIN
assets/bundle/FGUI/Chat/Chat.bin


BIN
assets/bundle/FGUI/Chat/Chat_atlas0.png


+ 38 - 0
assets/bundle/FGUI/Chat/Chat_atlas0.png.meta

@@ -0,0 +1,38 @@
+{
+  "ver": "2.3.7",
+  "uuid": "9c3a087f-6c43-4f21-a911-8296e70ed20a",
+  "importer": "texture",
+  "type": "sprite",
+  "wrapMode": "clamp",
+  "filterMode": "bilinear",
+  "premultiplyAlpha": false,
+  "genMipmaps": false,
+  "packable": true,
+  "width": 128,
+  "height": 64,
+  "platformSettings": {},
+  "subMetas": {
+    "Chat_atlas0": {
+      "ver": "1.0.6",
+      "uuid": "ccd1e86d-cac3-4b91-b66a-cdc19dd31604",
+      "importer": "sprite-frame",
+      "rawTextureUuid": "9c3a087f-6c43-4f21-a911-8296e70ed20a",
+      "trimType": "auto",
+      "trimThreshold": 1,
+      "rotated": false,
+      "offsetX": -17.5,
+      "offsetY": 1.5,
+      "trimX": 0,
+      "trimY": 0,
+      "width": 93,
+      "height": 61,
+      "rawWidth": 128,
+      "rawHeight": 64,
+      "borderTop": 0,
+      "borderBottom": 0,
+      "borderLeft": 0,
+      "borderRight": 0,
+      "subMetas": {}
+    }
+  }
+}

BIN
assets/bundle/FGUI/Home/Home.bin


+ 1 - 1
assets/json/chapterLayout.json

@@ -1,6 +1,6 @@
 [
 [
   {"id":10001,"infoId":1,"grid":11,"type":3,"correlationId":10001},
   {"id":10001,"infoId":1,"grid":11,"type":3,"correlationId":10001},
-  {"id":10002,"infoId":1,"grid":12,"type":3,"correlationId":20001},
+  {"id":10002,"infoId":1,"grid":12,"type":3,"correlationId":500001},
   {"id":10003,"infoId":1,"grid":13,"type":2,"correlationId":10101},
   {"id":10003,"infoId":1,"grid":13,"type":2,"correlationId":10101},
   {"id":10004,"infoId":1,"grid":14,"type":51,"correlationId":0},
   {"id":10004,"infoId":1,"grid":14,"type":51,"correlationId":0},
   {"id":10005,"infoId":1,"grid":15,"type":2,"correlationId":10102},
   {"id":10005,"infoId":1,"grid":15,"type":2,"correlationId":10102},

+ 3 - 0
assets/json/dropData.json

@@ -0,0 +1,3 @@
+[
+  {}
+]

+ 6 - 0
assets/json/dropData.json.meta

@@ -0,0 +1,6 @@
+{
+  "ver": "1.0.2",
+  "uuid": "8d1459a1-60a0-4cae-8b84-51700d756231",
+  "importer": "json",
+  "subMetas": {}
+}

+ 4 - 0
assets/json/emitterBasicLevel.json

@@ -0,0 +1,4 @@
+[
+  {"id":"1"},
+  {"id":"2"}
+]

+ 6 - 0
assets/json/emitterBasicLevel.json.meta

@@ -0,0 +1,6 @@
+{
+  "ver": "1.0.2",
+  "uuid": "8d9f1c2c-d0c0-48cd-b763-23d813b30b74",
+  "importer": "json",
+  "subMetas": {}
+}

+ 6 - 6
assets/json/emitterInfo.json

@@ -1,8 +1,8 @@
 [
 [
-  {"id":10001,"name":"基础发射器","icon":"merge_20108","quality":0,"type":1,"upLimit":200,"restoreInterval":1,"restoreNum":[1800,40],"prop":[2,10101,1,2,10102,2,10103,2,10104],"demand":null,"chargingType":0,"chargingCost":null,"expiryTime":0},
-  {"id":20001,"name":"小狗","icon":"","quality":0,"type":2,"upLimit":6,"restoreInterval":0,"restoreNum":null,"prop":[2,10101,2,10102,2,10103,2,10104],"demand":[2,10101,2,10102,2,10103,2,10104],"chargingType":0,"chargingCost":null,"expiryTime":0},
-  {"id":30001,"name":"科学家","icon":"","quality":0,"type":3,"upLimit":1,"restoreInterval":0,"restoreNum":null,"prop":[30001],"demand":[1,101,500,2,10102,2],"chargingType":0,"chargingCost":null,"expiryTime":180},
-  {"id":40001,"name":"井盖","icon":"","quality":0,"type":4,"upLimit":3,"restoreInterval":2,"restoreNum":[180,3],"prop":null,"demand":null,"chargingType":0,"chargingCost":null,"expiryTime":0},
-  {"id":40002,"name":"井盖1","icon":"","quality":0,"type":4,"upLimit":5,"restoreInterval":3,"restoreNum":[40001],"prop":[2,10101,2,10102,2,10103,2,10104],"demand":null,"chargingType":0,"chargingCost":null,"expiryTime":0},
-  {"id":500001,"name":"怪物发射器","icon":"merge_71205","quality":0,"type":50,"upLimit":10,"restoreInterval":0,"restoreNum":null,"prop":null,"demand":null,"chargingType":0,"chargingCost":null,"expiryTime":0}
+  {"id":10001,"name":"基础发射器","icon":"merge_20108","quality":0,"type":1,"upLimit":200,"restoreInterval":1,"restoreNum":[1800,40],"demand":null,"chargingType":0,"chargingCost":null,"expiryTime":0,"price":0},
+  {"id":20001,"name":"小狗","icon":"","quality":0,"type":2,"upLimit":6,"restoreInterval":0,"restoreNum":null,"demand":[2,10101,1,2,10102,1,2,10103,1],"chargingType":0,"chargingCost":null,"expiryTime":0,"price":0},
+  {"id":30001,"name":"科学家","icon":"","quality":0,"type":3,"upLimit":1,"restoreInterval":0,"restoreNum":null,"demand":[1,101,500,2,10102,2],"chargingType":0,"chargingCost":null,"expiryTime":180,"price":0},
+  {"id":40001,"name":"井盖","icon":"","quality":0,"type":4,"upLimit":3,"restoreInterval":2,"restoreNum":[180,3],"demand":null,"chargingType":0,"chargingCost":null,"expiryTime":0,"price":0},
+  {"id":40002,"name":"井盖1","icon":"","quality":0,"type":4,"upLimit":5,"restoreInterval":3,"restoreNum":[40001],"demand":null,"chargingType":0,"chargingCost":null,"expiryTime":0,"price":0},
+  {"id":500001,"name":"怪物发射器","icon":"merge_71205","quality":0,"type":50,"upLimit":10,"restoreInterval":0,"restoreNum":null,"demand":null,"chargingType":0,"chargingCost":null,"expiryTime":0,"price":0}
 ]
 ]

+ 8 - 8
assets/json/equipInfo.json

@@ -1,10 +1,10 @@
 [
 [
-  {"id":11021,"name":"手套","icon":"zb_icon_101","desc":"","quality":2},
-  {"id":12021,"name":"护腕","icon":"zb_icon_201","desc":"","quality":2},
-  {"id":13021,"name":"手镯","icon":"zb_icon_301","desc":"","quality":2},
-  {"id":14021,"name":"肩甲","icon":"zb_icon_401","desc":"","quality":2},
-  {"id":15021,"name":"头冠","icon":"zb_icon_501","desc":"","quality":2},
-  {"id":16021,"name":"衣服","icon":"zb_icon_601","desc":"","quality":2},
-  {"id":17021,"name":"腰带","icon":"zb_icon_701","desc":"","quality":2},
-  {"id":18021,"name":"护腿","icon":"zb_icon_801","desc":"","quality":2}
+  {"id":11021,"name":"手套","icon":"zb_icon_101","desc":"","quality":2,"price":0},
+  {"id":12021,"name":"护腕","icon":"zb_icon_201","desc":"","quality":2,"price":0},
+  {"id":13021,"name":"手镯","icon":"zb_icon_301","desc":"","quality":2,"price":0},
+  {"id":14021,"name":"肩甲","icon":"zb_icon_401","desc":"","quality":2,"price":0},
+  {"id":15021,"name":"头冠","icon":"zb_icon_501","desc":"","quality":2,"price":0},
+  {"id":16021,"name":"衣服","icon":"zb_icon_601","desc":"","quality":2,"price":0},
+  {"id":17021,"name":"腰带","icon":"zb_icon_701","desc":"","quality":2,"price":0},
+  {"id":18021,"name":"护腿","icon":"zb_icon_801","desc":"","quality":2,"price":0}
 ]
 ]

+ 7 - 3
assets/script/common/gameCfg.ts

@@ -1,7 +1,7 @@
 import ConfProxy, { ConfListProxy } from "./confProxy"
 import ConfProxy, { ConfListProxy } from "./confProxy"
-import { XlsConfig, xlsAttrAttr, xlsAudioInfo, xlsChapterInfo, xlsChapterLayout, xlsEmitterInfo, xlsGuideInfo, xlsItemKind
-, xlsItemInfo, xlsKaiqiInfo, xlsLanguageLang, xlsLanguageClientText, xlsLanguageSeverHouduan, xlsLevelLevel, xlsMathInfo, xlsMergePropInfo, xlsMergeInfo
-, xlsEquipInfo, xlsNameName, xlsPackageInfo, xlsPingbiciInfo, xlsTaskDesc, xlsTaskMain } from "./xlsConfig"
+import { XlsConfig, xlsAttrAttr, xlsAudioInfo, xlsChapterInfo, xlsChapterLayout, xlsEmitterInfo, xlsEmitterBasicLevel, xlsGuideInfo
+, xlsItemKind, xlsItemInfo, xlsKaiqiInfo, xlsLanguageLang, xlsLanguageClientText, xlsLanguageSeverHouduan, xlsLevelLevel, xlsMathInfo, xlsMergePropInfo
+, xlsMergeInfo, xlsEquipInfo, xlsNameName, xlsPackageInfo, xlsPingbiciInfo, xlsDropData, xlsTaskDesc, xlsTaskMain } from "./xlsConfig"
 
 
 export default class Gamecfg {
 export default class Gamecfg {
     static attrAttr:ConfProxy<xlsAttrAttr>
     static attrAttr:ConfProxy<xlsAttrAttr>
@@ -9,6 +9,7 @@ export default class Gamecfg {
     static chapterInfo:ConfProxy<xlsChapterInfo>
     static chapterInfo:ConfProxy<xlsChapterInfo>
     static chapterLayoutList:ConfListProxy<xlsChapterLayout>
     static chapterLayoutList:ConfListProxy<xlsChapterLayout>
     static emitterInfo:ConfProxy<xlsEmitterInfo>
     static emitterInfo:ConfProxy<xlsEmitterInfo>
+    static emitterBasicLevel:ConfProxy<xlsEmitterBasicLevel>
     static guideInfo:ConfProxy<xlsGuideInfo>
     static guideInfo:ConfProxy<xlsGuideInfo>
     static guideInfoList:ConfListProxy<xlsGuideInfo>
     static guideInfoList:ConfListProxy<xlsGuideInfo>
     static itemKind:ConfProxy<xlsItemKind>
     static itemKind:ConfProxy<xlsItemKind>
@@ -25,6 +26,7 @@ export default class Gamecfg {
     static nameName:ConfProxy<xlsNameName>
     static nameName:ConfProxy<xlsNameName>
     static packageInfo:ConfProxy<xlsPackageInfo>
     static packageInfo:ConfProxy<xlsPackageInfo>
     static pingbiciInfo:ConfProxy<xlsPingbiciInfo>
     static pingbiciInfo:ConfProxy<xlsPingbiciInfo>
+    static dropData:ConfProxy<xlsDropData>
     static taskDesc:ConfProxy<xlsTaskDesc>
     static taskDesc:ConfProxy<xlsTaskDesc>
     static taskMain:ConfProxy<xlsTaskMain>
     static taskMain:ConfProxy<xlsTaskMain>
     static taskMainByNextid:ConfProxy<xlsTaskMain>
     static taskMainByNextid:ConfProxy<xlsTaskMain>
@@ -51,6 +53,7 @@ export default class Gamecfg {
                Gamecfg.chapterInfo = new ConfProxy("chapterInfo",xls.xlsChapterInfo ,"id")
                Gamecfg.chapterInfo = new ConfProxy("chapterInfo",xls.xlsChapterInfo ,"id")
                Gamecfg.chapterLayoutList = new ConfListProxy("chapterLayoutList",xls.xlsChapterLayout ,"infoId")
                Gamecfg.chapterLayoutList = new ConfListProxy("chapterLayoutList",xls.xlsChapterLayout ,"infoId")
                Gamecfg.emitterInfo = new ConfProxy("emitterInfo",xls.xlsEmitterInfo ,"id")
                Gamecfg.emitterInfo = new ConfProxy("emitterInfo",xls.xlsEmitterInfo ,"id")
+               Gamecfg.emitterBasicLevel = new ConfProxy("emitterBasicLevel",xls.xlsEmitterBasicLevel ,"id")
                Gamecfg.guideInfo = new ConfProxy("guideInfo",xls.xlsGuideInfo ,"id")
                Gamecfg.guideInfo = new ConfProxy("guideInfo",xls.xlsGuideInfo ,"id")
                Gamecfg.guideInfoList = new ConfListProxy("guideInfoList",xls.xlsGuideInfo ,"event")
                Gamecfg.guideInfoList = new ConfListProxy("guideInfoList",xls.xlsGuideInfo ,"event")
                Gamecfg.itemKind = new ConfProxy("itemKind",xls.xlsItemKind ,"kind")
                Gamecfg.itemKind = new ConfProxy("itemKind",xls.xlsItemKind ,"kind")
@@ -63,6 +66,7 @@ export default class Gamecfg {
                Gamecfg.equipInfo = new ConfProxy("equipInfo",xls.xlsEquipInfo ,"id")
                Gamecfg.equipInfo = new ConfProxy("equipInfo",xls.xlsEquipInfo ,"id")
                Gamecfg.nameName = new ConfProxy("nameName",xls.xlsNameName ,"frist")
                Gamecfg.nameName = new ConfProxy("nameName",xls.xlsNameName ,"frist")
                Gamecfg.pingbiciInfo = new ConfProxy("pingbiciInfo",xls.xlsPingbiciInfo ,"id")
                Gamecfg.pingbiciInfo = new ConfProxy("pingbiciInfo",xls.xlsPingbiciInfo ,"id")
+               Gamecfg.dropData = new ConfProxy("dropData",xls.xlsDropData ,"id")
                Gamecfg.taskDesc = new ConfProxy("taskDesc",xls.xlsTaskDesc ,"kind")
                Gamecfg.taskDesc = new ConfProxy("taskDesc",xls.xlsTaskDesc ,"kind")
                Gamecfg.taskMain = new ConfProxy("taskMain",xls.xlsTaskMain ,"id")
                Gamecfg.taskMain = new ConfProxy("taskMain",xls.xlsTaskMain ,"id")
                Gamecfg.taskMainByNextid = new ConfProxy("taskMainByNextid",xls.xlsTaskMain ,"nextid")
                Gamecfg.taskMainByNextid = new ConfProxy("taskMainByNextid",xls.xlsTaskMain ,"nextid")

+ 18 - 14
assets/script/common/xlsConfig.ts

@@ -8,10 +8,12 @@ export type xlsAudioInfo = {id:string,name:string,vol:number}
 export type xlsChapterInfo = {id:number,grid:number[],map:string,name:string}
 export type xlsChapterInfo = {id:number,grid:number[],map:string,name:string}
 export type xlsChapterLayout = {id:number,infoId:number,grid:number,type:number,correlationId:number}
 export type xlsChapterLayout = {id:number,infoId:number,grid:number,type:number,correlationId:number}
 // type for drop.excel
 // type for drop.excel
+export type xlsDropData = {}
 // type for emitter.excel
 // type for emitter.excel
-export type xlsEmitterInfo = {id:number,name:string,icon:string,quality:number,type:number,upLimit:number,restoreInterval:number,restoreNum:number[],prop:number[],demand:number[],chargingType:number,chargingCost:number[],expiryTime:number}
+export type xlsEmitterInfo = {id:number,name:string,icon:string,quality:number,type:number,upLimit:number,restoreInterval:number,restoreNum:number[],demand:number[],chargingType:number,chargingCost:number[],expiryTime:number,price:number}
+export type xlsEmitterBasicLevel = {id:string}
 // type for equip.excel
 // type for equip.excel
-export type xlsEquipInfo = {id:number,name:string,icon:string,desc:string,quality:number}
+export type xlsEquipInfo = {id:number,name:string,icon:string,desc:string,quality:number,price:number}
 // type for fish.excel
 // type for fish.excel
 // type for guide.excel
 // type for guide.excel
 export type xlsGuideInfo = {id:string,event:string,way:string,variable:number[],ytype:number,condition:number[],type:number,pram:any[],pram1:any[]}
 export type xlsGuideInfo = {id:string,event:string,way:string,variable:number[],ytype:number,condition:number[],type:number,pram:any[],pram1:any[]}
@@ -51,28 +53,30 @@ export type xlsTaskMain = {id:string,nextid:string,kind:string,need:number,item:
 // type for wing.excel
 // type for wing.excel
 
 
 export class XlsConfig {
 export class XlsConfig {
-    xlsKaiqiInfo: xlsKaiqiInfo[]
-    xlsEquipInfo: xlsEquipInfo[]
+    xlsAttrAttr: xlsAttrAttr[]
     xlsAudioInfo: xlsAudioInfo[]
     xlsAudioInfo: xlsAudioInfo[]
+    xlsChapterInfo: xlsChapterInfo[]
+    xlsChapterLayout: xlsChapterLayout[]
+    xlsDropData: xlsDropData[]
+    xlsEmitterInfo: xlsEmitterInfo[]
+    xlsEmitterBasicLevel: xlsEmitterBasicLevel[]
+    xlsEquipInfo: xlsEquipInfo[]
+    xlsGuideInfo: xlsGuideInfo[]
     xlsItemKind: xlsItemKind[]
     xlsItemKind: xlsItemKind[]
     xlsItemInfo: xlsItemInfo[]
     xlsItemInfo: xlsItemInfo[]
-    xlsMathInfo: xlsMathInfo[]
-    xlsAttrAttr: xlsAttrAttr[]
-    xlsLanguageSeverHouduan: xlsLanguageSeverHouduan[]
+    xlsKaiqiInfo: xlsKaiqiInfo[]
     xlsLanguageClientText: xlsLanguageClientText[]
     xlsLanguageClientText: xlsLanguageClientText[]
+    xlsLanguageSeverHouduan: xlsLanguageSeverHouduan[]
+    xlsLanguageLang: xlsLanguageLang[]
     xlsLevelLevel: xlsLevelLevel[]
     xlsLevelLevel: xlsLevelLevel[]
-    xlsGuideInfo: xlsGuideInfo[]
-    xlsChapterInfo: xlsChapterInfo[]
-    xlsChapterLayout: xlsChapterLayout[]
+    xlsMathInfo: xlsMathInfo[]
     xlsMergePropInfo: xlsMergePropInfo[]
     xlsMergePropInfo: xlsMergePropInfo[]
-    xlsEmitterInfo: xlsEmitterInfo[]
-    xlsNameName: xlsNameName[]
     xlsMergeInfo: xlsMergeInfo[]
     xlsMergeInfo: xlsMergeInfo[]
+    xlsNameName: xlsNameName[]
     xlsPackageInfo: xlsPackageInfo[]
     xlsPackageInfo: xlsPackageInfo[]
+    xlsPingbiciInfo: xlsPingbiciInfo[]
     xlsTaskDesc: xlsTaskDesc[]
     xlsTaskDesc: xlsTaskDesc[]
     xlsTaskMain: xlsTaskMain[]
     xlsTaskMain: xlsTaskMain[]
-    xlsPingbiciInfo: xlsPingbiciInfo[]
-    xlsLanguageLang: xlsLanguageLang[]
 
 
     constructor(bundleName:string, callback: Function, progressCallback?: Function) {
     constructor(bundleName:string, callback: Function, progressCallback?: Function) {
         cc.assetManager.loadBundle(bundleName, (err, bundle) => {
         cc.assetManager.loadBundle(bundleName, (err, bundle) => {

+ 48 - 11
assets/script/data/model/Chat/ChatModel.ts

@@ -1,11 +1,7 @@
 // 聊天模块
 // 聊天模块
-import Gamecfg from "../../../common/gameCfg";
 import { gameMethod } from "../../../common/gameMethod";
 import { gameMethod } from "../../../common/gameMethod";
-import { ChatHistory, ChatHistoryPram, ChatSend, ChatSendPram } from "../../../common/Xyc";
-import { ChannelType, ChatInfo, SevBack, SevBackType } from "../../../common/Xys";
-import { RedUtil } from "../../../frameWork/fgui/RedUtil";
 import EventMng from "../../../manager/EventMng";
 import EventMng from "../../../manager/EventMng";
-import { ChatType, ResChatSend } from "../../../shared/chat/PtlChatSend";
+import { ChannelType, ResChatSend } from "../../../shared/chat/PtlChatSend";
 import GameMath from "../../../utils/GameMath";
 import GameMath from "../../../utils/GameMath";
 import { ChatEvent } from "../../const/EventConst";
 import { ChatEvent } from "../../const/EventConst";
 import GameDataCenter from "../../GameDataCenter";
 import GameDataCenter from "../../GameDataCenter";
@@ -22,7 +18,7 @@ export default class ChatModel extends ChatModelData {
 	readonly historyMinCd: number = 3;
 	readonly historyMinCd: number = 3;
 	readonly sendChatMinCd: number = 3;
 	readonly sendChatMinCd: number = 3;
 
 
-	curChannel: ChannelType;
+	curChannel: ChannelType = ChannelType.hefu;
 
 
 	get lastId() {
 	get lastId() {
 		return this._lastId.get(this.curChannel);
 		return this._lastId.get(this.curChannel);
@@ -45,16 +41,57 @@ export default class ChatModel extends ChatModelData {
 	}
 	}
 
 
 	onRegister(): void {
 	onRegister(): void {
-        GameDataCenter.gameServer.ListenMsg("chat/server/ChatNew_s", this.onItemChange, this);
+        GameDataCenter.gameServer.ListenMsg("chat/server/ChatNew_s", this.onChatChange, this);
     }
     }
 
 
-	onItemChange(res: ResChatSend) {
-		this.chatInfo = res;
+	onChatChange(res: ResChatSend) {
+		if (gameMethod.isEmpty(this.chatInfo)) {
+			this.chatInfo = {};
+		}
+		for (const channelType in res) {
+			if (gameMethod.isEmpty(this.chatInfo[channelType])) {
+				this.chatInfo[channelType] = {};
+			}
+			for (const xbid in res[channelType]) {
+				this.chatInfo[channelType][xbid] = res[channelType][xbid];
+			}
+		}
+		if (CC_PREVIEW)  console.log("onChatChange:", this.chatInfo);
+		EventMng.emit(ChatEvent.UP_CHAT_INFO)
+	}
+
+	checkCanGetHistory(): boolean {
+		// 本地没历史信息
+		if (this.refreshCd > GameDataCenter.time.sevTime) {
+			return false;
+		}
+		let list = this.chatInfo ?? {};
+		for (const key in list) {
+			this.lastId = list?.[this.curChannel]?.[key]?.id;
+			break;
+		}
+		if (this.lastId <= 1 || this.lastId == null) {
+			return false;
+		}
+		return true;
+	}
+
+	// 获取聊天信息
+	async sendChatHistory(channelType: ChannelType, xbid: number = 0, cb: Function = () => { }) {
+		let ret = await GameDataCenter.gameServer.ReqApi("chat/ChatHistory", {
+			channelType: channelType,
+			xbid: xbid
+		});
+		if (ret?.res) {
+			this.onChatChange(ret?.res);
+			cb(ret.res);
+		}
 	}
 	}
+
 	// 发送聊天信息
 	// 发送聊天信息
-	async sendChat(chatType: ChatType, str: string, cb: Function = () => { }) {
+	async sendChat(channelType: ChannelType, str: string, cb: Function = () => { }) {
 		let ret = await GameDataCenter.gameServer.ReqApi("chat/ChatSend", {
 		let ret = await GameDataCenter.gameServer.ReqApi("chat/ChatSend", {
-			type: chatType,
+			channelType: channelType,
 			str: str
 			str: str
 		});
 		});
 		if (ret?.res) {
 		if (ret?.res) {

+ 2 - 2
assets/script/frameWork/fgui/mvc/FguiView.ts

@@ -137,7 +137,7 @@ export abstract class FguiView implements IUpdate, ILateUpdate {
         this._uiController.RemoveAllClick();
         this._uiController.RemoveAllClick();
         if (this.zOrder == ViewZOrder.Pop) {
         if (this.zOrder == ViewZOrder.Pop) {
             //默认打开动画、音效
             //默认打开动画、音效
-            GameDataCenter.audio.playEffect(AudioConst.effect_open)
+            // GameDataCenter.audio.playEffect(AudioConst.effect_open)
             this.isFinishOpenAni = false
             this.isFinishOpenAni = false
             let animNode = this._panel.node
             let animNode = this._panel.node
             animNode.anchorX = 0.5
             animNode.anchorX = 0.5
@@ -166,7 +166,7 @@ export abstract class FguiView implements IUpdate, ILateUpdate {
     hide(isDispose?: boolean): void {
     hide(isDispose?: boolean): void {
         if (this.zOrder == ViewZOrder.Pop) {
         if (this.zOrder == ViewZOrder.Pop) {
             //默认关闭动画、音效
             //默认关闭动画、音效
-            GameDataCenter.audio.playEffect(AudioConst.effect_open)
+            // GameDataCenter.audio.playEffect(AudioConst.effect_open)
         }
         }
         this._uiController.offEvent()
         this._uiController.offEvent()
         this._uiController.OnHide(isDispose);
         this._uiController.OnHide(isDispose);

+ 125 - 3
assets/script/logic/fgui/Chat/Chat/ChatCtrl.ts

@@ -5,33 +5,155 @@
 /// ui逻辑处理类
 /// ui逻辑处理类
 /// created by chenwb 2024
 /// created by chenwb 2024
 
 
-import { ChannelType } from "../../../../common/Xys";
+import { gameMethod } from "../../../../common/gameMethod";
 import GameDataCenter from "../../../../data/GameDataCenter";
 import GameDataCenter from "../../../../data/GameDataCenter";
+import { ChatEvent } from "../../../../data/const/EventConst";
 import FguiMgr from "../../../../frameWork/fgui/FguiMgr";
 import FguiMgr from "../../../../frameWork/fgui/FguiMgr";
+import { ListUtil } from "../../../../frameWork/fgui/ListUtil";
 import { FguiViewCtrl } from "../../../../frameWork/fgui/mvc/FguiViewCtrl";
 import { FguiViewCtrl } from "../../../../frameWork/fgui/mvc/FguiViewCtrl";
-import { ChatType } from "../../../../shared/chat/PtlChatSend";
+import { ChannelType, ChatInfo, ChatType, ResChatSend } from "../../../../shared/chat/PtlChatSend";
+import { I18n } from "../../../../utils/I18nUtil";
+import UIHelp from "../../../ui/UIHelp";
+import PopUpThirdView from "../../Common/PopUpThirdView";
+import ChatItem from "./ChatItem";
 import { ChatVM } from "./ChatVM";
 import { ChatVM } from "./ChatVM";
 import { ChatView } from "./ChatView";
 import { ChatView } from "./ChatView";
 
 
 export class ChatCtrl extends FguiViewCtrl<ChatVM> {
 export class ChatCtrl extends FguiViewCtrl<ChatVM> {
+    Bg: PopUpThirdView;
+    List: ListUtil;
+    readonly ChatScrollNum: number = 14;
+    readonly ChatLeftItemUrl = "ui://Chat/ChatLeftItem";
+	readonly ChatRightItemUrl = "ui://Chat/ChatRightItem";
     OnInited(): void {
     OnInited(): void {
+        this.Bg = new PopUpThirdView(this.VM.Bg);
+        this.Bg.setData(ChatView);
+        
+		this.initExtension();
+		this.List = new ListUtil(this.VM.ChatList);
+		this.List.setItemProvider(this.ItemProvider, this);
     }
     }
+    initExtension() {
+		fgui.UIObjectFactory.setExtension(this.ChatLeftItemUrl, ChatItem);
+		fgui.UIObjectFactory.setExtension(this.ChatRightItemUrl, ChatItem);
+	}
+
+	ItemProvider(index: number) {
+		let data: ChatInfo = this.List.dataList[index];
+		if (data.chatType == ChatType.moren) {
+			if (data.fuuid == GameDataCenter.user.userInfo?.uuid) {
+				return this.ChatRightItemUrl;
+			} else {
+				return this.ChatLeftItemUrl;
+			}
+		}
+	}
     OnShow(intent?: any): void {
     OnShow(intent?: any): void {
         this.AddListeners();
         this.AddListeners();
+        this.updateChatInfo(GameDataCenter.chat.curChannel, true);
     }
     }
     OnHide(): void {
     OnHide(): void {
         this.RemoveListeners();
         this.RemoveListeners();
     }
     }
     //#region UI事件
     //#region UI事件
     private AddListeners() : void {
     private AddListeners() : void {
+        this.Bg.onEnable();
         this.RegisterClick(this.VM.BtnSend, this.OnClickBtnSend);
         this.RegisterClick(this.VM.BtnSend, this.OnClickBtnSend);
+        
+		this.initEvent(ChatEvent.UP_CHAT_INFO, this.updateChatInfo);
 
 
     }
     }
     private RemoveListeners() : void {
     private RemoveListeners() : void {
+        this.Bg.onDisable();
 // <#UIEventsRemoveArea>
 // <#UIEventsRemoveArea>
     }
     }
+    
+
+	updateChatInfo(channelType: ChannelType = GameDataCenter.chat.curChannel, toBottom = false) {
+		if (channelType != GameDataCenter.chat.curChannel) {
+			return;
+		}
+		let curchat = Object.values(GameDataCenter.chat.chatInfo?.[channelType]) ?? [];
+		curchat.sort((a, b) => {
+			return a.id - b.id;
+		});
+		let LU = this.List;
+		let isbottom = LU.gList.scrollPane.isBottomMost;
+		LU.refreshItems(curchat);
+		if (curchat.length <= 0) return;
+		// 有新消息并且此时视窗位于底部则滚动到底部或者打开进入页面时也强制滚动到底部
+		let sevNew = curchat[curchat.length - 1];
+		if (toBottom) {
+			LU.gList.scrollToView(LU.dataList.length - 1, true);
+		} else if (sevNew.id > GameDataCenter.chat.chatNewId) {
+			// if (isbottom) {
+			// 	this.onNewMsgBtn();
+			// }
+			// else {
+			// 	this.newMsgCount++;
+			// 	this.VM.NewMsgBtn.visible = true;
+			// 	this.VM.NewMsgBtn.title = I18n.getI18nText("chatView_newMsg", this.newMsgCount);
+			// }
+
+		} else if (GameDataCenter.chat.lastId > curchat[0]?.id) {
+			LU.gList.scrollToView(LU.dataList.length > this.ChatScrollNum ? this.ChatScrollNum : LU.dataList.length - 1, false);
+		}
+		GameDataCenter.chat.chatNewId = sevNew.id;
+	}
+
+	// 拉取历史消息
+	onScrollToTop() {
+		if (!GameDataCenter.chat.checkCanGetHistory()) {
+			return;
+		}
+		let list = this.List;
+		list.gList.scrollPane.lockHeader(20);
+		GameDataCenter.chat.sendChatHistory(GameDataCenter.chat.curChannel, GameDataCenter.chat.lastId, (result: ResChatSend) => {
+			list.gList.scrollPane.lockHeader(0);
+			if (gameMethod.isEmpty(result)) {
+				UIHelp.ShowI18nTips("chatView_showtips_1");
+				return;
+			}
+		});
+	}
+
+	onScrollEnd() {
+		let isbottom = this.List.gList.scrollPane.isBottomMost;
+		if (isbottom) {	//每次滑到底,清空新消息数量显示
+			this.onNewMsgBtn();
+		}
+	}
+    //过滤无法显示的助力消息
+    chatListFilter(list: ChatInfo[]): ChatInfo[] {
+
+		let hour: number = -1;
+		let min: number = -1;
+		for (let i = 0; i < list.length; i++) {
+			// if (list[i].chatType == ChatType.time) {
+			// 	continue;
+			// }
+			if (list[i].time > 0) {
+				let dhms = GameDataCenter.chat.getHM(list[i].time);
+				if (dhms.h != hour || dhms.m != min) {
+					hour = dhms.h;
+					min = dhms.m;
+					// list.splice(i, 0, { time: list[i].time, type: ChatType.time, id: list[i].id, fuuid: "", msg: "" });
+				}
+			}
+
+		}
+
+		return list;
+	}
+    onNewMsgBtn() {
+		// this.newMsgCount = 0;
+		// this.VM.NewMsgBtn.visible = false;
+		this.List.gList.scrollToView(this.List.dataList.length - 1, false);
+	}
     private OnClickBtnSend(): void {
     private OnClickBtnSend(): void {
-        GameDataCenter.chat.sendChat(ChatType.hefu, this.VM.TxtInput.text);
+        GameDataCenter.chat.sendChat(ChannelType.hefu, this.VM.TxtInput.text, ()=>{
+            this.VM.TxtInput.text = "";
+        });
     }
     }
 
 
     private Close(): void{
     private Close(): void{

+ 96 - 0
assets/script/logic/fgui/Chat/Chat/ChatItem.ts

@@ -0,0 +1,96 @@
+import { gameMethod } from "../../../../common/gameMethod";
+import { ChatEvent } from "../../../../data/const/EventConst";
+import GameDataCenter from "../../../../data/GameDataCenter";
+import { ItemRender } from "../../../../frameWork/fgui/ListUtil";
+import EventMng from "../../../../manager/EventMng";
+import { ChatInfo, ChatType } from "../../../../shared/chat/PtlChatSend";
+import ClickAuEffect from "../../../../utils/ClickAuEffect";
+import UserHead from "../../Common/UserHead";
+
+
+export default class ChatItem extends ItemRender {
+	info: ChatInfo;
+
+	Head: UserHead;
+	ChatLabel: fairygui.GTextField;
+	pos: fairygui.Controller;
+	NameLabel: fairygui.GTextField;
+	cardDesc: fairygui.GTextField;
+
+	touchStart: number;
+	touchTime: number;
+	timer: number;
+
+	protected onConstruct(): void {
+		this.ChatLabel = this.getChild("ChatLabel") as fairygui.GTextField;
+		this.Head = this.getChild("Head") as UserHead;
+		this.NameLabel = this.getChild("NameLabel") as fairygui.GTextField;
+		this.cardDesc = this.getChild("Desc") as fairygui.GTextField;
+		this.initControllers();
+	}
+
+	onShow(): void {
+		if (this.Head) {
+			this.Head.on(fgui.Event.TOUCH_BEGIN, this.onTouchBegin, this);
+			this.Head.on(fgui.Event.TOUCH_END, this.onTouchEnd, this);
+		}
+	}
+
+	onHide(): void {
+		if (this.Head) {
+			this.Head.off(fgui.Event.TOUCH_BEGIN, this.onTouchBegin, this);
+			this.Head.off(fgui.Event.TOUCH_END, this.onTouchEnd, this);
+		}
+		if (this.timer) {
+			clearInterval(this.timer);
+		}
+
+	}
+
+	onTouchBegin() {
+		this.touchStart = new Date().getTime();
+		this.touchTime = 0;
+		this.timer = this.AddTimerOnce(() => {
+			if (this.touchTime && this.touchTime < 500) {
+				return;
+			}
+			if (this.info.fuuid != GameDataCenter.user.uuid) {
+				EventMng.emit(ChatEvent.MSG_AT, this.info.fuser?.name);
+			}
+		}, 500)
+	}
+
+	onTouchEnd() {
+		this.touchTime = new Date().getTime() - this.touchStart;
+	}
+
+	setData(data: ChatInfo, index?: number, param?: any) {
+		this.info = data;
+		this.NameLabel.text = data.fuser?.name;
+		let isFlip: boolean = false;
+		if (data.fuuid == GameDataCenter.sevBack?.userInfo?.a?.uuid && gameMethod.isEmpty(GameDataCenter.sevBack?.userInfo?.a?.wxhead)) {
+			isFlip = true;
+		}
+		this.Head.setHead({ userInfo: data?.fuser, lookDetails: true, isFlip: isFlip });
+		if (data.chatType == ChatType.moren) {
+			let newString: string = this.addNewlinesEveryNChars(this.info.msg, 15);
+			this.ChatLabel.text = newString;
+			//this.TimeLabel.text = showTimeYMD(data.time);
+		}
+
+		this.updateBounds();
+	}
+
+	addNewlinesEveryNChars(str: string, n: number): string {//每N个字符添加一个换行符号
+		let result = '';
+		for (let i = 0; i < str.length; i += n) {
+			if (gameMethod.isEmpty(str[i + n])) {
+				result += str.slice(i, i + n);
+				break;
+			}
+			result += str.slice(i, i + n) + '\n';
+		}
+		return result;
+	}
+
+}

+ 10 - 0
assets/script/logic/fgui/Chat/Chat/ChatItem.ts.meta

@@ -0,0 +1,10 @@
+{
+  "ver": "1.1.0",
+  "uuid": "e10e9a38-d0e3-4295-91a7-7b3dc55d1bcd",
+  "importer": "typescript",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 38 - 0
assets/script/logic/fgui/Common/PopUpFifthView.ts

@@ -0,0 +1,38 @@
+import FguiMgr from "../../../frameWork/fgui/FguiMgr";
+import ClickAuEffect from "../../../utils/ClickAuEffect";
+
+export default class PopUpFifthView {
+
+    private MaskBg: fairygui.GButton;
+    private CloseBtn: fairygui.GObject;
+
+    private closeUI: any;
+
+    public constructor(vm: fgui.GComponent) {
+        this.MaskBg = vm.getChild("MaskBg").asButton;
+        this.CloseBtn = vm.getChild("CloseBtn");
+    }
+
+    public onEnable(): void {
+        this.MaskBg.onClick(this.OnClickCloseBtn, this);
+        this.CloseBtn.onClick(this.OnClickCloseBtn, this);
+    }
+
+    public onDisable(): void {
+        this.MaskBg.offClick(this.OnClickCloseBtn, this);
+        this.CloseBtn.offClick(this.OnClickCloseBtn, this);
+    }
+    /**
+     * 
+     * @param closeUI 关闭的界面
+     */
+    setData(closeUI: any) {
+        this.closeUI = closeUI;
+    }
+
+    // 关闭
+    @ClickAuEffect()
+    private OnClickCloseBtn() {
+        FguiMgr.Instance.closeUI(this.closeUI);
+    }
+}

+ 10 - 0
assets/script/logic/fgui/Common/PopUpFifthView.ts.meta

@@ -0,0 +1,10 @@
+{
+  "ver": "1.1.0",
+  "uuid": "ae22e37d-5b5f-4194-a844-e495d27ebda2",
+  "importer": "typescript",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 35 - 0
assets/script/logic/fgui/Common/PopUpForthView.ts

@@ -0,0 +1,35 @@
+import FguiMgr from "../../../frameWork/fgui/FguiMgr";
+import ClickAuEffect from "../../../utils/ClickAuEffect";
+
+export default class PopUpForthView {
+
+    private MaskBg: fairygui.GButton;
+    
+
+    private closeUI: any;
+
+    public constructor(vm: fgui.GComponent) {
+        this.MaskBg = vm.getChild("MaskBg").asButton;
+    }
+
+    public onEnable(): void {
+        this.MaskBg.onClick(this.OnClickCloseBtn, this);
+    }
+
+    public onDisable(): void {
+        this.MaskBg.offClick(this.OnClickCloseBtn, this);
+    }
+    /**
+     * 
+     * @param closeUI 关闭的界面
+     */
+    setData(closeUI: any) {
+        this.closeUI = closeUI;
+    }
+
+    // 关闭
+    @ClickAuEffect()
+    private OnClickCloseBtn() {
+        FguiMgr.Instance.closeUI(this.closeUI, true);
+    }
+}

+ 10 - 0
assets/script/logic/fgui/Common/PopUpForthView.ts.meta

@@ -0,0 +1,10 @@
+{
+  "ver": "1.1.0",
+  "uuid": "da9643e1-38b8-4e80-9499-3f2c80ed5a93",
+  "importer": "typescript",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 95 - 0
assets/script/logic/fgui/Common/PopUpSecondView.ts

@@ -0,0 +1,95 @@
+
+import { gameMethod } from "../../../common/gameMethod";
+import { HelpType } from "../../../data/const/TypeConst";
+import FguiMgr from "../../../frameWork/fgui/FguiMgr";
+import ClickAuEffect from "../../../utils/ClickAuEffect";
+
+
+export default class PopUpSecondView {
+
+    private MaskBg: fairygui.GObject;
+    private BgImg: fairygui.GObject;
+    private TitleImg: fairygui.GObject;
+    private HelpBtn: fairygui.GObject;
+    private CloseBtn: fairygui.GObject;
+    private _call: Function
+    private _confirmCall: Function
+
+    private helpId: HelpType;
+    private closeUI: any;
+    dispose: boolean;
+
+    public constructor(vm: fgui.GComponent) {
+        this.MaskBg = vm.getChild("MaskBg");
+        this.BgImg = vm.getChild("BgImg");
+        this.TitleImg = vm.getChild("TitleImg");
+        this.HelpBtn = vm.getChild("HelpBtn");
+        this.CloseBtn = vm.getChild("CloseBtn");
+    }
+
+    public onEnable(): void {
+        this.HelpBtn.onClick(this.OnClickHelpBtn, this);
+        this.MaskBg.onClick(this.OnClickCloseBtn, this);
+        this.CloseBtn.onClick(this.OnClickCloseBtn, this);
+    }
+
+    public onDisable(): void {
+        this.HelpBtn.offClick(this.OnClickHelpBtn, this);
+        this.MaskBg.offClick(this.OnClickCloseBtn, this);
+        this.CloseBtn.offClick(this.OnClickCloseBtn, this);
+    }
+
+    setCloseCall(cb: Function, target?: any) {
+        this._call = cb.bind(target)
+    }
+
+    setCloseConfirmCall(cb: Function) {
+        this._confirmCall = cb
+    }
+
+    /**
+     * 
+     * @param titleUrl 标题路径
+     * @param closeUI 关闭的界面
+     * @param helpId 帮助id
+     * @param height 界面高度
+     */
+    setData(closeUI: any, helpId?: HelpType, titleUrl?: string, dispose: boolean = true) {
+        // console.log('log', this);
+        // 标题
+        if (titleUrl) {
+            this.TitleImg.asLoader.url = titleUrl;
+        }
+        this.closeUI = closeUI;
+        this.dispose = dispose
+        // 帮助
+        if (helpId) {
+            this.helpId = helpId;
+            this.HelpBtn.visible = true;
+        } else {
+            this.HelpBtn.visible = false;
+        }
+        // 界面高度
+        // this.BgImg.height = height;
+    }
+
+    // 帮助
+    @ClickAuEffect()
+    private OnClickHelpBtn() {
+        if (!gameMethod.isEmpty(this.helpId)) {
+            // FguiMgr.Instance.openUI(HelpViewView, ViewZorder.POP, null, this.helpId);
+        }
+    }
+
+    // 关闭
+    @ClickAuEffect()
+    private OnClickCloseBtn() {
+        if (this._confirmCall) {
+            // 用于点击关闭按钮 不关闭界面 弹出确认窗口
+            if (this._confirmCall) this._confirmCall();
+        } else {
+            if (this._call) this._call()
+            FguiMgr.Instance.closeUI(this.closeUI, this.dispose);
+        }
+    }
+}

+ 10 - 0
assets/script/logic/fgui/Common/PopUpSecondView.ts.meta

@@ -0,0 +1,10 @@
+{
+  "ver": "1.1.0",
+  "uuid": "40b1264f-1a71-44a9-9cdf-970b7acaca8b",
+  "importer": "typescript",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 84 - 0
assets/script/logic/fgui/Common/PopUpThirdView.ts

@@ -0,0 +1,84 @@
+import FguiMgr from "../../../frameWork/fgui/FguiMgr";
+import ClickAuEffect from "../../../utils/ClickAuEffect";
+
+export default class PopUpThirdView {
+
+    private MaskBg: fairygui.GObject;
+    private BgImg: fairygui.GObject;
+    private TitleLabel: fairygui.GObject;
+    private CloseBtn: fairygui.GObject;
+    private _call: Function
+    private _confirmCall: Function
+
+    private closeUI: any;
+    dispose: boolean;
+
+    public constructor(vm: fgui.GComponent) {
+        this.MaskBg = vm.getChild("MaskBg");
+        this.BgImg = vm.getChild("BgImg");
+        this.TitleLabel = vm.getChild("title");
+        this.CloseBtn = vm.getChild("CloseBtn");
+    }
+
+    public onEnable(): void {
+        this.MaskBg.onClick(this.OnClickCloseBtn, this);
+        this.CloseBtn.onClick(this.OnClickCloseBtn, this);
+    }
+
+    public onDisable(): void {
+        this.MaskBg.offClick(this.OnClickCloseBtn, this);
+        this.CloseBtn.offClick(this.OnClickCloseBtn, this);
+    }
+
+    setCloseCall(cb:Function, target?:any){
+        this._call = cb.bind(target)
+    }
+
+    setCloseConfirmCall(cb: Function) {
+        this._confirmCall = cb
+    }
+
+    /**
+     * 
+     * @param titleStr 标题
+     * @param closeUI 关闭的界面
+     * @param height 界面高度
+     */
+    setData(closeUI: any, titleStr?: string, dispose: boolean = true) {
+        // console.log('log', this);
+        // 标题
+        if (titleStr) {
+            this.TitleLabel.text = titleStr;
+        }
+        this.closeUI = closeUI;
+        this.dispose = dispose
+        // 界面高度
+        // this.BgImg.height = height;
+    }
+
+     /**
+     * 设置标题
+     * @param titleStr 标题
+     */
+     setTitle(titleStr: string) {
+        this.TitleLabel.text = titleStr;
+    }
+
+    // 关闭
+    @ClickAuEffect()
+    private OnClickCloseBtn() {
+        if (this._confirmCall) {
+            // 用于点击关闭按钮 不关闭界面 弹出确认窗口
+            if (this._confirmCall) this._confirmCall();
+        } else {
+            if (this._call) this._call()
+            FguiMgr.Instance.closeUI(this.closeUI, this.dispose);
+        }
+
+    }
+
+    /** 显示隐藏关闭按钮 */
+    public ShowCloseBtn(isShow:boolean) {
+        this.CloseBtn.visible = isShow;
+    }
+}

+ 10 - 0
assets/script/logic/fgui/Common/PopUpThirdView.ts.meta

@@ -0,0 +1,10 @@
+{
+  "ver": "1.1.0",
+  "uuid": "c16300a3-1043-4900-b65d-d4bdabd036e4",
+  "importer": "typescript",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 39 - 6
assets/script/logic/fgui/Home/Home/HomeChatCom.ts

@@ -1,26 +1,59 @@
-import Gamecfg from "../../../../common/gameCfg";
-import { gameMethod } from "../../../../common/gameMethod";
+
 import { ChatEvent } from "../../../../data/const/EventConst";
 import { ChatEvent } from "../../../../data/const/EventConst";
+import { ViewZOrder } from "../../../../data/const/ViewZOrder";
 import GameDataCenter from "../../../../data/GameDataCenter";
 import GameDataCenter from "../../../../data/GameDataCenter";
+import FguiMgr from "../../../../frameWork/fgui/FguiMgr";
 import EventMng from "../../../../manager/EventMng";
 import EventMng from "../../../../manager/EventMng";
+import { ChannelType, ChatInfo, ResChatSend } from "../../../../shared/chat/PtlChatSend";
+import { ChatView } from "../../Chat/Chat/ChatView";
 
 
 export default class HomeChatCom {
 export default class HomeChatCom {
     private _vm: fairygui.GComponent;
     private _vm: fairygui.GComponent;
+    ChatLabel: fairygui.GRichTextField;
     public constructor(vm: fgui.GComponent) {
     public constructor(vm: fgui.GComponent) {
         this._vm = vm;
         this._vm = vm;
-        //请求聊天信息
-        // GameDataCenter.user.sendEpsInfo();
+        this.ChatLabel = this._vm.getChild("TxtChat") as fairygui.GRichTextField;
     }
     }
 
 
     public onEnable(): void {
     public onEnable(): void {
+        this._vm.getChild("ChatBtn").onClick(this.onClickOpenChat, this);
+        this._vm.getChild("EmptyBtn").onClick(this.onClickOpenChat, this);
         EventMng.on(ChatEvent.UP_CHAT_INFO, this.onUpChatInfo, this);
         EventMng.on(ChatEvent.UP_CHAT_INFO, this.onUpChatInfo, this);
+        //请求聊天信息
+        GameDataCenter.chat.sendChatHistory(ChannelType.hefu, 0, (res: ResChatSend)=>{
+            // this.showChat(Object.values(res));
+        });
     }
     }
 
 
     onUpChatInfo() {
     onUpChatInfo() {
-        
+        this.showChat(Object.values(GameDataCenter.chat.chatInfo?.[GameDataCenter.chat.curChannel]));
+    }
+
+    showChat(chatlist: ChatInfo[]) {
+		let info = chatlist[chatlist.length - 1];
+		if (info == null) {
+			this.ChatLabel.text = "";
+			return;
+		}
+
+		// if (info.type != ChatType.moren) //如果最新一条消息不是文字消息,找最新一条文字消息显示
+		// {
+		// 	for (let i = chatlist.length - 1; i >= 0; i--) {
+		// 		if (chatlist[i].type == ChatType.moren) {
+		// 			info = chatlist[i];
+		// 			break;
+		// 		}
+		// 	}
+		// }
+		this.ChatLabel.text = `[color=#ffcc33]${info.fuser?.name}:[/color]${info.msg}`;
+	}
+
+    onClickOpenChat() {
+        FguiMgr.Instance.openUI(ChatView, ViewZOrder.Pop);
     }
     }
 
 
     public onDisable(): void {
     public onDisable(): void {
-        
+        this._vm.getChild("ChatBtn").offClick(this.onClickOpenChat, this);
+        this._vm.getChild("EmptyBtn").offClick(this.onClickOpenChat, this);
     }
     }
 }
 }

+ 5 - 0
assets/script/logic/fgui/Home/Home/HomeCtrl.ts

@@ -21,6 +21,7 @@ import UEGridMap from "../../../gridMap/UEGridMap";
 import UEHomeRole from "../../../gridMap/UEHomeRole";
 import UEHomeRole from "../../../gridMap/UEHomeRole";
 import UEMergeTip from "../../../gridMap/UEMergeTip";
 import UEMergeTip from "../../../gridMap/UEMergeTip";
 import { BattleMainView } from "../../Battle/BattleMain/BattleMainView";
 import { BattleMainView } from "../../Battle/BattleMain/BattleMainView";
+import HomeChatCom from "./HomeChatCom";
 import HomeEpsCom from "./HomeEpsCom";
 import HomeEpsCom from "./HomeEpsCom";
 import HomeMergeBottom from "./HomeMergeBottom";
 import HomeMergeBottom from "./HomeMergeBottom";
 import HomeTaskCom from "./HomeTaskCom";
 import HomeTaskCom from "./HomeTaskCom";
@@ -33,6 +34,7 @@ export class HomeCtrl extends FguiViewCtrl<HomeVM> {
     HomeEpsCom: HomeEpsCom;
     HomeEpsCom: HomeEpsCom;
     HomeTaskCom: HomeTaskCom;
     HomeTaskCom: HomeTaskCom;
     HomeMergeBottom: HomeMergeBottom;
     HomeMergeBottom: HomeMergeBottom;
+    HomeChatCom: HomeChatCom;
     onCollectRes(resCollector: ResCollector, param: any): void {
     onCollectRes(resCollector: ResCollector, param: any): void {
         resCollector.AddUEClass([UEGridMap, UEMergeTip, UEHomeRole])
         resCollector.AddUEClass([UEGridMap, UEMergeTip, UEHomeRole])
     }
     }
@@ -43,6 +45,7 @@ export class HomeCtrl extends FguiViewCtrl<HomeVM> {
         this.HeadTopCom = new UIHeadTopView(this.VM.HeadTopCom);
         this.HeadTopCom = new UIHeadTopView(this.VM.HeadTopCom);
         this.HomeEpsCom = new HomeEpsCom(this.VM.EpsCom);
         this.HomeEpsCom = new HomeEpsCom(this.VM.EpsCom);
         this.HomeTaskCom = new HomeTaskCom(this.VM.BtnTask);
         this.HomeTaskCom = new HomeTaskCom(this.VM.BtnTask);
+        this.HomeChatCom = new HomeChatCom(this.VM.ChatCom);
         this.HomeMergeBottom = new HomeMergeBottom(this.VM.HomeMergeBottom);
         this.HomeMergeBottom = new HomeMergeBottom(this.VM.HomeMergeBottom);
         this.ueGridMap.Init();
         this.ueGridMap.Init();
 
 
@@ -52,6 +55,7 @@ export class HomeCtrl extends FguiViewCtrl<HomeVM> {
         this.HeadTopCom.onEnable();
         this.HeadTopCom.onEnable();
         this.HomeEpsCom.onEnable();
         this.HomeEpsCom.onEnable();
         this.HomeTaskCom.onEnable();
         this.HomeTaskCom.onEnable();
+        this.HomeChatCom.onEnable();
         this.HomeMergeBottom.onEnable();
         this.HomeMergeBottom.onEnable();
         let bgResSprite = this.VM.BgRoot.node.getComponent(ResSprite);
         let bgResSprite = this.VM.BgRoot.node.getComponent(ResSprite);
         if (!bgResSprite) {
         if (!bgResSprite) {
@@ -66,6 +70,7 @@ export class HomeCtrl extends FguiViewCtrl<HomeVM> {
         this.HeadTopCom.onDisable();
         this.HeadTopCom.onDisable();
         this.HomeEpsCom.onDisable();
         this.HomeEpsCom.onDisable();
         this.HomeTaskCom.onDisable();
         this.HomeTaskCom.onDisable();
+        this.HomeChatCom.onDisable();
         this.HomeMergeBottom.onDisable();
         this.HomeMergeBottom.onDisable();
     }
     }
     //#region UI事件
     //#region UI事件

+ 29 - 0
assets/script/shared/admin/PtlgameError.ts

@@ -0,0 +1,29 @@
+
+
+/**
+* 请求接口
+*/
+export interface ReqgameError {
+    startTime: number;
+    endTime: number;
+    fuuid: string;
+    url: string;
+    kind: string;
+    id: string;
+    size?: number;
+    page?: number;
+}
+
+/**
+* 返回信息
+*/
+export interface ResgameError {
+    order10Back: any;
+}
+
+export const conf = {
+    connet: "admin"
+}
+
+
+

+ 10 - 0
assets/script/shared/admin/PtlgameError.ts.meta

@@ -0,0 +1,10 @@
+{
+  "ver": "1.1.0",
+  "uuid": "3cae8661-8ffa-4f63-9075-59beee4292ee",
+  "importer": "typescript",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 24 - 0
assets/script/shared/admin/PtlroleDataEdit.ts

@@ -0,0 +1,24 @@
+
+
+/**
+* 请求接口
+*/
+export interface ReqroleDataEdit {
+    key1: string;
+    key2: string;
+    info: any;
+}
+
+/**
+* 返回信息
+*/
+export interface ResroleDataEdit {
+    order10Back: any
+}
+
+export const conf = {
+    connet: "admin"
+}
+
+
+

+ 10 - 0
assets/script/shared/admin/PtlroleDataEdit.ts.meta

@@ -0,0 +1,10 @@
+{
+  "ver": "1.1.0",
+  "uuid": "6bbfdeaa-7635-467a-abbb-f38dcef455ce",
+  "importer": "typescript",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 23 - 0
assets/script/shared/admin/PtlsevData.ts

@@ -0,0 +1,23 @@
+
+
+/**
+* 请求接口
+*/
+export interface ReqsevData {
+    kid: string;
+    sid: string;
+}
+
+/**
+* 返回信息
+*/
+export interface RessevData {
+    order10Back: any;
+}
+
+export const conf = {
+    connet: "admin"
+}
+
+
+

+ 10 - 0
assets/script/shared/admin/PtlsevData.ts.meta

@@ -0,0 +1,10 @@
+{
+  "ver": "1.1.0",
+  "uuid": "ec225fae-afb6-479d-9dc4-dce91420d4f6",
+  "importer": "typescript",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 25 - 0
assets/script/shared/admin/PtlsevDataEdit.ts

@@ -0,0 +1,25 @@
+
+
+/**
+* 请求接口
+*/
+export interface ReqsevDataEdit {
+    key1: string;
+    key2: string;
+    info: string;
+}
+
+/**
+* 返回信息
+*/
+export interface RessevDataEdit {
+    order10Back: any;
+
+}
+
+export const conf = {
+    connet: "admin"
+}
+
+
+

+ 10 - 0
assets/script/shared/admin/PtlsevDataEdit.ts.meta

@@ -0,0 +1,10 @@
+{
+  "ver": "1.1.0",
+  "uuid": "8db784fb-f259-45cb-8f87-947077f0f9aa",
+  "importer": "typescript",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 26 - 0
assets/script/shared/chat/PtlChatHistory.ts

@@ -0,0 +1,26 @@
+import { ChannelType, ChatInfo } from "./PtlChatSend"
+
+
+/**
+* 请求接口
+*/
+export interface ReqChatHistory {
+    channelType:ChannelType //渠道类型(合服hefu|所有服all|世家club|跨服kua)
+    xbid:number //0:获取最新10条   其他历史最后一条 
+}
+
+/**
+* 返回信息
+*/
+export interface ResChatHistory {
+    [channelType:string]:{
+        [id: string]: ChatInfo 
+    }
+}
+
+export const conf = {
+    connet: "ws"
+}
+
+
+

+ 10 - 0
assets/script/shared/chat/PtlChatHistory.ts.meta

@@ -0,0 +1,10 @@
+{
+  "ver": "1.1.0",
+  "uuid": "719c2b1f-57b9-414b-b301-53be6b9eeba0",
+  "importer": "typescript",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 14 - 4
assets/script/shared/chat/PtlChatSend.ts

@@ -4,7 +4,7 @@ import { FUserInfo } from "../base";
 * 请求接口
 * 请求接口
 */
 */
 export interface ReqChatSend {
 export interface ReqChatSend {
-	type:ChatType //渠道类型(合服hefu|所有服all|世家club|跨服kua)
+	channelType:ChannelType //渠道类型(合服hefu|所有服all|世家club|跨服kua)
 	str:string //语句
 	str:string //语句
 }
 }
 
 
@@ -12,22 +12,32 @@ export interface ReqChatSend {
 * 返回信息
 * 返回信息
 */
 */
 export interface ResChatSend {
 export interface ResChatSend {
-    [xbid: string]: ChatInfo 
+    [channelType:string]:{
+        [id: string]: ChatInfo 
+    }
 }
 }
 
 
 export interface ChatInfo {
 export interface ChatInfo {
     id: number; //聊天编号ID
     id: number; //聊天编号ID
-    type: ChatType; //聊天类型
+    chatType: ChatType; //聊天类型
     fuuid: string; //玩家ID
     fuuid: string; //玩家ID
     fuser: FUserInfo; //玩家信息
     fuser: FUserInfo; //玩家信息
+    
     msg: string; //消息体
     msg: string; //消息体
     time: number; //时间
     time: number; //时间
 }
 }
 
 
-export enum ChatType {
+export enum ChannelType {
     hefu = "hefu", //合服聊天
     hefu = "hefu", //合服聊天
 }
 }
 
 
+export enum ChatType {
+    moren = "1", //默认基础聊天
+    moon = "moon", //购买月卡
+    adver = "adver", //购买免广告卡
+    fever = "fever", //购买终身卡
+}
+
 export const conf = {
 export const conf = {
     connet: "ws"
     connet: "ws"
 }
 }

+ 3 - 1
assets/script/shared/chat/server/MsgChatNew_s.ts

@@ -5,6 +5,8 @@ import { ChatInfo } from "../PtlChatSend";
  * msg推送信息
  * msg推送信息
  */
  */
 export interface MsgChatNew_s {
 export interface MsgChatNew_s {
-    [xbid: string]: ChatInfo 
+    [channelType:string]:{
+        [id: string]: ChatInfo 
+    }
 }
 }
 
 

+ 9 - 0
assets/script/shared/common/MsgItemsRwd.ts

@@ -0,0 +1,9 @@
+
+
+/**
+ * 道具获得弹窗
+ */
+export interface MsgItemsRwd {
+    items:number[][]
+}
+

+ 10 - 0
assets/script/shared/common/MsgItemsRwd.ts.meta

@@ -0,0 +1,10 @@
+{
+  "ver": "1.1.0",
+  "uuid": "e5832f70-a564-460d-afa6-b60a92c36641",
+  "importer": "typescript",
+  "isPlugin": false,
+  "loadPluginInWeb": true,
+  "loadPluginInNative": true,
+  "loadPluginInEditor": false,
+  "subMetas": {}
+}

+ 9 - 5
assets/script/shared/hc/PtlHcInfo.ts

@@ -24,14 +24,18 @@ export interface HcInfoList {
 }
 }
 
 
 export interface HcInfoGeziInfo {
 export interface HcInfoGeziInfo {
+    unlock:HcUnlock  //格子解锁状态
     type:HcType   //具体物品类型 0:无物品 1:发射器 2:怪物 3:装备 4:材料
     type:HcType   //具体物品类型 0:无物品 1:发射器 2:怪物 3:装备 4:材料
-    unlock:HcUnlock  //解锁状态
     correlationId:number  //物品ID
     correlationId:number  //物品ID
-    emitter?:{
-        unlock:HcUnlock  //解锁状态
-        
-    }
+    emitter?:HcInfoGeziEmitter //发射器专属
 }
 }
+
+export interface HcInfoGeziEmitter {
+    tili:number  //剩余发射次数
+    lastTime:number  //最后一次回复时间 需要根据配置表的类型做判定
+}
+
+
 //具体物品类型
 //具体物品类型
 export enum HcType {
 export enum HcType {
     wu = 0, //无物品
     wu = 0, //无物品

+ 1 - 1
assets/script/shared/item/PtlItemInfo.ts

@@ -11,7 +11,7 @@ export interface ReqItemInfo {
  * 返回道具信息
  * 返回道具信息
  */
  */
 export interface ResItemInfo {
 export interface ResItemInfo {
-    [itemid:string]:number
+    [i:string]:number[]  // i(唯一编号) : [kind,id,count,时间戳]  时间戳:0:永久 >0:过期时间
 }
 }
 
 
 export const conf = {
 export const conf = {

+ 1 - 1
assets/script/shared/item/server/MsgItemChange_s.ts

@@ -4,6 +4,6 @@
  * 后端推送道具变化信息
  * 后端推送道具变化信息
  */
  */
 export interface MsgItemChange_s {
 export interface MsgItemChange_s {
-    [itemId:string]:number
+    [i:string]:number[]
 }
 }
 
 

+ 385 - 46
assets/script/shared/serviceProto.ts

@@ -7,6 +7,7 @@ import { ReqdeleteCode, ResdeleteCode } from './admin/PtldeleteCode';
 import { ReqdeleteMail, ResdeleteMail } from './admin/PtldeleteMail';
 import { ReqdeleteMail, ResdeleteMail } from './admin/PtldeleteMail';
 import { ReqdeleteQuFu, ResdeleteQuFu } from './admin/PtldeleteQuFu';
 import { ReqdeleteQuFu, ResdeleteQuFu } from './admin/PtldeleteQuFu';
 import { ReqdeleteSetting, ResdeleteSetting } from './admin/PtldeleteSetting';
 import { ReqdeleteSetting, ResdeleteSetting } from './admin/PtldeleteSetting';
+import { ReqgameError, ResgameError } from './admin/PtlgameError';
 import { ReqgetCode, ResgetCode } from './admin/PtlgetCode';
 import { ReqgetCode, ResgetCode } from './admin/PtlgetCode';
 import { ReqgetCodeMa, ResgetCodeMa } from './admin/PtlgetCodeMa';
 import { ReqgetCodeMa, ResgetCodeMa } from './admin/PtlgetCodeMa';
 import { ReqgetMail, ResgetMail } from './admin/PtlgetMail';
 import { ReqgetMail, ResgetMail } from './admin/PtlgetMail';
@@ -19,13 +20,17 @@ import { ReqhuodongDelete, ReshuodongDelete } from './admin/PtlhuodongDelete';
 import { ReqhuodongEdit, ReshuodongEdit } from './admin/PtlhuodongEdit';
 import { ReqhuodongEdit, ReshuodongEdit } from './admin/PtlhuodongEdit';
 import { ReqhuodongFind, ReshuodongFind } from './admin/PtlhuodongFind';
 import { ReqhuodongFind, ReshuodongFind } from './admin/PtlhuodongFind';
 import { ReqroleData, ResroleData } from './admin/PtlroleData';
 import { ReqroleData, ResroleData } from './admin/PtlroleData';
+import { ReqroleDataEdit, ResroleDataEdit } from './admin/PtlroleDataEdit';
+import { ReqsevData, RessevData } from './admin/PtlsevData';
+import { ReqsevDataEdit, RessevDataEdit } from './admin/PtlsevDataEdit';
 import { RequpdateMail, ResupdateMail } from './admin/PtlupdateMail';
 import { RequpdateMail, ResupdateMail } from './admin/PtlupdateMail';
 import { RequpdateQuFu, ResupdateQuFu } from './admin/PtlupdateQuFu';
 import { RequpdateQuFu, ResupdateQuFu } from './admin/PtlupdateQuFu';
 import { RequpdateSetting, ResupdateSetting } from './admin/PtlupdateSetting';
 import { RequpdateSetting, ResupdateSetting } from './admin/PtlupdateSetting';
 import { Reqxiazai, Resxiazai } from './admin/Ptlxiazai';
 import { Reqxiazai, Resxiazai } from './admin/Ptlxiazai';
+import { ReqChatHistory, ResChatHistory } from './chat/PtlChatHistory';
 import { ReqChatSend, ResChatSend } from './chat/PtlChatSend';
 import { ReqChatSend, ResChatSend } from './chat/PtlChatSend';
 import { MsgChatNew_s } from './chat/server/MsgChatNew_s';
 import { MsgChatNew_s } from './chat/server/MsgChatNew_s';
-import { MsgItems } from './common/MsgItems';
+import { MsgItemsRwd } from './common/MsgItemsRwd';
 import { MsgMessage } from './common/MsgMessage';
 import { MsgMessage } from './common/MsgMessage';
 import { ReqEpsInfo, ResEpsInfo } from './eps/PtlEpsInfo';
 import { ReqEpsInfo, ResEpsInfo } from './eps/PtlEpsInfo';
 import { MsgEpsChange_s } from './eps/server/MsgEpsChange_s';
 import { MsgEpsChange_s } from './eps/server/MsgEpsChange_s';
@@ -89,6 +94,10 @@ export interface ServiceType {
             req: ReqdeleteSetting,
             req: ReqdeleteSetting,
             res: ResdeleteSetting
             res: ResdeleteSetting
         },
         },
+        "admin/gameError": {
+            req: ReqgameError,
+            res: ResgameError
+        },
         "admin/getCode": {
         "admin/getCode": {
             req: ReqgetCode,
             req: ReqgetCode,
             res: ResgetCode
             res: ResgetCode
@@ -137,6 +146,18 @@ export interface ServiceType {
             req: ReqroleData,
             req: ReqroleData,
             res: ResroleData
             res: ResroleData
         },
         },
+        "admin/roleDataEdit": {
+            req: ReqroleDataEdit,
+            res: ResroleDataEdit
+        },
+        "admin/sevData": {
+            req: ReqsevData,
+            res: RessevData
+        },
+        "admin/sevDataEdit": {
+            req: ReqsevDataEdit,
+            res: RessevDataEdit
+        },
         "admin/updateMail": {
         "admin/updateMail": {
             req: RequpdateMail,
             req: RequpdateMail,
             res: ResupdateMail
             res: ResupdateMail
@@ -153,6 +174,10 @@ export interface ServiceType {
             req: Reqxiazai,
             req: Reqxiazai,
             res: Resxiazai
             res: Resxiazai
         },
         },
+        "chat/ChatHistory": {
+            req: ReqChatHistory,
+            res: ResChatHistory
+        },
         "chat/ChatSend": {
         "chat/ChatSend": {
             req: ReqChatSend,
             req: ReqChatSend,
             res: ResChatSend
             res: ResChatSend
@@ -244,7 +269,7 @@ export interface ServiceType {
     },
     },
     msg: {
     msg: {
         "chat/server/ChatNew_s": MsgChatNew_s,
         "chat/server/ChatNew_s": MsgChatNew_s,
-        "common/Items": MsgItems,
+        "common/ItemsRwd": MsgItemsRwd,
         "common/Message": MsgMessage,
         "common/Message": MsgMessage,
         "eps/server/EpsChange_s": MsgEpsChange_s,
         "eps/server/EpsChange_s": MsgEpsChange_s,
         "hc/server/HcTili_s": MsgHcTili_s,
         "hc/server/HcTili_s": MsgHcTili_s,
@@ -256,7 +281,7 @@ export interface ServiceType {
 }
 }
 
 
 export const serviceProto: ServiceProto<ServiceType> = {
 export const serviceProto: ServiceProto<ServiceType> = {
-    "version": 65,
+    "version": 71,
     "services": [
     "services": [
         {
         {
             "id": 39,
             "id": 39,
@@ -323,6 +348,14 @@ export const serviceProto: ServiceProto<ServiceType> = {
             }
             }
         },
         },
         {
         {
+            "id": 98,
+            "name": "admin/gameError",
+            "type": "api",
+            "conf": {
+                "connet": "admin"
+            }
+        },
+        {
             "id": 36,
             "id": 36,
             "name": "admin/getCode",
             "name": "admin/getCode",
             "type": "api",
             "type": "api",
@@ -411,7 +444,7 @@ export const serviceProto: ServiceProto<ServiceType> = {
             }
             }
         },
         },
         {
         {
-            "id": 92,
+            "id": 94,
             "name": "admin/roleData",
             "name": "admin/roleData",
             "type": "api",
             "type": "api",
             "conf": {
             "conf": {
@@ -419,6 +452,30 @@ export const serviceProto: ServiceProto<ServiceType> = {
             }
             }
         },
         },
         {
         {
+            "id": 95,
+            "name": "admin/roleDataEdit",
+            "type": "api",
+            "conf": {
+                "connet": "admin"
+            }
+        },
+        {
+            "id": 96,
+            "name": "admin/sevData",
+            "type": "api",
+            "conf": {
+                "connet": "admin"
+            }
+        },
+        {
+            "id": 97,
+            "name": "admin/sevDataEdit",
+            "type": "api",
+            "conf": {
+                "connet": "admin"
+            }
+        },
+        {
             "id": 44,
             "id": 44,
             "name": "admin/updateMail",
             "name": "admin/updateMail",
             "type": "api",
             "type": "api",
@@ -451,6 +508,14 @@ export const serviceProto: ServiceProto<ServiceType> = {
             }
             }
         },
         },
         {
         {
+            "id": 99,
+            "name": "chat/ChatHistory",
+            "type": "api",
+            "conf": {
+                "connet": "ws"
+            }
+        },
+        {
             "id": 88,
             "id": 88,
             "name": "chat/ChatSend",
             "name": "chat/ChatSend",
             "type": "api",
             "type": "api",
@@ -464,8 +529,8 @@ export const serviceProto: ServiceProto<ServiceType> = {
             "type": "msg"
             "type": "msg"
         },
         },
         {
         {
-            "id": 18,
-            "name": "common/Items",
+            "id": 93,
+            "name": "common/ItemsRwd",
             "type": "msg"
             "type": "msg"
         },
         },
         {
         {
@@ -863,6 +928,81 @@ export const serviceProto: ServiceProto<ServiceType> = {
                 }
                 }
             ]
             ]
         },
         },
+        "admin/PtlgameError/ReqgameError": {
+            "type": "Interface",
+            "properties": [
+                {
+                    "id": 0,
+                    "name": "startTime",
+                    "type": {
+                        "type": "Number"
+                    }
+                },
+                {
+                    "id": 1,
+                    "name": "endTime",
+                    "type": {
+                        "type": "Number"
+                    }
+                },
+                {
+                    "id": 2,
+                    "name": "fuuid",
+                    "type": {
+                        "type": "String"
+                    }
+                },
+                {
+                    "id": 3,
+                    "name": "url",
+                    "type": {
+                        "type": "String"
+                    }
+                },
+                {
+                    "id": 4,
+                    "name": "kind",
+                    "type": {
+                        "type": "String"
+                    }
+                },
+                {
+                    "id": 5,
+                    "name": "id",
+                    "type": {
+                        "type": "String"
+                    }
+                },
+                {
+                    "id": 6,
+                    "name": "size",
+                    "type": {
+                        "type": "Number"
+                    },
+                    "optional": true
+                },
+                {
+                    "id": 7,
+                    "name": "page",
+                    "type": {
+                        "type": "Number"
+                    },
+                    "optional": true
+                }
+            ]
+        },
+        "admin/PtlgameError/ResgameError": {
+            "type": "Interface",
+            "properties": [
+                {
+                    "id": 0,
+                    "name": "order10Back",
+                    "type": {
+                        "type": "Any"
+                    }
+                }
+            ]
+        },
         "admin/PtlgetCode/ReqgetCode": {
         "admin/PtlgetCode/ReqgetCode": {
             "type": "Interface"
             "type": "Interface"
         },
         },
@@ -1129,6 +1269,113 @@ export const serviceProto: ServiceProto<ServiceType> = {
                 }
                 }
             ]
             ]
         },
         },
+        "admin/PtlroleDataEdit/ReqroleDataEdit": {
+            "type": "Interface",
+            "properties": [
+                {
+                    "id": 0,
+                    "name": "key1",
+                    "type": {
+                        "type": "String"
+                    }
+                },
+                {
+                    "id": 1,
+                    "name": "key2",
+                    "type": {
+                        "type": "String"
+                    }
+                },
+                {
+                    "id": 2,
+                    "name": "info",
+                    "type": {
+                        "type": "Any"
+                    }
+                }
+            ]
+        },
+        "admin/PtlroleDataEdit/ResroleDataEdit": {
+            "type": "Interface",
+            "properties": [
+                {
+                    "id": 0,
+                    "name": "order10Back",
+                    "type": {
+                        "type": "Any"
+                    }
+                }
+            ]
+        },
+        "admin/PtlsevData/ReqsevData": {
+            "type": "Interface",
+            "properties": [
+                {
+                    "id": 0,
+                    "name": "kid",
+                    "type": {
+                        "type": "String"
+                    }
+                },
+                {
+                    "id": 1,
+                    "name": "sid",
+                    "type": {
+                        "type": "String"
+                    }
+                }
+            ]
+        },
+        "admin/PtlsevData/RessevData": {
+            "type": "Interface",
+            "properties": [
+                {
+                    "id": 0,
+                    "name": "order10Back",
+                    "type": {
+                        "type": "Any"
+                    }
+                }
+            ]
+        },
+        "admin/PtlsevDataEdit/ReqsevDataEdit": {
+            "type": "Interface",
+            "properties": [
+                {
+                    "id": 0,
+                    "name": "key1",
+                    "type": {
+                        "type": "String"
+                    }
+                },
+                {
+                    "id": 1,
+                    "name": "key2",
+                    "type": {
+                        "type": "String"
+                    }
+                },
+                {
+                    "id": 2,
+                    "name": "info",
+                    "type": {
+                        "type": "String"
+                    }
+                }
+            ]
+        },
+        "admin/PtlsevDataEdit/RessevDataEdit": {
+            "type": "Interface",
+            "properties": [
+                {
+                    "id": 0,
+                    "name": "order10Back",
+                    "type": {
+                        "type": "Any"
+                    }
+                }
+            ]
+        },
         "admin/PtlupdateMail/RequpdateMail": {
         "admin/PtlupdateMail/RequpdateMail": {
             "type": "Interface",
             "type": "Interface",
             "properties": [
             "properties": [
@@ -1252,27 +1499,27 @@ export const serviceProto: ServiceProto<ServiceType> = {
                 }
                 }
             ]
             ]
         },
         },
-        "chat/PtlChatSend/ReqChatSend": {
+        "chat/PtlChatHistory/ReqChatHistory": {
             "type": "Interface",
             "type": "Interface",
             "properties": [
             "properties": [
                 {
                 {
-                    "id": 0,
-                    "name": "type",
+                    "id": 2,
+                    "name": "channelType",
                     "type": {
                     "type": {
                         "type": "Reference",
                         "type": "Reference",
-                        "target": "chat/PtlChatSend/ChatType"
+                        "target": "chat/PtlChatSend/ChannelType"
                     }
                     }
                 },
                 },
                 {
                 {
                     "id": 1,
                     "id": 1,
-                    "name": "str",
+                    "name": "xbid",
                     "type": {
                     "type": {
-                        "type": "String"
+                        "type": "Number"
                     }
                     }
                 }
                 }
             ]
             ]
         },
         },
-        "chat/PtlChatSend/ChatType": {
+        "chat/PtlChatSend/ChannelType": {
             "type": "Enum",
             "type": "Enum",
             "members": [
             "members": [
                 {
                 {
@@ -1281,13 +1528,19 @@ export const serviceProto: ServiceProto<ServiceType> = {
                 }
                 }
             ]
             ]
         },
         },
-        "chat/PtlChatSend/ResChatSend": {
+        "chat/PtlChatHistory/ResChatHistory": {
             "type": "Interface",
             "type": "Interface",
             "indexSignature": {
             "indexSignature": {
                 "keyType": "String",
                 "keyType": "String",
                 "type": {
                 "type": {
-                    "type": "Reference",
-                    "target": "chat/PtlChatSend/ChatInfo"
+                    "type": "Interface",
+                    "indexSignature": {
+                        "keyType": "String",
+                        "type": {
+                            "type": "Reference",
+                            "target": "chat/PtlChatSend/ChatInfo"
+                        }
+                    }
                 }
                 }
             }
             }
         },
         },
@@ -1302,8 +1555,8 @@ export const serviceProto: ServiceProto<ServiceType> = {
                     }
                     }
                 },
                 },
                 {
                 {
-                    "id": 1,
-                    "name": "type",
+                    "id": 6,
+                    "name": "chatType",
                     "type": {
                     "type": {
                         "type": "Reference",
                         "type": "Reference",
                         "target": "chat/PtlChatSend/ChatType"
                         "target": "chat/PtlChatSend/ChatType"
@@ -1340,6 +1593,27 @@ export const serviceProto: ServiceProto<ServiceType> = {
                 }
                 }
             ]
             ]
         },
         },
+        "chat/PtlChatSend/ChatType": {
+            "type": "Enum",
+            "members": [
+                {
+                    "id": 1,
+                    "value": "1"
+                },
+                {
+                    "id": 2,
+                    "value": "moon"
+                },
+                {
+                    "id": 3,
+                    "value": "adver"
+                },
+                {
+                    "id": 4,
+                    "value": "fever"
+                }
+            ]
+        },
         "base/FUserInfo": {
         "base/FUserInfo": {
             "type": "Interface",
             "type": "Interface",
             "properties": [
             "properties": [
@@ -1408,17 +1682,59 @@ export const serviceProto: ServiceProto<ServiceType> = {
                 }
                 }
             ]
             ]
         },
         },
+        "chat/PtlChatSend/ReqChatSend": {
+            "type": "Interface",
+            "properties": [
+                {
+                    "id": 2,
+                    "name": "channelType",
+                    "type": {
+                        "type": "Reference",
+                        "target": "chat/PtlChatSend/ChannelType"
+                    }
+                },
+                {
+                    "id": 1,
+                    "name": "str",
+                    "type": {
+                        "type": "String"
+                    }
+                }
+            ]
+        },
+        "chat/PtlChatSend/ResChatSend": {
+            "type": "Interface",
+            "indexSignature": {
+                "keyType": "String",
+                "type": {
+                    "type": "Interface",
+                    "indexSignature": {
+                        "keyType": "String",
+                        "type": {
+                            "type": "Reference",
+                            "target": "chat/PtlChatSend/ChatInfo"
+                        }
+                    }
+                }
+            }
+        },
         "chat/server/MsgChatNew_s/MsgChatNew_s": {
         "chat/server/MsgChatNew_s/MsgChatNew_s": {
             "type": "Interface",
             "type": "Interface",
             "indexSignature": {
             "indexSignature": {
                 "keyType": "String",
                 "keyType": "String",
                 "type": {
                 "type": {
-                    "type": "Reference",
-                    "target": "chat/PtlChatSend/ChatInfo"
+                    "type": "Interface",
+                    "indexSignature": {
+                        "keyType": "String",
+                        "type": {
+                            "type": "Reference",
+                            "target": "chat/PtlChatSend/ChatInfo"
+                        }
+                    }
                 }
                 }
             }
             }
         },
         },
-        "common/MsgItems/MsgItems": {
+        "common/MsgItemsRwd/MsgItemsRwd": {
             "type": "Interface",
             "type": "Interface",
             "properties": [
             "properties": [
                 {
                 {
@@ -1738,19 +2054,19 @@ export const serviceProto: ServiceProto<ServiceType> = {
             "type": "Interface",
             "type": "Interface",
             "properties": [
             "properties": [
                 {
                 {
-                    "id": 0,
-                    "name": "type",
+                    "id": 1,
+                    "name": "unlock",
                     "type": {
                     "type": {
                         "type": "Reference",
                         "type": "Reference",
-                        "target": "hc/PtlHcInfo/HcType"
+                        "target": "hc/PtlHcInfo/HcUnlock"
                     }
                     }
                 },
                 },
                 {
                 {
-                    "id": 1,
-                    "name": "unlock",
+                    "id": 0,
+                    "name": "type",
                     "type": {
                     "type": {
                         "type": "Reference",
                         "type": "Reference",
-                        "target": "hc/PtlHcInfo/HcUnlock"
+                        "target": "hc/PtlHcInfo/HcType"
                     }
                     }
                 },
                 },
                 {
                 {
@@ -1764,22 +2080,26 @@ export const serviceProto: ServiceProto<ServiceType> = {
                     "id": 3,
                     "id": 3,
                     "name": "emitter",
                     "name": "emitter",
                     "type": {
                     "type": {
-                        "type": "Interface",
-                        "properties": [
-                            {
-                                "id": 0,
-                                "name": "unlock",
-                                "type": {
-                                    "type": "Reference",
-                                    "target": "hc/PtlHcInfo/HcUnlock"
-                                }
-                            }
-                        ]
+                        "type": "Reference",
+                        "target": "hc/PtlHcInfo/HcInfoGeziEmitter"
                     },
                     },
                     "optional": true
                     "optional": true
                 }
                 }
             ]
             ]
         },
         },
+        "hc/PtlHcInfo/HcUnlock": {
+            "type": "Enum",
+            "members": [
+                {
+                    "id": 1,
+                    "value": 1
+                },
+                {
+                    "id": 0,
+                    "value": 0
+                }
+            ]
+        },
         "hc/PtlHcInfo/HcType": {
         "hc/PtlHcInfo/HcType": {
             "type": "Enum",
             "type": "Enum",
             "members": [
             "members": [
@@ -1809,16 +2129,29 @@ export const serviceProto: ServiceProto<ServiceType> = {
                 }
                 }
             ]
             ]
         },
         },
-        "hc/PtlHcInfo/HcUnlock": {
-            "type": "Enum",
-            "members": [
+        "hc/PtlHcInfo/HcInfoGeziEmitter": {
+            "type": "Interface",
+            "properties": [
+                {
+                    "id": 0,
+                    "name": "tili",
+                    "type": {
+                        "type": "Number"
+                    }
+                },
                 {
                 {
                     "id": 1,
                     "id": 1,
-                    "value": 1
+                    "name": "lastTime",
+                    "type": {
+                        "type": "Number"
+                    }
                 },
                 },
                 {
                 {
-                    "id": 0,
-                    "value": 0
+                    "id": 2,
+                    "name": "level",
+                    "type": {
+                        "type": "Number"
+                    }
                 }
                 }
             ]
             ]
         },
         },
@@ -2042,7 +2375,10 @@ export const serviceProto: ServiceProto<ServiceType> = {
             "indexSignature": {
             "indexSignature": {
                 "keyType": "String",
                 "keyType": "String",
                 "type": {
                 "type": {
-                    "type": "Number"
+                    "type": "Array",
+                    "elementType": {
+                        "type": "Number"
+                    }
                 }
                 }
             }
             }
         },
         },
@@ -2051,7 +2387,10 @@ export const serviceProto: ServiceProto<ServiceType> = {
             "indexSignature": {
             "indexSignature": {
                 "keyType": "String",
                 "keyType": "String",
                 "type": {
                 "type": {
-                    "type": "Number"
+                    "type": "Array",
+                    "elementType": {
+                        "type": "Number"
+                    }
                 }
                 }
             }
             }
         },
         },

+ 8 - 2
fgui-project/assets/Chat/Chat.xml

@@ -4,8 +4,14 @@
     <component id="n0_ski7" name="Bg" src="b4qrs" fileName="Components/PopUpThirdView.xml" pkg="rd135cfr" xy="375,667" size="750,670">
     <component id="n0_ski7" name="Bg" src="b4qrs" fileName="Components/PopUpThirdView.xml" pkg="rd135cfr" xy="375,667" size="750,670">
       <property target="title" propertyId="0" value="聊天"/>
       <property target="title" propertyId="0" value="聊天"/>
     </component>
     </component>
-    <list id="n1_ski7" name="ChatList" xy="375,407" pivot="0.5,0" anchor="true" size="600,486" overflow="scroll" align="center" vAlign="bottom" autoClearItems="true"/>
-    <text id="n2_ski7" name="TxtInput" xy="67,954" pivot="0,0.5" anchor="true" size="452,50" fontSize="24" color="#383c44" vAlign="middle" autoSize="none" bold="true" text="" input="true" prompt="请输入聊天内容" maxLength="50"/>
+    <list id="n1_ski7" name="ChatList" xy="75,893" pivot="0,1" anchor="true" size="600,486" overflow="scroll" defaultItem="ui://widzpr2cqp5u3t" autoClearItems="true">
+      <item/>
+      <item url="ui://widzpr2cqp5u3u"/>
+      <item/>
+      <item url="ui://widzpr2cqp5u3u"/>
+    </list>
+    <image id="n4_qp5u" name="n4" src="qp5u3r" fileName="Images/Img_zjm_liaotiandi.png" xy="294,954" pivot="0.5,0.5" anchor="true" size="460,40"/>
+    <text id="n2_ski7" name="TxtInput" xy="67,937" size="454,34" fontSize="24" color="#383c44" vAlign="middle" autoSize="height" singleLine="true" text="" input="true" prompt="请输入聊天内容" maxLength="50"/>
     <component id="n3_ski7" name="BtnSend" src="b4qrh" fileName="Components/YellowBtn.xml" pkg="rd135cfr" xy="473,908" scale="0.6,0.6">
     <component id="n3_ski7" name="BtnSend" src="b4qrh" fileName="Components/YellowBtn.xml" pkg="rd135cfr" xy="473,908" scale="0.6,0.6">
       <Button title="发送"/>
       <Button title="发送"/>
     </component>
     </component>

+ 12 - 0
fgui-project/assets/Chat/Components/ChatLeftItem.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<component size="518,141">
+  <displayList>
+    <component id="n1_iwyt" name="Head" src="sp2xobap83" fileName="Components/UserHead.xml" pkg="rd135cfr" xy="-7,-6" pivot="0.5,0.5" aspect="true" scale="0.9,0.9"/>
+    <image id="n6_11ebo" name="n6" src="qp5u3v" fileName="Images/chat_bot.png" xy="134,46" size="374,94" flip="hz">
+      <relation target="n0_iwyt" sidePair="rightext-right,bottomext-bottom"/>
+    </image>
+    <text id="n0_iwyt" name="ChatLabel" xy="164,60" size="311,66" fontSize="24" color="#bdb59e" vAlign="middle" autoClearText="true" text="不要再说了,我现在情绪稳定&#xA;得可怕!"/>
+    <text id="n2_p3vo" name="NameLabel" xy="164,4" pivot="0,0.5" size="146,34" fontSize="24" color="#9f90a9" vAlign="middle" singleLine="true" autoClearText="true" text="卡皮卡皮卡皮"/>
+  </displayList>
+  <relation target="n6_11ebo" sidePair="bottomext-bottom"/>
+</component>

+ 12 - 0
fgui-project/assets/Chat/Components/ChatRightItem.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<component size="518,141">
+  <displayList>
+    <component id="n1_iwyt" name="Head" src="sp2xobap83" fileName="Components/UserHead.xml" pkg="rd135cfr" xy="397,-6" pivot="0.5,0.5" aspect="true" scale="0.9,0.9"/>
+    <image id="n6_11ebo" name="n6" src="qp5u3v" fileName="Images/chat_bot.png" xy="11,46" pivot="1,0" size="374,94">
+      <relation target="n0_iwyt" sidePair="bottomext-bottom,leftext-left"/>
+    </image>
+    <text id="n2_p3vo" name="NameLabel" xy="209,5" pivot="1,0.5" size="146,34" fontSize="24" color="#9f90a9" align="right" vAlign="middle" leading="0" singleLine="true" autoClearText="true" text="路过的都老登"/>
+    <text id="n0_iwyt" name="ChatLabel" xy="49,58" pivot="1,0" size="311,66" fontSize="24" color="#bdb59e" vAlign="middle" autoClearText="true" text="不要再说了,我现在情绪稳定&#xA;得可怕!"/>
+  </displayList>
+  <relation target="n6_11ebo" sidePair="bottomext-bottom"/>
+</component>

BIN
fgui-project/assets/Chat/Images/Img_zjm_liaotiandi.png


BIN
fgui-project/assets/Chat/Images/chat_bot.png


+ 4 - 0
fgui-project/assets/Chat/package.xml

@@ -2,6 +2,10 @@
 <packageDescription id="widzpr2c">
 <packageDescription id="widzpr2c">
   <resources>
   <resources>
     <component id="ski73q" name="Chat.xml" path="/" exported="true"/>
     <component id="ski73q" name="Chat.xml" path="/" exported="true"/>
+    <image id="qp5u3r" name="Img_zjm_liaotiandi.png" path="/Images/" scale="9grid" scale9grid="10,10,20,20"/>
+    <component id="qp5u3t" name="ChatLeftItem.xml" path="/Components/" exported="true"/>
+    <component id="qp5u3u" name="ChatRightItem.xml" path="/Components/" exported="true"/>
+    <image id="qp5u3v" name="chat_bot.png" path="/Images/" scale="9grid" scale9grid="12,12,18,29"/>
   </resources>
   </resources>
   <publish name="" genCode="true"/>
   <publish name="" genCode="true"/>
 </packageDescription>
 </packageDescription>

+ 3 - 2
fgui-project/assets/Home/Components/ChatCom.xml

@@ -2,10 +2,11 @@
 <component size="750,40" designImage="ui://1xjqm8v2rnf9n" designImageOffsetY="-1030">
 <component size="750,40" designImage="ui://1xjqm8v2rnf9n" designImageOffsetY="-1030">
   <displayList>
   <displayList>
     <image id="n0_ul8q" name="n0" src="rnf91e" fileName="Images/home/Img_zjm_liaotiandi.png" xy="375,20" pivot="0.5,0.5" anchor="true" size="750,40"/>
     <image id="n0_ul8q" name="n0" src="rnf91e" fileName="Images/home/Img_zjm_liaotiandi.png" xy="375,20" pivot="0.5,0.5" anchor="true" size="750,40"/>
-    <component id="n1_ul8q" name="EmptyBtn" src="isspc4b" fileName="Components/EmptyBtn.xml" pkg="rd135cfr" xy="52,20" pivot="0.5,0.5" anchor="true" size="40,38">
+    <component id="n1_ul8q" name="ChatBtn" src="isspc4b" fileName="Components/EmptyBtn.xml" pkg="rd135cfr" xy="52,20" pivot="0.5,0.5" anchor="true" size="40,38">
       <Button icon="ui://1xjqm8v2rnf91d" selectedIcon="ui://1xjqm8v2rnf91d"/>
       <Button icon="ui://1xjqm8v2rnf91d" selectedIcon="ui://1xjqm8v2rnf91d"/>
     </component>
     </component>
     <component id="n2_ul8q" name="Red" src="s7zdcdl" fileName="Components/RedDot.xml" pkg="rd135cfr" xy="70,2" pivot="0.5,0.5" anchor="true"/>
     <component id="n2_ul8q" name="Red" src="s7zdcdl" fileName="Components/RedDot.xml" pkg="rd135cfr" xy="70,2" pivot="0.5,0.5" anchor="true"/>
-    <richtext id="n3_ul8q" name="TxtChat" xy="92,20" pivot="0,0.5" anchor="true" size="143,32" fontSize="22" color="#ffffff" vAlign="middle" ubb="true" singleLine="true" text="[color=#ffcc33]昵称:[/color]聊天内容"/>
+    <richtext id="n3_ul8q" name="TxtChat" xy="92,20" pivot="0,0.5" anchor="true" size="143,31" fontSize="22" color="#ffffff" vAlign="middle" ubb="true" singleLine="true" text="[color=#ffcc33]昵称:[/color]聊天内容"/>
+    <component id="n4_qp5u" name="EmptyBtn" src="isspc4b" fileName="Components/EmptyBtn.xml" pkg="rd135cfr" xy="96,20" pivot="0,0.5" anchor="true" size="652,38"/>
   </displayList>
   </displayList>
 </component>
 </component>