diff --git a/Assets/PerfectWorld/Prefab/UI/DlgExit.prefab b/Assets/PerfectWorld/Prefab/UI/DlgExit.prefab
new file mode 100644
index 0000000000..a2a3f6956e
--- /dev/null
+++ b/Assets/PerfectWorld/Prefab/UI/DlgExit.prefab
@@ -0,0 +1,918 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1590197940424963217
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 6666702292353843246}
+ - component: {fileID: 4026888369354985289}
+ m_Layer: 0
+ m_Name: DlgExit
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &6666702292353843246
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1590197940424963217}
+ 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:
+ - {fileID: 4878816101074468399}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &4026888369354985289
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1590197940424963217}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 8ca9d1418c284fd395248056f086c7d4, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ ConfirmBtn: {fileID: 3576373828330281173}
+ CancelBtn: {fileID: 5816777684468032703}
+--- !u!1 &1725743065086802770
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4878816101074468399}
+ - component: {fileID: 1101450299599105715}
+ - component: {fileID: 5337953600179164026}
+ m_Layer: 0
+ m_Name: Popup
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &4878816101074468399
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1725743065086802770}
+ 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:
+ - {fileID: 7913819123905793175}
+ - {fileID: 7527520206793245717}
+ - {fileID: 4965393937731457567}
+ - {fileID: 4000902174573487903}
+ m_Father: {fileID: 6666702292353843246}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 933.3333, y: 533.3333}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1101450299599105715
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1725743065086802770}
+ m_CullTransparentMesh: 1
+--- !u!114 &5337953600179164026
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1725743065086802770}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: 4744752b0496d42d0b1c52fcb705e044, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!1 &4518958362188575915
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4965393937731457567}
+ - component: {fileID: 1891070853961845177}
+ - component: {fileID: 807580002560918717}
+ - component: {fileID: 3576373828330281173}
+ m_Layer: 0
+ m_Name: Button_Confirm
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &4965393937731457567
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4518958362188575915}
+ 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:
+ - {fileID: 4642911678502374063}
+ m_Father: {fileID: 4878816101074468399}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: -210, y: -150}
+ m_SizeDelta: {x: 313, y: 91}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1891070853961845177
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4518958362188575915}
+ m_CullTransparentMesh: 1
+--- !u!114 &807580002560918717
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4518958362188575915}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: b545f49a479374ffaaec0c8f123b0c5f, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!114 &3576373828330281173
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4518958362188575915}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 807580002560918717}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &4670976812881016521
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7913819123905793175}
+ - component: {fileID: 2369126678925736279}
+ - component: {fileID: 7564280183498118806}
+ m_Layer: 0
+ m_Name: Text (TMP)_Title
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &7913819123905793175
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4670976812881016521}
+ 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: 4878816101074468399}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 1}
+ m_AnchorMax: {x: 0.5, y: 1}
+ m_AnchoredPosition: {x: -3.7721, y: -17.4557}
+ m_SizeDelta: {x: 298.0753, y: 34.9115}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &2369126678925736279
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4670976812881016521}
+ m_CullTransparentMesh: 1
+--- !u!114 &7564280183498118806
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4670976812881016521}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_text: "Th\xF4ng b\xE1o"
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 30
+ m_fontSizeBase: 30
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_HorizontalAlignment: 2
+ m_VerticalAlignment: 512
+ m_textAlignment: 65535
+ m_characterSpacing: 0
+ m_wordSpacing: 0
+ m_lineSpacing: 0
+ m_lineSpacingMax: 0
+ m_paragraphSpacing: 0
+ m_charWidthMaxAdj: 0
+ m_TextWrappingMode: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 0
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 1
+ m_parseCtrlCharacters: 1
+ m_isOrthographic: 1
+ m_isCullingEnabled: 0
+ m_horizontalMapping: 0
+ m_verticalMapping: 0
+ m_uvLineOffset: 0
+ m_geometrySortingOrder: 0
+ m_IsTextObjectScaleStatic: 0
+ m_VertexBufferAutoSizeReduction: 0
+ m_useMaxVisibleDescender: 1
+ m_pageToDisplay: 1
+ m_margin: {x: 0, y: 0, z: 0, w: 0}
+ m_isUsingLegacyAnimationComponent: 0
+ m_isVolumetricText: 0
+ m_hasFontAssetChanged: 0
+ m_baseMaterial: {fileID: 0}
+ m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &5918190347695128963
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4642911678502374063}
+ - component: {fileID: 4834289956051303799}
+ - component: {fileID: 3482299799452283765}
+ m_Layer: 0
+ m_Name: Text (TMP)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &4642911678502374063
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5918190347695128963}
+ 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: 4965393937731457567}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4834289956051303799
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5918190347695128963}
+ m_CullTransparentMesh: 1
+--- !u!114 &3482299799452283765
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5918190347695128963}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_text: "X\xE1c nh\u1EADn"
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 50
+ m_fontSizeBase: 50
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_HorizontalAlignment: 2
+ m_VerticalAlignment: 512
+ m_textAlignment: 65535
+ m_characterSpacing: 0
+ m_wordSpacing: 0
+ m_lineSpacing: 0
+ m_lineSpacingMax: 0
+ m_paragraphSpacing: 0
+ m_charWidthMaxAdj: 0
+ m_TextWrappingMode: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 0
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 1
+ m_parseCtrlCharacters: 1
+ m_isOrthographic: 1
+ m_isCullingEnabled: 0
+ m_horizontalMapping: 0
+ m_verticalMapping: 0
+ m_uvLineOffset: 0
+ m_geometrySortingOrder: 0
+ m_IsTextObjectScaleStatic: 0
+ m_VertexBufferAutoSizeReduction: 0
+ m_useMaxVisibleDescender: 1
+ m_pageToDisplay: 1
+ m_margin: {x: 0, y: 0, z: 0, w: 0}
+ m_isUsingLegacyAnimationComponent: 0
+ m_isVolumetricText: 0
+ m_hasFontAssetChanged: 0
+ m_baseMaterial: {fileID: 0}
+ m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &5923497699521027687
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4000902174573487903}
+ - component: {fileID: 7348237821025748982}
+ - component: {fileID: 356920440688922164}
+ - component: {fileID: 5816777684468032703}
+ m_Layer: 0
+ m_Name: Button_Cancel
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &4000902174573487903
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5923497699521027687}
+ 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:
+ - {fileID: 1979839230795202451}
+ m_Father: {fileID: 4878816101074468399}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 210, y: -150}
+ m_SizeDelta: {x: 313, y: 91}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7348237821025748982
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5923497699521027687}
+ m_CullTransparentMesh: 1
+--- !u!114 &356920440688922164
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5923497699521027687}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: b545f49a479374ffaaec0c8f123b0c5f, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!114 &5816777684468032703
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5923497699521027687}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 356920440688922164}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &6076086137757476783
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7527520206793245717}
+ - component: {fileID: 717316905677608887}
+ - component: {fileID: 2182669632864579474}
+ m_Layer: 0
+ m_Name: Text (TMP)_Content
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &7527520206793245717
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6076086137757476783}
+ 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: 4878816101074468399}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 1}
+ m_AnchorMax: {x: 0.5, y: 1}
+ m_AnchoredPosition: {x: -2, y: -201.94122}
+ m_SizeDelta: {x: 862.825, y: 279.6172}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &717316905677608887
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6076086137757476783}
+ m_CullTransparentMesh: 1
+--- !u!114 &2182669632864579474
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6076086137757476783}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_text: "R\u1EDDi kh\u1ECFi ho\xE0n m\u1EF9 ?"
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 93.94
+ m_fontSizeBase: 93.94
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_HorizontalAlignment: 2
+ m_VerticalAlignment: 512
+ m_textAlignment: 65535
+ m_characterSpacing: 0
+ m_wordSpacing: 0
+ m_lineSpacing: 0
+ m_lineSpacingMax: 0
+ m_paragraphSpacing: 0
+ m_charWidthMaxAdj: 0
+ m_TextWrappingMode: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 0
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 1
+ m_parseCtrlCharacters: 1
+ m_isOrthographic: 1
+ m_isCullingEnabled: 0
+ m_horizontalMapping: 0
+ m_verticalMapping: 0
+ m_uvLineOffset: 0
+ m_geometrySortingOrder: 0
+ m_IsTextObjectScaleStatic: 0
+ m_VertexBufferAutoSizeReduction: 0
+ m_useMaxVisibleDescender: 1
+ m_pageToDisplay: 1
+ m_margin: {x: 0, y: 0, z: 0, w: 0}
+ m_isUsingLegacyAnimationComponent: 0
+ m_isVolumetricText: 0
+ m_hasFontAssetChanged: 0
+ m_baseMaterial: {fileID: 0}
+ m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &8385824745593160430
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1979839230795202451}
+ - component: {fileID: 926584410341277518}
+ - component: {fileID: 7589457457506445651}
+ m_Layer: 0
+ m_Name: Text (TMP)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1979839230795202451
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8385824745593160430}
+ 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: 4000902174573487903}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &926584410341277518
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8385824745593160430}
+ m_CullTransparentMesh: 1
+--- !u!114 &7589457457506445651
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8385824745593160430}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_text: "H\u1EE7y"
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 50
+ m_fontSizeBase: 50
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_HorizontalAlignment: 2
+ m_VerticalAlignment: 512
+ m_textAlignment: 65535
+ m_characterSpacing: 0
+ m_wordSpacing: 0
+ m_lineSpacing: 0
+ m_lineSpacingMax: 0
+ m_paragraphSpacing: 0
+ m_charWidthMaxAdj: 0
+ m_TextWrappingMode: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 0
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 1
+ m_parseCtrlCharacters: 1
+ m_isOrthographic: 1
+ m_isCullingEnabled: 0
+ m_horizontalMapping: 0
+ m_verticalMapping: 0
+ m_uvLineOffset: 0
+ m_geometrySortingOrder: 0
+ m_IsTextObjectScaleStatic: 0
+ m_VertexBufferAutoSizeReduction: 0
+ m_useMaxVisibleDescender: 1
+ m_pageToDisplay: 1
+ m_margin: {x: 0, y: 0, z: 0, w: 0}
+ m_isUsingLegacyAnimationComponent: 0
+ m_isVolumetricText: 0
+ m_hasFontAssetChanged: 0
+ m_baseMaterial: {fileID: 0}
+ m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
diff --git a/Assets/PerfectWorld/Prefab/UI/DlgExit.prefab.meta b/Assets/PerfectWorld/Prefab/UI/DlgExit.prefab.meta
new file mode 100644
index 0000000000..1c6e3602da
--- /dev/null
+++ b/Assets/PerfectWorld/Prefab/UI/DlgExit.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0c248d0510a114829b58d62d2ecc3b5e
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/PerfectWorld/Prefab/UIManager.prefab b/Assets/PerfectWorld/Prefab/UIManager.prefab
index a3defccd9c..fbbecd21f8 100644
--- a/Assets/PerfectWorld/Prefab/UIManager.prefab
+++ b/Assets/PerfectWorld/Prefab/UIManager.prefab
@@ -218,6 +218,139 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &335905991743982376
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1572942396405590444}
+ - component: {fileID: 6524368999182548347}
+ - component: {fileID: 3967330152047649732}
+ - component: {fileID: 6939892946615024074}
+ m_Layer: 5
+ m_Name: ChangeSkillBtn
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1572942396405590444
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 335905991743982376}
+ 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:
+ - {fileID: 3145908486618148274}
+ m_Father: {fileID: 3483809415181351540}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 1, y: 0}
+ m_AnchorMax: {x: 1, y: 0}
+ m_AnchoredPosition: {x: -718.8898, y: 36.854492}
+ m_SizeDelta: {x: 50, y: 50}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6524368999182548347
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 335905991743982376}
+ m_CullTransparentMesh: 1
+--- !u!114 &3967330152047649732
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 335905991743982376}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: f0f6993d8df90de429f182e7d49a89f7, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!114 &6939892946615024074
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 335905991743982376}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 3967330152047649732}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1890210201668811196}
+ m_TargetAssemblyTypeName: CECUIManager, Assembly-CSharp
+ m_MethodName: OnChangeSkillShortcut
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
--- !u!1 &427315709131599085
GameObject:
m_ObjectHideFlags: 0
@@ -490,6 +623,142 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &806379414455135824
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3424248442838442643}
+ - component: {fileID: 8575635143285857700}
+ - component: {fileID: 2564374985051604717}
+ m_Layer: 5
+ m_Name: Text (TMP)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3424248442838442643
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 806379414455135824}
+ 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: 7306104429597638794}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8575635143285857700
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 806379414455135824}
+ m_CullTransparentMesh: 1
+--- !u!114 &2564374985051604717
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 806379414455135824}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_text:
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+ m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+ m_fontSharedMaterials: []
+ m_fontMaterial: {fileID: 0}
+ m_fontMaterials: []
+ m_fontColor32:
+ serializedVersion: 2
+ rgba: 4281479730
+ m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+ m_enableVertexGradient: 0
+ m_colorMode: 3
+ m_fontColorGradient:
+ topLeft: {r: 1, g: 1, b: 1, a: 1}
+ topRight: {r: 1, g: 1, b: 1, a: 1}
+ bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+ bottomRight: {r: 1, g: 1, b: 1, a: 1}
+ m_fontColorGradientPreset: {fileID: 0}
+ m_spriteAsset: {fileID: 0}
+ m_tintAllSprites: 0
+ m_StyleSheet: {fileID: 0}
+ m_TextStyleHashCode: -1183493901
+ m_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_fontSize: 24
+ m_fontSizeBase: 24
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_HorizontalAlignment: 2
+ m_VerticalAlignment: 512
+ m_textAlignment: 65535
+ m_characterSpacing: 0
+ m_wordSpacing: 0
+ m_lineSpacing: 0
+ m_lineSpacingMax: 0
+ m_paragraphSpacing: 0
+ m_charWidthMaxAdj: 0
+ m_TextWrappingMode: 1
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_linkedTextComponent: {fileID: 0}
+ parentLinkedComponent: {fileID: 0}
+ m_enableKerning: 0
+ m_ActiveFontFeatures: 6e72656b
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 1
+ m_EmojiFallbackSupport: 1
+ m_parseCtrlCharacters: 1
+ m_isOrthographic: 1
+ m_isCullingEnabled: 0
+ m_horizontalMapping: 0
+ m_verticalMapping: 0
+ m_uvLineOffset: 0
+ m_geometrySortingOrder: 0
+ m_IsTextObjectScaleStatic: 0
+ m_VertexBufferAutoSizeReduction: 0
+ m_useMaxVisibleDescender: 1
+ m_pageToDisplay: 1
+ m_margin: {x: 0, y: 0, z: 0, w: 0}
+ m_isUsingLegacyAnimationComponent: 0
+ m_isVolumetricText: 0
+ m_hasFontAssetChanged: 0
+ m_baseMaterial: {fileID: 0}
+ m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &921810299079476810
GameObject:
m_ObjectHideFlags: 0
@@ -1815,6 +2084,139 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &2782657052243972202
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7306104429597638794}
+ - component: {fileID: 4294505687272824498}
+ - component: {fileID: 1230139452348518632}
+ - component: {fileID: 808265911987054922}
+ m_Layer: 5
+ m_Name: FlyBtn
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &7306104429597638794
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2782657052243972202}
+ 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:
+ - {fileID: 3424248442838442643}
+ m_Father: {fileID: 3483809415181351540}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 1, y: 1}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: -791.8898, y: -64.69995}
+ m_SizeDelta: {x: 96, y: 96}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4294505687272824498
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2782657052243972202}
+ m_CullTransparentMesh: 1
+--- !u!114 &1230139452348518632
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2782657052243972202}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 6080708437622403664, guid: 205ebb1fc3847174cb78c7574a2b5a7d, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!114 &808265911987054922
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2782657052243972202}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1230139452348518632}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1890210201668811196}
+ m_TargetAssemblyTypeName: CECUIManager, Assembly-CSharp
+ m_MethodName: OnClickFly
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument: DlgTask
+ m_BoolArgument: 0
+ m_CallState: 2
--- !u!1 &2872011510662580381
GameObject:
m_ObjectHideFlags: 0
@@ -3999,7 +4401,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
- m_AnchoredPosition: {x: -781, y: -66.70001}
+ m_AnchoredPosition: {x: -898.4271, y: -67.48236}
m_SizeDelta: {x: 85, y: 99}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6123887107398507141
@@ -4817,8 +5219,10 @@ RectTransform:
- {fileID: 984617901920738932}
- {fileID: 2783469216819378410}
- {fileID: 8913509984865075419}
+ - {fileID: 7306104429597638794}
- {fileID: 5823843793071880086}
- {fileID: 1462603449517194619}
+ - {fileID: 1572942396405590444}
- {fileID: 7020286574697807252}
- {fileID: 1491137607121893366}
- {fileID: 6742883814524417716}
@@ -4847,6 +5251,81 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
_escapeBtn: {fileID: 2013061949432893537}
+--- !u!1 &7352847439676120744
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3145908486618148274}
+ - component: {fileID: 7098900891199169049}
+ - component: {fileID: 6088460147805800063}
+ m_Layer: 5
+ m_Name: hitbox
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3145908486618148274
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7352847439676120744}
+ 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: 1572942396405590444}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 3.4105263, y: 3.4105263}
+ m_SizeDelta: {x: 106.8, y: 70.421}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7098900891199169049
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7352847439676120744}
+ m_CullTransparentMesh: 1
+--- !u!114 &6088460147805800063
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7352847439676120744}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 0.003921569}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
--- !u!1 &7629826959126060481
GameObject:
m_ObjectHideFlags: 0
@@ -7485,7 +7964,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 776624419558043962, guid: 22d3972b131ebdb4288f9cbdf996d691, type: 3}
propertyPath: m_text
- value: 1162119
+ value: 44650
objectReference: {fileID: 0}
- target: {fileID: 848034462487949471, guid: 22d3972b131ebdb4288f9cbdf996d691, type: 3}
propertyPath: m_AnchorMax.y
diff --git a/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset b/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset
index 056efe4255..532d9eec59 100644
--- a/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset
+++ b/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset
@@ -55,3 +55,5 @@ MonoBehaviour:
prefab: {fileID: 3120870614492201289, guid: eaebf3351c396754fb983e0d5ba83e9a, type: 3}
- id: DlgPetRec
prefab: {fileID: 4739268381143404558, guid: 37f331119e0524018a0a7266aa257777, type: 3}
+ - id: Win_Message2
+ prefab: {fileID: 1590197940424963217, guid: 0c248d0510a114829b58d62d2ecc3b5e, type: 3}
diff --git a/Assets/PerfectWorld/Scripts/Common/EC_Configs.cs b/Assets/PerfectWorld/Scripts/Common/EC_Configs.cs
index 90953c446d..93a0a9c9ac 100644
--- a/Assets/PerfectWorld/Scripts/Common/EC_Configs.cs
+++ b/Assets/PerfectWorld/Scripts/Common/EC_Configs.cs
@@ -38,15 +38,22 @@ namespace BrewMonster
public byte nLevel;
public byte nSight;
public byte nWaterEffect;
+ [MarshalAs(UnmanagedType.U1)]
public bool bSimpleTerrain;
public byte nTreeDetail;
public byte nGrassDetail;
public byte nCloudDetail;
+ [MarshalAs(UnmanagedType.U1)]
public bool bShadow;
+ [MarshalAs(UnmanagedType.U1)]
public bool bMipMapBias;
+ [MarshalAs(UnmanagedType.U1)]
public bool bFullGlow;
+ [MarshalAs(UnmanagedType.U1)]
public bool bSpaceWarp;
+ [MarshalAs(UnmanagedType.U1)]
public bool bSunFlare;
+ [MarshalAs(UnmanagedType.U1)]
public bool bAdvancedWater;
public byte nSoundVol;
public byte nMusicVol;
@@ -55,9 +62,13 @@ namespace BrewMonster
public int iRndHeight;
public int iTexDetail;
public int iSoundQuality;
+ [MarshalAs(UnmanagedType.U1)]
public bool bFullScreen;
+ [MarshalAs(UnmanagedType.U1)]
public bool bWideScreen;
+ [MarshalAs(UnmanagedType.U1)]
public bool bVSync;
+ [MarshalAs(UnmanagedType.U1)]
public bool bScaleUI;
public int iTheme;
@@ -124,35 +135,58 @@ namespace BrewMonster
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct EC_VIDEO_SETTING
{
+ [MarshalAs(UnmanagedType.U1)]
public bool bPlayerHP;
+ [MarshalAs(UnmanagedType.U1)]
public bool bPlayerMP;
+ [MarshalAs(UnmanagedType.U1)]
public bool bPlayerEXP;
+ [MarshalAs(UnmanagedType.U1)]
public bool bPlayerHeadText;
+ [MarshalAs(UnmanagedType.U1)]
public bool bPlayerName;
+ [MarshalAs(UnmanagedType.U1)]
public bool bPlayerFaction;
+ [MarshalAs(UnmanagedType.U1)]
public bool bPlayerTitle;
+ [MarshalAs(UnmanagedType.U1)]
public bool bPlayerShop;
+ [MarshalAs(UnmanagedType.U1)]
public bool bPlayerSelfName;
+ [MarshalAs(UnmanagedType.U1)]
public bool bPlayerTalk;
+ [MarshalAs(UnmanagedType.U1)]
public bool bPlayerBubble;
+ [MarshalAs(UnmanagedType.U1)]
public bool bMonsterName;
+ [MarshalAs(UnmanagedType.U1)]
public bool bNPCName;
+ [MarshalAs(UnmanagedType.U1)]
public bool bGoodsName;
+ [MarshalAs(UnmanagedType.U1)]
public bool bModelLimit;
public byte nDistance;
+ [MarshalAs(UnmanagedType.U1)]
public bool bMapMonster;
+ [MarshalAs(UnmanagedType.U1)]
public bool bMapNPC;
+ [MarshalAs(UnmanagedType.U1)]
public bool bMapPlayer;
public byte nEffect;
+ [MarshalAs(UnmanagedType.U1)]
public bool bShowCustomize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = EC_ConfigConstants.EC_COMBOSKILL_NUM)]
public EC_COMBOSKILL[] comboSkill;
+ [MarshalAs(UnmanagedType.U1)]
public bool bPlayerForce;
+ [MarshalAs(UnmanagedType.U1)]
public bool bMailToFriendsRemind;
public int iMailToFriendsCheckTime;
public char cTabSelType;
+ [MarshalAs(UnmanagedType.U1)]
public bool bActivityRemind;
public int ibActivityReminderCheckTime;
+ [MarshalAs(UnmanagedType.U1)]
public bool bCloseMeridiansHint;
public void Reset()
@@ -253,42 +287,94 @@ namespace BrewMonster
bCloseMeridiansHint = reader.ReadBoolean();
}
}
-
+
+
// Game Settings Structure
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
+ // CharSet.Ansi required so szAutoReply matches C++ ACHAR[65] (1 byte/char); default is Unicode (2 bytes/char).
+ [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct EC_GAME_SETTING
{
+ [MarshalAs(UnmanagedType.U1)]
public bool bNoTeamRequest;
+ [MarshalAs(UnmanagedType.U1)]
public bool bNoTradeRequest;
+ [MarshalAs(UnmanagedType.U1)]
public bool bTurnaround;
+ [MarshalAs(UnmanagedType.U1)]
public bool bReverseWheel;
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = EC_ConfigConstants.EC_USERCHANNEL_NUM * 15)] // GP_CHAT_MAX = 15
- public bool[] bChannel;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = EC_ConfigConstants.EC_USERCHANNEL_NUM * 15, ArraySubType = UnmanagedType.I1)] // GP_CHAT_MAX = 15; I1 = 1 byte per bool to match C++ bool[6][15]
+ public byte[] bChannel; // I can't use bool[] here because C# bool is 1 byte but C++ bool is also 1 byte, so we use byte[] to match the size and layout of the original C++ struct.
+ [MarshalAs(UnmanagedType.U1)]
public bool bAutoReply;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = EC_ConfigConstants.EC_AUTOREPLY_LEN + 1)]
- public string szAutoReply;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = EC_ConfigConstants.EC_AUTOREPLY_LEN + 1)]
+ public ushort[] szAutoReply; // Using ushort[] to match C++ ACHAR[65] (1 byte/char) with CharSet.Ansi; we will convert to string when reading/writing.
+
+ /// Convert szAutoReply buffer (UTF-8 bytes stored as ushort) to string.
+ public static string SzAutoReplyToString(ushort[] buf)
+ {
+ if (buf == null || buf.Length == 0) return string.Empty;
+ int n = 0;
+ while (n < buf.Length && buf[n] != 0) n++;
+ if (n == 0) return string.Empty;
+ var bytes = new byte[n];
+ for (int i = 0; i < n; i++) bytes[i] = (byte)buf[i];
+ return Encoding.UTF8.GetString(bytes);
+ }
+
+ /// Write string into szAutoReply buffer as null-terminated UTF-8 (each byte stored as ushort).
+ public static void StringToSzAutoReply(string s, ushort[] buf)
+ {
+ if (buf == null || buf.Length == 0) return;
+ int maxLen = Math.Min(EC_ConfigConstants.EC_AUTOREPLY_LEN, buf.Length - 1);
+ byte[] bytes = Encoding.UTF8.GetBytes(s ?? string.Empty);
+ int n = Math.Min(bytes.Length, maxLen);
+ for (int i = 0; i < n; i++) buf[i] = bytes[i];
+ buf[n] = 0;
+ for (int i = n + 1; i < buf.Length; i++) buf[i] = 0;
+ }
+ [MarshalAs(UnmanagedType.U1)]
public float fCamTurnSpeed;
public float fCamZoomSpeed;
public byte nFontSize;
+ [MarshalAs(UnmanagedType.U1)]
public bool bAtk_Player;
+ [MarshalAs(UnmanagedType.U1)]
public bool bAtk_NoMafia;
+ [MarshalAs(UnmanagedType.U1)]
public bool bAtk_NoWhite;
+ [MarshalAs(UnmanagedType.U1)]
public bool bFontBold;
+ [MarshalAs(UnmanagedType.U1)]
public bool bBls_NoRed;
+ [MarshalAs(UnmanagedType.U1)]
public bool bBls_NoMafia;
+ [MarshalAs(UnmanagedType.U1)]
public bool bBls_Self;
+ [MarshalAs(UnmanagedType.U1)]
public bool bBlsRefuse_Neutral;
+ [MarshalAs(UnmanagedType.U1)]
public bool bHideAutoGuide;
+ [MarshalAs(UnmanagedType.U1)]
public bool bAtk_NoAlliance;
+ [MarshalAs(UnmanagedType.U1)]
public bool bBls_NoAlliance;
+ [MarshalAs(UnmanagedType.U1)]
public bool bBlsRefuse_NonTeammate;
+ [MarshalAs(UnmanagedType.U1)]
public bool bAtk_NoForce;
+ [MarshalAs(UnmanagedType.U1)]
public bool bBls_NoForce;
+ [MarshalAs(UnmanagedType.U1)]
public bool bLockQuickBar;
+ [MarshalAs(UnmanagedType.U1)]
public bool bPetAutoSkill;
+ [MarshalAs(UnmanagedType.U1)]
public bool bAutoTeamForTask;
+ [MarshalAs(UnmanagedType.U1)]
public bool bDisableAutoWikiHelp;
+ [MarshalAs(UnmanagedType.U1)]
public bool bExclusiveAwardMode;
+ [MarshalAs(UnmanagedType.U1)]
public bool bHideIceThunderBall;
public void Reset()
@@ -298,7 +384,7 @@ namespace BrewMonster
bTurnaround = false;
bReverseWheel = false;
bAutoReply = false;
- szAutoReply = "";
+ szAutoReply = new ushort[EC_ConfigConstants.EC_AUTOREPLY_LEN + 1]; // empty string (first byte 0)
fCamTurnSpeed = 10.0f;
fCamZoomSpeed = 1.0f;
nFontSize = 2;
@@ -324,7 +410,7 @@ namespace BrewMonster
bHideIceThunderBall = false;
// Initialize channel array with default values
- bChannel = new bool[EC_ConfigConstants.EC_USERCHANNEL_NUM * 15];
+ bChannel = new byte[EC_ConfigConstants.EC_USERCHANNEL_NUM * 15];
bool[,] a_bChannel = new bool[,]
{
{ true, true, true, true, true, false, false, true, true, true, false, true, true, true, true },
@@ -339,7 +425,7 @@ namespace BrewMonster
{
for (int j = 0; j < 15; j++)
{
- bChannel[i * 15 + j] = a_bChannel[i, j];
+ bChannel[i * 15 + j] = (byte)(a_bChannel[i, j] ? 1 : 0);
}
}
}
@@ -359,7 +445,7 @@ namespace BrewMonster
{
for (int i = 0; i < EC_ConfigConstants.EC_USERCHANNEL_NUM * 15; i++)
{
- bChannel[i] = reader.ReadBoolean();
+ bChannel[i] = (byte)(reader.ReadBoolean() ? 1 : 0);
}
}
else if (dwVer >= 26)
@@ -367,7 +453,7 @@ namespace BrewMonster
for (int i = 0; i < EC_ConfigConstants.EC_USERCHANNEL_NUM * 14; i++)
{
if (i < bChannel.Length)
- bChannel[i] = reader.ReadBoolean();
+ bChannel[i] = (byte)(reader.ReadBoolean() ? 1 : 0);
}
}
else
@@ -375,12 +461,17 @@ namespace BrewMonster
for (int i = 0; i < EC_ConfigConstants.EC_USERCHANNEL_NUM * 13; i++)
{
if (i < bChannel.Length)
- bChannel[i] = reader.ReadBoolean();
+ bChannel[i] = (byte)(reader.ReadBoolean() ? 1 : 0);
}
}
bAutoReply = reader.ReadBoolean();
- szAutoReply = Encoding.UTF8.GetString(reader.ReadBytes(EC_ConfigConstants.EC_AUTOREPLY_LEN + 1)).TrimEnd('\0');
+ // Binary format: 65 bytes UTF-8; store each byte in ushort[] for struct layout
+ if (szAutoReply == null || szAutoReply.Length < EC_ConfigConstants.EC_AUTOREPLY_LEN + 1)
+ szAutoReply = new ushort[EC_ConfigConstants.EC_AUTOREPLY_LEN + 1];
+ byte[] autoReplyBytes = reader.ReadBytes(EC_ConfigConstants.EC_AUTOREPLY_LEN + 1);
+ for (int i = 0; i < autoReplyBytes.Length; i++)
+ szAutoReply[i] = autoReplyBytes[i];
fCamTurnSpeed = reader.ReadSingle();
fCamZoomSpeed = reader.ReadSingle();
nFontSize = reader.ReadByte();
@@ -472,6 +563,7 @@ namespace BrewMonster
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct ITEM_GROUP
{
+ [MarshalAs(UnmanagedType.U1)]
public bool enable;
public int item;
public sbyte percent;
@@ -701,7 +793,9 @@ namespace BrewMonster
public uint m_dwDefAmbient;
// Test code, temporary parameters
+ [MarshalAs(UnmanagedType.U1)]
public bool m_bShowForest = true;
+ [MarshalAs(UnmanagedType.U1)]
public bool m_bShowGrassLand = true;
// Configs user cannot change
@@ -721,32 +815,48 @@ namespace BrewMonster
private string m_strWindowsTitle = "Element Client";
private string m_strMiniDLTitle = "";
private int m_iClientID = -1;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bRegisterUIScriptFunc = false;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bEnableGT = false;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bEnableArc = false;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bEnableArcAsia = false;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bMiniClient = false;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bSendLogicCheckInfo = false;
private List m_strThemeFiles = new List();
// DEBUG only settings
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bConsole = false;
private int m_iRTDebug = 1;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bShowNPCID = false;
private float m_fRunSpeed = 5.0f;
private float m_fWalkSpeed = 2.0f;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bTestDist = false;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bShowPos = false;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bGameStat = false;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bShowID = false;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bSkipFrame = false;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bModelUpt = true;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bDebugFog = false;
private float m_fDebugFogStart = 10.0f;
private float m_fDebugFogEnd = 100.0f;
private float m_fDebugFogDensity = 0.5f;
private uint m_dwDebugFogColor = 0xFFFFFFFF;
+ [MarshalAs(UnmanagedType.U1)]
private bool m_bAdjusting = false;
// User settings
@@ -1063,6 +1173,32 @@ namespace BrewMonster
return true;
}
+ ///
+ /// Write user config data into buffer at given offset. 在指定偏移处写入用户配置数据。
+ ///
+ public bool SaveUserConfigData(byte[] pDataBuf, int startIndex, out int piSize)
+ {
+ if (startIndex < 0) { piSize = 0; return false; }
+ piSize = 0;
+ int iTotalSize = 0;
+ iTotalSize += sizeof(uint);
+ iTotalSize += Marshal.SizeOf(typeof(EC_VIDEO_SETTING));
+ iTotalSize += Marshal.SizeOf(typeof(EC_GAME_SETTING));
+ iTotalSize += Marshal.SizeOf(typeof(EC_BLACKLIST_SETTING));
+ iTotalSize += Marshal.SizeOf(typeof(EC_COMPUTER_AIDED_SETTING));
+
+ if (pDataBuf != null && startIndex + iTotalSize <= pDataBuf.Length)
+ {
+ using (MemoryStream ms = new MemoryStream(pDataBuf, startIndex, pDataBuf.Length - startIndex))
+ using (BinaryWriter writer = new BinaryWriter(ms))
+ {
+ writer.Write((uint)EC_ConfigConstants.EC_CONFIG_VERSION);
+ }
+ }
+ piSize = iTotalSize;
+ return true;
+ }
+
public void DefaultUserConfigData()
{
DefaultUserSettings(ref m_ss, ref m_vs, ref m_gs, ref m_bs, ref m_cas);
@@ -1246,9 +1382,12 @@ namespace BrewMonster
private void Verify()
{
// Verify game setting
- if (m_gs.szAutoReply != null && m_gs.szAutoReply.Length > EC_ConfigConstants.EC_AUTOREPLY_LEN)
+ string autoReplyStr = EC_GAME_SETTING.SzAutoReplyToString(m_gs.szAutoReply);
+ if (autoReplyStr.Length > EC_ConfigConstants.EC_AUTOREPLY_LEN)
{
- m_gs.szAutoReply = m_gs.szAutoReply.Substring(0, EC_ConfigConstants.EC_AUTOREPLY_LEN);
+ if (m_gs.szAutoReply == null || m_gs.szAutoReply.Length < EC_ConfigConstants.EC_AUTOREPLY_LEN + 1)
+ m_gs.szAutoReply = new ushort[EC_ConfigConstants.EC_AUTOREPLY_LEN + 1];
+ EC_GAME_SETTING.StringToSzAutoReply(autoReplyStr.Substring(0, EC_ConfigConstants.EC_AUTOREPLY_LEN), m_gs.szAutoReply);
}
if (m_gs.nFontSize > 4)
@@ -1347,6 +1486,7 @@ namespace BrewMonster
public void SaveBlockedID()
{
+ // TODO
// Note: Would need character ID
// string strDir = Path.Combine(Application.persistentDataPath, "userdata", "blacklist");
// Directory.CreateDirectory(strDir);
diff --git a/Assets/PerfectWorld/Scripts/Common/EC_PendingAction.cs b/Assets/PerfectWorld/Scripts/Common/EC_PendingAction.cs
new file mode 100644
index 0000000000..aedf88b999
--- /dev/null
+++ b/Assets/PerfectWorld/Scripts/Common/EC_PendingAction.cs
@@ -0,0 +1,314 @@
+// Filename : EC_PendingAction.cs
+// Creator : Xu Wenbin
+// Date : 2011/11/09
+// Converted from C++: EC_PendingAction.cpp / EC_PendingAction.h
+
+using System.Collections.Generic;
+using BrewMonster;
+using BrewMonster.Network;
+using BrewMonster.UI;
+using CSNetwork;
+using UnityEngine;
+
+// Logout type constants (C++: gnetdef.h)
+// _PLAYER_LOGOUT_FULL 0, _PLAYER_LOGOUT_HALF 1
+public static class PendingActionConstants
+{
+ public const int _PLAYER_LOGOUT_FULL = 0;
+ public const int _PLAYER_LOGOUT_HALF = 1;
+}
+
+// CECPendingAction — base class for delayed/pending actions
+public abstract class CECPendingAction
+{
+ // 执行的时限 / Execution time limit
+ private readonly CECCounter m_Counter;
+ // 是否还需要执行 / Whether still needs to execute
+ private bool m_bNeedExecute;
+ // 是否收到外界执行指示 / Whether received external execute trigger
+ private bool m_bTriggered;
+ // 执行结果:是否成功执行 / Execute result: whether executed successfully
+ private bool m_bExecuteResult;
+
+ public CECPendingAction(uint dwTimerPeriod)
+ {
+ m_Counter = new CECCounter();
+ m_Counter.SetPeriod((float)dwTimerPeriod);
+ m_bNeedExecute = true;
+ m_bTriggered = false;
+ m_bExecuteResult = false;
+ }
+
+ public void Update(uint dwElapsedTime)
+ {
+ if (GetNeedExecute())
+ {
+ // 每次都尝试执行 / Try execute every time
+ if (m_Counter.IncCounter((float)dwElapsedTime))
+ {
+ // 计时器到 / Timer reached
+ // 强制执行 / Force execute
+ m_bExecuteResult = Execute();
+ // 不需要再进行尝试 / No need to try again
+ m_bNeedExecute = false;
+ }
+ // else 计时中 / else counting
+ }
+ }
+
+ public void Trigger()
+ {
+ if (!GetNeedExecute())
+ {
+ // 计时器已经强制执行,不需要再触发执行 / Timer already forced execute, no need to trigger again
+ return;
+ }
+ if (GetTriggered())
+ {
+ // 不允许多次触发 / Multiple trigger not allowed
+ return;
+ }
+ m_bTriggered = true;
+ m_bExecuteResult = Execute();
+ m_bNeedExecute = false;
+ }
+
+ public bool GetNeedExecute() => m_bNeedExecute;
+ public bool GetTriggered() => m_bTriggered;
+
+ public abstract string GetName();
+
+ protected abstract bool Execute();
+
+ // Whether currently in game (session connected, game state in-game, host ready)
+ protected bool IsInGame()
+ {
+ var pSession = GetGameSession();
+ var pGameRun = GetGameRun();
+ var pHost = pGameRun?.GetHostPlayer();
+ return pSession != null
+ && pSession.IsConnected
+ && pGameRun != null
+ && pGameRun.GetGameState() == (int)GameState.GS_GAME
+ && pHost != null
+ && pHost.HostIsReady();
+ }
+
+ protected static CECGameRun GetGameRun() => EC_Game.GetGameRun();
+ protected static GameSession GetGameSession() => UnityGameSession.Instance?.GameSession;
+ protected static CECHostPlayer GetHostPlayer() => GetGameRun()?.GetHostPlayer();
+}
+
+// 游戏小退 / Game logout (half — back to select role)
+public class CECPendingLogoutHalf : CECPendingAction
+{
+ public CECPendingLogoutHalf(uint dwTimerPeriod = 5000) : base(dwTimerPeriod) { }
+
+ protected override bool Execute()
+ {
+ bool bSuccess = false;
+ if (IsInGame())
+ {
+ GetGameSession().SendPlayerLogout(PendingActionConstants._PLAYER_LOGOUT_HALF);
+ bSuccess = true;
+ }
+ return bSuccess;
+ }
+
+ public override string GetName() => "CECPendingLogoutHalf";
+}
+
+// 游戏大退 / Game logout (full — account logout)
+public class CECPendingLogoutFull : CECPendingAction
+{
+ public CECPendingLogoutFull(uint dwTimerPeriod = 5000) : base(dwTimerPeriod) { }
+
+ protected override bool Execute()
+ {
+ bool bSuccess = false;
+ if (IsInGame())
+ {
+ GetGameSession().SendPlayerLogout(PendingActionConstants._PLAYER_LOGOUT_FULL);
+ bSuccess = true;
+ }
+ return bSuccess;
+ }
+
+ public override string GetName() => "CECPendingLogoutFull";
+}
+
+// 寄售角色 / Selling role
+public class CECPendingSellingRole : CECPendingAction
+{
+ public CECPendingSellingRole(uint dwTimerPeriod = 5000) : base(dwTimerPeriod) { }
+
+ protected override bool Execute()
+ {
+ bool bSuccess = false;
+ if (IsInGame())
+ {
+ GetGameSession().SendPlayerLogout(PendingActionConstants._PLAYER_LOGOUT_HALF);
+ GetGameRun().SetSellingRoleID(GetHostPlayer().GetCharacterID());
+ bSuccess = true;
+ }
+ return bSuccess;
+ }
+
+ public override string GetName() => "CECPendingSellingRole";
+}
+
+// 跨服小退 / Cross-server logout (half)
+public class CECPendingLogoutCrossServer : CECPendingAction
+{
+ public CECPendingLogoutCrossServer(uint dwTimerPeriod = 5000) : base(dwTimerPeriod) { }
+
+ protected override bool Execute()
+ {
+ GetGameRun().SetLogoutFlag(2);
+ return true;
+ }
+
+ public override string GetName() => "CECPendingLogoutCrossServer";
+}
+
+// 进出跨服 / Cross-server get in or out
+// m_bGetIn: 进入跨服时为 true;否则为 false / true when entering cross-server; otherwise false
+public class CECPendingCrossServerGetInOut : CECPendingAction
+{
+ private readonly bool m_bGetIn;
+
+ public CECPendingCrossServerGetInOut(bool bGetIn, uint dwTimerPeriod = 5000)
+ : base(dwTimerPeriod)
+ {
+ m_bGetIn = bGetIn;
+ }
+
+ protected override bool Execute()
+ {
+ bool bSuccess = false;
+ if (IsInGame())
+ {
+ var session = GetGameSession();
+ if (session != null)
+ {
+ if (m_bGetIn)
+ session.c2s_CmdNPCSevCrossServerGetIn();
+ else
+ session.c2s_CmdNPCSevCrossServerGetOut();
+ }
+ }
+ var pGameUIMan = GetGameRun()?.GetUIManager()?.GetInGameUIMan();
+ if (pGameUIMan is CECGameUIMan inGameUIMan)
+ inGameUIMan.EndNPCService();
+ return bSuccess;
+ }
+
+ public override string GetName() => "CECPendingCrossServerGetInOut";
+}
+
+// CECPendingActionArray — container for multiple pending actions
+public class CECPendingActionArray
+{
+ private readonly List m_actions = new List();
+ private bool m_bAllowMultiActions;
+
+ public CECPendingActionArray(bool bAllowMultiActions)
+ {
+ m_bAllowMultiActions = bAllowMultiActions;
+ }
+
+ ~CECPendingActionArray()
+ {
+ Clear();
+ }
+
+ public void Append(CECPendingAction pAction)
+ {
+ // 添加新事件 / Add new event
+ if (pAction == null)
+ {
+ Debug.Assert(false);
+ return;
+ }
+ if (!pAction.GetNeedExecute())
+ {
+ Debug.Assert(false);
+ return;
+ }
+ if (!GetAllowMultiAction())
+ Clear();
+ m_actions.Add(pAction);
+ }
+
+ public void AppendForSaveConfig(CECPendingAction pAction)
+ {
+ if (pAction == null)
+ {
+ Debug.Assert(false);
+ return;
+ }
+ if (!pAction.GetNeedExecute())
+ {
+ Debug.Assert(false);
+ return;
+ }
+ uint saveResult = EC_Game.GetGameRun().SaveConfigsToServer();
+ if (saveResult != 2)
+ {
+ pAction.Trigger();
+ return;
+ }
+ Append(pAction);
+ }
+
+ public void Update(uint dwElapsedTime)
+ {
+ if (m_actions.Count == 0) return;
+
+ for (int i = m_actions.Count - 1; i >= 0; i--)
+ {
+ CECPendingAction pAction = m_actions[i];
+ pAction.Update(dwElapsedTime);
+ if (!pAction.GetNeedExecute())
+ {
+ m_actions.RemoveAt(i);
+ }
+ }
+ }
+
+ public void TriggerAll()
+ {
+ if (m_actions.Count == 0) return;
+
+ foreach (var pAction in m_actions)
+ {
+ if (pAction.GetNeedExecute())
+ pAction.Trigger();
+ }
+ }
+
+ public void Clear()
+ {
+ // 清除当前所有事件 / Clear all current events
+ if (m_actions.Count == 0) return;
+
+ m_actions.Clear();
+ }
+
+ public void SetAllowMultiAction(bool bAllow)
+ {
+ if (GetAllowMultiAction() == bAllow) return;
+
+ m_bAllowMultiActions = bAllow;
+
+ // 按时间先后顺序,只保留队列最后一个 / By time order, keep only the last one in queue
+ if (!bAllow && m_actions.Count > 1)
+ {
+ var last = m_actions[m_actions.Count - 1];
+ m_actions.Clear();
+ m_actions.Add(last);
+ }
+ }
+
+ public bool GetAllowMultiAction() => m_bAllowMultiActions;
+}
diff --git a/Assets/PerfectWorld/Scripts/Common/EC_PendingAction.cs.meta b/Assets/PerfectWorld/Scripts/Common/EC_PendingAction.cs.meta
new file mode 100644
index 0000000000..9e17475b3a
--- /dev/null
+++ b/Assets/PerfectWorld/Scripts/Common/EC_PendingAction.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: a8fc69213d734cb49b1b381a760ae418
+timeCreated: 1770180043
\ No newline at end of file
diff --git a/Assets/PerfectWorld/Scripts/Debug/TestByteNumber.cs b/Assets/PerfectWorld/Scripts/Debug/TestByteNumber.cs
new file mode 100644
index 0000000000..10414ecd66
--- /dev/null
+++ b/Assets/PerfectWorld/Scripts/Debug/TestByteNumber.cs
@@ -0,0 +1,84 @@
+using System;
+using System.Runtime.InteropServices;
+using EditorAttributes;
+// using NaughtyAttributes;
+using UnityEngine;
+
+namespace BrewMonster
+{
+ public class TestByteNumber : MonoBehaviour
+ {
+
+ // Start is called once before the first execution of Update after the MonoBehaviour is created
+ void Start()
+ {
+
+ }
+
+ [ContextMenu("Test")]
+ public void Test()
+ {
+ var origin = Marshal.SizeOf();
+ var diff = Marshal.SizeOf() - Marshal.SizeOf();
+ BMLogger.Log($" Origin : {origin } - diff = {diff}"); // 255
+ }
+
+ [ContextMenu(" TestCompress")]
+ public void TestCompress()
+ {
+ int value = 123456;
+ byte[] src = BitConverter.GetBytes(value);
+
+ int dstLen = 10000;
+ byte[] dst = new byte[dstLen];
+
+ int res = AFilePackage.Compress( src, 0, src.Length, dst, 0, ref dstLen);
+
+ BMLogger.Log($" Res : {res} - srcLen = {src.Length} - dstLen = {dstLen} - compressed data: {BitConverter.ToString(dst, 0, dstLen)}");
+ }
+
+ }
+
+ [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
+ public struct EC_GAME_SETTING_TEST
+ {
+ [MarshalAs(UnmanagedType.U1)] public bool bNoTeamRequest;
+ [MarshalAs(UnmanagedType.U1)] public bool bNoTradeRequest;
+ [MarshalAs(UnmanagedType.U1)] public bool bTurnaround;
+ [MarshalAs(UnmanagedType.U1)] public bool bReverseWheel;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = EC_ConfigConstants.EC_USERCHANNEL_NUM * 15,
+ ArraySubType = UnmanagedType.I1)] // GP_CHAT_MAX = 15; I1 = 1 byte per bool to match C++ bool[6][15]
+ public byte[] bChannel;
+ [MarshalAs(UnmanagedType.U1)]
+ public bool bAutoReply;
+
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = EC_ConfigConstants.EC_AUTOREPLY_LEN + 1)]
+ public string szAutoReply;
+
+ [MarshalAs(UnmanagedType.U1)] public float fCamTurnSpeed;
+ public float fCamZoomSpeed;
+ public byte nFontSize;
+ [MarshalAs(UnmanagedType.U1)] public bool bAtk_Player;
+ [MarshalAs(UnmanagedType.U1)] public bool bAtk_NoMafia;
+ [MarshalAs(UnmanagedType.U1)] public bool bAtk_NoWhite;
+ [MarshalAs(UnmanagedType.U1)] public bool bFontBold;
+ [MarshalAs(UnmanagedType.U1)] public bool bBls_NoRed;
+ [MarshalAs(UnmanagedType.U1)] public bool bBls_NoMafia;
+ [MarshalAs(UnmanagedType.U1)] public bool bBls_Self;
+ [MarshalAs(UnmanagedType.U1)] public bool bBlsRefuse_Neutral;
+ [MarshalAs(UnmanagedType.U1)] public bool bHideAutoGuide;
+ [MarshalAs(UnmanagedType.U1)] public bool bAtk_NoAlliance;
+ [MarshalAs(UnmanagedType.U1)] public bool bBls_NoAlliance;
+ [MarshalAs(UnmanagedType.U1)] public bool bBlsRefuse_NonTeammate;
+ [MarshalAs(UnmanagedType.U1)] public bool bAtk_NoForce;
+ [MarshalAs(UnmanagedType.U1)] public bool bBls_NoForce;
+ [MarshalAs(UnmanagedType.U1)] public bool bLockQuickBar;
+ [MarshalAs(UnmanagedType.U1)] public bool bPetAutoSkill;
+ [MarshalAs(UnmanagedType.U1)] public bool bAutoTeamForTask;
+ [MarshalAs(UnmanagedType.U1)] public bool bDisableAutoWikiHelp;
+ [MarshalAs(UnmanagedType.U1)] public bool bExclusiveAwardMode;
+ [MarshalAs(UnmanagedType.U1)] public bool bHideIceThunderBall;
+
+ }
+}
diff --git a/Assets/PerfectWorld/Scripts/Debug/TestByteNumber.cs.meta b/Assets/PerfectWorld/Scripts/Debug/TestByteNumber.cs.meta
new file mode 100644
index 0000000000..dafe0fb5d3
--- /dev/null
+++ b/Assets/PerfectWorld/Scripts/Debug/TestByteNumber.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 67551ceb317224e67b8140cbe7175c44
\ No newline at end of file
diff --git a/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs b/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs
index da872c1e90..948d9bb4d0 100644
--- a/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs
+++ b/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs
@@ -9,7 +9,6 @@ using System.Buffers.Binary;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using BrewMonster.Network;
-using Unity.VisualScripting;
using UnityEngine;
public class CECNPCMan : IMsgHandler
diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkSpell.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkSpell.cs
index 26b153b95d..7e3171f17a 100644
--- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkSpell.cs
+++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkSpell.cs
@@ -1,5 +1,4 @@
using CSNetwork.GPDataType;
-using Unity.VisualScripting;
using UnityEngine;
using static BrewMonster.Scripts.CECHPWorkSpell.Spell_magic_state;
namespace BrewMonster.Scripts
diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs
index fdd5b8c8f9..7ca4f5100d 100644
--- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs
+++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs
@@ -6,7 +6,6 @@ using CSNetwork.GPDataType;
using System;
using System.Runtime.ConstrainedExecution;
using PerfectWorld.Scripts;
-using Unity.VisualScripting;
using UnityEngine;
///////////////////////////////////////////////////////////////////////////
diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_Inventory.cs b/Assets/PerfectWorld/Scripts/Managers/EC_Inventory.cs
index 0480c3265f..5e020ab927 100644
--- a/Assets/PerfectWorld/Scripts/Managers/EC_Inventory.cs
+++ b/Assets/PerfectWorld/Scripts/Managers/EC_Inventory.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using Unity.VisualScripting;
using UnityEngine;
namespace BrewMonster.Scripts.Managers
@@ -60,7 +59,7 @@ namespace BrewMonster.Scripts.Managers
}
}
- public void Resize(int iNewSize)
+ public virtual void Resize(int iNewSize)
{
int oldSize = m_aItems.Length;
if (iNewSize < 0) iNewSize = 0;
@@ -129,6 +128,42 @@ namespace BrewMonster.Scripts.Managers
m_aItems[iSlot2] = tmp;
}
+ ///
+ /// Place or stack item in a specific slot (server-specified slot). Matches C++ expectation that client uses same slot as server.
+ ///
+ public bool PutItemInSlot(int iSlot, int tid, int iExpireDate, int iAmount, out int piLastSlot, out int piLastAmount)
+ {
+ piLastSlot = -1;
+ piLastAmount = 0;
+ if (iSlot < 0 || iSlot >= m_aItems.Length || iAmount <= 0)
+ return false;
+
+ var slotItem = m_aItems[iSlot];
+ if (slotItem == null)
+ {
+ var newItem = EC_IvtrItem.CreateItem(tid, iExpireDate, iAmount);
+ if (newItem == null)
+ return false;
+ newItem.Slot = iSlot;
+ newItem.SetCount(iAmount);
+ m_aItems[iSlot] = newItem;
+ piLastSlot = iSlot;
+ piLastAmount = iAmount;
+ return true;
+ }
+ if (slotItem.GetTemplateID() != tid)
+ return false;
+ int pileLimit = Math.Max(1, EC_IvtrItem.GetPileLimit(tid));
+ int canAdd = Math.Max(0, pileLimit - Math.Max(0, slotItem.GetCount()));
+ if (canAdd <= 0)
+ return false;
+ int add = Math.Min(canAdd, iAmount);
+ slotItem.AddAmount(add);
+ piLastSlot = iSlot;
+ piLastAmount = slotItem.GetCount();
+ return true;
+ }
+
public bool MergeItem(int tid, int iExpireDate, int iAmount, out int piLastSlot, out int piLastAmount)
{
piLastSlot = -1;
@@ -170,6 +205,9 @@ namespace BrewMonster.Scripts.Managers
return false;
}
var newItem = EC_IvtrItem.CreateItem(tid, iExpireDate, iAmount);
+ if (newItem == null)
+ return false;
+ newItem.Slot = firstEmpty;
newItem.SetCount(iAmount);
m_aItems[firstEmpty] = newItem;
diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs b/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs
index 90fb2af58d..bba85771e0 100644
--- a/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs
+++ b/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs
@@ -3,6 +3,7 @@ using BrewMonster.Common;
using BrewMonster.Network;
using BrewMonster.Scripts;
using BrewMonster.Scripts.UI;
+using BrewMonster.Scripts.Task.UI;
using BrewMonster.UI;
using CSNetwork.GPDataType;
using ModelRenderer.Scripts.GameData;
@@ -17,15 +18,16 @@ using UnityEngine.UI;
namespace BrewMonster.Scripts.Managers
{
- public class EC_InventoryUI : AUIDialog
+ public class EC_InventoryUI : AUIDialog, IRefreshLayout
{
+
[Header("Pack Buttons (assign in Inspector)")]
[SerializeField] private List