Merge branch 'develop' of https://git.pthub.vn/Unity/perfect-world-unity into feature/update-ui

This commit is contained in:
VuNgocHaiC7
2026-04-13 17:09:57 +07:00
124 changed files with 258313 additions and 2540 deletions
@@ -15,7 +15,7 @@ MonoBehaviour:
m_DefaultGroup: 712e3991f28e549e7a56ee582a977810
m_currentHash:
serializedVersion: 2
Hash: 7485ec100318cf3e6317baa9f1a495cc
Hash: 00000000000000000000000000000000
m_OptimizeCatalogSize: 0
m_BuildRemoteCatalog: 0
m_CatalogRequestsTimeout: 0
@@ -9450,13 +9450,6 @@ MonoBehaviour:
- equipment
- models
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 5b277a1f2f5574e50a73d3d5a97e8c0c
m_Address: "models/npcs/\u602A\u7269/2013/\u82B1\u8C79/\u82B1\u8C79.ecm"
m_ReadOnly: 0
m_SerializedLabels:
- models
- npc
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 5b5a5eccdfc0d4ad49dffcdb2e696008
m_Address: "models/weapons/\u4EBA\u7269/\u62F3\u5957/\u77ED\u5203/\u65B017\u54C1\u722A/\u65B017\u54C1\u722A_\u53F31\u6863.ecm"
m_ReadOnly: 0
@@ -17625,6 +17618,13 @@ MonoBehaviour:
- equipment
- models
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: a89ee34d10dfeb44aa744c9f960dbdcc
m_Address: "models/npcs/\u602A\u7269/2013/\u767D\u733F\u957F\u8001/\u767D\u733F\u957F\u8001.ecm"
m_ReadOnly: 0
m_SerializedLabels:
- models
- npc
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: a8aea825fbe6f4e0db75f5e9bcfd7a9f
m_Address: "models/weapons/\u4EBA\u7269/\u65F6\u88C5\u6B66\u5668/\u901A\u7528/2015\u9F99\u5934\u68D2\u53CC\u624B\u77ED/\u5DE6\u624B.ecm"
m_ReadOnly: 0
@@ -23160,13 +23160,6 @@ MonoBehaviour:
- equipment
- models
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: deb3dbe71e7644440ab7d59d9c929d56
m_Address: "models/npcs/\u602A\u7269/\u722C\u866B/\u6BD2\u8702/\u6587\u6587.ecm"
m_ReadOnly: 0
m_SerializedLabels:
- models
- npc
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: debb5c80999fc4ec1880a7900dedb004
m_Address: "models/weapons/\u4EBA\u7269/\u65F6\u88C5\u6B66\u5668/\u901A\u7528/2016\u718A\u732B\u62F3\u5957/\u6389\u843D.ecm"
m_ReadOnly: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ff9300eb3694d3642a9d853d551bd305
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 26c0f433f8d1c8147b08912b4d4e3d56
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,507 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1102 &-7940368841760511339
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u6124\u6012\u65BD\u653E\u8D77"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: d09fbe55744a87d41a15079a29ef4f72, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-7892801132788218278
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u666E\u653B2\u8D77"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 2e4b5d11ca460d04db7824871af26d07, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-6328317098167708187
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u53D7\u4F24"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: d2b913f99cf59864ab73fcbb7ca4b997, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-5011457074097057168
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u666E\u653B2\u843D"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: c69e9481db8d63d47bf3892b453ebe79, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-3472683170181341158
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u6280\u80FD\u65BD\u653E\u843D"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: dd8111fd78af7ad40ad15edcd03e0838, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-2755906967862810922
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u6302\u70B9"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: f1e6c09fe1b2f4743a6fed30629be73b, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-1552743526941003336
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u6B7B\u4EA1"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 1de0f0fad82a1e24980ebdd461511a57, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1107 &-1385044693834464900
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 2798646575986590306}
m_Position: {x: 200, y: 0, z: 0}
- serializedVersion: 1
m_State: {fileID: -6328317098167708187}
m_Position: {x: 235, y: 65, z: 0}
- serializedVersion: 1
m_State: {fileID: 6742634033130207628}
m_Position: {x: 270, y: 130, z: 0}
- serializedVersion: 1
m_State: {fileID: 2828341503876324491}
m_Position: {x: 305, y: 195, z: 0}
- serializedVersion: 1
m_State: {fileID: -7940368841760511339}
m_Position: {x: 340, y: 260, z: 0}
- serializedVersion: 1
m_State: {fileID: 6841952353044144601}
m_Position: {x: 375, y: 325, z: 0}
- serializedVersion: 1
m_State: {fileID: 5974260307876595752}
m_Position: {x: 410, y: 390, z: 0}
- serializedVersion: 1
m_State: {fileID: -3472683170181341158}
m_Position: {x: 445, y: 455, z: 0}
- serializedVersion: 1
m_State: {fileID: 7941248052073167876}
m_Position: {x: 480, y: 520, z: 0}
- serializedVersion: 1
m_State: {fileID: -2755906967862810922}
m_Position: {x: 515, y: 585, z: 0}
- serializedVersion: 1
m_State: {fileID: -92875853942891718}
m_Position: {x: 550, y: 650, z: 0}
- serializedVersion: 1
m_State: {fileID: -763542667587207948}
m_Position: {x: 585, y: 715, z: 0}
- serializedVersion: 1
m_State: {fileID: -5011457074097057168}
m_Position: {x: 620, y: 780, z: 0}
- serializedVersion: 1
m_State: {fileID: -7892801132788218278}
m_Position: {x: 655, y: 845, z: 0}
- serializedVersion: 1
m_State: {fileID: -1552743526941003336}
m_Position: {x: 690, y: 910, z: 0}
- serializedVersion: 1
m_State: {fileID: 8203433932688559491}
m_Position: {x: 725, y: 975, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 2798646575986590306}
--- !u!1102 &-763542667587207948
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u666E\u653B1\u8D77"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 484aa8924c33d5047b6cc6ae56013c45, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-92875853942891718
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u666E\u653B1\u843D"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 707edf95f18e50d4885155eb3b018058, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "tcks_\u767D\u733F\u957F\u8001"
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: -1385044693834464900}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1102 &2798646575986590306
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u4F11\u95F2"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 0957f1befe5a09041b74898883ed49dd, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &2828341503876324491
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u6124\u6012\u65BD\u653E\u843D"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 352863a86b1da2d4880d737044a5fe8d, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &5974260307876595752
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u6212\u5907"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 446127ed905d3b34cb8516096d0fcf50, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &6742634033130207628
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u5FEB\u901F\u79FB\u52A8"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 6b6a24e82e386bd4cac0f5d2d46c11e1, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &6841952353044144601
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u6162\u901F\u79FB\u52A8"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 1166565733a5b6748b23dc247f16772d, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &7941248052073167876
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u6280\u80FD\u65BD\u653E\u8D77"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: e1c0280631f419346be08e3751cdc5c9, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &8203433932688559491
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u7AD9\u7ACB"
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: c17162019ee06d0439a83f896b1bf4b2, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f56502c40826c8e45a8945e170bc7192
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0957f1befe5a09041b74898883ed49dd
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d2b913f99cf59864ab73fcbb7ca4b997
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 6b6a24e82e386bd4cac0f5d2d46c11e1
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 352863a86b1da2d4880d737044a5fe8d
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d09fbe55744a87d41a15079a29ef4f72
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1166565733a5b6748b23dc247f16772d
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 446127ed905d3b34cb8516096d0fcf50
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: dd8111fd78af7ad40ad15edcd03e0838
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e1c0280631f419346be08e3751cdc5c9
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f1e6c09fe1b2f4743a6fed30629be73b
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 707edf95f18e50d4885155eb3b018058
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 484aa8924c33d5047b6cc6ae56013c45
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c69e9481db8d63d47bf3892b453ebe79
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 2e4b5d11ca460d04db7824871af26d07
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1de0f0fad82a1e24980ebdd461511a57
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c17162019ee06d0439a83f896b1bf4b2
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -28,8 +28,8 @@ Transform:
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_LocalScale: {x: 0.13, y: 0.13, z: 0.13}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 9155628035416155594}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -275,7 +275,7 @@ Transform:
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_ConstrainProportionsScale: 1
m_Children:
- {fileID: 7616501457336328776}
- {fileID: 5906686267044891739}
@@ -1,6 +1,6 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &7713099438858920395
--- !u!1 &8818927298683511634
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -8,10 +8,9 @@ GameObject:
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8541071098212086176}
- component: {fileID: 8251708342008786854}
- component: {fileID: 5338557265443283231}
- component: {fileID: 2744124511780171599}
- component: {fileID: 2983467356394752744}
- component: {fileID: 729212007038685270}
- component: {fileID: 7473354552125375242}
m_Layer: 0
m_Name: Box01_0
m_TagString: Untagged
@@ -19,13 +18,13 @@ GameObject:
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8541071098212086176
--- !u!4 &2983467356394752744
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7713099438858920395}
m_GameObject: {fileID: 8818927298683511634}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
@@ -34,21 +33,21 @@ Transform:
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &8251708342008786854
--- !u!33 &729212007038685270
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7713099438858920395}
m_Mesh: {fileID: 4300000, guid: a1247c34d893541a3a5ec98560d36de3, type: 2}
--- !u!137 &5338557265443283231
m_GameObject: {fileID: 8818927298683511634}
m_Mesh: {fileID: 4300000, guid: 14a8d57279f1d0347ac7a11ed56bf9d1, type: 2}
--- !u!137 &7473354552125375242
SkinnedMeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7713099438858920395}
m_GameObject: {fileID: 8818927298683511634}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
@@ -65,7 +64,7 @@ SkinnedMeshRenderer:
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: f218be753e5034be8a25f5fdf6ae0f25, type: 2}
- {fileID: 2100000, guid: 7a16c5d6e020d84488a3e36890bfdcf1, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
@@ -90,7 +89,7 @@ SkinnedMeshRenderer:
m_Quality: 0
m_UpdateWhenOffscreen: 0
m_SkinnedMotionVectors: 1
m_Mesh: {fileID: 4300000, guid: a1247c34d893541a3a5ec98560d36de3, type: 2}
m_Mesh: {fileID: 4300000, guid: 14a8d57279f1d0347ac7a11ed56bf9d1, type: 2}
m_Bones:
- {fileID: 0}
- {fileID: 0}
@@ -100,20 +99,3 @@ SkinnedMeshRenderer:
m_Center: {x: 0, y: 0, z: 0}
m_Extent: {x: 0, y: 0, z: 0}
m_DirtyAABB: 0
--- !u!114 &2744124511780171599
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7713099438858920395}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2189a384460241f89635c90802d6c270, type: 3}
m_Name:
m_EditorClassIdentifier:
_skeletonBuilder: {fileID: 0}
_meshFilter: {fileID: 8251708342008786854}
_skinnedMeshRenderer: {fileID: 5338557265443283231}
BoneNames:
- 000
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 73290134e51c4e2468f3fea2afd9d7c4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 14edd929dbc58d24e97307f3eb4fcfee
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: a89ee34d10dfeb44aa744c9f960dbdcc
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,136 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u767D\u733F\u957F\u8001_0"
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: 2000
stringTagMap:
RenderType: Opaque
disabledShaderPasses:
- MOTIONVECTORS
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 2800000, guid: aa799bd993e3b7145af30716f8d24245, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: aa799bd993e3b7145af30716f8d24245, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 0
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.001
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0.1
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 0
- _WorkflowMode: 1
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1
--- !u!114 &6964018125319239203
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier:
version: 10
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 35991abe98ac2594fbcdf9111798431b
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 35d0f0f60cd3b114490eb376533723a8
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 4300000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,207 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &6702435733042153723
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2815518877128253445}
- component: {fileID: 2507621421060211671}
- component: {fileID: 3713260510743648894}
- component: {fileID: 123736032699877470}
m_Layer: 0
m_Name: "\u767D\u733F\u957F\u8001_0"
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2815518877128253445
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6702435733042153723}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &2507621421060211671
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6702435733042153723}
m_Mesh: {fileID: 4300000, guid: 35d0f0f60cd3b114490eb376533723a8, type: 2}
--- !u!137 &3713260510743648894
SkinnedMeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6702435733042153723}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 3
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 35991abe98ac2594fbcdf9111798431b, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
serializedVersion: 2
m_Quality: 0
m_UpdateWhenOffscreen: 0
m_SkinnedMotionVectors: 1
m_Mesh: {fileID: 4300000, guid: 35d0f0f60cd3b114490eb376533723a8, type: 2}
m_Bones:
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
m_BlendShapeWeights: []
m_RootBone: {fileID: 0}
m_AABB:
m_Center: {x: 0, y: 0, z: 0}
m_Extent: {x: 0, y: 0, z: 0}
m_DirtyAABB: 0
--- !u!114 &123736032699877470
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6702435733042153723}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2189a384460241f89635c90802d6c270, type: 3}
m_Name:
m_EditorClassIdentifier:
_skeletonBuilder: {fileID: 0}
_meshFilter: {fileID: 2507621421060211671}
_skinnedMeshRenderer: {fileID: 3713260510743648894}
BoneNames:
- Bip01 Pelvis
- Bip01 R Thigh
- Bip01 R Calf
- Bip01 Spine1
- Bip01 Neck
- Bip01 R Clavicle
- Bone07
- Bip01 R UpperArm
- Bip01 Spine
- Bip01 Head
- Bip01 R Forearm
- Bip01 R Hand
- Bip01 R Finger01
- Bip01 R Finger1
- Bip01 R Finger11
- Bip01 R Finger0
- Bip01 R Finger02
- Bip01 R Finger2
- Bip01 R Finger21
- Bip01 R Finger22
- Bip01 R Finger12
- Bip01 R Foot
- Bip01 R Toe0
- Bone01
- Bone03
- Bone04
- Bone05
- Bip01 L Thigh
- Bip01 L Calf
- Bip01 L Clavicle
- Bip01 L UpperArm
- Bip01 L Foot
- Bip01 L Toe0
- Bip01 L Forearm
- Bip01 L Hand
- Bip01 L Finger0
- Bip01 L Finger01
- Bip01 L Finger02
- Bip01 L Finger1
- Bip01 L Finger11
- Bip01 L Finger2
- Bip01 L Finger12
- Bip01 L Finger21
- Bip01 L Finger22
- Bip01 Prop1
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 5c0496625c0fe3440b8cc3c90f045de1
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,136 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u767D\u733F\u957F\u8001_1"
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: 2000
stringTagMap:
RenderType: Opaque
disabledShaderPasses:
- MOTIONVECTORS
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 2800000, guid: 5f67ed6893915ab4ab70cca49bda16fb, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: 5f67ed6893915ab4ab70cca49bda16fb, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 0
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.001
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0.1
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 0
- _WorkflowMode: 1
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1
--- !u!114 &430445841483180446
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier:
version: 10
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3d7327b7b5e6e8a4f9209cf21cc82775
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4637ff22e47672a45aa7699f4b74c3c7
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 4300000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,207 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &5393730335013088468
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6657875078929472931}
- component: {fileID: 7480118836749265618}
- component: {fileID: 3350935766882964325}
- component: {fileID: 6929615340777829853}
m_Layer: 0
m_Name: "\u767D\u733F\u957F\u8001_1"
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6657875078929472931
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5393730335013088468}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &7480118836749265618
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5393730335013088468}
m_Mesh: {fileID: 4300000, guid: 4637ff22e47672a45aa7699f4b74c3c7, type: 2}
--- !u!137 &3350935766882964325
SkinnedMeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5393730335013088468}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 3
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 3d7327b7b5e6e8a4f9209cf21cc82775, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
serializedVersion: 2
m_Quality: 0
m_UpdateWhenOffscreen: 0
m_SkinnedMotionVectors: 1
m_Mesh: {fileID: 4300000, guid: 4637ff22e47672a45aa7699f4b74c3c7, type: 2}
m_Bones:
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
- {fileID: 0}
m_BlendShapeWeights: []
m_RootBone: {fileID: 0}
m_AABB:
m_Center: {x: 0, y: 0, z: 0}
m_Extent: {x: 0, y: 0, z: 0}
m_DirtyAABB: 0
--- !u!114 &6929615340777829853
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5393730335013088468}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2189a384460241f89635c90802d6c270, type: 3}
m_Name:
m_EditorClassIdentifier:
_skeletonBuilder: {fileID: 0}
_meshFilter: {fileID: 7480118836749265618}
_skinnedMeshRenderer: {fileID: 3350935766882964325}
BoneNames:
- Bip01 Pelvis
- Bip01 R Thigh
- Bip01 R Calf
- Bip01 Spine1
- Bip01 Neck
- Bip01 R Clavicle
- Bone07
- Bip01 R UpperArm
- Bip01 Spine
- Bip01 Head
- Bip01 R Forearm
- Bip01 R Hand
- Bip01 R Finger01
- Bip01 R Finger1
- Bip01 R Finger11
- Bip01 R Finger0
- Bip01 R Finger02
- Bip01 R Finger2
- Bip01 R Finger21
- Bip01 R Finger22
- Bip01 R Finger12
- Bip01 R Foot
- Bip01 R Toe0
- Bone01
- Bone03
- Bone04
- Bone05
- Bip01 L Thigh
- Bip01 L Calf
- Bip01 L Clavicle
- Bip01 L UpperArm
- Bip01 L Foot
- Bip01 L Toe0
- Bip01 L Forearm
- Bip01 L Hand
- Bip01 L Finger0
- Bip01 L Finger01
- Bip01 L Finger02
- Bip01 L Finger1
- Bip01 L Finger11
- Bip01 L Finger2
- Bip01 L Finger12
- Bip01 L Finger21
- Bip01 L Finger22
- Bip01 Prop1
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 01ea103b953de714f95105f9fd6471f8
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 8a414fa4bf2b667449d449b25e39552f
guid: c451031ead54941afa5d10ce108ed6a1
PrefabImporter:
externalObjects: {}
userData:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d2283884d42d2ad43b8ff11d8b7db57d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1334011b7eaa15e47a431f022d503866
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 448 KiB

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: aa799bd993e3b7145af30716f8d24245
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: 5f67ed6893915ab4ab70cca49bda16fb
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
+2 -2
View File
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b8acb69bc58b3b383d9e8795f8fb9e18be2da3256801fc1a1e5fbee9096e2d40
size 298567
oid sha256:b013fb5e1a03c91240682019bd88c08a2e17ad520bb308d2ecec16cc03643250
size 302199
@@ -47,4 +47,4 @@ MonoBehaviour:
iconName:
icon: {fileID: 0}
prefix: '!#'
maxRawCharactersPerMessage: 80
maxRawCharactersPerMessage: 200
@@ -1,3 +1,4 @@
using System;
using System.Text;
using System.Text.RegularExpressions;
using CSNetwork;
@@ -10,7 +11,19 @@ namespace BrewMonster.Scripts.Chat
/// </summary>
public static class ChatWireTmpCodec
{
private static readonly Regex SpriteTagRegex = new Regex(@"<sprite\s[^>]*>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
/// <summary>
/// Thẻ &lt;sprite …&gt; nội bộ (TMP cho phép &lt;sprite=&quot;asset&quot; …&gt; không có khoảng sau &quot;sprite&quot;).
/// English: Inner &lt;sprite …&gt; tag (TMP allows &lt;sprite=&quot;asset&quot; …&gt; with no space after &quot;sprite&quot;).
/// </summary>
private static readonly Regex InnerSpriteTagRegex = new Regex(@"<sprite[^>]*>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
/// <summary>
/// Một emoji hiển thị trong input = &lt;size&gt; + sprite + &lt;/size&gt; (EmotionTMPTagBuilder).
/// English: One in-game emoji in input = size wrapper + sprite + closing size tag.
/// </summary>
private static readonly Regex EmotionSizedBlockRegex =
new Regex(@"<size=\d+%>\s*<sprite[^>]*>\s*</size>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static readonly Regex OrphanSpriteFragmentRegex = new Regex(@"^\s*sprite\s[^>]*>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
/// <summary>
@@ -44,9 +57,36 @@ namespace BrewMonster.Scripts.Chat
var sb = new StringBuilder(tmpBody.Length);
int last = 0;
foreach (Match m in SpriteTagRegex.Matches(tmpBody))
foreach (Match block in EmotionSizedBlockRegex.Matches(tmpBody))
{
AppendSanitizedPlainText(sb, tmpBody, last, m.Index - last);
AppendTmpSegmentToWire(sb, tmpBody, last, block.Index - last, map);
last = block.Index + block.Length;
Match inner = InnerSpriteTagRegex.Match(block.Value);
if (inner.Success && TryMatchSpriteTagToEmotion(map, inner.Value, out int es, out int ei))
sb.Append(BuildMarshaledEmotionWire(es, ei));
else
sb.Append(block.Value);
}
AppendTmpSegmentToWire(sb, tmpBody, last, tmpBody.Length - last, map);
return sb.ToString();
}
/// <summary>
/// Đoạn TMP (không gồm khối &lt;size&gt;…&lt;/size&gt; đã xử lý ở ngoài): chữ thường + &lt;sprite&gt; rời.
/// English: TMP segment: plain text plus bare sprite tags (outside size-wrapped emotion blocks).
/// </summary>
private static void AppendTmpSegmentToWire(StringBuilder sb, string tmpBody, int start, int length, IEmotionSpriteMap map)
{
if (length <= 0)
return;
string gap = tmpBody.Substring(start, length);
int last = 0;
foreach (Match m in InnerSpriteTagRegex.Matches(gap))
{
AppendSanitizedPlainText(sb, gap, last, m.Index - last);
string tag = m.Value;
if (TryMatchSpriteTagToEmotion(map, tag, out int es, out int ei))
sb.Append(BuildMarshaledEmotionWire(es, ei));
@@ -54,16 +94,12 @@ namespace BrewMonster.Scripts.Chat
sb.Append(tag);
last = m.Index + m.Length;
// Defensive: TMP_InputField can transiently expose an orphan fragment like
// `sprite anim="..."` right after a valid <sprite ...> tag when input updates race.
// Skip it so we do not leak malformed rich-text into wire text.
var orphan = OrphanSpriteFragmentRegex.Match(tmpBody, last);
var orphan = OrphanSpriteFragmentRegex.Match(gap, last);
if (orphan.Success)
last += orphan.Length;
}
AppendSanitizedPlainText(sb, tmpBody, last, tmpBody.Length - last);
return sb.ToString();
AppendSanitizedPlainText(sb, gap, last, gap.Length - last);
}
private static void AppendSanitizedPlainText(StringBuilder sb, string source, int start, int length)
@@ -81,8 +117,44 @@ namespace BrewMonster.Scripts.Chat
}
/// <summary>
/// Khớp tag với EmotionTMPTagBuilder — duyệt (set,index) đủ nhỏ.
/// Match tag to EmotionTMPTagBuilder output — brute-force over (set,index) within reasonable bounds.
/// Nếu charIndex nằm trong một emoji TMP (khối &lt;size&gt;… hoặc thẻ &lt;sprite&gt; rời), trả khoảng xóa [start, end).
/// English: If charIndex is inside one TMP emoji unit, returns delete span [start, end).
/// </summary>
public static bool TryGetSpriteTagRangeContainingCharacterIndex(string text, int charIndex, out int tagStart, out int tagEndExclusive)
{
tagStart = 0;
tagEndExclusive = 0;
if (string.IsNullOrEmpty(text) || charIndex < 0 || charIndex >= text.Length)
return false;
foreach (Match m in EmotionSizedBlockRegex.Matches(text))
{
int end = m.Index + m.Length;
if (charIndex >= m.Index && charIndex < end)
{
tagStart = m.Index;
tagEndExclusive = end;
return true;
}
}
foreach (Match m in InnerSpriteTagRegex.Matches(text))
{
int end = m.Index + m.Length;
if (charIndex >= m.Index && charIndex < end)
{
tagStart = m.Index;
tagEndExclusive = end;
return true;
}
}
return false;
}
/// <summary>
/// Khớp tag &lt;sprite…&gt; với EmotionTMPTagBuilder — so sánh phần sprite bên trong &lt;size&gt;…&lt;/size&gt;.
/// English: Match inner &lt;sprite…&gt; to EmotionTMPTagBuilder output (full tag includes size wrapper).
/// </summary>
public static bool TryMatchSpriteTagToEmotion(IEmotionSpriteMap map, string spriteTag, out int emotionSet, out int emotionIndex)
{
@@ -98,7 +170,11 @@ namespace BrewMonster.Scripts.Chat
{
if (!EmotionTMPTagBuilder.TryBuildEmotionTag(map, s, e, out string built))
continue;
if (built == normalized)
Match builtSprite = InnerSpriteTagRegex.Match(built);
if (!builtSprite.Success)
continue;
if (string.Equals(builtSprite.Value, normalized, StringComparison.OrdinalIgnoreCase))
{
emotionSet = s;
emotionIndex = e;
@@ -22,6 +22,10 @@ namespace BrewMonster.Scripts.Chat.EmotionData
"TMP_SpriteAsset matching this atlas (cell_0000…). Required for animated emoji (multi-frame).")]
public TMP_SpriteAsset TmpSpriteAsset;
[Tooltip("Bản sao tên asset (khớp TmpSpriteAsset.name) — dùng khi build tag chat từ thread mạng; không được đọc TmpSpriteAsset.name ngoài main thread. " +
"Cached asset name (matches TmpSpriteAsset.name) — used when building chat tags from the network thread; never read TmpSpriteAsset.name off the main thread.")]
public string TmpSpriteAssetName = "";
public List<EmotionEntryData> Entries = new List<EmotionEntryData>();
}
@@ -35,6 +39,27 @@ namespace BrewMonster.Scripts.Chat.EmotionData
[Tooltip("Danh sách các bộ theo EmotionSetIndex (0,1,2,…).")]
public List<EmotionSetSnapshot> Sets = new List<EmotionSetSnapshot>();
private void OnValidate()
{
SyncCachedTmpSpriteAssetNamesFromObjects();
}
/// <summary>
/// 把各 set 的 TmpSpriteAsset.name 写入 TmpSpriteAssetName(仅应在主线程调用,例如 Awake / OnValidate)。
/// Writes each set's TmpSpriteAsset.name into TmpSpriteAssetName (call from main thread only, e.g. Awake / OnValidate).
/// </summary>
public void SyncCachedTmpSpriteAssetNamesFromObjects()
{
if (Sets == null)
return;
foreach (EmotionSetSnapshot s in Sets)
{
if (s == null)
continue;
s.TmpSpriteAssetName = s.TmpSpriteAsset != null ? s.TmpSpriteAsset.name : string.Empty;
}
}
public EmotionSetSnapshot GetSetOrNull(int emotionSetIndex)
{
if (Sets == null) return null;
@@ -15,6 +15,7 @@ namespace BrewMonster.Scripts.Chat.EmotionData
/// 1) Tạo EmotionLibrarySO bằng Emotion Atlas Converter.
/// 2) Gán TMP_SpriteAsset cho từng set vào EmotionSetSnapshot.TmpSpriteAsset trong Library
/// (chỉ cần cho emoji động nhiều frame hoặc khi PreferSpriteNameTag = false).
/// OnValidate / SetEmotionSpriteMap đồng bộ TmpSpriteAssetName từ asset — English: sync cached name so network thread never calls GetName().
/// 3) Kéo SO này vào field trên GameObject có CECUIManager (Awake gọi SetEmotionSpriteMap).
/// </summary>
[CreateAssetMenu(fileName = "EmotionLibrarySpriteMap", menuName = "Perfect World/Chat/Emotion Library Sprite Map", order = 2)]
@@ -23,6 +24,20 @@ namespace BrewMonster.Scripts.Chat.EmotionData
[Tooltip("Dữ liệu emotion đã convert. Emotion data converted by the atlas tool.")]
public EmotionLibrarySO Library;
private void OnValidate()
{
EnsureCachedTmpSpriteAssetNames();
}
/// <summary>
/// 主线程:把 Library 里各 TmpSpriteAsset.name 写入快照字段,供 TryGetSprite 在任意线程读取。
/// Main thread: copy TmpSpriteAsset.name into snapshot fields so TryGetSprite can run off the main thread.
/// </summary>
public void EnsureCachedTmpSpriteAssetNames()
{
Library?.SyncCachedTmpSpriteAssetNamesFromObjects();
}
[Tooltip("Nếu true và emoji chỉ 1 frame: dùng <sprite name=\"cell_XXXX\"> thay vì <sprite index=N>. " +
"If true and single-frame: use <sprite name=\"cell_XXXX\"> instead of <sprite index=N>.")]
public bool PreferSpriteNameTag = true;
@@ -53,7 +68,9 @@ namespace BrewMonster.Scripts.Chat.EmotionData
return false;
}
string spriteAssetName = set.TmpSpriteAsset != null ? set.TmpSpriteAsset.name : string.Empty;
// 禁止 TmpSpriteAsset.nameGetName() 仅主线程(网络收包线程会调 TryGetSprite)。
// Never use TmpSpriteAsset.name here — GetName() is main-thread-only (network receive may call TryGetSprite).
string spriteAssetName = set.TmpSpriteAssetName ?? string.Empty;
if (emotionIndex < 0 || emotionIndex >= set.Entries.Count)
{
@@ -135,6 +135,9 @@ namespace BrewMonster.Scripts.ChatUI
EventBus.Unsubscribe<ChatChannelFilterChangedEvent>(OnChannelFilterChanged);
EventBus.Unsubscribe<OpenChatPanelRequestedEvent>(OnOpenChatPanelRequested);
if (scrollRect != null)
scrollRect.onValueChanged.RemoveListener(OnScrollChanged);
if (_pool != null)
{
_pool.Clear();
@@ -309,8 +312,12 @@ namespace BrewMonster.Scripts.ChatUI
ScrollToBottom();
}
/// <summary>Cuộn log chat xuống dòng cuối (sau khi layout xong).</summary>
public void ScrollToBottom()
{
if (scrollRect == null) return;
if (content != null)
LayoutRebuilder.ForceRebuildLayoutImmediate(content);
Canvas.ForceUpdateCanvases();
scrollRect.verticalNormalizedPosition = 0f;
}
@@ -16,6 +16,8 @@ namespace BrewMonster.Scripts.ChatUI
public Button onOpenChatPanelButton;
[Tooltip("Parent cho các dòng tin xem trước (nên có VerticalLayoutGroup).")]
public RectTransform miniChatContent;
[Tooltip("ScrollRect bọc mini chat (null = không cuộn). Nếu để trống, Awake sẽ thử GetComponentInParent từ miniChatContent.")]
[SerializeField] ScrollRect miniChatScrollRect;
[Tooltip("Null = dùng messagePrefab (fallback).")]
public ChatMessageView miniMessagePrefab;
[Tooltip("Prefab dòng tin khi miniMessagePrefab null (giống messagePrefab panel chính).")]
@@ -36,6 +38,9 @@ namespace BrewMonster.Scripts.ChatUI
void Awake()
{
if (miniChatScrollRect == null && miniChatContent != null)
miniChatScrollRect = miniChatContent.GetComponentInParent<ScrollRect>();
_iconCache = new Dictionary<byte, Sprite>();
if (chatSystemSO != null && chatSystemSO.channelIcons != null)
{
@@ -160,7 +165,17 @@ namespace BrewMonster.Scripts.ChatUI
view.Bind(icon, data.message);
}
ScrollMiniChatToBottom();
}
/// <summary>Cuộn mini log xuống dòng cuối (khi có ScrollRect và nội dung cao hơn viewport).</summary>
void ScrollMiniChatToBottom()
{
if (miniChatScrollRect == null) return;
if (miniChatContent != null)
LayoutRebuilder.ForceRebuildLayoutImmediate(miniChatContent);
Canvas.ForceUpdateCanvases();
miniChatScrollRect.verticalNormalizedPosition = 0f;
}
/// <summary>
@@ -1,85 +0,0 @@
using UnityEngine;
using System.Collections.Generic;
using TMPro;
using DG.Tweening; // cần DOTween
public class DamageTextManager : MonoBehaviour
{
public static DamageTextManager Instance { get; private set; }
[Header("Prefab")]
[SerializeField] private TextMeshPro damageTextPrefab;
[Header("Settings")]
[SerializeField] private int poolSize = 20;
[SerializeField] private Vector3 offset = new Vector3(0, 2f, 0);
[SerializeField] private float riseDistance = 1.5f;
[SerializeField] private float riseDuration = 0.8f;
private readonly Queue<TextMeshPro> pool = new();
private void Awake()
{
// Singleton
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
// Tạo sẵn pool
for (int i = 0; i < poolSize; i++)
{
var textObj = Instantiate(damageTextPrefab, transform);
textObj.gameObject.SetActive(false);
pool.Enqueue(textObj);
}
}
/// <summary>
/// Gọi để spawn text damage
/// </summary>
public void ShowDamageText(Vector3 worldPos, int damage, Color color = default, float scale = 1f)
{
var text = GetFromPool();
text.text = damage.ToString();
text.color = color;
text.fontSize = 6;
text.transform.localScale = Vector3.one * scale;
Vector3 startPos = worldPos + offset;
text.transform.position = startPos;
text.gameObject.SetActive(true);
// Hiệu ứng bay lên + mờ dần
text.transform.DOMoveY(startPos.y + riseDistance, riseDuration).SetEase(Ease.OutQuad);
text.DOFade(0f, riseDuration)
.SetEase(Ease.InQuad)
.OnComplete(() =>
{
text.alpha = 1f;
text.gameObject.SetActive(false);
ReturnToPool(text);
});
}
private TextMeshPro GetFromPool()
{
if (pool.Count > 0)
{
return pool.Dequeue();
}
// Nếu hết pool, tạo thêm
var text = Instantiate(damageTextPrefab, transform);
text.gameObject.SetActive(false);
return text;
}
private void ReturnToPool(TextMeshPro text)
{
pool.Enqueue(text);
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: e7981b037b60f4a4989ff59265a308ad
@@ -154,6 +154,7 @@ public partial class CECObject : MonoBehaviour
{
return EC_Utility.ToA3DVECTOR3(useTransform ? _objectTransform.position : objectPosition);
}
public Vector3 GetPosVector3(bool useTransform = true)
{
@@ -0,0 +1,242 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using TMPro;
using DG.Tweening; // cần DOTween
using BrewMonster.Scripts.UI.GamePlay;
public enum ImageResType
{
IMG_POPUPNUM = 0,
IMG_HITMISSED,
IMG_FACTION,
IMG_PATEQUEST,
IMG_LEVELUP,
IMG_GOTEXP,
IMG_GOTMONEY,
IMG_DEADLYSTRIKE,
IMG_GOTSP,
IMG_INVALIDHIT,
IMG_TEAMLEADER,
IMG_BOOTHBAR,
IMG_HPWARN,
IMG_MPWARN,
IMG_RETORT,
IMG_IMMUNE,
IMG_TEAMMATE,
IMG_PKSTATE,
IMG_GMFLAG,
IMG_ATTACKLOSE,
IMG_SUCCESS,
IMG_REBOUND,
IMG_BEAT_BACK,
IMG_ADD,
IMG_DODGE_DEBUFF,
IMG_KING,
NUM_IMAGE,
}
public class FLoatingTextManager : MonoBehaviour
{
public static FLoatingTextManager Instance { get; private set; }
[Header("Prefab")]
[SerializeField] private AUIFloatTextIcon floatTextIconPrefab;
[Header("Settings")]
[SerializeField] private int poolSize = 20;
[SerializeField] private Vector3 offset = new Vector3(0, 2f, 0);
[SerializeField] private float riseDistance = 1.5f;
[SerializeField] private float riseDuration = 0.8f;
/// <summary>
/// Minimum spacing between floating texts for the same source object (seconds).
/// 同一来源物体连续飘字的最小间隔(秒)。
/// </summary>
[SerializeField] private float staggerIntervalSeconds = 0.3f;
private readonly Queue<AUIFloatTextIcon> pool = new();
/// <summary>
/// Per-source next allowed show time (Unity instance ID → Time.time).
/// </summary>
private readonly Dictionary<int, float> _nextFloatingTextTimeBySourceId = new();
[Header("Sprite List")]
[SerializeField] private Dictionary<ImageResType, Sprite> imageDic = new Dictionary<ImageResType, Sprite>();
/// <summary>
/// Keeps Addressables handles alive so sprites in imageDic are not released.
/// 保留 Addressables 句柄,避免已加载的 Sprite 被卸载。
/// </summary>
private readonly List<AsyncOperationHandle<Sprite>> _spriteLoadHandles = new List<AsyncOperationHandle<Sprite>>();
private void Awake()
{
// Singleton
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
// Tạo sẵn pool
for (int i = 0; i < poolSize; i++)
{
var textObj = Instantiate(floatTextIconPrefab, transform);
textObj.gameObject.SetActive(false);
pool.Enqueue(textObj);
}
LoadAllImages();
}
private void OnDestroy()
{
foreach (var h in _spriteLoadHandles)
{
if (h.IsValid())
Addressables.Release(h);
}
_spriteLoadHandles.Clear();
}
/// <summary>
/// Gọi để spawn text damage
/// </summary>
/// <param name="sourceForStagger">If set, multiple calls for this object are spaced by <see cref="staggerIntervalSeconds"/>.</param>
public void ShowText(Vector3 worldPos, int damage, Color color = default, float scale = 1f, ImageResType imageResType = ImageResType.NUM_IMAGE, UnityEngine.Object sourceForStagger = null)
{
float delay = 0f;
UnityEngine.Object staggerSource = sourceForStagger;
if (staggerSource != null)
{
int key = staggerSource.GetInstanceID();
float now = Time.time;
if (!_nextFloatingTextTimeBySourceId.TryGetValue(key, out float nextSlot))
nextSlot = now;
float showAt = Mathf.Max(now, nextSlot);
delay = showAt - now;
_nextFloatingTextTimeBySourceId[key] = showAt + staggerIntervalSeconds;
}
void DoShow()
{
if (staggerSource != null && !staggerSource)
return;
var text = GetFromPool();
var imageShow = imageResType == ImageResType.NUM_IMAGE ? null : imageDic[imageResType];
if (damage > 0)
text.Show(worldPos, damage.ToString(), color, scale, riseDistance, riseDuration, imageShow, () => ReturnToPool(text));
else
text.Show(worldPos, "", color, scale, riseDistance, riseDuration, imageShow, () => ReturnToPool(text));
}
if (delay <= 0f)
DoShow();
else
DOVirtual.DelayedCall(delay, DoShow, false).SetTarget(this);
}
private AUIFloatTextIcon GetFromPool()
{
if (pool.Count > 0)
{
return pool.Dequeue();
}
// Nếu hết pool, tạo thêm
var text = Instantiate(floatTextIconPrefab, transform);
text.gameObject.SetActive(false);
return text;
}
private void ReturnToPool(AUIFloatTextIcon text)
{
pool.Enqueue(text);
}
public bool LoadAllImages()
{
LoadImage(ImageResType.IMG_HITMISSED, "InGame/未命中.tga");
LoadImage(ImageResType.IMG_LEVELUP, "InGame/升级了.tga");
LoadImage(ImageResType.IMG_GOTEXP, "InGame/经验.tga");
LoadImage(ImageResType.IMG_GOTMONEY, "InGame/金钱.tga");
LoadImage(ImageResType.IMG_DEADLYSTRIKE, "InGame/爆击.tga");
LoadImage(ImageResType.IMG_GOTSP, "InGame/元神.tga");
LoadImage(ImageResType.IMG_INVALIDHIT, "InGame/无效.tga");
//LoadImage(ImageResType.IMG_TEAMLEADER, "Window/LeaderMark.tga");
LoadImage(ImageResType.IMG_HPWARN, "InGame/hp_warn.tga");
LoadImage(ImageResType.IMG_MPWARN, "InGame/mp_warn.tga");
LoadImage(ImageResType.IMG_RETORT, "InGame/反震.tga");
LoadImage(ImageResType.IMG_IMMUNE, "InGame/免疫.tga");
//LoadImage(ImageResType.IMG_TEAMMATE, "Window/Teammate.tga");
LoadImage(ImageResType.IMG_PKSTATE, "InGame/PK状态标记.tga");
LoadImage(ImageResType.IMG_GMFLAG, "InGame/GM标志.dds");
LoadImage(ImageResType.IMG_ATTACKLOSE, "InGame/失败.tga");
LoadImage(ImageResType.IMG_SUCCESS, "InGame/成功.tga");
LoadImage(ImageResType.IMG_REBOUND, "InGame/复仇惩戒.tga");
LoadImage(ImageResType.IMG_BEAT_BACK, "InGame/复仇镜像.tga");
LoadImage(ImageResType.IMG_ADD, "InGame/吸血.tga");
LoadImage(ImageResType.IMG_DODGE_DEBUFF, "InGame/状态闪避.tga");
//LoadImage(ImageResType.IMG_KING, "King/皇冠图标.tga");
return false;
}
private void LoadImage(ImageResType type, string path)
{
if (string.IsNullOrEmpty(path))
return;
// Same normalization as skill/gfx paths (PC backslashes → Addressables-style slashes).
// 与技能 gfx 路径一致:反斜杠转为斜杠,便于与 Addressables 地址对齐。
string normalized = path.Replace('\\', '/');
IReadOnlyList<string> candidates = BuildSpriteAddressCandidates(normalized);
foreach (string address in candidates)
{
var handle = Addressables.LoadAssetAsync<Sprite>(address);
handle.WaitForCompletion();
if (handle.Status == AsyncOperationStatus.Succeeded && handle.Result != null)
{
imageDic[type] = handle.Result;
_spriteLoadHandles.Add(handle);
return;
}
if (handle.IsValid())
Addressables.Release(handle);
}
Debug.Log($"[FLoatingTextManager] Sprite load failed for {type}. Addressables keys must match the catalog exactly; " +
$"tried: {string.Join("; ", candidates)}. " +
$"Similar file names are not auto-resolved (unlike fuzzy file search).");
}
/// <summary>
/// Addressables uses exact string addresses. Imported UI art may drop .tga/.dds in the key; try those variants.
/// Addressables 为精确字符串地址;导入后地址可能没有 .tga/.dds 等后缀,依次尝试这些候选。
/// </summary>
private static List<string> BuildSpriteAddressCandidates(string path)
{
var list = new List<string> { path };
void addUnique(string s)
{
if (!string.IsNullOrEmpty(s) && !list.Contains(s))
list.Add(s);
}
string[] sourceExtensions = { ".tga", ".dds", ".bmp", ".png", ".jpg", ".jpeg" };
foreach (string ext in sourceExtensions)
{
if (path.EndsWith(ext, StringComparison.OrdinalIgnoreCase))
{
addUnique(path.Substring(0, path.Length - ext.Length));
break;
}
}
return list;
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 8635fe618431341d796413e99407c5fc
+197 -34
View File
@@ -2044,13 +2044,12 @@ namespace BrewMonster
{
if (nDamage == -2)
{
// this message is caused by a help skill, so don't use a wounded action here
/* if (dwModifier & CECAttackEvent::MOD_IMMUNE)
BubbleText(BUBBLE_IMMUNE, 0);
else if (dwModifier & CECAttackEvent::MOD_NULLITY)
BubbleText(BUBBLE_INVALIDHIT, 0);
else if (dwModifier & CECAttackEvent::MOD_DODGE_DEBUFF)
BubbleText(BUBBLE_DODGE_DEBUFF, 0);*/
if ((dwModifier & (uint)MOD.MOD_IMMUNE) != 0)
BubbleText((int)BubbleTextType.BUBBLE_IMMUNE, 0);
else if ((dwModifier & (uint)MOD.MOD_NULLITY) != 0)
BubbleText((int)BubbleTextType.BUBBLE_INVALIDHIT, 0);
else if ((dwModifier & (uint)MOD.MOD_DODGE_DEBUFF) != 0)
BubbleText((int)BubbleTextType.BUBBLE_DODGE_DEBUFF, 0);
}
else if (nDamage == -1)
{
@@ -2058,14 +2057,14 @@ namespace BrewMonster
// Just play a wounded action
if (!OnDamaged(skill))
{
// PlayAction((int)PLAYER_ACTION_TYPE.ACT_WOUNDED);
PlayAction((int)PLAYER_ACTION_TYPE.ACT_WOUNDED);
}
/*if (dwModifier & CECAttackEvent::MOD_IMMUNE)
BubbleText(BUBBLE_IMMUNE, 0);
else if (dwModifier & CECAttackEvent::MOD_NULLITY)
BubbleText(BUBBLE_INVALIDHIT, 0);
else if (dwModifier & CECAttackEvent::MOD_DODGE_DEBUFF)
BubbleText(BUBBLE_DODGE_DEBUFF, 0);*/
if ((dwModifier & (uint)MOD.MOD_IMMUNE) != 0)
BubbleText((int)BubbleTextType.BUBBLE_IMMUNE, 0);
else if ((dwModifier & (uint)MOD.MOD_NULLITY) != 0)
BubbleText((int)BubbleTextType.BUBBLE_INVALIDHIT, 0);
else if ((dwModifier & (uint)MOD.MOD_DODGE_DEBUFF) != 0)
BubbleText((int)BubbleTextType.BUBBLE_DODGE_DEBUFF, 0);
}
else
{
@@ -2073,34 +2072,178 @@ namespace BrewMonster
if (nDamage > 0)
{
int p1 = 0;
/*if (dwModifier & CECAttackEvent::MOD_CRITICAL_STRIKE)
if ((dwModifier & (int)MOD.MOD_CRITICAL_STRIKE) != 0)
p1 |= 0x0001;
if (dwModifier & CECAttackEvent::MOD_RETORT)
p1 |= 0x0002;*/
if ((dwModifier & (uint)MOD.MOD_RETORT) != 0)
p1 |= 0x0002;
if (!OnDamaged(skill))
// PlayAction((int)PLAYER_ACTION_TYPE.ACT_WOUNDED);
PlayAction((int)PLAYER_ACTION_TYPE.ACT_WOUNDED);
DamageTextManager.Instance.ShowDamageText(
transform.position, nDamage, Color.yellow, 1.0f);
/* if (dwModifier & CECAttackEvent::MOD_IMMUNE)
BubbleText(BUBBLE_IMMUNE, 0);
else if (dwModifier & CECAttackEvent::MOD_REBOUND)
BubbleText(BUBBLE_REBOUND, nDamage);
else if (dwModifier & CECAttackEvent::MOD_BEAT_BACK)
BubbleText(BUBBLE_BEAT_BACK, nDamage);
else
BubbleText(BUBBLE_DAMAGE, nDamage, p1);*/
if ((dwModifier & (uint)MOD.MOD_IMMUNE) != 0)
BubbleText((int)BubbleTextType.BUBBLE_IMMUNE, 0);
else if ((dwModifier & (uint)MOD.MOD_REBOUND) != 0)
BubbleText((int)BubbleTextType.BUBBLE_REBOUND, (uint)nDamage);
else if ((dwModifier & (uint)MOD.MOD_BEAT_BACK) != 0)
BubbleText((int)BubbleTextType.BUBBLE_BEAT_BACK, (uint)nDamage);
else
BubbleText((int)BubbleTextType.BUBBLE_DAMAGE, (uint)nDamage, p1);
}
/* else if (dwModifier & CECAttackEvent::MOD_IMMUNE)
BubbleText(BUBBLE_IMMUNE, 0);
else if (dwModifier & CECAttackEvent::MOD_NULLITY)
BubbleText(BUBBLE_INVALIDHIT, 0);
else if ((dwModifier & (uint)MOD.MOD_IMMUNE) != 0)
BubbleText((int)BubbleTextType.BUBBLE_IMMUNE, 0);
else if ((dwModifier & (uint)MOD.MOD_NULLITY) != 0)
BubbleText((int)BubbleTextType.BUBBLE_INVALIDHIT, 0);
else
BubbleText(BUBBLE_HITMISSED, 0);*/
BubbleText((int)BubbleTextType.BUBBLE_HITMISSED, 0);
}
}
public void BubbleText(int iIndex, uint dwNum, int p1 = 0)
{
bool bHost = IsHostPlayer();
// if (iIndex == BUBBLE_EXP || iIndex == BUBBLE_SP)
// bHost = false;
Color dwCol = new Color(255, 205, 75);
if (bHost)
{
var pGameRun = EC_Game.GetGameRun();
CECHostPlayer pHost = pGameRun?.GetHostPlayer();
if (iIndex == (int)BubbleTextType.BUBBLE_EXP)
{
bool hasBookExp = pHost != null && pHost.IsReincarnationTomeActive;
int msgId = (int)dwNum > 0
? (hasBookExp ? (int)FixedMsg.FIXMSG_GOT_BOOKEXP : (int)FixedMsg.FIXMSG_GOTEXP)
: (int)FixedMsg.FIXMSG_LOSTEXP;
pGameRun?.AddFixedChannelMsg(msgId, (int)ChatChannel.GP_CHAT_FIGHT, (int)dwNum);
}
if (iIndex == (int)BubbleTextType.BUBBLE_SP)
pGameRun?.AddFixedChannelMsg((int)FixedMsg.FIXMSG_GOTSP, (int)ChatChannel.GP_CHAT_FIGHT, (int)dwNum);
if (iIndex == (int)BubbleTextType.BUBBLE_REALMEXP)
pGameRun?.AddFixedChannelMsg((int)FixedMsg.FIXMSG_GOT_REALMEXP, (int)ChatChannel.GP_CHAT_FIGHT, (int)dwNum);
}
// Chariot / mount (C++): raise bubble by mount dummy AABB * 2.3f. IsInChariot() lives on CECHostPlayer; wire via override or protected hook when ready.
// if (IsInChariot())
// {
// var dummy = GetDummyModel((int)PLAYERMODEL_TYPE.PLAYERMODEL_DUMMYTYPE2);
// if (dummy != null)
// vPos = GetPosVector3() + g_vAxisY * (dummy.GetModelAABB().Extents.y * 2.3f);
// else
// vPos = GetPosVector3() + g_vAxisY * (m_aabb.Extents.y * 2.5f);
// }
// else
// vPos = GetPosVector3() + g_vAxisY * (m_aabb.Extents.y * 2.5f);
Vector3 vPos = GetPosVector3() + g_vAxisY * (m_aabb.Extents.y * 2.5f);
ImageResType bubbleTextType = ImageResType.NUM_IMAGE;
switch (iIndex)
{
case (int)BubbleTextType.BUBBLE_DAMAGE:
if (!bHost)
dwCol = new Color(237, 56, 0);
if ((p1 & 0x0001) != 0)
bubbleTextType = ImageResType.IMG_DEADLYSTRIKE;
else if ((p1 & 0x0002) != 0)
bubbleTextType = ImageResType.IMG_RETORT;
break;
case (int)BubbleTextType.BUBBLE_EXP:
bubbleTextType = ImageResType.IMG_GOTEXP;
// pDecal->SetScreenPos(80, 70);
// pDecal->EnableScreenPos(true);
break;
case (int)BubbleTextType.BUBBLE_SP:
bubbleTextType = ImageResType.IMG_GOTSP;
// pDecal->SetScreenPos(80, 90);
// pDecal->EnableScreenPos(true);
break;
case (int)BubbleTextType.BUBBLE_MONEY:
bubbleTextType = ImageResType.IMG_GOTMONEY;
break;
case (int)BubbleTextType.BUBBLE_LEVELUP:
bubbleTextType = ImageResType.IMG_LEVELUP;
break;
case (int)BubbleTextType.BUBBLE_HITMISSED:
if (!bHost)
dwCol = new Color(237, 56, 0);
bubbleTextType = ImageResType.IMG_HITMISSED;
break;
case (int)BubbleTextType.BUBBLE_INVALIDHIT:
if (!bHost)
dwCol = new Color(237, 56, 0);
bubbleTextType = ImageResType.IMG_INVALIDHIT;
break;
case (int)BubbleTextType.BUBBLE_IMMUNE:
if (!bHost)
dwCol = new Color(237, 56, 0);
bubbleTextType = ImageResType.IMG_IMMUNE;
break;
case (int)BubbleTextType.BUBBLE_HPWARN:
dwCol = new Color(255, 255, 255);
bubbleTextType = ImageResType.IMG_HPWARN;
break;
case (int)BubbleTextType.BUBBLE_MPWARN:
dwCol = new Color(255, 255, 255);
bubbleTextType = ImageResType.IMG_MPWARN;
break;
case (int)BubbleTextType.BUBBLE_REBOUND:
bubbleTextType = ImageResType.IMG_REBOUND;
break;
case (int)BubbleTextType.BUBBLE_BEAT_BACK:
bubbleTextType = ImageResType.IMG_BEAT_BACK;
break;
case (int)BubbleTextType.BUBBLE_ADD:
dwCol = new Color(126, 206, 244);
bubbleTextType = ImageResType.IMG_ADD;
break;
case (int)BubbleTextType.BUBBLE_DODGE_DEBUFF:
if (!bHost)
dwCol = new Color(237, 56, 0);
bubbleTextType = ImageResType.IMG_DODGE_DEBUFF;
break;
default:
bubbleTextType = ImageResType.NUM_IMAGE;
break;
}
FLoatingTextManager.Instance.ShowText(vPos, (int)dwNum, dwCol, 1f, bubbleTextType, this);
}
public void StopSkillAttackAction()
{
if (m_pActionController != null)
@@ -3894,6 +4037,26 @@ namespace BrewMonster
WINGTYPE_FLYSWORD, // 飞行器类型:飞剑
WINGTYPE_DOUBLEWHEEL, // 飞行器类型:双脚飞行器
};
// Bubble text
public enum BubbleTextType
{
BUBBLE_DAMAGE = 0,
BUBBLE_EXP,
BUBBLE_SP,
BUBBLE_MONEY,
BUBBLE_LEVELUP,
BUBBLE_HITMISSED,
BUBBLE_INVALIDHIT,
BUBBLE_IMMUNE,
BUBBLE_HPWARN,
BUBBLE_MPWARN,
BUBBLE_REBOUND, //
BUBBLE_BEAT_BACK, //
BUBBLE_ADD, // ѪļӺ
BUBBLE_DODGE_DEBUFF,
BUBBLE_REALMEXP,
BUBBLE_NUM,
};
public struct PVPINFO
{
public bool bEnable; // PVP switch
+97 -36
View File
@@ -8,7 +8,6 @@ using System;
using System.Threading.Tasks;
using BrewMonster.Scripts.Chat;
using UnityEngine;
public class CECNPC : CECObject
{
[SerializeField] protected INFO m_NPCInfo;
@@ -824,58 +823,105 @@ public class CECNPC : CECObject
// so if iDamage is -1 we will shoud the wounded animation
if (iDamage == -1 && !m_bStartFight)
PlayModelAction((int)NPCActionIndex.ACT_WOUNDED);
DamageTextManager.Instance.ShowDamageText(transform.position, iDamage, Color.red, 1.0f);
FLoatingTextManager.Instance.ShowText(transform.position, iDamage, Color.red, 1.0f, ImageResType.NUM_IMAGE, this);
/*if ((dwModifier & (uint)MOD.MOD_IMMUNE) != 0 *//* && !IsImmuneDisable()*//*)
textma
else if (dwModifier & CECAttackEvent::MOD_NULLITY)
BubbleText(BUBBLE_INVALIDHIT, 0);
else if (dwModifier & CECAttackEvent::MOD_ENCHANT_FAILED)
BubbleText(BUBBLE_LOSE, 0);
else if (dwModifier & CECAttackEvent::MOD_SUCCESS)
BubbleText(BUBBLE_SUCCESS, 0);
else if (dwModifier & CECAttackEvent::MOD_DODGE_DEBUFF)
BubbleText(BUBBLE_DODGE_DEBUFF, 0);*/
if ((dwModifier & (uint)MOD.MOD_IMMUNE) != 0 /* && !IsImmuneDisable()*/)
BubbleText((int)MOD.MOD_IMMUNE, 0);
else if ((dwModifier & (uint)MOD.MOD_NULLITY) != 0)
BubbleText((int)MOD.MOD_NULLITY, 0);
else if ((dwModifier & (uint)MOD.MOD_ENCHANT_FAILED) != 0)
BubbleText((int)MOD.MOD_ENCHANT_FAILED, 0);
else if ((dwModifier & (uint)MOD.MOD_SUCCESS) != 0)
BubbleText((int)MOD.MOD_SUCCESS, 0);
else if ((dwModifier & (uint)MOD.MOD_DODGE_DEBUFF) != 0)
BubbleText((int)MOD.MOD_DODGE_DEBUFF, 0);
}
else
{
// this message is related to the host, so we should show a pop up message
// Popup a damage decal
/* bool bDeadlyStrike = (dwModifier & CECAttackEvent::MOD_CRITICAL_STRIKE) ? true : false;
bool bRetort = (dwModifier & CECAttackEvent::MOD_RETORT) ? true : false;*/
bool bDeadlyStrike = (dwModifier & (uint)MOD.MOD_CRITICAL_STRIKE) != 0;
bool bRetort = (dwModifier & (uint)MOD.MOD_RETORT) != 0;
if (iDamage > 0)
{
if (!m_bStartFight)
PlayModelAction((int)NPCActionIndex.ACT_WOUNDED);
DamageTextManager.Instance.ShowDamageText(transform.position, iDamage, Color.red, 1.0f);
/* int p1 = 0;
if (bDeadlyStrike)
p1 |= 0x0001;
else if (bRetort)
p1 |= 0x0002;*/
// Damage number + tint/icons: BubbleText → ShowText only (avoid duplicate red plain text + orange BubbleText).
// 伤害数字与图标只走 BubbleText,避免先红字再橙字飘两次。
int p1 = 0;
if (bDeadlyStrike)
p1 |= 0x0001;
else if (bRetort)
p1 |= 0x0002;
/* if (dwModifier & CECAttackEvent::MOD_REBOUND)
BubbleText(BUBBLE_REBOUND, (DWORD)iDamage);
else if (dwModifier & CECAttackEvent::MOD_BEAT_BACK)
BubbleText(BUBBLE_BEAT_BACK, (DWORD)iDamage);
else
BubbleText(BUBBLE_DAMAGE, (DWORD)iDamage, p1);*/
if ((dwModifier & (uint)MOD.MOD_REBOUND) != 0)
BubbleText((int)BubbleTextType.BUBBLE_REBOUND, iDamage);
else if ((dwModifier & (uint)MOD.MOD_BEAT_BACK) != 0)
BubbleText((int)BubbleTextType.BUBBLE_BEAT_BACK, iDamage);
else
BubbleText((int)BubbleTextType.BUBBLE_DAMAGE, iDamage, p1);
}
/* else if ((dwModifier & CECAttackEvent::MOD_IMMUNE) && !IsImmuneDisable())
BubbleText(BUBBLE_IMMUNE, 0);
else if (dwModifier & CECAttackEvent::MOD_NULLITY)
BubbleText(BUBBLE_INVALIDHIT, 0);
else if (dwModifier & CECAttackEvent::MOD_ENCHANT_FAILED)
BubbleText(BUBBLE_LOSE, 0);
else if (dwModifier & CECAttackEvent::MOD_SUCCESS)
BubbleText(BUBBLE_SUCCESS, 0);
else if ((dwModifier & (uint)MOD.MOD_IMMUNE) != 0 /*&& !IsImmuneDisable()*/)
BubbleText((int)BubbleTextType.BUBBLE_IMMUNE, 0);
else if ((dwModifier & (uint)MOD.MOD_NULLITY) != 0)
BubbleText((int)BubbleTextType.BUBBLE_INVALIDHIT, 0);
else if ((dwModifier & (uint)MOD.MOD_ENCHANT_FAILED) != 0)
BubbleText((int)BubbleTextType.BUBBLE_LOSE, 0);
else if ((dwModifier & (uint)MOD.MOD_SUCCESS) != 0)
BubbleText((int)BubbleTextType.BUBBLE_SUCCESS, 0);
else
BubbleText(BUBBLE_HITMISSED, 0);*/
BubbleText((int)BubbleTextType.BUBBLE_HITMISSED, 0);
}
}
public void BubbleText(int iIndex, int dwNum, int p1 = 0/* 0 */)
{
//FLoatingTextManager.Instance.ShowText(transform.position, dwNum, Color.red, 1.0f, (uint)iIndex);
Color displayColor = new Color(237, 56, 0);
ImageResType imageResType = ImageResType.NUM_IMAGE;
switch (iIndex)
{
case (int)BubbleTextType.BUBBLE_DAMAGE:
if ((p1 & 0x0001) != 0)
imageResType = ImageResType.IMG_DEADLYSTRIKE;
else if ((p1 & 0x0002) != 0)
imageResType = ImageResType.IMG_RETORT;
break;
case (int)BubbleTextType.BUBBLE_HITMISSED:
imageResType = ImageResType.IMG_HITMISSED;
break;
case (int)BubbleTextType.BUBBLE_INVALIDHIT:
imageResType = ImageResType.IMG_INVALIDHIT;
break;
case (int)BubbleTextType.BUBBLE_IMMUNE:
imageResType = ImageResType.IMG_IMMUNE;
break;
case (int)BubbleTextType.BUBBLE_HPWARN:
imageResType = ImageResType.IMG_HPWARN;
break;
case (int)BubbleTextType.BUBBLE_LOSE:
imageResType = ImageResType.IMG_ATTACKLOSE;
break;
case (int)BubbleTextType.BUBBLE_SUCCESS:
imageResType = ImageResType.IMG_SUCCESS;
break;
case (int)BubbleTextType.BUBBLE_REBOUND:
imageResType = ImageResType.IMG_REBOUND;
break;
case (int)BubbleTextType.BUBBLE_BEAT_BACK:
imageResType = ImageResType.IMG_BEAT_BACK;
break;
case (int)BubbleTextType.BUBBLE_DODGE_DEBUFF:
imageResType = ImageResType.IMG_DODGE_DEBUFF;
break;
default:
imageResType = ImageResType.NUM_IMAGE;
break;
}
FLoatingTextManager.Instance.ShowText(transform.position, dwNum, displayColor, 1.0f, imageResType, this);
}
public void WorkFinished(int iWorkID)
{
// Note: below judge can prevent many problems when we attempt to
@@ -1710,6 +1756,19 @@ public class CECNPC : CECObject
CECModel model = GetModel();
return model?.GetHook(hookName, recursive);
}
public enum BubbleTextType
{
BUBBLE_DAMAGE = 0,
BUBBLE_HITMISSED,
BUBBLE_INVALIDHIT,
BUBBLE_IMMUNE,
BUBBLE_HPWARN,
BUBBLE_LOSE,
BUBBLE_SUCCESS,
BUBBLE_REBOUND, //
BUBBLE_BEAT_BACK, //
BUBBLE_DODGE_DEBUFF,
};
}
public struct ClearComActFlagEvent
{
@@ -1777,6 +1836,8 @@ public enum NPCActionIndex
ACT_WOUNDED2,
ACT_MAX,
};
//BUBBLE TEXT TYPE FOR NPC. HOST IS DIFFERENT FROM NPC.
public ref struct ByteReader
{
private ReadOnlySpan<byte> _span;
@@ -3039,5 +3039,11 @@ namespace CSNetwork.GPDataType
{
public int id; // self id or pet id.
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_receive_exp
{
public int exp;
public int sp;
};
}
@@ -17,6 +17,7 @@ using System.Threading.Tasks;
using BrewMonster.PerfectWorld.Scripts.UI;
using BrewMonster.Scripts;
using BrewMonster.Scripts.Chat;
using BrewMonster.Scripts.ChatUI;
using BrewMonster.Scripts.Managers;
using BrewMonster.Scripts.UI;
using BrewMonster.Scripts;
@@ -1290,6 +1291,9 @@ namespace CSNetwork
break;
}
case CommandID.RECEIVE_EXP:
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_RECEIVEEXP, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
break;
case CommandID.LEVEL_UP:
{
cmd_level_up pCmdLevelUp = GPDataTypeHelper.FromBytes<cmd_level_up>(pDataBuf); ;
@@ -1937,42 +1941,51 @@ namespace CSNetwork
// [Port] C++: DlgChat::OnCommand_speak dòng 736:
// Server KHÔNG echo tin nhắn quay lại cho chính người gửi.
// => Phải gọi AddChatMessage ngay tại local để hiển thị lên UI Chat Panel.
string szMsgCopy = szMsg;
byte cChannelCopy = cChannel;
EnqueueChatUI(() => SendChatData_ApplyLocalEchoToChatPanel(cChannelCopy, szMsgCopy));
}
/// <summary>Echo local sau SendProtocol — chỉ chạy trên main thread qua EnqueueChatUI.</summary>
private static void SendChatData_ApplyLocalEchoToChatPanel(byte cChannel, string szMsgBody)
{
CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer();
if (pHost == null)
return;
int nEmotionSet = 0;
// Giữ logic C++ port: SUPERFARCRY → bộ emotion 6; strMsg cắt 8 ký tự trong bản gốc không dùng cho Format (Format vẫn dùng szMsg đầy đủ).
// Keep C++ port: SUPERFARCRY → emotion set 6; original trimmed strMsg was unused for Format (Format still used full szMsg).
if (cChannel is (byte)ChatChannel.GP_CHAT_LOCAL
or (byte)ChatChannel.GP_CHAT_FARCRY
or (byte)ChatChannel.GP_CHAT_SUPERFARCRY
or (byte)ChatChannel.GP_CHAT_BATTLE
or (byte)ChatChannel.GP_CHAT_COUNTRY)
{
CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer();
int nEmotionSet = 0;
// Head Bubble: Chỉ hiện bong bóng đầu cho các kênh "quanh người" (giống C++ SendChatData)
if (cChannel is (byte)ChatChannel.GP_CHAT_LOCAL
or (byte)ChatChannel.GP_CHAT_FARCRY
or (byte)ChatChannel.GP_CHAT_SUPERFARCRY
or (byte)ChatChannel.GP_CHAT_BATTLE
or (byte)ChatChannel.GP_CHAT_COUNTRY)
{
string strMsg = szMsg;
if (cChannel == (byte)ChatChannel.GP_CHAT_SUPERFARCRY)
{
if (strMsg.Length > 8)
strMsg = strMsg.Substring(0, strMsg.Length - 8);
nEmotionSet = SUPER_FAR_CRY_EMOTION_SET;
}
}
// UI Chat Panel: Hiển thị cho TẤT CẢ kênh (Local, Team, Faction, Trade...)
CECStringTab pStrTab = EC_Game.GetFixedMsgs();
string szName = pHost.GetName();
char[] szText = new char[80];
AUICommon.AUI_ConvertChatString(ref szName, ref szText, false);
string fmt = AUIDialog.FormatPrintf(pStrTab.GetWideString((int)FixedMsg.FIXMSG_CHAT));
string str;
try {
str = string.Format(fmt, szName, szMsg);
} catch {
str = $"{szName}: {szMsg}";
}
EC_Game.GetGameRun().AddChatMessage(str, cChannel, pHost.GetCharacterID(),
null, 0, nEmotionSet, null, szMsg);
if (cChannel == (byte)ChatChannel.GP_CHAT_SUPERFARCRY)
nEmotionSet = SUPER_FAR_CRY_EMOTION_SET;
}
string pszMsgOrigion = szMsgBody;
CECStringTab pStrTab = EC_Game.GetFixedMsgs();
string szName = pHost.GetName();
char[] szText = new char[80];
AUICommon.AUI_ConvertChatString(ref szName, ref szText, false);
string fmt = AUIDialog.FormatPrintf(pStrTab.GetWideString((int)FixedMsg.FIXMSG_CHAT));
string str;
try
{
str = string.Format(fmt, szName, szMsgBody);
}
catch
{
str = $"{szName}: {szMsgBody}";
}
EC_Game.GetGameRun().AddChatMessage(str, cChannel, pHost.GetCharacterID(),
null, 0, nEmotionSet, null, pszMsgOrigion);
}
public void SendPrivateChatData(string szDstName, string szMsg, byte byFlag = 0,
@@ -2056,6 +2069,128 @@ namespace CSNetwork
return ui != null ? ui.ConvertWireChatBodyForDisplay(wireBody, cEmotion) : wireBody;
}
/// <summary>
/// Luồng mạng → SynchronizationContext (main) → hàng đợi ChatThreadDispatcher — cùng pipeline với ChatSystemlUI / MiniChatUI.
/// Network thread → SynchronizationContext (main) → ChatThreadDispatcher queue (same pipeline as ChatSystemlUI / MiniChatUI).
/// </summary>
private void EnqueueChatUI(Action action)
{
if (action == null)
return;
SynchronizationContext ctx = Context;
if (ctx == null)
{
_logger.Log(LogType.Error, "[GameSession] EnqueueChatUI: Context is null; chat UI not marshaled.");
return;
}
ctx.Post(_ => ChatThreadDispatcher.Instance.Post(action), null);
}
private void OnPrtcWorldChat_Apply(int roleId, byte channel, int emotion, string strMsg, string strSrcName)
{
CECGameUIMan pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan();
CECStringTab pStrTab = EC_Game.GetFixedMsgs();
Debug.Log($"[Cuong] {strMsg}");
string fmt = AUIDialog.FormatPrintf(pStrTab.GetWideString((int)FixedMsg.FIXMSG_CHAT));
string formatted;
try
{
formatted = string.Format(fmt, strSrcName, strMsg);
}
catch
{
formatted = $"{strSrcName}: {strMsg}";
}
pGameUI.AddChatMessage(formatted, (ChatChannel)channel, roleId, strSrcName,
0, emotion, null, strMsg);
if (!CECGameUIMan.ChannelShowsChatBubbleAboveHead((ChatChannel)channel))
{
CECPlayer pSrcPlayer = EC_Game.GetGameRun().GetWorld().GetPlayerMan().GetPlayer(roleId);
if (pSrcPlayer != null)
{
string bubbleTmp = pGameUI.ConvertWireBodyForHeadBubble(
strMsg, (ChatChannel)channel, roleId, emotion);
EventBus.PublishChannel(roleId, new EventChatMessageOnTopPlayer(roleId, bubbleTmp));
}
}
}
private void OnPrtcChatMessage_ApplyNpcBranch(int srcRoleid, int channel, int emotion, string szMsgBody, string strTempFull)
{
BMLogger.Log("[Cuong] ISNPCID " + strTempFull);
CECStringTab pStrTab = EC_Game.GetFixedMsgs();
CECNPC pNPC = EC_Game.GetGameRun().GetWorld().GetNPCMan().GetNPC(srcRoleid);
if (pNPC == null)
return;
string template = AUIDialog.FormatPrintf(pStrTab.GetWideString((int)FixedMsg.FIXMSG_CHAT2));
string message = string.Format(
template,
pNPC.GetName(),
szMsgBody);
EC_Game.GetGameRun().AddChatMessage(
message,
channel,
srcRoleid,
null,
0,
emotion);
string szMsgOut = szMsgBody;
CECUIHelper.RemoveNameFlagFromNPCChat(strTempFull, out szMsgOut);
pNPC.SetLastSaidWords(szMsgOut);
}
private void OnPrtcPrivateChat_Apply(
int srcRoleid,
byte whisperChannelFlag,
int emotion,
string strMsg,
string strSrcName)
{
CECGameUIMan pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan();
CECStringTab pStrTab = EC_Game.GetFixedMsgs();
if (whisperChannelFlag == 0 || whisperChannelFlag == 1)
{
string fmt = AUIDialog.FormatPrintf(pStrTab.GetWideString((int)FixedMsg.FIXMSG_PRIVATECHAT1));
BMLogger.Log($"[Cuong] OnPrtcPrivateChat {fmt}");
string formatted;
try
{
formatted = string.Format(fmt, strSrcName, strMsg);
}
catch
{
formatted = $"{strSrcName} whispers to you: {strMsg}";
}
pGameUI.AddChatMessage(formatted, ChatChannel.GP_CHAT_WHISPER, srcRoleid, strSrcName,
whisperChannelFlag, emotion, null, strMsg);
}
else
{
pGameUI.AddChatMessage(strMsg, ChatChannel.GP_CHAT_WHISPER, srcRoleid, strSrcName,
whisperChannelFlag, emotion, null, strMsg);
}
CECPlayer pSrcPlayer = EC_Game.GetGameRun().GetWorld().GetPlayerMan().GetPlayer(srcRoleid);
if (pSrcPlayer != null)
{
string bubbleTmp = pGameUI.ConvertWireBodyForHeadBubble(
strMsg, ChatChannel.GP_CHAT_WHISPER, srcRoleid, emotion);
EventBus.PublishChannel(srcRoleid, new EventChatMessageOnTopPlayer(srcRoleid, bubbleTmp));
}
}
private bool OnPrtcWorldChat(Protocol pProtocol, bool bCalledagain)
{
worldchat p = (worldchat)pProtocol;
@@ -2065,36 +2200,13 @@ namespace CSNetwork
if (p.Roleid == m_iCharID)
return true;
CECGameUIMan pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan();
CECStringTab pStrTab = EC_Game.GetFixedMsgs();
int roleId = p.Roleid;
byte channel = p.Channel;
int emotion = p.Emotion;
string strMsg = Encoding.Unicode.GetString(p.Msg.ToArray());
string strSrcName = Encoding.Unicode.GetString(p.Name.ToArray());
Debug.Log($"[Cuong] {strMsg}");
// Wire → TMP 在 AddChatMessage / ChatEmotionDisplayPipeline 内完成 — English: wire → TMP inside AddChatMessage.
string fmt = AUIDialog.FormatPrintf(pStrTab.GetWideString((int)FixedMsg.FIXMSG_CHAT));
string formatted;
try {
formatted = string.Format(fmt, strSrcName, strMsg);
} catch {
formatted = $"{strSrcName}: {strMsg}";
}
pGameUI.AddChatMessage(formatted, (ChatChannel)p.Channel, p.Roleid, strSrcName,
0, p.Emotion, null, strMsg);
// Kênh không thuộc showsAboveHead trong AddChatMessage 时 vẫn cần bong bóng — English: extra bubble for channels AddChatMessage does not publish.
if (!CECGameUIMan.ChannelShowsChatBubbleAboveHead((ChatChannel)p.Channel))
{
CECPlayer pSrcPlayer = EC_Game.GetGameRun().GetWorld().GetPlayerMan().GetPlayer(p.Roleid);
if (pSrcPlayer != null)
{
string bubbleTmp = pGameUI.ConvertWireBodyForHeadBubble(
strMsg, (ChatChannel)p.Channel, p.Roleid, p.Emotion);
EventBus.PublishChannel(p.Roleid, new EventChatMessageOnTopPlayer(p.Roleid, bubbleTmp));
}
}
EnqueueChatUI(() => OnPrtcWorldChat_Apply(roleId, channel, emotion, strMsg, strSrcName));
return true;
}
@@ -2172,10 +2284,17 @@ namespace CSNetwork
}
break;
case 18: case 19: case 20: case 21: case 22: // Auction Message
// pGameUI.AddSysAuctionMessage(...)
Debug.Log("[Cuong] Auction " + strTemp);
EventBus.Publish(new ChatMessageEvent(ConvertWireBodyForChatPanel(strTemp, p.Emotion), p.Channel));
{
string strAuction = strTemp;
byte chAuction = p.Channel;
int emoAuction = p.Emotion;
EnqueueChatUI(() =>
{
Debug.Log("[Cuong] Auction " + strAuction);
EventBus.Publish(new ChatMessageEvent(ConvertWireBodyForChatPanel(strAuction, emoAuction), chAuction));
});
break;
}
case 24: // Task Message
// OnTaskChatMessage(p.Data.RawBuffer, p.Data.Size);
break;
@@ -2198,17 +2317,22 @@ namespace CSNetwork
}
else
{
EventBus.Publish(new ChatMessageEvent(ConvertWireBodyForChatPanel(strTemp, p.Emotion), p.Channel));
string strSys = strTemp;
byte chSys = p.Channel;
int emoSys = p.Emotion;
EnqueueChatUI(() =>
{
EventBus.Publish(new ChatMessageEvent(ConvertWireBodyForChatPanel(strSys, emoSys), chSys));
});
}
}else if (p.Channel == (byte)ChatChannel.GP_CHAT_INSTANCE && p.Srcroleid == 1)
}
else if (p.Channel == (byte)ChatChannel.GP_CHAT_INSTANCE && p.Srcroleid == 1)
{
// Chat_GameSession.AUICTranslate trans;
// EC_Game.GetGameRun().GetUIManager().GetInGameUIMan().AddHeartBeatHint(trans.Translate(szMsg ));
}
else
{
CECStringTab pStrTab = EC_Game.GetFixedMsgs();
if (ISPLAYERID(p.Srcroleid))
{
string szName = EC_Game.GetGameRun().GetPlayerName(p.Srcroleid, false);
@@ -2221,53 +2345,42 @@ namespace CSNetwork
}
return false;
}
else
string szNameCopy = szName;
string szMsgCopy = szMsg;
int srcRole = p.Srcroleid;
int chPl = p.Channel;
int emoPl = p.Emotion;
string strOrigCopy = strMsgOrigion;
EnqueueChatUI(() =>
{
CECStringTab pStrTab = EC_Game.GetFixedMsgs();
char[] szText = new char[80];
AUICommon.AUI_ConvertChatString(ref szName, ref szText, false);
// Same as SendChatData / OnPrtcWorldChat: convert printf → {0}/{1}, then fill name + body.
// Do not pass szText into FormatPrintf — it is a scratch buffer from AUI_ConvertChatString, not a format arg.
string szNameMut = szNameCopy;
AUICommon.AUI_ConvertChatString(ref szNameMut, ref szText, false);
string fmt = AUIDialog.FormatPrintf(pStrTab.GetWideString((int)FixedMsg.FIXMSG_CHAT));
string str = string.Format(fmt, szName, szMsg);
// [Port] Gọi AddChatMessage để hiển thị lên UI Chat Box — wire→TMP 在 AddChatMessage 内(ChatEmotionDisplayPipeline)。
// AddChatMessage bên trong đã tự publish ChatMessageEvent (cho ChatPanelUI)
// VÀ EventChatMessageOnTopPlayer (cho Head Bubble) nếu channel thuộc nhóm
// showsAboveHead (LOCAL, TEAM, FARCRY, SUPERFARCRY, BATTLE, COUNTRY).
// => Không cần publish thêm ở đây nữa.
EC_Game.GetGameRun().AddChatMessage(str, p.Channel, p.Srcroleid,
null, 0, p.Emotion, null, strMsgOrigion);
}
string str;
try
{
str = string.Format(fmt, szNameMut, szMsgCopy);
}
catch
{
str = $"{szNameMut}: {szMsgCopy}";
}
EC_Game.GetGameRun().AddChatMessage(str, chPl, srcRole,
null, 0, emoPl, null, strOrigCopy);
});
}
else if(ISNPCID(p.Srcroleid))
else if (ISNPCID(p.Srcroleid))
{
BMLogger.Log("[Cuong] ISNPCID " + strTemp);
CECNPC pNPC = EC_Game.GetGameRun().GetWorld().GetNPCMan().GetNPC(p.Srcroleid);
if (pNPC != null)
{
string template = AUIDialog.FormatPrintf(pStrTab.GetWideString((int)FixedMsg.FIXMSG_CHAT2));
string message = string.Format(
template,
pNPC.GetName(),
szMsg
);
EC_Game.GetGameRun().AddChatMessage(
message,
p.Channel,
p.Srcroleid,
null,
0,
p.Emotion
);
// Không publish thêm ChatMessageEvent(message): message vẫn là wire trong thân,
// AddChatMessage đã publish bản đã wire→TMP — English: no duplicate; AddChatMessage already publishes converted text.
CECUIHelper.RemoveNameFlagFromNPCChat(strTemp, out szMsg);
pNPC.SetLastSaidWords(szMsg);
}
int srcNpc = p.Srcroleid;
int chNpc = p.Channel;
int emoNpc = p.Emotion;
string szMsgNpc = szMsg;
string strTempNpc = strTemp;
EnqueueChatUI(() => OnPrtcChatMessage_ApplyNpcBranch(srcNpc, chNpc, emoNpc, szMsgNpc, strTempNpc));
}
}
return true;
@@ -2283,40 +2396,10 @@ namespace CSNetwork
string strMsg = Encoding.Unicode.GetString(p.Msg.ToArray());
string strSrcName = Encoding.Unicode.GetString(p.Src_name.ToArray());
CECGameUIMan pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan();
CECStringTab pStrTab = EC_Game.GetFixedMsgs();
// Private chat wire body → TMP 在 AddChatMessage — English: wire → TMP inside AddChatMessage.
if (p.Channel == 0 /* CHANNEL_NORMAL */ || p.Channel == 1 /* CHANNEL_NORMALRE */)
{
// Format: "[Name] whispers to [You]: [Message]"
string fmt = AUIDialog.FormatPrintf(pStrTab.GetWideString((int)FixedMsg.FIXMSG_PRIVATECHAT1));
BMLogger.Log($"[Cuong] OnPrtcPrivateChat {fmt}");
string formatted;
try {
formatted = string.Format(fmt, strSrcName, strMsg);
} catch {
formatted = $"{strSrcName} whispers to you: {strMsg}";
}
pGameUI.AddChatMessage(formatted, ChatChannel.GP_CHAT_WHISPER, p.Srcroleid, strSrcName,
p.Channel, p.Emotion, null, strMsg);
}
else
{
pGameUI.AddChatMessage(strMsg, ChatChannel.GP_CHAT_WHISPER, p.Srcroleid, strSrcName,
p.Channel, p.Emotion, null, strMsg);
}
// 私聊头顶气泡:AddChatMessage 对 GP_CHAT_WHISPER 不发布 EventChatMessageOnTopPlayer,在此单独发 TMP 正文。
// Whisper head bubble: AddChatMessage does not publish EventChatMessageOnTopPlayer for whisper — publish TMP body here.
CECPlayer pSrcPlayer = EC_Game.GetGameRun().GetWorld().GetPlayerMan().GetPlayer(p.Srcroleid);
if (pSrcPlayer != null)
{
string bubbleTmp = pGameUI.ConvertWireBodyForHeadBubble(
strMsg, ChatChannel.GP_CHAT_WHISPER, p.Srcroleid, p.Emotion);
EventBus.PublishChannel(p.Srcroleid, new EventChatMessageOnTopPlayer(p.Srcroleid, bubbleTmp));
}
int srcRole = p.Srcroleid;
byte whisperCh = p.Channel;
int emotion = p.Emotion;
EnqueueChatUI(() => OnPrtcPrivateChat_Apply(srcRole, whisperCh, emotion, strMsg, strSrcName));
}
public struct ChatMessageEvent
@@ -19,6 +19,7 @@ using BrewMonster.UI;
using UnityEngine;
using UnityEngine.SceneManagement;
using BrewMonster.Scripts;
using BrewMonster.Scripts.ChatUI;
namespace BrewMonster.Network
{
@@ -60,6 +61,8 @@ namespace BrewMonster.Network
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
GameSession.Context = SynchronizationContext.Current;
// Khởi tạo ChatThreadDispatcher trên main thread trước khi luồng mạng gọi Instance.Post — English: warm singleton on main thread before network posts.
_ = ChatThreadDispatcher.Instance;
base.Awake();
}
+30 -1
View File
@@ -261,8 +261,37 @@ namespace PerfectWorld.Scripts
if (EC_IvtrItemUtils.Instance != null)
itemName = EC_IvtrItemUtils.Instance.ResolveItemName(tid);
if (string.IsNullOrEmpty(itemName))
// Some name resolvers return the localization key when the translation is missing
// (e.g. "BrewMonster.MINE_ESSENCE"). In that case we prefer showing nothing.
static bool LooksLikeUntranslatedKey(string s)
{
if (string.IsNullOrWhiteSpace(s))
return false;
if (s.IndexOf(' ') >= 0 || s.IndexOf('\t') >= 0 || s.IndexOf('\n') >= 0 || s.IndexOf('\r') >= 0)
return false;
// Heuristic: "Namespace.KEY_NAME" (has '.' and '_' and mostly identifier chars).
if (s.IndexOf('.') < 0 || s.IndexOf('_') < 0)
return false;
for (int i = 0; i < s.Length; i++)
{
char c = s[i];
if (char.IsLetterOrDigit(c) || c == '_' || c == '.')
continue;
return false;
}
return true;
}
if (LooksLikeUntranslatedKey(itemName))
{
itemName = string.Empty;
}
else if (string.IsNullOrEmpty(itemName))
{
itemName = $"Item {tid}";
}
textMesh.text = itemName;
textMesh.fontSize = 2f;
@@ -480,6 +480,7 @@ namespace BrewMonster
}
break;
}
case CommandID.PET_REBUILD_INHERIT_START:
case CommandID.PET_REBUILD_INHERIT_INFO:
case CommandID.PET_REBUILD_INHERIT_END:
@@ -568,6 +569,35 @@ namespace BrewMonster
}
}
}
void OnMsgHstReceiveExp (ECMSG Msg)
{
cmd_receive_exp pCmd = GPDataTypeHelper.FromBytes<cmd_receive_exp>((byte[])Msg.dwParam1);
if (m_ReincarnationTome.tome_active != 0) {
//dunno what it do "?
// m_ReincarnationTome.tome_exp += pCmd.exp;
// CECGameUIMan pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan();
// CDlgReincarnationBook* pDlgBook = dynamic_cast<CDlgReincarnationBook*>(pGameUI->GetDialog("Win_ReincarnationBook"));
// if (pDlgBook && pDlgBook->IsShow()) pDlgBook->Update();
// CDlgReincarnationRewrite* pDlgRewrite = dynamic_cast<CDlgReincarnationRewrite*>(pGameUI->GetDialog("Win_ReincarnationRewrite"));
// if (pDlgRewrite && pDlgRewrite->IsShow()) pDlgRewrite->Update();
}
if (pCmd.exp != 0)
{
// Print notify text
// g_pGame->GetGameRun()->AddFixedMessage(pCmd->exp > 0 ? FIXMSG_GOTEXP : FIXMSG_LOSTEXP, (int)pCmd->exp);
BubbleText((int)BubbleTextType.BUBBLE_EXP, (uint)pCmd.exp);
}
if (pCmd.sp > 0)
{
// Print notify text
// g_pGame->GetGameRun()->AddFixedMessage(FIXMSG_GOTSP, (int)pCmd->sp);
BubbleText((int)BubbleTextType.BUBBLE_SP, (uint)pCmd.sp);
}
}
}
}
+12 -3
View File
@@ -1831,9 +1831,18 @@ namespace BrewMonster.Scripts.Task.UI
public static string FormatTime(int nSec, string desc, int timeLimit)
{
var ts = System.TimeSpan.FromSeconds(System.Math.Max(0, nSec));
string label = string.IsNullOrEmpty(desc) ? string.Empty : desc;
return $"{label}{ts:hh\\:mm\\:ss}\n";
int total = System.Math.Max(0, nSec);
int h = total / 3600;
int m = (total % 3600) / 60;
int s = total % 60;
// Matches table printf "%d:%02d:%02d" (hours, zero-padded min/sec); works for durations over 24h.
string timeStr = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}:{1:D2}:{2:D2}", h, m, s);
if (string.IsNullOrEmpty(desc))
return timeStr;
const string kPrintfTime = "%d:%02d:%02d";
if (desc.IndexOf(kPrintfTime, System.StringComparison.Ordinal) >= 0)
return desc.Replace(kPrintfTime, timeStr);
return desc + timeStr;
}
// private static string GetStringFromTable(int id)
@@ -3260,7 +3260,7 @@ namespace BrewMonster.UI
id_dialog = (int)pService.id_dialog;
idFunction = (int)SERVICE_TYPE.NPC_PROXY;
}
else if (DataType == DATA_TYPE.DT_NPC_STORAGE_SERVICE)
/*else if (DataType == DATA_TYPE.DT_NPC_STORAGE_SERVICE)
{
NPC_STORAGE_SERVICE pService = (NPC_STORAGE_SERVICE)pData;
string strText1 = m_pLst_Main.GetText(nCurSel);
@@ -3273,7 +3273,7 @@ namespace BrewMonster.UI
idFunction = (int)SERVICE_TYPE.NPC_ACCOUNT_STORAGE;
else
idFunction = (int)SERVICE_TYPE.NPC_STORAGE;
}
}*/
else if (DataType == DATA_TYPE.DT_NPC_MAKE_SERVICE)
{
NPC_MAKE_SERVICE pService = (NPC_MAKE_SERVICE)pData;
@@ -25,6 +25,11 @@ namespace BrewMonster.Scripts.UI
public void SetImage(Sprite sprite)
{
if (img == null)
{
return;
}
img.enabled = sprite != null;
img.sprite = sprite;
}
@@ -36,7 +41,11 @@ namespace BrewMonster.Scripts.UI
public void SetColor(Color color)
{
// TODO : Set color to relevant UI components
if (img == null)
{
return;
}
img.color = color;
}
public void SetHint(string text)
@@ -44,9 +53,24 @@ namespace BrewMonster.Scripts.UI
txtHint = text;
}
/// <summary>
/// Reset slot when this cell has no award (e.g. dialog reopened with fewer items).
/// 清空格子:再次打开奖励界面时清除上一轮的图标与点击逻辑。
/// </summary>
public void ClearCover()
{
// TODO : Implement cover clearing functionality
if (img != null)
{
img.sprite = null;
img.enabled = false;
img.color = Color.white;
}
if (btn != null)
{
btn.onClick.RemoveAllListeners();
}
txtHint = string.Empty;
isOn = false;
}
public void Show(bool show)
@@ -59,6 +59,14 @@ namespace BrewMonster.Scripts.UI
{
toggle.isOn = false;
}
if (itemInfoPanel != null)
{
itemInfoPanel.SetActive(false);
}
if (descriptionOutlet != null)
{
descriptionOutlet.Set(string.Empty);
}
_btnClose.onClick.AddListener(OnCloseDlgAward);
}
@@ -214,7 +222,7 @@ namespace BrewMonster.Scripts.UI
// sprintf(out szName, "Item_%02d01", i);
// pImage = (PAUIIMAGEPICTURE)GetDlgItem(szName);
// if (!pImage) break; // All done.
pImage = GetAwardItemAt(i, i);
pImage = GetAwardItemAt(i, 1);
if (!pImage) break;
// sprintf(out szName, "Rdo_Award%d", i);
@@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using TMPro;
using DG.Tweening; // cần DOTween
using BrewMonster.Scripts.UI.GamePlay;
using UnityEngine.UI;
namespace BrewMonster.Scripts.UI.GamePlay
{
public class AUIFloatTextIcon : MonoBehaviour
{
[SerializeField] TMP_Text text;
[SerializeField] SpriteRenderer ingameIcon;
public void Show(Vector3 worldPos, string damage, Color color = default, float scale = 1f, float riseDistance = 1f, float riseDuration = 1f, Sprite sprite = null, Action onComplete = null)
{
if(sprite != null)
{
ingameIcon.sprite = sprite;
ingameIcon.gameObject.SetActive(true);
}
else
{
ingameIcon.gameObject.SetActive(false);
}
text.text = damage;
text.color = color;
text.fontSize = 6;
text.transform.localScale = Vector3.one * scale;
text.transform.position = worldPos;
gameObject.SetActive(true);
// Hiệu ứng bay lên + mờ dần
text.transform.DOMoveY(worldPos.y + riseDistance, riseDuration).SetEase(Ease.OutQuad);
text.DOFade(0f, riseDuration)
.SetEase(Ease.InQuad)
.OnComplete(() =>
{
text.alpha = 1f;
text.gameObject.SetActive(false);
onComplete?.Invoke();
});
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 0515aed5525ee47d4b5249804a555471
@@ -14,6 +14,7 @@ using PerfectWorld.UI.MiniMap;
using UnityEngine;
using BrewMonster.PerfectWorld.Scripts.UI;
using BrewMonster.Scripts.Chat;
using BrewMonster.Scripts.Chat.EmotionData;
namespace BrewMonster.UI
{
@@ -43,6 +44,8 @@ namespace BrewMonster.UI
/// </summary>
public void SetEmotionSpriteMap(IEmotionSpriteMap map)
{
if (map is EmotionLibrarySpriteMap libMap)
libMap.EnsureCachedTmpSpriteAssetNames();
_chatEmotionPipeline.SetSpriteMap(map);
}
@@ -6,7 +6,7 @@ TextureImporter:
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
@@ -37,13 +37,13 @@ TextureImporter:
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
@@ -52,9 +52,9 @@ TextureImporter:
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 0
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
@@ -139,7 +139,7 @@ TextureImporter:
customData:
physicsShape: []
bones: []
spriteID:
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
@@ -6,7 +6,7 @@ TextureImporter:
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
@@ -37,13 +37,13 @@ TextureImporter:
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
@@ -52,9 +52,9 @@ TextureImporter:
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 0
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
@@ -126,7 +126,7 @@ TextureImporter:
customData:
physicsShape: []
bones: []
spriteID:
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
@@ -40,10 +40,10 @@ TextureImporter:
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
@@ -54,7 +54,7 @@ TextureImporter:
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
@@ -126,7 +126,7 @@ TextureImporter:
customData:
physicsShape: []
bones: []
spriteID:
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
@@ -6,7 +6,7 @@ TextureImporter:
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
@@ -37,13 +37,13 @@ TextureImporter:
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
@@ -52,9 +52,9 @@ TextureImporter:
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 0
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
@@ -126,7 +126,7 @@ TextureImporter:
customData:
physicsShape: []
bones: []
spriteID:
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
@@ -40,10 +40,10 @@ TextureImporter:
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
@@ -54,7 +54,7 @@ TextureImporter:
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
@@ -126,7 +126,7 @@ TextureImporter:
customData:
physicsShape: []
bones: []
spriteID:
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
@@ -40,10 +40,10 @@ TextureImporter:
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
@@ -54,7 +54,7 @@ TextureImporter:
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
@@ -126,7 +126,7 @@ TextureImporter:
customData:
physicsShape: []
bones: []
spriteID:
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
@@ -6,7 +6,7 @@ TextureImporter:
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
@@ -37,13 +37,13 @@ TextureImporter:
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
@@ -52,9 +52,9 @@ TextureImporter:
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 0
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
@@ -126,7 +126,7 @@ TextureImporter:
customData:
physicsShape: []
bones: []
spriteID:
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
@@ -6,7 +6,7 @@ TextureImporter:
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
@@ -37,13 +37,13 @@ TextureImporter:
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
@@ -52,9 +52,9 @@ TextureImporter:
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 0
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
@@ -126,7 +126,7 @@ TextureImporter:
customData:
physicsShape: []
bones: []
spriteID:
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
@@ -6,7 +6,7 @@ TextureImporter:
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
@@ -37,13 +37,13 @@ TextureImporter:
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
@@ -52,9 +52,9 @@ TextureImporter:
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 0
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
@@ -126,7 +126,7 @@ TextureImporter:
customData:
physicsShape: []
bones: []
spriteID:
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:

Some files were not shown because too many files have changed in this diff Show More