diff --git a/Assets/PerfectWorld/Prefab/UI/MessageBox.prefab b/Assets/PerfectWorld/Prefab/UI/MessageBox.prefab index c68a796b79..4c624559eb 100644 --- a/Assets/PerfectWorld/Prefab/UI/MessageBox.prefab +++ b/Assets/PerfectWorld/Prefab/UI/MessageBox.prefab @@ -1,5 +1,126 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &99051929539797809 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4915293664251870536} + - component: {fileID: 7416811990837147698} + - component: {fileID: 6809282891346298764} + - component: {fileID: 7010901635634620631} + m_Layer: 5 + m_Name: ButtonNo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4915293664251870536 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 99051929539797809} + 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: 2385775756193422540} + m_Father: {fileID: 2782318616460798463} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 205.9258, y: 56.2433} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7416811990837147698 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 99051929539797809} + m_CullTransparentMesh: 1 +--- !u!114 &6809282891346298764 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 99051929539797809} + 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: 0.14578143, g: 0.7924528, b: 0.1864423, 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: 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!114 &7010901635634620631 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 99051929539797809} + 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: 6809282891346298764} + m_OnClick: + m_PersistentCalls: + m_Calls: [] --- !u!1 &1448650841350251410 GameObject: m_ObjectHideFlags: 0 @@ -168,10 +289,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 7906706137011413807} 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: -81} - m_SizeDelta: {x: 200, y: 50} + 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 &5808684862484431307 CanvasRenderer: @@ -201,7 +322,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: OK + m_text: "\u0110\u1ED3ng \xDD(Y)" m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} @@ -228,10 +349,10 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 36 + m_fontSize: 44.25 m_fontSizeBase: 36 m_fontWeight: 400 - m_enableAutoSizing: 0 + m_enableAutoSizing: 1 m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 @@ -272,6 +393,70 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &4140524140714306011 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2782318616460798463} + - component: {fileID: 6567280976245013390} + m_Layer: 5 + m_Name: Buttons + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2782318616460798463 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4140524140714306011} + 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: 4915293664251870536} + - {fileID: 7906706137011413807} + m_Father: {fileID: 8578995796031649400} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 41.609} + m_SizeDelta: {x: 0, y: 83.217} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &6567280976245013390 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4140524140714306011} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 4 + m_Spacing: 11.43 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 --- !u!1 &4839074738306786208 GameObject: m_ObjectHideFlags: 0 @@ -285,7 +470,7 @@ GameObject: - component: {fileID: 8250962023850685786} - component: {fileID: 7766051278568089760} m_Layer: 5 - m_Name: ButtonExit + m_Name: ButtonOk m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -298,18 +483,18 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4839074738306786208} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + 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: 7677644201189461152} - m_Father: {fileID: 8578995796031649400} + m_Father: {fileID: 2782318616460798463} 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_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 160, y: 30} + m_SizeDelta: {x: 205.9258, y: 56.2433} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &8280971203118505009 CanvasRenderer: @@ -332,7 +517,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Color: {r: 0.14578143, g: 0.7924528, b: 0.1864423, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -425,10 +610,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 8578995796031649400} 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: 3} - m_SizeDelta: {x: 200, y: 50} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &655909173274991632 CanvasRenderer: @@ -487,10 +672,10 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 36 + m_fontSize: 44.75 m_fontSizeBase: 36 m_fontWeight: 400 - m_enableAutoSizing: 0 + m_enableAutoSizing: 1 m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 @@ -562,15 +747,15 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 7906706137011413807} - {fileID: 1931146730219979515} - {fileID: 6428994832978992641} + - {fileID: 2782318616460798463} m_Father: {fileID: 0} 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: 30.6318} - m_SizeDelta: {x: 434.6896, y: 248.9211} + m_SizeDelta: {x: 1067.9689, y: 248.9211} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &2243330050876855902 CanvasRenderer: @@ -625,3 +810,140 @@ MonoBehaviour: titleText: {fileID: 5031655611580643013} messageText: {fileID: 7448521238108099750} okButton: {fileID: 7766051278568089760} + _noButton: {fileID: 7010901635634620631} +--- !u!1 &5664175764923475105 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2385775756193422540} + - component: {fileID: 8838082653881325633} + - component: {fileID: 438315464709753381} + 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 &2385775756193422540 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5664175764923475105} + 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: 4915293664251870536} + 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 &8838082653881325633 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5664175764923475105} + m_CullTransparentMesh: 1 +--- !u!114 &438315464709753381 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5664175764923475105} + 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(N)" + 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: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, 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.3 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + 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: 0 + 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/UIManager.prefab b/Assets/PerfectWorld/Prefab/UIManager.prefab index 560c8ac391..da3ce713de 100644 --- a/Assets/PerfectWorld/Prefab/UIManager.prefab +++ b/Assets/PerfectWorld/Prefab/UIManager.prefab @@ -2244,7 +2244,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &9056141770234008732 RectTransform: m_ObjectHideFlags: 0 @@ -2965,6 +2965,9 @@ GameObject: - component: {fileID: 2780428059708698453} - component: {fileID: 1890210201668811196} - component: {fileID: 6678802354138057098} + - component: {fileID: 7367406124028344242} + - component: {fileID: 3162833025978482600} + - component: {fileID: 2431558109419737109} m_Layer: 0 m_Name: UIManager m_TagString: Untagged @@ -3009,7 +3012,8 @@ MonoBehaviour: dialogResouce: {fileID: 11400000, guid: 540bc8e61556ba4479407a2d68e17580, type: 2} canvasDlg: {fileID: 7894129013412138377} btnSecondClick: {fileID: 1330222957695115484} - m_pDlgQuickBar1: {fileID: 5121835536669013309} + m_pDlgQuickBar1: {fileID: 8338623026378970694} + m_pDlgSkillSubOther: {fileID: 2431558109419737109} m_pDlgSkillAction: {fileID: 0} --- !u!114 &6678802354138057098 MonoBehaviour: @@ -3025,6 +3029,54 @@ MonoBehaviour: m_EditorClassIdentifier: uiSkillButton: {fileID: 1484158212461992110} skillUI: {fileID: 5226149676194325592} +--- !u!114 &7367406124028344242 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6950113420985123515} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b46a84d2ff078524f974fb6d60019d8c, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &3162833025978482600 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6950113420985123515} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ad855801e0cddfe46a48b448016ee952, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &2431558109419737109 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6950113420985123515} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 27624565938535e4593764faffe78bbf, type: 3} + m_Name: + m_EditorClassIdentifier: + m_comboSkillImages: [] + m_fixedImgPics: [] + m_fixedTxts: [] + m_itemSkillImages: [] + m_produceImgIcons: [] + m_produceNameLabels: [] + m_produceSkilledTxtLabels: [] + m_produceSkilledExpLabels: [] + m_produceLevelLabels: [] + m_btnEdit: {fileID: 0} + m_btnDelete: {fileID: 0} + m_btnNew: {fileID: 0} --- !u!1 &7222864739775630687 GameObject: m_ObjectHideFlags: 0 @@ -3611,7 +3663,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &6541409353547558602 RectTransform: m_ObjectHideFlags: 0 @@ -8559,163 +8611,163 @@ PrefabInstance: m_Modifications: - target: {fileID: 158413265946294456, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 158413265946294456, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 158413265946294456, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 158413265946294456, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 158413265946294456, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 210 + value: 0 objectReference: {fileID: 0} - target: {fileID: 158413265946294456, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 231422904688943530, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 231422904688943530, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 231422904688943530, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 231422904688943530, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 231422904688943530, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 468 + value: 0 objectReference: {fileID: 0} - target: {fileID: 231422904688943530, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 235133144264982572, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 235133144264982572, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 235133144264982572, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 235133144264982572, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 235133144264982572, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 124 + value: 0 objectReference: {fileID: 0} - target: {fileID: 235133144264982572, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 252073421677919053, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 252073421677919053, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 252073421677919053, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 252073421677919053, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 252073421677919053, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 252073421677919053, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 273572152272855865, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 273572152272855865, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 273572152272855865, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 273572152272855865, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 273572152272855865, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 273572152272855865, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -200 + value: 0 objectReference: {fileID: 0} - target: {fileID: 477536361219792488, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 477536361219792488, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 477536361219792488, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 127 + value: 0 objectReference: {fileID: 0} - target: {fileID: 477536361219792488, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -18.5 + value: 0 objectReference: {fileID: 0} - target: {fileID: 610002772638806474, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 610002772638806474, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 610002772638806474, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 610002772638806474, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 610002772638806474, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 210 + value: 0 objectReference: {fileID: 0} - target: {fileID: 610002772638806474, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 627631504828013321, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_Pivot.x @@ -8799,131 +8851,131 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 996588177716743723, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 996588177716743723, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 996588177716743723, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 996588177716743723, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 996588177716743723, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 612 + value: 0 objectReference: {fileID: 0} - target: {fileID: 996588177716743723, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1028955840978023150, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1028955840978023150, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1028955840978023150, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1028955840978023150, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1028955840978023150, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 296 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1028955840978023150, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1098377446839813520, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1098377446839813520, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1098377446839813520, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1098377446839813520, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1098377446839813520, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 296 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1098377446839813520, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -200 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1165116086950554229, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1165116086950554229, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1165116086950554229, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1165116086950554229, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1165116086950554229, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 366 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1165116086950554229, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1212536400827376711, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1212536400827376711, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1212536400827376711, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 309.47 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1212536400827376711, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -205.41306 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1617375721872166299, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1617375721872166299, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1617375721872166299, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 468.781 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1617375721872166299, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -31.05 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1619307578907548267, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y @@ -8935,7 +8987,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1619307578907548267, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 242.22609 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1619307578907548267, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x @@ -8955,7 +9007,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1654603029608217456, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 221.8 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1654603029608217456, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x @@ -8967,151 +9019,151 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1827721387084964356, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1827721387084964356, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1827721387084964356, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1827721387084964356, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1827721387084964356, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 640 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1827721387084964356, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -200 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1854076883996092593, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1854076883996092593, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1854076883996092593, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1854076883996092593, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1854076883996092593, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 382 + value: 0 objectReference: {fileID: 0} - target: {fileID: 1854076883996092593, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2059340427576723734, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2059340427576723734, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2059340427576723734, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2059340427576723734, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2059340427576723734, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 124 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2059340427576723734, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -200 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2175877360411271826, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2175877360411271826, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2175877360411271826, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2175877360411271826, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2175877360411271826, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 382 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2175877360411271826, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2243668127581612445, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2243668127581612445, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2243668127581612445, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2243668127581612445, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2243668127581612445, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 210 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2243668127581612445, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -200 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2606804668300983452, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 580.60004 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2721134754136738906, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2721134754136738906, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2721134754136738906, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2721134754136738906, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2721134754136738906, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 366 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2721134754136738906, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2767451028238277408, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y @@ -9123,7 +9175,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2767451028238277408, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 302.80002 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2767451028238277408, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x @@ -9155,147 +9207,147 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3001332161301665673, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3001332161301665673, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3001332161301665673, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3001332161301665673, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3001332161301665673, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 124 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3001332161301665673, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3332235597013148975, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3332235597013148975, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3332235597013148975, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3332235597013148975, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3332235597013148975, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 468 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3332235597013148975, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3407970636608740510, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3407970636608740510, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3407970636608740510, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3407970636608740510, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3407970636608740510, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 284 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3407970636608740510, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3533119636705249246, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3533119636705249246, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3533119636705249246, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3533119636705249246, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3533119636705249246, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 210 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3533119636705249246, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3653737322893481821, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3653737322893481821, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3653737322893481821, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3653737322893481821, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3653737322893481821, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 468 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3653737322893481821, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -200 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3806146217512234105, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3806146217512234105, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3806146217512234105, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3806146217512234105, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3806146217512234105, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3806146217512234105, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3959004304404627642, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y @@ -9315,371 +9367,371 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3969499137271474866, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3969499137271474866, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3969499137271474866, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3969499137271474866, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3969499137271474866, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 640 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3969499137271474866, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4019841459086602545, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4019841459086602545, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4019841459086602545, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4019841459086602545, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4019841459086602545, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 124 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4019841459086602545, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4029765383688713542, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4029765383688713542, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4029765383688713542, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4029765383688713542, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4029765383688713542, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 284 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4029765383688713542, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4040477032306608836, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4040477032306608836, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4040477032306608836, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4040477032306608836, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4040477032306608836, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 296 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4040477032306608836, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4051927648293139806, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4051927648293139806, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4051927648293139806, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4051927648293139806, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4051927648293139806, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 382 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4051927648293139806, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4057380665741699438, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4057380665741699438, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4057380665741699438, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4057380665741699438, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4057380665741699438, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 296 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4057380665741699438, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4250561721287709306, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4250561721287709306, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4250561721287709306, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4250561721287709306, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4250561721287709306, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 554 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4250561721287709306, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4482184240218620104, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4482184240218620104, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4482184240218620104, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4482184240218620104, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4482184240218620104, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 640 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4482184240218620104, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4571697084489210839, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4571697084489210839, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4571697084489210839, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4571697084489210839, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4571697084489210839, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 120 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4571697084489210839, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4641183319640697406, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4641183319640697406, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4641183319640697406, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4641183319640697406, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4641183319640697406, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 382 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4641183319640697406, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -200 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4724247752932422168, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4724247752932422168, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4724247752932422168, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4724247752932422168, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4724247752932422168, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4724247752932422168, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4740439902517672003, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4740439902517672003, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4740439902517672003, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 309.47 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4740439902517672003, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -95 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4780570441389552407, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4780570441389552407, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4780570441389552407, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4780570441389552407, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4780570441389552407, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 202 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4780570441389552407, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4809800074832380949, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4809800074832380949, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4809800074832380949, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4809800074832380949, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4809800074832380949, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 448 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4809800074832380949, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4854616395463442219, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4854616395463442219, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4854616395463442219, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 127 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4854616395463442219, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -18.5 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5081070779701005043, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5081070779701005043, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5081070779701005043, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5081070779701005043, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5081070779701005043, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 202 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5081070779701005043, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5209698742198332103, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y @@ -9691,7 +9743,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5209698742198332103, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 238 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5209698742198332103, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x @@ -9703,43 +9755,43 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5310355672157812293, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5310355672157812293, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5310355672157812293, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5310355672157812293, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5310355672157812293, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 535.82 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5310355672157812293, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5321430675814961371, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5321430675814961371, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5321430675814961371, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 309.47 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5321430675814961371, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -381.81305 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5330897987501731450, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y @@ -9759,95 +9811,95 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5528175217695877564, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 716.8522 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5654591691296971945, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5654591691296971945, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5654591691296971945, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5654591691296971945, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5654591691296971945, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5654591691296971945, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5818092462432985527, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5818092462432985527, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5818092462432985527, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 288.8686 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5818092462432985527, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -31.05 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5910018929694072234, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5910018929694072234, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5910018929694072234, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5910018929694072234, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5910018929694072234, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 611.82 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5910018929694072234, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5968773174488399194, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5968773174488399194, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5968773174488399194, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5968773174488399194, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5968773174488399194, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 448 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5968773174488399194, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6238266639003596740, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_Name @@ -9859,43 +9911,43 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6375080618180806221, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6375080618180806221, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6375080618180806221, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 83.16 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6375080618180806221, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -162.18411 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6610795123697946321, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6610795123697946321, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6610795123697946321, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6610795123697946321, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6610795123697946321, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 120 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6610795123697946321, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6640795756162075713, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y @@ -9907,7 +9959,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6640795756162075713, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 157 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6640795756162075713, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x @@ -9919,235 +9971,235 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6667370386965220466, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6667370386965220466, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6667370386965220466, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6667370386965220466, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6667370386965220466, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 468 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6667370386965220466, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6710498036916096120, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6710498036916096120, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6710498036916096120, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6710498036916096120, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6710498036916096120, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 640 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6710498036916096120, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6933721175846856071, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6933721175846856071, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6933721175846856071, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6933721175846856071, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6933721175846856071, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 530 + value: 0 objectReference: {fileID: 0} - target: {fileID: 6933721175846856071, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7102259324671439617, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7102259324671439617, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7102259324671439617, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7102259324671439617, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7102259324671439617, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7102259324671439617, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7111024902827265127, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7111024902827265127, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7111024902827265127, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7111024902827265127, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7111024902827265127, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 468 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7111024902827265127, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7164057499482312749, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7164057499482312749, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7164057499482312749, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7164057499482312749, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7164057499482312749, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 554 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7164057499482312749, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -200 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7249702927878373308, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7249702927878373308, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7249702927878373308, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7249702927878373308, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7249702927878373308, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 124 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7249702927878373308, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7312016669710787934, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7312016669710787934, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7312016669710787934, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7312016669710787934, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7312016669710787934, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 554 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7312016669710787934, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7388007950911340524, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7388007950911340524, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7388007950911340524, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 127 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7388007950911340524, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -18.5 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7530376446751224893, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7530376446751224893, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7530376446751224893, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7530376446751224893, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7530376446751224893, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 296 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7530376446751224893, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7716859618583968298, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y @@ -10159,7 +10211,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7716859618583968298, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7716859618583968298, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x @@ -10171,51 +10223,51 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7778303068410232866, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7778303068410232866, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7778303068410232866, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7778303068410232866, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7778303068410232866, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 640 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7778303068410232866, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7841385671618640799, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7841385671618640799, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7841385671618640799, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7841385671618640799, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7841385671618640799, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7841385671618640799, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7868147299253831422, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y @@ -10227,7 +10279,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7868147299253831422, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7868147299253831422, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x @@ -10239,19 +10291,19 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8029283128219612690, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8029283128219612690, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8029283128219612690, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 83.16 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8029283128219612690, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -292.4765 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8161223343954633123, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y @@ -10263,7 +10315,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8161223343954633123, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8161223343954633123, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x @@ -10275,27 +10327,27 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8296544460352271155, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8296544460352271155, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8296544460352271155, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8296544460352271155, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8296544460352271155, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 382 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8296544460352271155, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8302858527499935758, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y @@ -10303,139 +10355,139 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8432702414096739042, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8432702414096739042, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8432702414096739042, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 127 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8432702414096739042, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -18.5 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8573489181419288987, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8573489181419288987, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8573489181419288987, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8573489181419288987, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8573489181419288987, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 554 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8573489181419288987, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8683304717971224583, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8683304717971224583, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8683304717971224583, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8683304717971224583, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8683304717971224583, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 554 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8683304717971224583, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -119 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8824245776156879212, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8824245776156879212, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8824245776156879212, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8824245776156879212, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8824245776156879212, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 612 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8824245776156879212, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8825567524387170838, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8825567524387170838, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8825567524387170838, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8825567524387170838, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8825567524387170838, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 530 + value: 0 objectReference: {fileID: 0} - target: {fileID: 8825567524387170838, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9021125660402316805, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9021125660402316805, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9021125660402316805, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.x - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9021125660402316805, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 76 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9021125660402316805, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 210 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9021125660402316805, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -38 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9054696526250431957, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y @@ -10447,7 +10499,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 9054696526250431957, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_SizeDelta.y - value: 418.6261 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9054696526250431957, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x @@ -10459,35 +10511,35 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 9102658109286783788, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9102658109286783788, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9102658109286783788, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 83.16 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9102658109286783788, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -48.51895 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9184880796936692226, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9184880796936692226, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9184880796936692226, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.x - value: 108.9562 + value: 0 objectReference: {fileID: 0} - target: {fileID: 9184880796936692226, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3} propertyPath: m_AnchoredPosition.y - value: -31.05 + value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] diff --git a/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset b/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset index 3a56aa4ebf..393710000b 100644 --- a/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset +++ b/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset @@ -39,3 +39,5 @@ MonoBehaviour: prefab: {fileID: 6310702841431484757, guid: 6620f766cee7c8f4cb00dd457ac77675, type: 3} - id: Win_ArrangeTeam prefab: {fileID: 2452003196178065293, guid: 5a3e828efd5c542469d1f17565205ded, type: 3} + - id: DlgMessageBox + prefab: {fileID: 5492547392745930423, guid: 54cccb2c6a758a24183474cd385ccb2c, type: 3} diff --git a/Assets/PerfectWorld/Scripts/AutoPolicy/CECAutoPolicy.cs b/Assets/PerfectWorld/Scripts/AutoPolicy/CECAutoPolicy.cs new file mode 100644 index 0000000000..a5cba37b5e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/AutoPolicy/CECAutoPolicy.cs @@ -0,0 +1,454 @@ +// EC_AutoPolicy.cs +// Converted from EC_AutoPolicy.h / EC_AutoPolicy.cpp + +using BrewMonster.Assets.PerfectWorld.Scripts.Players; +using BrewMonster.Network; +using CSNetwork.GPDataType; +using System; +using System.Collections.Generic; +using System.IO; + +public sealed class CECAutoPolicy +{ + // policy type + public const int POLICY_AUTOKILLMONSTER = 0; + + // system events + public const int EVENT_BEHURT = 1; + public const int EVENT_SKILLINTERRUPT = 2; + public const int EVENT_RETURNTOWNOK = 3; + public const int EVENT_CONFIGCHANGED = 4; + + public struct CONFIG + { + public int attack_skill; + public bool attack_iscombo; + public int assist_skill; + public bool assist_iscombo; + public int nAssistInterval; + public int nTime; + public int iAutoPickMode; // 0 none, 1 all, 2 only money + public int nPetrolRadius; + + public CONFIG(bool _ = true) + { + attack_skill = 0; + attack_iscombo = false; + assist_skill = 0; + assist_iscombo = false; + nAssistInterval = 60000; + nTime = 3600000; + iAutoPickMode = 0; + nPetrolRadius = 500; + } + } + + private static readonly CECAutoPolicy _instance = new CECAutoPolicy(); + public static CECAutoPolicy GetInstance() => _instance; + + private CONFIG m_Config; + private CECPlayerWrapper m_pPlayer; + private string m_strCurPolicy; + + private readonly CECCounter m_cntTick; + private uint m_dwKeepingTime; + private uint m_dwCurrentTime; + + private CECAutoPolicy() + { + m_pPlayer = null; + m_cntTick = new CECCounter(); // 100ms => 10 ticks/sec + m_cntTick.SetPeriod(100); + m_dwKeepingTime = 0; + m_dwCurrentTime = 0; + m_strCurPolicy = string.Empty; + m_Config = new CONFIG(); + } + + public bool Init() + { + // load lua file list: configs/autopolicy/allfiles.txt + // (token-based in C++; here read whitespace tokens) + var listPath = Path.Combine("configs", "autopolicy", "allfiles.txt"); + if (!File.Exists(listPath)) + { + // a_LogOutput equivalent: adapt in your project + return false; + } + + foreach (var line in File.ReadLines(listPath)) + { + var s = line.Trim(); + if (string.IsNullOrEmpty(s)) continue; + if (s.StartsWith("#") || s.StartsWith("//")) continue; + + // token 0 + var parts = s.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length == 0) continue; + + var luaFile = Path.Combine("configs", "autopolicy", parts[0]); + LoadLuaFile(luaFile); + } + + // Register player API: _InitPlayerAPI(g_LuaStateMan.GetAIState()); + AutoPolicyLuaHooks.InitPlayerAPI?.Invoke(); + return true; + } + + public void Release() + { + m_pPlayer = null; + } + + public void OnEnterWorld() + { + if (m_pPlayer == null) + m_pPlayer = new CECPlayerWrapper(EC_Game.GetGameRun().GetHostPlayer()); + + LoadConfigData(); + } + + public void OnLeaveWorld() + { + if (m_pPlayer != null) + { + SaveConfigData(); + m_pPlayer = null; + } + + SetCurPolicy(string.Empty); + m_dwCurrentTime = 0; + } + + public void Tick(uint dwDeltaTime) + { + if (EC_Game.GetGameRun().GetGameState() != (int)GameState.GS_GAME) + return; + + m_pPlayer?.Tick(dwDeltaTime); + + if (m_cntTick.IncCounter(dwDeltaTime)) + { + var args = new List { new CScriptValue((double)m_dwKeepingTime) }; + var ret = new List(); + CallLuaFunc("AIManager", "OnTick", args, ret); + + m_cntTick.Reset(); + m_dwKeepingTime = 0; + } + + m_dwKeepingTime += dwDeltaTime; + if (IsAutoPolicyEnabled()) + m_dwCurrentTime += dwDeltaTime; + } + + public void Render() + { + // C++ draws debug text with A3DFont. Implement your own debug UI if needed. + // In C++ it uses: m_pPlayer.m_iAttackErrCnt / m_iPickupErrCnt / action queue list + } + + public void StartPolicy(int policyType) + { + string[] policyMap = + { + "AutoKillMonster", // POLICY_AUTOKILLMONSTER + }; + + // FIXED: original C++ has a sizeof bug. Correct is policyMap.Length. + if (policyType < 0 || policyType >= policyMap.Length) + return; + + string policyName = policyMap[policyType]; + SetCurPolicy(policyName); + m_dwCurrentTime = 0; + + if (m_pPlayer != null) + { + m_pPlayer.GetHostPlayer().ClearComboSkill(); + m_pPlayer.SetOrigPos(m_pPlayer.GetHostPlayer().GetPos()); + } + + var pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan(); + //pGameUI?.AddChatMessage(pGameUI.GetStringFromTable(10920), EC_GPDataType.GP_CHAT_MISC); + } + // Put this inside CECAutoPolicy class + + private void SetCurPolicy(string strPolicy) + { + // normalize null + strPolicy ??= string.Empty; + + // no change + if (string.Equals(m_strCurPolicy, strPolicy, StringComparison.Ordinal)) + return; + + // stop old policy (if any) + if (!string.IsNullOrEmpty(m_strCurPolicy)) + { + // Try a few common Lua callbacks (depending on your lua side implementation). + // You can keep only the one that exists in your project. + try + { + CallLuaFunc("AIManager", "OnStopPolicy", + new List { new CScriptValue(m_strCurPolicy) }, null); + } + catch { /* ignore if function not exist */ } + + try + { + CallLuaFunc("AIManager", "OnChangePolicy", + new List { new CScriptValue(m_strCurPolicy), new CScriptValue(strPolicy) }, null); + } + catch { /* ignore if function not exist */ } + } + + // assign + m_strCurPolicy = strPolicy; + + // start new policy (if any) + if (!string.IsNullOrEmpty(m_strCurPolicy)) + { + try + { + CallLuaFunc("AIManager", "OnStartPolicy", + new List { new CScriptValue(m_strCurPolicy) }, null); + } + catch { /* ignore if function not exist */ } + } + } + public void StopPolicy() + { + SetCurPolicy(string.Empty); + m_pPlayer?.OnStopPolicy(); + m_dwCurrentTime = 0; + + var pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan(); + //pGameUI?.AddChatMessage(pGameUI.GetStringFromTable(10921), ChatChannel.GP_CHAT_MISC); + } + + public void SendEvent_BeHurt(int attacker) + { + var args = new List + { + new CScriptValue((double)EVENT_BEHURT), + new CScriptValue((double)attacker), + }; + CallLuaFunc("AIManager", "OnEvent", args, null); + + if (GPDataTypeHelper.ISNPCID(attacker) && m_pPlayer != null) + m_pPlayer.OnMonsterAttackMe(attacker); + } + + public void SendEvent_SkillInterrupt(int skill_id) + { + + } + + public void SendEvent_ReturnTown() + { + var args = new List + { + new CScriptValue((double)EVENT_RETURNTOWNOK), + }; + CallLuaFunc("AIManager", "OnEvent", args, null); + } + + public void SendEvent_ConfigChanged() + { + var args = new List + { + new CScriptValue((double)EVENT_CONFIGCHANGED), + }; + CallLuaFunc("AIManager", "OnEvent", args, null); + + // C++: m_pPlayer->m_InvalidObj.clear(); + // In C# wrapper keeps it protected; clear via StopPolicy-style reset or expose method if you want exact parity. + // If you need exact parity, add a method on wrapper to ClearInvalidObj(). + } + + public CECPlayerWrapper GetPlayerWrapper() => m_pPlayer; + + public bool IsAutoPolicyEnabled() => !string.IsNullOrEmpty(m_strCurPolicy); + + public string GetCurPolicy() => m_strCurPolicy; + + public CONFIG GetConfigData() => m_Config; + + public void SetConfigData(CONFIG data) + { + m_Config = data; + SaveConfigData(); + } + + public uint GetRemainTime() + { + if (m_Config.nTime > (int)m_dwCurrentTime) + return (uint)(m_Config.nTime - (int)m_dwCurrentTime); + return 0; + } + + private bool LoadLuaFile(string filename) + { + // C++ uses LuaState lock + RegisterFile. Provide hooks. + return AutoPolicyLuaHooks.RegisterFile?.Invoke(filename) ?? false; + } + + private void CallLuaFunc(string szTable, string szName, List args, List ret) + { + AutoPolicyLuaHooks.CallLua?.Invoke(szTable, szName, args, ret); + } + + private bool LoadConfigData() + { + if (m_pPlayer == null) return false; + + string strFile = Path.Combine("userdata", "autopolicy", $"{m_pPlayer.GetHostPlayer().GetCharacterID()}.ini"); + + if (!File.Exists(strFile)) + { + SaveConfigData(); + return false; + } + + var ini = SimpleIni.Load(strFile); + + m_Config.attack_skill = ini.GetInt("config", "attack_skill", 0); + m_Config.attack_iscombo = ini.GetBool("config", "attack_iscombo", false); + m_Config.assist_skill = ini.GetInt("config", "assist_skill", 0); + m_Config.assist_iscombo = ini.GetBool("config", "assist_iscombo", false); + m_Config.nAssistInterval = ini.GetInt("config", "assist_interval", 60000); + m_Config.nTime = ini.GetInt("config", "keeping_time", 3600000); + m_Config.iAutoPickMode = ini.GetInt("config", "autopick", 1); + m_Config.nPetrolRadius = ini.GetInt("config", "petrol_radius", 500); + + return true; + } + + private void SaveConfigData() + { + Directory.CreateDirectory(Path.Combine("userdata", "autopolicy")); + + var ini = new SimpleIni(); + ini.SetInt("config", "attack_skill", m_Config.attack_skill); + ini.SetBool("config", "attack_iscombo", m_Config.attack_iscombo); + ini.SetInt("config", "assist_skill", m_Config.assist_skill); + ini.SetBool("config", "assist_iscombo", m_Config.assist_iscombo); + ini.SetInt("config", "assist_interval", m_Config.nAssistInterval); + ini.SetInt("config", "keeping_time", m_Config.nTime); + ini.SetInt("config", "autopick", m_Config.iAutoPickMode); + ini.SetInt("config", "petrol_radius", m_Config.nPetrolRadius); + + if (m_pPlayer != null) + { + string strFile = Path.Combine("userdata", "autopolicy", $"{m_pPlayer.GetHostPlayer().GetCharacterID()}.ini"); + ini.Save(strFile); + } + } +} + +// ===================== Hooks & tiny helpers ===================== +// Keep these minimal; replace by your real Lua + script value types. + +public static class AutoPolicyLuaHooks +{ + // return true if file registered/loaded + public static Func RegisterFile; + + // table, func, args, ret (ret can be null) + public static Action, List> CallLua; + + public static Action InitPlayerAPI; +} + +// Minimal script value +public readonly struct CScriptValue +{ + public readonly object Value; + public CScriptValue(object v) { Value = v; } +} + +// Very small INI helper (enough for this file) +public sealed class SimpleIni +{ + private readonly Dictionary> _data = new(StringComparer.OrdinalIgnoreCase); + + public static SimpleIni Load(string path) + { + var ini = new SimpleIni(); + string section = ""; + foreach (var raw in File.ReadLines(path)) + { + var line = raw.Trim(); + if (line.Length == 0) continue; + if (line.StartsWith(";") || line.StartsWith("#") || line.StartsWith("//")) continue; + + if (line.StartsWith("[") && line.EndsWith("]")) + { + section = line.Substring(1, line.Length - 2).Trim(); + if (!ini._data.ContainsKey(section)) + ini._data[section] = new Dictionary(StringComparer.OrdinalIgnoreCase); + continue; + } + + int eq = line.IndexOf('='); + if (eq <= 0) continue; + + string key = line.Substring(0, eq).Trim(); + string val = line.Substring(eq + 1).Trim(); + + if (!ini._data.TryGetValue(section, out var dict)) + { + dict = new Dictionary(StringComparer.OrdinalIgnoreCase); + ini._data[section] = dict; + } + + dict[key] = val; + } + + return ini; + } + + public int GetInt(string section, string key, int def) + { + if (_data.TryGetValue(section, out var s) && s.TryGetValue(key, out var v) && int.TryParse(v, out var r)) + return r; + return def; + } + + public bool GetBool(string section, string key, bool def) + { + if (_data.TryGetValue(section, out var s) && s.TryGetValue(key, out var v)) + { + if (v == "1") return true; + if (v == "0") return false; + if (bool.TryParse(v, out var r)) return r; + } + return def; + } + + public void SetInt(string section, string key, int value) => Set(section, key, value.ToString()); + public void SetBool(string section, string key, bool value) => Set(section, key, value ? "1" : "0"); + + private void Set(string section, string key, string value) + { + if (!_data.TryGetValue(section, out var s)) + { + s = new Dictionary(StringComparer.OrdinalIgnoreCase); + _data[section] = s; + } + s[key] = value; + } + + public void Save(string path) + { + using var sw = new StreamWriter(path); + foreach (var sect in _data) + { + sw.WriteLine($"[{sect.Key}]"); + foreach (var kv in sect.Value) + sw.WriteLine($"{kv.Key}={kv.Value}"); + sw.WriteLine(); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/AutoPolicy/CECAutoPolicy.cs.meta b/Assets/PerfectWorld/Scripts/AutoPolicy/CECAutoPolicy.cs.meta new file mode 100644 index 0000000000..854666ca1f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/AutoPolicy/CECAutoPolicy.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: df3c9b50fb2b12f4889649c8666fa10e \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Common/DataProcess/elementdataman.cs b/Assets/PerfectWorld/Scripts/Common/DataProcess/elementdataman.cs index 45aa4f3edb..cbc68f3bab 100644 --- a/Assets/PerfectWorld/Scripts/Common/DataProcess/elementdataman.cs +++ b/Assets/PerfectWorld/Scripts/Common/DataProcess/elementdataman.cs @@ -1875,7 +1875,6 @@ namespace ModelRenderer.Scripts.GameData // } // return id; //} - public object[] GetAllDataOfType(ID_SPACE idSpace, DATA_TYPE dataType) { List results = new List(); diff --git a/Assets/PerfectWorld/Scripts/Common/EC_Configs.cs b/Assets/PerfectWorld/Scripts/Common/EC_Configs.cs index 51a94a36d9..432df518bf 100644 --- a/Assets/PerfectWorld/Scripts/Common/EC_Configs.cs +++ b/Assets/PerfectWorld/Scripts/Common/EC_Configs.cs @@ -787,6 +787,11 @@ namespace BrewMonster public void DefaultUserSettings(ref EC_SYSTEM_SETTING pss, ref EC_VIDEO_SETTING pvs, ref EC_GAME_SETTING pgs, ref EC_BLACKLIST_SETTING pbs, ref EC_COMPUTER_AIDED_SETTING pcas) { + pss = new EC_SYSTEM_SETTING(); + pvs = new EC_VIDEO_SETTING(); + pgs = new EC_GAME_SETTING(); + pbs = new EC_BLACKLIST_SETTING(); + pcas = new EC_COMPUTER_AIDED_SETTING(); pss.Reset(); pvs.Reset(); pgs.Reset(); @@ -1075,7 +1080,7 @@ namespace BrewMonster using (BinaryReader reader = new BinaryReader(ms)) { uint dwVer = reader.ReadUInt32(); - + if (dwVer < 15) { DefaultUserConfigData(); @@ -1115,9 +1120,9 @@ namespace BrewMonster // Note: Would need EC_Game reference // g_pGame->GetA3DGFXExMan()->SetPriority(m_vs.nEffect); // Send force attack to server - /* byte forceAttack = glb_BuildPVPMask(false); - byte refuseBless = glb_BuildRefuseBLSMask(); - UnityGameSession.Instance.c2s_CmdNotifyForceAttack(forceAttack, refuseBless);*/ + byte forceAttack = EC_Utility.glb_BuildPVPMask(false); + byte refuseBless = EC_Utility.glb_BuildRefuseBLSMask(); + UnityGameSession.c2s_SendCmdNotifyForceAttack(forceAttack, refuseBless); } public void SetSceneLoadRadius(float fRadius) diff --git a/Assets/PerfectWorld/Scripts/Common/EC_Resource.cs b/Assets/PerfectWorld/Scripts/Common/EC_Resource.cs new file mode 100644 index 0000000000..e699ac5919 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Common/EC_Resource.cs @@ -0,0 +1,5 @@ +using UnityEngine; + +namespace BrewMonster +{ +} diff --git a/Assets/PerfectWorld/Scripts/Common/EC_Resource.cs.meta b/Assets/PerfectWorld/Scripts/Common/EC_Resource.cs.meta new file mode 100644 index 0000000000..0ae7e1884c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Common/EC_Resource.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1c12399ff0e62e146b5951b866e5ab91 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Common/Singleton.cs b/Assets/PerfectWorld/Scripts/Common/Singleton.cs index 5b16cdb2e1..8a84813091 100644 --- a/Assets/PerfectWorld/Scripts/Common/Singleton.cs +++ b/Assets/PerfectWorld/Scripts/Common/Singleton.cs @@ -17,5 +17,10 @@ namespace BrewMonster if (_instance.IsValueCreated) throw new InvalidOperationException($"Singleton<{typeof(T).Name}> already created!"); } + + protected virtual void Initialize() + { + + } } } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArrow.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrArrow.cs similarity index 79% rename from Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArrow.cs rename to Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrArrow.cs index b196cf02e4..6dd9d4b727 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArrow.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrArrow.cs @@ -17,9 +17,9 @@ namespace PerfectWorld.Scripts.Managers /// /// Arrow item class (cac loai mui ten) /// - public class EC_IvtrArrow : EC_IvtrEquip + public class CECIvtrArrow : EC_IvtrEquip { - protected IVTR_ESSENCE_ARROW m_Essence; // Arrow essence data + protected IVTR_ESSENCE_ARROW m_Essence; // Arrow essence data // Data in database protected PROJECTILE_TYPE m_pDBType; @@ -29,30 +29,30 @@ namespace PerfectWorld.Scripts.Managers /// /// Template id /// Expire date - public EC_IvtrArrow(int tid, int expire_date) : base(tid, expire_date) + public CECIvtrArrow(int tid, int expire_date) : base(tid, expire_date) { - m_iCID = (int)InventoryClassId.ICID_ARROW; + m_iCID = (int)InventoryClassId.ICID_ARROW; m_Essence = new IVTR_ESSENCE_ARROW(); // Get database data elementdataman pDB = ElementDataManProvider.GetElementDataMan(); DATA_TYPE DataType = DATA_TYPE.DT_INVALID; - m_pDBEssence = (PROJECTILE_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType); - m_pDBType = (PROJECTILE_TYPE)pDB.get_data_ptr((uint)m_pDBEssence.type, ID_SPACE.ID_SPACE_ESSENCE, ref DataType); + m_pDBEssence = (PROJECTILE_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType); + m_pDBType = (PROJECTILE_TYPE)pDB.get_data_ptr((uint)m_pDBEssence.type, ID_SPACE.ID_SPACE_ESSENCE, ref DataType); - m_iPileLimit = m_pDBEssence.pile_num_max; - m_iPrice = m_pDBEssence.price; - m_iShopPrice = m_pDBEssence.shop_price; - m_iProcType = (int)m_pDBEssence.proc_type; - m_i64EquipMask = EC_IvtrType.EQUIP_MASK64_PROJECTILE; + m_iPileLimit = m_pDBEssence.pile_num_max; + m_iPrice = m_pDBEssence.price; + m_iShopPrice = m_pDBEssence.shop_price; + m_iProcType = (int)m_pDBEssence.proc_type; + m_i64EquipMask = EC_IvtrType.EQUIP_MASK64_PROJECTILE; } - public EC_IvtrArrow(EC_IvtrArrow other) : base(other) + public CECIvtrArrow(CECIvtrArrow other) : base(other) { - m_pDBType = other.m_pDBType; - m_pDBEssence = other.m_pDBEssence; - m_Essence = other.m_Essence; + m_pDBType = other.m_pDBType; + m_pDBEssence = other.m_pDBEssence; + m_Essence = other.m_Essence; } public override bool SetItemInfo(byte[] pInfoData, int iDataLen) @@ -67,11 +67,11 @@ namespace PerfectWorld.Scripts.Managers CECDataReader dr = new CECDataReader(pInfoData, iDataLen); // Skip equip requirements and endurance - dr.Offset(5 * sizeof (int), CECDataReader.SEEK_CUR); + dr.Offset(5 * sizeof(int), CECDataReader.SEEK_CUR); int iEssenceSize = dr.ReadInt(); //ASSERT(iEssenceSize == sizeof (IVTR_ESSENCE_ARROW)); - + m_Essence = new IVTR_ESSENCE_ARROW(dr.ReadData(iEssenceSize)); } catch (Exception e) @@ -105,6 +105,8 @@ namespace PerfectWorld.Scripts.Managers } return base.GetName(); // Fallback to base class method } + public IVTR_ESSENCE_ARROW GetEssence() { return m_Essence; } + public PROJECTILE_TYPE GetDBSubType() { return m_pDBType; } // Get item description text protected override string GetNormalDesc(bool bRepair) @@ -128,22 +130,22 @@ namespace PerfectWorld.Scripts.Managers AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAMENUMBER), GetName(), m_iCount); else AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), GetName()); - + AddIDDescText(); AddExpireTimeDesc(); // Weapon requirement - AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_WEAPONREQ), m_Essence.iWeaponReqLow, + AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_WEAPONREQ), m_Essence.iWeaponReqLow, m_Essence.iWeaponReqHigh, m_pDBType.Name); // Damage enhance - if (m_pDBEssence.damage_enhance != 0) + if (m_pDBEssence.damage_enhance != 0) { AddDescText(-1, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ADDPHYDAMAGE)); AddDescText(-1, true, " %+d", m_pDBEssence.damage_enhance); } - + // Add addon properties if (strAddon.Length > 0) m_strDesc += strAddon; @@ -153,7 +155,7 @@ namespace PerfectWorld.Scripts.Managers // Suite description AddSuiteDesc(); - + // Extend description AddExtDescText(); diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrArrow.cs.meta b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrArrow.cs.meta new file mode 100644 index 0000000000..963f4d75ac --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrArrow.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f479e02d3a184f94bb046bc6cbf64ba1 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeapon.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrWeapon.cs similarity index 95% rename from Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeapon.cs rename to Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrWeapon.cs index 63ecbb8407..6c4ef2cabd 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeapon.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrWeapon.cs @@ -67,7 +67,7 @@ namespace PerfectWorld.Scripts.Managers /// /// Weapon item class (cac loai vu khi) /// - public class EC_IvtrWeapon : EC_IvtrEquip + public class CECIvtrWeapon : EC_IvtrEquip { //Attributes //Weapon essence data @@ -82,7 +82,7 @@ namespace PerfectWorld.Scripts.Managers /// Constructor for weapon item (cac loai vu khi) /// /// Template id - public EC_IvtrWeapon(int tid, int expire_date) : base(tid, expire_date) + public CECIvtrWeapon(int tid, int expire_date) : base(tid, expire_date) { m_iCID = (int)InventoryClassId.ICID_WEAPON; elementdataman pDB = ElementDataManProvider.GetElementDataMan(); @@ -100,7 +100,7 @@ namespace PerfectWorld.Scripts.Managers RepairFee = m_pDBEssence.repairfee; ReputationReq = m_pDBEssence.require_reputation; } - public EC_IvtrWeapon(EC_IvtrWeapon other) : base(other) + public CECIvtrWeapon(CECIvtrWeapon other) : base(other) { m_pDBEssence = other.m_pDBEssence; m_pDBMajorType = other.m_pDBMajorType; @@ -437,5 +437,41 @@ namespace PerfectWorld.Scripts.Managers { return m_Essence.weapon_level; } + + // Clone item + public override EC_IvtrItem Clone() + { + return new CECIvtrWeapon(this); + } + + // Get equipment type + public virtual int GetEquipmentType() + { + return 0; // EQUIP_WEAPON = 0 + } + + // The weapon is range weapon ? + public bool IsRangeWeapon() + { + return m_Essence.weapon_type == (int)WEAPON_TYPE.WEAPON_TYPE_RANGE; + } + + // Get essence data + public IVTR_ESSENCE_WEAPON GetEssence() + { + return m_Essence; + } + + // Get database data + public WEAPON_MAJOR_TYPE GetDBMajorType() + { + return m_pDBMajorType; + } + + public WEAPON_SUB_TYPE GetDBSubType() + { + return m_pDBSubType; + } + } } \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeapon.cs.meta b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrWeapon.cs.meta similarity index 100% rename from Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeapon.cs.meta rename to Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/CECIvtrWeapon.cs.meta diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArrow.cs.meta b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArrow.cs.meta deleted file mode 100644 index c85739af4b..0000000000 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArrow.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: d252cb1fcb2e946688fd6836548fd0d4 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrAutoMp.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrAutoMp.cs index ed77e2bee8..e51e89d92e 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrAutoMp.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrAutoMp.cs @@ -165,8 +165,9 @@ namespace PerfectWorld.Scripts.Managers } // Get item cool time - public int GetCoolTime(ref int piMax) + public override int GetCoolTime(out int piMax) { + piMax = 0; CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer(); return pHost != null ? pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_AUTOMP, out piMax) : 0; } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGeneralCard.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGeneralCard.cs index bbc1cd4fee..53e3c432cd 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGeneralCard.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrGeneralCard.cs @@ -3,6 +3,8 @@ namespace PerfectWorld.Scripts.Managers { public class EC_IvtrGeneralCard : EC_IvtrItem { + private IVTR_ESSENCE_GENERALCARD m_Essence; + /// /// Not create logic yet (add summary later) /// @@ -15,6 +17,11 @@ namespace PerfectWorld.Scripts.Managers public EC_IvtrGeneralCard(EC_IvtrGeneralCard other) : base(other) { } + + public IVTR_ESSENCE_GENERALCARD GetEssence() + { + return m_Essence; + } } } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs index 172d80ee42..28b72f2aa0 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs @@ -42,7 +42,7 @@ namespace BrewMonster.Scripts.Managers if (edm == null) return CacheAndReturn(templateId, ""); uint id = unchecked((uint)templateId); DATA_TYPE dATA_TYPE = default; - object data = edm.get_data_ptr(id, ID_SPACE.ID_SPACE_ESSENCE,ref dATA_TYPE); + object data = edm.get_data_ptr(id, ID_SPACE.ID_SPACE_ESSENCE, ref dATA_TYPE); string name = ExtractNameFromElement(data); if (string.IsNullOrEmpty(name)) { @@ -107,15 +107,15 @@ namespace BrewMonster.Scripts.Managers private Sprite LoadIconSpriteByKey(string key) { if (string.IsNullOrEmpty(key)) return null; - + // Load multi-sprite atlas if not already loaded if (_multiSpriteAtlas == null) { LoadMultiSpriteAtlas(); } - + if (_multiSpriteAtlas == null) return null; - + // Try to find sprite by name in the atlas if (_spriteNameToIndexCache.TryGetValue(key, out var index)) { @@ -124,7 +124,7 @@ namespace BrewMonster.Scripts.Managers return _multiSpriteAtlas[index]; } } - + // Fallback: try to find by name directly in the atlas foreach (var sprite in _multiSpriteAtlas) { @@ -133,7 +133,7 @@ namespace BrewMonster.Scripts.Managers return sprite; } } - + // Try lowercase/uppercase variants as fallback foreach (var sprite in _multiSpriteAtlas) { @@ -143,10 +143,10 @@ namespace BrewMonster.Scripts.Managers return sprite; } } - + return null; } - + private void LoadMultiSpriteAtlas() { try @@ -156,7 +156,7 @@ namespace BrewMonster.Scripts.Managers if (atlasSprites != null && atlasSprites.Length > 0) { _multiSpriteAtlas = atlasSprites; - + // Build name-to-index cache for faster lookups _spriteNameToIndexCache.Clear(); for (int i = 0; i < atlasSprites.Length; i++) @@ -166,7 +166,7 @@ namespace BrewMonster.Scripts.Managers _spriteNameToIndexCache[atlasSprites[i].name] = i; } } - + } else { @@ -280,7 +280,7 @@ namespace BrewMonster.Scripts.Managers { if (data == null) return ""; var t = data.GetType(); - + // Debug: Log all available fields and properties // Debug.Log($"[Inventory] Data type: {t.Name}"); var fields = t.GetFields(BindingFlags.Public | BindingFlags.Instance); @@ -301,7 +301,7 @@ namespace BrewMonster.Scripts.Managers // Debug.Log($"[Inventory] Method: {m.Name} ({m.ReturnType.Name})"); // } // } - + // Prefer decoding the raw fields first to control encoding (Unicode for Vietnamese), // then fall back to any string properties if needed. var fieldName = t.GetField("name", BindingFlags.Public | BindingFlags.Instance); @@ -313,7 +313,7 @@ namespace BrewMonster.Scripts.Managers { var rawData = string.Join(",", arr.Take(Math.Min(10, arr.Length))); } - + // Vietnamese names are stored as wide chars; decode as Unicode first. var s = ByteToStringUtils.UshortArrayToUnicodeString(arr); // Debug log to see what we're getting @@ -476,62 +476,62 @@ namespace BrewMonster.Scripts.Managers return hex; } - public int GetPileLimit(int templateId) - { - if (templateId <= 0) return 1; - if (_pileLimitCache.TryGetValue(templateId, out var cached)) return cached; - int limit = 1; - try - { - var edm = ElementDataManProvider.GetElementDataMan(); - if (edm != null) - { - uint id = unchecked((uint)templateId); - DATA_TYPE dt = DATA_TYPE.DT_INVALID; - object data = edm.get_data_ptr(id, ID_SPACE.ID_SPACE_ESSENCE, ref dt); - limit = ExtractPileLimitFromElement(data); - } - } - catch { } - if (limit <= 0) limit = 1; - _pileLimitCache[templateId] = limit; - return limit; - } + public int GetPileLimit(int templateId) + { + if (templateId <= 0) return 1; + if (_pileLimitCache.TryGetValue(templateId, out var cached)) return cached; + int limit = 1; + try + { + var edm = ElementDataManProvider.GetElementDataMan(); + if (edm != null) + { + uint id = unchecked((uint)templateId); + DATA_TYPE dt = DATA_TYPE.DT_INVALID; + object data = edm.get_data_ptr(id, ID_SPACE.ID_SPACE_ESSENCE, ref dt); + limit = ExtractPileLimitFromElement(data); + } + } + catch { } + if (limit <= 0) limit = 1; + _pileLimitCache[templateId] = limit; + return limit; + } - private int ExtractPileLimitFromElement(object data) - { - if (data == null) return 1; - var t = data.GetType(); - // Common field/property names across item essences - string[] names = new[] - { - "pilelimit", "pile_limit", "pileLimit", "stack", "stack_max", "stackMax", "max_stack", "maxStack" - }; - foreach (var name in names) - { - var f = t.GetField(name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); - if (f != null && (f.FieldType == typeof(int) || f.FieldType == typeof(uint) || f.FieldType == typeof(short) || f.FieldType == typeof(ushort) || f.FieldType == typeof(byte))) - { - try - { - var val = f.GetValue(data); - int limit = Convert.ToInt32(val); - if (limit > 0) return limit; - } - catch { } - } - var p = t.GetProperty(name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); - if (p != null && (p.PropertyType == typeof(int) || p.PropertyType == typeof(uint) || p.PropertyType == typeof(short) || p.PropertyType == typeof(ushort) || p.PropertyType == typeof(byte))) - { - try - { - var val = p.GetValue(data, null); - int limit = Convert.ToInt32(val); - if (limit > 0) return limit; - } - catch { } - } - } + private int ExtractPileLimitFromElement(object data) + { + if (data == null) return 1; + var t = data.GetType(); + // Common field/property names across item essences + string[] names = new[] + { + "pilelimit", "pile_limit", "pileLimit", "stack", "stack_max", "stackMax", "max_stack", "maxStack" + }; + foreach (var name in names) + { + var f = t.GetField(name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); + if (f != null && (f.FieldType == typeof(int) || f.FieldType == typeof(uint) || f.FieldType == typeof(short) || f.FieldType == typeof(ushort) || f.FieldType == typeof(byte))) + { + try + { + var val = f.GetValue(data); + int limit = Convert.ToInt32(val); + if (limit > 0) return limit; + } + catch { } + } + var p = t.GetProperty(name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); + if (p != null && (p.PropertyType == typeof(int) || p.PropertyType == typeof(uint) || p.PropertyType == typeof(short) || p.PropertyType == typeof(ushort) || p.PropertyType == typeof(byte))) + { + try + { + var val = p.GetValue(data, null); + int limit = Convert.ToInt32(val); + if (limit > 0) return limit; + } + catch { } + } + } return 1; } } @@ -703,6 +703,7 @@ namespace BrewMonster.Scripts.Managers public string m_strDesc = ""; // Item description public bool m_bIsInNPCPack; // true, this item is in NPC package public bool m_bLocalDetailData; // true, data from GetDetailDataFromLocal + public int m_iCurEndurance; // Current endurance public EC_Inventory m_pDescIvtr; // Inventory only used to get item description @@ -738,6 +739,8 @@ namespace BrewMonster.Scripts.Managers m_bIsInNPCPack = false; m_bLocalDetailData = false; m_pDescIvtr = null; + m_iCurEndurance = 0; + } public EC_IvtrItem(int tid, int expire_date) @@ -810,15 +813,14 @@ namespace BrewMonster.Scripts.Managers var pItem = new EC_IvtrItem(tid, expire_date); DATA_TYPE DataType = DATA_TYPE.DT_INVALID; object data = ElementDataManProvider.GetElementDataMan().get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType); - //Active this to log the data type of item when creating an item - //Debug.Log("Create item data: DataType: " + DataType + " tid: " + tid ); - switch(DataType) + //Debug.Log("Create item data: DataType: " + DataType); + switch (DataType) { case DATA_TYPE.DT_WEAPON_ESSENCE: - pItem = new EC_IvtrWeapon(tid, expire_date); + pItem = new CECIvtrWeapon(tid, expire_date); break; case DATA_TYPE.DT_PROJECTILE_ESSENCE: - pItem = new EC_IvtrArrow(tid, expire_date); + pItem = new CECIvtrArrow(tid, expire_date); break; case DATA_TYPE.DT_ARMOR_ESSENCE: pItem = new EC_IvtrArmor(tid, expire_date); @@ -1262,6 +1264,7 @@ namespace BrewMonster.Scripts.Managers #endregion #region Simple property-style accessors (1:1 with C++) + public int GetCurEndurance() { return m_iCurEndurance; } public int GetClassID() => m_iCID; public int GetTemplateID() => m_tid; @@ -1346,7 +1349,7 @@ namespace BrewMonster.Scripts.Managers { //itemdataman* pItemDataMan = g_pGame->GetItemDataMan(); object pData_temp = itemdataman.get_item_for_sell((uint)m_tid); - if(pData_temp == null) + if (pData_temp == null) { SetItemInfo(null, 0); SetLocalProps(); @@ -1416,34 +1419,34 @@ namespace BrewMonster.Scripts.Managers } // use specific color for the item price - if((int)DescriptipionMsg.ITEMDESC_COL_WHITE == col) + if ((int)DescriptipionMsg.ITEMDESC_COL_WHITE == col) { - if( m_iPrice >= 100000000) // 100 million + if (m_iPrice >= 100000000) // 100 million col = (int)DescriptipionMsg.ITEMDESC_COL_GREEN; - else if ( m_iPrice >= 10000000) // 10 million + else if (m_iPrice >= 10000000) // 10 million col = (int)DescriptipionMsg.ITEMDESC_COL_DARKGOLD; - else if ( m_iPrice >= 1000000) // 1 million + else if (m_iPrice >= 1000000) // 1 million col = (int)DescriptipionMsg.ITEMDESC_COL_YELLOW; } - + CECStringTab pDescTab = EC_Game.GetItemDesc(); if (m_iScaleType == (int)ScaleType.SCALE_OFFLINESHOP) { AddDescText(col, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PRICE)); - string s1,s2; + string s1, s2; BuildPriceNumberStr(m_iPrice, out s1); - if (GetCount()>1) + if (GetCount() > 1) { - s2 = (m_iPrice * (long)GetCount()).ToString(); + s2 = (m_iPrice * (long)GetCount()).ToString(); AddDescText(-1, false, " %s (%s)", s1, s2); } else - AddDescText(-1, false, " %s", s1); + AddDescText(-1, false, " %s", s1); } else if (m_iScaleType == (int)ScaleType.SCALE_BOOTH || m_tid == 21652) // 21651: yinpiao { - string s1; + string s1; BuildPriceNumberStr(m_iPrice, out s1); AddDescText(col, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_UNITPRICE)); @@ -1457,7 +1460,7 @@ namespace BrewMonster.Scripts.Managers AddDescText(col, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PRICE)); AddDescText(-1, false, " %s (%s)", s1, s2); - } + } else { string s1; @@ -1648,7 +1651,7 @@ namespace BrewMonster.Scripts.Managers var pDescTab = EC_Game.GetItemDesc(); // Note: ITEMDESC_COL2_BRIGHTBLUE constant - adjust based on actual string table / 注æ„:ITEMDESC_COL2_BRIGHTBLUEå¸¸é‡ - æ ¹æ®å®žé™…字符串表调整 int green = (int)DescriptipionMsg.ITEMDESC_COL2_BRIGHTBLUE; // ITEMDESC_COL2_BRIGHTBLUE placeholder - adjust this value - + if (m_iCID != (int)InventoryClassId.ICID_GOBLIN) // goblin does not need to display these special properties / 地精ä¸éœ€è¦æ˜¾ç¤ºè¿™äº›ç‰¹æ®Šå±žæ€§ { // Exact C++ logic: (PROC_NO_USER_TRASH) || (!PROC_BINDING && (PROC_DROPWHENDIE || ...)) @@ -1679,7 +1682,7 @@ namespace BrewMonster.Scripts.Managers m_strDesc += "\\r"; if (pDescTab != null && pDescTab.IsInitialized()) { - string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_DEAD_PROTECT); + string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_DEAD_PROTECT); if (!string.IsNullOrEmpty(desc)) m_strDesc += desc; } @@ -1689,7 +1692,7 @@ namespace BrewMonster.Scripts.Managers m_strDesc += "\\r"; if (pDescTab != null && pDescTab.IsInitialized()) { - string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NO_DROP); + string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NO_DROP); if (!string.IsNullOrEmpty(desc)) m_strDesc += desc; } @@ -1699,7 +1702,7 @@ namespace BrewMonster.Scripts.Managers m_strDesc += "\\r"; if (pDescTab != null && pDescTab.IsInitialized()) { - string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NO_TRADE); + string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NO_TRADE); if (!string.IsNullOrEmpty(desc)) m_strDesc += desc; } @@ -1709,7 +1712,7 @@ namespace BrewMonster.Scripts.Managers m_strDesc += "\\r"; if (pDescTab != null && pDescTab.IsInitialized()) { - string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NO_PLAYER_TRADE); + string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NO_PLAYER_TRADE); if (!string.IsNullOrEmpty(desc)) m_strDesc += desc; } @@ -1719,7 +1722,7 @@ namespace BrewMonster.Scripts.Managers m_strDesc += "\\r"; if (pDescTab != null && pDescTab.IsInitialized()) { - string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_LEAVE_SCENE_DISAPEAR); + string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_LEAVE_SCENE_DISAPEAR); if (!string.IsNullOrEmpty(desc)) m_strDesc += desc; } @@ -1729,7 +1732,7 @@ namespace BrewMonster.Scripts.Managers m_strDesc += "\\r"; if (pDescTab != null && pDescTab.IsInitialized()) { - string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_USE_AFTER_PICK_UP); + string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_USE_AFTER_PICK_UP); if (!string.IsNullOrEmpty(desc)) m_strDesc += desc; } @@ -1739,7 +1742,7 @@ namespace BrewMonster.Scripts.Managers m_strDesc += "\\r"; if (pDescTab != null && pDescTab.IsInitialized()) { - string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_DROP_WHEN_DEAD); + string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_DROP_WHEN_DEAD); if (!string.IsNullOrEmpty(desc)) m_strDesc += desc; } @@ -1749,7 +1752,7 @@ namespace BrewMonster.Scripts.Managers m_strDesc += "\\r"; if (pDescTab != null && pDescTab.IsInitialized()) { - string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_DROP_WHEN_OFFLINE); + string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_DROP_WHEN_OFFLINE); if (!string.IsNullOrEmpty(desc)) m_strDesc += desc; } @@ -1759,7 +1762,7 @@ namespace BrewMonster.Scripts.Managers m_strDesc += "\\r"; if (pDescTab != null && pDescTab.IsInitialized()) { - string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_UNREPAIRABLE); + string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_UNREPAIRABLE); if (!string.IsNullOrEmpty(desc)) m_strDesc += desc; } @@ -1769,7 +1772,7 @@ namespace BrewMonster.Scripts.Managers m_strDesc += "\\r"; if (pDescTab != null && pDescTab.IsInitialized()) { - string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NO_USER_TRASH); + string desc = pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NO_USER_TRASH); if (!string.IsNullOrEmpty(desc)) m_strDesc += desc; } @@ -1810,10 +1813,10 @@ namespace BrewMonster.Scripts.Managers protected void AddIDDescText() { // Optional: show internal id for debugging - #if UNITY_EDITOR - AddDescText(0, true, "ID: {0}", m_tid); - #endif - +#if UNITY_EDITOR + AddDescText(0, true, "ID: {0}", m_tid); +#endif + } protected void AddBindDescText() @@ -1948,7 +1951,7 @@ namespace BrewMonster.Scripts.Managers public string GetExtendedDescText() { string result = string.Empty; - + // Get extended description from item_ext_desc.txt using tid / 使用tid从item_ext_desc.txtèŽ·å–æ‰©å±•æè¿° string szExtDesc = TryGetItemExtDesc(); // Note: Original C++ had early return commented out / 注æ„:原始C++代ç çš„æ—©æœŸè¿”回被注释掉了 diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskDice.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskDice.cs index 934066e194..77db9842cb 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskDice.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrTaskDice.cs @@ -80,6 +80,11 @@ namespace PerfectWorld.Scripts.Managers { return m_pDBEssence.FileMatter; } + + public TASKDICE_ESSENCE GetDBEssence() + { + return m_pDBEssence; + } } } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrType.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrType.cs index 07e9ab0e01..3ecaf3f726 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrType.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrType.cs @@ -51,25 +51,25 @@ namespace BrewMonster.Scripts.Managers SIZE_GENERALCARD_EQUIPIVTR = SIZE_ALL_EQUIPIVTR - EQUIPIVTR_GENERALCARD1, } #region Inventory Essence Struct - #pragma pack(1) +#pragma pack(1) public struct IVTR_ESSENCE_WEAPON { - public short weapon_type; - public short weapon_dealy; - public int weapon_class; - public int weapon_level; - public int require_projectile; // ��Ҫ��ҩ������ - public int damage_low; // ����������С��ֵ - public int damage_high; // ������������ֵ - public int magic_damage_low; // ħ������ - public int magic_damage_high; // ħ������ - // public int attack; // ������ - public int attack_speed; - public float attack_range; - public float attack_short_range; - public IVTR_ESSENCE_WEAPON( byte[] data) + public short weapon_type; + public short weapon_dealy; + public int weapon_class; + public int weapon_level; + public int require_projectile; // ��Ҫ��ҩ������ + public int damage_low; // ����������С��ֵ + public int damage_high; // ������������ֵ + public int magic_damage_low; // ħ������ + public int magic_damage_high; // ħ������ + // public int attack; // ������ + public int attack_speed; + public float attack_range; + public float attack_short_range; + public IVTR_ESSENCE_WEAPON(byte[] data) { - CECDataReader dr = new (data, data.Length); + CECDataReader dr = new(data, data.Length); weapon_type = dr.ReadShort(); weapon_dealy = dr.ReadShort(); weapon_class = dr.ReadInt(); @@ -86,14 +86,14 @@ namespace BrewMonster.Scripts.Managers }; public struct IVTR_ESSENCE_ARROW { - public int dwBowMask; - public int iDamage; - public int iDamageScale; - public int iWeaponReqLow; - public int iWeaponReqHigh; + public int dwBowMask; + public int iDamage; + public int iDamageScale; + public int iWeaponReqLow; + public int iWeaponReqHigh; public IVTR_ESSENCE_ARROW(byte[] data) { - CECDataReader dr = new (data, data.Length); + CECDataReader dr = new(data, data.Length); dwBowMask = dr.ReadInt(); iDamage = dr.ReadInt(); iDamageScale = dr.ReadInt(); @@ -103,20 +103,20 @@ namespace BrewMonster.Scripts.Managers }; public struct IVTR_ESSENCE_DECORATION { - public int damage; - public int magic_damage; - public int defense; - public int armor; - public int[] resistance; + public int damage; + public int magic_damage; + public int defense; + public int armor; + public int[] resistance; public IVTR_ESSENCE_DECORATION(byte[] data) { - CECDataReader dr = new (data, data.Length); + CECDataReader dr = new(data, data.Length); damage = dr.ReadInt(); magic_damage = dr.ReadInt(); defense = dr.ReadInt(); armor = dr.ReadInt(); resistance = new int[InventoryConst.NUM_MAGICCLASS]; - for(int i = 0; i < InventoryConst.NUM_MAGICCLASS; i++) + for (int i = 0; i < InventoryConst.NUM_MAGICCLASS; i++) { resistance[i] = dr.ReadInt(); } @@ -134,12 +134,12 @@ namespace BrewMonster.Scripts.Managers { Debug.Log("IVTR_ESSENCE_ARMOR: data.Length: " + data.Length); resistance = new int[InventoryConst.NUM_MAGICCLASS]; - CECDataReader dr = new (data, data.Length); + CECDataReader dr = new(data, data.Length); defense = dr.ReadInt(); armor = dr.ReadInt(); mp_enhance = dr.ReadInt(); hp_enhance = dr.ReadInt(); - for(int i = 0; i < InventoryConst.NUM_MAGICCLASS; i++) + for (int i = 0; i < InventoryConst.NUM_MAGICCLASS; i++) { resistance[i] = dr.ReadInt(); } @@ -152,7 +152,7 @@ namespace BrewMonster.Scripts.Managers public ushort gender; public IVTR_ESSENCE_FASHION(byte[] data) { - CECDataReader dr = new (data, data.Length); + CECDataReader dr = new(data, data.Length); require_level = dr.ReadInt(); color = dr.ReadUShort(); gender = dr.ReadUShort(); @@ -160,18 +160,18 @@ namespace BrewMonster.Scripts.Managers }; public struct IVTR_ESSENCE_FLYSWORD { - public int cur_time; - public int max_time; - public short require_level; - public char level; - public char improve_level; - public int profession; - public int time_per_element; - public float speed_increase; - public float speed_increase2; + public int cur_time; + public int max_time; + public short require_level; + public char level; + public char improve_level; + public int profession; + public int time_per_element; + public float speed_increase; + public float speed_increase2; public IVTR_ESSENCE_FLYSWORD(byte[] data) { - CECDataReader dr = new (data, data.Length); + CECDataReader dr = new(data, data.Length); cur_time = dr.ReadInt(); max_time = dr.ReadInt(); require_level = dr.ReadShort(); @@ -193,46 +193,46 @@ namespace BrewMonster.Scripts.Managers }; public struct IVTR_ESSENCE_AUTOHP { - public int hp_left; + public int hp_left; public float trigger; public IVTR_ESSENCE_AUTOHP(byte[] data) { - CECDataReader dr = new (data, data.Length); + CECDataReader dr = new(data, data.Length); hp_left = dr.ReadInt(); trigger = dr.ReadFloat(); } }; public struct IVTR_ESSENCE_AUTOMP { - public int mp_left; + public int mp_left; public float trigger; public IVTR_ESSENCE_AUTOMP(byte[] data) { - CECDataReader dr = new (data, data.Length); + CECDataReader dr = new(data, data.Length); mp_left = dr.ReadInt(); trigger = dr.ReadFloat(); } }; public struct IVTR_ESSENCE_PETEGG { - public int req_level; - public int req_class; - public int honor_point; - public int pet_tid; - public int pet_vis_tid; - public int pet_egg_tid; - public int pet_class; - public short level; - public ushort color; - public int exp; - public int skill_point; - public ushort name_len; - public ushort skill_count; + public int req_level; + public int req_class; + public int honor_point; + public int pet_tid; + public int pet_vis_tid; + public int pet_egg_tid; + public int pet_class; + public short level; + public ushort color; + public int exp; + public int skill_point; + public ushort name_len; + public ushort skill_count; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] - public ushort[] name; + public ushort[] name; public IVTR_ESSENCE_PETEGG(byte[] data) { - CECDataReader dr = new (data, data.Length); + CECDataReader dr = new(data, data.Length); req_level = dr.ReadInt(); req_class = dr.ReadInt(); honor_point = dr.ReadInt(); @@ -247,7 +247,7 @@ namespace BrewMonster.Scripts.Managers name_len = dr.ReadUShort(); skill_count = dr.ReadUShort(); name = new ushort[8]; - for(int i = 0; i < 8; i++) + for (int i = 0; i < 8; i++) { name[i] = dr.ReadUShort(); } @@ -270,14 +270,14 @@ namespace BrewMonster.Scripts.Managers public short agility; public short vitality; public short energy; - public short total_genius; - public short[] genius ; + public short total_genius; + public short[] genius; public short refine_level; - public int stamina; - public int status_value; + public int stamina; + public int status_value; public _GOBLIN_DATA(byte[] data) { - CECDataReader dr = new (data, data.Length); + CECDataReader dr = new(data, data.Length); exp = dr.ReadUInt(); level = dr.ReadShort(); total_attribute = dr.ReadShort(); @@ -287,7 +287,7 @@ namespace BrewMonster.Scripts.Managers energy = dr.ReadShort(); total_genius = dr.ReadShort(); genius = new short[5]; - for(int i = 0; i < 5; i++) + for (int i = 0; i < 5; i++) { genius[i] = dr.ReadShort(); } @@ -301,7 +301,7 @@ namespace BrewMonster.Scripts.Managers public int skill_cnt; public IVTR_ESSENCE_GOBLIN(byte[] data) { - CECDataReader dr = new (data, data.Length); + CECDataReader dr = new(data, data.Length); // Calculate size manually: uint(4) + 7*short(14) + short[5](10) + short(2) + 2*int(8) = 40 bytes const int GOBLIN_DATA_SIZE = 40; this.data = new _GOBLIN_DATA(dr.ReadData(GOBLIN_DATA_SIZE)); @@ -348,7 +348,7 @@ namespace BrewMonster.Scripts.Managers public struct IVTR_ESSENCE_GENERALCARD { // TODO : implement data later - // int type; + public int type; // int rank; // int require_level; // int require_leadership; @@ -357,8 +357,8 @@ namespace BrewMonster.Scripts.Managers // int exp; // int rebirth_times; }; - #pragma pack() - +#pragma pack() + #endregion public static class EC_IvtrType { @@ -728,9 +728,9 @@ namespace BrewMonster.Scripts.Managers { if (sub.id != armorSubTypeId) continue; uint mask = sub.equip_mask; - + // Check finger slots first - try to find an empty one - if ((mask & (1u << (int)IndexOfIteminEquipmentInventory.EQUIPIVTR_FINGER1)) != 0 || + if ((mask & (1u << (int)IndexOfIteminEquipmentInventory.EQUIPIVTR_FINGER1)) != 0 || (mask & (1u << (int)IndexOfIteminEquipmentInventory.EQUIPIVTR_FINGER2)) != 0) { var availableFingerSlot = GetAvailableFingerSlot(); @@ -739,7 +739,7 @@ namespace BrewMonster.Scripts.Managers return availableFingerSlot; } } - + // For other slots, return the first matching one (original behavior) if ((mask & (1u << (int)IndexOfIteminEquipmentInventory.EQUIPIVTR_HEAD)) != 0) return IndexOfIteminEquipmentInventory.EQUIPIVTR_HEAD; if ((mask & (1u << (int)IndexOfIteminEquipmentInventory.EQUIPIVTR_SHOULDER)) != 0) return IndexOfIteminEquipmentInventory.EQUIPIVTR_SHOULDER; @@ -764,9 +764,9 @@ namespace BrewMonster.Scripts.Managers { if (sub.id != decorationSubTypeId) continue; uint mask = sub.equip_mask; - + // Check finger slots first - try to find an empty one - if ((mask & (1u << (int)IndexOfIteminEquipmentInventory.EQUIPIVTR_FINGER1)) != 0 || + if ((mask & (1u << (int)IndexOfIteminEquipmentInventory.EQUIPIVTR_FINGER1)) != 0 || (mask & (1u << (int)IndexOfIteminEquipmentInventory.EQUIPIVTR_FINGER2)) != 0) { var availableFingerSlot = GetAvailableFingerSlot(); @@ -775,7 +775,7 @@ namespace BrewMonster.Scripts.Managers return availableFingerSlot; } } - + // For other slots, return the first matching one (original behavior) if ((mask & (1u << (int)IndexOfIteminEquipmentInventory.EQUIPIVTR_NECK)) != 0) return IndexOfIteminEquipmentInventory.EQUIPIVTR_NECK; if ((mask & (1u << (int)IndexOfIteminEquipmentInventory.EQUIPIVTR_WAIST)) != 0) return IndexOfIteminEquipmentInventory.EQUIPIVTR_WAIST; @@ -801,18 +801,35 @@ namespace BrewMonster.Scripts.Managers { return IndexOfIteminEquipmentInventory.EQUIPIVTR_FINGER1; } - + // Check if FINGER2 slot is empty var finger2Item = equipInv?.GetItem((int)IndexOfIteminEquipmentInventory.EQUIPIVTR_FINGER2, false); if (finger2Item == null) { return IndexOfIteminEquipmentInventory.EQUIPIVTR_FINGER2; } - + // Both slots are occupied, return FINGER1 as fallback (original behavior) return IndexOfIteminEquipmentInventory.EQUIPIVTR_FINGER1; } } + // Weapon type + public enum WeaponType + { + WEAPONTYPE_MELEE = 0, + WEAPONTYPE_RANGE = 1, + }; + public enum InventoryType + { + IVTRTYPE_PACK = 0, // Normal pack + IVTRTYPE_EQUIPPACK, // Equipment + IVTRTYPE_TASKPACK, // Task pack + IVTRTYPE_TRASHBOX, // Trash box + IVTRTYPE_TRASHBOX2, // Trash box - material box + IVTRTYPE_TRASHBOX3, // Trash box - fashion box + IVTRTYPE_ACCOUNT_BOX, // User account box + IVTRTYPE_GENERALCARD_BOX, // ¿¨Åưü¹ü + }; } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_Skill.cs b/Assets/PerfectWorld/Scripts/Managers/EC_Skill.cs index 6266bf6d04..538201d76e 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_Skill.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_Skill.cs @@ -75,6 +75,7 @@ namespace BrewMonster // CECSkill class public class CECSkill { + // Skill type enum public enum SkillType { @@ -194,7 +195,6 @@ namespace BrewMonster // iTotalTime: total cooling time, 0 means to use cooling time in database public void StartCooling(int iTotalTime, int iStartCnt) { - BMLogger.LogError($"StartCooling iTotalTime={iTotalTime}, iStartCnt={iStartCnt}"); m_iCoolTime = iTotalTime != 0 ? iTotalTime : GetCoreCoolingTime(); m_iCoolCnt = iStartCnt; m_bCooling = true; @@ -293,15 +293,28 @@ namespace BrewMonster return string.Empty; StringBuilder sb = new StringBuilder(1024); - var skillStr = l_SkillStr as SkillStr; - string result = m_pSkillCore.GetIntroduction(sb, 1024, skillStr); - return result; + m_pSkillCore.GetIntroduction(sb, l_SkillStr); + return sb.ToString(); } + public static bool GetDesc(int idSkill, int iLevel, string szText, int iBufLen) + { + if (szText == null || iBufLen == 0) + return false; + CECSkill pSkill = new CECSkill(idSkill, iLevel); + if (pSkill == null) + { + return false; + } + string sz = pSkill.GetDesc(); + + return true; + } public int GetCoreCoolingTime() { return m_pSkillCore != null ? m_pSkillCore.GetCoolingTime() : 0; } + public int GetComboSkPreSkill() { return m_pSkillCore.GetComboSkPreSkill(); } public int GetExecuteTime() { diff --git a/Assets/PerfectWorld/Scripts/ModelFiles/CECComboSkillState.cs b/Assets/PerfectWorld/Scripts/ModelFiles/CECComboSkillState.cs index 849254b5eb..86aacf278f 100644 --- a/Assets/PerfectWorld/Scripts/ModelFiles/CECComboSkillState.cs +++ b/Assets/PerfectWorld/Scripts/ModelFiles/CECComboSkillState.cs @@ -1,3 +1,6 @@ +using BrewMonster.Scripts.Skills; +using NUnit.Framework; +using System; using System.Collections.Generic; using UnityEngine; @@ -19,7 +22,19 @@ namespace BrewMonster set => instance = value; } - private Dictionary m_inherentSkillMap = new Dictionary(); + private readonly Dictionary m_inherentSkillMap = new Dictionary(); + private readonly List m_activeSkills = new(); + private readonly List m_skillStayTime = new(); + private readonly List m_skillTimeOut = new(); + List m_preSkillSet = new List(); // ËùÓÐÊÇÆäËü¼¼ÄÜǰÌáµÄ¼¼ÄÜ + + uint m_dwStartTime; // ¼¼Äܼ¤»î¿ªÊ¼Ê±¼ä + + public ComboSkillState m_comboSkillState { get; private set; } + public DateTime? ComboStateStartTime { get; private set; } + public IReadOnlyList ActiveComboSkills => m_activeSkills; + public IReadOnlyList SkillStayTimes => m_skillStayTime; + public IReadOnlyList SkillTimeouts => m_skillTimeOut; public CECSkill GetInherentSkillByID(uint skillID) { @@ -32,5 +47,158 @@ namespace BrewMonster return null; } } + + public void SetComboSkillState(Dictionary skillDic, ref ComboSkillState state) + { + m_comboSkillState = state; + if (state.skillid != 0) + { + m_dwStartTime = (uint)Time.realtimeSinceStartup * 1000; + SetActiveComboSkills(skillDic); + /* CECComboSkillChange change(CECComboSkillChange::COMBOSKILL_ACTIVE); + NotifyObservers(&change);*/ + } + else + { + m_dwStartTime = 0; + m_activeSkills.Clear(); + m_skillStayTime.Clear(); + m_skillTimeOut.Clear(); + /*CECComboSkillChange change(CECComboSkillChange::COMBOSKILL_STOP); + NotifyObservers(&change);*/ + } + } + public ComboSkillState GetComboSkillState() + { + return m_comboSkillState; + } + void SetActiveComboSkills(Dictionary dic) + { + Dictionary newList = new Dictionary(); + FilterComboSkills(dic, newList); + + m_activeSkills.Clear(); + m_skillStayTime.Clear(); + m_skillTimeOut.Clear(); + List juniorSkills = new List(); + int i; + foreach (var skill in newList) + { + int skillID = (int)skill.Key; + int skillTime = skill.Value; + m_activeSkills.Add((uint)skillID); + m_skillStayTime.Add((uint)skillTime); + m_skillTimeOut.Add(false); + if (m_inherentSkillMap.ContainsKey((uint)skillID)) + { + juniorSkills.Add((uint)GetFirstChildRecursively(skillID)); + } + else + { + juniorSkills.Add((uint)skillID); + } + + } + // ðÅÝÅÅÐò£ºÓкóÐø¼¼ÄܵķÅÔÚÇ°Ãæ£»×îԭʼµÄ³õ¼¶¼¼ÄÜidСµÄ·ÅÔÚÇ°Ãæ + int j; + for (i = m_activeSkills.Count - 1; i > 0; i--) + { + for (j = 0; j < i; j++) + { + bool bPreSkill1 = IsComboPreSkill(juniorSkills[j]); + bool bPreSkill2 = IsComboPreSkill(juniorSkills[j + 1]); + if ((!bPreSkill1 && bPreSkill2) || (bPreSkill1 == bPreSkill2 && juniorSkills[j] > juniorSkills[j + 1])) + { + EC_Utility.Swap(m_activeSkills, j, j + 1); + EC_Utility.Swap(m_skillStayTime, j, j + 1); + EC_Utility.Swap(juniorSkills, j, j + 1); + } + } + } + } + public bool IsActiveComboSkill(uint skillID) + { + for (int i = 0; i < m_activeSkills.Count; i++) + { + if (m_activeSkills[i] == skillID && m_skillTimeOut[i] == false) + { + return true; + } + } + return false; + } + + public bool IsComboPreSkill(uint skillID) + { + return m_preSkillSet.Contains(skillID); + } + int GetFirstChildRecursively(int iSkillID) + { + Dictionary vecJuniors = CECHostSkillModel.Instance.GetJunior(iSkillID); + if (vecJuniors.Count == 0) + { + return iSkillID; + } + else + { + foreach (var skill in vecJuniors) + { + int iComboPreSkill = ElementSkill.GetComboSkPreSkill(skill.Key); + if (iComboPreSkill != 0) + { + return GetFirstChildRecursively((int)skill.Key); + } + } + return iSkillID; + } + } + void FilterComboSkills(Dictionary inDic, Dictionary outDic) + { + outDic.Clear(); + CECTaoistRank pCurTaoistRank = CECTaoistRank.GetTaoistRank(CECGameRun.Instance.GetHostPlayer().GetBasicProps().iLevel2); + CECHostSkillModel hostSkillModel = CECHostSkillModel.Instance; + uint i; + foreach (var skill in inDic) + { + uint uiSkillID = skill.Key; + if (!m_inherentSkillMap.ContainsKey(uiSkillID)) + { + // Èç¹û²»ÊÇÌìÉú¼¼ÄÜ£¬ÔòÖ´ÐйýÂË + enumEvilGod skillEvilGod = hostSkillModel.GetSkillEvilGod((int)uiSkillID); + enumSkillLearnedState skillLearnState = hostSkillModel.GetSkillLearnedState((int)uiSkillID); + // Èç¹û¸Ã¼¼ÄÜÒѱ»¸²¸Ç£¬ÔòÈ¥µô + if (enumSkillLearnedState.SKILL_OVERRIDDEN == skillLearnState) + { + continue; + } + // Èç¹ûÊÇħ¼¼ÄÜÇÒÈËÎïÐÞÕæÎªÆÕͨ»òÏÉ£¬ÔòÈ¥µô + if (enumEvilGod.SKILL_EVIL == skillEvilGod) + { + if (pCurTaoistRank.IsBaseRank() || pCurTaoistRank.IsGodRank()) + { + continue; + } + } + // Èç¹ûÊÇÏɼ¼ÄÜÇÒÈËÎïÐÞÕæÎªÆÕͨ»òħ£¬ÔòÈ¥µô + if (enumEvilGod.SKILL_GOD == skillEvilGod) + { + if (pCurTaoistRank.IsBaseRank() || pCurTaoistRank.IsEvilRank()) + { + continue; + } + } + // Èç¹ûÊÇÏÉħ¼¼ÄÜÇÒδѧϰ£¬ÔòÈ¥µô + if (enumEvilGod.SKILL_GOD == skillEvilGod || skillEvilGod == enumEvilGod.SKILL_EVIL) + { + if (enumSkillLearnedState.SKILL_NOT_LEARNED == skillLearnState) + { + continue; + } + } + } + outDic[skill.Key] = skill.Value; + } + + } } } \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/ModelFiles/CECTaoistRank.cs b/Assets/PerfectWorld/Scripts/ModelFiles/CECTaoistRank.cs index b26e6487e4..0ecaca5d44 100644 --- a/Assets/PerfectWorld/Scripts/ModelFiles/CECTaoistRank.cs +++ b/Assets/PerfectWorld/Scripts/ModelFiles/CECTaoistRank.cs @@ -20,7 +20,7 @@ namespace BrewMonster BMLogger.Log("CECTaoistRank OnPlay Reset"); initComplete = false; CECTaoistRank[] s_allTaoistRanks = new CECTaoistRank[(int)ToaistRank.TotalRankCount]; - } + } #endif public int GetID() { @@ -75,7 +75,10 @@ namespace BrewMonster init(); return s_allTaoistRanks[(int)ToaistRank.BaseRankCount + (int)ToaistRank.GodRankCount - 1]; } - + public bool IsBaseRank() + { + return !IsGodRank() && !IsEvilRank(); + } public bool IsEvilRank() { CECTaoistRank EvilRank; diff --git a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs index fbc28b774d..cb153ef0e2 100644 --- a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs @@ -1414,7 +1414,10 @@ namespace BrewMonster } // Get character ID - // Play Gfx on Models + public static int GetRealmLayer(int realmLevel) { return realmLevel != 0 ? (realmLevel + 9) / 10 : 0; } + + public static int GetRealmSubLevel(int realmLevel) { return realmLevel != 0 ? (realmLevel % 10 != 0 ? realmLevel % 10 : 10) : 0; } + protected bool PlayGfx(string szPath, string szHook, float fScale /*1.0f*/, uint iShapeTypeMask /*(1<((byte[])Msg.dwParam1); + cmd_object_invisible pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1); if (pCmd.invisible_degree > 0) { @@ -1032,7 +1032,7 @@ public class CECNPC : CECObject } public void StopMoveTo(cmd_object_stop_move cmd) { - BMLogger.LogMono(this,"CECNPC::StopMoveTo"); + BMLogger.LogMono(this, "CECNPC::StopMoveTo"); if (IsDead()) return; BMLogger.LogMono(this, "CECNPC::StopMoveTo not dead"); @@ -1517,6 +1517,7 @@ public class CECNPC : CECObject m_pNPCModelPolicy.PlayModelAction(iAction, bRestart, null); } bool IsDisappearing() { return m_DisappearCnt.GetCounter() != 0 ? true : false; } + public int GetTemplateID() { return m_NPCInfo.tid; } public float GetTouchRadius() { return m_fTouchRad; } diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs index f390502569..f3b5976d31 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs @@ -341,6 +341,16 @@ namespace CSNetwork.C2SCommand var cmdBuf = SerializeCommand(CommandID.CAST_POS_SKILL, cmd); return cmdBuf; } + public static Octets CreateNotifyForceAttack(int iForceAttack, byte refuseBless) + { + var cmd = new cmd_notify_force_attack + { + force_attack = (byte)iForceAttack, + refuse_bless = refuseBless + }; + var cmdBuf = SerializeCommand(CommandID.NOTIFY_FORCE_ATTACK, cmd); + return cmdBuf; + } public static short FloatToFix8(float x) { diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs index 64aa312d3c..6f0e210d81 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs @@ -1253,6 +1253,14 @@ namespace CSNetwork.GPDataType public uint content_length; public byte[] content; }; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_combo_skill_prepare + { + public int skill_id; + public int timestamp; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public int[] args; + }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct cmd_host_start_attack @@ -1643,7 +1651,7 @@ namespace CSNetwork.GPDataType { return (id & 0x80000000) != 0 && (id & 0x40000000) == 0; } - public static string ReplacePercentD(string fmt, params object[] args) + public static string ReplacePercentD(string fmt, params object[] args) { if (string.IsNullOrEmpty(fmt) || args == null || args.Length == 0) return fmt; @@ -2271,30 +2279,31 @@ namespace CSNetwork.GPDataType public byte is_active; }; public struct cmd_reincarnation_tome_info - { - public int tome_exp; - public char tome_active; // 1����0��� - public int count; - public struct _entry - { - public int level; - public int timestamp; - public int exp; - }; + { + public int tome_exp; + public char tome_active; // 1����0��� + public int count; + public struct _entry + { + public int level; + public int timestamp; + public int exp; + }; public _entry[] records; - public bool CheckValid(int buf_size, out int sz) - { sz = 0; - if (count < 0) - return false; - sz = Marshal.SizeOf() - Marshal.SizeOf<_entry[]>(); - sz += count * Marshal.SizeOf<_entry>(); - return buf_size >= sz; - } - }; + public bool CheckValid(int buf_size, out int sz) + { + sz = 0; + if (count < 0) + return false; + sz = Marshal.SizeOf() - Marshal.SizeOf<_entry[]>(); + sz += count * Marshal.SizeOf<_entry>(); + return buf_size >= sz; + } + }; // Pet type public enum GP_PET_TYPE - { + { GP_PET_CLASS_INVALID = -1, GP_PET_CLASS_MOUNT = 0, // ��� GP_PET_CLASS_COMBAT, // ս������ @@ -2304,13 +2313,13 @@ namespace CSNetwork.GPDataType GP_PET_CLASS_EVOLUTION, // ������ GP_PET_CLASS_MAX, }; - + public struct PetSkill { public int skill; public int level; - } + } public struct _evo_prop { public int r_attack; @@ -2322,29 +2331,29 @@ namespace CSNetwork.GPDataType } public enum GP_PET_SKILL_NUM { - GP_PET_SKILL_NUM = 8 + GP_PET_SKILL_NUM = 8 }; public struct info_pet - { - public int honor_point; // �øж� - public int hunger; // ������ - public int feed_time; // �ϴ�ι�������ڵ�ʱ�� - public int pet_tid; // ������ID - public int pet_vis_tid; // ����Ŀɼ�ID�����Ϊ0�����ʾ������ɼ�ID�� - public int pet_egg_tid; // ���ﵰ��ID - public int pet_class; // �������� ս�裬��裬���ͳ� - public float hp_factor; // Ѫ��������������ջ�ʱʹ�ã� 0������ - public short level; // ���V�� - public ushort color; // ������ɫ�����λΪ1��ʾ��Ч��Ŀǰ���������Ч - public int exp; // ���ﵱǰ���� - public int skill_point; // ʣ�༼�ܵ� - public char is_bind; // �Ƿ����˺�һ��������һ��Mask��0x01 ���˺�һ��0x02 Ѱ�����ɽ��� - public char unused; // Ŀǰ������Ч - public ushort name_len; // ���ֳ��� Ŀǰ������Ч����Ϊ�߻������������� - public char[] name; // �������� - public PetSkill[] skills; + { + public int honor_point; // �øж� + public int hunger; // ������ + public int feed_time; // �ϴ�ι�������ڵ�ʱ�� + public int pet_tid; // ������ID + public int pet_vis_tid; // ����Ŀɼ�ID�����Ϊ0�����ʾ������ɼ�ID�� + public int pet_egg_tid; // ���ﵰ��ID + public int pet_class; // �������� ս�裬��裬���ͳ� + public float hp_factor; // Ѫ��������������ջ�ʱʹ�ã� 0������ + public short level; // ���V�� + public ushort color; // ������ɫ�����λΪ1��ʾ��Ч��Ŀǰ���������Ч + public int exp; // ���ﵱǰ���� + public int skill_point; // ʣ�༼�ܵ� + public char is_bind; // �Ƿ����˺�һ��������һ��Mask��0x01 ���˺�һ��0x02 Ѱ�����ɽ��� + public char unused; // Ŀǰ������Ч + public ushort name_len; // ���ֳ��� Ŀǰ������Ч����Ϊ�߻������������� + public char[] name; // �������� + public PetSkill[] skills; public _evo_prop evo_prop; - public int[] reserved; // � + public int[] reserved; // � public info_pet(bool isDefault = true) { honor_point = 0; @@ -2364,7 +2373,8 @@ namespace CSNetwork.GPDataType name_len = 0; name = new char[16]; skills = new PetSkill[(int)GP_PET_SKILL_NUM.GP_PET_SKILL_NUM]; - evo_prop = new _evo_prop{ + evo_prop = new _evo_prop + { r_attack = 0, r_defense = 0, r_hp = 0, @@ -2374,6 +2384,17 @@ namespace CSNetwork.GPDataType }; reserved = new int[10]; } - }; + }; + public enum REFUSE_BLESS_MASK : byte + { + REFUSE_NEUTRAL_BLESS = 0x0001, // ²»½ÓÊÜÖÃÃÔ×£¸£ + REFUSE_NON_TEAMMATE_BLESS = 0x0002, // ²»½ÓÊܷǶÓÓÑ×£¸£ + }; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_notify_force_attack + { + public byte force_attack; + public byte refuse_bless; + }; } diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs index ba2801c8bb..95ed946f22 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs @@ -994,6 +994,8 @@ namespace CSNetwork else if (ISNPCID(pCmd3.caster)) EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_ENCHANTRESULT, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader); break; + case CommandID.HOST_STOP_SKILL: + case CommandID.SELF_SKILL_INTERRUPTED: case CommandID.SKILL_PERFORM: EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_CASTSKILL, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader); break; @@ -1399,6 +1401,12 @@ namespace CSNetwork SendProtocol(gamedatasend); } + public void c2s_SendCmdNotifyForceAttack(int iForceAttack, byte refuseBless) + { + gamedatasend gamedatasend = new gamedatasend(); + gamedatasend.Data = C2SCommandFactory.CreateNotifyForceAttack(iForceAttack, refuseBless); + SendProtocol(gamedatasend); + } public void c2s_SendCmdContinueAction() { gamedatasend gamedatasend = new gamedatasend(); diff --git a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs index db09114a1a..9e8ecf3be7 100644 --- a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs @@ -510,6 +510,10 @@ namespace BrewMonster.Network public static void c2s_CmdNPCSevHeal() { + } + public static void c2s_SendCmdNotifyForceAttack(int iForceAttack, byte refuseBless) + { + Instance._gameSession.c2s_SendCmdNotifyForceAttack(iForceAttack, refuseBless); } public static void c2s_CmdNPCSevAcceptTask(int idTask,int idStorage,int idRefreshItem) { diff --git a/Assets/PerfectWorld/Scripts/Objet/Shortcut/CECShortcutSet.cs b/Assets/PerfectWorld/Scripts/Objet/Shortcut/CECShortcutSet.cs index 56efa266b5..b5b489c30b 100644 --- a/Assets/PerfectWorld/Scripts/Objet/Shortcut/CECShortcutSet.cs +++ b/Assets/PerfectWorld/Scripts/Objet/Shortcut/CECShortcutSet.cs @@ -10,15 +10,22 @@ * * Copyright (c) 2005 Archosaur Studio, All Rights Reserved. */ - +using static BrewMonster.CECSCCommand.CommandID; +using static BrewMonster.Scripts.RoleExpression; +using static BrewMonster.Scripts.DescriptipionMsg; using BrewMonster.Assets.PerfectWorld.Scripts.Skills; using BrewMonster.Network; +using BrewMonster.Scripts; using BrewMonster.Scripts.Skills; +using CSNetwork.C2SCommand; using CSNetwork.GPDataType; +using CSNetwork.S2CCommand; using System; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; +using static BrewMonster.EC_Resource; +using static BrewMonster.IconResourceType; namespace BrewMonster { @@ -123,7 +130,7 @@ namespace BrewMonster /// /// Create a skill group shortcut at specified position /// - /* public bool CreateSkillGroupShortcut(int iSlot, int iGroupIdx) + public bool CreateSkillGroupShortcut(int iSlot, int iGroupIdx) { CECSCSkillGrp pSkillGrpSC = new CECSCSkillGrp(); if (pSkillGrpSC == null) @@ -137,7 +144,7 @@ namespace BrewMonster SetShortcut(iSlot, pSkillGrpSC); return true; - }*/ + } /// /// Create a pet shortcut at specified position @@ -260,11 +267,6 @@ namespace BrewMonster { m_aShortcuts[iSlot] = null; } - CECSCSkill skill; - if ((skill = pShortcut as CECSCSkill) != null) - { - BMLogger.LogError("SetShortcut: Setting shortcut at slot " + iSlot + $" skill = {skill.GetSkill().GetName()}"); - } m_aShortcuts[iSlot] = pShortcut; } @@ -636,100 +638,100 @@ namespace BrewMonster break; } - /* case CECShortcut.ShortcutType.SCT_ITEM: - { - int iPack = BitConverter.ToInt32(pDataBuf, offset); - offset += sizeof(int); - int iIvtrSlot = BitConverter.ToInt32(pDataBuf, offset); - offset += sizeof(int); - int idItem = BitConverter.ToInt32(pDataBuf, offset); - offset += sizeof(int); + /* case CECShortcut.ShortcutType.SCT_ITEM: + { + int iPack = BitConverter.ToInt32(pDataBuf, offset); + offset += sizeof(int); + int iIvtrSlot = BitConverter.ToInt32(pDataBuf, offset); + offset += sizeof(int); + int idItem = BitConverter.ToInt32(pDataBuf, offset); + offset += sizeof(int); - CECInventory pPack = pHost.GetPack(iPack); - if (pPack == null) - { - Debug.LogError("CECShortcutSet::LoadConfigData - Invalid inventory"); - return false; - } + CECInventory pPack = pHost.GetPack(iPack); + if (pPack == null) + { + Debug.LogError("CECShortcutSet::LoadConfigData - Invalid inventory"); + return false; + } - CECIvtrItem pItem = pPack.GetItem(iIvtrSlot); - if (pItem != null) - CreateItemShortcut(iSlot, iPack, iIvtrSlot, pItem); + CECIvtrItem pItem = pPack.GetItem(iIvtrSlot); + if (pItem != null) + CreateItemShortcut(iSlot, iPack, iIvtrSlot, pItem); - break; - } + break; + }*/ - case CECShortcut.ShortcutType.SCT_SKILLGRP: - { - if (dwVer >= 3) - { - int iGroupIdx = BitConverter.ToInt32(pDataBuf, offset); - offset += sizeof(int); + case CECShortcut.ShortcutType.SCT_SKILLGRP: + { + if (dwVer >= 3) + { + int iGroupIdx = BitConverter.ToInt32(pDataBuf, offset); + offset += sizeof(int); - if (iGroupIdx >= 0) - CreateSkillGroupShortcut(iSlot, iGroupIdx); - } - else - { - Debug.LogError("CECShortcutSet::LoadConfigData - Invalid version for skill group"); - return false; - } - break; - } + if (iGroupIdx >= 0) + CreateSkillGroupShortcut(iSlot, iGroupIdx); + } + else + { + Debug.LogError("CECShortcutSet::LoadConfigData - Invalid version for skill group"); + return false; + } + break; + } - case CECShortcut.ShortcutType.SCT_PET: - { - if (dwVer >= 4) - { - int iPetIndex = BitConverter.ToInt32(pDataBuf, offset); - offset += sizeof(int); + /*case CECShortcut.ShortcutType.SCT_PET: + { + if (dwVer >= 4) + { + int iPetIndex = BitConverter.ToInt32(pDataBuf, offset); + offset += sizeof(int); - if (iPetIndex >= 0) - CreatePetShortcut(iSlot, iPetIndex); - } - else - { - Debug.LogError("CECShortcutSet::LoadConfigData - Invalid version for pet"); - return false; - } - break; - } + if (iPetIndex >= 0) + CreatePetShortcut(iSlot, iPetIndex); + } + else + { + Debug.LogError("CECShortcutSet::LoadConfigData - Invalid version for pet"); + return false; + } + break; + } - case CECShortcut.ShortcutType.SCT_AUTOFASHION: - { - if (dwVer >= 5) - { - int iAutoFashionIndex = BitConverter.ToInt32(pDataBuf, offset); - offset += sizeof(int); + case CECShortcut.ShortcutType.SCT_AUTOFASHION: + { + if (dwVer >= 5) + { + int iAutoFashionIndex = BitConverter.ToInt32(pDataBuf, offset); + offset += sizeof(int); - if (iAutoFashionIndex >= 0) - CreateAutoFashionShortcut(iSlot, iAutoFashionIndex); - } - else - { - Debug.LogError("CECShortcutSet::LoadConfigData - Invalid version for auto fashion"); - return false; - } - break; - } + if (iAutoFashionIndex >= 0) + CreateAutoFashionShortcut(iSlot, iAutoFashionIndex); + } + else + { + Debug.LogError("CECShortcutSet::LoadConfigData - Invalid version for auto fashion"); + return false; + } + break; + } - case CECShortcut.ShortcutType.SCT_SYSMODULE: - { - if (dwVer > 10) - { - int iSys = BitConverter.ToInt32(pDataBuf, offset); - offset += sizeof(int); + case CECShortcut.ShortcutType.SCT_SYSMODULE: + { + if (dwVer > 10) + { + int iSys = BitConverter.ToInt32(pDataBuf, offset); + offset += sizeof(int); - if (iSys >= 0) - CreateSystemModuleShortcut(iSlot, iSys); - } - else - { - Debug.LogError("CECShortcutSet::LoadConfigData - Invalid version for system module"); - return false; - } - break; - }*/ + if (iSys >= 0) + CreateSystemModuleShortcut(iSlot, iSys); + } + else + { + Debug.LogError("CECShortcutSet::LoadConfigData - Invalid version for system module"); + return false; + } + break; + }*/ /* default: //TODO: uncomment @@ -759,7 +761,7 @@ namespace BrewMonster #region Placeholder Classes // These classes are referenced but not defined in the provided files // They should be implemented separately based on EC_Shortcut.h/cpp - + [Serializable] public class CECShortcut { protected int m_iSCType; @@ -781,25 +783,37 @@ namespace BrewMonster { return m_iSCType; } + public virtual string GetDesc() { return ""; } public virtual CECShortcut Clone() { return new CECShortcut(); } public virtual bool Execute() { return true; } - public virtual int GetCoolTime(ref int piMax) { piMax = 0; return 0; } - - public virtual string GetIconFile() + public virtual string GetIconFile() { - return ""; + // Return a default icon file name + return "unknown"; } } + // Shortcut type + public enum ShortcutType + { + SCT_UNKNOWN = -1, + SCT_SKILL = 0, + SCT_ITEM, + SCT_COMMAND, + SCT_SKILLGRP, + SCT_PET, + SCT_AUTOFASHION, + SCT_SYSMODULE, + }; public class CECSCCommand : CECShortcut { private int m_iCommand; // Command ID @@ -813,7 +827,7 @@ namespace BrewMonster CMD_FINDTARGET, CMD_ASSISTATTACK, CMD_INVITETOTEAM, - CMD_LEAVETEAM, + CMD_LEAVETEAM, CMD_KICKTEAMMEM, CMD_FINDTEAM, CMD_STARTTRADE, @@ -829,25 +843,93 @@ namespace BrewMonster } public CECSCCommand(int iCommand) { - m_iSCType = (int)ShortcutType.SCT_COMMAND; + m_iSCType = (int)ShortcutType.SCT_COMMAND; m_iCommand = iCommand; - m_dwParam = 0; + m_dwParam = 0; } + public override string GetDesc() + { + CECStringTab pDescTab = EC_Game.GetItemDesc(); + string szDesc = (""); + switch ((CommandID)m_iCommand) + { + case CMD_SITDOWN: szDesc = pDescTab.GetWideString((int)CMDDESC_SITDOWN); break; + case CMD_WALKRUN: szDesc = pDescTab.GetWideString((int)CMDDESC_WALKRUN); break; + case CMD_NORMALATTACK: szDesc = pDescTab.GetWideString((int)CMDDESC_NORMALATTACK); break; + case CMD_FINDTARGET: szDesc = pDescTab.GetWideString((int)CMDDESC_FINDTARGET); break; + case CMD_ASSISTATTACK: szDesc = pDescTab.GetWideString((int)CMDDESC_ASSISTATTACK); break; + case CMD_INVITETOTEAM: szDesc = pDescTab.GetWideString((int)CMDDESC_INVITETOTEAM); break; + case CMD_LEAVETEAM: szDesc = pDescTab.GetWideString((int)CMDDESC_LEAVETEAM); break; + case CMD_KICKTEAMMEM: szDesc = pDescTab.GetWideString((int)CMDDESC_KICKTEAMMEM); break; + case CMD_FINDTEAM: szDesc = pDescTab.GetWideString((int)CMDDESC_FINDTEAM); break; + case CMD_STARTTRADE: szDesc = pDescTab.GetWideString((int)CMDDESC_STARTTRADE); break; + case CMD_SELLBOOTH: szDesc = pDescTab.GetWideString((int)CMDDESC_SELLBOOTH); break; + case CMD_BUYBOOTH: szDesc = pDescTab.GetWideString((int)CMDDESC_BUYBOOTH); break; + case CMD_INVITETOFACTION: szDesc = pDescTab.GetWideString((int)CMDDESC_INVITETOFACTION); break; + case CMD_FLY: szDesc = pDescTab.GetWideString((int)CMDDESC_FLY); break; + case CMD_PICKUP: szDesc = pDescTab.GetWideString((int)CMDDESC_PICKUP); break; + case CMD_GATHER: szDesc = pDescTab.GetWideString((int)CMDDESC_GATHER); break; + case CMD_RUSHFLY: szDesc = pDescTab.GetWideString((int)CMDDESC_RUSHFLY); break; + case CMD_BINDBUDDY: szDesc = pDescTab.GetWideString((int)CMDDESC_BINDBUDDY); break; + + case CMD_PLAYPOSE: + { + switch ((RoleExpression)m_dwParam) + { + case ROLEEXP_WAVE: szDesc = pDescTab.GetWideString((int)FACEDESC_WAVEHAND); break; + case ROLEEXP_NOD: szDesc = pDescTab.GetWideString((int)FACEDESC_NOD); break; + case ROLEEXP_SHAKEHEAD: szDesc = pDescTab.GetWideString((int)FACEDESC_SHADEHEAD); break; + case ROLEEXP_SHRUG: szDesc = pDescTab.GetWideString((int)FACEDESC_SHRUG); break; + case ROLEEXP_LAUGH: szDesc = pDescTab.GetWideString((int)FACEDESC_LAUGH); break; + case ROLEEXP_ANGRY: szDesc = pDescTab.GetWideString((int)FACEDESC_ANGRY); break; + case ROLEEXP_STUN: szDesc = pDescTab.GetWideString((int)FACEDESC_FAINT); break; + case ROLEEXP_DEPRESSED: szDesc = pDescTab.GetWideString((int)FACEDESC_SAD); break; + case ROLEEXP_KISSHAND: szDesc = pDescTab.GetWideString((int)FACEDESC_KISSHAND); break; + case ROLEEXP_SHY: szDesc = pDescTab.GetWideString((int)FACEDESC_SHY); break; + case ROLEEXP_SALUTE: szDesc = pDescTab.GetWideString((int)FACEDESC_SALUTE); break; + case ROLEEXP_SITDOWN: szDesc = pDescTab.GetWideString((int)FACEDESC_SITDOWN); break; + case ROLEEXP_ASSAULT: szDesc = pDescTab.GetWideString((int)FACEDESC_CHARGE); break; + case ROLEEXP_THINK: szDesc = pDescTab.GetWideString((int)FACEDESC_THINK); break; + case ROLEEXP_DEFIANCE: szDesc = pDescTab.GetWideString((int)FACEDESC_CHALLENGE); break; + case ROLEEXP_VICTORY: szDesc = pDescTab.GetWideString((int)FACEDESC_WIN); break; + case ROLEEXP_GAPE: szDesc = pDescTab.GetWideString((int)FACEDESC_GAPE); break; + case ROLEEXP_KISS: szDesc = pDescTab.GetWideString((int)FACEDESC_KISS); break; + case ROLEEXP_FIGHT: szDesc = pDescTab.GetWideString((int)FACEDESC_FIGHT); break; + case ROLEEXP_ATTACK1: szDesc = pDescTab.GetWideString((int)FACEDESC_ATTACK1); break; + case ROLEEXP_ATTACK2: szDesc = pDescTab.GetWideString((int)FACEDESC_ATTACK2); break; + case ROLEEXP_ATTACK3: szDesc = pDescTab.GetWideString((int)FACEDESC_ATTACK3); break; + case ROLEEXP_ATTACK4: szDesc = pDescTab.GetWideString((int)FACEDESC_ATTACK4); break; + case ROLEEXP_DEFENCE: szDesc = pDescTab.GetWideString((int)FACEDESC_DEFENCE); break; + case ROLEEXP_FALL: szDesc = pDescTab.GetWideString((int)FACEDESC_FALL); break; + case ROLEEXP_FALLONGROUND: szDesc = pDescTab.GetWideString((int)FACEDESC_FALLONGROUND); break; + case ROLEEXP_LOOKAROUND: szDesc = pDescTab.GetWideString((int)FACEDESC_LOOKAROUND); break; + case ROLEEXP_DANCE: szDesc = pDescTab.GetWideString((int)FACEDESC_DANCE); break; + case ROLEEXP_FASHIONWEAPON: szDesc = pDescTab.GetWideString((int)FACEDESC_FASHIONWEAPON); break; + default: + break; + } + + break; + } + default: + return (""); + } + + return szDesc; + } public CECSCCommand(CECSCCommand src) { m_iCommand = src.m_iCommand; - m_dwParam = src.m_dwParam; + m_dwParam = src.m_dwParam; } - public const int CMD_PLAYPOSE = 1; // Example constant - // public override ShortcutType GetType() => ShortcutType.SCT_COMMAND; public override CECShortcut Clone() => new CECSCCommand(this); public int GetCommandID() => 0; public int GetParam() => 0; - + // Set / Get command parameter public void SetParam(uint dwParam) { m_dwParam = dwParam; } - + // Execute shortcut public override bool Execute() { @@ -863,44 +945,112 @@ namespace BrewMonster // // if (bForbidCmd) // { - // g_pGame->GetGameRun()->AddFixedMessage(FIXMSG_CMD_INCOOLTIME); + // g_pGame.GetGameRun().AddFixedMessage(FIXMSG_CMD_INCOOLTIME); // return false; // } // } switch (m_iCommand) { - // case CMD_SITDOWN: pHost->CmdSitDown(!pHost->IsSitting()); break; - // case CMD_WALKRUN: pHost->CmdWalkRun(!pHost->GetWalkRunFlag()); break; - // case CMD_NORMALATTACK: pHost->CmdNormalAttack(); break; - // case CMD_FINDTARGET: pHost->CmdFindTarget(); break; - // case CMD_ASSISTATTACK: pHost->CmdAssistAttack(); break; - // case CMD_INVITETOTEAM: pHost->CmdInviteToTeam(); break; - // case CMD_LEAVETEAM: pHost->CmdLeaveTeam(); break; - // case CMD_KICKTEAMMEM: pHost->CmdKickTeamMember(); break; - // case CMD_FINDTEAM: pHost->CmdFindTeam(); break; - // case CMD_STARTTRADE: pHost->CmdStartTrade(); break; - // case CMD_SELLBOOTH: pHost->CmdSellBooth(); break; - // case CMD_BUYBOOTH: pHost->CmdBuyBooth(); break; + // case CMD_SITDOWN: pHost.CmdSitDown(!pHost.IsSitting()); break; + // case CMD_WALKRUN: pHost.CmdWalkRun(!pHost.GetWalkRunFlag()); break; + // case CMD_NORMALATTACK: pHost.CmdNormalAttack(); break; + // case CMD_FINDTARGET: pHost.CmdFindTarget(); break; + // case CMD_ASSISTATTACK: pHost.CmdAssistAttack(); break; + // case CMD_INVITETOTEAM: pHost.CmdInviteToTeam(); break; + // case CMD_LEAVETEAM: pHost.CmdLeaveTeam(); break; + // case CMD_KICKTEAMMEM: pHost.CmdKickTeamMember(); break; + // case CMD_FINDTEAM: pHost.CmdFindTeam(); break; + // case CMD_STARTTRADE: pHost.CmdStartTrade(); break; + // case CMD_SELLBOOTH: pHost.CmdSellBooth(); break; + // case CMD_BUYBOOTH: pHost.CmdBuyBooth(); break; case (int)CommandID.CMD_PLAYPOSE: pHost.CmdStartPose((int)m_dwParam); break; - // case CMD_INVITETOFACTION: pHost->CmdInviteToFaction(); break; + // case CMD_INVITETOFACTION: pHost.CmdInviteToFaction(); break; // case CMD_FLY: // { // // Èç¹ûÆï³ËÒª·ÉÃã¬ÔòÕâé action switcher£¬·ñÔò CmdFly - // if (!pHost->GetActionSwitcher() || !pHost->GetActionSwitcher()->OnRideToFlyAction()) - // pHost->CmdFly(); + // if (!pHost.GetActionSwitcher() || !pHost.GetActionSwitcher().OnRideToFlyAction()) + // pHost.CmdFly(); // break; // } - // case CMD_PICKUP: pHost->CmdPickup(); break; - // case CMD_GATHER: pHost->CmdGather(); break; - // case CMD_RUSHFLY: pHost->CmdRushFly(); break; - // case CMD_BINDBUDDY: pHost->CmdBindBuddy(pHost->GetSelectedTarget()); break; + // case CMD_PICKUP: pHost.CmdPickup(); break; + // case CMD_GATHER: pHost.CmdGather(); break; + // case CMD_RUSHFLY: pHost.CmdRushFly(); break; + // case CMD_BINDBUDDY: pHost.CmdBindBuddy(pHost.GetSelectedTarget()); break; default: return false; } return true; } - + public override string GetIconFile() + { + string szIconFile = ""; + switch ((CommandID)m_iCommand) + { + case CommandID.CMD_SITDOWN: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_SITDOWN); break; + case CommandID.CMD_WALKRUN: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_WALKRUN); break; + case CommandID.CMD_NORMALATTACK: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_NORMALATTACK); break; + case CommandID.CMD_FINDTARGET: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_FINDTARGET); break; + case CommandID.CMD_ASSISTATTACK: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_ASSISTATTACK); break; + case CommandID.CMD_INVITETOTEAM: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_INVITETOTEAM); break; + case CommandID.CMD_LEAVETEAM: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_LEAVETEAM); break; + case CommandID.CMD_KICKTEAMMEM: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_KICKTEAMMEM); break; + case CommandID.CMD_FINDTEAM: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_FINDTEAM); break; + case CommandID.CMD_STARTTRADE: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_STARTTRADE); break; + case CommandID.CMD_SELLBOOTH: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_SELLBOOTH); break; + case CommandID.CMD_BUYBOOTH: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_BUYBOOTH); break; + case CommandID.CMD_INVITETOFACTION: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_INVITETOFACTION); break; + case CommandID.CMD_FLY: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_FLY); break; + case CommandID.CMD_PICKUP: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_PICKUP); break; + case CommandID.CMD_GATHER: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_GATHER); break; + case CommandID.CMD_RUSHFLY: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_RUSHFLY); break; + case CommandID.CMD_BINDBUDDY: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_BINDBUDDY); break; + + case CommandID.CMD_PLAYPOSE: + { + switch ((RoleExpression)m_dwParam) + { + case RoleExpression.ROLEEXP_WAVE: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_WAVE); break; + case RoleExpression.ROLEEXP_NOD: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_NOD); break; + case RoleExpression.ROLEEXP_SHAKEHEAD: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_SHAKEHEAD); break; + case RoleExpression.ROLEEXP_SHRUG: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_SHRUG); break; + case RoleExpression.ROLEEXP_LAUGH: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_LAUGH); break; + case RoleExpression.ROLEEXP_ANGRY: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_ANGRY); break; + case RoleExpression.ROLEEXP_STUN: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_STUN); break; + case RoleExpression.ROLEEXP_DEPRESSED: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_DEPRESSED); break; + case RoleExpression.ROLEEXP_KISSHAND: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_KISSHAND); break; + case RoleExpression.ROLEEXP_SHY: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_SHY); break; + case RoleExpression.ROLEEXP_SALUTE: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_SALUTE); break; + case RoleExpression.ROLEEXP_SITDOWN: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_SITDOWN); break; + case RoleExpression.ROLEEXP_ASSAULT: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_ASSAULT); break; + case RoleExpression.ROLEEXP_THINK: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_THINK); break; + case RoleExpression.ROLEEXP_DEFIANCE: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_DEFIANCE); break; + case RoleExpression.ROLEEXP_VICTORY: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_VICTORY); break; + case RoleExpression.ROLEEXP_GAPE: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_GAPE); break; + case RoleExpression.ROLEEXP_KISS: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_KISS); break; + case RoleExpression.ROLEEXP_FIGHT: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_FIGHT); break; + case RoleExpression.ROLEEXP_ATTACK1: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_ATTACK1); break; + case RoleExpression.ROLEEXP_ATTACK2: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_ATTACK2); break; + case RoleExpression.ROLEEXP_ATTACK3: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_ATTACK3); break; + case RoleExpression.ROLEEXP_ATTACK4: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_ATTACK4); break; + case RoleExpression.ROLEEXP_DEFENCE: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_DEFENCE); break; + case RoleExpression.ROLEEXP_FALL: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_FALL); break; + case RoleExpression.ROLEEXP_FALLONGROUND: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_FALLONGROUND); break; + case RoleExpression.ROLEEXP_LOOKAROUND: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_LOOKAROUND); break; + case RoleExpression.ROLEEXP_DANCE: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_DANCE); break; + case RoleExpression.ROLEEXP_FASHIONWEAPON: szIconFile = res_IconFile((int)IconResourceType.RES_ICON_CMD_EXP_FASHIONWEAPON); break; + default: + break; + } + + break; + } + default: + return ""; + } + + return szIconFile; + } // Get item cool time int GetCoolTime(ref int piMax/* NULL */) { @@ -920,15 +1070,15 @@ namespace BrewMonster break; case CommandID.CMD_BINDBUDDY: - { - // CECCounter& cnt = pHost->GetBindCmdCoolCnt(); - // iTime = cnt.GetPeriod() - cnt.GetCounter(); - // - // if (piMax) - // *piMax = cnt.GetPeriod(); + { + // CECCounter& cnt = pHost.GetBindCmdCoolCnt(); + // iTime = cnt.GetPeriod() - cnt.GetCounter(); + // + // if (piMax) + // *piMax = cnt.GetPeriod(); - break; - } + break; + } default: // if (piMax) *piMax = 0; @@ -939,37 +1089,37 @@ namespace BrewMonster } } - /* public class CECSCSkill : CECShortcut - { - private CECSkill m_pSkill; - public override ShortcutType GetType() => ShortcutType.SCT_SKILL; - public override CECShortcut Clone() => null; - public bool Init(CECSkill pSkill) { m_pSkill = pSkill; return true; } - public CECSkill GetSkill() => m_pSkill; - public void SetSkill(CECSkill pSkill) { m_pSkill = pSkill; } - } + /* public class CECSCSkill : CECShortcut + { + private CECSkill m_pSkill; + public override ShortcutType GetType() => ShortcutType.SCT_SKILL; + public override CECShortcut Clone() => null; + public bool Init(CECSkill pSkill) { m_pSkill = pSkill; return true; } + public CECSkill GetSkill() => m_pSkill; + public void SetSkill(CECSkill pSkill) { m_pSkill = pSkill; } + } - public class CECSCItem : CECShortcut - { - private int m_iInventory; - private int m_iIvtrSlot; - private int m_iItemTID; - private bool m_bAutoFind; + public class CECSCItem : CECShortcut + { + private int m_iInventory; + private int m_iIvtrSlot; + private int m_iItemTID; + private bool m_bAutoFind; - public override ShortcutType GetType() => ShortcutType.SCT_ITEM; - public override CECShortcut Clone() => null; - public bool Init(int iIvtr, int iSlot, CECIvtrItem pItem) - { - m_iInventory = iIvtr; - m_iIvtrSlot = iSlot; - return true; - } - public int GetInventory() => m_iInventory; - public int GetIvtrSlot() => m_iIvtrSlot; - public int GetItemTID() => m_iItemTID; - public bool GetAutoFindFlag() => m_bAutoFind; - public void MoveItem(int iIvtr, int iSlot) { m_iInventory = iIvtr; m_iIvtrSlot = iSlot; } - }*/ + public override ShortcutType GetType() => ShortcutType.SCT_ITEM; + public override CECShortcut Clone() => null; + public bool Init(int iIvtr, int iSlot, CECIvtrItem pItem) + { + m_iInventory = iIvtr; + m_iIvtrSlot = iSlot; + return true; + } + public int GetInventory() => m_iInventory; + public int GetIvtrSlot() => m_iIvtrSlot; + public int GetItemTID() => m_iItemTID; + public bool GetAutoFindFlag() => m_bAutoFind; + public void MoveItem(int iIvtr, int iSlot) { m_iInventory = iIvtr; m_iIvtrSlot = iSlot; } + }*/ /* public class CECSCSkillGrp : CECShortcut { diff --git a/Assets/PerfectWorld/Scripts/Players/CECPlayerWrapper.cs b/Assets/PerfectWorld/Scripts/Players/CECPlayerWrapper.cs index 91dc047611..cf4acee790 100644 --- a/Assets/PerfectWorld/Scripts/Players/CECPlayerWrapper.cs +++ b/Assets/PerfectWorld/Scripts/Players/CECPlayerWrapper.cs @@ -1,13 +1,1335 @@ -using System; + +using BrewMonster; +using BrewMonster.Managers; +using BrewMonster.Network; +using BrewMonster.Scripts.Managers; +using CSNetwork; +using CSNetwork.GPDataType; +using PerfectWorld.Scripts; +using PerfectWorld.Scripts.Managers; +using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Runtime.CompilerServices; -namespace BrewMonster.Assets.PerfectWorld.Scripts.Players + +public static class AP { - public class CECPlayerWrapper - { + // AP events (from EC_PlayerWrapper.h anonymous enum) + public const int AP_EVENT_CANNOTMOVE = 0; + public const int AP_EVENT_MOVEFINISHED = 1; + public const int AP_EVENT_TRACEOK = 2; + public const int AP_EVENT_STARTSKILL = 3; + public const int AP_EVENT_STOPSKILL = 4; + public const int AP_EVENT_STARTUSEITEM = 5; + public const int AP_EVENT_STOPUSEITEM = 6; + public const int AP_EVENT_PICKUPOK = 7; + public const int AP_EVENT_CANNOTPICKUP = 8; + public const int AP_EVENT_STARTMELEE = 9; + public const int AP_EVENT_STOPMELEE = 10; + public const int AP_EVENT_COMBOCONTINUE = 11; + public const int AP_EVENT_COMBOFINISH = 12; + public const int AP_EVENT_MELEEOUTOFRANGE = 13; + // NOTE: C# doesn't have free functions; keep names, put into static class. + public static void AP_ActionEvent(int iEvent, int iParam = 0) + { + if (!CECAutoPolicy.GetInstance().IsAutoPolicyEnabled()) + return; + + var pWrapper = CECAutoPolicy.GetInstance().GetPlayerWrapper(); + pWrapper?.OnActionEvent(iEvent, iParam); + } + + public static string AP_GetActionName(int iAction) + { + return iAction switch + { + CECPlayerWrapper.ACTION_IDLE => "ACTION_IDLE", + CECPlayerWrapper.ACTION_MOVE => "ACTION_MOVE", + CECPlayerWrapper.ACTION_CASTSKILL => "ACTION_CASTSKILL", + CECPlayerWrapper.ACTION_USEITEM => "ACTION_USEITEM", + CECPlayerWrapper.ACTION_PICKUP => "ACTION_PICKUP", + CECPlayerWrapper.ACTION_COMBOSKILL => "ACTION_COMBOSKILL", + CECPlayerWrapper.ACTION_MELEE => "ACTION_MELEE", + _ => "Unknown", + }; + } + + public static string AP_GetEventName(int iEvent) + { + return iEvent switch + { + AP_EVENT_CANNOTMOVE => "AP_EVENT_CANNOTMOVE", + AP_EVENT_MOVEFINISHED => "AP_EVENT_MOVEFINISHED", + AP_EVENT_TRACEOK => "AP_EVENT_TRACEOK", + AP_EVENT_STARTSKILL => "AP_EVENT_STARTSKILL", + AP_EVENT_STOPSKILL => "AP_EVENT_STOPSKILL", + AP_EVENT_STARTUSEITEM => "AP_EVENT_STARTUSEITEM", + AP_EVENT_STOPUSEITEM => "AP_EVENT_STOPUSEITEM", + AP_EVENT_PICKUPOK => "AP_EVENT_PICKUPOK", + AP_EVENT_CANNOTPICKUP => "AP_EVENT_CANNOTPICKUP", + AP_EVENT_STARTMELEE => "AP_EVENT_STARTMELEE", + AP_EVENT_STOPMELEE => "AP_EVENT_STOPMELEE", + AP_EVENT_COMBOCONTINUE => "AP_EVENT_COMBOCONTINUE", + AP_EVENT_COMBOFINISH => "AP_EVENT_COMBOFINISH", + AP_EVENT_MELEEOUTOFRANGE => "AP_EVENT_MELEEOUTOFRANGE", + _ => "Unknown", + }; } } + +public class CECPlayerWrapper +{ + // Actions (from EC_PlayerWrapper.h enum) + public const int ACTION_IDLE = 0; + public const int ACTION_MOVE = 1; + public const int ACTION_CASTSKILL = 2; + public const int ACTION_USEITEM = 3; + public const int ACTION_PICKUP = 4; + public const int ACTION_COMBOSKILL = 5; + public const int ACTION_MELEE = 6; + + private const int MAX_ATTACK_ERROR = 3; + private const int INVALIDOBJ_TIMEOUT = 30000; + private const float MATTER_SEARCH_RANGE = 60.0f; + + public struct DelayTask + { + public int iType; + public int iParam1; + public int iParam2; + + public DelayTask(int _) + { + iType = ACTION_IDLE; + iParam1 = 0; + iParam2 = 0; + } + } + + // ===== Base Action ===== + public abstract class Action + { + protected readonly int type; + protected readonly CECPlayerWrapper host; + + protected Action(CECPlayerWrapper pHost, int t) + { + host = pHost; + type = t; + } + + public virtual bool StartAction() => true; + public virtual void EndAction() { } + + // return true => action finished + public virtual bool Tick(uint dwDeltaTime) => false; + + public virtual void OnEvent(int iEvent, int iParam) { } + + public virtual bool CanBreak() => true; + + public bool HaveNextAction() => host.m_Actions.Count > 0; + + public int GetType() => type; + } + + public delegate void ActionEventDelegate(int iEvent, int iParam); + + // ===== Dependencies (keep original names/types; implement in your project) ===== + protected CECHostPlayer m_pHost; + + // ===== Runtime state ===== + protected readonly LinkedList m_Actions = new(); + protected Action m_pCurAction; + + protected A3DVECTOR3 m_vOrigPos; + + protected bool m_bForceAttack; + protected int m_iAttackErrCnt; + protected int m_iPickupErrCnt; + + // invalid objects timeout map + protected readonly Dictionary m_InvalidObj = new(); + + // monsters attacking me + protected readonly HashSet m_MonsterAttackMe = new(); + + protected DelayTask m_DelayTask = new DelayTask(0); + + // Keep accessors like C++ (AutoPolicy.Render reads these directly in C++) + public CECHostPlayer GetHostPlayer() => m_pHost; + + public CECPlayerWrapper(CECHostPlayer pHost) + { + m_pHost = pHost; + m_pCurAction = null; + m_iAttackErrCnt = 0; + m_iPickupErrCnt = 0; + m_bForceAttack = false; + m_vOrigPos = m_pHost.GetPos(); + } + + public virtual void Tick(uint dwDeltaTime) + { + if (m_pCurAction != null) + { + if (m_pCurAction.Tick(dwDeltaTime)) + { + EndCurAction(); + StartAction(); + } + } + + if (m_DelayTask.iType != ACTION_IDLE) + ProcessDelayTask(); + + // decrement invalid timeouts + if (m_InvalidObj.Count > 0) + { + var toRemove = new List(); + foreach (var kv in m_InvalidObj) + { + int t = kv.Value - (int)dwDeltaTime; + if (t <= 0) toRemove.Add(kv.Key); + else m_InvalidObj[kv.Key] = t; + } + for (int i = 0; i < toRemove.Count; i++) + m_InvalidObj.Remove(toRemove[i]); + } + } + + public void StopPolicy() + { + CECAutoPolicy.GetInstance().StopPolicy(); + } + + public void OnStopPolicy() + { + ClearAction(); + m_bForceAttack = false; + m_iAttackErrCnt = 0; + m_iPickupErrCnt = 0; + m_InvalidObj.Clear(); + m_MonsterAttackMe.Clear(); + } + + public bool HaveAction() + { + return m_pCurAction != null || m_Actions.Count > 0; + } + + public bool AddIdleAction(int iTime) + { + AddAction(new IdleAction(this, iTime)); + return StartAction(); + } + + protected bool AddAction(Action pAction) + { + if (pAction == null) return false; + if (m_pCurAction != null && m_pCurAction.GetType() == pAction.GetType()) + return false; + + for (var node = m_Actions.First; node != null; node = node.Next) + { + if (node.Value.GetType() == pAction.GetType()) + return false; + } + + m_Actions.AddLast(pAction); + return true; + } + + protected bool StartAction() + { + if (m_pCurAction != null) + return true; + + bool ret = false; + + while (m_Actions.Count > 0) + { + m_pCurAction = m_Actions.First.Value; + m_Actions.RemoveFirst(); + + ret = m_pCurAction.StartAction(); + if (ret) break; + + EndCurAction(); // if StartAction failed, kill and try next + } + + return ret; + } + + protected bool EndCurAction() + { + if (m_pCurAction == null) + return false; + + m_pCurAction.EndAction(); + m_pCurAction = null; + return true; + } + + public void ClearAction() + { + if (m_pCurAction != null) + EndCurAction(); + + m_Actions.Clear(); + } + + private bool AddOneAction(int iActionType, int iParam = 0) + { + switch (iActionType) + { + case ACTION_MOVE: AddAction(new MoveAction(this)); break; + case ACTION_CASTSKILL: AddAction(new CastSkillAction(this)); break; + case ACTION_USEITEM: AddAction(new UseItemAction(this)); break; + case ACTION_PICKUP: AddAction(new PickupAction(this, iParam)); break; + case ACTION_COMBOSKILL: AddAction(new ComboSkillAction(this)); break; + case ACTION_MELEE: AddAction(new MeleeAction(this)); break; + default: throw new ArgumentOutOfRangeException(nameof(iActionType)); + } + + return StartAction(); + } + + // ===== Inventory helpers ===== + public int GetItemIndex(int iPack, int tid) + { + if (iPack >= (int)InventoryType.IVTRTYPE_PACK && iPack <= (int)InventoryType.IVTRTYPE_TASKPACK) + { + var pPack = m_pHost.GetPack(iPack); + return pPack.FindItem(tid); + } + return -1; + } + + public int GetItemCount(int iPack, int tid) + { + if (iPack >= (int)InventoryType.IVTRTYPE_PACK && iPack <= (int)InventoryType.IVTRTYPE_TASKPACK) + { + var pPack = m_pHost.GetPack(iPack); + return pPack.GetItemTotalNum(tid); + } + return 0; + } + + public A3DVECTOR3 GetPos() + { + return m_pHost.GetPos(); + } + + public void MoveTo(float x, float z) + { + var pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan(); + //pGameUI?.AutoMoveStart((int)x, (int)z, false); + AddOneAction(ACTION_MOVE); + } + + public void CancelAction() + { + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_PRESSCANCEL, MANAGER_INDEX.MAN_PLAYER, 0); + } + + public A3DVECTOR3 GetOrigPos() + { + return m_vOrigPos; + } + + public void SetOrigPos(A3DVECTOR3 vPos) + { + m_vOrigPos = vPos; + } + + // ===== Target search ===== + private sealed class ObjectSorter : IComparer + { + private readonly CECPlayerWrapper _host; + + public ObjectSorter(CECPlayerWrapper host) + { + _host = host; + } + + public int Compare(CECObject p1, CECObject p2) + { + float f1 = GetDistToHost(p1); + float f2 = GetDistToHost(p2); + + float df = Math.Abs(f1 - f2); + if (df > 0.00001f) + return f1 < f2 ? -1 : 1; + + if (p1.GetClassID() == p2.GetClassID()) + { + // pointer compare equivalent + int h1 = RuntimeHelpers.GetHashCode(p1); + int h2 = RuntimeHelpers.GetHashCode(p2); + return h1.CompareTo(h2); + } + + // C++: return p1->IsMatter(); => matter first if same dist but different class + return p1.IsMatter() ? -1 : 1; + } + + private float GetDistToHost(CECObject p) + { + if (p == null) return 0.0f; + + if (p.IsMonsterNPC()) + { + var pNPC = p as CECNPC; + return pNPC != null ? pNPC.GetDistToHost() : 0.0f; + } + /* else if (p.IsMatter()) + { + var pMatter = p as CECMatter; + return pMatter != null ? pMatter.GetDistToHost() : 0.0f; + }*/ + else + { + return 0.0f; + } + } + } + + public bool SearchTarget(ref int id, ref int tid) + { + int iTarget = 0; + int iTargetTempl = 0; + + var pNPCMan = EC_ManMessageMono.Instance.CECNPCMan; + var pMatterMan = EC_ManMessageMono.Instance.EC_ManMatter; + + m_iAttackErrCnt = 0; + + // Prefer monsters attacking me + if (m_MonsterAttackMe.Count > 0) + { + float fMinDist = 999999.0f; + int chosen = 0; + + foreach (var mid in m_MonsterAttackMe) + { + var pNPC = pNPCMan.GetNPC(mid); + if (pNPC == null) + continue; + +#if UNITY_5_3_OR_NEWER + float fDist = (m_pHost.GetPos() - pNPC.GetPos()).Magnitude(); +#else + float fDist = A3DVECTOR3.Magnitude(m_pHost.GetPos() - pNPC.GetPos()); +#endif + if (fDist < fMinDist) + { + fMinDist = fDist; + iTarget = mid; + iTargetTempl = pNPC.GetTemplateID(); + chosen = mid; + } + } + + if (iTarget != 0) + { + m_MonsterAttackMe.Remove(chosen); + id = iTarget; + tid = iTargetTempl; + return true; + } + } + + // Collect candidates (monsters + matters) + var targets = new List(); + + var monsters = new List(); + pNPCMan.TabSelectCandidates(0, monsters); + for (int i = 0; i < monsters.Count; i++) + targets.Add(monsters[i]); + + var matters = new List(); + //pMatterMan.FindMattersInRange(MATTER_SEARCH_RANGE, true, matters); + for (int i = 0; i < matters.Count; i++) + targets.Add(matters[i]); + + if (targets.Count > 0) + { + targets.Sort(new ObjectSorter(this)); + + for (int i = 0; i < targets.Count; i++) + { + var obj = targets[i]; + if (obj.IsMonsterNPC()) + { + var pNPC = obj as CECNPC; + if (pNPC != null && NpcCanAttack(pNPC.GetNPCID())) + { + iTarget = pNPC.GetNPCID(); + iTargetTempl = pNPC.GetTemplateID(); + break; + } + } + else if (obj.IsMatter()) + { + var pMatter = obj as CECMatter; + if (pMatter != null && MatterCanPickup(pMatter.GetMatterID(), pMatter.GetTemplateID())) + { + iTarget = pMatter.GetMatterID(); + iTargetTempl = pMatter.GetTemplateID(); + break; + } + } + } + + if (iTarget != 0 && iTargetTempl != 0) + { + id = iTarget; + tid = iTargetTempl; + return true; + } + } + + id = 0; + tid = 0; + return false; + } + + public int GetSelectedTarget() + { + return m_pHost.GetSelectedTarget(); + } + + public void SelectTarget(int iTarget) + { + m_iAttackErrCnt = 0; + m_pHost.SelectTarget(iTarget); + } + + public void Unselect() + { + m_iAttackErrCnt = 0; + m_pHost.SelectTarget(0); + } + + public bool NpcCanAttack(int nid) + { + if (m_pHost.AttackableJudge(nid, false) != 1) + return false; + + if (m_InvalidObj.ContainsKey(nid)) + return false; + + return true; + } + + public bool NormalAttack() + { + bool bRet = m_pHost.CmdNormalAttack(false, false, 0, m_bForceAttack ? 1 : -1); + if (bRet) + { + AddAttackError(); + AddOneAction(ACTION_MELEE); + } + return bRet; + } + + // NOTE: header calls this bQueue; cpp uses bDelay. Here keep signature like header. + public bool CastComboSkill(int group_id, bool bIgnoreAtkLoop, bool bQueue = false) + { + if (bQueue) + { + DoDelayTask(ACTION_COMBOSKILL, group_id, bIgnoreAtkLoop ? 1 : 0); + return true; + } + + AddOneAction(ACTION_COMBOSKILL, group_id); + + bool bRet = m_pHost.ApplyComboSkill(group_id, bIgnoreAtkLoop, m_bForceAttack ? 1 : -1); + if (!bRet && m_iAttackErrCnt++ >= 3) + { + m_iAttackErrCnt = 0; + m_pHost.ClearComboSkill(); + } + + return true; + } + + public bool CastSkill(int skill_id, bool bQueue = false) + { + if (bQueue) + { + DoDelayTask(ACTION_CASTSKILL, skill_id); + return true; + } + + bool bRet = m_pHost.ApplySkillShortcut(skill_id, false, 0, m_bForceAttack ? 1 : -1); + if (bRet) + { + AddAttackError(); + AddOneAction(ACTION_CASTSKILL); + + // self-cast: no trace needed + if (m_pHost.GetPrepSkill() != null) + AP.AP_ActionEvent(AP.AP_EVENT_TRACEOK); + } + + return bRet; + } + + /* public void UseItem(int iSlot) + { + bool bRet = m_pHost.UseItemInPack(EC_GPDataType.IVTRTYPE_PACK, iSlot); + if (bRet) AddOneAction(ACTION_USEITEM); + }*/ + + public bool MatterCanPickup(int mid, int tid) + { + int iPickMode = CECAutoPolicy.GetInstance().GetConfigData().iAutoPickMode; + if (iPickMode == 0 || (iPickMode == 2 && !GPDataTypeHelper.ISMONEYTID(tid))) + return false; + + if (!m_pHost.CanTakeItem(tid, 1)) + return false; + + if (m_InvalidObj.ContainsKey(mid)) + return false; + + return true; + } + + public void Pickup(int mid) + { + bool bRet = m_pHost.PickupObject(mid, false); + + if (m_iPickupErrCnt++ >= 3) + { + m_iPickupErrCnt = 0; + m_InvalidObj[mid] = INVALIDOBJ_TIMEOUT; + } + + if (bRet) + AddOneAction(ACTION_PICKUP, mid); + } + + public bool IsPlayerInSlice(int idPlayer) + { + var pPlayerMan = EC_ManMessageMono.Instance.EC_ManPlayer; + var pPlayer = pPlayerMan.GetPlayer(idPlayer); + return pPlayer != null && !pPlayer.IsDead(); + } + + /* public int GetWeaponEndurance() + { + var pWeapon = m_pHost.GetEquipment().GetItem((int)IndexOfIteminEquipmentInventory.EQUIPIVTR_WEAPON) as CECIvtrWeapon; + if (pWeapon != null) + { + if (pWeapon.IsRangeWeapon()) + { + var pArrow = m_pHost.GetEquipment().GetItem(EC_GPDataType.EQUIPIVTR_PROJECTILE) as CECIvtrArrow; + if (pArrow == null || pArrow.GetCount() == 0) + return 0; + } + + return pWeapon.GetCurEndurance(); + } + + return 0; + }*/ + + public bool IsDead() => m_pHost.IsDead(); + + /* public bool IsRevivedByOther() + { + return m_pHost.GetReviveLostExp() >= 0.0f; + } + + public void AcceptRevive() + { + UnityGameSession.c2s_CmdRevivalAgree(); + }*/ + + /* public bool ReviveByItem() + { + if (m_pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_SOUL_STONE) == 0) + { + UnityGameSession.c2s_CmdReviveItem(); + return true; + } + return false; + }*/ + + public void ReviveInTown() + { + UnityGameSession.c2s_CmdReviveVillage(); + } + + public void SetForceAttack(bool bFlag) + { + m_bForceAttack = bFlag; + } + + /* public bool IsInSanctuary() + { + return m_pHost.IsInSanctuary(); + }*/ + + public bool IsMonsterAttackMe() + { + return m_MonsterAttackMe.Count > 0; + } + + public A3DVECTOR3 GetObjectPos(int object_id) + { + if (GPDataTypeHelper.ISPLAYERID(object_id)) + { + var pMan = EC_ManMessageMono.Instance.EC_ManPlayer; + var pPlayer = pMan.GetElsePlayer(object_id); + return pPlayer != null ? pPlayer.GetPos() : new A3DVECTOR3(0, 0, 0); + } + else if (GPDataTypeHelper.ISNPCID(object_id)) + { + var pMan = EC_ManMessageMono.Instance.CECNPCMan; + var pNPC = pMan.GetNPC(object_id); + return pNPC != null ? pNPC.GetPos() : new A3DVECTOR3(0, 0, 0); + } + else if (GPDataTypeHelper.ISMATTERID(object_id)) + { + var pMan = EC_ManMessageMono.Instance.EC_ManMatter; + var pMatter = pMan.GetMatter(object_id); + return pMatter != null ? pMatter.GetPos() : new A3DVECTOR3(0, 0, 0); + } + + return new A3DVECTOR3(0, 0, 0); + } + + public void SetInvalidObject(int object_id) + { + m_InvalidObj[object_id] = INVALIDOBJ_TIMEOUT; + } + + public void OnObjectDisappear(int object_id) + { + m_InvalidObj.Remove(object_id); + m_MonsterAttackMe.Remove(object_id); + } + + public void OnMonsterAttackMe(int monster_id) + { + if (GetSelectedTarget() != monster_id) + { + m_MonsterAttackMe.Add(monster_id); + m_InvalidObj.Remove(monster_id); + } + } + + public void AddAttackError() + { + if (m_iAttackErrCnt++ >= MAX_ATTACK_ERROR) + { + m_iAttackErrCnt = 0; + m_InvalidObj[GetSelectedTarget()] = INVALIDOBJ_TIMEOUT; + } + } + + public void ResetAttackError() + { + m_iAttackErrCnt = 0; + } + + public void ResetPickupError() + { + m_iPickupErrCnt = 0; + } + + public int GetAttackError() => m_iAttackErrCnt; + public int GetPickupError() => m_iPickupErrCnt; + + public void OnActionEvent(int iEvent, int iParam) + { + m_pCurAction?.OnEvent(iEvent, iParam); + } + + private void DoDelayTask(int iType, int iParam1 = 0, int iParam2 = 0) + { + m_DelayTask.iType = iType; + m_DelayTask.iParam1 = iParam1; + m_DelayTask.iParam2 = iParam2; + + if (m_pHost.IsMeleeing() || m_pHost.IsPlayerMoving()) + CancelAction(); + } + + private void ProcessDelayTask() + { + if (m_pCurAction != null && !m_pCurAction.CanBreak()) + return; + + ClearAction(); + m_iAttackErrCnt = 0; + m_iPickupErrCnt = 0; + + switch (m_DelayTask.iType) + { + case ACTION_CASTSKILL: + CastSkill(m_DelayTask.iParam1); + break; + + case ACTION_COMBOSKILL: + CastComboSkill(m_DelayTask.iParam1, m_DelayTask.iParam2 == 1); + break; + + default: + throw new InvalidOperationException("Unknown delay task type"); + } + + m_DelayTask.iType = ACTION_IDLE; + m_DelayTask.iParam1 = 0; + m_DelayTask.iParam2 = 0; + } + + // ========================================================= + // Action implementations (converted 1:1) + // ========================================================= + + private sealed class IdleAction : Action + { + private int m_iTime; + + public IdleAction(CECPlayerWrapper pPlayer, int iTime) + : base(pPlayer, ACTION_IDLE) + { + m_iTime = iTime; + } + + public override bool Tick(uint dwDeltaTime) + { + if (HaveNextAction()) + return true; + + if (m_iTime > 0) + { + m_iTime -= (int)dwDeltaTime; + return m_iTime <= 0; + } + + return true; + } + } + + private sealed class MoveAction : Action + { + private bool m_bFinish; + private int m_iTimeOut; + + public MoveAction(CECPlayerWrapper pPlayer) + : base(pPlayer, ACTION_MOVE) + { + m_bFinish = false; + m_iTimeOut = 30000; + } + + public override bool CanBreak() => false; + + public override bool Tick(uint dwDeltaTime) + { + m_iTimeOut -= (int)dwDeltaTime; + if (m_iTimeOut <= 0) + return true; + + return m_bFinish; + } + + public override void OnEvent(int iEvent, int iParam) + { + if (iEvent == AP.AP_EVENT_CANNOTMOVE || iEvent == AP.AP_EVENT_MOVEFINISHED) + m_bFinish = true; + } + } + + private sealed class CastSkillAction : Action + { + private const int TRACE = 0; + private const int SPELL = 1; + + private int m_iStep; + private bool m_bFinish; + private int m_iTimeOut; + private bool m_bSuccess; + + public CastSkillAction(CECPlayerWrapper pPlayer) + : base(pPlayer, ACTION_CASTSKILL) + { + m_iStep = TRACE; + m_iTimeOut = 30000; + m_bSuccess = false; + m_bFinish = false; + } + + public override void EndAction() + { + if (m_bSuccess) + host.ResetAttackError(); + } + + public override bool CanBreak() + { + return m_iStep == TRACE && !host.GetHostPlayer().IsPlayerMoving(); + } + + public override bool Tick(uint dwDeltaTime) + { + m_iTimeOut -= (int)dwDeltaTime; + if (m_iTimeOut <= 0) + return true; + + return m_bFinish; + } + + public override void OnEvent(int iEvent, int iParam) + { + if (m_iStep == TRACE) + { + if (iEvent == AP.AP_EVENT_TRACEOK) + { + m_iStep = SPELL; + m_iTimeOut = 2000; + } + else if (iEvent == AP.AP_EVENT_MOVEFINISHED) + { + m_bFinish = true; + } + } + else if (m_iStep == SPELL) + { + if (iEvent == AP.AP_EVENT_STARTSKILL) + { + m_iTimeOut = iParam * 2; + m_bSuccess = true; + } + else if (iEvent == AP.AP_EVENT_STOPSKILL) + { + m_bFinish = true; + } + } + } + } + + private sealed class UseItemAction : Action + { + private bool m_bFinish; + private int m_iTimeOut; + + public UseItemAction(CECPlayerWrapper pPlayer) + : base(pPlayer, ACTION_USEITEM) + { + m_bFinish = false; + m_iTimeOut = 2000; + } + + public override bool CanBreak() => false; + + public override bool Tick(uint dwDeltaTime) + { + m_iTimeOut -= (int)dwDeltaTime; + if (m_iTimeOut <= 0) + return true; + + return m_bFinish; + } + + public override void OnEvent(int iEvent, int iParam) + { + if (iEvent == AP.AP_EVENT_STARTUSEITEM) + { + m_iTimeOut = iParam * 2; + } + else if (iEvent == AP.AP_EVENT_STOPUSEITEM) + { + m_bFinish = true; + } + } + } + + private sealed class PickupAction : Action + { + private const int TRACE = 0; + private const int PICKUP = 1; + + private int m_iStep; + private bool m_bFinish; + private int m_iTimeOut; + private bool m_bSuccess; + private readonly int m_iMatterID; + + public PickupAction(CECPlayerWrapper pPlayer, int iMatterID) + : base(pPlayer, ACTION_PICKUP) + { + m_iMatterID = iMatterID; + m_iTimeOut = 30000; + m_iStep = TRACE; + m_bSuccess = false; + m_bFinish = false; + } + + public override void EndAction() + { + if (m_bSuccess) + host.ResetPickupError(); + } + + public override bool CanBreak() + { + return m_iStep == TRACE && !host.GetHostPlayer().IsPlayerMoving(); + } + + public override bool Tick(uint dwDeltaTime) + { + m_iTimeOut -= (int)dwDeltaTime; + if (m_iTimeOut <= 0) + return true; + + return m_bFinish; + } + + public override void OnEvent(int iEvent, int iParam) + { + if (m_iStep == TRACE) + { + if (iEvent == AP.AP_EVENT_TRACEOK) + { + m_iStep = PICKUP; + m_iTimeOut = 2000; + } + else if (iEvent == AP.AP_EVENT_MOVEFINISHED) + { + m_bFinish = true; + } + } + else if (m_iStep == PICKUP) + { + if (iEvent == AP.AP_EVENT_PICKUPOK) + { + m_bFinish = true; + m_bSuccess = true; + } + else if (iEvent == AP.AP_EVENT_CANNOTPICKUP) + { + m_bFinish = true; + host.SetInvalidObject(m_iMatterID); + host.ResetPickupError(); + } + } + } + } + + private sealed class MeleeAction : Action + { + private const int TRACE = 0; + private const int MELEE = 1; + + private bool m_bFinish; + private int m_iStep; + private int m_iTimeOut; + private bool m_bMeleeing; + private bool m_bLastMeleeStopped; + + public MeleeAction(CECPlayerWrapper pPlayer) + : base(pPlayer, ACTION_MELEE) + { + m_iStep = TRACE; + m_iTimeOut = 30000; + m_bMeleeing = false; + m_bFinish = false; + m_bLastMeleeStopped = true; + } + + public override bool CanBreak() + { + return m_iStep == TRACE && !host.GetHostPlayer().IsPlayerMoving(); + } + + public override bool Tick(uint dwDeltaTime) + { + if (!m_bMeleeing) + { + m_iTimeOut -= (int)dwDeltaTime; + if (m_iTimeOut <= 0) + return true; + + return m_bFinish; + } + + return false; + } + + public override void OnEvent(int iEvent, int iParam) + { + if (iEvent == AP.AP_EVENT_TRACEOK) + { + if (m_iStep == TRACE) + { + m_iStep = MELEE; + m_iTimeOut = 2000; + } + } + else if (iEvent == AP.AP_EVENT_MOVEFINISHED) + { + if (m_iStep == TRACE) + m_bFinish = true; + } + else if (iEvent == AP.AP_EVENT_STARTMELEE) + { + if (m_iStep == MELEE) + { + m_bMeleeing = true; + m_iTimeOut = 10000; + host.ResetAttackError(); + } + } + else if (iEvent == AP.AP_EVENT_STOPMELEE) + { + if (!m_bLastMeleeStopped) + { + m_bMeleeing = false; + m_bLastMeleeStopped = true; + return; + } + + if (m_iStep == MELEE && m_bMeleeing) + { + m_bMeleeing = false; + m_bFinish = true; + host.ResetAttackError(); + } + } + else if (iEvent == AP.AP_EVENT_MELEEOUTOFRANGE) + { + if (!m_bLastMeleeStopped) + { + m_bLastMeleeStopped = true; + return; + } + + if (m_iStep == MELEE) + { + m_iStep = TRACE; + m_iTimeOut = 30000; + m_bLastMeleeStopped = (iParam == 1); + } + } + } + } + + private sealed class ComboSkillAction : Action + { + private const int TRACE = 0; + private const int SPELL = 1; + private const int MELEE = 2; + + private int m_iState; + private int m_iTimeOut; + private bool m_bFinish; + private bool m_bMeleeing; + private bool m_bCasting; + private bool m_bDelayContinue; + private bool m_bSelfSkillFlag; + private bool m_bSending; + private bool m_bLastMeleeStopped; + + public ComboSkillAction(CECPlayerWrapper pPlayer) + : base(pPlayer, ACTION_COMBOSKILL) + { + m_iState = TRACE; + m_iTimeOut = 30000; + m_bMeleeing = false; + m_bDelayContinue = false; + m_bCasting = false; + m_bSelfSkillFlag = false; + m_bSending = false; + m_bFinish = false; + m_bLastMeleeStopped = true; + } + + public override bool CanBreak() + { + return !m_bSending && !m_bCasting && !m_bMeleeing && !host.GetHostPlayer().IsPlayerMoving(); + } + + public override bool Tick(uint dwDeltaTime) + { + var pCombo = host.GetHostPlayer().GetComboSkill(); + if (pCombo == null && !m_bMeleeing) + return true; + + if (pCombo != null && !pCombo.IsIgnoreAtkLoop() && + pCombo.GetTarget() != host.GetSelectedTarget() && + !m_bCasting && !m_bMeleeing) + return true; + + if (!m_bMeleeing) + { + m_iTimeOut -= (int)dwDeltaTime; + if (m_iTimeOut <= 0) + return true; + + return m_bFinish; + } + + return false; + } + + public override void OnEvent(int iEvent, int iParam) + { + if (iEvent == AP.AP_EVENT_COMBOCONTINUE) + { + if (m_iState == MELEE) + { + m_bDelayContinue = true; + m_bSelfSkillFlag = (iParam == 1); + } + else + { + if (iParam == 1) + { + m_iState = SPELL; + m_iTimeOut = 2000; + m_bSending = true; + } + else + { + m_iState = TRACE; + m_iTimeOut = 30000; + } + } + } + else if (iEvent == AP.AP_EVENT_TRACEOK) + { + if (m_iState == TRACE) + { + m_iState = (iParam == 0) ? MELEE : SPELL; + m_iTimeOut = 2000; + m_bSending = true; + } + } + else if (iEvent == AP.AP_EVENT_MOVEFINISHED) + { + if (m_iState == TRACE) + m_bFinish = true; + } + else if (iEvent == AP.AP_EVENT_STARTMELEE) + { + if (m_iState == MELEE) + { + m_iTimeOut = 10000; + m_bMeleeing = true; + m_bSending = false; + host.ResetAttackError(); + } + } + else if (iEvent == AP.AP_EVENT_STOPMELEE) + { + if (!m_bLastMeleeStopped) + { + m_bMeleeing = false; + m_bLastMeleeStopped = true; + return; + } + + if (m_iState == MELEE && m_bMeleeing) + { + m_bMeleeing = false; + host.ResetAttackError(); + + var pCombo = host.GetHostPlayer().GetComboSkill(); + if (pCombo != null && pCombo.IsStop()) + { + m_bFinish = true; + } + else + { + m_iTimeOut = 10000; + + if (m_bDelayContinue) + { + m_bDelayContinue = false; + + if (m_bSelfSkillFlag) + { + m_iState = SPELL; + m_iTimeOut = 2000; + m_bSending = true; + } + else + { + m_iState = TRACE; + m_iTimeOut = 30000; + } + } + } + } + } + else if (iEvent == AP.AP_EVENT_MELEEOUTOFRANGE) + { + if (!m_bLastMeleeStopped) + { + m_bLastMeleeStopped = true; + return; + } + + if (m_iState == MELEE) + { + m_iState = TRACE; + m_iTimeOut = 30000; + m_bLastMeleeStopped = (iParam == 1); + } + } + else if (iEvent == AP.AP_EVENT_STARTSKILL) + { + if (m_iState == SPELL) + { + m_iTimeOut = iParam * 2; + m_bCasting = true; + m_bSending = false; + host.ResetAttackError(); + } + } + else if (iEvent == AP.AP_EVENT_STOPSKILL) + { + if (m_iState == SPELL && m_bCasting) + { + m_bCasting = false; + host.ResetAttackError(); + + var pCombo = host.GetHostPlayer().GetComboSkill(); + if (pCombo != null && pCombo.IsStop()) + m_bFinish = true; + else + m_iTimeOut = 10000; + } + } + else if (iEvent == AP.AP_EVENT_COMBOFINISH) + { + m_bFinish = true; + } + } + } + public enum AP_EVENT + { + AP_EVENT_CANNOTMOVE, // ²»ÄÜÒÆ¶¯ + AP_EVENT_MOVEFINISHED, // ÒÆ¶¯½áÊø + AP_EVENT_TRACEOK, // ×·×ٳɹ¦ + AP_EVENT_STARTSKILL, // ¼¼ÄÜ¿ªÊ¼ + AP_EVENT_STOPSKILL, // ¼¼ÄÜãֹ + AP_EVENT_STARTUSEITEM, // ʹÓÃÎïÆ·¿ªÊ¼ + AP_EVENT_STOPUSEITEM, // ʹÓÃÎïÆ·½áÊø + AP_EVENT_PICKUPOK, // ³É¹¦¼ñÈ¡ÎïÆ· + AP_EVENT_CANNOTPICKUP, // ËûÈËÎïÆ·£¬²»ÄܼñÈ¡ + AP_EVENT_STARTMELEE, // ¿ªÊ¼ÆÕ¹¥ + AP_EVENT_STOPMELEE, // ½áÊøÆÕ¹¥ + AP_EVENT_COMBOCONTINUE, // ×éºÃ¼¼Ãƽø + AP_EVENT_COMBOFINISH, // ×éºÃ¼¼ÖÕÖ¹£¬Ó¦¶Ô×îºóÒ»¸ö¼¼ÄÜûÓ÷ųöµÄÇé¿ö + AP_EVENT_MELEEOUTOFRANGE, // ÆÕ¹¥³¬³ö¾àÀë + }; +} diff --git a/Assets/PerfectWorld/Scripts/Skills/CECComboSkill.cs b/Assets/PerfectWorld/Scripts/Skills/CECComboSkill.cs index 6deb9bc47d..8a09f7e71e 100644 --- a/Assets/PerfectWorld/Scripts/Skills/CECComboSkill.cs +++ b/Assets/PerfectWorld/Scripts/Skills/CECComboSkill.cs @@ -12,8 +12,12 @@ * Copyright (c) 2005 Archosaur Studio, All Rights Reserved. */ +using BrewMonster.Assets.PerfectWorld.Scripts.Players; +using BrewMonster.Network; using BrewMonster.Scripts.Skills; +using CSNetwork; using UnityEngine; +using static CECPlayerWrapper; namespace BrewMonster { @@ -79,12 +83,9 @@ namespace BrewMonster m_bIgnoreAtkLoop = bIgnoreAtkLoop; // TODO: Get combo skill configuration from CECConfigs - // CECConfigs pCfg = g_pGame.GetConfigs(); - // m_cs = pCfg.GetVideoSettings().comboSkill[iGroup]; - // For now, we'll just initialize with empty data - m_cs = new EC_COMBOSKILL(true); + CECConfigs pCfg = EC_Game.GetConfigs(); + m_cs = pCfg.GetVideoSettings().comboSkill[iGroup]; - // Find the last loop start flag - 查找最åŽä¸€ä¸ªå¾ªçŽ¯å¼€å§‹æ ‡è®° / Find the last loop start flag m_iLoopStart = -1; for (int i = 0; i < EC_ConfigConstants.EC_COMBOSKILL_LEN; i++) { @@ -130,7 +131,7 @@ namespace BrewMonster return false; // TODO: Get PlayerWrapper from CECAutoPolicy - // CECPlayerWrapper pWrapper = CECAutoPolicy.GetInstance().GetPlayerWrapper(); + CECPlayerWrapper pWrapper = CECAutoPolicy.GetInstance().GetPlayerWrapper(); int idSkill = GetNextSkill(); if (idSkill > 0) @@ -143,27 +144,27 @@ namespace BrewMonster if (!IsStop()) { // TODO: Post message to continue combo skill - // g_pGame.GetGameRun().PostMessage(MSG_HST_CONTINUECOMBOSKILL, MAN_PLAYER, 0, bMeleeing ? 1 : 0, m_iGroup); + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_CONTINUECOMBOSKILL, MANAGER_INDEX.MAN_PLAYER, 0, bMeleeing ? 1 : 0, m_iGroup); } else { // è¿žå‡»æŠ€èƒ½åœæ­¢ / Combo skill finish - // TODO: AP_ActionEvent(AP_EVENT_COMBOFINISH); + AP_ActionEvent((int)AP_EVENT. AP_EVENT_COMBOFINISH); } return false; } else { // TODO: Handle auto policy events - // if (CECAutoPolicy.GetInstance().IsAutoPolicyEnabled()) - // pWrapper.AddAttackError(); + if (CECAutoPolicy.GetInstance().IsAutoPolicyEnabled()) + pWrapper.AddAttackError(); // 检测自己施放是å¦è¿½åŠ  / Check if self-cast should be tracked int iSelfCureFlag = 0; if (m_pHost.GetPrepSkill() != null) iSelfCureFlag = 1; - // TODO: AP_ActionEvent(AP_EVENT_COMBOCONTINUE, iSelfCureFlag); + AP_ActionEvent((int)AP_EVENT.AP_EVENT_COMBOCONTINUE, iSelfCureFlag); } } else if (idSkill == (short)SpecialSkillID.SID_ATTACK) @@ -175,10 +176,10 @@ namespace BrewMonster if (bRet) { // TODO: Handle auto policy events - // if (CECAutoPolicy.GetInstance().IsAutoPolicyEnabled()) - // pWrapper.AddAttackError(); + if (CECAutoPolicy.GetInstance().IsAutoPolicyEnabled()) + pWrapper.AddAttackError(); - // TODO: AP_ActionEvent(AP_EVENT_COMBOCONTINUE); + AP_ActionEvent((int)AP_EVENT.AP_EVENT_COMBOCONTINUE); } else { @@ -186,12 +187,12 @@ namespace BrewMonster if (!IsStop()) { // TODO: Post message to continue combo skill - // g_pGame.GetGameRun().PostMessage(MSG_HST_CONTINUECOMBOSKILL, MAN_PLAYER, 0, bMeleeing ? 1 : 0, m_iGroup); + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_CONTINUECOMBOSKILL, MANAGER_INDEX.MAN_PLAYER, 0, bMeleeing ? 1 : 0, m_iGroup); } else { // è¿žå‡»æŠ€èƒ½åœæ­¢ / Combo skill finish - // TODO: AP_ActionEvent(AP_EVENT_COMBOFINISH); + AP_ActionEvent((int)AP_EVENT.AP_EVENT_COMBOFINISH); } return false; } @@ -203,12 +204,12 @@ namespace BrewMonster if (!IsStop()) { // TODO: Post message to continue combo skill - // g_pGame.GetGameRun().PostMessage(MSG_HST_CONTINUECOMBOSKILL, MAN_PLAYER, 0, bMeleeing ? 1 : 0, m_iGroup); + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_CONTINUECOMBOSKILL, MANAGER_INDEX.MAN_PLAYER, 0, bMeleeing ? 1 : 0, m_iGroup); } else { // è¿žå‡»æŠ€èƒ½åœæ­¢ / Combo skill finish - // TODO: AP_ActionEvent(AP_EVENT_COMBOFINISH); + AP_ActionEvent((int)AP_EVENT.AP_EVENT_COMBOFINISH); } return false; } @@ -326,6 +327,16 @@ namespace BrewMonster { return m_iGroup; } + public void AP_ActionEvent(int iEvent, int iParam = 0) + { + if (!CECAutoPolicy.GetInstance().IsAutoPolicyEnabled()) + return; + + CECPlayerWrapper pWrapper = CECAutoPolicy.GetInstance().GetPlayerWrapper(); + if (pWrapper != null) pWrapper.OnActionEvent(iEvent, iParam); + + } + } } diff --git a/Assets/PerfectWorld/Scripts/Skills/CECSCSkillGrp.cs b/Assets/PerfectWorld/Scripts/Skills/CECSCSkillGrp.cs new file mode 100644 index 0000000000..7b07fde110 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Skills/CECSCSkillGrp.cs @@ -0,0 +1,69 @@ +using BrewMonster.Network; +using BrewMonster.Scripts; +using BrewMonster.Scripts.Skills; +using CSNetwork.GPDataType; +using System; +using System.Diagnostics; +using UnityEngine; + +namespace BrewMonster +{ + /// + /// Shortcut representing a combo skill group. + /// + [Serializable] + public class CECSCSkillGrp : CECShortcut + { + private int m_iGroupIdx; + private string m_strDesc; + + public CECSCSkillGrp() + { + m_iSCType = (int)ShortcutType.SCT_SKILLGRP; + m_iGroupIdx = -1; + m_strDesc = string.Empty; + } + + private CECSCSkillGrp(CECSCSkillGrp src) + { + m_iSCType = src.m_iSCType; + m_iGroupIdx = src.m_iGroupIdx; + m_strDesc = src.m_strDesc; + } + + /// + /// Initialize the shortcut and build its description from the string tables. + /// + public bool Init(int iGroupIdx) + { + m_iGroupIdx = iGroupIdx; + var strTab = EC_Game.GetItemDesc(); + string format = strTab?.GetWideString((int)DescriptipionMsg.CMDDESC_SKILLGROUP); + + if (string.IsNullOrEmpty(format)) + m_strDesc = $"Skill Group {m_iGroupIdx}"; + else + m_strDesc = GPDataTypeHelper.ReplacePercentD(format, m_iGroupIdx); + + return true; + } + + public int GetGroupIndex() => m_iGroupIdx; + + public string GetDesc() => m_strDesc; + + public override CECShortcut Clone() => new CECSCSkillGrp(this); + + public override bool Execute() + { + CECHostPlayer host = EC_Game.GetGameRun().GetHostPlayer(); + if (host == null) { + BMLogger.LogError("HostPlayer = null in CECSCSkillGrp::Execute"); + return false; + } + + host.ApplyComboSkill(m_iGroupIdx, false, -1); + return true; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Skills/CECSCSkillGrp.cs.meta b/Assets/PerfectWorld/Scripts/Skills/CECSCSkillGrp.cs.meta new file mode 100644 index 0000000000..9d1ed56971 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Skills/CECSCSkillGrp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 512f4bac6274464499a0be2923ed4d63 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Skills/CECSkillConvert.cs b/Assets/PerfectWorld/Scripts/Skills/CECSkillConvert.cs new file mode 100644 index 0000000000..0e5386af78 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Skills/CECSkillConvert.cs @@ -0,0 +1,85 @@ +// Filename : CECSkillConvert.cs +// Creator : zhangyitian +// Date : 2014/07/09 +// Converted to C# from EC_SkillConvert.cpp + +using CSNetwork.GPDataType; +using System.Collections.Generic; + +namespace BrewMonster.Scripts.Skills +{ + // ç¥žé­”è½¬æ¢æŸ¥è¯¢è¡¨ // God-Evil skill conversion table + public class CECSkillConvert + { + private static CECSkillConvert instance; + private Dictionary m_convertTable; + private bool m_bInitialized; + + private CECSkillConvert() + { + m_convertTable = new Dictionary(); + m_bInitialized = false; + } + + // å•例 // Singleton + public static CECSkillConvert Instance + { + get + { + if (instance == null) + { + instance = new CECSkillConvert(); + } + return instance; + } + } + + private void Initialize() + { + var pDB = ElementDataManProvider.GetElementDataMan(); + + var dt = DATA_TYPE.DT_GOD_EVIL_CONVERT_CONFIG; + var map = pDB.GetAllDataTypeWithType(ID_SPACE.ID_SPACE_CONFIG, dt); + if (map == null) + { + BMLogger.LogError("CECSkillConvert Initialize failed: no data found for DT_GOD_EVIL_CONVERT_CONFIG"); + return; + } + + foreach (var obj in map) + { + GOD_EVIL_CONVERT_CONFIG config = (GOD_EVIL_CONVERT_CONFIG)obj; + if (config.skill_map != null) + { + for (int i = 0; i + 1 < map.Length; i += 2) + { + if (config.skill_map[i] != 0 && + config.skill_map[i+128] != 0) + { + m_convertTable[config.skill_map[i]] = config.skill_map[i + 128]; + m_convertTable[config.skill_map[i+128]] = config.skill_map[i]; + } + } + } + } + + m_bInitialized = true; + } + + // 获得转æ¢åŽçš„æŠ€èƒ½ï¼Œè¿”回0表示没有转æ¢çš„æŠ€èƒ½ // Get the converted skill, return 0 if no conversion exists + public int GetConvertSkill(int skillID) + { + if (!m_bInitialized) + { + Initialize(); + } + + if (m_convertTable.TryGetValue(skillID, out int convertedSkillID)) + { + return convertedSkillID; + } + + return 0; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Skills/CECSkillConvert.cs.meta b/Assets/PerfectWorld/Scripts/Skills/CECSkillConvert.cs.meta new file mode 100644 index 0000000000..d3f7344d26 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Skills/CECSkillConvert.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7d3e4a2b8c9f4e1a9b6c5d8e7f3a2b1c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Skills/EC_HostSkillModel.cs b/Assets/PerfectWorld/Scripts/Skills/EC_HostSkillModel.cs index abbbe8f79d..dd67a07774 100644 --- a/Assets/PerfectWorld/Scripts/Skills/EC_HostSkillModel.cs +++ b/Assets/PerfectWorld/Scripts/Skills/EC_HostSkillModel.cs @@ -44,13 +44,13 @@ namespace BrewMonster.Scripts.Skills { BMLogger.LogError("CECHostSkillModel BeforeSceneLoad Reset"); Instance = null; - } + } #endif public IReadOnlyDictionary> GetAllRankProfSkills() { return m_allRankProfSkills; } - public CECHostSkillModel() + public CECHostSkillModel() { m_skillLearnNPCNID = 0; m_bReceivedNPCGreeting = false; @@ -84,6 +84,24 @@ namespace BrewMonster.Scripts.Skills //BMLogger.LogError($"[Skill] Sent SEVNPC_HELLO to skill-learn NPC nid={m_skillLearnNPCNID}"); } } + public enumEvilGod GetSkillEvilGod(int skillID) + { + CECSkill skill = new CECSkill(skillID, 1); + int rank = skill.GetRank(); + CECTaoistRank taoistRank = CECTaoistRank.GetTaoistRank(rank); + if (taoistRank.IsGodRank()) + { + return enumEvilGod.SKILL_GOD; + } + else if (taoistRank.IsEvilRank()) + { + return enumEvilGod.SKILL_EVIL; + } + else + { + return enumEvilGod.SKILL_BASE; + } + } public enumSkillLearnedState GetSkillLearnedState(int skillID) { CECSkill pSkill = CECGameRun.Instance.GetHostPlayer().GetNormalSkill(skillID); @@ -286,6 +304,16 @@ namespace BrewMonster.Scripts.Skills { return CECGameRun.Instance.GetHostPlayer().CheckSkillLearnCondition(skillID, true); } + public string GetSkillDescription(int skillID, int level) + { + string tmp = ""; + if (CECSkill.GetDesc(skillID, level, tmp, 1024)) + { + return (tmp); + } + + return tmp; + } public int GetRequiredBook(int skillID, int level) { int itemId = ElementSkill.GetRequiredBook((uint)skillID, level); @@ -372,9 +400,9 @@ namespace BrewMonster.Scripts.Skills var juniors = GetJunior(rootSkillID); int maxHeight = 0; - for (int i = 0; i < juniors.Count; i++) + foreach(var skill in juniors) { - int subHeight = GetSkillTreeHeight((int)juniors[i].id); + int subHeight = GetSkillTreeHeight((int)skill.Key); if (subHeight > maxHeight) { maxHeight = subHeight; @@ -383,7 +411,7 @@ namespace BrewMonster.Scripts.Skills return 1 + maxHeight; } - private List<(uint id, int level)> GetJunior(int skillID) + public Dictionary GetJunior(int skillID) { if (!m_allProfSkills.TryGetValue(skillID, out var skill)) { @@ -391,14 +419,13 @@ namespace BrewMonster.Scripts.Skills } var juniors = skill.GetJunior(); - var ret = new List<(uint id, int level)>(); + var ret = new Dictionary(); foreach (var (id, level) in juniors) { if (id != 0) - ret.Add((id, level)); + ret[id] = level; } - return ret; } private HashSet GetRootSkillSet() @@ -436,7 +463,7 @@ namespace BrewMonster.Scripts.Skills { ElementSkill pSkill = ElementSkill.Create(skillService.id_skills[i], 1); - if (pSkill == null) + if (pSkill == null) { //BMLogger.LogError($"Hoang Dev pSkill is null for skill {i} :" + skillService.id_skills[i]); continue; diff --git a/Assets/PerfectWorld/Scripts/Skills/ElementSkill.cs b/Assets/PerfectWorld/Scripts/Skills/ElementSkill.cs index 1349da0567..68a20e1ced 100644 --- a/Assets/PerfectWorld/Scripts/Skills/ElementSkill.cs +++ b/Assets/PerfectWorld/Scripts/Skills/ElementSkill.cs @@ -100,8 +100,8 @@ namespace BrewMonster.Scripts.Skills public int move_env; //�ƶ����� // Movement environment public bool is_combat; //�Ƿ�ս��״̬ // Whether in combat state public int hp; //��ǰhp // Current HP - public int max_hp; //���hp // Maximum HP - // public ComboSkillState combo_state; //���������� // Combo skill state + public int max_hp; //���hp // Maximum HP + public ComboSkillState combo_state; //���������� // Combo skill state }; public struct GoblinUseRequirement @@ -191,7 +191,7 @@ namespace BrewMonster.Scripts.Skills return ""; } // ����˵�� - public virtual string GetIntroduction(StringBuilder buf, int len, SkillStr table) { return ""; } + public virtual void GetIntroduction(StringBuilder buf, SkillStr table) { } // ����ְҵ���� public virtual int GetCls() { return -1; } // ������ȴʱ�䣬��λ���� @@ -240,13 +240,30 @@ namespace BrewMonster.Scripts.Skills int ret = skill.GetRequiredBook(); return ret; } - // ѧϰ���󾳽�ȼ�? + public static int GetRequiredLevel(uint id, int level) + { + Skill s = Skill.Create(id, level); + if (s == null) + return 0; + + int ret = s.GetRequiredLevel(); + return ret; + } public virtual int GetRequiredRealmLevel() { return 0; } - + public static int GetRequiredRealmLevel(uint id, int level) + { + Skill s = Skill.Create(id, level); + if (s == null) + return 0; + + int ret = s.GetRequiredRealmLevel(); + return ret; + } + public virtual Dictionary GetRequiredSkill() => new Dictionary(); - + public virtual int GetShowOrder() { return 0; } - + public virtual int SetLevel(int level) { return 0; } public static int SetLevel(uint id, int level) @@ -326,6 +343,41 @@ namespace BrewMonster.Scripts.Skills return s.IsMovingSkill(); return false; } + + public static Dictionary GetComboSkActivated(ComboSkillState comboState) + { + var result = new Dictionary(); + if (comboState.skillid == 0) + return result; + + if (SkillStub.GetComboSkMap().TryGetValue(comboState.skillid, out List postSkills) && postSkills != null) + { + foreach (uint skillId in postSkills) + { + Skill skill = Skill.Create(skillId, 1); + if (skill == null) + continue; + + ref ComboArg comboArg = ref skill.GetPlayer().GetComboarg(); + for (int i = 0; i < ComboArg.MAX_COMBO_ARG; i++) + { + int argValue = 0; + if (comboState.arg != null && i < comboState.arg.Length) + { + argValue = comboState.arg[i]; + } + comboArg.SetValue((uint)i, argValue); + } + + if (skill.CheckComboSkExtraCondition()) + { + result[skill.GetId()] = skill.GetComboSkInterval(); + } + } + } + + return result; + } // �����ܷ��ڵ�ǰ����״̬��ʹ�� // Whether skill can be used in current form state public bool IsValidForm(byte form) { @@ -363,13 +415,13 @@ namespace BrewMonster.Scripts.Skills skill = Skill.Create(id, ilevel); if (skill == null) return 5; - + int ret = 0; SkillWrapper wrapper = SkillWrapper.Instance; if (wrapper.IsOverridden(id)) return 11; - + int srank, prank; srank = skill.GetRank(); prank = info.rank; @@ -389,17 +441,17 @@ namespace BrewMonster.Scripts.Skills ret = 4; else if (info.level < skill.GetRequiredLevel()) ret = 2; - + if (ret != 0) { return ret; } - + if (info.sp < skill.GetRequiredSp()) ret = 1; else if (info.money < skill.GetRequiredMoney()) ret = 6; - + var pre_skills = skill.GetRequiredSkill(); foreach (var kvp in pre_skills) { @@ -419,65 +471,75 @@ namespace BrewMonster.Scripts.Skills if (ability > 0 && wrapper.GetAbility(id) < ability) ret = 10; } - + if (info.realm_level < skill.GetRequiredRealmLevel()) ret = 12; return ret; } // 0:�ɹ� 1:����SP���� 2:�����츳�㲻�� - // 3:���� 4:���ܸ������� 5:����ID - // 6:��Ǯ���� 7:��С���鼼�� 8:û�м����� - // 9:�ȼ����� 10:�������޲��� 11:ְҵ��ƥ�� - // 12:�������޲��㣬��ְҵ��ƥ�� + // 3:���� 4:���ܸ������� 5:����ID + // 6:��Ǯ���� 7:��С���鼼�� 8:û�м����� + // 9:�ȼ����� 10:�������޲��� 11:ְҵ��ƥ�� + // 12:�������޲��㣬��ְҵ��ƥ�� public static int GoblinLearn(uint id, GoblinRequirement info, int level) { Skill s = Skill.Create(id, level); - if(s == null) + if (s == null) return 5; - if(level<1 || level> s.GetMaxLevel()) + if (level < 1 || level > s.GetMaxLevel()) return 3; - if(s.GetCls() != 258) + if (s.GetCls() != 258) return 7; - + int ret = 0; - - int[] iReqGen = new int[5] {0, 0, 0, 0, 0}; + + int[] iReqGen = new int[5] { 0, 0, 0, 0, 0 }; int iReqLevel = s.GetRequiredLevel(); // iReqLevelΪ7λ�����������λΪ�ȼ���ǰ5λΪ�츳���������λΪ�� - int iLevelRequirement = iReqLevel%100; - if(info.level < iLevelRequirement) + int iLevelRequirement = iReqLevel % 100; + if (info.level < iLevelRequirement) return 9; iReqLevel /= 100; int i; - for(i=0;i<5;i++) + for (i = 0; i < 5; i++) { - iReqGen[4-i] = iReqLevel%10; + iReqGen[4 - i] = iReqLevel % 10; iReqLevel /= 10; } - for(i=0;i<5;i++) + for (i = 0; i < 5; i++) { - if(info.genius[i] < iReqGen[4-i]) + if (info.genius[i] < iReqGen[4 - i]) return 2; } - - if(info.sp < s.GetRequiredSp()) + + if (info.sp < s.GetRequiredSp()) ret = 1; //else if(info.moneyGetRequiredMoney(id, level)) // ret = 6; - if(info.mp < s.GetMpCost() && + if (info.mp < s.GetMpCost() && ((s.GetCls() != 0) && (((1 << info.profession) & s.GetCls()) == 0))) ret = 12; - else if(info.mp < s.GetMpCost()) + else if (info.mp < s.GetMpCost()) ret = 10; - else if((s.GetCls() != 0) && (((1 << info.profession) & s.GetCls()) == 0)) + else if ((s.GetCls() != 0) && (((1 << info.profession) & s.GetCls()) == 0)) ret = 11; return ret; } + public virtual int GetComboSkPreSkill() { return 0; } + public static int GetComboSkPreSkill(uint id) + { + SkillStub s = SkillStub.GetStub(id); + if (s != null) + { + return s.combosk_preskill; + } + return 0; + } } } \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Skills/FLOW_COMBO_SKILL_CLICK.md b/Assets/PerfectWorld/Scripts/Skills/FLOW_COMBO_SKILL_CLICK.md new file mode 100644 index 0000000000..125820523d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Skills/FLOW_COMBO_SKILL_CLICK.md @@ -0,0 +1,260 @@ +# Comparison: OnMsgPlayerCastSkill - C++ vs C# Conversion + +## Summary +The conversion from C++ to C# is **mostly complete** but has some **missing elements** and **commented-out code** that should be reviewed. + +## All Switch Cases Present ✅ +All 9 switch cases are present in both versions: +1. ✅ `OBJECT_CAST_SKILL` +2. ✅ `SKILL_PERFORM` +3. ✅ `HOST_STOP_SKILL` +4. ✅ `SELF_SKILL_INTERRUPTED` +5. ✅ `OBJECT_CAST_INSTANT_SKILL` +6. ✅ `OBJECT_CAST_POS_SKILL` +7. ✅ `PLAYER_CAST_RUNE_SKILL` +8. ✅ `PLAYER_CAST_RUNE_INSTANT_SKILL` +9. ✅ `ERROR_MESSAGE` +10. ✅ `default` case + +## Missing/Incomplete Elements + +### 1. Missing Assertion Check in OBJECT_CAST_SKILL ⌠+**C++ (line 5876):** +```cpp +ASSERT(pCmd->caster == m_PlayerInfo.cid); +``` + +**C# (line 916):** +```csharp +// MISSING: No assertion check for pCmd.caster == m_PlayerInfo.cid +``` + +**Impact:** Medium - This is a safety check that validates the caster ID matches the player's ID. + +### 2. Commented Out AP_ActionEvent in HOST_STOP_SKILL âš ï¸ +**C++ (line 5958):** +```cpp +AP_ActionEvent(AP_EVENT_STOPSKILL); +``` + +**C# (line 1025):** +```csharp +//AP_ActionEvent(AP_EVENT_STOPSKILL); +``` + +**Impact:** Medium - Action event notification is disabled. May affect auto-policy or other systems that listen to this event. + +### 3. Commented Out AP_ActionEvent in SELF_SKILL_INTERRUPTED âš ï¸ +**C++ (line 6005):** +```cpp +AP_ActionEvent(AP_EVENT_STOPSKILL); +``` + +**C# (line 1084):** +```csharp +//AP_ActionEvent(AP_EVENT_STOPSKILL); +``` + +**Impact:** Medium - Same as above. + +### 4. Missing Fixed Message in SELF_SKILL_INTERRUPTED âš ï¸ +**C++ (line 6003):** +```cpp +g_pGame->GetGameRun()->AddFixedMessage(FIXMSG_SKILLINTERRUPT); +``` + +**C# (line 1081):** +```csharp +// g_pGame.GetGameRun().AddFixedMessage(FIXMSG_SKILLINTERRUPT); +Debug.Log("Skill interrupted!"); +``` + +**Impact:** Low - Replaced with Debug.Log, but the fixed message system might be needed for UI notifications. + +### 5. Missing Auto-Policy Event in SELF_SKILL_INTERRUPTED âš ï¸ +**C++ (line 6008):** +```cpp +CECAutoPolicy::GetInstance().SendEvent_SkillInterrupt(skill_id); +``` + +**C# (line 1087):** +```csharp +// CECAutoPolicy::GetInstance().SendEvent_SkillInterrupt(skill_id); +``` + +**Impact:** Medium - Auto-policy system won't be notified of skill interruptions, which may affect automated gameplay features. + +### 6. Commented Out Camera Update in OBJECT_CAST_POS_SKILL âš ï¸ +**C++ (line 6080):** +```cpp +UpdateFollowCamera(false, 10); +``` + +**C# (line 1165):** +```csharp +//UpdateFollowCamera(false, 10); +``` + +**Impact:** Low - Camera update is disabled. May affect camera behavior for certain skills. + +## Differences That Are Acceptable + +### 1. Logging System Differences ✅ +**C++:** +```cpp +g_pGame->RuntimeDebugInfo(0xffffffff, _AL("Cast skill(%d): %s"), ...); +``` + +**C#:** +```csharp +Debug.Log($"Cast skill({m_pCurSkill.GetSkillID()})"); +``` + +**Status:** Acceptable - Different logging systems, functionality preserved. + +### 2. Additional Logging in C# ✅ +C# has extra logging for return-to-town skill (ID 167): +```csharp +if (m_pCurSkill.GetSkillID() == ID_RETURNTOWN_SKILL) +{ + Debug.Log($"Return-to-town skill (167) cast - State2 should trigger SetReturntown(1) on server"); +} +``` + +**Status:** Acceptable - Additional debugging/logging is fine. + +### 3. Memory Management Differences ✅ +**C++:** +```cpp +if(m_pTargetItemSkill) +{ + delete m_pTargetItemSkill; + m_pTargetItemSkill = NULL; +} +``` + +**C#:** +```csharp +if (m_pTargetItemSkill != null) +{ + m_pTargetItemSkill = null; // GC will handle cleanup +} +``` + +**Status:** Acceptable - C# uses garbage collection, no explicit delete needed. + +### 4. Type Casting Differences ✅ +**C++:** +```cpp +cmd_object_cast_skill* pCmd = (cmd_object_cast_skill*)Msg.dwParam1; +``` + +**C#:** +```csharp +cmd_object_cast_skill pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1); +``` + +**Status:** Acceptable - Different serialization approach, functionality preserved. + +### 5. Switch Statement Syntax ✅ +**C++:** +```cpp +switch (Msg.dwParam2) +{ +case OBJECT_CAST_SKILL: +``` + +**C#:** +```csharp +switch (Convert.ToInt32(Msg.dwParam2)) +{ +case int value2 when value2 == CommandID.OBJECT_CAST_SKILL: +``` + +**Status:** Acceptable - C# pattern matching syntax, functionality preserved. + +## Post-Switch Code Comparison + +### Action Start Event ✅ +**C++ (line 6241-6242):** +```cpp +if( bActionStartSkill ) + AP_ActionEvent(AP_EVENT_STARTSKILL, iActionTime); +``` + +**C# (line 1338-1339):** +```csharp +if (bActionStartSkill) + AP.AP_ActionEvent((int)AP_EVENT.AP_EVENT_STARTSKILL, iActionTime); +``` + +**Status:** ✅ Complete - Properly converted and active. + +### Do Other Thing Logic ✅ +**C++ (line 6244-6258):** +```cpp +if (bDoOtherThing) +{ + if (m_pComboSkill && !m_pComboSkill->IsStop()) + { + if( CECAutoPolicy::GetInstance().IsAutoPolicyEnabled() ) + g_pGame->GetGameRun()->PostMessage(MSG_HST_CONTINUECOMBOSKILL, MAN_PLAYER, 0, 0, m_pComboSkill->GetGroupIndex()); + else + m_pComboSkill->Continue(false); + } + else + { + if( idTarget && idTarget != m_PlayerInfo.cid ) + NormalAttackObject(idTarget, true); + } +} +``` + +**C# (line 1341-1357):** +```csharp +if (bDoOtherThing) +{ + if (m_pComboSkill != null && !m_pComboSkill.IsStop()) + { + if (CECAutoPolicy.GetInstance().IsAutoPolicyEnabled()) + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_CONTINUECOMBOSKILL, MANAGER_INDEX.MAN_PLAYER, 0, 0, m_pComboSkill.GetGroupIndex()); + else + m_pComboSkill.Continue(false); + } + else + { + if (idTarget != 0 && idTarget != m_PlayerInfo.cid) + NormalAttackObject(idTarget, true); + } +} +``` + +**Status:** ✅ Complete - Properly converted with equivalent logic. + +## Recommendations + +### High Priority +1. **Add missing assertion check** in `OBJECT_CAST_SKILL` case: + ```csharp + Debug.Assert(pCmd.caster == m_PlayerInfo.cid, "Caster ID mismatch"); + ``` + +### Medium Priority +2. **Uncomment and verify** `AP_ActionEvent(AP_EVENT_STOPSKILL)` calls if the AP system is implemented in C#. +3. **Uncomment** `CECAutoPolicy::GetInstance().SendEvent_SkillInterrupt(skill_id)` if auto-policy is needed. + +### Low Priority +4. **Review** if `UpdateFollowCamera` is needed for `OBJECT_CAST_POS_SKILL` case. +5. **Consider** implementing `AddFixedMessage` system if UI notifications are needed for skill interruptions. + +## Conclusion + +**Conversion Completeness: ~90%** + +The conversion is functionally complete with all major logic paths implemented. However, several safety checks and event notifications are commented out or missing, which may affect: +- Auto-policy system integration +- UI notifications for skill interruptions +- Camera behavior for position-based skills +- Safety validation (caster ID check) + +These should be reviewed and either implemented or confirmed as intentionally disabled. diff --git a/Assets/PerfectWorld/Scripts/Skills/FLOW_COMBO_SKILL_CLICK.md.meta b/Assets/PerfectWorld/Scripts/Skills/FLOW_COMBO_SKILL_CLICK.md.meta new file mode 100644 index 0000000000..d52ee8bad0 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Skills/FLOW_COMBO_SKILL_CLICK.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 09b07dfdbdd8c094d9ded2ba81316847 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Skills/FLOW_CREATE_SKILL_COMBO_DRAG_DROP.md b/Assets/PerfectWorld/Scripts/Skills/FLOW_CREATE_SKILL_COMBO_DRAG_DROP.md new file mode 100644 index 0000000000..8088d4dfa3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Skills/FLOW_CREATE_SKILL_COMBO_DRAG_DROP.md @@ -0,0 +1,625 @@ +# Flow: Create Skill Combo by Drag-Drop - C++ Implementation + +## Overview +This document describes the complete flow for creating a skill combo by drag-dropping individual skills into the combo skill list in the skill edit dialog. This is the process of building a combo skill sequence that can later be placed in the quick bar. + +--- + +## Entry Points + +### 1. **Open Skill Edit Dialog** + +**Location:** `DlgSkillSubOther.cpp:49-57` + +The user can open the skill edit dialog in two ways: + +#### **A. Create New Combo Skill** (Button: "Btn_ConNew") +```cpp +// DlgSkillSubOther.cpp:54-57 +void CDlgSkillSubOther::OnCommandNew(const char * szCommand) { + GetGameUIMan()->m_pDlgSkillEdit->SetData(0); // 0 = new combo + GetGameUIMan()->m_pDlgSkillEdit->Show(true); +} +``` + +#### **B. Edit Existing Combo Skill** (Button: "Btn_ConEdi") +```cpp +// DlgSkillSubOther.cpp:49-52 +void CDlgSkillSubOther::OnCommandEdit(const char * szCommand) { + GetGameUIMan()->m_pDlgSkillEdit->SetData(m_nComboSelect); // 1-based combo index + GetGameUIMan()->m_pDlgSkillEdit->Show(true); +} +``` + +**Flow:** +1. User clicks "New" or "Edit" button +2. Set combo skill index (0 for new, 1-based for existing) +3. Show skill edit dialog (`Win_SkillEdit`) + +--- + +## Detailed Flow: Drag-Drop Skill to Combo List + +### **Step 1: Skill Edit Dialog Initialization** + +**Location:** `DlgSkillEdit.cpp:143-231` - `OnShowDialog()` + +When the skill edit dialog is shown, it initializes the combo skill list: + +```cpp +// DlgSkillEdit.cpp:143-207 +void CDlgSkillEdit::OnShowDialog() { + EC_VIDEO_SETTING setting = GetGame()->GetConfigs()->GetVideoSettings(); + + // If creating new combo (GetData() == 0), find first empty slot + if( GetData() == 0 ) { + for (i = 0; i < EC_COMBOSKILL_NUM; i++) + if( setting.comboSkill[i].nIcon == 0 ) { + SetData(i + 1); // Set to 1-based index + break; + } + } + + // Load existing combo skill data if editing + if( setting.comboSkill[GetData() - 1].nIcon != 0 ) { + // Load existing skills from config + for (i = 0; i < EC_COMBOSKILL_LEN; i++) { + int idSkill = setting.comboSkill[GetData() - 1].idSkill[i]; + if( idSkill > 0 ) { + CECSkill *pSkill = GetHostPlayer()->GetNormalSkill(idSkill); + if (!pSkill) pSkill = GetHostPlayer()->GetEquipSkillByID(idSkill); + GetGameUIMan()->m_pDlgSkillSubOther->SetImage(pImage, pSkill); + } + else { + // Special icons (Attack, Loop Start) + int iType = -idSkill; + SetSpecialIcon(pImage, iType); + } + } + } +} +``` + +**Key Points:** +- Dialog displays empty slots (`Item_1`, `Item_2`, ..., `Item_N`) for combo skill list +- Each slot can hold a skill or special icon (Attack, Loop Start) +- Existing combo skills are loaded from `EC_VIDEO_SETTING.comboSkill[]` + +--- + +### **Step 2: User Drags Skill from Skill List** + +**Location:** `DlgSkillSubOther.cpp:235-253` - `OnEventLButtonDownFixed()` / `OnEventLButtonDownItem()` + +Skills can be dragged from multiple sources: + +#### **A. Fixed Skills** (`Img_InSkill*`) +```cpp +// DlgSkillSubOther.cpp:235-243 +void CDlgSkillSubOther::OnEventLButtonDownFixed(WPARAM wParam, LPARAM lParam, AUIObject * pObj) { + if (pObj->GetDataPtr("ptr_CECSkill") == 0) { + return; // No skill data + } + + A3DVIEWPORTPARAM *p = m_pA3DEngine->GetActiveViewport()->GetParam(); + GetGameUIMan()->m_ptLButtonDown.x = GET_X_LPARAM(lParam) - p->X; + GetGameUIMan()->m_ptLButtonDown.y = GET_Y_LPARAM(lParam) - p->Y; + GetGameUIMan()->InvokeDragDrop(this, pObj, GetGameUIMan()->m_ptLButtonDown); +} +``` + +#### **B. Item Skills** (`Img_ItemSkill*`) +```cpp +// DlgSkillSubOther.cpp:245-253 +void CDlgSkillSubOther::OnEventLButtonDownItem(WPARAM wParam, LPARAM lParam, AUIObject * pObj) { + if (pObj->GetDataPtr("ptr_CECSkill") == 0) { + return; // No skill data + } + + A3DVIEWPORTPARAM *p = m_pA3DEngine->GetActiveViewport()->GetParam(); + GetGameUIMan()->m_ptLButtonDown.x = GET_X_LPARAM(lParam) - p->X; + GetGameUIMan()->m_ptLButtonDown.y = GET_Y_LPARAM(lParam) - p->Y; + GetGameUIMan()->InvokeDragDrop(this, pObj, GetGameUIMan()->m_ptLButtonDown); +} +``` + +**Key Points:** +- Skill data is stored via `SetDataPtr(pSkill, "ptr_CECSkill")` when skill icon is created +- Mouse position is captured for drag operation +- `InvokeDragDrop()` initiates the drag-drop system + +--- + +### **Step 3: Drag-Drop System Routes to Handler** + +**Location:** `DlgDragDrop.cpp:79-124` - `OnEventLButtonUp()` + +When user releases mouse button, the drag-drop system processes the drop: + +```cpp +// DlgDragDrop.cpp:79-124 +void CDlgDragDrop::OnEventLButtonUp(WPARAM wParam, LPARAM lParam, AUIObject *pObj) { + PAUIOBJECT pObjSrc = (PAUIOBJECT)pItem->GetDataPtr("ptr_AUIObject"); + if( !pObjSrc ) return; + + // Get destination dialog and object via hit test + PAUIDIALOG pDlgOver; + PAUIOBJECT pObjOver; + GetGameUIMan()->HitTest(x, y, &pDlgOver, &pObjOver, this); + + PAUIDIALOG pDlgSrc = pObjSrc->GetParent(); + + // Route to appropriate handler + OnGeneralScene(pDlgSrc, pObjSrc, pDlgOver, pObjOver, pIvtrSrc); +} +``` + +**Flow:** +1. Get source object from drag item +2. Hit test to find destination dialog and object +3. Route to `OnGeneralScene()` for processing + +--- + +### **Step 4: Skill Drag-Drop Handler** + +**Location:** `DlgDragDrop.cpp:589-627` - `OnSkillDragDrop()` + +The handler checks if drop is on skill edit dialog: + +```cpp +// DlgDragDrop.cpp:589-627 +void CDlgDragDrop::OnSkillDragDrop(PAUIDIALOG pDlgSrc, PAUIOBJECT pObjSrc, + PAUIDIALOG pDlgOver, PAUIOBJECT pObjOver, + CECIvtrItem* pIvtrSrc) { + // Check if dropped on skill edit dialog + if( pDlgOver && stricmp(pDlgOver->GetName(), "Win_SkillEdit") == 0 + && pObjOver && strstr(pObjOver->GetName(), "Item_") + && !strstr(pObjSrc->GetName(), "Img_ConSkill")) // Don't allow combo icons + { + GetGameUIMan()->m_pDlgSkillEdit->DragDropItem(pDlgSrc, pObjSrc, pObjOver); + } + // ... other handlers (quick bar, auto policy, etc.) +} +``` + +**Key Points:** +- Only processes drops on `Win_SkillEdit` dialog +- Destination must be an `Item_*` slot (combo skill list slot) +- Prevents dragging combo skill icons into combo list (prevents recursion) + +--- + +### **Step 5: Add Skill to Combo List** + +**Location:** `DlgSkillEdit.cpp:249-293` - `DragDropItem()` + +This is the core function that adds the skill to the combo list: + +```cpp +// DlgSkillEdit.cpp:249-293 +void CDlgSkillEdit::DragDropItem(PAUIDIALOG pDlgSrc, PAUIOBJECT pObjSrc, PAUIOBJECT pObjOver) { + if( pObjSrc == pObjOver ) + return; // Same object, do nothing + + if( !pObjOver ) { + // Dropped outside - remove skill from source + if( !(pDlgSrc == this && strstr(pObjSrc->GetName(), "Special")) ) + GetGameUIMan()->m_pDlgSkillSubOther->SetImage((PAUIIMAGEPICTURE)pObjSrc, NULL); + } + else { + // Extract target slot number (1-based) + int iSlot = atoi(pObjOver->GetName() + strlen("Item_")); + + // Check if source is special icon (Attack, Loop Start) + if( strstr(pObjSrc->GetName(), "Special_") ) { + int iType = atoi(pObjSrc->GetName() + strlen("Special_")); + SetSpecialIcon((PAUIIMAGEPICTURE)pObjOver, iType); + } + else { + // Regular skill drag-drop + CECSkill *pSkill = (CECSkill *)pObjSrc->GetDataPtr("ptr_CECSkill"); + int iType = pObjSrc->GetData(); + + if( pDlgSrc != this ) { + // Dragging from external dialog (skill list) + if( iType != 0) + SetSpecialIcon((PAUIIMAGEPICTURE)pObjOver, iType); + else + GetGameUIMan()->m_pDlgSkillSubOther->SetImage((PAUIIMAGEPICTURE)pObjOver, pSkill); + } + else { + // Dragging within skill edit dialog (reordering) + CECSkill *pSkill1 = (CECSkill *)pObjOver->GetDataPtr("ptr_CECSkill"); + int iType1 = pObjOver->GetData(); + + // Swap skills + if( iType != 0) + SetSpecialIcon((PAUIIMAGEPICTURE)pObjOver, iType); + else + GetGameUIMan()->m_pDlgSkillSubOther->SetImage((PAUIIMAGEPICTURE)pObjOver, pSkill); + + if( iType1 != 0) + SetSpecialIcon((PAUIIMAGEPICTURE)pObjSrc, iType1); + else + GetGameUIMan()->m_pDlgSkillSubOther->SetImage((PAUIIMAGEPICTURE)pObjSrc, pSkill1); + } + } + } +} +``` + +**Key Points:** +- **External Drag (from skill list):** Adds skill to target slot, clears source if needed +- **Internal Drag (within dialog):** Swaps skills between slots (reordering) +- **Special Icons:** Can add Attack (`Special_1`) or Loop Start (`Special_2`) icons +- Uses `SetImage()` to display skill icon in target slot +- Skill data is stored via `SetDataPtr(pSkill, "ptr_CECSkill")` + +--- + +### **Step 6: Save Combo Skill Configuration (Local)** + +**Location:** `DlgSkillEdit.cpp:56-85` - `OnCommandConfirm()` + +When user clicks "Confirm" button, the combo skill is saved locally: + +```cpp +// DlgSkillEdit.cpp:56-85 +void CDlgSkillEdit::OnCommandConfirm(const char *szCommand) { + EC_VIDEO_SETTING setting = GetGame()->GetConfigs()->GetVideoSettings(); + + // Save icon index + setting.comboSkill[GetData() - 1].nIcon = m_nIcon; + + // Save skill sequence + int i; + int j = 0; + for (i = 0; ; i++) { + AString strName; + strName.Format("Item_%d", i + 1); + PAUIIMAGEPICTURE pImage = static_cast(GetDlgItem(strName)); + if (!pImage) break; + + CECSkill *pSkill = (CECSkill *)pImage->GetDataPtr("ptr_CECSkill"); + int iType = pImage->GetData(); + + if( iType == 0 && pSkill ) { + // Regular skill + setting.comboSkill[GetData() - 1].idSkill[j] = pSkill->GetSkillID(); + j++; + } + else { + // Special icon (Attack = -1, Loop Start = -2) + setting.comboSkill[GetData() - 1].idSkill[j] = -iType; + j++; + } + } + + // Save to local config (does NOT send to server immediately) + GetGame()->GetConfigs()->SetVideoSettings(setting); + Show(false); + + // Update combo skill display + GetGameUIMan()->m_pDlgSkillSubOther->UpdateComboSkill(); +} +``` + +**Key Points:** +- Saves icon index (`nIcon`) for combo skill +- Saves skill sequence to `idSkill[]` array: + - **Positive values:** Skill IDs + - **Negative values:** Special icons (-1 = Attack, -2 = Loop Start) +- Updates combo skill icons in main skill dialog +- **Note:** This only saves to local memory (`m_vs`), does NOT send to server yet + +--- + +### **Step 7: Send Combo Skill to Server** + +**Location:** `EC_GameRun.cpp:1942-2061` - `SaveConfigsToServer()` + +Combo skill data is sent to server as part of the user configuration when: +- Player logs out +- Periodically during gameplay +- When explicitly triggered (e.g., via UI command) + +```cpp +// EC_GameRun.cpp:1942-2061 +DWORD CECGameRun::SaveConfigsToServer() { + // ... validation checks ... + + // Calculate total size needed + int iTotalSize = 0; + iTotalSize += sizeof(DWORD); // Version + + // Host player config (shortcuts, etc.) + int iHostSize = 0; + pHost->SaveConfigData(NULL, &iHostSize); + iTotalSize += sizeof(int) + iHostSize; + + // UI layout config + DWORD dwUISize = 0; + pGameUI->GetUserLayout(NULL, dwUISize); + iTotalSize += sizeof(int) + (int)dwUISize; + + // User settings config (INCLUDES COMBO SKILLS!) + int iSettingSize = 0; + g_pGame->GetConfigs()->SaveUserConfigData(NULL, &iSettingSize); + iTotalSize += sizeof(int) + iSettingSize; + + // Allocate buffer and pack data + void* pDataBuf = a_malloctemp(iTotalSize); + // ... pack all data ... + + // Compress and send to server + g_pGame->GetGameSession()->SaveConfigData(pCompBuf, dwCompLen+iVerLen); +} +``` + +**Key Function:** `EC_Configs::SaveUserConfigData()` + +**Location:** `EC_Configs.cpp:569-615` + +```cpp +// EC_Configs.cpp:569-615 +bool CECConfigs::SaveUserConfigData(void* pDataBuf, int* piSize) { + int iTotalSize = 0; + BYTE* pData = (BYTE*)pDataBuf; + + // Version + iTotalSize += sizeof(DWORD); + if (pDataBuf) { + *((DWORD*)pData) = EC_CONFIG_VERSION; + pData += sizeof(DWORD); + } + + // â­ SAVE VIDEO SETTINGS (INCLUDES COMBO SKILLS!) + iTotalSize += sizeof(EC_VIDEO_SETTING); + if (pDataBuf) { + *((EC_VIDEO_SETTING*)pData) = m_vs; // Contains comboSkill[] array! + pData += sizeof(EC_VIDEO_SETTING); + } + + // ... other settings (game, blacklist, computer aided) ... +} +``` + +**Key Points:** +- **Entire `EC_VIDEO_SETTING` structure is sent**, which includes: + - `comboSkill[EC_COMBOSKILL_NUM]` array + - Each combo skill contains `nIcon` and `idSkill[]` array +- **Data is compressed** before sending to reduce network traffic +- **Sent asynchronously** - not immediately when combo is saved +- **Server stores** this data and sends it back when player logs in + +--- + +### **Step 8: Server Receives and Stores Combo Skill Data** + +**Location:** Server-side (not in client codebase) + +When server receives the config data: +1. Server decompresses the data +2. Server parses `EC_VIDEO_SETTING` structure +3. Server extracts `comboSkill[]` array +4. Server stores combo skill data in player's account/profile +5. Server sends combo skill data back to client on next login + +**Note:** The server does NOT validate or execute combo skills - they are purely client-side UI configurations. The server only stores them for persistence across sessions. + +--- + +## Complete Flow Diagram + +``` +┌─────────────────────────────────────────────────────────────┠+│ STEP 1: Open Skill Edit Dialog │ +│ Location: DlgSkillSubOther.cpp:49-57 │ +│ - User clicks "New" or "Edit" button │ +│ - SetData(0) for new, SetData(n) for existing │ +│ - Show Win_SkillEdit dialog │ +└──────────────────────┬──────────────────────────────────────┘ + │ + â–¼ +┌─────────────────────────────────────────────────────────────┠+│ STEP 2: Dialog Initialization │ +│ Location: DlgSkillEdit.cpp:143-231 │ +│ - Load existing combo skill if editing │ +│ - Display empty slots (Item_1, Item_2, ...) │ +│ - Show special icons (Attack, Loop Start) │ +└──────────────────────┬──────────────────────────────────────┘ + │ + │ (User drags skill from skill list) + â–¼ +┌─────────────────────────────────────────────────────────────┠+│ STEP 3: Drag Initiation │ +│ Location: DlgSkillSubOther.cpp:235-253 │ +│ - OnEventLButtonDownFixed() or OnEventLButtonDownItem() │ +│ - Capture mouse position │ +│ - InvokeDragDrop(this, pObj, pt) │ +└──────────────────────┬──────────────────────────────────────┘ + │ + │ (User drags to combo list slot) + â–¼ +┌─────────────────────────────────────────────────────────────┠+│ STEP 4: Drop Processing │ +│ Location: DlgDragDrop.cpp:79-124 │ +│ - OnEventLButtonUp() detects drop │ +│ - Hit test to find destination │ +│ - Route to OnSkillDragDrop() │ +└──────────────────────┬──────────────────────────────────────┘ + │ + â–¼ +┌─────────────────────────────────────────────────────────────┠+│ STEP 5: Skill Drag Handler │ +│ Location: DlgDragDrop.cpp:589-627 │ +│ - Check: pDlgOver == "Win_SkillEdit" │ +│ - Check: pObjOver name contains "Item_" │ +│ - Call DragDropItem() │ +└──────────────────────┬──────────────────────────────────────┘ + │ + â–¼ +┌─────────────────────────────────────────────────────────────┠+│ STEP 6: Add Skill to Combo List │ +│ Location: DlgSkillEdit.cpp:249-293 │ +│ - Extract target slot: atoi("Item_N") │ +│ - Get skill: pObjSrc->GetDataPtr("ptr_CECSkill") │ +│ - SetImage(pObjOver, pSkill) │ +│ - Store skill data in slot │ +└──────────────────────┬──────────────────────────────────────┘ + │ + │ (User can drag more skills) + │ (User can reorder by dragging within dialog) + │ + │ (User clicks "Confirm" button) + â–¼ +┌─────────────────────────────────────────────────────────────┠+│ STEP 6: Save Configuration (Local) │ +│ Location: DlgSkillEdit.cpp:56-85 │ +│ - Loop through all Item_* slots │ +│ - Extract skill IDs or special icon types │ +│ - Save to setting.comboSkill[n].idSkill[] │ +│ - Save icon: setting.comboSkill[n].nIcon │ +│ - SetVideoSettings(setting) → saves to m_vs (local only) │ +│ - UpdateComboSkill() to refresh display │ +└──────────────────────┬──────────────────────────────────────┘ + │ + │ (Later: on logout, periodically, or explicit save) + â–¼ +┌─────────────────────────────────────────────────────────────┠+│ STEP 7: Send to Server │ +│ Location: EC_GameRun.cpp:1942-2061 │ +│ - SaveConfigsToServer() called │ +│ - SaveUserConfigData() includes entire EC_VIDEO_SETTING │ +│ - Combo skills included in m_vs.comboSkill[] │ +│ - Data compressed and sent via SaveConfigData() │ +└──────────────────────┬──────────────────────────────────────┘ + │ + â–¼ +┌─────────────────────────────────────────────────────────────┠+│ STEP 8: Server Storage │ +│ Location: Server-side (not in client code) │ +│ - Server receives compressed config data │ +│ - Server decompresses and parses EC_VIDEO_SETTING │ +│ - Server stores comboSkill[] in player account │ +│ - Server sends back on next login │ +└─────────────────────────────────────────────────────────────┘ +``` + +--- + +## Data Structures + +### **EC_VIDEO_SETTING.comboSkill[]** +```cpp +struct COMBO_SKILL { + short nIcon; // Icon index (1-based, 0 = empty) + short idSkill[EC_COMBOSKILL_LEN]; // Skill sequence array + // idSkill values: + // > 0: Skill ID + // -1: Attack (SID_ATTACK) + // -2: Loop Start (SID_LOOPSTART) + // 0: Empty slot +}; +``` + +### **Skill Storage in UI Objects** +- **Skill Pointer:** `pImage->SetDataPtr(pSkill, "ptr_CECSkill")` +- **Special Icon Type:** `pImage->SetData(iType)` where `iType = 1` (Attack) or `2` (Loop Start) +- **Regular Skill:** `pImage->SetData(0)` + +--- + +## Key Constants + +- **EC_COMBOSKILL_NUM:** Maximum number of combo skill groups (typically 8-12) +- **EC_COMBOSKILL_LEN:** Maximum number of skills per combo (typically 8-16) +- **SID_ATTACK:** Special skill ID for normal attack (typically -1) +- **SID_LOOPSTART:** Special skill ID for loop start marker (typically -2) + +--- + +## Important Notes + +1. **Index Conversion:** + - Combo group index is **1-based** in UI (`GetData()` returns 1, 2, 3, ...) + - Array index is **0-based** in config (`comboSkill[GetData() - 1]`) + +2. **Skill Sources:** + - Skills can be dragged from: + - `Win_SkillSubOther` (Fixed skills, Item skills) + - `Win_SkillSubPool` (Skill pool) + - `Win_SkillSubListSkillItem` (Skill list items) + +3. **Special Icons:** + - Attack icon (`Special_1`) = Normal attack in combo + - Loop Start icon (`Special_2`) = Marks where combo should loop back + +4. **Reordering:** + - Users can drag skills within the skill edit dialog to reorder + - `DragDropItem()` handles swapping when `pDlgSrc == this` + +5. **Validation:** + - Combo skill icons cannot be dragged into combo list (prevents recursion) + - Empty slots are allowed (stored as 0 in `idSkill[]`) + +--- + +## Related Files + +- **DlgSkillEdit.cpp/h:** Skill edit dialog implementation +- **DlgSkillSubOther.cpp/h:** Skill sub-other panel (source of skills) +- **DlgDragDrop.cpp/h:** Drag-drop system handler +- **EC_Configs.cpp/h:** Configuration management (stores combo skills locally) +- **EC_GameRun.cpp/h:** Game run logic (saves configs to server) +- **EC_GameSession.cpp/h:** Network session (sends config data to server) +- **EC_ComboSkill.cpp/h:** Combo skill execution logic + +--- + +## Network Protocol Details + +### **Protocol Command** +- **Command:** `SaveConfigData` (via `EC_GameSession::SaveConfigData()`) +- **Data Format:** Compressed binary blob containing: + 1. Version (DWORD) + 2. Host player config (shortcuts, etc.) + 3. UI layout config + 4. **User settings config (includes combo skills)** + +### **Data Structure Sent** +```cpp +struct USER_CONFIG_DATA { + DWORD version; // USERCFG_VERSION + int hostConfigSize; + BYTE hostConfig[hostConfigSize]; // Host player shortcuts, etc. + int uiLayoutSize; + BYTE uiLayout[uiLayoutSize]; // UI window positions, etc. + int settingsSize; + BYTE settings[settingsSize]; // EC_VIDEO_SETTING + other settings +}; + +// Inside settings: +struct EC_VIDEO_SETTING { + // ... other video settings ... + EC_COMBOSKILL comboSkill[EC_COMBOSKILL_NUM]; // â­ COMBO SKILLS HERE! +}; + +struct EC_COMBOSKILL { + short nIcon; // Icon index (0 = empty) + short idSkill[EC_COMBOSKILL_LEN]; // Skill sequence +}; +``` + +### **When Data is Sent** +1. **On Logout:** `DlgExit.cpp` triggers `SaveConfigsToServer()` +2. **Periodically:** Game may auto-save configs during gameplay +3. **Explicit Save:** UI commands can trigger save (e.g., `EC_GameUICommand.cpp:143`) +4. **Pending Actions:** Various pending actions append save requests + +### **Important Notes** +- **Combo skills are NOT sent immediately** when saved - they're queued for next config save +- **Server does NOT validate combo skills** - they're client-side UI configurations +- **Combo skills are NOT executed on server** - execution is purely client-side +- **Server only stores for persistence** - so player's combo skills persist across sessions diff --git a/Assets/PerfectWorld/Scripts/Skills/FLOW_CREATE_SKILL_COMBO_DRAG_DROP.md.meta b/Assets/PerfectWorld/Scripts/Skills/FLOW_CREATE_SKILL_COMBO_DRAG_DROP.md.meta new file mode 100644 index 0000000000..4e70ea6673 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Skills/FLOW_CREATE_SKILL_COMBO_DRAG_DROP.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4abca7ea223861b47b89d130f6902111 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Skills/FLOW_CREATE_SKILL_GROUP_SHORTCUT.md b/Assets/PerfectWorld/Scripts/Skills/FLOW_CREATE_SKILL_GROUP_SHORTCUT.md new file mode 100644 index 0000000000..37b80513f6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Skills/FLOW_CREATE_SKILL_GROUP_SHORTCUT.md @@ -0,0 +1,820 @@ +# Flow: CreateSkillGroupShortcut - C++ Implementation + +## Overview +This document describes the complete flow for creating a skill combo group shortcut in the C++ codebase. A skill group shortcut (`CECSCSkillGrp`) represents a combo skill sequence that can be placed in the quick bar and executed with a single click. + +--- + +## Entry Points + +### 1. **From UI Drag & Drop** (DlgDragDrop.cpp:603) +When a user drags a combo skill icon from the combo skill panel to a shortcut slot: + +```cpp +// DlgDragDrop.cpp:595-604 +if (strstr(pObjSrc->GetName(), "Img_ConSkill")) // Combo skill icon +{ + int nCombo = pObjSrc->GetData(); // Get combo group index (1-based) + int iSlot = atoi(pObjOver->GetName() + strlen("Item_")); // Get target slot (1-based) + + CECShortcutSet *pSCS = CECGameUIMan::GetSCSByDlg(pDlgOver->GetName()); + if (!pSCS->GetShortcut(iSlot-1) || !g_pGame->GetConfigs()->GetGameSettings().bLockQuickBar) + pSCS->CreateSkillGroupShortcut(iSlot - 1, nCombo - 1); // Convert to 0-based +} +``` + +**Flow:** +1. User drags combo skill icon (`Img_ConSkill`) to shortcut slot +2. Extract combo group index from source object data (1-based) +3. Extract target slot number from destination object name (1-based) +4. Get the appropriate `CECShortcutSet` based on dialog +5. Check if slot is empty or quick bar is unlocked +6. Call `CreateSkillGroupShortcut` with 0-based indices + +--- + +## Detailed Analysis: UI Drag & Drop Flow + +### **Step 1: Combo Skill Icon Creation & Data Initialization** + +**Location:** `DlgSkillSubOther.cpp:71-99` - `UpdateComboSkill()` + +This function is called when the skill dialog is shown (`OnShowDialog()` at line 193) and creates/updates all combo skill icons: + +```cpp +// DlgSkillSubOther.cpp:71-99 +void CDlgSkillSubOther::UpdateComboSkill() { + EC_VIDEO_SETTING setting = GetGame()->GetConfigs()->GetVideoSettings(); + + // Loop through all possible combo skill groups (typically 8-12) + for(int i = 0; i < EC_COMBOSKILL_NUM; i++) + { + // Create icon name: "Img_ConSkill01", "Img_ConSkill02", etc. + AString strName; + strName.Format("Img_ConSkill%02d", i + 1); + + // Get the image picture object from dialog + PAUIIMAGEPICTURE pImage = static_cast(GetDlgItem(strName)); + if( pImage ) + { + // Check if this combo skill group is configured (has an icon) + if( setting.comboSkill[i].nIcon != 0 ) + { + // Set the icon image from sprite sheet + pImage->SetCover( + GetGameUIMan()->m_pA2DSpriteIcons[CECGameUIMan::ICONS_SKILLGRP], + setting.comboSkill[i].nIcon + 1); + + // â­ KEY: Store the combo group index (1-based) in the icon's data + // i is 0-based (0, 1, 2, ...), so i+1 is 1-based (1, 2, 3, ...) + pImage->SetData(i + 1); + + // Set a flag pointer (just indicates this is a valid combo skill) + pImage->SetDataPtr((void*)1); + + // Set tooltip/hint text + ACString strText; + strText.Format(GetStringFromTable(804), i); + pImage->SetHint(strText); + } + else + { + // Empty/invalid combo skill - clear the icon + pImage->SetCover(NULL, -1); + pImage->SetData(0); // No data = invalid + pImage->SetDataPtr(NULL); + pImage->SetHint(_AL("")); + } + } + } +} +``` + +**Key Points:** +- **Icon Naming:** Icons are named `"Img_ConSkill%02d"` where `%02d` is the 1-based index (01, 02, 03, ...) +- **Data Storage:** The combo group index is stored via `SetData(i + 1)`: + - `i` is 0-based array index (0, 1, 2, ...) + - `i + 1` is 1-based group number (1, 2, 3, ...) + - This 1-based value is what gets retrieved during drag & drop +- **Validation:** If `nIcon == 0`, the combo skill doesn't exist, so `SetData(0)` marks it as invalid +- **Icon Source:** Icon image comes from `ICONS_SKILLGRP` sprite sheet at index `nIcon + 1` + +--- + +### **Step 2: User Initiates Drag Operation** + +**Location:** `DlgSkillSubOther.cpp:219-232` - `OnEventLButtonDownCombo()` + +When user clicks and holds on a combo skill icon: + +```cpp +// DlgSkillSubOther.cpp:219-232 +void CDlgSkillSubOther::OnEventLButtonDownCombo(WPARAM wParam, LPARAM lParam, AUIObject * pObj) { + // â­ Validation: Check if icon has valid data (combo skill exists) + if( pObj->GetData() == 0 ) + return; // No combo skill configured, can't drag + + // Get viewport coordinates + A3DVIEWPORTPARAM *p = m_pA3DEngine->GetActiveViewport()->GetParam(); + POINT pt = + { + GET_X_LPARAM(lParam) - p->X, + GET_Y_LPARAM(lParam) - p->Y, + }; + + // Store drag start position + GetGameUIMan()->m_ptLButtonDown = pt; + + // â­ Start drag & drop operation + // This passes the source object (pObj) which contains the data + GetGameUIMan()->InvokeDragDrop(this, pObj, pt); +} +``` + +**Key Points:** +- **Event Mapping:** The event is mapped via `AUI_ON_EVENT("Img_ConSkill*", WM_LBUTTONDOWN, OnEventLButtonDownCombo)` (line 19) +- **Validation:** Checks `GetData() == 0` to ensure combo skill exists before allowing drag +- **Data Preservation:** The `pObj` (icon object) is passed to `InvokeDragDrop()`, preserving the data stored in Step 1 + +--- + +### **Step 3: Drag & Drop Processing** + +**Location:** `DlgDragDrop.cpp:79-127` - `OnEventLButtonUp()` + +When user releases mouse button, the drag & drop system processes the drop: + +```cpp +// DlgDragDrop.cpp:79-127 (simplified) +void CDlgDragDrop::OnEventLButtonUp(WPARAM wParam, LPARAM lParam, AUIObject *pObj) +{ + // Get the source object that was being dragged + PAUIOBJECT pObjSrc = (PAUIOBJECT)pItem->GetDataPtr("ptr_AUIObject"); + if( !pObjSrc ) + return; + + // Get destination (where mouse was released) + PAUIDIALOG pDlgOver; + PAUIOBJECT pObjOver; + // ... hit test to find what's under the mouse ... + GetGameUIMan()->HitTest(x, y, &pDlgOver, &pObjOver, this); + + // Route to appropriate handler based on source dialog + // ... routing logic ... + + // For skill-related drags, calls: + OnSkillDragDrop(pDlgSrc, pObjSrc, pDlgOver, pObjOver, pIvtrSrc); +} +``` + +--- + +### **Step 4: Skill Drag & Drop Handler** + +**Location:** `DlgDragDrop.cpp:589-627` - `OnSkillDragDrop()` + +This is where the combo skill icon data is extracted and used: + +```cpp +// DlgDragDrop.cpp:589-627 +void CDlgDragDrop::OnSkillDragDrop(PAUIDIALOG pDlgSrc, PAUIOBJECT pObjSrc, + PAUIDIALOG pDlgOver, PAUIOBJECT pObjOver, CECIvtrItem* pIvtrSrc) +{ + // Check if dropping on quick bar dialog + if( pDlgOver && strstr(pDlgOver->GetName(), "Win_Quickbar") + && pObjOver && strstr(pObjOver->GetName(), "Item_") ) + { + // â­ Check if source is a combo skill icon + if( strstr(pObjSrc->GetName(), "Img_ConSkill") ) + { + // â­ Extract combo group index from icon's stored data (1-based) + int nCombo = pObjSrc->GetData(); // Returns the value set in UpdateComboSkill() + + // Extract target slot number from destination object name + // Destination name format: "Item_1", "Item_2", etc. (1-based) + int iSlot = atoi(pObjOver->GetName() + strlen("Item_")); // "Item_1" -> 1 + + // Get the shortcut set for this dialog + CECShortcutSet *pSCS = CECGameUIMan::GetSCSByDlg(pDlgOver->GetName()); + + // Check if slot is empty or quick bar is unlocked + if( !pSCS->GetShortcut(iSlot-1) || + !g_pGame->GetConfigs()->GetGameSettings().bLockQuickBar ) + { + // â­ Create skill group shortcut + // Convert both indices to 0-based: + // - iSlot: 1-based -> 0-based (slot 1 -> index 0) + // - nCombo: 1-based -> 0-based (group 1 -> index 0) + pSCS->CreateSkillGroupShortcut(iSlot - 1, nCombo - 1); + } + } + // Handle regular skill drag (not combo) + else + { + CECSkill *pSkill = (CECSkill *)pObjSrc->GetDataPtr("ptr_CECSkill"); + // ... create regular skill shortcut ... + } + } +} +``` + +**Key Points:** +- **Icon Identification:** `strstr(pObjSrc->GetName(), "Img_ConSkill")` identifies combo skill icons +- **Data Retrieval:** `pObjSrc->GetData()` retrieves the 1-based group index stored in Step 1 +- **Slot Extraction:** Destination slot is extracted from object name `"Item_N"` where N is 1-based +- **Index Conversion:** Both indices are converted from 1-based to 0-based before calling `CreateSkillGroupShortcut()` + +--- + +### **Complete Data Flow Diagram** + +``` +┌─────────────────────────────────────────────────────────────┠+│ STEP 1: Icon Creation (UpdateComboSkill) │ +│ Location: DlgSkillSubOther.cpp:71-99 │ +└──────────────────────┬──────────────────────────────────────┘ + │ + â–¼ + ┌──────────────────────────────────────┠+ │ For each combo skill group (i=0..N): │ + │ │ + │ 1. Create icon name: │ + │ "Img_ConSkill%02d" (i+1) │ + │ │ + │ 2. If combo exists (nIcon != 0): │ + │ - Set icon image │ + │ - â­ SetData(i + 1) │ + │ (stores 1-based group index) │ + │ - SetDataPtr((void*)1) │ + │ - Set hint text │ + └──────────────────┬───────────────────┘ + │ + â–¼ + ┌──────────────────────────────────────┠+ │ Icon Object Created │ + │ - Name: "Img_ConSkill01", etc. │ + │ - Data: 1, 2, 3, ... (1-based) │ + │ - DataPtr: (void*)1 │ + │ - Icon: Sprite sheet image │ + └──────────────────┬───────────────────┘ + │ + │ (User clicks and drags) + â–¼ +┌─────────────────────────────────────────────────────────────┠+│ STEP 2: Drag Initiation (OnEventLButtonDownCombo) │ +│ Location: DlgSkillSubOther.cpp:219-232 │ +└──────────────────────┬──────────────────────────────────────┘ + │ + â–¼ + ┌──────────────────────────────────────┠+ │ 1. Validate: GetData() != 0 │ + │ 2. Get mouse position │ + │ 3. InvokeDragDrop(this, pObj, pt) │ + │ (pObj contains the data!) │ + └──────────────────┬───────────────────┘ + │ + │ (User drags to quick bar) + â–¼ +┌─────────────────────────────────────────────────────────────┠+│ STEP 3: Drop Processing (OnEventLButtonUp) │ +│ Location: DlgDragDrop.cpp:79-127 │ +└──────────────────────┬──────────────────────────────────────┘ + │ + â–¼ + ┌──────────────────────────────────────┠+ │ 1. Get source object (pObjSrc) │ + │ 2. Hit test to find destination │ + │ 3. Route to OnSkillDragDrop() │ + └──────────────────┬───────────────────┘ + │ + â–¼ +┌─────────────────────────────────────────────────────────────┠+│ STEP 4: Skill Drag Handler (OnSkillDragDrop) │ +│ Location: DlgDragDrop.cpp:589-627 │ +└──────────────────────┬──────────────────────────────────────┘ + │ + â–¼ + ┌──────────────────────────────────────┠+ │ 1. Check: strstr(name, "Img_ConSkill")│ + │ 2. â­ Extract: nCombo = GetData() │ + │ (retrieves 1-based group index) │ + │ 3. Extract: iSlot from "Item_N" │ + │ 4. Get shortcut set │ + │ 5. Validate slot/quick bar │ + │ 6. CreateSkillGroupShortcut( │ + │ iSlot-1, nCombo-1) │ + │ (convert to 0-based) │ + └──────────────────┬───────────────────┘ + │ + â–¼ + ┌──────────────────────────────────────┠+ │ CreateSkillGroupShortcut() │ + │ Creates CECSCSkillGrp with │ + │ group index (0-based) │ + └──────────────────────────────────────┘ +``` + +--- + +### **Data Storage Summary** + +| Component | Storage Method | Value Type | Example | +|-----------|---------------|------------|---------| +| **Combo Group Index** | `AUIObject::SetData(int)` | 1-based integer | 1, 2, 3, ... | +| **Icon Name** | Object name | String pattern | "Img_ConSkill01", "Img_ConSkill02" | +| **Icon Image** | `SetCover()` | Sprite sheet index | `nIcon + 1` | +| **Validation Flag** | `SetDataPtr((void*)1)` | Pointer flag | `(void*)1` = valid, `NULL` = invalid | + +**Important Notes:** +1. **The icon DOES contain the data needed** - it's stored via `SetData(i + 1)` during icon creation +2. **The data is 1-based** - stored as 1, 2, 3, ... but converted to 0-based (0, 1, 2, ...) when creating the shortcut +3. **Data is validated** - `GetData() == 0` means no combo skill, so drag is prevented +4. **Icon name pattern** - `"Img_ConSkill*"` is used to identify combo skill icons during drag & drop + +--- + +### 2. **From Config Data Loading** (EC_ShortcutSet.cpp:600-616) +When loading shortcut configuration from server/save file: + +```cpp +// EC_ShortcutSet.cpp:600-616 +case CECShortcut::SCT_SKILLGRP: +{ + if (dwVer >= 3) // Version check - skill groups added in version 3 + { + int iGroupIdx = *(int*)pData; // Read group index from config data + pData += sizeof(int); + + if (iGroupIdx >= 0) + CreateSkillGroupShortcut(iSlot, iGroupIdx); + } + else + { + ASSERT(0); + return false; + } + break; +} +``` + +**Flow:** +1. Read shortcut type from config data +2. If type is `SCT_SKILLGRP` and version >= 3: + - Read group index from binary data + - Validate group index (>= 0) + - Call `CreateSkillGroupShortcut` + +--- + +### 3. **From AssignSkillGrpShortcut** (EC_HostPlayer.cpp:7934-7941) +When assigning skill group shortcuts from configuration array: + +```cpp +// EC_HostPlayer.cpp:7934-7941 +void CECHostPlayer::AssignSkillGrpShortcut( + const std::vector & skillGrpSCConfigArray, + CECShortcutSet** aSCSets) +{ + std::vector::const_iterator it; + for (it = skillGrpSCConfigArray.begin(); it != skillGrpSCConfigArray.end(); it++) + { + if(it->groupIndex != -1) // -1 means invalid/empty + aSCSets[it->setNum]->CreateSkillGroupShortcut(it->slotNum, it->groupIndex); + } +} +``` + +**Flow:** +1. Iterate through skill group shortcut configuration array +2. For each valid config (groupIndex != -1): + - Get the appropriate shortcut set by `setNum` + - Call `CreateSkillGroupShortcut` with slot and group index + +**Note:** Before calling this, `ConvertSkillGrpShortcut` is called to validate combo skills exist: +```cpp +// EC_HostPlayer.cpp:7915-7923 +void CECHostPlayer::ConvertSkillGrpShortcut(std::vector & skillGrpSCConfigArray) +{ + std::vector::iterator it; + for (it = skillGrpSCConfigArray.begin(); it != skillGrpSCConfigArray.end(); it++) + { + EC_VIDEO_SETTING vs = g_pGame->GetConfigs()->GetVideoSettings(); + if (vs.comboSkill[it->groupIndex].nIcon == 0) // Combo skill doesn't exist + it->groupIndex = -1; // Mark as invalid + } +} +``` + +--- + +## Core Implementation + +### **CreateSkillGroupShortcut** (EC_ShortcutSet.cpp:135-150) + +```cpp +// EC_ShortcutSet.cpp:135-150 +bool CECShortcutSet::CreateSkillGroupShortcut(int iSlot, int iGroupIdx) +{ + // 1. Create new CECSCSkillGrp object + CECSCSkillGrp* pSkillGrpSC = new CECSCSkillGrp; + if (!pSkillGrpSC) + return false; + + // 2. Initialize with group index + if (!pSkillGrpSC->Init(iGroupIdx)) + { + delete pSkillGrpSC; + a_LogOutput(1, "CECShortcutSet::CreateSkillGroupShortcut, Failed to initialize skill group shortcut"); + return false; + } + + // 3. Set shortcut in slot (replaces any existing shortcut at this slot) + SetShortcut(iSlot, pSkillGrpSC); + return true; +} +``` + +**Flow:** +1. **Allocate** new `CECSCSkillGrp` object +2. **Initialize** with group index +3. **Set** shortcut in the specified slot (automatically releases old shortcut if exists) + +--- + +## CECSCSkillGrp Class + +### **Class Definition** (EC_Shortcut.h:282-309) + +```cpp +class CECSCSkillGrp : public CECShortcut +{ +public: + CECSCSkillGrp(); + CECSCSkillGrp(const CECSCSkillGrp& src); + virtual ~CECSCSkillGrp() {} + + // Initialize object + bool Init(int iGroupIdx); + + // Virtual functions from CECShortcut + virtual CECShortcut* Clone(); + virtual bool Execute(); // Executes the combo skill + virtual const char* GetIconFile(); + virtual const wchar_t* GetDesc(); + virtual int GetCoolTime(int* piMax=NULL); + +private: + int m_iGroupIdx; // Combo skill group index (0-based) + CECString m_strDesc; // Description text +}; +``` + +### **Initialization** (EC_Shortcut.cpp:696-703) + +```cpp +// EC_Shortcut.cpp:696-703 +bool CECSCSkillGrp::Init(int iGroupIdx) +{ + m_iGroupIdx = iGroupIdx; // Store group index + + // Format description: "Skill Group {index}" + CECStringTab* pStrTab = g_pGame->GetItemDesc(); + m_strDesc.Format(pStrTab->GetWideString(CMDDESC_SKILLGROUP), m_iGroupIdx); + return true; +} +``` + +**Flow:** +1. Store group index +2. Format description string from string table +3. Return success + +### **Execution** (EC_Shortcut.cpp:712-717) + +```cpp +// EC_Shortcut.cpp:712-717 +bool CECSCSkillGrp::Execute() +{ + CECHostPlayer* pHost = g_pGame->GetGameRun()->GetHostPlayer(); + pHost->ApplyComboSkill(m_iGroupIdx); // Apply combo skill with stored group index + return true; +} +``` + +**Flow:** +1. Get host player instance +2. Call `ApplyComboSkill` with the stored group index +3. This triggers the combo skill sequence execution + +--- + +## ApplyComboSkill Flow + +### **ApplyComboSkill** (EC_HostPlayer.cpp:7710-7737) + +```cpp +// EC_HostPlayer.cpp:7710-7737 +bool CECHostPlayer::ApplyComboSkill(int iGroup, bool bIgnoreAtkLoop, int iForceAtk) +{ + a_LogOutput(1, "HoangDEv: ApplyComboSkill - Applying combo skill, group=%d, target=%d, ignoreAtkLoop=%d, forceAtk=%d", + iGroup, m_idSelTarget, bIgnoreAtkLoop, iForceAtk); + + // 1. Clear current combo skill if exists + ClearComboSkill(); + + // 2. Create new combo skill object + if (!(m_pComboSkill = new CECComboSkill)) + { + ASSERT(0); + return false; + } + + // 3. Initialize combo skill + bool bForceAttack = (iForceAtk != 0); + if (!(m_pComboSkill->Init(this, iGroup, m_idSelTarget, bForceAttack, bIgnoreAtkLoop))) + { + delete m_pComboSkill; + m_pComboSkill = NULL; + return false; + } + + // 4. Start combo skill execution + m_pComboSkill->Continue(m_bMelee); + return true; +} +``` + +**Flow:** +1. **Clear** any existing combo skill +2. **Create** new `CECComboSkill` object +3. **Initialize** with: + - Host player (this) + - Group index + - Target ID + - Force attack flag + - Ignore attack loop flag +4. **Start** combo skill execution with `Continue()` + +--- + +## Combo Skill Data Structure + +### **EC_COMBOSKILL Structure** + +Combo skills are stored in `EC_VIDEO_SETTING`: + +```cpp +// From configs/video settings +struct EC_COMBOSKILL +{ + int nIcon; // Icon ID (0 = empty/invalid) + int idSkill[EC_COMBOSKILL_LEN]; // Array of skill IDs in combo sequence + // ... other fields +}; + +EC_VIDEO_SETTING vs; +vs.comboSkill[EC_COMBOSKILL_NUM]; // Array of combo skill groups +``` + +**Constants:** +- `EC_COMBOSKILL_NUM`: Number of combo skill groups (typically 8-12) +- `EC_COMBOSKILL_LEN`: Maximum number of skills in a combo sequence + +### **Combo Skill Initialization** (EC_ComboSkill.cpp:74-92) + +```cpp +// EC_ComboSkill.cpp:74-92 +bool CECComboSkill::Init(CECHostPlayer* pHost, int iGroup, int idTarget, + bool bForceAttack, bool bIgnoreAtkLoop) +{ + // 1. Validate group index + if (iGroup < 0 || iGroup >= EC_COMBOSKILL_NUM) + { + ASSERT(0); + return false; + } + + // 2. Store parameters + m_pHost = pHost; + m_iGroup = iGroup; + m_iCursor = 0; // Start at first skill in combo + m_bStop = false; + m_idTarget = idTarget; + m_bForceAtk = bForceAttack; + m_bIgnoreAtkLoop = bIgnoreAtkLoop; + + // 3. Load combo skill data from config + CECConfigs* pCfg = g_pGame->GetConfigs(); + m_cs = pCfg->GetVideoSettings().comboSkill[iGroup]; + + // 4. Find loop start position (if any) + // ... (finds SID_LOOPSTART marker) + + return true; +} +``` + +--- + +## Complete Flow Diagram + +``` +┌─────────────────────────────────────────────────────────────┠+│ USER ACTION / CONFIG LOAD │ +└──────────────────────┬────────────────────────────────────┘ + │ + â–¼ + ┌──────────────────────────────┠+ │ Entry Point Selection │ + └──────────┬───────────────────┘ + │ + ┌──────────┴──────────┠+ │ │ + â–¼ â–¼ +┌──────────────┠┌──────────────────────┠+│ UI Drag&Drop │ │ LoadConfigData │ +│ (DlgDragDrop)│ │ (EC_ShortcutSet) │ +└──────┬───────┘ └──────────┬───────────┘ + │ │ + └──────────┬───────────┘ + │ + â–¼ + ┌─────────────────────────────┠+ │ CreateSkillGroupShortcut │ + │ (EC_ShortcutSet) │ + └──────────┬──────────────────┘ + │ + â–¼ + ┌─────────────────────────────┠+ │ new CECSCSkillGrp │ + └──────────┬──────────────────┘ + │ + â–¼ + ┌─────────────────────────────┠+ │ CECSCSkillGrp::Init(iGroup) │ + │ - Store group index │ + │ - Format description │ + └──────────┬──────────────────┘ + │ + â–¼ + ┌─────────────────────────────┠+ │ SetShortcut(iSlot, pSC) │ + │ - Replace old shortcut │ + └──────────┬──────────────────┘ + │ + â–¼ + ┌─────────────────────────────┠+ │ SHORTCUT CREATED │ + │ Ready for execution │ + └─────────────────────────────┘ + │ + │ (When user clicks shortcut) + â–¼ + ┌─────────────────────────────┠+ │ CECSCSkillGrp::Execute() │ + └──────────┬──────────────────┘ + │ + â–¼ + ┌─────────────────────────────┠+ │ ApplyComboSkill(iGroup) │ + │ (EC_HostPlayer) │ + └──────────┬─────────────────┘ + │ + â–¼ + ┌─────────────────────────────┠+ │ new CECComboSkill │ + └──────────┬──────────────────┘ + │ + â–¼ + ┌─────────────────────────────┠+ │ CECComboSkill::Init() │ + │ - Load combo data from config│ + │ - Set cursor to start │ + └──────────┬──────────────────┘ + │ + â–¼ + ┌─────────────────────────────┠+ │ CECComboSkill::Continue() │ + │ - Execute first skill │ + │ - Chain to next skills │ + └─────────────────────────────┘ +``` + +--- + +## Key Data Structures + +### **SkillGrpShortCutConfig** + +```cpp +struct SkillGrpShortCutConfig +{ + int setNum; // Shortcut set number (which quick bar) + int slotNum; // Slot index within the set (0-based) + int groupIndex; // Combo skill group index (0-based, -1 = invalid) +}; +``` + +### **CECSCSkillGrp Members** + +```cpp +class CECSCSkillGrp : public CECShortcut +{ + int m_iGroupIdx; // Combo skill group index (0-based) + CECString m_strDesc; // Description: "Skill Group {index}" +}; +``` + +--- + +## Validation & Error Handling + +### **Group Index Validation** + +1. **In CreateSkillGroupShortcut:** + - No explicit validation (assumes caller validates) + - `Init()` may fail if group index is invalid + +2. **In ConvertSkillGrpShortcut:** + ```cpp + if (vs.comboSkill[it->groupIndex].nIcon == 0) + it->groupIndex = -1; // Mark as invalid + ``` + +3. **In CECComboSkill::Init:** + ```cpp + if (iGroup < 0 || iGroup >= EC_COMBOSKILL_NUM) + { + ASSERT(0); + return false; + } + ``` + +### **Slot Validation** + +- Slot index must be within bounds of shortcut set size +- `SetShortcut()` handles slot bounds checking internally + +--- + +## Related Functions + +### **ClearComboSkill** (EC_HostPlayer.cpp:7740-7747) + +```cpp +void CECHostPlayer::ClearComboSkill() +{ + if (m_pComboSkill) + { + delete m_pComboSkill; + m_pComboSkill = NULL; + } +} +``` + +### **GetGroupIndex** (EC_Shortcut.h) + +```cpp +int GetGroupIndex() const { return m_iGroupIdx; } +``` + +Used to retrieve the group index from a shortcut for UI display or validation. + +--- + +## Summary + +**CreateSkillGroupShortcut Flow:** + +1. **Entry Points:** + - UI drag & drop operation + - Config data loading from server/save + - Programmatic assignment from config array + +2. **Core Process:** + - Create `CECSCSkillGrp` object + - Initialize with group index + - Store in shortcut set at specified slot + +3. **Execution:** + - When shortcut is clicked, `Execute()` is called + - Calls `ApplyComboSkill()` on host player + - Creates and initializes `CECComboSkill` object + - Starts combo skill sequence execution + +4. **Data Source:** + - Combo skill definitions stored in `EC_VIDEO_SETTING.comboSkill[]` + - Each combo group contains array of skill IDs + - Group index (0-based) references position in array + +--- + +## Conversion Notes for C# + +When converting to C#: +- Replace `new`/`delete` with C# object allocation +- Use `List<>` instead of `std::vector` +- Use `string` instead of `CECString` +- Use nullable types for optional values +- Use `IDisposable` pattern for cleanup +- Consider using events/delegates for shortcut execution diff --git a/Assets/PerfectWorld/Scripts/Skills/FLOW_CREATE_SKILL_GROUP_SHORTCUT.md.meta b/Assets/PerfectWorld/Scripts/Skills/FLOW_CREATE_SKILL_GROUP_SHORTCUT.md.meta new file mode 100644 index 0000000000..b56817b9a0 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Skills/FLOW_CREATE_SKILL_GROUP_SHORTCUT.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f3fdcd3d58e16de40b0541be0d654c69 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Skills/PlayerWrapper.cs b/Assets/PerfectWorld/Scripts/Skills/PlayerWrapper.cs index 42e4930baf..16bd63f5d6 100644 --- a/Assets/PerfectWorld/Scripts/Skills/PlayerWrapper.cs +++ b/Assets/PerfectWorld/Scripts/Skills/PlayerWrapper.cs @@ -3,7 +3,6 @@ using UnityEngine; namespace BrewMonster { - public class PlayerInfo { } public struct ComboArg diff --git a/Assets/PerfectWorld/Scripts/Skills/SkillStubs1/skill1.cs b/Assets/PerfectWorld/Scripts/Skills/SkillStubs1/skill1.cs index 2b672757f4..7a8b53d60e 100644 --- a/Assets/PerfectWorld/Scripts/Skills/SkillStubs1/skill1.cs +++ b/Assets/PerfectWorld/Scripts/Skills/SkillStubs1/skill1.cs @@ -141,18 +141,14 @@ namespace BrewMonster public override int GetRequiredMoney(Skill skill) => RequiredMoneyArray[skill.GetLevel() - 1]; #if SKILL_CLIENT - public int GetIntroduction(Skill skill, StringBuilder buffer, int length, string format) + public override int GetIntroduction(Skill skill, StringBuilder buffer, string format) { string result = string.Format(format, skill.GetLevel(), -5 + 7 * skill.GetLevel(), 1.9 * skill.GetLevel() * skill.GetLevel() + 64 * skill.GetLevel() + 36.7); - if (result.Length < length) - { - buffer.Append(result); - return result.Length; - } - return 0; + buffer.Append(result); + return result.Length; } #endif diff --git a/Assets/PerfectWorld/Scripts/Skills/skill.cs b/Assets/PerfectWorld/Scripts/Skills/skill.cs index 0401f100f2..5881b4dba5 100644 --- a/Assets/PerfectWorld/Scripts/Skills/skill.cs +++ b/Assets/PerfectWorld/Scripts/Skills/skill.cs @@ -1,6 +1,9 @@ using BrewMonster.Assets.PerfectWorld.Scripts.Skills; using System.Collections.Generic; +using System.Text; using UnityEngine; +using UnityEngine.InputSystem; +using static UnityEngine.Rendering.DebugUI; namespace BrewMonster.Scripts.Skills { @@ -74,7 +77,10 @@ namespace BrewMonster.Scripts.Skills } public override int GetRangeType() { return stub.GetRange().type; } public override int GetRequiredLevel() { return stub.GetRequiredLevel(this); } - + public override void GetIntroduction(StringBuilder buf, SkillStr table) + { + int n = stub.GetIntroduction(this, buf, table.Find((int)stub.id * 10 + 1)); + } public override int GetTargetType() { if (stub.restrict_corpse == 1) @@ -89,6 +95,7 @@ namespace BrewMonster.Scripts.Skills return 0; return 1; } + public override int GetComboSkPreSkill() { return stub.combosk_preskill; } public override byte GetType() { return stub.type; } public override int GetCommonCoolDown() { return stub.commoncooldown; } @@ -97,6 +104,7 @@ namespace BrewMonster.Scripts.Skills return stub.GetIcon(); } public int GetAbility() { return SkillWrapper.Instance.GetAbility(id); } + public bool CheckComboSkExtraCondition() { return stub.CheckComboSkExtraCondition(this); } public override string GetName() { return stub.GetName(); } public override float GetPrayRange(float range, float prayplus) @@ -131,6 +139,7 @@ namespace BrewMonster.Scripts.Skills public int GetRequiredRealmLevel() { return stub.GetRequiredRealmLevel(this); } public int GetMaxability() { return stub.GetMaxAbility(this); } public uint GetId() { return id; } + public int GetComboSkInterval() { return stub.combosk_interval; } } @@ -232,7 +241,12 @@ namespace BrewMonster.Scripts.Skills } public static List GetInherentSkillList(uint cls) { - return inheritSkillMap[cls]; + if (!inheritSkillMap.TryGetValue(cls, out List list)) + { + list = new List(); + inheritSkillMap[cls] = list; + } + return list; } public static SkillStub GetStub(uint i) @@ -243,11 +257,20 @@ namespace BrewMonster.Scripts.Skills public static void InitStaticData() { var map = GetMap(); + var comboMap = GetComboSkMap(); foreach (var skill in map) { SkillStub sk = skill.Value; if (sk.is_inherent) GetInherentSkillList((uint)sk.cls).Add(sk.id); - if (sk.combosk_preskill > 0) GetComboSkMap()[(uint)sk.combosk_preskill].Add(sk.id); + if (sk.combosk_preskill > 0) + { + if (!comboMap.TryGetValue((uint)sk.combosk_preskill, out List comboList)) + { + comboList = new List(); + comboMap[(uint)sk.combosk_preskill] = comboList; + } + comboList.Add(sk.id); + } } } @@ -281,7 +304,7 @@ namespace BrewMonster.Scripts.Skills public virtual int GetExecutetime(Skill skill) { return 1000; } public virtual bool CheckHpCondition(int hp, int max_hp) { return true; } public virtual bool CheckComboSkExtraCondition(Skill skill) { return true; } - public virtual int GetIntroduction(Skill skill, ushort[] descBuffer, int descBufferLen, ushort[] titleBuffer) { return 0; } + public virtual int GetIntroduction(Skill skill, StringBuilder descBuffer, string titleBuffer) { return 0; } // ������Ч�Լ�� // Validate weapon restriction public bool ValidWeapon(int weapon) diff --git a/Assets/PerfectWorld/Scripts/Tech3CSDK.meta b/Assets/PerfectWorld/Scripts/Tech3CSDK.meta new file mode 100644 index 0000000000..06775562c2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Tech3CSDK.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9cfabbaaddd233a4a9d4f07a3577d3a2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Tech3CSDK/Tech3CSDKWrapper.cs b/Assets/PerfectWorld/Scripts/Tech3CSDK/Tech3CSDKWrapper.cs new file mode 100644 index 0000000000..7b931f18ed --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Tech3CSDK/Tech3CSDKWrapper.cs @@ -0,0 +1,207 @@ +using Tech3C; +using BrewMonster; +using System; +using UnityEngine; + +namespace BrewMonster.Scripts +{ + public enum LOGIN_ERROR_CODE + { + SUCCESS = 0, + CANCELLED = -1 + } + + public class Tech3CSDKWrapper : Singleton + { + public string clientId = ""; + public string clientSecret = ""; + + private AuthCallback authCallback; + private LogoutCallback logoutCallback; + + /// + /// After Tech3C SDK returns result, this callback will be called.
+ /// (errorCode, userId, password) + ///
+ public Action onLoginCallback; + public Action onLogOutCallback; + + public bool isInitialized = false; + public bool isProcessing = false; // true if the SDK is processing a request (login or logout) + + #region private functions + protected override void Initialize() + { + base.Initialize(); + + SetupCallbacks(); + + // Auto-initialize SDK + if (!string.IsNullOrEmpty(clientId) && !string.IsNullOrEmpty(clientSecret)) + { + BMLogger.Log($"Initializing Tech3C SDK...\n Client ID: {clientId}"); + Tech3CSDK.Instance.Initialize(clientId, clientSecret); + + if (Tech3CSDK.Instance.IsInitialized) + { + BMLogger.Log("[SDK] SDK Initialized Successfully!"); + } + else + { + BMLogger.Log("[SDK] Failed to initialize SDK"); + } + } + else + { + BMLogger.Log("[SDK] Client ID and/or Client Secret not set. Please configure in Inspector."); + } + + BMLogger.Log("[SDK] Tech3C SDK Simple Demo Started"); + + isInitialized = true; + } + + private void SetupCallbacks() + { + // Auth callback + authCallback = new AuthCallback(); + authCallback.OnAuthSuccessEvent += OnAuthSuccessEvent; + authCallback.OnAuthCancelledEvent += OnAuthCancelledEvent; + authCallback.OnAuthErrorEvent += OnAuthErrorEvent; + + // Logout callback + logoutCallback = new LogoutCallback(); + logoutCallback.OnLogoutSuccessEvent += OnLogoutSuccessEvent; + logoutCallback.OnLogoutErrorEvent += OnLogoutErrorEvent; + } + #endregion + + #region SDK Callbacks + private void OnAuthSuccessEvent(string userId, string password, string accessToken, string refreshToken, LoginType loginType, long expiryTime) + { + isProcessing = false; + BMLogger.Log($"[SDK] Auth Success!\n User ID: {userId}\n Password: {password}\n Login Type: {loginType}\n Token: {accessToken?.Substring(0, Mathf.Min(20, accessToken?.Length ?? 0))}..."); + onLoginCallback?.Invoke((byte)LOGIN_ERROR_CODE.SUCCESS, userId, password); + } + + private void OnAuthCancelledEvent() + { + isProcessing = false; + BMLogger.Log("[SDK] Auth Cancelled by user"); + onLoginCallback?.Invoke((int)LOGIN_ERROR_CODE.CANCELLED, "", ""); + } + + private void OnAuthErrorEvent(int errorCode, string errorMessage) + { + isProcessing = false; + BMLogger.Log($"[SDK] Auth Error [{errorCode}]: {errorMessage}"); + onLoginCallback?.Invoke(errorCode, errorMessage, string.Empty); + } + + private void OnLogoutSuccessEvent() + { + isProcessing = false; + BMLogger.Log("[SDK] Logout Successful"); + onLogOutCallback?.Invoke((int)LOGIN_ERROR_CODE.SUCCESS, ""); + } + + private void OnLogoutErrorEvent(int errorCode, string errorMessage) + { + isProcessing = false; + BMLogger.Log($"[SDK] Logout Error [{errorCode}]: {errorMessage}"); + onLogOutCallback?.Invoke(errorCode, errorMessage); + } + #endregion + + + #region public functions + + public void SetLoginCallback(Action callback) + { + if (callback != null) + { + BMLogger.LogWarning("[SDK] Login callback is already set, it will be overridden"); + } + onLoginCallback = callback; + } + + public void RemoveLoginCallback() + { + onLoginCallback = null; + } + + public void SetLogoutCallback(Action callback) + { + if (callback != null) + { + BMLogger.LogWarning("[SDK] Logout callback is already set, it will be overridden"); + } + onLogOutCallback = callback; + } + + public void RemoveLogoutCallback() + { + onLogOutCallback = null; + } + + /// + /// Show Tech3C SDK login screen. + /// Callback will be called after login success or failed. + /// + public bool Login() + { + if (!isInitialized) + { + BMLogger.LogError("[SDK] SDK is not initialized, please call Initialize() first"); + return false; + } + + if (isProcessing) + { + BMLogger.LogError("[SDK] SDK is already processing a request, please wait for the current request to complete"); + return false; + } + + if (onLoginCallback == null) + { + BMLogger.LogError("[SDK] Login callback is not set, please set it using SetLoginCallback"); + return false; + } + + isProcessing = true; + + Tech3CSDK.Instance.ShowAuth(authCallback); + return true; + } + + public bool Logout() + { + if (!isInitialized) + { + BMLogger.LogError("[SDK] SDK is not initialized, please call Initialize() first"); + return false; + } + + if (isProcessing) + { + BMLogger.LogError("[SDK] SDK is already processing a request, please wait for the current request to complete"); + return false; + } + + + if (onLogOutCallback == null) + { + BMLogger.LogError("[SDK] Logout callback is not set, please set it using SetLogoutCallback"); + return false; + } + + isProcessing = true; + + Tech3CSDK.Instance.Logout(logoutCallback); + return true; + } + + #endregion + + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Tech3CSDK/Tech3CSDKWrapper.cs.meta b/Assets/PerfectWorld/Scripts/Tech3CSDK/Tech3CSDKWrapper.cs.meta new file mode 100644 index 0000000000..07834551d0 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Tech3CSDK/Tech3CSDKWrapper.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 61795692226b05849aec56bf168c905a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/UI/Action.meta b/Assets/PerfectWorld/Scripts/UI/Action.meta new file mode 100644 index 0000000000..e656994f37 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/Action.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 11093b8e0b61f8e46a8847e31fe74326 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/UI/Action/CDlgSkillSubAction.cs b/Assets/PerfectWorld/Scripts/UI/Action/CDlgSkillSubAction.cs new file mode 100644 index 0000000000..7553bf9e76 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/Action/CDlgSkillSubAction.cs @@ -0,0 +1,121 @@ +using BrewMonster.Assets.PerfectWorld.Scripts.UI.GamePlay; +using BrewMonster.UI; +using System; +using System.Collections.Generic; +using TMPro; +using UnityEngine; +using UnityEngine.UI; +using static UnityEditor.AddressableAssets.Build.Layout.BuildLayout; + +namespace BrewMonster +{ + public class CDlgSkillSubAction : MonoBehaviour + { + [SerializeField] List m_aActionInfo = new List(); + [SerializeField] Transform orderContain; + [SerializeField] AUIImagePicture orderTemplate; + [SerializeField] AUIImagePicture actionTemplate; + [SerializeField] Transform actionContain; + + private void Awake() + { + if (orderContain == null) + { + BMLogger.LogError("CDlgSkillSubAction: orderContain is not assigned!"); + return; + } + ; + if (actionContain == null) + { + BMLogger.LogError("CDlgSkillSubAction: actionContain is not assigned!"); + return; + } + + Init(); + } + private void OnEnable() + { + OnShowDialog(); + } + public void Init() + { + int[] objCount = { 8, 2, 2, 27 }; + + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < objCount[i]; j++) + { + var orderTP = Instantiate(orderTemplate, orderContain); + orderTP.gameObject.SetActive(true); + m_aActionInfo.Add(new ActionInfo + { + image = orderTP, + pLabel = orderTP.GetComponentInChildren() + }); + } + } + for (int j = 0; j < 27; j++) + { + var actionTP = Instantiate(actionTemplate, actionContain); + actionTP.gameObject.SetActive(true); + m_aActionInfo.Add(new ActionInfo + { + image = actionTP, + pLabel = actionTP.GetComponentInChildren() + }); + } + } + public void OnShowDialog() + { + AUIImagePicture pImage; + TextMeshProUGUI pLabel; + CECShortcut pSCThis; + string strFile = ""; + var gameUIMan = CECUIManager.Instance.GetInGameUIMan(); + + CECGameRun pGameRun = CECGameRun.Instance; + int[] objCount = { 8, 2, 2, 27 }; + CECShortcutSet[] a_pSC = + { + pGameRun.GetGenCmdShortcuts(), + pGameRun.GetTeamCmdShortcuts(), + pGameRun.GetTradeCmdShortcuts(), + pGameRun.GetPoseCmdShortcuts() + }; + int count = 0; + for (int i = 0; i < a_pSC.Length; i++) + { + for (int j = 0; j < objCount[i]; j++) + { + pImage = m_aActionInfo[count].image; + pLabel = m_aActionInfo[count].pLabel; + + if (!pImage) break; + + if (j < a_pSC[i].GetShortcutNum()) + { + pSCThis = a_pSC[i].GetShortcut(j); + pImage.SetDataPtr(pSCThis, "ptr_CECShortcut"); + + strFile = pSCThis.GetIconFile(); + gameUIMan.SetCover(pImage, strFile, EC_GAMEUI_ICONS.ICONS_ACTION); + + pLabel.SetText(pSCThis.GetDesc()); + } + else + { + /* pImage->Show(false); + pLabel->Show(false);*/ + } + count++; + } + } + } + [Serializable] + public struct ActionInfo + { + public AUIImagePicture image; + public TextMeshProUGUI pLabel; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/UI/Action/CDlgSkillSubAction.cs.meta b/Assets/PerfectWorld/Scripts/UI/Action/CDlgSkillSubAction.cs.meta new file mode 100644 index 0000000000..771166f069 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/Action/CDlgSkillSubAction.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1eda03e6b4326e14b95d57bf324b96bb \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/UI/CDlgMessageBox.cs b/Assets/PerfectWorld/Scripts/UI/CDlgMessageBox.cs index 488f82b625..3e53f72414 100644 --- a/Assets/PerfectWorld/Scripts/UI/CDlgMessageBox.cs +++ b/Assets/PerfectWorld/Scripts/UI/CDlgMessageBox.cs @@ -1,28 +1,79 @@ -using BrewMonster.UI; +using System; +using BrewMonster.UI; using UnityEngine; using static CECUIManager; namespace BrewMonster { + public enum MessageBoxType + { + YesButton, + NoButton, + BothYesNoButton, + } + public struct MessageBoxData + { + public string Title; + public string Message; + public MessageBoxType MessageBoxType; + public Action OnClickedYes; + public Action OnClickedNo; + } public class CDlgMessageBox : AUIDialog { [SerializeField] private TMPro.TextMeshProUGUI titleText; [SerializeField] private TMPro.TextMeshProUGUI messageText; [SerializeField] private UnityEngine.UI.Button okButton; - private void Awake() + [SerializeField] private UnityEngine.UI.Button _noButton; + + private MessageBoxData _messageData; + + public override void OnEnable() { - okButton.onClick.RemoveAllListeners(); + base.OnEnable(); okButton.onClick.AddListener(OnOkClicked); + _noButton.onClick.AddListener(OnNoClicked); } + + public override void OnDisable() + { + okButton.onClick.RemoveListener(OnOkClicked); + _noButton.onClick.RemoveListener(OnNoClicked); + } + private void OnOkClicked() { EventBus.Publish(new MessageBoxEvent(1,this)); + _messageData.OnClickedYes?.Invoke(); Show(false); } - public void ShowMessageBox(string title, string message) + private void OnNoClicked() { - SetName(title); - messageText.text = message; + EventBus.Publish(new MessageBoxEvent(0,this)); + _messageData.OnClickedNo?.Invoke(); + Show(false); + } + public void ShowMessageBox(MessageBoxData messageBoxData) + { + _messageData = messageBoxData; + SetName(messageBoxData.Title); + messageText.text = messageBoxData.Message; + + okButton.gameObject.SetActive(false); + _noButton.gameObject.SetActive(false); + switch (_messageData.MessageBoxType) + { + case MessageBoxType.YesButton: + okButton.gameObject.SetActive(true); + break; + case MessageBoxType.NoButton: + _noButton.gameObject.SetActive(true); + break; + case MessageBoxType.BothYesNoButton: + okButton.gameObject.SetActive(true); + _noButton.gameObject.SetActive(true); + break; + } Show(true); } } diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgDragDrop.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgDragDrop.cs new file mode 100644 index 0000000000..53dec1542c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgDragDrop.cs @@ -0,0 +1,28 @@ +using BrewMonster.Network; +using BrewMonster.UI; +using UnityEngine; + +namespace BrewMonster +{ + public class CDlgDragDrop : MonoBehaviour + { +#if UNITY_EDITOR + private void Update() + { + if (Input.GetKeyDown(KeyCode.S)) + OnSkillDragDrop(); + } +#endif + public void OnSkillDragDrop() + { + var iSlot = 2; + var nCombo = 2; + CECShortcutSet pSCS = CECUIManager.Instance.GetInGameUIMan().GetSCSByDlg(1); + if (pSCS.GetShortcut(iSlot - 1) == null || !EC_Game.GetConfigs().GetGameSettings().bLockQuickBar) + pSCS.CreateSkillGroupShortcut(iSlot - 1, nCombo - 1); + } + } +} + +/*AString s = WC2AS(*pstr); // convert wide -> ansi/utf8 tùy macro bạn định nghĩa +a_LogOutput(0, "HoangDev: 1 n=%d, pstr=%s", n, static_cast (s));*/ \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgDragDrop.cs.meta b/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgDragDrop.cs.meta new file mode 100644 index 0000000000..40e16805bb --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgDragDrop.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ad855801e0cddfe46a48b448016ee952 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgSkillSubOther.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgSkillSubOther.cs new file mode 100644 index 0000000000..eb60b4192b --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgSkillSubOther.cs @@ -0,0 +1,540 @@ +using System.Collections.Generic; +using BrewMonster; +using BrewMonster.Scripts.Skills; +using BrewMonster.UI; +using UnityEngine; +using UnityEngine.UI; +using TMPro; +using BrewMonster.Assets.PerfectWorld.Scripts.UI.GamePlay; +using BrewMonster.Network; + +namespace BrewMonster.UI +{ + /// + /// Skill dialog sub-other panel - displays combo skills, fixed skills, item skills, and produce skills + /// Converted from DlgSkillSubOther.cpp/h + /// + [DisallowMultipleComponent] + public class CDlgSkillSubOther : AUIDialog + { + private const int ITEM_SKILL_MAX_COUNT = 8; + private const int FIXED_SKILL_MAX_COUNT = 4; + + [Header("Combo Skill Images")] + [SerializeField] private List m_comboSkillImages = new List(); + + [Header("Fixed Skill Components")] + [SerializeField] private List m_fixedImgPics = new List(); + [SerializeField] private List m_fixedTxts = new List(); + + [Header("Item Skill Images")] + [SerializeField] private List m_itemSkillImages = new List(); + + [Header("Produce Skill Components")] + [SerializeField] private List m_produceImgIcons = new List(); + [SerializeField] private List m_produceNameLabels = new List(); + [SerializeField] private List m_produceSkilledTxtLabels = new List(); + [SerializeField] private List m_produceSkilledExpLabels = new List(); + [SerializeField] private List m_produceLevelLabels = new List(); + + [Header("Buttons")] + [SerializeField] private Button m_btnEdit; + [SerializeField] private Button m_btnDelete; + [SerializeField] private Button m_btnNew; + + private int m_nComboSelect = 0; + + private readonly List m_fixedSkills = new List(); + private readonly List m_produceSkills = new List(); + + private void Awake() + { + // Initialize fixed skills - 167 is return skill + m_fixedSkills.Add(167); + + // Initialize produce skills - respectively: weapon crafting, armor crafting, accessory crafting, alchemy + m_produceSkills.Add(158); + m_produceSkills.Add(159); + m_produceSkills.Add(160); + m_produceSkills.Add(161); + + // Setup button listeners + if (m_btnEdit != null) + m_btnEdit.onClick.AddListener(OnCommandEdit); + if (m_btnDelete != null) + m_btnDelete.onClick.AddListener(OnCommandDelete); + if (m_btnNew != null) + m_btnNew.onClick.AddListener(OnCommandNew); + } + + public override void OnShowDialogue() + { + base.OnShowDialogue(); + Debug.Log("CDlgSkillSubOther::OnShowDialog()"); + UpdateComboSkill(); + UpdateFixedSkill(); + UpdateItemSkill(); + UpdateProduceSkill(); + } + + /*public override bool Render() + { + if (!base.Render()) + return false; + + if (!gameObject.activeInHierarchy) + return true; + + // Item skills and produce skills may change, update them + UpdateItemSkill(); + UpdateProduceSkill(); + + // Update fixed skill cooldowns + CECHostPlayer host = GetHostPlayer(); + for (int i = 0; i < m_fixedSkills.Count && i < m_fixedImgPics.Count; i++) + { + if (m_fixedImgPics[i] != null && host != null) + { + CECSkill pSkill = host.GetPositiveSkillByID(m_fixedSkills[i]); + UpdateImagePictureCD(m_fixedImgPics[i], pSkill); + } + } + + // Update item skill cooldowns + int equipSkillNum = host != null ? host.GetEquipSkillNum() : 0; + for (int i = 0; i < equipSkillNum && i < ITEM_SKILL_MAX_COUNT && i < m_itemSkillImages.Count; i++) + { + if (m_itemSkillImages[i] != null && host != null) + { + CECSkill pSkill = host.GetEquipSkillByIndex(i); + UpdateImagePictureCD(m_itemSkillImages[i], pSkill); + } + } + + return true; + }*/ + + // Edit combo skill - called from DlgSkill + public void OnCommandEdit() + { + // TODO: Implement DlgSkillEdit equivalent + // GetGameUIMan()->m_pDlgSkillEdit->SetData(m_nComboSelect); + // GetGameUIMan()->m_pDlgSkillEdit->Show(true); + Debug.Log($"OnCommandEdit: combo select = {m_nComboSelect}"); + } + + // New combo skill - called from DlgSkill + public void OnCommandNew() + { + // TODO: Implement DlgSkillEdit equivalent + // GetGameUIMan()->m_pDlgSkillEdit->SetData(0); + // GetGameUIMan()->m_pDlgSkillEdit->Show(true); + Debug.Log("OnCommandNew"); + } + + // Delete combo skill - called from DlgSkill + public void OnCommandDelete() + { + if (m_nComboSelect < 0 || m_nComboSelect > EC_ConfigConstants.EC_COMBOSKILL_NUM) + return; + + CECConfigs configs = EC_Game.GetConfigs(); + if (configs == null) + return; + + EC_VIDEO_SETTING setting = configs.GetVideoSettings(); + setting.comboSkill[m_nComboSelect - 1].nIcon = 0; + m_nComboSelect = 0; + configs.SetVideoSettings(setting); + UpdateComboSkill(); + } + + // Helper dictionary to store combo skill data + private Dictionary m_comboSkillData = new Dictionary(); + + // Helper dictionary to store skill data for images + private Dictionary m_skillData = new Dictionary(); + + // Update combo skill icons - called from DlgSkill + public void UpdateComboSkill() + { + /*CECConfigs configs = EC_Game.GetConfigs(); + if (configs == null) + return; + + EC_VIDEO_SETTING setting = configs.GetVideoSettings(); + CECGameUIMan gameUIMan = GetGameUIMan(); + + for (int i = 0; i < EC_ConfigConstants.EC_COMBOSKILL_NUM; i++) + { + AUIImagePicture pImage = m_comboSkillImages[i]; + if (pImage != null) + { + if (setting.comboSkill[i].nIcon != 0) + { + // TODO: Set icon from sprite sheet + //pImage->SetCover(GetGameUIMan()->m_pA2DSpriteIcons[CECGameUIMan::ICONS_SKILLGRP], + // setting.comboSkill[i].nIcon + 1); + m_comboSkillData[pImage] = (uint)(i + 1); + //pImage.SetDataPtr(new object(), "ptr_Valid"); // Equivalent to (void*)1 + + string hintText = GetStringFromTable(804); + if (!string.IsNullOrEmpty(hintText)) + { + hintText = string.Format(hintText, i); + // TODO: Set hint text + // pImage->SetHint(hintText); + } + } + else + { + // TODO: Clear icon + // pImage->SetCover(NULL, -1); + m_comboSkillData[pImage] = 0; + pImage.SetDataPtr(null); + // pImage->SetHint(""); + } + } + }*/ + } + + // Update fixed skill display + public void UpdateFixedSkill() + { + // First hide all fixed skill components + /*for (int i = 0; i < FIXED_SKILL_MAX_COUNT; i++) + { + if (i < m_fixedImgPics.Count && m_fixedImgPics[i] != null) + m_fixedImgPics[i].gameObject.SetActive(false); + if (i < m_fixedTxts.Count && m_fixedTxts[i] != null) + m_fixedTxts[i].gameObject.SetActive(false); + } + + Debug.Assert(m_fixedSkills.Count <= FIXED_SKILL_MAX_COUNT, "Fixed skills count exceeds max"); + + CECHostPlayer host = GetHostPlayer(); + for (int i = 0; i < m_fixedSkills.Count; i++) + { + if (i < m_fixedImgPics.Count && m_fixedImgPics[i] != null) + m_fixedImgPics[i].gameObject.SetActive(true); + if (i < m_fixedTxts.Count && m_fixedTxts[i] != null) + m_fixedTxts[i].gameObject.SetActive(true); + + CECSkill pSkill = host?.GetPositiveSkillByID(m_fixedSkills[i]); + if (pSkill != null) + { + SetImage(m_fixedImgPics[i], pSkill); + if (i < m_fixedTxts.Count && m_fixedTxts[i] != null) + m_fixedTxts[i].text = pSkill.GetNameDisplay(); + } + else + { + if (i < m_fixedImgPics.Count && m_fixedImgPics[i] != null) + { + m_fixedImgPics[i].gameObject.SetActive(false); + SetImage(m_fixedImgPics[i], null); + } + if (i < m_fixedTxts.Count && m_fixedTxts[i] != null) + m_fixedTxts[i].gameObject.SetActive(false); + } + }*/ + } + + // Update item skill display + public void UpdateItemSkill() + { + CECHostPlayer host = GetHostPlayer(); + if (host == null) + return; + + int equipSkillNum = host.GetEquipSkillNum(); + for (int i = 0; i < ITEM_SKILL_MAX_COUNT && i < m_itemSkillImages.Count; i++) + { + AUIImagePicture pImgPic = m_itemSkillImages[i]; + if (pImgPic != null) + { + if (i < equipSkillNum) + { + CECSkill pSkill = host.GetEquipSkillByIndex(i); + SetImage(pImgPic, pSkill); + } + else + { + SetImage(pImgPic, null); + } + } + } + } + + // Update produce skill display + public void UpdateProduceSkill() + { + CECHostPlayer host = GetHostPlayer(); + if (host == null) + return; + + for (int i = 0; i < m_produceSkills.Count; i++) + { + AUIImagePicture imgIcon = i < m_produceImgIcons.Count ? m_produceImgIcons[i] : null; + TextMeshProUGUI lblName = i < m_produceNameLabels.Count ? m_produceNameLabels[i] : null; + TextMeshProUGUI lblSkilledTxt = i < m_produceSkilledTxtLabels.Count ? m_produceSkilledTxtLabels[i] : null; + TextMeshProUGUI lblSkilledExp = i < m_produceSkilledExpLabels.Count ? m_produceSkilledExpLabels[i] : null; + TextMeshProUGUI lblLevel = i < m_produceLevelLabels.Count ? m_produceLevelLabels[i] : null; + + if (imgIcon != null) + imgIcon.gameObject.SetActive(true); + if (lblName != null) + lblName.gameObject.SetActive(true); + + //CECSkill pSkill = host.GetPassiveSkillByID(m_produceSkills[i]); + /* if (pSkill == null) + { + if (lblSkilledTxt != null) + lblSkilledTxt.gameObject.SetActive(false); + if (lblSkilledExp != null) + lblSkilledExp.gameObject.SetActive(false); + if (lblLevel != null) + lblLevel.gameObject.SetActive(false); + + if (imgIcon != null) + { + // Set gray color + Image img = imgIcon.GetComponent(); + if (img != null) + img.color = new Color(0.5f, 0.5f, 0.5f, 1f); // RGB(128, 128, 128) + } + + CECSkill tmpSkill = new CECSkill(m_produceSkills[i], 1); + SetImage(imgIcon, tmpSkill); + if (lblName != null) + lblName.text = tmpSkill.GetNameDisplay(); + } + else + { + if (lblSkilledTxt != null) + lblSkilledTxt.gameObject.SetActive(true); + if (lblSkilledExp != null) + lblSkilledExp.gameObject.SetActive(true); + if (lblLevel != null) + lblLevel.gameObject.SetActive(true); + + if (imgIcon != null) + { + // Set white color + Image img = imgIcon.GetComponent(); + if (img != null) + img.color = Color.white; // RGB(255, 255, 255) + } + + SetImage(imgIcon, pSkill); + if (lblName != null) + lblName.text = pSkill.GetNameDisplay();*/ + + /* int maxAbility = ElementSkill.GetMaxAbility(m_produceSkills[i], pSkill.GetSkillLevel()); + int ability = ElementSkill.GetAbility(m_produceSkills[i]);*/ + + /* if (lblSkilledExp != null) + lblSkilledExp.text = $"{ability}/{maxAbility}";*/ + /*if (lblLevel != null) + { + string levelFormat = GetStringFromTable(11323); + if (!string.IsNullOrEmpty(levelFormat)) + lblLevel.text = string.Format(levelFormat, pSkill.GetSkillLevel()); + }*/ + //} + } + } + + // Get combo skill data for an image + private uint GetComboSkillData(AUIImagePicture pImage) + { + if (pImage == null) + return 0; + return m_comboSkillData.TryGetValue(pImage, out uint data) ? data : 0; + } + + // Handle combo skill icon click for drag - called from DlgSkill + public void OnEventLButtonDownCombo(AUIImagePicture pObj) + { + uint data = GetComboSkillData(pObj); + if (pObj == null || data == 0) + return; + + // TODO: Implement drag and drop + // A3DVIEWPORTPARAM *p = m_pA3DEngine->GetActiveViewport()->GetParam(); + // POINT pt = { GET_X_LPARAM(lParam) - p->X, GET_Y_LPARAM(lParam) - p->Y }; + // GetGameUIMan()->m_ptLButtonDown = pt; + // GetGameUIMan()->InvokeDragDrop(this, pObj, pt); + Debug.Log($"OnEventLButtonDownCombo: combo skill {data}"); + } + + // Handle fixed skill icon click for drag + public void OnEventLButtonDownFixed(AUIImagePicture pObj) + { + if (pObj == null) + return; + + /* CECSkill skill = GetSkillFromImage(pObj); + if (skill == null) + return;*/ + + // TODO: Implement drag and drop + // GetGameUIMan()->m_ptLButtonDown = ...; + // GetGameUIMan()->InvokeDragDrop(this, pObj, GetGameUIMan()->m_ptLButtonDown); + Debug.Log("OnEventLButtonDownFixed"); + } + + // Handle item skill icon click for drag + public void OnEventLButtonDownItem(AUIImagePicture pObj) + { + if (pObj == null) + return; + + /* CECSkill skill = GetSkillFromImage(pObj); + if (skill == null) + return;*/ + + // TODO: Implement drag and drop + // GetGameUIMan()->m_ptLButtonDown = ...; + // GetGameUIMan()->InvokeDragDrop(this, pObj, GetGameUIMan()->m_ptLButtonDown); + Debug.Log("OnEventLButtonDownItem"); + } + + // Select combo skill - called from DlgSkill + public void SelectComboSkill(int n) + { + if (n < 1 || n > m_comboSkillImages.Count) + return; + + if (m_nComboSelect == n) + { + // Deselect + AUIImagePicture pImage = m_comboSkillImages[n - 1]; + if (pImage != null) + { + Image img = pImage.GetComponent(); + if (img != null) + img.color = Color.white; // RGB(255, 255, 255) + } + m_nComboSelect = 0; + } + else + { + // Deselect previous + if (m_nComboSelect != 0 && m_nComboSelect <= m_comboSkillImages.Count) + { + AUIImagePicture pImage = m_comboSkillImages[m_nComboSelect - 1]; + if (pImage != null) + { + Image img = pImage.GetComponent(); + if (img != null) + img.color = Color.white; // RGB(255, 255, 255) + } + } + + // Select new + m_nComboSelect = n; + AUIImagePicture pNewImage = m_comboSkillImages[n - 1]; + if (pNewImage != null) + { + Image img = pNewImage.GetComponent(); + if (img != null) + img.color = new Color(0.627f, 0.627f, 0.627f, 1f); // RGB(160, 160, 160) + } + } + } + + // Set image for an AUIImagePicture with a skill - called from DlgSkill + public void SetImage(AUIImagePicture pImage, CECSkill pSkill) + { + if (pImage == null) + return; + + if (pSkill != null) + { + // TODO: Set icon from sprite sheet + // AString strFile; + // af_GetFileTitle(pSkill->GetIconFile(), strFile); + // strFile.MakeLower(); + // pImage->SetCover( + // GetGameUIMan()->m_pA2DSpriteIcons[CECGameUIMan::ICONS_SKILL], + // GetGameUIMan()->m_IconMap[CECGameUIMan::ICONS_SKILL][strFile]); + + // Store skill in dictionary for retrieval + m_skillData[pImage] = pSkill; + + // Try to set as shortcut if possible + /* if (pSkill is CECShortcut shortcut) + pImage.SetDataPtr(shortcut, "ptr_CECSkill");*/ + // TODO: Set hint + // pImage->SetHint(pSkill->GetDesc()); + } + else + { + // TODO: Clear icon + // pImage->SetCover(NULL, -1); + m_skillData.Remove(pImage); + pImage.SetDataPtr(null); + // pImage->SetHint(""); + } + } + + // Get skill from image + /* private CECSkill GetSkillFromImage(AUIImagePicture pImage) + { + if (pImage == null) + return null; + + // Try dictionary first + if (m_skillData.TryGetValue(pImage, out CECSkill skill)) + return skill; + + // Try shortcut + CECShortcut shortcut = pImage.GetDataPtr(); + return shortcut as CECSkill; + }*/ + + // Update image picture cooldown display + private void UpdateImagePictureCD(AUIImagePicture pImgPic, CECSkill pSkill) + { + if (pImgPic == null) + return; + + CECHostPlayer pHost = GetHostPlayer(); + if (pHost == null) + return; + + AUIClockIcon pClock = pImgPic.GetClockIcon(); + if (pClock == null) + return; + + Image img = pImgPic.GetComponent(); + if (img == null) + return; + + if (pSkill != null && pSkill.ReadyToCast() && pHost.GetPrepSkill() != pSkill) + { + if (pHost.CheckSkillCastCondition(pSkill) == 0) + img.color = Color.white; // RGB(255, 255, 255) + else + img.color = new Color(0.5f, 0.5f, 0.5f, 1f); // RGB(128, 128, 128) + } + else + { + // Set clock color + Image clockImg = pClock.GetClockIcon(); + if (clockImg != null) + clockImg.color = new Color(0, 0, 0, 0.5f); // RGBA(0, 0, 0, 128) + } + + if (pSkill != null && (pSkill.GetCoolingTime() > 0 || pHost.GetPrepSkill() == pSkill)) + { + pClock.SetProgressRange(0, pSkill.GetCoolingTime()); + if (pHost.GetPrepSkill() == pSkill) + pClock.SetProgressPos(0); + else + pClock.SetProgressPos(pSkill.GetCoolingTime() - pSkill.GetCoolingCnt()); + } + } + } +} diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgSkillSubOther.cs.meta b/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgSkillSubOther.cs.meta new file mode 100644 index 0000000000..168af860c5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgSkillSubOther.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 27624565938535e4593764faffe78bbf \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs index 79da4965a0..d76b053eb1 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs @@ -33,6 +33,7 @@ namespace BrewMonster [SerializeField] private Button m_BtnCancel; [SerializeField] private Sprite khung_item; + [SerializeField] private Transform itemInventoryRoot; private EC_IvtrItem m_SelectedEquip; private EC_IvtrItem m_SelectedMaterial; @@ -50,12 +51,28 @@ namespace BrewMonster RegisterClick(m_SlotSecondlParent, OnClickMaterialSlot); } + public override void Update() + { +#if UNITY_EDITOR || UNITY_STANDALONE + if (Input.GetMouseButtonDown(0)) + { + CheckHidePanel(Input.mousePosition); + } +#else + if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) + { + CheckHidePanel(Input.GetTouch(0).position); + } +#endif + } + public override void OnEnable() { base.OnEnable(); //todo need to set from other class // SetName("Win_Enchase"); m_BtnMerge.onClick.AddListener(OnClickedMerge); + m_BtnCancel.onClick.AddListener(OnClickedCancel); m_install_price = -1; } @@ -63,11 +80,7 @@ namespace BrewMonster { base.OnDisable(); m_BtnMerge.onClick.RemoveListener(OnClickedMerge); - } - - public void OpenInstall(uint npcId) - { - + m_BtnCancel.onClick.RemoveListener(OnClickedCancel); } public void CloseInstall() @@ -217,6 +230,12 @@ namespace BrewMonster else detailedItem.GetDetailDataFromLocal(); + if (m_FirstInvSlot >= 0) + { + var previosBtn = FindInventoryButtonBySlot(m_FirstInvSlot); + SetInventorySlotGray(previosBtn, false); + } + m_SelectedEquip?.Freeze(false); m_SelectedEquip = detailedItem; m_FirstInvSlot = slotIndex; @@ -227,8 +246,6 @@ namespace BrewMonster SetInventorySlotGray(btn, true); detailedItem.Freeze(true); - - Debug.Log($"[Install] Equipment: {detailedItem.m_tid} from slot {slotIndex}"); } private void OnDropMaterial(PointerEventData eventData) @@ -252,6 +269,12 @@ namespace BrewMonster else detailedItem.GetDetailDataFromLocal(); + if (m_SecondInvSlot >= 0) + { + var previosBtn = FindInventoryButtonBySlot(m_SecondInvSlot); + SetInventorySlotGray(previosBtn, false); + } + m_SelectedMaterial?.Freeze(false); m_SelectedMaterial = detailedItem; m_SelectedMaterial?.Freeze(true); @@ -297,8 +320,6 @@ namespace BrewMonster // a_sprintf(szText, _AL("%d"), nAmount); // m_pTxtGold->SetText(szText); // } - - Debug.Log($"[Install] Material: {detailedItem.m_tid} from slot {slotIndex}"); } private void SetInventorySlotGray(Button btn, bool gray) @@ -343,23 +364,19 @@ namespace BrewMonster private void ClearEquipSlot() { m_SelectedEquip?.Freeze(false); - m_SelectedMaterial?.Freeze(false); m_SelectedEquip = null; m_FirstInvSlot = -1; m_TxtFirstName.text = "___"; ClearSlotIcon(m_SlotFirstParent); - - Debug.Log("[Install] Equipment slot cleared"); } private void ClearMaterialSlot() { + m_SelectedMaterial?.Freeze(false); m_SelectedMaterial = null; m_SecondInvSlot = -1; m_TxtSecondName.text = "___"; ClearSlotIcon(m_SlotSecondlParent); - - Debug.Log("[Install] Material slot cleared"); } private void ClearSlotIcon(Transform slot) @@ -385,8 +402,8 @@ namespace BrewMonster if( nMoney > pHost.GetMoneyAmount() ) { message = GetGameUIMan().GetStringFromTable(226); - Debug.LogError(message); - // GetGameUIMan()->MessageBox("", GetGameUIMan().GetStringFromTable(226), MB_OK, + CECUIManager.Instance.ShowMessageBox("", message); + // GetGameUIMan().GetDialog("") // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); // pMsgBox->SetLife(3); return; @@ -396,7 +413,7 @@ namespace BrewMonster if( !pIvtrA.IsEquipment() ) { message = GetGameUIMan().GetStringFromTable(223); - Debug.LogError(message); + CECUIManager.Instance.ShowMessageBox("", message); // GetGameUIMan().MessageBox("", GetGameUIMan().GetStringFromTable(223), MB_OK, // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); // pMsgBox.SetLife(3); @@ -410,7 +427,7 @@ namespace BrewMonster if( pEquipA.GetEmptyHoleNum() <= 0 ) { message = GetGameUIMan().GetStringFromTable(224); - Debug.LogError(message); + CECUIManager.Instance.ShowMessageBox("", message); // GetGameUIMan().MessageBox("", GetGameUIMan()->GetStringFromTable(224), MB_OK, // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); // pMsgBox.SetLife(3); @@ -421,7 +438,7 @@ namespace BrewMonster if(pIvtrB == null || !pIvtrB.IsEmbeddable() ) { message = GetGameUIMan().GetStringFromTable(225); - Debug.LogError(message); + CECUIManager.Instance.ShowMessageBox("", message); // GetGameUIMan().MessageBox("", GetGameUIMan().GetStringFromTable(225), MB_OK, // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); // pMsgBox.SetLife(3); @@ -436,7 +453,7 @@ namespace BrewMonster switch( pEquipA.GetClassID() ) { case (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_WEAPON: - nEquipLevel = ((EC_IvtrWeapon)pEquipA).GetDBEssence().level; + nEquipLevel = ((CECIvtrWeapon)pEquipA).GetDBEssence().level; break; case (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_ARMOR: nEquipLevel = ((EC_IvtrArmor)pEquipA).GetDBEssence().level; @@ -449,7 +466,7 @@ namespace BrewMonster if( nStoneLevel > nEquipLevel ) { message = GetGameUIMan().GetStringFromTable(300); - Debug.LogError(message); + CECUIManager.Instance.ShowMessageBox("", message); // GetGameUIMan().MessageBox("", GetGameUIMan().GetStringFromTable(300), MB_OK, // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); // pMsgBox.SetLife(3); @@ -464,7 +481,7 @@ namespace BrewMonster pHost.GetPack(InventoryConst.IVTRTYPE_PACK).UnfreezeAllItems(); message = GetGameUIMan().GetStringFromTable(228); - Debug.LogError(message); + CECUIManager.Instance.ShowMessageBox("", message); // GetGameUIMan().MessageBox("", GetGameUIMan().GetStringFromTable(228), // MB_OK, A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); // pMsgBox.SetLife(3); @@ -484,5 +501,41 @@ namespace BrewMonster // MB_OKCANCEL, A3DCOLORRGBA(255, 255, 255, 160)); // } } + private void OnClickedCancel() + { + Show(false); + } + + public void ResetInstallUI() + { + RestoreInventoryColors(); + + m_SelectedEquip = null; + m_SelectedMaterial = null; + + m_FirstInvSlot = -1; + m_SecondInvSlot = -1; + + m_TxtFirstName.text = "___"; + m_TxtSecondName.text = "___"; + m_TxtMoney.text = "0"; + m_install_price = -1; + + ClearSlotIcon(m_SlotFirstParent); + ClearSlotIcon(m_SlotSecondlParent); + + gameObject.SetActive(false); + } + + private void CheckHidePanel(Vector2 screenPos) + { + if (!RectTransformUtility.RectangleContainsScreenPoint( + itemInventoryRoot as RectTransform, screenPos, + Camera.main)) + { + if(itemInventoryRoot!=null) + itemInventoryRoot.gameObject.SetActive(false); + } + } } } \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs index a546e83502..ab8369e45a 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs @@ -3406,27 +3406,9 @@ namespace BrewMonster.UI if (pCurNPCEssence.HasValue) { uint npcID = pCurNPCEssence.Value.id; - DlgInstall dlgInstall = FindFirstObjectByType(); - if (dlgInstall == null) - { - CECGameUIMan gameUIMan = GetGameUIMan(); - DialogScriptTableObject dialogResource = gameUIMan.GetDialogResource(); - Canvas canvas = gameUIMan.GetCanvas(); - - if(dialogResource != null && canvas != null) - { - GameObject ob = dialogResource.GetPrefabDialog("Win_Enchase"); - if (ob != null) - { - dlgInstall = GameObject.Instantiate(ob, canvas.transform).GetComponent(); - } - } - } - - if(dlgInstall != null) - { - dlgInstall.OpenInstall(npcID); - } + + var dlgInstall =GetGameUIMan().GetDialog("Win_Enchase"); + dlgInstall.Show(true); } //pShow1 = m_pAUIManager.GetDialog("Win_Enchase"); //pShow2 = m_pAUIManager.GetDialog("Win_Inventory"); diff --git a/Assets/PerfectWorld/Scripts/UI/Emote.meta b/Assets/PerfectWorld/Scripts/UI/Emote.meta new file mode 100644 index 0000000000..243b63faf5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/Emote.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d97873e24020e642b7c6f6b79ea8c2c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/UI/Emote/CDlgTaskAction.cs b/Assets/PerfectWorld/Scripts/UI/Emote/CDlgTaskAction.cs new file mode 100644 index 0000000000..6d27c4b246 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/Emote/CDlgTaskAction.cs @@ -0,0 +1,15 @@ +using BrewMonster.UI; +using UnityEngine; + +namespace BrewMonster +{ + public class CDlgTaskAction : AUIDialog + { + public void OnShowDialog() + { + uint param = GetData(); + + + } + } +} diff --git a/Assets/PerfectWorld/Scripts/UI/Emote/CDlgTaskAction.cs.meta b/Assets/PerfectWorld/Scripts/UI/Emote/CDlgTaskAction.cs.meta new file mode 100644 index 0000000000..6e9112aa2f --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/Emote/CDlgTaskAction.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a5f25e21a0550df41af0c2e57639635a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIImagePicture.cs b/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIImagePicture.cs index 46560a1828..7442b211b3 100644 --- a/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIImagePicture.cs +++ b/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIImagePicture.cs @@ -13,8 +13,8 @@ namespace BrewMonster.Assets.PerfectWorld.Scripts.UI.GamePlay { public class AUIImagePicture : MonoBehaviour { - CECShortcut pSC; [Header("AUIImagePicture")] + [SerializeField] CECShortcut pSC; [SerializeField] Button skillbutton; [SerializeField] protected Image skillImage; [SerializeField] GameObject borderImage; @@ -32,14 +32,16 @@ namespace BrewMonster.Assets.PerfectWorld.Scripts.UI.GamePlay if (skillbutton == null) { Debug.LogError("Skill Button is not assigned in AUIImagePicture"); + return; } skillbutton.onClick.AddListener(Execute); m_pParent = GetComponentInParent(); } - public void SetDataPtr(CECShortcut pvData, string strName) + public void SetDataPtr(CECShortcut pvData, string strName = null) { pSC = pvData; } + public CECShortcut GetDataPtr() => pSC; public void Execute() { if (pSC != null) diff --git a/Assets/PerfectWorld/Scripts/UI/GamePlay/CdlgQuickBar.cs b/Assets/PerfectWorld/Scripts/UI/GamePlay/CdlgQuickBar.cs index 747da6bdf9..95f32fe94b 100644 --- a/Assets/PerfectWorld/Scripts/UI/GamePlay/CdlgQuickBar.cs +++ b/Assets/PerfectWorld/Scripts/UI/GamePlay/CdlgQuickBar.cs @@ -1,3 +1,5 @@ +//#define Applyforalicense + using BrewMonster.Assets.PerfectWorld.Scripts.UI.GamePlay; using BrewMonster.Network; using BrewMonster.Scripts; @@ -25,16 +27,17 @@ namespace BrewMonster /// Apply for a license remove later ///
/// + + + public bool UpdateShortcuts() { CECShortcut pSC; - Image skillImage; CECSCSkill pSCSkill; - int iIconFile, nMax; AUIImagePicture pCell; CECSkill pSkill = new CECSkill(-1, -1); AUIClockIcon pClock; - + int iIconFile, nMax = 0; int nCurPanel9 = GetCurPanel1(); int nCurPanel8 = GetCurPanel2(); @@ -44,7 +47,6 @@ namespace BrewMonster var a_pSCS = new List(); var a_pszPanel = new List(); GetQuickBarNameAndSC(pHost, a_pszPanel, a_pSCS, nCurPanel9, nCurPanel8); - if (a_pSCS == null || a_pSCS.Count < 2) return false; @@ -53,12 +55,28 @@ namespace BrewMonster if (a_pSCS[i] == null) continue; - /*CDlgQuickBar* pQuickBar = dynamic_cast(GetGameUIMan()->GetDialog(a_pszPanel[i])); - if (!pQuickBar || !pQuickBar->IsShow()) continue;*/ + //*//*CDlgQuickBar* pQuickBar = dynamic_cast(GetGameUIMan()->GetDialog(a_pszPanel[i])); + //if (!pQuickBar || !pQuickBar->IsShow()) continue;*//* +#if LICENSE_VERSION + + int slotIndex = 0; +#endif + +#if LICENSE_VERSION + + for (int j = 0; j < a_pSCS.Count; j++) + { +#else int nSlots = Mathf.Min(a_pSCS[i].GetShortcutNum(), AUIImagePictureList.Count); for (int j = 0; j < nSlots; j++) - { + { +#endif +#if LICENSE_VERSION + + pCell = AUIImagePictureList[slotIndex]; +#else pCell = AUIImagePictureList[j]; +#endif pSC = a_pSCS[i].GetShortcut(j); pClock = pCell.GetClockIcon(); pClock.SetProgressRange(0, 1); @@ -67,13 +85,12 @@ namespace BrewMonster { if (pSC.GetType() == (int)CECShortcut.ShortcutType.SCT_SKILL) { - iIconFile = (int)EC_GAMEUI_ICONS.ICONS_SKILL; pSCSkill = (CECSCSkill)pSC; pSkill = pSCSkill.GetSkill(); if (false/*m_bDelGoblinSkillSC && GNET::ElementSkill::IsGoblinSkill(pSkill->GetSkillID())*/) { - /* a_pSCS[i]->SetShortcut(j, NULL); - pSC = NULL;*/ + /* a_pSCS[i]->SetShortcut(j, NULL); + pSC = NULL;*/ } else { @@ -81,14 +98,14 @@ namespace BrewMonster { if (ElementSkill.IsGoblinSkill((uint)pSkill.GetSkillID())) { - /* if (pHostGoblin && !pHostGoblin->CheckSkillCastCondition(pSkill)) - { - pCell->SetColor(A3DCOLORRGB(255, 255, 255)); - } - else - { - pCell->SetColor(A3DCOLORRGB(128, 128, 128)); - }*/ + /* if (pHostGoblin && !pHostGoblin->CheckSkillCastCondition(pSkill)) + { + pCell->SetColor(A3DCOLORRGB(255, 255, 255)); + } + else + { + pCell->SetColor(A3DCOLORRGB(128, 128, 128)); + }*/ } else { @@ -102,8 +119,8 @@ namespace BrewMonster } } } - /* else - pClock.SetColor(A3DCOLORRGBA(0, 0, 0, 128));*/ + /*else + pClock.SetColor(A3DCOLORRGBA(0, 0, 0, 128));*/ if (pSkill != null && (pSkill.GetCoolingTime() > 0 || pHost.GetPrepSkill() == pSkill)) { @@ -199,7 +216,7 @@ namespace BrewMonster pClock->SetColor(A3DCOLORRGBA(0, 0, 0, 128)); } }*/ - else if(pSC.GetType() == (int)CECShortcut.ShortcutType.SCT_ITEM) + else if (pSC.GetType() == (int)CECShortcut.ShortcutType.SCT_ITEM) { iIconFile = (int)EC_GAMEUI_ICONS.ICONS_INVENTORY; pCell.SetColor(new Color(1f, 1f, 1f)); @@ -211,7 +228,7 @@ namespace BrewMonster { int maxNullable = -1; int coolTime = pItem.GetCoolTime(out maxNullable); - nMax = maxNullable > 0 ? maxNullable: 0; + nMax = maxNullable > 0 ? maxNullable : 0; if (coolTime > 0) { @@ -266,7 +283,7 @@ namespace BrewMonster // GetGameUIMan().SetCover(pCell, petIcon, EC_GAMEUI_ICONS.ICONS_INVENTORY); // } //} - else if(pSC.GetType() == (int)CECShortcut.ShortcutType.SCT_AUTOFASHION) + else if (pSC.GetType() == (int)CECShortcut.ShortcutType.SCT_AUTOFASHION) { iIconFile = (int)EC_GAMEUI_ICONS.ICONS_SUITE; @@ -320,218 +337,22 @@ namespace BrewMonster if (pSC != null) { - pCell.SetDataPtr(pSC, "ptr_CECShortcut"); +#if LICENSE_VERSION + slotIndex++; +#endif + if (pCell.GetDataPtr() == pSC) + { + continue; + } + pCell.SetDataPtr(pSC); if (pSC.GetType() == (int)CECShortcut.ShortcutType.SCT_SKILLGRP) { - /* EC_VIDEO_SETTING setting = GetGame()->GetConfigs()->GetVideoSettings(); - pCell->SetCover(GetGameUIMan()->m_pA2DSpriteIcons[CECGameUIMan::ICONS_SKILLGRP], - setting.comboSkill[((CECSCSkillGrp*)pSC)->GetGroupIndex()].nIcon + 1);*/ - } - else - { - if (pSkill != null) - { - //BMLogger.Log("HoangDev: QuickBar Set Skill Icon: " + (uint)pSkill.GetSkillID() + " : " + ElementSkill.GetIcon((uint)pSkill.GetSkillID())); - var nameskill = ElementSkill.GetIcon((uint)pSkill.GetSkillID()); - GetGameUIMan().SetCover(pCell, nameskill, EC_GAMEUI_ICONS.ICONS_SKILL); - } - /*af_GetFileTitle(pSC->GetIconFile(), strFile); - strFile.MakeLower(); - pCell->SetCover(GetGameUIMan()->m_pA2DSpriteIcons[iIconFile], - GetGameUIMan()->m_IconMap[iIconFile][strFile]);*/ - } - } - } - else - { - /* pCell->SetCover(NULL, -1); - pCell->SetText(_AL("")); - pCell->SetDataPtr(NULL); - pCell->SetColor(A3DCOLORRGB(255, 255, 255));*/ - } - } - } - return true; - } - /* public bool UpdateShortcuts() - { - CECShortcut pSC; - Image skillImage; - CECSCSkill pSCSkill; - int iIconFile, nMax; - AUIImagePicture pCell; - CECSkill pSkill = new CECSkill(-1, -1); - AUIClockIcon pClock; - - - int nCurPanel9 = GetCurPanel1(); - int nCurPanel8 = GetCurPanel2(); - - CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer(); - if (pHost == null) return false; - var a_pSCS = new List(); - var a_pszPanel = new List(); - GetQuickBarNameAndSC(pHost, a_pszPanel, a_pSCS, nCurPanel9, nCurPanel8); - - for (int i = 0; i <= 1*//*(int)a_pSCS.Count*//*; i++) - { - if (a_pSCS[i] == null) - continue; - - *//*CDlgQuickBar* pQuickBar = dynamic_cast(GetGameUIMan()->GetDialog(a_pszPanel[i])); - if (!pQuickBar || !pQuickBar->IsShow()) continue;*//* - - for (int j = 0; j < AUIImagePictureList.Count; j++) - { - pCell = AUIImagePictureList[j]; - pSC = a_pSCS[i].GetShortcut(j); - pClock = pCell.GetClockIcon(); - pClock.SetProgressRange(0, 1); - pClock.SetProgressPos(1); - if (pSC != null) - { - if (pSC.GetType() == (int)CECShortcut.ShortcutType.SCT_SKILL) - { - iIconFile = (int)EC_GAMEUI_ICONS.ICONS_SKILL; - pSCSkill = (CECSCSkill)pSC; - pSkill = pSCSkill.GetSkill(); - if (false*//*m_bDelGoblinSkillSC && GNET::ElementSkill::IsGoblinSkill(pSkill->GetSkillID())*//*) - { - *//* a_pSCS[i]->SetShortcut(j, NULL); - pSC = NULL;*//* - } - else - { - if (pSkill != null && pSkill.ReadyToCast() && pHost.GetPrepSkill() != pSkill) - { - if (ElementSkill.IsGoblinSkill((uint)pSkill.GetSkillID())) - { - *//* if (pHostGoblin && !pHostGoblin->CheckSkillCastCondition(pSkill)) - { - pCell->SetColor(A3DCOLORRGB(255, 255, 255)); - } - else - { - pCell->SetColor(A3DCOLORRGB(128, 128, 128)); - }*//* - } - else - { - if (pHost.CheckSkillCastCondition(pSkill) == 0) - { - //pCell.SetColor(A3DCOLORRGB(255, 255, 255)); - } - else - { - //pCell.SetColor(A3DCOLORRGB(128, 128, 128)); - } - } - } - *//* else - pClock.SetColor(A3DCOLORRGBA(0, 0, 0, 128));*//* - if (pSkill != null && (pSkill.GetCoolingTime() > 0 || - pHost.GetPrepSkill() == pSkill)) - { - pClock.SetProgressRange(0, pSkill.GetCoolingTime()); - if (pHost.GetPrepSkill() == pSkill) - { - pClock.SetProgressPos(0); - } - else - { - pClock.SetProgressPos(pSkill.GetCoolingTime() - pSkill.GetCoolingCnt()); - } - } - } - } - *//*else if (pSC->GetType() == CECShortcut::SCT_ITEM) - { - iIconFile = CECGameUIMan::ICONS_INVENTORY; - pCell->SetColor(A3DCOLORRGB(255, 255, 255)); - pSCItem = (CECSCItem*)pSC; - pIvtr = GetHostPlayer()->GetPack(pSCItem->GetInventory()); - pItem = pIvtr->GetItem(pSCItem->GetIvtrSlot()); - if (pItem && pItem->GetCoolTime(&nMax) > 0) - { - pClock->SetProgressRange(0, nMax); - pClock->SetProgressPos(nMax - pItem->GetCoolTime()); - pClock->SetColor(A3DCOLORRGBA(0, 0, 0, 128)); - } - if (pSCItem->GetInventory() == IVTRTYPE_EQUIPPACK) - pCell->SetColor(A3DCOLORRGBA(128, 128, 255, 128)); - } - else if (pSC->GetType() == CECShortcut::SCT_PET) - { - pSCPet = (CECSCPet*)pSC; - CECPetData* pPet = pPetCorral->GetPetData(pSCPet->GetPetIndex()); - iIconFile = CECGameUIMan::ICONS_INVENTORY; - pCell->SetColor(A3DCOLORRGB(255, 255, 255)); - if (pPet) - { - // dead combat pet - if ((pPet->GetClass() == GP_PET_CLASS_COMBAT || pPet->GetClass() == GP_PET_CLASS_EVOLUTION) && pPet->GetHPFactor() == 0.0f) - { - pCell->SetColor(A3DCOLORRGB(128, 128, 128)); - } - // current active pet - else if (pSCPet->IsActivePet()) - { - pCell->SetColor(A3DCOLORRGB(255, 255, 0)); - } - } - } - else if (pSC->GetType() == CECShortcut::SCT_AUTOFASHION) - { - iIconFile = CECGameUIMan::ICONS_SUITE; - fashionCoolTime = pHost->GetCoolTime(GP_CT_EQUIP_FASHION_ITEM, &fashionCoolTimeMax); - pCell->SetColor(A3DCOLORRGB(255, 255, 255)); - if (fashionCoolTimeMax > 0) - { - pClock->SetProgressRange(0, fashionCoolTimeMax); - pClock->SetProgressPos(fashionCoolTimeMax - fashionCoolTime); - pClock->SetColor(A3DCOLORRGBA(0, 0, 0, 175)); - } - } - else - { - iIconFile = CECGameUIMan::ICONS_ACTION; - if (pSC->GetType() == CECShortcut::SCT_COMMAND) - { - CECSCCommand* pCommandSC = (CECSCCommand*)pSC; - if (GetHostPlayer()->IsInvisible()) - { - if (pCommandSC->GetCommandID() == CECSCCommand::CMD_STARTTRADE || - pCommandSC->GetCommandID() == CECSCCommand::CMD_SELLBOOTH || - pCommandSC->GetCommandID() == CECSCCommand::CMD_BINDBUDDY) - { - pCell->SetColor(A3DCOLORRGB(128, 128, 128)); - } - else - { - pCell->SetColor(A3DCOLORRGB(255, 255, 255)); - } - } - else - { - pCell->SetColor(A3DCOLORRGB(255, 255, 255)); - } - } - - if (pSC->GetCoolTime(&nMax) > 0) - { - pClock->SetProgressRange(0, nMax); - pClock->SetProgressPos(nMax - pSC->GetCoolTime()); - pClock->SetColor(A3DCOLORRGBA(0, 0, 0, 128)); - } - }*//* - if (pSC != null) - { - pCell.SetDataPtr(pSC, "ptr_CECShortcut"); - if (pSC.GetType() == (int)CECShortcut.ShortcutType.SCT_SKILLGRP) - { - *//* EC_VIDEO_SETTING setting = GetGame()->GetConfigs()->GetVideoSettings(); - pCell->SetCover(GetGameUIMan()->m_pA2DSpriteIcons[CECGameUIMan::ICONS_SKILLGRP], - setting.comboSkill[((CECSCSkillGrp*)pSC)->GetGroupIndex()].nIcon + 1);*//* + EC_VIDEO_SETTING setting = EC_Game.GetConfigs().GetVideoSettings(); + /* pCell.SetCover(GetGameUIMan()->m_pA2DSpriteIcons[CECGameUIMan::ICONS_SKILLGRP], + setting.comboSkill[((CECSCSkillGrp)pSC).GetGroupIndex()].nIcon + 1); + setting.comboSkill[((CECSCSkillGrp)pSC).GetGroupIndex()].nIcon + 1;*/ + // fix later now haven't skill group icon yet + GetGameUIMan().SetCover(pCell, "unknown", EC_GAMEUI_ICONS.ICONS_SKILL); } else { @@ -542,24 +363,24 @@ namespace BrewMonster var nameskill = ElementSkill.GetIcon((uint)pSkill.GetSkillID()); GetGameUIMan().SetCover(pCell, nameskill, EC_GAMEUI_ICONS.ICONS_SKILL); } - *//*af_GetFileTitle(pSC->GetIconFile(), strFile); - strFile.MakeLower(); - pCell->SetCover(GetGameUIMan()->m_pA2DSpriteIcons[iIconFile], - GetGameUIMan()->m_IconMap[iIconFile][strFile]);*//* + /* af_GetFileTitle(pSC->GetIconFile(), strFile); + strFile.MakeLower(); + pCell->SetCover(GetGameUIMan()->m_pA2DSpriteIcons[iIconFile], + GetGameUIMan()->m_IconMap[iIconFile][strFile]); */ } } } else { - *//* pCell->SetCover(NULL, -1); - pCell->SetText(_AL("")); + /* pCell->SetCover(NULL, -1); + pCell->SetText(_AL("")); pCell->SetDataPtr(NULL); - pCell->SetColor(A3DCOLORRGB(255, 255, 255));*//* + pCell->SetColor(A3DCOLORRGB(255, 255, 255)); */ } } } return true; - }*/ + } private void GetQuickBarNameAndSC(CECHostPlayer pHost, List pszPanel, List pSCS, int panel9, int panel8) { string dlgName; @@ -612,11 +433,11 @@ namespace BrewMonster pszPanel.Add(dlgName); } } - private int GetCurPanel1() + public int GetCurPanel1() { return m_nCurPanel1; } - private int GetCurPanel2() + public int GetCurPanel2() { return m_nCurPanel2; } diff --git a/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_GameUIMan.cs b/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_GameUIMan.cs index 6fbbee69b8..9ffa389f22 100644 --- a/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_GameUIMan.cs +++ b/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_GameUIMan.cs @@ -10,7 +10,9 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using Unity.VisualScripting; using UnityEngine; +using static UnityEngine.Rendering.DebugUI; namespace BrewMonster.UI { @@ -23,6 +25,7 @@ namespace BrewMonster.UI private Dictionary m_IconMap; private const string SKILL_ICONLIST_NAME = "iconlist_skill_multisprite"; + private const string ACTION_ICONLIST_NAME = "ActionIcon/iconlist_action_multisprite"; public static bool TALKPROC_IS_TERMINAL(uint id) { @@ -60,7 +63,24 @@ namespace BrewMonster.UI } m_pDlgNPC.PopupNPCDialog(pTalk); } - + public CECShortcutSet GetSCSByDlg(int indexPanel) + { + CECHostPlayer pHost = CECGameRun.Instance.GetHostPlayer(); + CDlgQuickBar cDlgQuickBar = CECUIManager.Instance.GetCDlgQuickBar(); + CECShortcutSet pSCS = null; + int index = (0); + if (indexPanel == 1) + { + int panel = (index < 0 ? cDlgQuickBar.GetCurPanel1() : index) - 1; + pSCS = pHost.GetShortcutSet1(0); + } + else + { + int panel = (index < 0 ? cDlgQuickBar.GetCurPanel2() : index) - 1; + pSCS = pHost.GetShortcutSet2(panel); + } + return pSCS; + } // 弹出任务完æˆå¯¹è¯æ¡†ï¼ˆåˆ°è¾¾/离开地点等触å‘) // Popup task-finish dialog (reach/leave site, etc.) // C++: pTask->PopupTaskFinishDialog(taskId, &awardTalk); then OnUIDialogEnd() notifies server. public bool PopupTaskFinishDialog(uint taskId, talk_proc pTalk) @@ -146,9 +166,9 @@ namespace BrewMonster.UI m_pDlgTask = GetDialog(CECUIHelper.DlgTaskName).GetComponent(); m_pDlgTask.Show(false); - m_IconMap[(byte)EC_GAMEUI_ICONS.ICONS_SKILL] =("iconlist_skill_multisprite", Resources.LoadAll("iconlist_skill_multisprite")); + m_IconMap[(byte)EC_GAMEUI_ICONS.ICONS_SKILL] = (SKILL_ICONLIST_NAME, Resources.LoadAll(SKILL_ICONLIST_NAME)); + m_IconMap[(byte)EC_GAMEUI_ICONS.ICONS_ACTION] = (ACTION_ICONLIST_NAME, Resources.LoadAll(ACTION_ICONLIST_NAME)); } - public void SetCover(AUIImagePicture pImgPic, string nameImage, EC_GAMEUI_ICONS iCONS_SKILL) { pImgPic.SetImage(m_IconMap[(byte)iCONS_SKILL].Item2.FirstOrDefault(s => s.name == nameImage)); @@ -176,7 +196,6 @@ namespace BrewMonster.UI } } public enum EC_GAMEUI_ICONS : byte - { ICONS_ACTION = 0, ICONS_SKILL, diff --git a/Assets/PerfectWorld/Scripts/UI/GamePlay/SkillUI/CDlgSkillSubListItem.cs b/Assets/PerfectWorld/Scripts/UI/GamePlay/SkillUI/CDlgSkillSubListItem.cs index 8e11a1cd7f..1462bec629 100644 --- a/Assets/PerfectWorld/Scripts/UI/GamePlay/SkillUI/CDlgSkillSubListItem.cs +++ b/Assets/PerfectWorld/Scripts/UI/GamePlay/SkillUI/CDlgSkillSubListItem.cs @@ -1,3 +1,4 @@ +using BrewMonster.Assets.PerfectWorld.Scripts.UI.GamePlay; using BrewMonster.Scripts.Skills; using BrewMonster.UI; using CSNetwork.GPDataType; @@ -18,6 +19,7 @@ namespace BrewMonster [SerializeField] private Image skillIcon; [SerializeField] private GameObject m_highlight; [SerializeField] private Button m_upgradeBtn; + [SerializeField] private AUIImagePicture m_skillIconImgPic; private int m_skillID; private int m_curLevel; @@ -135,20 +137,36 @@ namespace BrewMonster break; } } + + string skillDsc; + int reqLevel; + int reqRealmLevel; if (enumSkillLearnedState.SKILL_NOT_LEARNED == learnedState) { skillIcon.color = Color.gray; - /* skillDsc = model.GetSkillDescription(m_skillID, 1); - reqLevel = GNET::ElementSkill::GetRequiredLevel(m_skillID, 1); - reqRealmLevel = GNET::ElementSkill::GetRequiredRealmLevel(m_skillID, 1);*/ + skillDsc = model.GetSkillDescription(m_skillID, 1); + reqLevel = ElementSkill.GetRequiredLevel((uint)m_skillID, 1); + reqRealmLevel = ElementSkill.GetRequiredRealmLevel((uint)m_skillID, 1); } else { skillIcon.color = Color.white; - /* skillDsc = model.GetSkillDescription(m_skillID, m_curLevel); - reqLevel = GNET::ElementSkill::GetRequiredLevel(m_skillID, m_curLevel); - reqRealmLevel = GNET::ElementSkill::GetRequiredRealmLevel(m_skillID, m_curLevel);*/ + skillDsc = model.GetSkillDescription(m_skillID, m_curLevel); + reqLevel = ElementSkill.GetRequiredLevel((uint)m_skillID, m_curLevel); + reqRealmLevel = ElementSkill.GetRequiredRealmLevel((uint)m_skillID, m_curLevel); } + if (reqLevel == 0) + { + reqLevel = 1; + } + skillDsc += GPDataTypeHelper.ReplacePercentD(GetStringFromTable(11328), reqLevel); + if (reqRealmLevel != 0) + { + skillDsc += GetStringFromTable(11401); + skillDsc += GetGameUIMan().GetRealmName(reqRealmLevel); + } + + //m_skillIconImgPic.SetHint(skillDsc); string skillName = model.GetSkillName(m_skillID); /* if (model.IsPassiveSkill(m_skillID)) diff --git a/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs b/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs index bb118a1ed9..e2be45bad7 100644 --- a/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs +++ b/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using BrewMonster.Network; +using BrewMonster.Scripts; using CSNetwork.Protocols; using CSNetwork.Protocols.RPCData; using TMPro; @@ -34,42 +35,23 @@ namespace BrewMonster.UI bool isDoneNPCRender = false; private SynchronizationContext context; public AudioClip loginBGM; + + void Awake() + { + var tech3CWrapper = Tech3CSDKWrapper.Instance; + } + void Start() { AudioManager.Instance.PlayBGM(loginBGM, 1.5f); _loginButton.onClick.AddListener(OnLoginButtonClicked); context = SynchronizationContext.Current; - var world = SceneManager.GetSceneByName("a61"); - if (!world.IsValid() || !world.isLoaded) - { - SceneManager.LoadSceneAsync("a61", LoadSceneMode.Additive); - } + _usernameInputField.text = PlayerPrefs.GetString("username", ""); + _passwordInputField.text = PlayerPrefs.GetString("password", ""); - ApplyLoginEntry(BrewMonster.Network.LogoutFlowState.ConsumeNextLoginEntry()); - } - - - public void ApplyLoginEntry(BrewMonster.Network.LogoutFlowState.LoginEntryTarget entry) - { - _loginInProgress = false; - if (_loginButton != null) _loginButton.interactable = true; - - if (_usernameInputField != null) _usernameInputField.text = PlayerPrefs.GetString("username", ""); - if (_passwordInputField != null) _passwordInputField.text = PlayerPrefs.GetString("password", ""); - - if (_selectCharacterScreen != null) - _selectCharacterScreen.gameObject.SetActive(false); - - if (entry == BrewMonster.Network.LogoutFlowState.LoginEntryTarget.SelectRole) - { - // Only auto-login when we actually have saved creds. - if (!string.IsNullOrEmpty(_usernameInputField.text) && !string.IsNullOrEmpty(_passwordInputField.text)) - { - BMLogger.Log("[LoginScreenUI] Auto-login triggered (return-to-select-role)."); - OnLoginButtonClicked(); - } - } + Tech3CSDKWrapper.Instance.SetLoginCallback(OnLoginCallback); + Tech3CSDKWrapper.Instance.SetLogoutCallback(OnLogoutCallback); } // Update is called once per frame @@ -97,26 +79,16 @@ namespace BrewMonster.UI #endif } + + private void OnDisable() + { + Tech3CSDKWrapper.Instance.RemoveLoginCallback(); + Tech3CSDKWrapper.Instance.RemoveLogoutCallback(); + } + public async void OnLoginButtonClicked() { - if (_loginInProgress) - { - BMLogger.LogWarning("[LoginScreenUI] Login already in progress (ignored click)."); - return; - } - _loginInProgress = true; - if (_loginButton != null) _loginButton.interactable = false; - - BMLogger.Log("OnLoginButtonClicked"); - string username = _usernameInputField.text; - string password = _passwordInputField.text; - // UnityGameSession.SetConnectionInfo("103.182.22.52", 29000); - UnityGameSession.SetConnectionInfo("103.51.120.195", 29000); - PlayerPrefs.SetString("username", username); - PlayerPrefs.SetString("password", password); - PlayerPrefs.Save(); - BMLogger.Log($"[LoginScreenUI] Connecting+login start user='{username}'"); - await UnityGameSession.Login(username, password, OnLoginComplete); + Tech3CSDKWrapper.Instance.Login(); } /// @@ -325,5 +297,37 @@ namespace BrewMonster.UI } } #endif + + private async void OnLoginCallback(int errorCode, string userId, string password) + { + if (errorCode == 0) + { + BMLogger.Log($"Login success -- userId: {userId} - {password}"); + // UnityGameSession.SetConnectionInfo("103.182.22.52", 29000); + UnityGameSession.SetConnectionInfo("103.51.120.195", 29000); + PlayerPrefs.SetString("username", userId); + PlayerPrefs.SetString("password", password); + PlayerPrefs.Save(); + await UnityGameSession.Login(userId, password, OnLoginComplete); + _selectCharacterScreen.gameObject.SetActive(true); + } + else + { + // if it failed, the userId will be the error message + BMLogger.LogError($"Login failed -- errorCode: {errorCode}: {userId}"); + } + } + + private void OnLogoutCallback(int errorCode, string errorMessage) + { + if (errorCode == 0) + { + BMLogger.Log("Logout success"); + } + else + { + BMLogger.LogError($"Logout failed -- errorCode: {errorCode}: {errorMessage}"); + } + } } } \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/UI/SkillUI/CDlgSkillEdit.cs b/Assets/PerfectWorld/Scripts/UI/SkillUI/CDlgSkillEdit.cs new file mode 100644 index 0000000000..9a76761aa2 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/SkillUI/CDlgSkillEdit.cs @@ -0,0 +1,80 @@ +using Animancer; +using BrewMonster.Assets.PerfectWorld.Scripts.UI.GamePlay; +using BrewMonster.Network; +using BrewMonster.UI; +using System; +using UnityEngine; + +namespace BrewMonster +{ + public class CDlgSkillEdit : AUIDialog + { + int m_nIcon; + + // Start is called once before the first execution of Update after the MonoBehaviour is created + public override void Start() + { + m_nIcon = 1; + } +#if UNITY_EDITOR + public override void Update() + { + if (Input.GetKeyDown(KeyCode.T)) + { + OnShowDialog(); + OnCommandConfirm(); + } + } +#endif + public void OnShowDialog() + { + EC_VIDEO_SETTING setting = EC_Game.GetConfigs().GetVideoSettings(); + if (GetData() == 0) + { + for (uint i = 0; i < EC_ConfigConstants.EC_COMBOSKILL_NUM; i++) + { + if (setting.comboSkill[i].nIcon == 0) + { + SetData(i + 1); + break; + } + } + if (GetData() == 0) + { + //Show(false); + return; + } + } + } + public void OnCommandConfirm() + { + EC_VIDEO_SETTING setting = EC_Game.GetConfigs().GetVideoSettings(); + setting.comboSkill[GetData() - 1].nIcon = (byte)m_nIcon; + int i; + int j = 0; + for (i = 0; i < 2; i++) + { + /* AString strName; + strName.Format("Item_%d", i + 1); + PAUIIMAGEPICTURE pImage = static_cast(GetDlgItem(strName)); + if (!pImage) break;*/ + + //CECSkill pSkill = (CECSkill)pImage.GetDataPtr("ptr_CECSkill"); + //int iType = pImage->GetData(); + if (true/*iType == 0 && pSkill != null*/) + { + setting.comboSkill[GetData() - 1].idSkill[j] = (short)(i +1) /*pSkill.GetSkillID()*/; + j++; + } + else + { + //setting.comboSkill[GetData() - 1].idSkill[j] = -iType; + j++; + } + } + EC_Game.GetConfigs().SetVideoSettings(setting); + //Show(false); + CECUIManager.Instance.m_pDlgSkillSubOther.UpdateComboSkill(); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/UI/SkillUI/CDlgSkillEdit.cs.meta b/Assets/PerfectWorld/Scripts/UI/SkillUI/CDlgSkillEdit.cs.meta new file mode 100644 index 0000000000..427f5ad1e3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/SkillUI/CDlgSkillEdit.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b46a84d2ff078524f974fb6d60019d8c \ No newline at end of file diff --git a/Assets/Plugins/Android.meta b/Assets/Plugins/Android.meta new file mode 100644 index 0000000000..ba484d202e --- /dev/null +++ b/Assets/Plugins/Android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f45408c4c89289d498475d0e1e1e5b7e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/AndroidManifest.xml b/Assets/Plugins/Android/AndroidManifest.xml new file mode 100644 index 0000000000..783069970e --- /dev/null +++ b/Assets/Plugins/Android/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Assets/Plugins/Android/AndroidManifest.xml.meta b/Assets/Plugins/Android/AndroidManifest.xml.meta new file mode 100644 index 0000000000..bfa9b92c0a --- /dev/null +++ b/Assets/Plugins/Android/AndroidManifest.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 11f5d7426047d6048a47d330b02103d9 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/baseProjectTemplate.gradle.DISABLED b/Assets/Plugins/Android/baseProjectTemplate.gradle.DISABLED new file mode 100644 index 0000000000..fd43460978 --- /dev/null +++ b/Assets/Plugins/Android/baseProjectTemplate.gradle.DISABLED @@ -0,0 +1,13 @@ +plugins { + // If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity + // See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html + // See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle + // To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version + id 'com.android.application' version '7.4.2' apply false + id 'com.android.library' version '7.4.2' apply false + **BUILD_SCRIPT_DEPS** +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/CSNetwork.csproj.meta b/Assets/Plugins/Android/baseProjectTemplate.gradle.DISABLED.meta similarity index 74% rename from Assets/PerfectWorld/Scripts/Network/CSNetwork/CSNetwork.csproj.meta rename to Assets/Plugins/Android/baseProjectTemplate.gradle.DISABLED.meta index 333a9b1482..f58f05f816 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/CSNetwork.csproj.meta +++ b/Assets/Plugins/Android/baseProjectTemplate.gradle.DISABLED.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d0c06c588e2a6442488a3542551fb243 +guid: 7736ab544ec5cab4a89af84ac45b5a75 DefaultImporter: externalObjects: {} userData: diff --git a/Assets/Plugins/Android/mainTemplate.gradle b/Assets/Plugins/Android/mainTemplate.gradle new file mode 100644 index 0000000000..323c9d1038 --- /dev/null +++ b/Assets/Plugins/Android/mainTemplate.gradle @@ -0,0 +1,51 @@ +apply plugin: 'com.android.library' +apply from: '../shared/keepUnitySymbols.gradle' +**APPLY_PLUGINS** + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "androidx.appcompat:appcompat:1.6.1" + implementation "com.google.android.material:material:1.11.0" +**DEPS**} + +android { + ndkVersion "**NDKVERSION**" + namespace "com.unity3d.player" + ndkPath "**NDKPATH**" + compileSdk **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + buildFeatures { + viewBinding true + } + + defaultConfig { +**DEFAULT_CONFIG_SETUP** + minSdk **MINSDK** + targetSdk **TARGETSDK** + ndk { + debugSymbolLevel **DEBUGSYMBOLLEVEL** + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD** + } + + lint { + abortOnError false + } + + androidResources { + noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ') + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~" + }**PACKAGING** +} +**IL_CPP_BUILD_SETUP** +**SOURCE_BUILD_SETUP** +**EXTERNAL_SOURCES** diff --git a/Assets/Plugins/Android/mainTemplate.gradle.backup b/Assets/Plugins/Android/mainTemplate.gradle.backup new file mode 100644 index 0000000000..c5203ee0d7 --- /dev/null +++ b/Assets/Plugins/Android/mainTemplate.gradle.backup @@ -0,0 +1,47 @@ +apply plugin: 'com.android.library' +**APPLY_PLUGINS** + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "androidx.appcompat:appcompat:1.6.1" + implementation "com.google.android.material:material:1.11.0" +**DEPS**} + +android { + namespace "com.unity3d.player" + ndkPath "**NDKPATH**" + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + buildFeatures { + viewBinding true + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD** + } + + lintOptions { + abortOnError false + } + + aaptOptions { + noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ') + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~" + }**PACKAGING_OPTIONS** +} +**IL_CPP_BUILD_SETUP** +**SOURCE_BUILD_SETUP** +**EXTERNAL_SOURCES** diff --git a/Assets/Plugins/Android/mainTemplate.gradle.backup.meta b/Assets/Plugins/Android/mainTemplate.gradle.backup.meta new file mode 100644 index 0000000000..db9977c019 --- /dev/null +++ b/Assets/Plugins/Android/mainTemplate.gradle.backup.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f3bedb9070cd041a2bb8a27d9751aada +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/mainTemplate.gradle.meta b/Assets/Plugins/Android/mainTemplate.gradle.meta new file mode 100644 index 0000000000..ff480e90c1 --- /dev/null +++ b/Assets/Plugins/Android/mainTemplate.gradle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 950fdc575e5b3b74ea1d3f1c60322d4f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/UI/DlgInstall.prefab b/Assets/Prefabs/UI/DlgInstall.prefab index bed021b314..04a23593d8 100644 --- a/Assets/Prefabs/UI/DlgInstall.prefab +++ b/Assets/Prefabs/UI/DlgInstall.prefab @@ -1660,7 +1660,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: 10000000000000 + m_text: 0 m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2} m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2} @@ -10577,6 +10577,7 @@ MonoBehaviour: m_BtnMerge: {fileID: 8208092408021918524} m_BtnCancel: {fileID: 4503836757578509720} khung_item: {fileID: 21300000, guid: a5366f3bce011c046902e39b6bd3a077, type: 3} + itemInventoryRoot: {fileID: 7750009739432212686} --- !u!1 &5641506892578507279 GameObject: m_ObjectHideFlags: 0 @@ -14989,7 +14990,7 @@ MonoBehaviour: m_Calls: - m_Target: {fileID: 2206910701173095729} m_TargetAssemblyTypeName: BrewMonster.DlgInstall, Assembly-CSharp - m_MethodName: CloseInstall + m_MethodName: ResetInstallUI m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} diff --git a/Assets/Prefabs/UI/SkillUI.prefab b/Assets/Prefabs/UI/SkillUI.prefab index 83678dbe3b..e04ce1ccd4 100644 --- a/Assets/Prefabs/UI/SkillUI.prefab +++ b/Assets/Prefabs/UI/SkillUI.prefab @@ -1,81 +1,5 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &68671097516495824 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8207062190152923167} - - component: {fileID: 2470783342719052758} - - component: {fileID: 6357400155582891162} - m_Layer: 5 - m_Name: icon (4) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &8207062190152923167 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 68671097516495824} - 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: 1437300383384742693} - m_Father: {fileID: 4081610106255437587} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 267.97998, y: -140.39} - m_SizeDelta: {x: 76, y: 76} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &2470783342719052758 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 68671097516495824} - m_CullTransparentMesh: 1 ---- !u!114 &6357400155582891162 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 68671097516495824} - 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: 1356336560449e54a921e7243886103d, 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 &219396834207870826 GameObject: m_ObjectHideFlags: 0 @@ -592,9 +516,9 @@ RectTransform: - {fileID: 8973447809558247843} m_Father: {fileID: 1654603029608217456} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 127, y: -18.5} m_SizeDelta: {x: 254, y: 37} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &8691517676783670774 @@ -635,157 +559,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &771961096932171415 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5072897564513800831} - - component: {fileID: 2068948930011411376} - - component: {fileID: 9024679396079154730} - - component: {fileID: 2349993922899877909} - 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 &5072897564513800831 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 771961096932171415} - 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: 6303248515195535170} - 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: 117.99603, y: 0} - m_SizeDelta: {x: 143.9446, y: 91.87} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &2068948930011411376 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 771961096932171415} - m_CullTransparentMesh: 1 ---- !u!114 &9024679396079154730 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 771961096932171415} - 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: "Luy\u1EC7n c\xF4ng abc \n" - 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: 36 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 256 - 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!114 &2349993922899877909 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 771961096932171415} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 --- !u!1 &811953921939744168 GameObject: m_ObjectHideFlags: 0 @@ -1030,10 +803,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 8161223343954633123} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 612, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &4137582808097631545 CanvasRenderer: @@ -1126,7 +899,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 341.445, y: -143.3} - m_SizeDelta: {x: 682.89, y: 0} + m_SizeDelta: {x: 682.89, y: 157} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &2888636379950673376 CanvasRenderer: @@ -1246,7 +1019,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 335.91, y: -507.53912} - m_SizeDelta: {x: 651.82, y: 0} + m_SizeDelta: {x: 651.82, y: 418.6261} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &2731969899170380074 CanvasRenderer: @@ -1401,82 +1174,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &1311361867680229186 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3859668954031866820} - - component: {fileID: 6827161983670056836} - - component: {fileID: 5471987453864427329} - m_Layer: 5 - m_Name: icon (5) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &3859668954031866820 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1311361867680229186} - 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: 5522115170115830047} - m_Father: {fileID: 4081610106255437587} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 497.96, y: -140.39} - m_SizeDelta: {x: 76, y: 76} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &6827161983670056836 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1311361867680229186} - m_CullTransparentMesh: 1 ---- !u!114 &5471987453864427329 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1311361867680229186} - 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: 1356336560449e54a921e7243886103d, 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 &1339982055211423898 GameObject: m_ObjectHideFlags: 0 @@ -1510,9 +1207,9 @@ RectTransform: - {fileID: 9111714609820286996} m_Father: {fileID: 1619307578907548267} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 127, y: -18.5} m_SizeDelta: {x: 254, y: 37} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &435316849762927757 @@ -1692,10 +1389,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 7868147299253831422} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 535.82, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &4447529290182386867 CanvasRenderer: @@ -1735,82 +1432,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &1459008698363568209 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7637365022686006345} - - component: {fileID: 7126092370693143460} - - component: {fileID: 7228098406543726320} - m_Layer: 5 - m_Name: icon (2) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &7637365022686006345 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1459008698363568209} - 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: 1622116703579488826} - m_Father: {fileID: 4081610106255437587} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 497.96, y: -38} - m_SizeDelta: {x: 76, y: 76} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &7126092370693143460 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1459008698363568209} - m_CullTransparentMesh: 1 ---- !u!114 &7228098406543726320 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1459008698363568209} - 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: 1356336560449e54a921e7243886103d, 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 &1485223527900548960 GameObject: m_ObjectHideFlags: 0 @@ -1843,10 +1464,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 8161223343954633123} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 530, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &4147636784896425584 CanvasRenderer: @@ -2158,82 +1779,6 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: [] ---- !u!1 &1636655724406763812 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6303248515195535170} - - component: {fileID: 5018664928044412520} - - component: {fileID: 6968936360408286985} - m_Layer: 5 - m_Name: icon (3) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &6303248515195535170 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1636655724406763812} - 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: 5072897564513800831} - m_Father: {fileID: 2144478260434202621} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 38, y: -140.39} - m_SizeDelta: {x: 76, y: 76} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &5018664928044412520 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1636655724406763812} - m_CullTransparentMesh: 1 ---- !u!114 &6968936360408286985 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1636655724406763812} - 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: 1356336560449e54a921e7243886103d, 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 &1707359677378974723 GameObject: m_ObjectHideFlags: 0 @@ -2485,7 +2030,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 368.81186, y: -179.40001} - m_SizeDelta: {x: 685.6237, y: 0} + m_SizeDelta: {x: 685.6237, y: 302.80002} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &4691179229186165643 CanvasRenderer: @@ -3035,10 +2580,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 8161223343954633123} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 366, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3171495381280015110 CanvasRenderer: @@ -3078,82 +2623,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &1906680507194425012 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5327557936461785654} - - component: {fileID: 5062086590559632141} - - component: {fileID: 3387388452404181909} - m_Layer: 5 - m_Name: icon (3) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &5327557936461785654 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1906680507194425012} - 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: 5999183941570029804} - m_Father: {fileID: 4081610106255437587} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 38, y: -140.39} - m_SizeDelta: {x: 76, y: 76} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &5062086590559632141 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1906680507194425012} - m_CullTransparentMesh: 1 ---- !u!114 &3387388452404181909 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1906680507194425012} - 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: 1356336560449e54a921e7243886103d, 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 &2007551587148898584 GameObject: m_ObjectHideFlags: 0 @@ -3172,7 +2641,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &2387395177775218455 RectTransform: m_ObjectHideFlags: 0 @@ -3355,10 +2824,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 7716859618583968298} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 202, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1496557411923109406 CanvasRenderer: @@ -3398,82 +2867,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &2088005477051355809 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7253342432177446664} - - component: {fileID: 7794960923086108374} - - component: {fileID: 6267022845154830810} - m_Layer: 5 - m_Name: icon (2) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &7253342432177446664 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2088005477051355809} - 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: 8103585028483102859} - m_Father: {fileID: 2144478260434202621} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 497.96, y: -38} - m_SizeDelta: {x: 76, y: 76} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &7794960923086108374 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2088005477051355809} - m_CullTransparentMesh: 1 ---- !u!114 &6267022845154830810 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2088005477051355809} - 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: 1356336560449e54a921e7243886103d, 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 &2093795283665271049 GameObject: m_ObjectHideFlags: 0 @@ -3506,10 +2899,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 8161223343954633123} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 284, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7400918542891232285 CanvasRenderer: @@ -3582,9 +2975,9 @@ RectTransform: - {fileID: 1425638300236607698} m_Father: {fileID: 9054696526250431957} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 127, y: -18.5} m_SizeDelta: {x: 254, y: 37} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7145142481513715239 @@ -3782,7 +3175,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -330.91003, y: 365.44547} - m_SizeDelta: {x: 661.82, y: 0} + m_SizeDelta: {x: 661.82, y: 716.8522} m_Pivot: {x: 0, y: 1} --- !u!222 &3164324444407268244 CanvasRenderer: @@ -4119,7 +3512,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &6723345811351538777 RectTransform: m_ObjectHideFlags: 0 @@ -4218,7 +3611,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 368.81186, y: -469.7} - m_SizeDelta: {x: 685.6237, y: 0} + m_SizeDelta: {x: 685.6237, y: 221.8} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &6295382714833054557 CanvasRenderer: @@ -4676,157 +4069,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &2774423241274077266 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1622116703579488826} - - component: {fileID: 1040135761452225609} - - component: {fileID: 5970948742040161997} - - component: {fileID: 2389838469691296029} - 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 &1622116703579488826 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2774423241274077266} - 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: 7637365022686006345} - 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: 117.99603, y: 0} - m_SizeDelta: {x: 143.9446, y: 91.87} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &1040135761452225609 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2774423241274077266} - m_CullTransparentMesh: 1 ---- !u!114 &5970948742040161997 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2774423241274077266} - 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: "Luy\u1EC7n c\xF4ng abc \n" - 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: 36 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 256 - 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!114 &2389838469691296029 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2774423241274077266} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 --- !u!1 &2799404480092571207 GameObject: m_ObjectHideFlags: 0 @@ -5400,82 +4642,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &3108891184502888359 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5738132817832879628} - - component: {fileID: 6581712223253273287} - - component: {fileID: 590358993024350124} - m_Layer: 5 - m_Name: icon (4) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &5738132817832879628 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3108891184502888359} - 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: 3331994407700925502} - m_Father: {fileID: 2144478260434202621} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 267.97998, y: -140.39} - m_SizeDelta: {x: 76, y: 76} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &6581712223253273287 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3108891184502888359} - m_CullTransparentMesh: 1 ---- !u!114 &590358993024350124 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3108891184502888359} - 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: 1356336560449e54a921e7243886103d, 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 &3173289032329274867 GameObject: m_ObjectHideFlags: 0 @@ -5509,9 +4675,9 @@ RectTransform: - {fileID: 535664646133282150} m_Father: {fileID: 2767451028238277408} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 127, y: -18.5} m_SizeDelta: {x: 254, y: 37} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7981867935619048463 @@ -5797,9 +4963,9 @@ RectTransform: - {fileID: 1880017744182481924} m_Father: {fileID: 1619307578907548267} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 309.47, y: -205.41306} m_SizeDelta: {x: 618.94, y: 73.6261} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &5033959402152525669 @@ -5969,6 +5135,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 8581668835000776391} + - component: {fileID: 6710103663631289946} - component: {fileID: 523329600507644709} - component: {fileID: 912173140299320127} m_Layer: 5 @@ -5977,7 +5144,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &8581668835000776391 RectTransform: m_ObjectHideFlags: 0 @@ -5991,6 +5158,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 2922874573509962926} + - {fileID: 8150937948498372972} m_Father: {fileID: 2144478260434202621} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} @@ -5998,6 +5166,23 @@ RectTransform: m_AnchoredPosition: {x: 38, y: -38} m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &6710103663631289946 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3331107676278791390} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67fd391520cbfd44f84a1c6bb57673c0, type: 3} + m_Name: + m_EditorClassIdentifier: + skillbutton: {fileID: 0} + skillImage: {fileID: 79341390793448853} + borderImage: {fileID: 5124956242307597890} + cooldownTime: 0 + m_ClockCounter: {fileID: 0} --- !u!222 &523329600507644709 CanvasRenderer: m_ObjectHideFlags: 0 @@ -6036,6 +5221,81 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!1 &3406708742645219522 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2601500888641734679} + - component: {fileID: 5293663838046803658} + - component: {fileID: 4930055916587000086} + m_Layer: 5 + m_Name: iconImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2601500888641734679 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3406708742645219522} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.86, y: 0.86, z: 0.86} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1920078254568205968} + 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 &5293663838046803658 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3406708742645219522} + m_CullTransparentMesh: 1 +--- !u!114 &4930055916587000086 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3406708742645219522} + 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: 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 &3407015891391250357 GameObject: m_ObjectHideFlags: 0 @@ -6269,10 +5529,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 8161223343954633123} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 38, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &9073418720729705271 CanvasRenderer: @@ -6480,10 +5740,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 7716859618583968298} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 530, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3246016057855107943 CanvasRenderer: @@ -6556,17 +5816,12 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 8581668835000776391} - - {fileID: 4239059594284210955} - - {fileID: 7253342432177446664} - - {fileID: 6303248515195535170} - - {fileID: 5738132817832879628} - - {fileID: 5809137857340249738} m_Father: {fileID: 1285542512886306091} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 341.445, y: -153.995} - m_SizeDelta: {x: 682.89, y: 178.39} + m_AnchoredPosition: {x: 341.445, y: -64.8} + m_SizeDelta: {x: 682.89, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1694261480392943793 CanvasRenderer: @@ -7005,7 +6260,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 325.91, y: -191} - m_SizeDelta: {x: 651.82, y: 0} + m_SizeDelta: {x: 651.82, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &4834974076497791121 CanvasRenderer: @@ -7115,10 +6370,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 7716859618583968298} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 612, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7382996658417938035 CanvasRenderer: @@ -7670,7 +6925,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 325.91, y: -102.8} - m_SizeDelta: {x: 651.82, y: 0} + m_SizeDelta: {x: 651.82, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &4900781526663267476 CanvasRenderer: @@ -7880,157 +7135,6 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!1 &4149346552991504611 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3331994407700925502} - - component: {fileID: 727576847685571881} - - component: {fileID: 260511446611169910} - - component: {fileID: 504683314699227801} - 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 &3331994407700925502 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4149346552991504611} - 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: 5738132817832879628} - 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: 117.99603, y: 0} - m_SizeDelta: {x: 143.9446, y: 91.87} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &727576847685571881 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4149346552991504611} - m_CullTransparentMesh: 1 ---- !u!114 &260511446611169910 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4149346552991504611} - 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: "Luy\u1EC7n c\xF4ng abc \n" - 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: 36 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 256 - 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!114 &504683314699227801 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4149346552991504611} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 --- !u!1 &4199134632601564014 GameObject: m_ObjectHideFlags: 0 @@ -8092,7 +7196,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 341.445, y: -183.8} - m_SizeDelta: {x: 682.89, y: 0} + m_SizeDelta: {x: 682.89, y: 238} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7772368320019823384 CanvasRenderer: @@ -8335,82 +7439,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_ShowMaskGraphic: 0 ---- !u!1 &4324646757448837944 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8379613144668862463} - - component: {fileID: 1615969220731026223} - - component: {fileID: 8043934246366664720} - m_Layer: 5 - m_Name: icon (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &8379613144668862463 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4324646757448837944} - 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: 6374285161725417939} - m_Father: {fileID: 4081610106255437587} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 267.97998, y: -38} - m_SizeDelta: {x: 76, y: 76} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &1615969220731026223 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4324646757448837944} - m_CullTransparentMesh: 1 ---- !u!114 &8043934246366664720 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4324646757448837944} - 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: 1356336560449e54a921e7243886103d, 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 &4384092624074518989 GameObject: m_ObjectHideFlags: 0 @@ -8654,10 +7682,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 7716859618583968298} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 448, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &5796918707172726529 CanvasRenderer: @@ -9238,7 +8266,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 325.91, y: -287} - m_SizeDelta: {x: 651.82, y: 0} + m_SizeDelta: {x: 651.82, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &2639334837130904059 CanvasRenderer: @@ -9438,10 +8466,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 7868147299253831422} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 611.82, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7781625191200698363 CanvasRenderer: @@ -9481,6 +8509,81 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5124956242307597890 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8150937948498372972} + - component: {fileID: 6151864104505940848} + - component: {fileID: 79341390793448853} + m_Layer: 5 + m_Name: iconImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8150937948498372972 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5124956242307597890} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.86, y: 0.86, z: 0.86} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 8581668835000776391} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 38, y: -38} + m_SizeDelta: {x: 76, y: 76} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6151864104505940848 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5124956242307597890} + m_CullTransparentMesh: 1 +--- !u!114 &79341390793448853 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5124956242307597890} + 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: 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 &5135515373015341073 GameObject: m_ObjectHideFlags: 0 @@ -10195,10 +9298,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 8161223343954633123} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7877452864217671880 CanvasRenderer: @@ -10277,7 +9380,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -361.27, y: 365.44547} - m_SizeDelta: {x: 722.5344, y: 0} + m_SizeDelta: {x: 722.5344, y: 580.60004} m_Pivot: {x: 0, y: 1} --- !u!222 &8408960209338211561 CanvasRenderer: @@ -10390,9 +9493,9 @@ RectTransform: - {fileID: 7117733521089166339} m_Father: {fileID: 9054696526250431957} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 309.47, y: -381.81305} m_SizeDelta: {x: 618.94, y: 73.6261} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &4491435063355121724 @@ -10660,157 +9763,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &5944752504051643367 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8103585028483102859} - - component: {fileID: 5169294448860501362} - - component: {fileID: 2211199403259268506} - - component: {fileID: 7020790643402785726} - 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 &8103585028483102859 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5944752504051643367} - 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: 7253342432177446664} - 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: 117.99603, y: 0} - m_SizeDelta: {x: 143.9446, y: 91.87} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &5169294448860501362 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5944752504051643367} - m_CullTransparentMesh: 1 ---- !u!114 &2211199403259268506 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5944752504051643367} - 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: "Luy\u1EC7n c\xF4ng abc \n" - 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: 36 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 256 - 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!114 &7020790643402785726 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5944752504051643367} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 --- !u!1 &6015666350125151792 GameObject: m_ObjectHideFlags: 0 @@ -11366,10 +10318,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 7716859618583968298} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 38, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &2880898995912466067 CanvasRenderer: @@ -11527,157 +10479,6 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 1 m_CallState: 2 ---- !u!1 &6625148525600966102 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5522115170115830047} - - component: {fileID: 3614049144556721579} - - component: {fileID: 6419109977995404423} - - component: {fileID: 6037183428592665416} - 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 &5522115170115830047 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6625148525600966102} - 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: 3859668954031866820} - 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: 117.99603, y: 0} - m_SizeDelta: {x: 143.9446, y: 91.87} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &3614049144556721579 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6625148525600966102} - m_CullTransparentMesh: 1 ---- !u!114 &6419109977995404423 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6625148525600966102} - 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: "Luy\u1EC7n c\xF4ng abc \n" - 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: 36 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 256 - 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!114 &6037183428592665416 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6625148525600966102} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 --- !u!1 &6692325846751823531 GameObject: m_ObjectHideFlags: 0 @@ -11814,157 +10615,6 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!1 &6759539974681285567 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1437300383384742693} - - component: {fileID: 5469246155285883662} - - component: {fileID: 2524264005672013051} - - component: {fileID: 5704272009539355611} - 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 &1437300383384742693 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6759539974681285567} - 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: 8207062190152923167} - 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: 117.99603, y: 0} - m_SizeDelta: {x: 143.9446, y: 91.87} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &5469246155285883662 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6759539974681285567} - m_CullTransparentMesh: 1 ---- !u!114 &2524264005672013051 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6759539974681285567} - 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: "Luy\u1EC7n c\xF4ng abc \n" - 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: 36 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 256 - 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!114 &5704272009539355611 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6759539974681285567} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 --- !u!1 &6777221574695218720 GameObject: m_ObjectHideFlags: 0 @@ -12208,10 +10858,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 7716859618583968298} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 284, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7688105762489015139 CanvasRenderer: @@ -12479,10 +11129,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 7716859618583968298} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1468541577249468761 CanvasRenderer: @@ -12794,82 +11444,6 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!1 &7339453073721747051 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4239059594284210955} - - component: {fileID: 6998619407972160308} - - component: {fileID: 7623356675628042608} - m_Layer: 5 - m_Name: icon (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &4239059594284210955 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7339453073721747051} - 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: 2209040911442161581} - m_Father: {fileID: 2144478260434202621} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 267.97998, y: -38} - m_SizeDelta: {x: 76, y: 76} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &6998619407972160308 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7339453073721747051} - m_CullTransparentMesh: 1 ---- !u!114 &7623356675628042608 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7339453073721747051} - 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: 1356336560449e54a921e7243886103d, 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 &7355179499552825785 GameObject: m_ObjectHideFlags: 0 @@ -13286,7 +11860,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 335.91, y: -149.11304} - m_SizeDelta: {x: 651.82, y: 0} + m_SizeDelta: {x: 651.82, y: 242.22609} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &948237233126392649 CanvasRenderer: @@ -13398,10 +11972,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 8161223343954633123} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 202, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &4411721698532377795 CanvasRenderer: @@ -13474,17 +12048,12 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1920078254568205968} - - {fileID: 8379613144668862463} - - {fileID: 7637365022686006345} - - {fileID: 5327557936461785654} - - {fileID: 8207062190152923167} - - {fileID: 3859668954031866820} m_Father: {fileID: 1244895283146852732} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 341.445, y: -153.995} - m_SizeDelta: {x: 682.89, y: 178.39} + m_AnchoredPosition: {x: 341.445, y: -64.8} + m_SizeDelta: {x: 682.89, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &876649880404097046 CanvasRenderer: @@ -13594,10 +12163,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 7716859618583968298} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 366, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1902857843103836693 CanvasRenderer: @@ -13637,157 +12206,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &7584263065695851351 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6374285161725417939} - - component: {fileID: 7330470249745500177} - - component: {fileID: 6930073605300207021} - - component: {fileID: 3081206856222148294} - 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 &6374285161725417939 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7584263065695851351} - 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: 8379613144668862463} - 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: 117.99603, y: 0} - m_SizeDelta: {x: 143.9446, y: 91.87} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &7330470249745500177 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7584263065695851351} - m_CullTransparentMesh: 1 ---- !u!114 &6930073605300207021 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7584263065695851351} - 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: "Luy\u1EC7n c\xF4ng abc \n" - 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: 36 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 256 - 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!114 &3081206856222148294 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7584263065695851351} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 --- !u!1 &7599565814578354200 GameObject: m_ObjectHideFlags: 0 @@ -13956,10 +12374,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 8161223343954633123} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 448, y: -38} + m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &5418149277532415857 CanvasRenderer: @@ -14033,9 +12451,9 @@ RectTransform: - {fileID: 5308921638492962355} m_Father: {fileID: 9054696526250431957} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 309.47, y: -95} m_SizeDelta: {x: 618.94, y: 76} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3554810037526578235 @@ -14212,157 +12630,6 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!1 &7705541999451017372 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5999183941570029804} - - component: {fileID: 1537792830205952296} - - component: {fileID: 3357623234111300797} - - component: {fileID: 1262891552018328309} - 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 &5999183941570029804 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7705541999451017372} - 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: 5327557936461785654} - 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: 117.99603, y: 0} - m_SizeDelta: {x: 143.9446, y: 91.87} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &1537792830205952296 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7705541999451017372} - m_CullTransparentMesh: 1 ---- !u!114 &3357623234111300797 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7705541999451017372} - 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: "Luy\u1EC7n c\xF4ng abc \n" - 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: 36 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 256 - 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!114 &1262891552018328309 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7705541999451017372} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 --- !u!1 &7713128248520402999 GameObject: m_ObjectHideFlags: 0 @@ -14599,7 +12866,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -361.27, y: 365.44547} - m_SizeDelta: {x: 722.5344, y: 28} + m_SizeDelta: {x: 722.5344, y: 0} m_Pivot: {x: 0, y: 1} --- !u!222 &7853130943468561016 CanvasRenderer: @@ -14888,6 +13155,7 @@ MonoBehaviour: skillIcon: {fileID: 3801278460223427377} m_highlight: {fileID: 0} m_upgradeBtn: {fileID: 2802100335901209485} + m_skillIconImgPic: {fileID: 0} --- !u!114 &536870940929799852 MonoBehaviour: m_ObjectHideFlags: 0 @@ -15038,82 +13306,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &8028472234062925388 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5809137857340249738} - - component: {fileID: 6899202139344002143} - - component: {fileID: 7793794748734634574} - m_Layer: 5 - m_Name: icon (5) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &5809137857340249738 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8028472234062925388} - 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: 3275237664186767143} - m_Father: {fileID: 2144478260434202621} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 497.96, y: -140.39} - m_SizeDelta: {x: 76, y: 76} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &6899202139344002143 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8028472234062925388} - m_CullTransparentMesh: 1 ---- !u!114 &7793794748734634574 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8028472234062925388} - 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: 1356336560449e54a921e7243886103d, 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 &8033079540058746360 GameObject: m_ObjectHideFlags: 0 @@ -15123,6 +13315,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 1920078254568205968} + - component: {fileID: 6897593266829550523} - component: {fileID: 6263047871981887699} - component: {fileID: 8452392559284459496} m_Layer: 5 @@ -15131,7 +13324,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &1920078254568205968 RectTransform: m_ObjectHideFlags: 0 @@ -15145,6 +13338,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 5839287524773002638} + - {fileID: 2601500888641734679} m_Father: {fileID: 4081610106255437587} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} @@ -15152,6 +13346,23 @@ RectTransform: m_AnchoredPosition: {x: 38, y: -38} m_SizeDelta: {x: 76, y: 76} m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &6897593266829550523 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8033079540058746360} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67fd391520cbfd44f84a1c6bb57673c0, type: 3} + m_Name: + m_EditorClassIdentifier: + skillbutton: {fileID: 0} + skillImage: {fileID: 4930055916587000086} + borderImage: {fileID: 3406708742645219522} + cooldownTime: 0 + m_ClockCounter: {fileID: 0} --- !u!222 &6263047871981887699 CanvasRenderer: m_ObjectHideFlags: 0 @@ -15229,7 +13440,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -361.27, y: 365.44547} - m_SizeDelta: {x: 722.5344, y: 542.38} + m_SizeDelta: {x: 722.5344, y: 185.6} m_Pivot: {x: 0, y: 1} --- !u!222 &74166521354270119 CanvasRenderer: @@ -15567,157 +13778,6 @@ MonoBehaviour: m_OnValueChanged: m_PersistentCalls: m_Calls: [] ---- !u!1 &8262401498554960973 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3275237664186767143} - - component: {fileID: 5031304411235729447} - - component: {fileID: 5626391664179855266} - - component: {fileID: 5614954830660381897} - 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 &3275237664186767143 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8262401498554960973} - 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: 5809137857340249738} - 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: 117.99603, y: 0} - m_SizeDelta: {x: 143.9446, y: 91.87} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &5031304411235729447 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8262401498554960973} - m_CullTransparentMesh: 1 ---- !u!114 &5626391664179855266 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8262401498554960973} - 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: "Luy\u1EC7n c\xF4ng abc \n" - 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: 36 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 256 - 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!114 &5614954830660381897 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8262401498554960973} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 --- !u!1 &8321555552733958645 GameObject: m_ObjectHideFlags: 0 @@ -16383,157 +14443,6 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!1 &8616018133129531234 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2209040911442161581} - - component: {fileID: 2473115450256668625} - - component: {fileID: 4889285684847069564} - - component: {fileID: 3674731934470723080} - 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 &2209040911442161581 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8616018133129531234} - 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: 4239059594284210955} - 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: 117.99603, y: 0} - m_SizeDelta: {x: 143.9446, y: 91.87} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &2473115450256668625 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8616018133129531234} - m_CullTransparentMesh: 1 ---- !u!114 &4889285684847069564 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8616018133129531234} - 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: "Luy\u1EC7n c\xF4ng abc \n" - 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: 36 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 256 - 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!114 &3674731934470723080 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8616018133129531234} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 --- !u!1 &8628325692798713488 GameObject: m_ObjectHideFlags: 0 @@ -16591,6 +14500,7 @@ GameObject: - component: {fileID: 4958559450723387948} - component: {fileID: 3172532294236299015} - component: {fileID: 5963476403216687407} + - component: {fileID: 8977685090853562807} m_Layer: 5 m_Name: centerPanel_action m_TagString: Untagged @@ -16657,6 +14567,23 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!114 &8977685090853562807 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8632042110259137603} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1eda03e6b4326e14b95d57bf324b96bb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_aActionInfo: [] + orderContain: {fileID: 4081610106255437587} + orderTemplate: {fileID: 6897593266829550523} + actionTemplate: {fileID: 6710103663631289946} + actionContain: {fileID: 2144478260434202621} --- !u!1 &8669148091526857718 GameObject: m_ObjectHideFlags: 0 @@ -16846,8 +14773,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 368.81186, y: -420.785} - m_SizeDelta: {x: 685.6237, y: 243.18999} + m_AnchoredPosition: {x: 368.81186, y: -153.20001} + m_SizeDelta: {x: 685.6237, y: 64.8} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &8076001380599592139 CanvasRenderer: @@ -17040,8 +14967,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 368.81186, y: -149.595} - m_SizeDelta: {x: 685.6237, y: 243.18999} + m_AnchoredPosition: {x: 368.81186, y: -60.4} + m_SizeDelta: {x: 685.6237, y: 64.8} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &8659649200798903193 CanvasRenderer: @@ -17293,7 +15220,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 117.99603, y: 0} - m_SizeDelta: {x: 143.9446, y: 45.94} + m_SizeDelta: {x: 143.9446, y: 91.87} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3665612811382978418 CanvasRenderer: @@ -17323,7 +15250,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: "Luy\u1EC7n c\xF4ng\n" + m_text: "T\u0103ng t\u1ED1c \u0111\u1ED9 bay" m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2} m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2} @@ -17585,7 +15512,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -17593,15 +15520,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -17633,11 +15560,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 210 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -17683,7 +15610,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -17691,15 +15618,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -17731,11 +15658,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 38 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -200 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -17785,7 +15712,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -17793,15 +15720,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -17833,11 +15760,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 210 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -17887,7 +15814,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -17895,15 +15822,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -17935,11 +15862,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 296 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -200 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -17993,7 +15920,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -18001,15 +15928,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -18041,11 +15968,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 382 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -18091,7 +16018,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -18099,15 +16026,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -18139,11 +16066,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 210 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -18197,7 +16124,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -18205,15 +16132,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -18245,11 +16172,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 554 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -18295,7 +16222,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -18303,15 +16230,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -18343,11 +16270,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 124 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -200 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -18397,7 +16324,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -18405,15 +16332,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -18445,11 +16372,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 210 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -200 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -18503,7 +16430,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -18511,15 +16438,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -18551,11 +16478,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 38 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -18601,7 +16528,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -18609,15 +16536,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -18649,11 +16576,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 640 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -200 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -18703,7 +16630,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -18711,15 +16638,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -18751,11 +16678,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 382 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -18809,7 +16736,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -18817,15 +16744,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -18857,11 +16784,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 124 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -18911,7 +16838,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -18919,15 +16846,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -18959,11 +16886,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 554 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -19013,7 +16940,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -19021,15 +16948,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -19061,11 +16988,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 468 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -19111,7 +17038,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -19119,15 +17046,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -19159,11 +17086,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 468 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -19213,7 +17140,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -19221,15 +17148,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -19261,11 +17188,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 124 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -19315,7 +17242,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -19323,15 +17250,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -19363,11 +17290,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 124 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -19417,7 +17344,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -19425,15 +17352,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -19465,11 +17392,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 468 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -200 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -19519,7 +17446,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -19527,15 +17454,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -19567,11 +17494,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 296 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -19621,7 +17548,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -19629,15 +17556,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -19669,11 +17596,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 382 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -19723,7 +17650,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -19731,15 +17658,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -19771,11 +17698,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 554 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -19829,7 +17756,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -19837,15 +17764,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -19877,11 +17804,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 296 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -19927,7 +17854,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -19935,15 +17862,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -19975,11 +17902,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 38 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -20029,7 +17956,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -20037,15 +17964,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -20077,11 +18004,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 382 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -200 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -20135,7 +18062,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -20143,15 +18070,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -20183,11 +18110,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 640 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -20237,7 +18164,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -20245,15 +18172,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -20285,11 +18212,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 210 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -20339,7 +18266,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -20347,15 +18274,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -20387,11 +18314,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 640 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -20437,7 +18364,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -20445,15 +18372,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -20485,11 +18412,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 640 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -20539,7 +18466,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -20547,15 +18474,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -20587,11 +18514,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 554 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -200 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -20645,7 +18572,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -20653,15 +18580,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -20693,11 +18620,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 382 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -20743,7 +18670,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -20751,15 +18678,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -20791,11 +18718,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 468 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -20845,7 +18772,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -20853,15 +18780,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -20893,11 +18820,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 38 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -20951,7 +18878,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -20959,15 +18886,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -20999,11 +18926,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 296 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -21053,7 +18980,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -21061,15 +18988,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -21101,11 +19028,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 640 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -21159,7 +19086,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -21167,15 +19094,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -21207,11 +19134,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 296 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -21261,7 +19188,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -21269,15 +19196,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -21309,11 +19236,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 38 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -21363,7 +19290,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -21371,15 +19298,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -21411,11 +19338,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 124 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -38 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -21465,7 +19392,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.x @@ -21473,15 +19400,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalPosition.x @@ -21513,11 +19440,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 468 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 8674390294668887183, guid: f3f79463e9f2f7949b552bdab8e68d33, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -21563,7 +19490,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.x @@ -21571,15 +19498,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.x - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 76 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalPosition.x @@ -21611,11 +19538,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 554 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -119 objectReference: {fileID: 0} - target: {fileID: 379109581026898739, guid: fd778133b31f30d41ba325de25c5f773, type: 3} propertyPath: m_LocalEulerAnglesHint.x diff --git a/Assets/Scenes/a61.unity b/Assets/Scenes/a61.unity index c4f8966cc0..fc6407df4d 100644 --- a/Assets/Scenes/a61.unity +++ b/Assets/Scenes/a61.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:def3c6a4f58ef9b5c9558210328e5b6f3ed11bfee5b577271ee43fa110616b82 -size 200521689 +oid sha256:95d6d825ffc45e6ba389d5e2baffd576d409d5718b1888331c763dfe2b9460e5 +size 200522636 diff --git a/Assets/Scripts/CECGameRun.cs b/Assets/Scripts/CECGameRun.cs index ed49bc378e..db37e75fc1 100644 --- a/Assets/Scripts/CECGameRun.cs +++ b/Assets/Scripts/CECGameRun.cs @@ -7,8 +7,10 @@ using BrewMonster.UI; using CSNetwork; using CSNetwork.GPDataType; using CSNetwork.Protocols.RPCData; +using System; using System.Collections.Generic; using System.Data; +using System.Linq; using System.Threading.Tasks; using Unity.Cinemachine; using UnityEngine; @@ -32,6 +34,8 @@ public partial class CECGameRun //[SerializeField] private Transform ground; CECHostPlayer hostPlayer; private CECWorld m_pWorld; + int m_iGameState; // Game state + protected CECUIManager m_pUIManager; // UI manager @@ -108,7 +112,7 @@ public partial class CECGameRun if (_npcServerPrefab == null) { BMLogger.LogError("CECGameRun::LoadPrefabs, Failed to load _npcServerPrefab prefab."); - } + } #endif } @@ -277,7 +281,6 @@ public partial class CECGameRun /// True if loaded successfully / 加载æˆåŠŸè¿”å›žtrue public bool LoadConfigsFromServer(byte[] pDataBuf, int iDataSize) { - BMLogger.LogError("LoadConfigsFromServer "); const uint USERCFG_VERSION = 3; if (pDataBuf == null || iDataSize == 0) @@ -305,7 +308,6 @@ public partial class CECGameRun dwRealLen = 0; } byte[] pData = pDataBuf; - int dataOffset = offset; if (dwVer >= 3) { @@ -348,32 +350,31 @@ public partial class CECGameRun } } //TODO: flow in update fix later - Task.Run(() => - { - GameSession.Context.Post(_ => - { - if (m_pUIManager == null) - { - m_pUIManager = CECUIManager.Instance; - } - m_pUIManager.GetCDlgQuickBar().UpdateShortcuts(); - }, null); - }); - + /* Task.Run(() => + { + GameSession.Context.Post(_ => + { + if (m_pUIManager == null) + { + m_pUIManager = CECUIManager.Instance; + } + m_pUIManager.GetCDlgQuickBar().UpdateShortcuts(); + }, null); + });*/ // TODO: Uncomment when UI manager is available // Load UI configs / 加载UIé…ç½® CECGameUIMan pGameUI = m_pUIManager.GetInGameUIMan(); - /* if (pGameUI != null) - { - int iSize = dr.ReadInt(); - byte[] uiConfigData = dr.ReadData(iSize); - if (!pGameUI.SetUserLayout(uiConfigData, iSize)) - { - BMLogger.LogError("CECGameRun::LoadConfigsFromServer, Failed to set user layout"); - return false; - } - }*/ + if (pGameUI != null) + { + int iSize = dr.ReadInt(); + byte[] uiConfigData = dr.ReadData(iSize); + /*if (!pGameUI.SetUserLayout(uiConfigData, iSize)) + { + BMLogger.LogError("CECGameRun::LoadConfigsFromServer, Failed to set user layout"); + return false; + }*/ + } // Load user settings / 加载用户设置 if (dwVer >= 2) @@ -381,11 +382,11 @@ public partial class CECGameRun // TODO: Uncomment when game configs are available int iSize = dr.ReadInt(); byte[] settingsData = dr.ReadData(iSize); - /* if (!EC_Game.GetConfigs().LoadUserConfigData(settingsData, iSize)) - { - BMLogger.LogError("CECGameRun::LoadConfigsFromServer, Failed to load user config data"); - return false; - }*/ + if (!EC_Game.GetConfigs().LoadUserConfigData(settingsData, iSize)) + { + BMLogger.LogError("CECGameRun::LoadConfigsFromServer, Failed to load user config data"); + return false; + } } } catch (System.Exception e) @@ -705,4 +706,16 @@ public partial class CECGameRun { m_iDExpEndTime = endTime; } + public int GetGameState() { return m_iGameState; } + public void SaveConfigsToServer() + { + + } } +public enum GameState + +{ + GS_NONE = 0, // None + GS_LOGIN, // Login in state + GS_GAME, // In game +}; \ No newline at end of file diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index 049b24bfc4..14f00ce172 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -11,6 +11,7 @@ using BrewMonster.UI; using CSNetwork; using CSNetwork.GPDataType; using CSNetwork.Protocols.RPCData; +using CSNetwork.S2CCommand; using ModelRenderer.Scripts.GameData; using PerfectWorld.Scripts; using PerfectWorld.Scripts.Managers; @@ -20,10 +21,12 @@ using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; -using CSNetwork.S2CCommand; +using PerfectWorld.Scripts.Managers; +using Unity.VisualScripting; using UnityEngine; using UnityEngine.UI; using static BrewMonster.Scripts.Managers.EC_Inventory; +using static CECPlayerWrapper; using cmd_select_target = CSNetwork.GPDataType.cmd_select_target; using Host_work_ID = BrewMonster.Scripts.CECHPWork.Host_work_ID; using Trace_reason = BrewMonster.CECHPWorkTrace.Trace_reason; @@ -87,8 +90,8 @@ namespace BrewMonster List m_aWayPoints = new List(); // Active way points bool m_bIsInKingService = false; // ÊÇ·ñÕýÔÚ½øÃùúÃõ·þÎñ²Ù×÷ CECActionSwitcherBase m_pActionSwitcher; - private int m_iWorldContribution; - private int m_iWorldContributionSpend; + private int m_iWorldContribution; + private int m_iWorldContributionSpend; private bool m_bSpellDSkill; private CECSkill m_pCurSkill; private CECSkill m_pTargetItemSkill; // Target item skill @@ -181,7 +184,7 @@ namespace BrewMonster private readonly EC_Inventory m_pEquipPack = new EC_Inventory(); private readonly EC_Inventory m_pTaskPack = new EC_Inventory(); - public EC_Inventory IvtrPack => m_pPack; + public EC_Inventory IvtrPack => m_pPack; public EC_Inventory IvtrEquipPack => m_pEquipPack; public EC_Inventory IvtrTaskPack => m_pTaskPack; @@ -220,7 +223,7 @@ namespace BrewMonster { return m_pTaskPack; } - + public EC_Inventory GetEquipment() { return m_pEquipPack; @@ -234,7 +237,7 @@ namespace BrewMonster // Get navigate player // 获å–导航玩家 public int GetWorldContribution() { return m_iWorldContribution; } - public int GetWorldContributionSpend() { return m_iWorldContributionSpend; } + public int GetWorldContributionSpend() { return m_iWorldContributionSpend; } private CECHostNavigatePlayer m_pNavigatePlayer = null; public CECHostNavigatePlayer GetNavigatePlayer() { @@ -401,7 +404,7 @@ namespace BrewMonster } // Always set the pointCam's world rotation value to Vector3.zero // because rotating the character with the camera will cause a lagging effect. - if(pointCam != null) + if (pointCam != null) { pointCam.rotation = Quaternion.identity; } @@ -577,7 +580,8 @@ namespace BrewMonster break; case int value when value == EC_MsgDef.MSG_HST_SELTARGET: OnMsgHstSelTarget(Msg); break; - case int value when value == EC_MsgDef.MSG_HST_USEITEM:OnMsgHstUseItem(Msg); + case int value when value == EC_MsgDef.MSG_HST_USEITEM: + OnMsgHstUseItem(Msg); break; case int value when value == EC_MsgDef.MSG_HST_ATKRESULT: OnMsgHstAttackResult(Msg); break; case int value when value == EC_MsgDef.MSG_HST_ATTACKED: OnMsgHstAttacked(Msg); break; @@ -593,7 +597,6 @@ namespace BrewMonster case int value when value == EC_MsgDef.MSG_PM_CASTSKILL: OnMsgPlayerCastSkill(Msg); break; case int value when value == EC_MsgDef.MSG_PM_ENCHANTRESULT: OnMsgEnchantResult(Msg); break; - case int value when value == EC_MsgDef.MSG_HST_OWNEXTPROP: OnMsgHstExtProp(Msg); break; case int value when value == EC_MsgDef.MSG_PM_PLAYERDOEMOTE: OnMsgPlayerDoEmote(Msg); break; case int value when value == EC_MsgDef.MSG_HST_TARGETISFAR: OnMsgHstTargetIsFar(Msg); break; @@ -602,34 +605,34 @@ namespace BrewMonster case int value when value == EC_MsgDef.MSG_HST_SETCOOLTIME: OnMsgHstSetCoolTime(Msg); break; case int value when value == EC_MsgDef.MSG_HST_PRESSCANCEL: OnMsgHstPressCancel(Msg); break; case int value when value == EC_MsgDef.MSG_HST_LEARNSKILL: OnMsgHstLearnSkill(Msg); break; - + case int value when value == EC_MsgDef.MSG_HST_COMBO_SKILL_PREPARE: OnMsgComboSkillPrepare(Msg); break; case int value when value == EC_MsgDef.MSG_PM_PLAYERFLY: OnMsgPlayerFly(Msg); break; case int value when value == EC_MsgDef.MSG_HST_EMBEDITEM: OnMsgHstEmbedItem(Msg); break; case int value when value == EC_MsgDef.MSG_HST_JOINTEAM: OnMsgHstJoinTeam(Msg); break; case int value when value == EC_MsgDef.MSG_HST_LEAVETEAM: OnMsgHstLeaveTeam(Msg); break; case int value when value == EC_MsgDef.MSG_HST_NEWTEAMMEM: OnMsgHstNewTeamMem(Msg); break; case int value when value == EC_MsgDef.MSG_HST_TEAMMEMBERDATA: OnMsgHstTeamMemberData(Msg); break; + case int value when value == EC_MsgDef.MSG_HST_CONTINUECOMBOSKILL: OnMsgContinueComboSkill(Msg); break; } + /*if (bActionStartSkill) + AP_ActionEvent(AP_EVENT_STARTSKILL, iActionTime); - /* if (bActionStartSkill) - AP_ActionEvent(AP_EVENT_STARTSKILL, iActionTime); - - if (bDoOtherThing) - { - if (m_pComboSkill != null && !m_pComboSkill.IsStop()) - { - if (CECAutoPolicy.GetInstance().IsAutoPolicyEnabled()) - g_pGame.GetGameRun().PostMessage(MSG_HST_CONTINUECOMBOSKILL, MAN_PLAYER, 0, 0, m_pComboSkill.GetGroupIndex()); - else - m_pComboSkill.Continue(false); - } - else - { - if (idTarget != 0 && idTarget != m_PlayerInfo.cid) - NormalAttackObject(idTarget, true); - } - }*/ + if (bDoOtherThing) + { + if (m_pComboSkill != null && !m_pComboSkill.IsStop()) + { + if (CECAutoPolicy.GetInstance().IsAutoPolicyEnabled()) + g_pGame.GetGameRun().PostMessage(MSG_HST_CONTINUECOMBOSKILL, MAN_PLAYER, 0, 0, m_pComboSkill.GetGroupIndex()); + else + m_pComboSkill.Continue(false); + } + else + { + if (idTarget != 0 && idTarget != m_PlayerInfo.cid) + NormalAttackObject(idTarget, true); + } + }*/ } private void OnMsgHstJoinTeam(ECMSG Msg) @@ -702,6 +705,35 @@ namespace BrewMonster catch { } } + private void OnMsgContinueComboSkill(ECMSG Msg) + { + bool bMeleeing = ((int)Msg.dwParam1 == 1); + if (bMeleeing != m_bMelee) bMeleeing = m_bMelee; + int iGroupID = (int)Msg.dwParam2; + if (m_pComboSkill != null && m_pComboSkill.GetGroupIndex() == iGroupID && !m_pComboSkill.IsStop()) + m_pComboSkill.Continue(bMeleeing); + } + + private void OnMsgComboSkillPrepare(ECMSG Msg) + { + cmd_combo_skill_prepare cmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1); + uint skillID = (uint)cmd.skill_id; + + ComboSkillState comboSkillState = new() + { + skillid = skillID, + arg = new int[ComboSkillState.MAX_COMBO_ARG] + }; + comboSkillState.arg = cmd.args; + /* if (cmd.args != null) + { + Array.Copy(cmd.args, comboSkillState.arg, Math.Min(cmd.args.Length, ComboSkillState.MAX_COMBO_ARG)); + }*/ + + Dictionary comboSkillList = ElementSkill.GetComboSkActivated(comboSkillState); + CECComboSkillState.Instance.SetComboSkillState(comboSkillList, ref comboSkillState); + } + private void OnMsgHstLearnSkill(ECMSG Msg) { BMLogger.LogError("OnMsgHstLearnSkill"); @@ -751,8 +783,6 @@ namespace BrewMonster private void OnMsgHstSetCoolTime(ECMSG Msg) { - BMLogger.LogError("HoangDev : OnMsgHstSetCoolTime "); - cmd_set_cooldown pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1); if (pCmd.cooldown_index < 0) @@ -772,19 +802,26 @@ namespace BrewMonster if (pCmd.cooldown_index == (int)CoolTimeIndex.GP_CT_CAST_ELF_SKILL) { int i; - // other goblin skills should be set public cool down, 1 second - /* for (i = 0; i < m_aGoblinSkills.GetSize(); i++) - { - if (m_aGoblinSkills[i] && m_aGoblinSkills[i]->GetCoolingCnt() == 0) - m_aGoblinSkills[i]->StartCooling(GetCoolTime(GP_CT_CAST_ELF_SKILL), GetCoolTime(GP_CT_CAST_ELF_SKILL)); - }*/ + for (i = 0; i < m_aGoblinSkills.Count; i++) + { + if (m_aGoblinSkills[i] != null && m_aGoblinSkills[i].GetCoolingCnt() == 0) + { + int fakeRef = 0; + int coolTime = GetCoolTime((int)CoolTimeIndex.GP_CT_CAST_ELF_SKILL, out fakeRef); + m_aGoblinSkills[i].StartCooling(coolTime, coolTime); + } + } - /* for (i = 0; i < m_aPsSkills.Count; i++) - { - CECSkill pSkill = GetPassiveSkillByIndex(i); - if (pSkill && (pSkill->GetCommonCoolDown() & (1 << (pCmd->cooldown_index - GP_CT_SKILLCOMMONCOOLDOWN0)))) - pSkill->StartCooling(GetCoolTime(pCmd->cooldown_index), GetCoolTime(pCmd->cooldown_index)); - }*/ + for (i = 0; i < m_aPsSkills.Count; i++) + { + CECSkill pSkill = GetPassiveSkillByIndex(i); + if (pSkill != null && (pSkill.GetCommonCoolDown() & (1 << (pCmd.cooldown_index - (int)CoolTimeIndex.GP_CT_SKILLCOMMONCOOLDOWN0))) != 0) + { + int fakeRef = 0; + int coolTime = GetCoolTime(pCmd.cooldown_time, out fakeRef); + pSkill.StartCooling(coolTime, coolTime); + } + } } if (pCmd.cooldown_index >= (int)CoolTimeIndex.GP_CT_SKILLCOMMONCOOLDOWN0 && pCmd.cooldown_index <= (int)CoolTimeIndex.GP_CT_SKILLCOMMONCOOLDOWN4) @@ -796,7 +833,11 @@ namespace BrewMonster CECSkill pSkill = GetPositiveSkillByIndex(i); int fakeRef = 0; if (pSkill != null && (pSkill.GetCommonCoolDown() & mask) != 0) - pSkill.StartCooling(GetCoolTime(pCmd.cooldown_index, out fakeRef), GetCoolTime(pCmd.cooldown_index, out fakeRef)); + { + int coolTime = GetCoolTime(pCmd.cooldown_index, out fakeRef); + pSkill.StartCooling(coolTime, coolTime); + //pSkill.StartCooling(GetCoolTime(pCmd.cooldown_index, out fakeRef), GetCoolTime(pCmd.cooldown_index, out fakeRef)); + } } /*const std::map&inherentSkillMap = CECComboSkillState::Instance().GetInherentSkillMap(); std::map < unsigned int, CECSkill*>::const_iterator it; @@ -819,7 +860,9 @@ namespace BrewMonster } ct.iCurTime = pCmd.cooldown_time; ct.iMaxTime = pCmd.cooldown_time; - Math.Clamp(ct.iCurTime, 0, ct.iMaxTime); + ct.iCurTime = Math.Clamp(ct.iCurTime, 0, ct.iMaxTime); + m_skillCoolTime[idSkill] = ct; + //Math.Clamp(ct.iCurTime, 0, ct.iMaxTime); CECSkill pSkill = GetNormalSkill(idSkill); if (pSkill != null) @@ -834,6 +877,18 @@ namespace BrewMonster { BMLogger.LogError("HoangDev: pSkill " + pSkill); } + else + { + pSkill = CECComboSkillState.Instance.GetInherentSkillByID((uint)idSkill); + if (pSkill != null) + { + pSkill.StartCooling(pCmd.cooldown_time, pCmd.cooldown_time); + } + else if (GetEquipSkillByID(idSkill) == null) + { + Debug.LogWarning($"OnMsgHstSetCoolTime: Skill {idSkill} not found in nomal/equip skills"); + } + } } else { @@ -844,6 +899,11 @@ namespace BrewMonster UpdateEquipSkillCoolDown(pCmd.cooldown_index); } + private CECSkill GetPassiveSkillByIndex(int n) + { + return m_aPsSkills[n]; + } + private void OnMsgHstCoolTimeData(ECMSG Msg) { cmd_cooltime_data pCmd = default; @@ -965,7 +1025,7 @@ namespace BrewMonster bool bActionStartSkill = false; int iActionTime = 1000; - // CECPlayerWrapper* pWrapper = CECAutoPolicy::GetInstance().GetPlayerWrapper(); + CECPlayerWrapper pWrapper = CECAutoPolicy.GetInstance().GetPlayerWrapper(); switch (Convert.ToInt32(Msg.dwParam2)) { @@ -1029,7 +1089,7 @@ namespace BrewMonster bActionStartSkill = true; iActionTime = iWaitTime; Debug.Log($"Cast skill({m_pCurSkill.GetSkillID()})"); - + // Special logging for return-to-town skill (167) // 回城技能(167)的特殊日志 if (m_pCurSkill.GetSkillID() == ID_RETURNTOWN_SKILL) @@ -1060,12 +1120,9 @@ namespace BrewMonster } case int value2 when value2 == CommandID.HOST_STOP_SKILL: { - // Host stop skill - // ä¸»è§’åœæ­¢æŠ€èƒ½ m_pPrepSkill = null; - CECSkill - pSkillToMatch = m_pCurSkill; // ä¿å­˜æŒ‡é’ˆå€¼ï¼Œç”¨åœ¨åŽé¢å‡½æ•°è°ƒç”¨ä¸­ | Save pointer value for later function call + CECSkill pSkillToMatch = m_pCurSkill; if (m_pCurSkill != null) { ClearComActFlagAllRankNodes(true); @@ -1081,9 +1138,7 @@ namespace BrewMonster m_pCurSkill = null; } - Debug.Log("HOST_STOP_SKILL"); - - //AP_ActionEvent(AP_EVENT_STOPSKILL); + AP.AP_ActionEvent((int)AP_EVENT.AP_EVENT_STOPSKILL); if (pSkillToMatch != null) { // m_pWorkMan中的当å‰ä»»ä½•Workä¸ºæœ€é«˜ä¼˜å…ˆçº§æˆ–ã€æˆ– CECHPWorkSpell 处于最高优先级且队列中有Delayæ—¶é—´ @@ -1139,13 +1194,13 @@ namespace BrewMonster // Print a notify message // æ‰“å°æç¤ºæ¶ˆæ¯ - // g_pGame.GetGameRun().AddFixedMessage(FIXMSG_SKILLINTERRUPT); - Debug.Log("Skill interrupted!"); + //EC_Game.GetGameRun().AddFixedMessage(FIXMSG_SKILLINTERRUPT); + BMLogger.LogError("Skill interrupted!"); - //AP_ActionEvent(AP_EVENT_STOPSKILL); + AP.AP_ActionEvent((int)AP_EVENT.AP_EVENT_STOPSKILL); // 通知策略技能被打断 | Notify policy that skill is interrupted - // CECAutoPolicy::GetInstance().SendEvent_SkillInterrupt(skill_id); + CECAutoPolicy.GetInstance().SendEvent_SkillInterrupt(skill_id); break; } case int value2 when value2 == CommandID.OBJECT_CAST_INSTANT_SKILL: @@ -1396,8 +1451,8 @@ namespace BrewMonster break; } - /* if (bActionStartSkill) - AP_ActionEvent(AP_EVENT_STARTSKILL, iActionTime);*/ + if (bActionStartSkill) + AP.AP_ActionEvent((int)AP_EVENT.AP_EVENT_STARTSKILL, iActionTime); if (bDoOtherThing) { @@ -1405,10 +1460,10 @@ namespace BrewMonster { // Continue combo skill // 继续连击技能 - // if (CECAutoPolicy::GetInstance().IsAutoPolicyEnabled()) - // g_pGame.GetGameRun().PostMessage(MSG_HST_CONTINUECOMBOSKILL, MAN_PLAYER, 0, 0, m_pComboSkill.GetGroupIndex()); - // else - m_pComboSkill.Continue(false); + if (CECAutoPolicy.GetInstance().IsAutoPolicyEnabled()) + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_CONTINUECOMBOSKILL, MANAGER_INDEX.MAN_PLAYER, 0, 0, m_pComboSkill.GetGroupIndex()); + else + m_pComboSkill.Continue(false); } else { @@ -1446,13 +1501,21 @@ namespace BrewMonster return; } - /* List skillSCConfigArray1 = new List(); - List skillSCConfigArray2 = new List(); - List skillGrpSCConfigArray1 = new List(); - List skillGrpSCConfigArray2 = new List();*/ + List skillSCConfigArray1 = new List(); + List skillSCConfigArray2 = new List(); + List skillGrpSCConfigArray1 = new List(); + List skillGrpSCConfigArray2 = new List(); if (HostIsReady()) { + m_pWorkMan.FinishWork(new CECHPTraceSpellMatcher()); + m_pPrepSkill = null; + m_pCurSkill = null; + ClearComboSkill(); + SaveSkillShortcut(skillSCConfigArray1, m_aSCSets1, (int)Shortcut.NUM_HOSTSCSETS1); + SaveSkillShortcut(skillSCConfigArray2, m_aSCSets2, (int)Shortcut.NUM_HOSTSCSETS2); + SaveSkillGrpShortcut(skillGrpSCConfigArray1, m_aSCSets1, (int)Shortcut.NUM_HOSTSCSETS1); + SaveSkillGrpShortcut(skillGrpSCConfigArray2, m_aSCSets2, (int)Shortcut.NUM_HOSTSCSETS2); /* for (int i = 0; i < HostConstants.NUM_HOSTSCSETS1; i++) { @@ -1471,6 +1534,9 @@ namespace BrewMonster }*/ // Release passive skills + m_aSCSets1 = new CECShortcutSet[HostCfgConstants.NUM_HOSTSCSETS1]; + m_aSCSets2 = new CECShortcutSet[HostCfgConstants.NUM_HOSTSCSETS2]; + m_aPtSkills.Clear(); m_aPsSkills.Clear(); } @@ -1499,15 +1565,15 @@ namespace BrewMonster // Restore and convert shortcuts after loading new skills if (HostIsReady()) { - /* ConvertSkillShortcut(skillSCConfigArray1); - AssignSkillShortcut(skillSCConfigArray1, hostPlayer.m_aSCSets1);*/ - /* ConvertSkillShortcut(skillSCConfigArray2); - AssignSkillShortcut(skillSCConfigArray2, hostPlayer.m_aSCSets2);*/ - /* ConvertComboSkill(); - ValidateSkillGrpShortcut(skillGrpSCConfigArray1); - AssignSkillGrpShortcut(skillGrpSCConfigArray1, hostPlayer.m_aSCSets1); - ValidateSkillGrpShortcut(skillGrpSCConfigArray2); - AssignSkillGrpShortcut(skillGrpSCConfigArray2, hostPlayer.m_aSCSets2);*/ + ConvertSkillShortcut(skillSCConfigArray1); + AssignSkillShortcut(skillSCConfigArray1, m_aSCSets1); + ConvertSkillShortcut(skillSCConfigArray2); + AssignSkillShortcut(skillSCConfigArray2, m_aSCSets2); + ConvertComboSkill(); + ValidateSkillGrpShortcut(skillGrpSCConfigArray1); + AssignSkillGrpShortcut(skillGrpSCConfigArray1, m_aSCSets1); + ValidateSkillGrpShortcut(skillGrpSCConfigArray2); + AssignSkillGrpShortcut(skillGrpSCConfigArray2, m_aSCSets2); } if (HostIsReady()) @@ -1519,12 +1585,172 @@ namespace BrewMonster CECUIManager.Instance.UpdateSkillRelatedUI(); } } + public void AssignSkillGrpShortcut(List skillGrpSCConfigArray, CECShortcutSet[] aSCSets) + { + for (int i = 0; i < skillGrpSCConfigArray.Count; i++) + { + SkillGrpShortCutConfig cfg = skillGrpSCConfigArray[i]; + if (cfg.groupIndex != -1) + { + // C++ không check null; nếu muốn an toàn hÆ¡n thì check aSCSets[cfg.setNum] != null + aSCSets[cfg.setNum].CreateSkillGroupShortcut(cfg.slotNum, cfg.groupIndex); + } + } + } + public void ValidateSkillGrpShortcut(List skillGrpSCConfigArray) + { + for (int i = 0; i < skillGrpSCConfigArray.Count; i++) + { + // C++ Ä‘ang lấy VideoSettings trong má»—i vòng lặp (giữ nguyên hành vi) + EC_VIDEO_SETTING vs = EC_Game.GetConfigs().GetVideoSettings(); + + SkillGrpShortCutConfig cfg = skillGrpSCConfigArray[i]; + + if (vs.comboSkill[cfg.groupIndex].nIcon == 0) + cfg.groupIndex = -1; // -1 biểu thị shortcut combo-skill không hợp lệ + + skillGrpSCConfigArray[i] = cfg; // cần nếu SkillGrpShortCutConfig là struct + } + } + + public void ConvertComboSkill() + { + EC_VIDEO_SETTING vs = EC_Game.GetConfigs().GetVideoSettings(); + + for (int i = 0; i < EC_ConfigConstants.EC_COMBOSKILL_NUM; i++) + { + if (vs.comboSkill[i].nIcon == 0) + continue; + + for (int j = 0; j < EC_ConfigConstants.EC_COMBOSKILL_LEN; j++) + { + int oldSkillId = vs.comboSkill[i].idSkill[j]; + if (oldSkillId == 0) + continue; + + int convertedSkillId = CECSkillConvert.Instance.GetConvertSkill(oldSkillId); + int newSkillId = (convertedSkillId == 0) ? oldSkillId : convertedSkillId; + + // C++: nếu skill tồn tại, hoặc là -1/-2 (loop / normal attack shortcut) thì giữ + if (GetNormalSkill(newSkillId) != null || newSkillId == -1 || newSkillId == -2) + { + vs.comboSkill[i].idSkill[j] = (short)newSkillId; + } + else + { + // Không hợp lệ -> clear combo theo oldSkillId, icon vá» 0, thoát vòng lặp j + vs.comboSkill[i].Clear(oldSkillId); + vs.comboSkill[i].nIcon = 0; + break; + } + } + } + + EC_Game.GetConfigs().SetVideoSettings(vs); + } + public void AssignSkillShortcut(List skillSCConfigArray, CECShortcutSet[] aSCSets) + { + for (int i = 0; i < skillSCConfigArray.Count; i++) + { + SkillShortCutConfig cfg = skillSCConfigArray[i]; + if (cfg.skillId == 0) + { + BMLogger.LogError("AssignSkillShortcut: skillId is zero"); + } + CECSkill convertSkill = GetNormalSkill(cfg.skillId); + if (convertSkill != null) + { + // C++ không check null set => nếu muốn y hệt thì bá» check này + if (aSCSets[cfg.setNum] != null) + { + aSCSets[cfg.setNum].CreateSkillShortcut(cfg.slotNum, convertSkill); + } + } + } + } + public void ConvertSkillShortcut(List skillSCConfigArray) + { + for (int i = 0; i < skillSCConfigArray.Count; i++) + { + if (skillSCConfigArray[i].skillId == 0) + { + BMLogger.LogError("ConvertSkillShortcut: skillId is zero"); + } + + int oldSkillId = skillSCConfigArray[i].skillId; + int convertSkillId = CECSkillConvert.Instance.GetConvertSkill(oldSkillId); + + // it->skillId = (convertSkillId == 0) ? it->skillId : convertSkillId; + SkillShortCutConfig cfg = skillSCConfigArray[i]; + cfg.skillId = (convertSkillId == 0) ? oldSkillId : convertSkillId; + skillSCConfigArray[i] = cfg; // needed if SkillShortCutConfig is a struct + } + } + public void SaveSkillGrpShortcut( + List skillGrpSCConfigArray, + CECShortcutSet[] aSCSets, + int count) + { + for (int i = 0; i < count; i++) + { + if (aSCSets[i] == null) continue; + + for (int j = 0; j < aSCSets[i].GetShortcutNum(); j++) + { + CECShortcut pSC = aSCSets[i].GetShortcut(j); + if (pSC == null || pSC.GetType() != (int)ShortcutType.SCT_SKILLGRP) + continue; + + // C-style cast -> safe cast + if (pSC is not CECSCSkillGrp pSkillGrpSC) + continue; + + SkillGrpShortCutConfig skillGrpSCConfig = new SkillGrpShortCutConfig(); + skillGrpSCConfig.setNum = i; + skillGrpSCConfig.slotNum = j; + skillGrpSCConfig.groupIndex = pSkillGrpSC.GetGroupIndex(); + + skillGrpSCConfigArray.Add(skillGrpSCConfig); + } + } + } + + public void SaveSkillShortcut( + List skillSCConfigArray, + CECShortcutSet[] aSCSets, + int count) + { + for (int i = 0; i < count; i++) + { + if (aSCSets[i] == null) continue; + + for (int j = 0; j < aSCSets[i].GetShortcutNum(); j++) + { + CECShortcut pSC = aSCSets[i].GetShortcut(j); + if (pSC == null || pSC.GetType() != (int)ShortcutType.SCT_SKILL) + continue; + + if (pSC is not CECSCSkill pSkillSC) + continue; + + int iOldSkillId = pSkillSC.GetSkill()?.GetSkillID() ?? 0; + if (iOldSkillId == 0) + continue; + + SkillShortCutConfig skillSCConfig = new SkillShortCutConfig(); + skillSCConfig.setNum = i; + skillSCConfig.slotNum = j; + skillSCConfig.skillId = iOldSkillId; + + skillSCConfigArray.Add(skillSCConfig); + } + } + } public bool HostIsReady() { return m_bEnterGame; } - private void OnMsgHstDied(in ECMSG msg) { // Mark host player as corpse so CECPlayer.IsDead() returns true @@ -2063,7 +2289,7 @@ namespace BrewMonster uint slot_amount = BitConverter.ToUInt32(data, 12); byte where = data[16]; // Package index byte index = data[17]; // Slot index in that package - var newItem = EC_IvtrItem.CreateItem(type, expire_date, (int)amount); + var newItem = EC_IvtrItem.CreateItem(type, expire_date, (int)amount); // Add item to inventory var ivt = GetInventory(where); @@ -2561,12 +2787,12 @@ namespace BrewMonster // p1 是一个 byte[] 缓冲区;解æžä¸º cmd_notify_hostpos ç„¶åŽè®¾ç½®ä½ç½® byte[] buf = (byte[])Msg.dwParam1; cmd_notify_hostpos pCmd = GPDataTypeHelper.FromBytes(buf); - + int idInst = pCmd.tag; Vector3 vPos = new Vector3(pCmd.vPos.x, pCmd.vPos.y, pCmd.vPos.z); int iLine = pCmd.line; - - + + // Call Goto method to properly handle teleportation // 调用 Goto æ–¹æ³•æ¥æ­£ç¡®å¤„ç†ä¼ é€ if (!Goto(idInst, vPos, iLine)) @@ -2575,7 +2801,7 @@ namespace BrewMonster return; } } - + // Return to a target town through skill // 通过技能返回目标城镇 // This method implements the Goto logic from the original C++ code @@ -2591,7 +2817,7 @@ namespace BrewMonster // Debug.LogError($"CECHostPlayer::Goto, Failed to jump to instance {idInst}"); // return false; // } - + // Stop all current work and goto specified position // åœæ­¢æ‰€æœ‰å½“å‰å·¥ä½œå¹¶è½¬åˆ°æŒ‡å®šä½ç½® if (m_pWorkMan != null) @@ -2600,33 +2826,33 @@ namespace BrewMonster // å¦‚æžœæ­£åœ¨è‡ªåŠ¨ç§»åŠ¨åˆ™åœæ­¢ // Note: IsAutoMoving check would go here if available // 注æ„:如果å¯ç”¨ï¼ŒIsAutoMoving 检查将放在这里 - + // Finish all work // å®Œæˆæ‰€æœ‰å·¥ä½œ m_pWorkMan.FinishAllWork(true); } - + // Add a little height to ensure player's AABB won't embed with building // 增加一点高度以确ä¿çŽ©å®¶çš„ AABB ä¸ä¼šåµŒå…¥å»ºç­‘物 vPos.y += 0.1f; - + // Ensure we are not under ground (terrain height check would go here) // ç¡®ä¿æˆ‘们ä¸ä¼šåœ¨åœ°ä¸‹ï¼ˆåœ°å½¢é«˜åº¦æ£€æŸ¥å°†æ”¾åœ¨è¿™é‡Œï¼‰ // Note: Terrain height check is skipped for now as it requires world access // 注æ„:暂时跳过地形高度检查,因为它需è¦ä¸–界访问 - + // Set position // 设置ä½ç½® SetPos(vPos); - + // Reset jump state if available // 如果å¯ç”¨åˆ™é‡ç½®è·³è·ƒçŠ¶æ€ // ResetJump(); // Uncomment if ResetJump method exists - + // Update camera if available // 如果å¯ç”¨åˆ™æ›´æ–°ç›¸æœº // UpdateFollowCamera(false, 10); // Uncomment if UpdateFollowCamera method exists - + return true; } @@ -3573,9 +3799,6 @@ namespace BrewMonster float fBorderLine = fWaterHeight - 2.0f; if (vPos.y <= fBorderLine) break; - // ·þÎñÆ÷¶Ë½«Ë®ÃæÒÔÃÂ2Ã×ÒÔÉô¦ÀíΪ run_speed£¨ÓÃÎÊÌ⣩ - // µ«Î´Ê¹ÓüÓËÙ¼¼ÄÜʱ swim_speed áÓÚ run_speed£¬ - // ¿ÉÒÔÔÚË®ÃæÒÔÃÂ2Ã×ÒÔÉûñÈ¡³¬¹ý swim_speed µÄËÙ¶È£¬Òò´Ë£¬´Ë´¦È¡Ã½Õß½ÃáֵΪºÃÀí×ö·¨ fSpeedSev = Math.Min(m_ExtProps.mv.run_speed, fSpeedSev); break; } @@ -3593,7 +3816,6 @@ namespace BrewMonster // Return-town skill is very special, handle it separately // 回城技能éžå¸¸ç‰¹æ®Šï¼Œå•ç‹¬å¤„ç† - Debug.Log($"ApplySkillShortcut: Checking skill {idSkill}, ID_RETURNTOWN_SKILL={ID_RETURNTOWN_SKILL}"); if (idSkill == ID_RETURNTOWN_SKILL) { Debug.Log($"ApplySkillShortcut: Skill 167 detected, calling ReturnToTargetTown"); @@ -3610,10 +3832,10 @@ namespace BrewMonster return false; if (!bCombo) - //ClearComboSkill(); + ClearComboSkill(); - if (idSelTarget == 0) - idSelTarget = m_idSelTarget; + if (idSelTarget == 0) + idSelTarget = m_idSelTarget; CECSkill pSkill = GetPositiveSkillByID(idSkill); if (pSkill == null) pSkill = GetEquipSkillByID(idSkill); @@ -3633,12 +3855,12 @@ namespace BrewMonster return true; } - //int iCon = CheckSkillCastCondition(pSkill); - //if (iCon) - //{ - // ProcessSkillCondition(iCon); - // return false; - //} + int iCon = CheckSkillCastCondition(pSkill); + if (iCon != 0) + { + ProcessSkillCondition(iCon); + return false; + } //// Get force attack flag bool bForceAttack = false; @@ -3648,20 +3870,20 @@ namespace BrewMonster bForceAttack = iForceAtk > 0 ? true : false; //// Check negative effect skill - //if (pSkill.GetType() == (int)skill_type.TYPE_ATTACK || pSkill.GetType() == (int)skill_type.TYPE_CURSE) - //{ - // if (idSelTarget == m_PlayerInfo.cid) - // { - // // Host cannot spell negative effect magic to himself. - // EC_Game.GetGameRun().AddFixedChannelMsg(FIXMSG_TARGETWRONG, GP_CHAT_FIGHT); - // return false; - // } - // else if (idSelTarget != 0) - // { - // if (AttackableJudge(idSelTarget, bForceAttack) != 1) - // return false; - // } - //} + if (pSkill.GetType() == (int)skill_type.TYPE_ATTACK || pSkill.GetType() == (int)skill_type.TYPE_CURSE) + { + if (idSelTarget == m_PlayerInfo.cid) + { + // Host cannot spell negative effect magic to himself. + //EC_Game.GetGameRun().AddFixedChannelMsg(FIXMSG_TARGETWRONG, GP_CHAT_FIGHT); + return false; + } + else if (idSelTarget != 0) + { + if (AttackableJudge(idSelTarget, bForceAttack) != 1) + return false; + } + } //// Check whether target type match int idCastTarget = idSelTarget; @@ -3773,9 +3995,9 @@ namespace BrewMonster else if (iTargetType == 2) iAliveFlag = 2; - /*CECObject pObject = EC_Game.GetGameRun().GetWorld().GetObject(idCastTarget, iAliveFlag); - if (!pObject) - return false;*/ + /* CECObject pObject = EC_Game.GetGameRun().GetWorld().GetObject(idCastTarget, iAliveFlag); + if (!pObject) + return false;*/ } if (!IsMeleeing() && !IsSpellingMagic() && @@ -3787,8 +4009,8 @@ namespace BrewMonster if (!pSkill.IsInstant() && pSkill.GetType() != (int)Skilltype.TYPE_FLASHMOVE) { - /* if (!NaturallyStopMoving()) - return false; */ // Couldn't stop naturally, so cancel casting skill + if (!NaturallyStopMoving()) + return false; // Couldn't stop naturally, so cancel casting skill } else if (pSkill.GetType() == (int)Skilltype.TYPE_FLASHMOVE) { @@ -3822,9 +4044,9 @@ namespace BrewMonster { bool bTraceOK = false; bool bUseAutoPF = false; - /* CECPlayerWrapper pWrapper = CECAutoPolicy::GetInstance().GetPlayerWrapper(); - if (CECAutoPolicy::GetInstance().IsAutoPolicyEnabled() && pWrapper.GetAttackError() >= 2) - bUseAutoPF = true;*/ + CECPlayerWrapper pWrapper = CECAutoPolicy.GetInstance().GetPlayerWrapper(); + if (CECAutoPolicy.GetInstance().IsAutoPolicyEnabled() && pWrapper.GetAttackError() >= 2) + bUseAutoPF = true; if (idCastTarget == 0) { @@ -4031,7 +4253,24 @@ namespace BrewMonster Buffer.BlockCopy(buffer, index + contentBytes, tail, 0, trailing); } } + public bool NaturallyStopMoving() + { + // if (!m_MoveCtrl.IsStop()) + if (!IsPlayerMoving()) + return true; // Host has been stopped + if (m_iMoveMode == (int)MoveMode.MOVE_FREEFALL || InSlidingState() || IsJumping()) + return false; // Host couldn't stop naturally + + if (!m_pWorkMan.IsStanding()) + { + m_pWorkMan.FinishAllWork(true); + } + + m_MoveCtrl.SendStopMoveCmd(); + + return true; + } public bool CastSkill(int idTarget, bool bForceAttack, CECObject pTarget = null) { // Check if prep skill is valid, ready to cast, and not currently spelling magic @@ -4290,7 +4529,7 @@ namespace BrewMonster // 通过技能返回目标城镇 private bool ReturnToTargetTown(int idTarget, bool bCombo = false) { - + if (!CanDo(ActionCanDo.CANDO_SPELLMAGIC)) { return false; @@ -4304,7 +4543,7 @@ namespace BrewMonster Debug.LogError("ReturnToTargetTown: Skill 167 not found"); return false; } - + if (!bCombo) { @@ -4340,7 +4579,7 @@ namespace BrewMonster m_pPrepSkill = pSkill; byte byPVPMask = glb_BuildPVPMask(false); - + // Call c2s_CmdCastSkill with target parameter // ä½¿ç”¨ç›®æ ‡å‚æ•°è°ƒç”¨ c2s_CmdCastSkill int targets = 1; @@ -4564,19 +4803,13 @@ namespace BrewMonster } } - // Check combo skill prerequisite (for night shadow continuous skills) - // Note: GetComboSkPreSkill and IsActiveComboSkill methods need to be implemented - // TODO: Implement GetComboSkPreSkill in ElementSkill/CECSkill - // TODO: Implement IsActiveComboSkill in CECComboSkillState - /* if (pSkill.GetComboSkPreSkill() != 0) { - if (!CECComboSkillState.Instance.IsActiveComboSkill(pSkill.GetSkillID())) + if (!CECComboSkillState.Instance.IsActiveComboSkill((uint)pSkill.GetSkillID())) { return 13; // Combo skill not active } } - */ // Build UseRequirement info UseRequirement Info = new UseRequirement(); @@ -4588,35 +4821,24 @@ namespace BrewMonster Info.is_combat = IsFighting(); Info.hp = m_BasicProps.iCurHP; Info.max_hp = m_ExtProps.bs.max_hp; - // Info.combo_state = CECComboSkillState.Instance.GetComboSkillState(); // TODO: Implement GetComboSkillState + Info.combo_state = CECComboSkillState.Instance.GetComboSkillState(); // TODO: Implement GetComboSkillState - // Get weapon's major class ID - // Equipment inventory slot constants from CECPlayer.IndexOfIteminEquipmentInventory - const int EQUIPIVTR_WEAPON = 0; // Weapon slot - const int EQUIPIVTR_PROJECTILE = 4; // Projectile slot (arrows) + // Get weapon's major class ID + int iReason = 0; - Info.weapon = 0; - Info.arrow = 0; - - EC_IvtrItem pWeaponItem = m_pEquipPack.GetItem(EQUIPIVTR_WEAPON); - if (pWeaponItem != null && pWeaponItem is EC_IvtrEquip pWeaponEquip) - { - // Check if weapon has endurance - if (pWeaponEquip.CurEndurance > 0) - { - // TODO: Implement CanUseEquipment method to check level/class requirements - // For now, use the template ID as weapon type - Info.weapon = pWeaponItem.GetTemplateID(); - } - } + CECIvtrWeapon pWeapon = (CECIvtrWeapon)m_pEquipPack.GetItem((int)IndexOfIteminEquipmentInventory.EQUIPIVTR_WEAPON); + if (pWeapon == null || pWeapon.GetCurEndurance() == 0) + Info.weapon = 0; + else if (!CanUseEquipment(pWeapon, ref iReason)) + Info.weapon = (iReason == 5) ? (int)pWeapon.GetDBMajorType().id : 0; + else + Info.weapon = (int)pWeapon.GetDBMajorType().id; // Get remaining arrow number - EC_IvtrItem pArrowItem = m_pEquipPack.GetItem(EQUIPIVTR_PROJECTILE); - if (pArrowItem != null) + CECIvtrArrow pArrow = (CECIvtrArrow)m_pEquipPack.GetItem((int)IndexOfIteminEquipmentInventory.EQUIPIVTR_PROJECTILE); + if (pArrow != null && CanUseProjectile(pArrow)) { - // TODO: Implement CanUseProjectile method to check requirements - // For now, use the item count - Info.arrow = pArrowItem.GetCount(); + Info.arrow = pArrow.GetCount(); } // Call ElementSkill Condition check @@ -4657,7 +4879,26 @@ namespace BrewMonster return iMsg >= 0; } + public bool CanUseProjectile(CECIvtrArrow pArrow) + { + if (pArrow == null) + return false; + CECIvtrWeapon pWeapon = (CECIvtrWeapon)m_pEquipPack.GetItem((int)IndexOfIteminEquipmentInventory.EQUIPIVTR_WEAPON); + if (pWeapon == null) + return false; + + IVTR_ESSENCE_WEAPON we = pWeapon.GetEssence(); + if (we.weapon_type != (int)WeaponType.WEAPONTYPE_RANGE) + return false; + + IVTR_ESSENCE_ARROW ae = pArrow.GetEssence(); + if (we.require_projectile != (int)pArrow.GetDBSubType().id || + we.weapon_level < ae.iWeaponReqLow || we.weapon_level > ae.iWeaponReqHigh) + return false; + + return true; + } bool CanSelectTarget(int idTarget) { if (idTarget == 0 || idTarget == this.GetCharacterID()) @@ -6507,7 +6748,7 @@ namespace BrewMonster } } } - + public CECCounter GetGatherCnt() { return m_GatherCnt; } public void UpdateTimers(float dwDeltaTime) @@ -6766,7 +7007,23 @@ namespace BrewMonster } // Clear combo skill / 清除连击技能 - void ClearComboSkill() + public bool ApplyComboSkill(int iGroup, bool bIgnoreAtkLoop = false, int iForceAtk = -1) + { + ClearComboSkill(); + + CECComboSkill comboSkill = new(); + bool bForceAttack = iForceAtk < 0 ? glb_GetForceAttackFlag(0) : iForceAtk > 0; + if (!comboSkill.Init(this, iGroup, m_idSelTarget, bForceAttack, bIgnoreAtkLoop)) + { + return false; + } + + m_pComboSkill = comboSkill; + m_pComboSkill.Continue(m_bMelee); + return true; + } + + public void ClearComboSkill() { if (m_pComboSkill != null) { @@ -7044,10 +7301,10 @@ namespace BrewMonster public int GetEquippedSuiteItem(int idSuite, ref int[] aItems) { int i, iItemCnt = 0; - for(i = 0; i < m_pEquipPack.GetSize(); i++) + for (i = 0; i < m_pEquipPack.GetSize(); i++) { var pItem = m_pEquipPack.GetItem(i); - if(pItem == null) + if (pItem == null) { continue; } @@ -7056,20 +7313,20 @@ namespace BrewMonster { continue; } - if(pEquip.GetSuiteID() != idSuite) - { - continue; - } - int iReason = 0; - if(!CanUseEquipment(pEquip, ref iReason)) + if (pEquip.GetSuiteID() != idSuite) { continue; } - if(pEquip.CID == (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_GENERALCARD) + int iReason = 0; + if (!CanUseEquipment(pEquip, ref iReason)) + { + continue; + } + if (pEquip.CID == (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_GENERALCARD) { //TODO: Add general card Suite } - if(aItems.Length > 0) + if (aItems.Length > 0) { aItems[iItemCnt] = pEquip.GetTemplateID(); } @@ -7080,28 +7337,28 @@ namespace BrewMonster public bool CanUseEquipment(EC_IvtrEquip pEquip, ref int piReason) { int iReason = 0; - if(pEquip == null) + if (pEquip == null) { iReason = 1; goto End; } - if(GetMaxLevelSofar() < pEquip.LevelReq|| - m_ExtProps.bs.strength < pEquip.StrengthReq|| - m_ExtProps.bs.agility < pEquip.AgilityReq|| - m_ExtProps.bs.vitality < pEquip.VitalityReq|| + if (GetMaxLevelSofar() < pEquip.LevelReq || + m_ExtProps.bs.strength < pEquip.StrengthReq || + m_ExtProps.bs.agility < pEquip.AgilityReq || + m_ExtProps.bs.vitality < pEquip.VitalityReq || m_ExtProps.bs.energy < pEquip.EnergyReq/*|| Reputation < pEquip.ReputationReq*/)//todo Add reputation check { iReason = 2; goto End; } - switch(pEquip.CID)//class id + switch (pEquip.CID)//class id { case (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_ARROW: break; case (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_WING: if (m_iProfession != (int)PROFESSION.PROF_ARCHOR && m_iProfession != (int)PROFESSION.PROF_ANGEL) - iReason = 3; + iReason = 3; break; case (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_FLYSWORD: //TODO: Add flysword check @@ -7112,15 +7369,15 @@ namespace BrewMonster case (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_ARMOR: case (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_DECORATION: if ((pEquip.ProfReq & (1 << m_iProfession)) == 0) - iReason = 3; + iReason = 3; break; case (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_WEAPON: if ((pEquip.ProfReq & (1 << m_iProfession)) == 0) - iReason = 3; + iReason = 3; else { //TODO: check range weapon arrow - } + } break; case (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_GENERALCARD: // TODO: Add general card check @@ -7129,14 +7386,13 @@ namespace BrewMonster break; } - End: - if(piReason > 0) + End: + if (piReason > 0) { piReason = iReason; } - return iReason == 0? true : false; + return iReason == 0 ? true : false; } - private void OnMsgHstEmbedItem(ECMSG Msg) { cmd_embed_item pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1); @@ -7158,11 +7414,11 @@ namespace BrewMonster { return m_pPetCorral; } - + // Get key object(NPC..) coordinates - public A3DVECTOR3 GetObjectCoordinates(int idTarget,ref ObjectCoords TargetCoord, ref bool bInTable) + public A3DVECTOR3 GetObjectCoordinates(int idTarget, ref ObjectCoords TargetCoord, ref bool bInTable) { - if(TargetCoord == null) + if (TargetCoord == null) { TargetCoord = new ObjectCoords(); } @@ -7175,7 +7431,7 @@ namespace BrewMonster string szText = idTarget.ToString(); List tempCoord = new List(); int iCount = EC_Game.GetObjectCoord(szText, ref tempCoord); - if(iCount == 0) + if (iCount == 0) { return vDestPos; } @@ -7188,17 +7444,17 @@ namespace BrewMonster string strCurMap = pInstance.GetPath(); // �ȼ��ͬһ��ͼ���Ƿ���Ҫ���ҵ���Ʒ bool bHasObjectInCurrentInstance = tempCoord.Any(coord => coord.strMap == strCurMap); - for(int i=0;i 0 ? (realmLevel + 9) / 10 : 0;} - public static int GetRealmSubLevel(int realmLevel){return realmLevel > 0 ? (realmLevel % 10 > 0 ? realmLevel % 10 : 10) : 0;} + public int GetRealmLayer() { return m_RealmLevel / 100; } + public int GetRealmSubLevel() { return m_RealmLevel % 100; } + public static int GetRealmLayer(int realmLevel) { return realmLevel > 0 ? (realmLevel + 9) / 10 : 0; } + public static int GetRealmSubLevel(int realmLevel) { return realmLevel > 0 ? (realmLevel % 10 > 0 ? realmLevel % 10 : 10) : 0; } public bool HaveHealthStones() { var pPack = GetPack(); - var items = new int[] {36764, 36765, 36766, 36767}; - for (int i = 0; i < items.Length; ++ i) { + var items = new int[] { 36764, 36765, 36766, 36767 }; + for (int i = 0; i < items.Length; ++i) + { if (pPack.FindItem(items[i]) >= 0) return true; } @@ -7249,7 +7506,7 @@ namespace BrewMonster public bool UseItemInPack(int iPack, int iSlot, bool showMsg = true) { - if(!CanDo(ActionCanDo.CANDO_USEITEM)) + if (!CanDo(ActionCanDo.CANDO_USEITEM)) return false; EC_Inventory pPack = GetPack(iPack); @@ -7260,31 +7517,112 @@ namespace BrewMonster if (pItem == null || pItem.IsFrozen()) return false; - if(pItem.Use_Persist() && (IsJumping() || IsFalling())) + if (pItem.Use_Persist() && (IsJumping() || IsFalling())) return false; CECGameRun pGameRun = EC_Game.GetGameRun(); //CECGameSession pSession = g_pGame.GetGameSession(); + if (pItem.GetClassID() == (int)EC_IvtrItem.InventoryClassId.ICID_FIREWORK) + { + if (GetProfession() == (int)PROFESSION.PROF_GHOST && IsInvisible()) + { + if (showMsg) + pGameRun.AddFixedMessage((int)FixedMsg.FIXMSG_CANNOT_USE_WHEN_INVISIBLE); + return false; + } + } + + if (pItem.GetClassID() == (int)EC_IvtrItem.InventoryClassId.ICID_INCSKILLABILITY) + { + EC_IvtrIncSkillAbility pIncSkill = pItem as EC_IvtrIncSkillAbility; + //if (pIncSkill != null) + //{ + // var pDBEssence = pIncSkill.GetDBEssence(); + // CECSkill pSkill = GetNormalSkill(pDBEssence.id_skill); + // if (pSkill != null) + // { + // if (pSkill.GetSkillLevel() != pDBEssence.level_required) + // { + // if (showMsg) + // pGameRun.AddFixedMessage((int)FixedMsg.FIXMSG_PRODUCE_LEVEL_INVALID); + // return false; + // } + // if (GetSkillAbilityPercent(pDBEssence.id_skill) >= 100) + // { + // if (showMsg) + // pGameRun.AddFixedMessage((int)FixedMsg.FIXMSG_PRODUCE_ABILITY_FULL); + // return false; + // } + // } + //} + } + if (pItem.GetClassID() == (int)EC_IvtrItem.InventoryClassId.ICID_TRANSMITSCROLL) { CECGameUIMan pGameUI = pGameRun.GetUIManager().GetInGameUIMan(); if (pGameUI != null && !IsFighting()) { // TODO: Implement travel map dialog + //CDlgWorldMap* pMap = (CDlgWorldMap*)pGameUI->GetDialog("Win_WorldMapTravel"); + //pMap->BuildTravelMap(DT_TRANSMITSCROLL_ESSENCE, (void*)iSlot); + //pMap->Show(true); } return true; } + if (pItem.GetClassID() == (int)EC_IvtrItem.InventoryClassId.ICID_SHOPTOKEN) + { + CECGameUIMan pGameUI = pGameRun.GetUIManager().GetInGameUIMan(); + if (pGameUI != null && !IsFighting()) + { + //CDlgTokenShop* pDlg = dynamic_cast(pGameUI->GetDialog("Win_TokenShop")); + //if (pDlg) + //{ + // pDlg->InitTokenShopItem(pItem->GetTemplateID()); + // pDlg->Show(!pDlg->IsShow()); + //} + } + return true; + } + + if (pItem.GetClassID() == (int)EC_IvtrItem.InventoryClassId.ICID_UNIVERSAL_TOKEN) + { + // TODO: Implement universal token when available + EC_IvtrUniversalToken pUniversalToken = pItem as EC_IvtrUniversalToken; + //if (pUniversalToken != null && pUniversalToken.HasAnyUsage()) + //{ + // CECUseUniversalTokenCommandManager.Instance.Use(pUniversalToken, pUniversalToken.UsageIndexAt(0)); + // return true; + //} + } + + if (pItem.GetClassID() == (int)EC_IvtrItem.InventoryClassId.ICID_TASKDICE) + { + EC_IvtrTaskDice pTaskDice = pItem as EC_IvtrTaskDice; + if (pTaskDice != null) + { + if (pTaskDice != null) + { + if (IsFlying() && pTaskDice.GetDBEssence().no_use_in_combat == 1) + { + if(showMsg) + pGameRun.AddFixedMessage((int)FixedMsg.FIXMSG_CANNOT_USE_IN_BATTLE); + return false; + } + } + } + } + if (pItem.GetClassID() == (int)EC_IvtrItem.InventoryClassId.ICID_TARGETITEM) { EC_IvtrTargetItem pTargetItem = pItem as EC_IvtrTargetItem; - if(pTargetItem == null) + if (pTargetItem == null) return false; var essence = pTargetItem.GetDBEssence(); - if(!pTargetItem.IsEssenceLoaded()) + if (!pTargetItem.IsEssenceLoaded()) return false; if (IsFighting() && essence.use_in_combat == 0) @@ -7294,7 +7632,7 @@ namespace BrewMonster return false; } - if (pTargetItem.GetDBEssence().use_in_sanctuary_only != 0 && !IsInSanctuary()) + if (essence.use_in_sanctuary_only != 0 && !IsInSanctuary()) { if (showMsg) pGameRun.AddFixedMessage((int)FixedMsg.FIXMSG_USE_IN_SANCTUARY_ONLY); @@ -7315,13 +7653,13 @@ namespace BrewMonster } if (!found) { - if(showMsg) + if (showMsg) pGameRun.AddFixedMessage((int)FixedMsg.FIXMSG_CANNOT_USE_IN_CURR_MAP); return false; } } - if(!CanDo(ActionCanDo.CANDO_SPELLMAGIC)) + if (!CanDo(ActionCanDo.CANDO_SPELLMAGIC)) return false; if (InSlidingState()) @@ -7355,7 +7693,7 @@ namespace BrewMonster pSkill.GetType() == (int)CECSkill.SkillType.TYPE_CURSE) { if (m_idSelTarget == m_PlayerInfo.cid) - { + { if (showMsg) pGameRun.AddFixedChannelMsg((int)FixedMsg.FIXMSG_TARGETWRONG, (int)ChatChannel.GP_CHAT_FIGHT); return false; @@ -7373,7 +7711,7 @@ namespace BrewMonster if (pSkill.GetType() == (int)CECSkill.SkillType.TYPE_BLESS || pSkill.GetType() == (int)CECSkill.SkillType.TYPE_NEUTRALBLESS) { - if(iTargetType == 0 || !GPDataTypeHelper.ISPLAYERID(m_idSelTarget)) + if (iTargetType == 0 || !GPDataTypeHelper.ISPLAYERID(m_idSelTarget)) idCastTarget = m_PlayerInfo.cid; if (GPDataTypeHelper.ISPLAYERID(idCastTarget) && idCastTarget != m_PlayerInfo.cid) @@ -7391,12 +7729,12 @@ namespace BrewMonster else { EC_ElsePlayer pPlayer = EC_ManMessageMono.Instance.GetECManPlayer.GetElsePlayer(idCastTarget) as EC_ElsePlayer; - if(pPlayer == null) + if (pPlayer == null) return false; if (pPlayer.IsInvader() || pPlayer.IsPariah()) { - if((byBLSMask & (byte)PVPMask.GP_BLSMASK_NORED) != 0) + if ((byBLSMask & (byte)PVPMask.GP_BLSMASK_NORED) != 0) idCastTarget = m_PlayerInfo.cid; } @@ -7408,13 +7746,13 @@ namespace BrewMonster if (!IsFactionAllianceMember(pPlayer.GetFactionID())) { - if((byBLSMask & (byte)PVPMask.GP_BLSMASK_NOALLIANCE) != 0) + if ((byBLSMask & (byte)PVPMask.GP_BLSMASK_NOALLIANCE) != 0) idCastTarget = m_PlayerInfo.cid; } if (GetForce() != pPlayer.GetForce()) { - if((byBLSMask & (byte)PVPMask.GP_BLSMASK_NOFORCE) != 0) + if ((byBLSMask & (byte)PVPMask.GP_BLSMASK_NOFORCE) != 0) idCastTarget = m_PlayerInfo.cid; } } @@ -7422,7 +7760,7 @@ namespace BrewMonster } // If host is in dule - if(IsInDuel() && m_idSelTarget == m_pvp.idDuelOpp) + if (IsInDuel() && m_idSelTarget == m_pvp.idDuelOpp) idCastTarget = m_PlayerInfo.cid; // If host is in battle @@ -7435,6 +7773,24 @@ namespace BrewMonster } } } + else if(pSkill.GetType() == (int)CECSkill.SkillType.TYPE_BLESS) + { + // TODO: Implement pet blessing when petsystem is available + //CECSCPet pPet = EC_Game.GetGameRun().GetWorld().GetPetByID(m_idSelTarget); + //if (pPet == null || pPet.GetMasterID() == GetCharacterID()) + //{ + // CECPetData pPetData = m_pPetCorral.GetActivePet(); + // if (pPetData == null || + // pPetData.GetClass() != GP_PET_TYPE.GP_PET_CLASS_COMBAT && + // pPetData.GetClass() != GP_PET_TYPE.GP_PET_CLASS_SUMMON && + // pPetData.GetClass() != GP_PET_TYPE.GP_PET_CLASS_EVOLUTION) + // return false; + + // idCastTarget = m_pPetCorral.GetActivePetNPCID(); + //} + //if(iTargetType != 0 && idCastTarget == 0) + // return false; + } if (iTargetType != 0) { @@ -7445,25 +7801,24 @@ namespace BrewMonster iTargetType = 2; CECObject pObject = EC_ManMessageMono.Instance.GetObject(idCastTarget, iAliveFlag); - if(pObject == null) + if (pObject == null) return false; } if (!IsMeleeing() && !IsSpellingMagic() && (iTargetType == 0 || idCastTarget == m_PlayerInfo.cid)) { - if(!pSkill.ReadyToCast()) + if (!pSkill.ReadyToCast()) return false; if (!pSkill.IsInstant() && pSkill.GetType() != (int)CECSkill.SkillType.TYPE_FLASHMOVE) { - // TODO: Implement NaturallyStopMoving - //if (!NaturallyStopMoving()) - // return false; + if (!NaturallyStopMoving()) + return false; } else if (pSkill.GetType() == (int)CECSkill.SkillType.TYPE_FLASHMOVE) { - if(!CanDo(ActionCanDo.CANDO_FLASHMOVE)) + if (!CanDo(ActionCanDo.CANDO_FLASHMOVE)) return false; } @@ -7488,11 +7843,11 @@ namespace BrewMonster } EC_IvtrEquip pEquip = pItem as EC_IvtrEquip; - if(pEquip == null) + if (pEquip == null) return false; int iReason = 0; - if(!CanUseEquipment(pEquip, ref iReason)) + if (!CanUseEquipment(pEquip, ref iReason)) return false; int iFirstFree = -1, iFirstCan = -1; @@ -7522,6 +7877,16 @@ namespace BrewMonster return false; } + if (pItem.GetClassID() == (int)EC_IvtrItem.InventoryClassId.ICID_DYNSKILLEQUIP) + { + int iSameIDPos = m_pEquipPack.FindItem(pItem.GetTemplateID()); + if (iSameIDPos >= 0) + { + iDst = iSameIDPos; + } + + } + if (pItem.GetClassID() == (int)EC_IvtrItem.InventoryClassId.ICID_ARROW || pItem.GetClassID() == (int)EC_IvtrItem.InventoryClassId.ICID_DYNSKILLEQUIP) { @@ -7530,6 +7895,7 @@ namespace BrewMonster UnityGameSession.RequestEquipItemAsync((byte)iSlot, (byte)iDst, null); else { + // TODO: Implement c2s_CmdMoveItemToEquip when available //UnityGameSession.c2s_CmdMoveItemToEquip((byte)iSlot, (byte)iDst); } } @@ -7538,13 +7904,18 @@ namespace BrewMonster if (pItem.GetClassID() == (int)EC_IvtrItem.InventoryClassId.ICID_GENERALCARD) { //TODO: Add general card equip request + EC_IvtrGeneralCard pCard = pItem as EC_IvtrGeneralCard; + if (pCard != null) + { + iDst = InventoryConst.EQUIPIVTR_GENERALCARD1 + pCard.GetEssence().type; + } } UnityGameSession.RequestEquipItemAsync((byte)iSlot, (byte)iDst, null); } return true; } - if(iPack != Inventory_type.IVTRTYPE_PACK) + if (iPack != Inventory_type.IVTRTYPE_PACK) return false; if (!pItem.CheckUseCondition()) @@ -7564,7 +7935,7 @@ namespace BrewMonster if (pItem.Use_AtkTarget() || pItem.Use_Target()) { - if(pItem.Use_AtkTarget() && CannotAttack()) + if (pItem.Use_AtkTarget() && CannotAttack()) return false; if (m_idSelTarget == 0 || m_idSelTarget == m_PlayerInfo.cid) @@ -7599,21 +7970,23 @@ namespace BrewMonster float fDist = 0, fTargetRag = 0; CECObject pObject = null; - //if (CalcDist(m_idSelTarget, ref fDist, ref pObject)) - //{ - // return false; - //} + if (CalcDist(m_idSelTarget, out fDist, out pObject)) + { + return false; + } if (GPDataTypeHelper.ISNPCID(m_idSelTarget)) { + pObject = EC_ManMessageMono.Instance.CECNPCMan.GetNPC(m_idSelTarget); CECNPC pNPC = pObject as CECNPC; if (pNPC != null) fTargetRag = pNPC.GetTouchRadius(); } else if (GPDataTypeHelper.ISPLAYERID(m_idSelTarget)) { + pObject = EC_ManMessageMono.Instance.GetECManPlayer.GetElsePlayer(m_idSelTarget); EC_ElsePlayer pPlayer = pObject as EC_ElsePlayer; - if(pPlayer != null) + if (pPlayer != null) fTargetRag = pPlayer.GetTouchRadius(); } @@ -7642,6 +8015,7 @@ namespace BrewMonster if (showMsg) { CECGameUIMan pGameUI = pGameRun.GetUIManager().GetInGameUIMan(); + //pGameUI.MessageBox("", pGameUI.GetStringFromTable(828), MB_OK, new Color32(1, 1, 1, 0.6)); } return false; } @@ -7664,14 +8038,12 @@ namespace BrewMonster EC_Inventory pPack = GetPack(pCmd.byPackage); if (pPack == null) { - Debug.LogError("[OnMsgHstUseItem] Pack not found"); return; } EC_IvtrItem pItem = pPack.GetItem(pCmd.bySlot, false); if (pItem == null || pItem.GetTemplateID() != pCmd.item_id) { - Debug.LogError($"[OnMsgHstUseItem] Item mismatch at slot {pCmd.bySlot}"); return; } @@ -7684,12 +8056,12 @@ namespace BrewMonster { if (pPack.GetItem(pCmd.bySlot, false) == null) { - Debug.Log($"[OnMsgHstUseItem] Item {pCmd.item_id} removed from slot {pCmd.bySlot}"); + //Debug.Log($"[OnMsgHstUseItem] Item {pCmd.item_id} removed from slot {pCmd.bySlot}"); } } else { - Debug.LogError($"[OnMsgHstUseItem] Failed to remove item {pCmd.item_id} from slot {pCmd.bySlot}"); + //Debug.LogError($"[OnMsgHstUseItem] Failed to remove item {pCmd.item_id} from slot {pCmd.bySlot}"); } var ui = GameObject.FindFirstObjectByType(); @@ -7700,7 +8072,7 @@ namespace BrewMonster } else { - Debug.LogError("[OnMsgHstUseItem] EC_InventoryUI not found, UI may not update"); + //Debug.LogError("[OnMsgHstUseItem] EC_InventoryUI not found, UI may not update"); } } @@ -7709,7 +8081,7 @@ namespace BrewMonster CECHPWork pWork = m_pWorkMan.GetRunningWork(Host_work_ID.WORK_USEITEM); if (pWork is CECHPWorkUse useWork) { - if(useWork.GetItem() == pCmd.item_id) + if (useWork.GetItem() == pCmd.item_id) { m_pWorkMan.FinishRunningWork(Host_work_ID.WORK_USEITEM); } @@ -7717,63 +8089,103 @@ namespace BrewMonster } } - /// - /// Calculate distance to an object and optionally retrieve the object reference - /// 计算到对象的è·ç¦»ï¼Œå¹¶å¯é€‰åœ°èŽ·å–对象引用 - /// - /// Target object ID / 目标对象ID - /// Output distance / 输出è·ç¦» - /// Output object reference (optional) / 输出对象引用(å¯é€‰ï¼‰ - /// True if calculation succeeded / 计算æˆåŠŸè¿”å›žtrue - //public bool CalcDist(int idObject, ref float pfDist, out CECObject ppObject) - //{ - // ppObject = null; + // + // Calculate distance to an object and optionally retrieve the object reference + // 计算到对象的è·ç¦»ï¼Œå¹¶å¯é€‰åœ°èŽ·å–对象引用 + // + // Target object ID / 目标对象ID + // Output distance / 输出è·ç¦» + // Output object reference (optional) / 输出对象引用(å¯é€‰ï¼‰ + // True if calculation succeeded / 计算æˆåŠŸè¿”å›žtrue + public bool CalcDist(int idObject, out float pfDist, out CECObject ppObject) + { + pfDist = 0.0f; + ppObject = null; - // if (idObject == 0 || idObject == m_PlayerInfo.cid) - // return false; + if (idObject == 0 || idObject == m_PlayerInfo.cid) + return false; - // CECObject pObject = CECGameRun.Instance.GetWorld()?.GetObject(idObject, 1); - // if (pObject == null) - // return false; + CECWorld pWorld = CECGameRun.Instance.GetWorld(); + if(pWorld == null) + return false; - // ppObject = pObject; - // float fDist = 0.0f; + CECObject pObject = pWorld.GetObject(idObject, 1); + if(ppObject == null) + return false; - // if (ISNPCID(idObject)) - // { - // CECNPC pNPC = (CECNPC)pObject; - // fDist = pNPC.CalcDist(GetPos(), true); - // } - // else if (ISPLAYERID(idObject)) - // { - // Debug.Assert(pObject.GetClassID() == CECObject.OCID_ELSEPLAYER); - // EC_ElsePlayer pPlayer = (EC_ElsePlayer)pObject; - // fDist = pPlayer.CalcDist(GetPos(), true); - // } - // else if (ISMATTERID(idObject)) - // { - // Debug.Assert(pObject.GetClassID() == CECObject.OCID_MATTER); - // CECMatter pMatter = (CECMatter)pObject; - // fDist = (pMatter.GetPos() - GetPos()).magnitude; - // } - // else - // return false; + ppObject = pObject; + float fDist = 0.0f; - // pfDist = fDist; - // return true; - //} + if (GPDataTypeHelper.ISNPCID(idObject)) + { + CECNPC pNPC = pObject as CECNPC; + if (pNPC == null) + return false; + fDist = pNPC.CalcDist(GetPos(), true); + } + else if (GPDataTypeHelper.ISMATTERID(idObject)) + { + Debug.Assert(pObject.GetClassID() == Class_ID.OCID_MATTER); + CECMatter pMatter = pObject as CECMatter; + if (pMatter == null) + return false; + A3DVECTOR3 vDelta = pMatter.GetPos() - GetPos(); + fDist = A3d_Magnitude(vDelta); + } + else + { + return false; + } - //// Helper method overload without object output - //public bool CalcDist(int idObject, ref float pfDist) - //{ - // CECObject pObject; - // return CalcDist(idObject, ref pfDist, out pObject); - //} + pfDist = fDist; + return true; + } + + // Helper method overload without object output + public bool CalcDist(int idObject, out float pfDist) + { + CECObject pObject; + return CalcDist(idObject, out pfDist, out pObject); + } //// ID checking helper methods //private bool ISNPCID(int id) => ((id & 0x80000000) != 0) && ((id & 0x40000000) == 0); //private bool ISPLAYERID(int id) => id != 0 && (id & 0x80000000) == 0; //private bool ISMATTERID(int id) => ((id) & 0xC0000000) == 0xC0000000; + + + public bool IsPlayerMoving() + { + return m_pWorkMan.IsMoving(); + } + public CECComboSkill GetComboSkill() { return m_pComboSkill; } + + } + public struct SkillShortCutConfig + { + public int setNum; + public int slotNum; + public int skillId; + }; + + public struct SkillGrpShortCutConfig + { + public int setNum; + public int slotNum; + public int groupIndex; + }; + public sealed class CECHPTraceSpellMatcher : CECHPWorkMatcher + { + public override bool Match(CECHPWork pWork, int priority, bool isDelayWork) + { + if (pWork == null) return false; + if (pWork.GetWorkID() != Host_work_ID.WORK_TRACEOBJECT) return false; + + // dynamic_cast(pWork) trong C# + if (pWork is not CECHPWorkTrace trace) return false; + + return trace.GetTraceReason() == Trace_reason.TRACE_SPELL; + } } } diff --git a/Assets/Scripts/CECUIManager.cs b/Assets/Scripts/CECUIManager.cs index aa099bab68..87799c95de 100644 --- a/Assets/Scripts/CECUIManager.cs +++ b/Assets/Scripts/CECUIManager.cs @@ -4,6 +4,7 @@ using BrewMonster.UI; using CSNetwork; using System; using System.Collections.Generic; +using BrewMonster.Scripts.Managers; using UnityEngine; using UnityEngine.UI; using UnityEngine.UIElements; @@ -25,6 +26,7 @@ public class CECUIManager : MonoSingleton [SerializeField] private UnityEngine.UI.Button btnSecondClick; [SerializeField] CDlgQuickBar m_pDlgQuickBar1; + public CDlgSkillSubOther m_pDlgSkillSubOther; CDlgMessageBox m_pDlgMessageBox; public CDlgSkillAction m_pDlgSkillAction; @@ -107,7 +109,12 @@ public class CECUIManager : MonoSingleton var msgBox = GetInGameUIMan().GetDialog("DlgMessageBox") as CDlgMessageBox; if (msgBox != null) { - msgBox.ShowMessageBox(title, message); + msgBox.ShowMessageBox(new MessageBoxData() + { + Title = title, + Message = message, + MessageBoxType = MessageBoxType.YesButton + }); return msgBox; } else @@ -183,6 +190,25 @@ public class CECUIManager : MonoSingleton } } + else if(string.CompareOrdinal("Game_Disenchase",pDlg.GetName())==0 && DialogBoxCommandIDs.IDOK == iRetVal) + { + // PAUIDIALOG pMsgBox; + var clearEmbeddedChipDlg = GetInGameUIMan().GetDialog("Game_Disenchase"); + // EC_IvtrItem pIvtr = (EC_IvtrItem)m_pDlgUninstall->m_pItema->GetDataPtr("ptr_CECIvtrItem"); + // + // pSession.c2s_CmdNPCSevClearEmbeddedChip( + // (WORD)m_pDlgUninstall->m_pItema->GetData(), pIvtr->GetTemplateID()); + // + // m_pDlgUninstall->Show(false); + // pHost->EndNPCService(); + // m_pCurNPCEssence = NULL; + // m_pDlgInventory->Show(false); + // pHost->GetPack(IVTRTYPE_PACK)->UnfreezeAllItems(); + // + // MessageBox("", GetStringFromTable(228), MB_OK, + // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox->SetLife(3); + } } private bool OnNewMessageBox(int iRetVal) diff --git a/Assets/Scripts/EC_Utility.cs b/Assets/Scripts/EC_Utility.cs index 19d370eb96..d04c53e898 100644 --- a/Assets/Scripts/EC_Utility.cs +++ b/Assets/Scripts/EC_Utility.cs @@ -3,6 +3,7 @@ using BrewMonster.Network; using CSNetwork.GPDataType; using System; using System.Collections; +using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Runtime.InteropServices; @@ -68,6 +69,7 @@ public static class EC_Utility Marshal.FreeHGlobal(ptr); } } + public static A3DVECTOR3 glb_DecompressDirH(byte byDir) { const float fInter = 360.0f / 256.0f; @@ -84,6 +86,27 @@ public static class EC_Utility { return new System.Numerics.Vector3(v.x, v.y, v.z); } + public static byte glb_BuildRefuseBLSMask() + { + byte byMask = 0; + + // const EC_GAME_SETTING &gs = g_pGame->GetConfigs()->GetGameSettings(); + var gs = EC_Game.GetConfigs().GetGameSettings(); + + if (gs.bBlsRefuse_Neutral) + byMask |= (byte)REFUSE_BLESS_MASK.REFUSE_NEUTRAL_BLESS; + + if (gs.bBlsRefuse_NonTeammate) + byMask |= (byte)REFUSE_BLESS_MASK.REFUSE_NON_TEAMMATE_BLESS; + + return byMask; + } + public static void Swap(List arr, int a, int b) + { + T tmp = arr[a]; + arr[a] = arr[b]; + arr[b] = tmp; + } public static A3DVECTOR3 ToA3DVECTOR3(this UnityEngine.Vector3 v) { a3DVECTOR.Clear(); @@ -148,20 +171,20 @@ public static class EC_Utility byte byMask = 0; CECConfigs pConfigs = EC_Game.GetConfigs(); - /* if (pConfigs->GetGameSettings().bBls_NoRed) - byMask |= GP_BLSMASK_NORED; + /* if (pConfigs->GetGameSettings().bBls_NoRed) + byMask |= GP_BLSMASK_NORED; - if (pConfigs->GetGameSettings().bBls_NoMafia) - byMask |= GP_BLSMASK_NOMAFIA; + if (pConfigs->GetGameSettings().bBls_NoMafia) + byMask |= GP_BLSMASK_NOMAFIA; - if (pConfigs->GetGameSettings().bBls_Self) - byMask |= GP_BLSMASK_SELF; + if (pConfigs->GetGameSettings().bBls_Self) + byMask |= GP_BLSMASK_SELF; - if (pConfigs->GetGameSettings().bBls_NoAlliance) - byMask |= GP_BLSMASK_NOALLIANCE; + if (pConfigs->GetGameSettings().bBls_NoAlliance) + byMask |= GP_BLSMASK_NOALLIANCE; - if (pConfigs->GetGameSettings().bBls_NoForce) - byMask |= GP_BLSMASK_NOFORCE;*/ + if (pConfigs->GetGameSettings().bBls_NoForce) + byMask |= GP_BLSMASK_NOFORCE;*/ return byMask; } diff --git a/Assets/Scripts/Utilities/EC_Resource.cs b/Assets/Scripts/Utilities/EC_Resource.cs index e45e849346..aab6429f61 100644 --- a/Assets/Scripts/Utilities/EC_Resource.cs +++ b/Assets/Scripts/Utilities/EC_Resource.cs @@ -28,6 +28,7 @@ namespace BrewMonster "程åºè”å…¥/金叿•ˆæžœ.gfx", // RES_GFX_ITEMFLASH, "程åºè”å…¥/鼠标悬浮.gfx", // RES_GFX_CURSORHOVER, "程åºè”å…¥/目标被选中.gfx", // RES_GFX_SELECTED, + "程åºè”å…¥/目标被选中.gfx", // RES_GFX_SELECTED, "程åºè”å…¥/海底飘尘.gfx", // RES_GFX_FLOATING_DUST, "程åºè”å…¥/人物游动水圈.gfx", // RES_GFX_WATER_WAVE_STILL, "程åºè”å…¥/人物游动水波.gfx", // RES_GFX_WATER_WAVE_MOVE, @@ -51,7 +52,73 @@ namespace BrewMonster "人物/通用/其它/境界æå‡.gfx", "策划è”å…¥/çŠ¶æ€æ•ˆæžœ/æ–—æ°”%d级.gfx", }; - + public static string res_IconFile(int n) + { + return l_aIconFiles[n]; + } + + public static readonly string[] l_aIconFiles = + { + "打å", + "走跑转æ¢", + "普通攻击", + "寻找目标", + "å助攻击", + + "邀请加入", + "脱离队ä¼", + "踢出队ä¼", + "寻找队ä¼", + "交易命令", + + "摆摊å–", + "摆摊买", + "邀请加入", + "飞行", + "招手", // RES_ICON_CMD_EXP_WAVE, + + "点头", // RES_ICON_CMD_EXP_NOD, + "摇头", // RES_ICON_CMD_EXP_SHAKEHEAD, + "耸肩膀", // RES_ICON_CMD_EXP_SHRUG, + "大笑", // RES_ICON_CMD_EXP_LAUGH, + "生气", // RES_ICON_CMD_EXP_ANGRY, + + "晕倒", // RES_ICON_CMD_EXP_STUN, + "沮丧", // RES_ICON_CMD_EXP_DEPRESSED, + "飞å»", // RES_ICON_CMD_EXP_KISSHAND, + "害羞", // RES_ICON_CMD_EXP_SHY, + "抱拳", // RES_ICON_CMD_EXP_SALUTE, + + "å下", // RES_ICON_CMD_EXP_SITDOWN, + "冲锋", // RES_ICON_CMD_EXP_ASSAULT, + "æ€è€ƒ", // RES_ICON_CMD_EXP_THINK, + "挑衅", // RES_ICON_CMD_EXP_DEFIANCE, + "胜利", // RES_ICON_CMD_EXP_VICTORY, + + "伸懒腰", // RES_ICON_CMD_EXP_GAPE + "亲å»", // RES_ICON_CMD_EXP_KISS + "战斗", // RES_ICON_CMD_EXP_FIGHT, + "攻击1", // RES_ICON_CMD_EXP_ATTACK1, + "攻击2", // RES_ICON_CMD_EXP_ATTACK2, + + "攻击3", // RES_ICON_CMD_EXP_ATTACK3, + "攻击4", // RES_ICON_CMD_EXP_ATTACK4, + "防御", // RES_ICON_CMD_EXP_DEFENCE, + "摔倒", // RES_ICON_CMD_EXP_FALL, + "倒地", // RES_ICON_CMD_EXP_FALLONGROUND, + + "张望", // RES_ICON_CMD_EXP_LOOKAROUND, + "舞蹈1", // RES_ICON_CMD_EXP_DANCE, + "舞蹈2", // RES_ICON_CMD_EXP_FASHIONWEAPON + "拾å–", // RES_ICON_CMD_PICKUP + "挖掘", // RES_ICON_CMD_GATHER + "加速飞行", // RES_ICON_CMD_RUSHFLY + + "相ä¾ç›¸åŽçš„动作", // RES_ICON_CMD_BINDBUDDY + "亲亲密密的动作", // RES_ICON_CMD_TWOKISS + "跳跃的动作1", // RES_ICON_CMD_JUMPTRICK, + "跳跃的动作2", // RES_ICON_CMD_RUNTRICK, +}; public static string res_GFXFile(int n) { if (n < 0 || n >= l_aGFXFiles.Length) @@ -78,7 +145,7 @@ namespace BrewMonster NUM_RES_CURSOR, } -// GFX resource + // GFX resource enum GfxResourceType { RES_GFX_LEVELUP = 0, @@ -113,11 +180,11 @@ namespace BrewMonster NUM_RES_GFX, }; -// Sound resource + // Sound resource -// Texture resource + // Texture resource -// Shader resource + // Shader resource enum ShaderResourceType { RES_SHD_HAIR = 0, @@ -134,8 +201,7 @@ namespace BrewMonster NUM_RES_SHADER, // 10 }; - -// Icon resource + // Icon resource enum IconResourceType { RES_ICON_CMD_SITDOWN = 0, @@ -201,7 +267,7 @@ namespace BrewMonster NUM_RES_ICON, }; -// Model resource + // Model resource enum ModelResourceType { RES_MOD_GOLD = 0, @@ -266,7 +332,7 @@ namespace BrewMonster NUM_RES_MODEL, }; -// model file for change shape 2 + // model file for change shape 2 enum ResourceModelType { RES_MOD_CHANGESAHPE_NULL, // 0 @@ -290,7 +356,7 @@ namespace BrewMonster RES_MOD_FORCHANGESAHPE_NUM, }; -// Some unicode string resources + // Some unicode string resources enum UnicodeStringResourceType { RES_FONT_TITLE = 0, diff --git a/Assets/Tech3C.meta b/Assets/Tech3C.meta new file mode 100644 index 0000000000..b197cdb0af --- /dev/null +++ b/Assets/Tech3C.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 86378052e9798924e8ee14f4fa780f0f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Plugins.meta b/Assets/Tech3C/Plugins.meta new file mode 100644 index 0000000000..9c87ae31f2 --- /dev/null +++ b/Assets/Tech3C/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4c935d070fff35741adebc5424c4e02b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Plugins/Android.meta b/Assets/Tech3C/Plugins/Android.meta new file mode 100644 index 0000000000..f279ada1af --- /dev/null +++ b/Assets/Tech3C/Plugins/Android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2111256da5c2b2a469d98ce0f103cdb7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Plugins/Android/Tech3CUnityBridge.java b/Assets/Tech3C/Plugins/Android/Tech3CUnityBridge.java new file mode 100644 index 0000000000..6dd99c4ee8 --- /dev/null +++ b/Assets/Tech3C/Plugins/Android/Tech3CUnityBridge.java @@ -0,0 +1,184 @@ +package vn.tech3c.sdk.unity; + +import android.util.Log; + +import vn.tech3c.sdk.auth.callback.OnAuthCallback; +import vn.tech3c.sdk.auth.controller.Tech3CIdController; +import vn.tech3c.sdk.auth.entities.enums.LoginType; +import vn.tech3c.sdk.auth.exceptions.Tech3CIdException; + +import com.unity3d.player.UnityPlayer; + +/** + * Unity Bridge for Tech3C SDK + * This class receives callbacks from Tech3C SDK and sends them to Unity via UnitySendMessage + */ +public class Tech3CUnityBridge implements OnAuthCallback { + private static final String TAG = "Tech3CUnityBridge"; + private static final String UNITY_GAME_OBJECT = "Tech3CSDKBridge"; + + private static Tech3CUnityBridge instance; + + private OnUnityAuthCallback unityAuthCallback; + private OnUnityLogoutCallback unityLogoutCallback; + private OnUnityUserInfoCallback unityUserInfoCallback; + + // Singleton + public static synchronized Tech3CUnityBridge getInstance() { + if (instance == null) { + instance = new Tech3CUnityBridge(); + } + return instance; + } + + // Interfaces for Unity callbacks + public interface OnUnityAuthCallback { + void onAuthSuccess(String userId, String password, String accessToken, String refreshToken, LoginType loginType, long expiryTime); + void onAuthCancelled(); + void onAuthError(int errorCode, String errorMessage); + } + + public interface OnUnityLogoutCallback { + void onLogoutSuccess(); + void onLogoutError(int errorCode, String errorMessage); + } + + public interface OnUnityUserInfoCallback { + void onUserInfoReceived(String userId, String username, String email, String phone); + void onUserInfoCancelled(); + void onUserInfoError(int errorCode, String errorMessage); + } + + // Set callbacks + public void setUnityAuthCallback(OnUnityAuthCallback callback) { + this.unityAuthCallback = callback; + } + + public void setUnityLogoutCallback(OnUnityLogoutCallback callback) { + this.unityLogoutCallback = callback; + } + + public void setUnityUserInfoCallback(OnUnityUserInfoCallback callback) { + this.unityUserInfoCallback = callback; + } + + // Send message to Unity + private void sendToUnity(String methodName, String message) { + try { + UnityPlayer.UnitySendMessage(UNITY_GAME_OBJECT, methodName, message); + Log.d(TAG, "Sent to Unity: " + methodName + " - " + message); + } catch (Exception e) { + Log.e(TAG, "Error sending to Unity: " + e.getMessage()); + } + } + + // ========== OnAuthCallback Implementation ========== + + @Override + public void onLoginSuccess(String userId, String password, String accessToken, String refreshToken, LoginType loginType, long expiryTime) { + Log.d(TAG, "onLoginSuccess: " + userId); + + // Send to Unity + String message = userId + "|" + password + "|" + accessToken + "|" + refreshToken + "|" + loginType.name() + "|" + expiryTime; + sendToUnity("OnAuthSuccess", message); + + // Also call Unity callback if set + if (unityAuthCallback != null) { + unityAuthCallback.onAuthSuccess(userId, password, accessToken, refreshToken, loginType, expiryTime); + } + } + + @Override + public void onRegisterSuccess(String accessToken, String refreshToken, String userId, long expiryTime) { + Log.d(TAG, "onRegisterSuccess: " + userId); + + // Treat register success as auth success (password is empty for register) + String message = userId + "|" + "" + "|" + accessToken + "|" + refreshToken + "|REGISTER|" + expiryTime; + sendToUnity("OnAuthSuccess", message); + + if (unityAuthCallback != null) { + unityAuthCallback.onAuthSuccess(userId, "", accessToken, refreshToken, LoginType.ACCOUNT, expiryTime); + } + } + + @Override + public void onAuthCancelled() { + Log.d(TAG, "onAuthCancelled"); + sendToUnity("OnAuthCancelled", ""); + + if (unityAuthCallback != null) { + unityAuthCallback.onAuthCancelled(); + } + } + + @Override + public void onAuthScreenOpened() { + Log.d(TAG, "onAuthScreenOpened"); + // Optional: Send to Unity if needed + } + + @Override + public void onError(Tech3CIdException exception) { + Log.d(TAG, "onError: " + exception.getMessage()); + + String message = exception.getErrorCode() + "|" + exception.getMessage(); + sendToUnity("OnAuthError", message); + + if (unityAuthCallback != null) { + unityAuthCallback.onAuthError(exception.getErrorCode(), exception.getMessage()); + } + } + + // ========== Additional Callback Methods ========== + + public void onLogoutSuccess() { + Log.d(TAG, "onLogoutSuccess"); + sendToUnity("OnLogoutSuccess", ""); + + if (unityLogoutCallback != null) { + unityLogoutCallback.onLogoutSuccess(); + } + } + + public void onLogoutError(int errorCode, String errorMessage) { + Log.d(TAG, "onLogoutError: " + errorMessage); + + String message = errorCode + "|" + errorMessage; + sendToUnity("OnLogoutError", message); + + if (unityLogoutCallback != null) { + unityLogoutCallback.onLogoutError(errorCode, errorMessage); + } + } + + public void onUserInfoReceived(String userId, String username, String email, String phone) { + Log.d(TAG, "onUserInfoReceived: " + userId); + + String message = userId + "|" + username + "|" + email + "|" + phone; + sendToUnity("OnUserInfoReceived", message); + + if (unityUserInfoCallback != null) { + unityUserInfoCallback.onUserInfoReceived(userId, username, email, phone); + } + } + + public void onUserInfoCancelled() { + Log.d(TAG, "onUserInfoCancelled"); + sendToUnity("OnUserInfoCancelled", ""); + + if (unityUserInfoCallback != null) { + unityUserInfoCallback.onUserInfoCancelled(); + } + } + + public void onUserInfoError(int errorCode, String errorMessage) { + Log.d(TAG, "onUserInfoError: " + errorMessage); + + String message = errorCode + "|" + errorMessage; + sendToUnity("OnUserInfoError", message); + + if (unityUserInfoCallback != null) { + unityUserInfoCallback.onUserInfoError(errorCode, errorMessage); + } + } +} diff --git a/Assets/Tech3C/Plugins/Android/Tech3CUnityBridge.java.meta b/Assets/Tech3C/Plugins/Android/Tech3CUnityBridge.java.meta new file mode 100644 index 0000000000..6f929e7398 --- /dev/null +++ b/Assets/Tech3C/Plugins/Android/Tech3CUnityBridge.java.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: e32ed25f4a2155a4f8106c56c82bb7fc +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Plugins/Android/auth-1.2.1.aar b/Assets/Tech3C/Plugins/Android/auth-1.2.1.aar new file mode 100644 index 0000000000..b972ff9123 Binary files /dev/null and b/Assets/Tech3C/Plugins/Android/auth-1.2.1.aar differ diff --git a/Assets/Tech3C/Plugins/Android/auth-1.2.1.aar.meta b/Assets/Tech3C/Plugins/Android/auth-1.2.1.aar.meta new file mode 100644 index 0000000000..26ca9658d7 --- /dev/null +++ b/Assets/Tech3C/Plugins/Android/auth-1.2.1.aar.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3385cda9ff7dcd74ebc47f50d2e8196c \ No newline at end of file diff --git a/Assets/Tech3C/Plugins/Android/gradle.properties b/Assets/Tech3C/Plugins/Android/gradle.properties new file mode 100644 index 0000000000..646c51b977 --- /dev/null +++ b/Assets/Tech3C/Plugins/Android/gradle.properties @@ -0,0 +1,2 @@ +android.useAndroidX=true +android.enableJetifier=true diff --git a/Assets/Tech3C/Plugins/Android/gradle.properties.meta b/Assets/Tech3C/Plugins/Android/gradle.properties.meta new file mode 100644 index 0000000000..235ab6ba4b --- /dev/null +++ b/Assets/Tech3C/Plugins/Android/gradle.properties.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5b51400b9b30374459987374d5fb2a0a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Plugins/Android/mainTemplate.gradle b/Assets/Tech3C/Plugins/Android/mainTemplate.gradle new file mode 100644 index 0000000000..d5267dce20 --- /dev/null +++ b/Assets/Tech3C/Plugins/Android/mainTemplate.gradle @@ -0,0 +1,43 @@ +apply plugin: 'com.android.library' +**APPLY_PLUGINS** + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "androidx.appcompat:appcompat:1.6.1" + implementation "com.google.android.material:material:1.11.0" +**DEPS**} + +android { + namespace "com.unity3d.player" + ndkPath "**NDKPATH**" + compileSdkVersion **APIVERSION** + buildToolsVersion '**BUILDTOOLS**' + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + defaultConfig { + minSdkVersion **MINSDKVERSION** + targetSdkVersion **TARGETSDKVERSION** + ndk { + abiFilters **ABIFILTERS** + } + versionCode **VERSIONCODE** + versionName '**VERSIONNAME**' + consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD** + } + + lintOptions { + abortOnError false + } + + aaptOptions { + noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ') + ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~" + }**PACKAGING_OPTIONS** +} +**IL_CPP_BUILD_SETUP** +**SOURCE_BUILD_SETUP** +**EXTERNAL_SOURCES** diff --git a/Assets/Tech3C/Plugins/Android/mainTemplate.gradle.meta b/Assets/Tech3C/Plugins/Android/mainTemplate.gradle.meta new file mode 100644 index 0000000000..8ce6936aca --- /dev/null +++ b/Assets/Tech3C/Plugins/Android/mainTemplate.gradle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 68ef4c077c6bfee47ad1aa16645a896d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Plugins/Android/proguard-user.txt b/Assets/Tech3C/Plugins/Android/proguard-user.txt new file mode 100644 index 0000000000..6b42f31f02 --- /dev/null +++ b/Assets/Tech3C/Plugins/Android/proguard-user.txt @@ -0,0 +1,30 @@ +#### Proguard class tech3c +-keep public class vn.tech3c.sdk.auth.entities.* { + public *; +} +-keep public class vn.tech3c.sdk.auth.entities.enums.* { + public *; +} +-keep public class vn.tech3c.sdk.auth.entities.response.* { + public *; +} +-keep public class vn.tech3c.sdk.auth.entities.request.* { + public *; +} + +-keep public interface vn.tech3c.sdk.auth.** { *; } + +-keep public class vn.tech3c.sdk.auth.controller.Tech3CIdController { public *;} +-keep public class vn.tech3c.sdk.auth.exceptions.Tech3CIdException { public *;} + +-keep public class vn.tech3c.sdk.auth.Tech3CIdAuthentication { + public *; +} + +-keep public class vn.tech3c.sdk.auth.config.Tech3CIdConfig { + public *; +} + +-keep public class vn.tech3c.sdk.example.Tech3CUnityBridge { public *;} +-keep public class vn.tech3c.sdk.example.Tech3CUnityBridge$** { *; } + diff --git a/Assets/Tech3C/Plugins/Android/proguard-user.txt.meta b/Assets/Tech3C/Plugins/Android/proguard-user.txt.meta new file mode 100644 index 0000000000..6b05d1673c --- /dev/null +++ b/Assets/Tech3C/Plugins/Android/proguard-user.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0a1d44356c1df074d8cd78bee53cbafa +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Runtime.meta b/Assets/Tech3C/Runtime.meta new file mode 100644 index 0000000000..8c1c38fee8 --- /dev/null +++ b/Assets/Tech3C/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c5469f93c69421146854ce74deba7931 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Runtime/Tech3CAndroidBridge.cs b/Assets/Tech3C/Runtime/Tech3CAndroidBridge.cs new file mode 100644 index 0000000000..c781c13e3c --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CAndroidBridge.cs @@ -0,0 +1,452 @@ +using UnityEngine; +using System; + +namespace Tech3C +{ + /// + /// Bridge class for Android platform to communicate with Tech3C native SDK + /// + public class Tech3CAndroidBridge : ITech3CNativeBridge + { + private const string CLASS_NAME = "vn.tech3c.sdk.auth.controller.Tech3CIdController"; + private const string BRIDGE_CLASS = "vn.tech3c.sdk.unity.Tech3CUnityBridge"; + + private AndroidJavaObject controller; + private AndroidJavaObject unityBridge; + + /// + /// Initialize the Tech3C SDK + /// + public void Initialize(string clientId, string clientSecret, Tech3CConfig config) + { + try + { + Debug.Log("[Tech3C] Bridge GameObject initialized"); + + // Initialize Unity Bridge for callbacks first + using (AndroidJavaClass bridgeClass = new AndroidJavaClass(BRIDGE_CLASS)) + { + unityBridge = bridgeClass.CallStatic("getInstance"); + } + + // Initialize controller with method chaining to set callback + if (controller == null) + { + using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) + using (AndroidJavaObject activity = unityPlayer.GetStatic("currentActivity")) + using (AndroidJavaClass controllerClass = new AndroidJavaClass(CLASS_NAME)) + { + // Chain methods like MainActivity: initialize() -> setDebug() -> setOnAuthCallback() + controller = controllerClass.CallStatic( + "initialize", + activity, + clientId, + clientSecret + ) + // .Call("setDebug", true) + // .Call("setDisableExitLogin", false) + // .Call("setEnableMaintenanceCheck", true) + .Call("setOnAuthCallback", unityBridge); + + Debug.Log("[Tech3C] Unity Bridge registered with native SDK"); + } + } + + if (controller != null) + { + // Apply configuration + ApplyConfig(config); + Debug.Log("[Tech3C] Initialized successfully"); + } + else + { + Debug.LogError("[Tech3C] Failed to initialize controller"); + } + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] Initialize error: {e.Message}"); + } + } + + /// + /// Apply configuration settings to the SDK + /// + private void ApplyConfig(Tech3CConfig config) + { + if (controller == null || config == null) return; + + try + { + // Set debug mode (returns Tech3CIdController for chaining) + controller = controller.Call("setDebug", config.debugMode); + + // Set language - pass Java Language enum + using (AndroidJavaClass languageEnumClass = new AndroidJavaClass("vn.tech3c.sdk.auth.entities.enums.Language")) + { + string javaEnumValue = config.language == Language.Vietnamese ? "VIETNAMESE" : "ENGLISH"; + AndroidJavaObject javaLanguage = languageEnumClass.GetStatic(javaEnumValue); + controller = controller.Call("setLanguageDisplay", javaLanguage); + } + + // Set UI mode - pass Java UiMode enum + using (AndroidJavaClass uiModeEnumClass = new AndroidJavaClass("vn.tech3c.sdk.auth.entities.enums.UiMode")) + { + string javaEnumValue = config.uiMode == UiMode.Fullscreen ? "FULLSCREEN" : "DIALOG"; + AndroidJavaObject javaUiMode = uiModeEnumClass.GetStatic(javaEnumValue); + controller = controller.Call("setUiMode", javaUiMode); + } + + // Set orientation - pass Java OrientationMode enum + using (AndroidJavaClass orientationEnumClass = new AndroidJavaClass("vn.tech3c.sdk.auth.entities.enums.OrientationMode")) + { + string javaEnumValue = config.screenOrientation.ToString().ToUpper(); + AndroidJavaObject javaOrientation = orientationEnumClass.GetStatic(javaEnumValue); + controller = controller.Call("setOrientation", javaOrientation); + } + + // Set guest login + controller = controller.Call("setEnableGuestLogin", config.enableGuestLogin); + + // Set OTP requirement + controller = controller.Call("setRequireOtp", config.requireOtp); + + // Set disable exit login + controller = controller.Call("setDisableExitLogin", config.disableExitLogin); + + // Set maintenance check + controller = controller.Call("setEnableMaintenanceCheck", config.enableMaintenanceCheck); + + if (!string.IsNullOrEmpty(config.maintenanceCheckUrl)) + { + controller = controller.Call("setMaintenanceCheckUrl", config.maintenanceCheckUrl); + } + + if (!string.IsNullOrEmpty(config.serverIp)) + { + controller = controller.Call("setIpMaintenanceCheck", config.serverIp); + } + + Debug.Log("[Tech3C] Configuration applied successfully"); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] ApplyConfig error: {e.Message}"); + } + } + + /// + /// Show authentication screen + /// + public void ShowAuth(IAuthCallback callback) + { + try + { + if (controller == null) + { + Debug.LogError("[Tech3C] Controller not initialized"); + callback?.OnAuthError(-1, "SDK not initialized"); + return; + } + + // Register callback with bridge + Tech3CSDKBridge.SetAuthCallback(callback); + + using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) + using (AndroidJavaObject activity = unityPlayer.GetStatic("currentActivity")) + { + controller.Call("showAuth", activity); + Debug.Log("[Tech3C] Auth screen shown"); + } + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] ShowAuth error: {e.Message}"); + callback?.OnAuthError(-1, e.Message); + } + } + + /// + /// Logout current user + /// + public void Logout(ILogoutCallback callback) + { + try + { + if (controller == null) + { + Debug.LogError("[Tech3C] Controller not initialized"); + callback?.OnLogoutError(-1, "SDK not initialized"); + return; + } + + // Register callback with bridge + Tech3CSDKBridge.SetLogoutCallback(callback); + + controller.Call("logout"); + Debug.Log("[Tech3C] Logout initiated"); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] Logout error: {e.Message}"); + callback?.OnLogoutError(-1, e.Message); + } + } + + /// + /// Get user information + /// + public void GetUserInfo(IUserInfoCallback callback) + { + try + { + if (controller == null) + { + Debug.LogError("[Tech3C] Controller not initialized"); + callback?.OnUserInfoError(-1, "SDK not initialized"); + return; + } + + // Register callback with bridge + Tech3CSDKBridge.SetUserInfoCallback(callback); + + controller.Call("getUserInfo"); + Debug.Log("[Tech3C] GetUserInfo called"); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] GetUserInfo error: {e.Message}"); + callback?.OnUserInfoError(-1, e.Message); + } + } + + /// + /// Check if user is logged in + /// + public bool IsLoggedIn() + { + try + { + if (controller == null) return false; + + return controller.Call("isLogin"); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] IsLoggedIn error: {e.Message}"); + return false; + } + } + + /// + /// Get access token + /// + public string GetAccessToken() + { + try + { + if (controller == null) return null; + + return controller.Call("getAccessToken"); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] GetAccessToken error: {e.Message}"); + return null; + } + } + + /// + /// Get refresh token + /// + public string GetRefreshToken() + { + try + { + if (controller == null) return null; + + return controller.Call("getRefreshToken"); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] GetRefreshToken error: {e.Message}"); + return null; + } + } + + /// + /// Get user ID + /// + public string GetUserId() + { + try + { + if (controller == null) return null; + + return controller.Call("getUserId"); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] GetUserId error: {e.Message}"); + return null; + } + } + + /// + /// Get device ID + /// + public string GetDeviceId() + { + try + { + if (controller == null) return null; + + return controller.Call("getDeviceId"); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] GetDeviceId error: {e.Message}"); + return null; + } + } + + /// + /// Get login time + /// + public long GetLoginTime() + { + try + { + if (controller == null) return 0; + + return controller.Call("getLoginTime"); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] GetLoginTime error: {e.Message}"); + return 0; + } + } + + /// + /// Get token expiry time + /// + public long GetTokenExpiry() + { + try + { + if (controller == null) return 0; + + return controller.Call("getTokenExpiry"); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] GetTokenExpiry error: {e.Message}"); + return 0; + } + } + + /// + /// Check if token is expired + /// + public bool IsTokenExpired() + { + try + { + if (controller == null) return false; + + return controller.Call("isTokenExpired"); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] IsTokenExpired error: {e.Message}"); + return false; + } + } + + /// + /// Set language + /// + public void SetLanguage(Language language) + { + try + { + if (controller == null) return; + + // Set language - pass Java Language enum + using (AndroidJavaClass languageEnumClass = new AndroidJavaClass("vn.tech3c.sdk.auth.entities.enums.Language")) + { + string javaEnumValue = language == Language.Vietnamese ? "VIETNAMESE" : "ENGLISH"; + AndroidJavaObject javaLanguage = languageEnumClass.GetStatic(javaEnumValue); + controller = controller.Call("setLanguageDisplay", javaLanguage); + } + Debug.Log($"[Tech3C] Language set to {language}"); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] SetLanguage error: {e.Message}"); + } + } + + /// + /// Set debug mode + /// + public void SetDebug(bool debug) + { + try + { + if (controller == null) return; + + controller = controller.Call("setDebug", debug); + Debug.Log($"[Tech3C] Debug mode set to {debug}"); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] SetDebug error: {e.Message}"); + } + } + + /// + /// Cleanup resources + /// + public void Cleanup() + { + try + { + if (controller != null) + { + controller.Call("cleanup"); + controller.Dispose(); + controller = null; + Debug.Log("[Tech3C] Cleanup completed"); + } + } + catch (Exception e) + { + Debug.LogError($"[Tech3C] Cleanup error: {e.Message}"); + } + } + } + + /// + /// Interface for native bridge implementations + /// + public interface ITech3CNativeBridge + { + void Initialize(string clientId, string clientSecret, Tech3CConfig config); + void ShowAuth(IAuthCallback callback); + void Logout(ILogoutCallback callback); + void GetUserInfo(IUserInfoCallback callback); + bool IsLoggedIn(); + string GetAccessToken(); + string GetRefreshToken(); + string GetUserId(); + string GetDeviceId(); + long GetLoginTime(); + long GetTokenExpiry(); + bool IsTokenExpired(); + void SetLanguage(Language language); + void SetDebug(bool debug); + void Cleanup(); + } +} diff --git a/Assets/Tech3C/Runtime/Tech3CAndroidBridge.cs.meta b/Assets/Tech3C/Runtime/Tech3CAndroidBridge.cs.meta new file mode 100644 index 0000000000..937d79ca0b --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CAndroidBridge.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 50744a202f3e9e24a80e10aecf427dac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Runtime/Tech3CCallbacks.cs b/Assets/Tech3C/Runtime/Tech3CCallbacks.cs new file mode 100644 index 0000000000..7f40b826a3 --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CCallbacks.cs @@ -0,0 +1,150 @@ +using System; + +namespace Tech3C +{ + /// + /// Callback for authentication operations (login, register, etc.) + /// + public interface IAuthCallback + { + /// + /// Called when authentication is successful + /// + /// The authenticated user ID + /// The user password + /// The access token + /// The refresh token + /// The type of login used + /// Token expiry timestamp + void OnAuthSuccess(string userId, string password, string accessToken, string refreshToken, LoginType loginType, long expiryTime); + + /// + /// Called when authentication is cancelled by the user + /// + void OnAuthCancelled(); + + /// + /// Called when an error occurs during authentication + /// + /// The error code + /// The error message + void OnAuthError(int errorCode, string errorMessage); + } + + /// + /// Callback for logout operations + /// + public interface ILogoutCallback + { + /// + /// Called when logout is successful + /// + void OnLogoutSuccess(); + + /// + /// Called when an error occurs during logout + /// + /// The error code + /// The error message + void OnLogoutError(int errorCode, string errorMessage); + } + + /// + /// Callback for user info operations + /// + public interface IUserInfoCallback + { + /// + /// Called when user info is successfully retrieved + /// + /// The user ID + /// The username + /// The email address + /// The phone number + void OnUserInfoReceived(string userId, string username, string email, string phone); + + /// + /// Called when user info retrieval is cancelled + /// + void OnUserInfoCancelled(); + + /// + /// Called when an error occurs while retrieving user info + /// + /// The error code + /// The error message + void OnUserInfoError(int errorCode, string errorMessage); + } + + /// + /// Default implementation of IAuthCallback using Unity events + /// + [Serializable] + public class AuthCallback : IAuthCallback + { + public event Action OnAuthSuccessEvent; + public event Action OnAuthCancelledEvent; + public event Action OnAuthErrorEvent; + + public void OnAuthSuccess(string userId, string password, string accessToken, string refreshToken, LoginType loginType, long expiryTime) + { + OnAuthSuccessEvent?.Invoke(userId, password, accessToken, refreshToken, loginType, expiryTime); + } + + public void OnAuthCancelled() + { + OnAuthCancelledEvent?.Invoke(); + } + + public void OnAuthError(int errorCode, string errorMessage) + { + OnAuthErrorEvent?.Invoke(errorCode, errorMessage); + } + } + + /// + /// Default implementation of ILogoutCallback using Unity events + /// + [Serializable] + public class LogoutCallback : ILogoutCallback + { + public event Action OnLogoutSuccessEvent; + public event Action OnLogoutErrorEvent; + + public void OnLogoutSuccess() + { + OnLogoutSuccessEvent?.Invoke(); + } + + public void OnLogoutError(int errorCode, string errorMessage) + { + OnLogoutErrorEvent?.Invoke(errorCode, errorMessage); + } + } + + /// + /// Default implementation of IUserInfoCallback using Unity events + /// + [Serializable] + public class UserInfoCallback : IUserInfoCallback + { + public event Action OnUserInfoReceivedEvent; + public event Action OnUserInfoCancelledEvent; + public event Action OnUserInfoErrorEvent; + + public void OnUserInfoReceived(string userId, string username, string email, string phone) + { + OnUserInfoReceivedEvent?.Invoke(userId, username, email, phone); + } + + public void OnUserInfoCancelled() + { + OnUserInfoCancelledEvent?.Invoke(); + } + + public void OnUserInfoError(int errorCode, string errorMessage) + { + OnUserInfoErrorEvent?.Invoke(errorCode, errorMessage); + } + } +} diff --git a/Assets/Tech3C/Runtime/Tech3CCallbacks.cs.meta b/Assets/Tech3C/Runtime/Tech3CCallbacks.cs.meta new file mode 100644 index 0000000000..b7e5fd3738 --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CCallbacks.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ed5aa8a6da34849438530838098c8ca0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Runtime/Tech3CConfig.cs b/Assets/Tech3C/Runtime/Tech3CConfig.cs new file mode 100644 index 0000000000..6d31bb34b2 --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CConfig.cs @@ -0,0 +1,114 @@ +using UnityEngine; + +namespace Tech3C +{ + /// + /// Configuration class for Tech3C SDK + /// + [CreateAssetMenu(fileName = "Tech3CConfig", menuName = "Tech3C SDK/Configuration", order = 1)] + public class Tech3CConfig : ScriptableObject + { + [Header("Client Credentials")] + [Tooltip("Client ID for Tech3C authentication")] + public string clientId; + + [Tooltip("Client Secret for Tech3C authentication")] + public string clientSecret; + + [Header("General Settings")] + [Tooltip("Enable debug mode for detailed logging")] + public bool debugMode = false; + + [Tooltip("Display language for the SDK")] + public Language language = Language.English; + + [Tooltip("Environment for the SDK")] + public Environment environment = Environment.Production; + + [Header("UI Settings")] + [Tooltip("UI mode for authentication (Fullscreen or Dialog)")] + public UiMode uiMode = UiMode.Fullscreen; + + [Tooltip("Dialog size when UI mode is Dialog")] + public DialogSize dialogSize = DialogSize.Medium; + + [Tooltip("Screen orientation for authentication")] + public OrientationMode screenOrientation = OrientationMode.Auto; + + [Tooltip("Disable exit button on login screen")] + public bool disableExitLogin = false; + + [Header("Authentication Settings")] + [Tooltip("Enable guest login")] + public bool enableGuestLogin = false; + + [Tooltip("Require OTP for authentication")] + public bool requireOtp = false; + + [Tooltip("Enable Google login")] + public bool enableGoogleLogin = false; + + [Tooltip("Enable Facebook login")] + public bool enableFacebookLogin = false; + + [Tooltip("Enable Apple login")] + public bool enableAppleLogin = false; + + [Header("Maintenance Settings")] + [Tooltip("Enable maintenance check")] + public bool enableMaintenanceCheck = false; + + [Tooltip("Maintenance check URL")] + public string maintenanceCheckUrl; + + [Tooltip("Server IP for maintenance check")] + public string serverIp; + + [Header("Network Settings")] + [Tooltip("Timeout in seconds for network requests")] + public int timeoutSeconds = 30; + + /// + /// Creates a default Tech3CConfig asset + /// + public static Tech3CConfig CreateDefault() + { + var config = CreateInstance(); + config.clientId = ""; + config.clientSecret = ""; + config.debugMode = false; + config.language = Language.English; + config.environment = Environment.Production; + config.uiMode = UiMode.Fullscreen; + config.dialogSize = DialogSize.Medium; + config.screenOrientation = OrientationMode.Auto; + config.disableExitLogin = false; + config.enableGuestLogin = false; + config.requireOtp = false; + config.enableGoogleLogin = false; + config.enableFacebookLogin = false; + config.enableAppleLogin = false; + config.enableMaintenanceCheck = false; + config.maintenanceCheckUrl = ""; + config.serverIp = ""; + config.timeoutSeconds = 30; + return config; + } + + /// + /// Validates the configuration + /// + public bool IsValid() + { + return !string.IsNullOrEmpty(clientId) && !string.IsNullOrEmpty(clientSecret); + } + + /// + /// Gets the language code string + /// + public string GetLanguageCode() + { + return language == Language.Vietnamese ? "vi" : "en"; + } + } +} diff --git a/Assets/Tech3C/Runtime/Tech3CConfig.cs.meta b/Assets/Tech3C/Runtime/Tech3CConfig.cs.meta new file mode 100644 index 0000000000..39fd2c7efd --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95a442ac7dacf8b4484a10035308bc31 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Runtime/Tech3CEnums.cs b/Assets/Tech3C/Runtime/Tech3CEnums.cs new file mode 100644 index 0000000000..9107769385 --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CEnums.cs @@ -0,0 +1,64 @@ +using System; + +namespace Tech3C +{ + /// + /// Language options for the SDK + /// + public enum Language + { + Vietnamese, + English + } + + /// + /// UI mode for authentication dialog + /// + public enum UiMode + { + Fullscreen, + Dialog + } + + /// + /// Screen orientation for authentication + /// + public enum OrientationMode + { + Auto, + Portrait, + Landscape + } + + /// + /// Login type for authentication + /// Matches the native SDK's LoginType enum + /// + public enum LoginType + { + GUEST, + ACCOUNT, + SOCIAL, + REGISTER // For register success handling + } + + /// + /// Environment for the SDK + /// + public enum Environment + { + Production, + Staging, + Development + } + + /// + /// Dialog size for UI mode + /// + public enum DialogSize + { + Small, + Medium, + Large + } +} diff --git a/Assets/Tech3C/Runtime/Tech3CEnums.cs.meta b/Assets/Tech3C/Runtime/Tech3CEnums.cs.meta new file mode 100644 index 0000000000..0b58d42a40 --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CEnums.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c35f3ea36736dfe439eb6f4b8a314dde +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Runtime/Tech3CSDK.cs b/Assets/Tech3C/Runtime/Tech3CSDK.cs new file mode 100644 index 0000000000..dd9111009a --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CSDK.cs @@ -0,0 +1,473 @@ +using UnityEngine; +using System; + +namespace Tech3C +{ + /// + /// Main API wrapper for Tech3C SDK + /// This is the main entry point for using the SDK in Unity + /// + public class Tech3CSDK : MonoBehaviour + { + private static Tech3CSDK instance; + private ITech3CNativeBridge nativeBridge; + private Tech3CConfig config; + private bool isInitialized = false; + + #region Singleton + + /// + /// Get the singleton instance of Tech3CSDK + /// + public static Tech3CSDK Instance + { + get + { + if (instance == null) + { + GameObject go = new GameObject("Tech3CSDK"); + instance = go.AddComponent(); + DontDestroyOnLoad(go); + } + return instance; + } + } + + private void Awake() + { + if (instance == null) + { + instance = this; + DontDestroyOnLoad(gameObject); + } + else if (instance != this) + { + Destroy(gameObject); + } + } + + #endregion + + #region Initialization + + /// + /// Initialize the Tech3C SDK with configuration + /// + /// The configuration object + public void Initialize(Tech3CConfig config) + { + if (config == null) + { + Debug.LogError("[Tech3C] Config cannot be null"); + return; + } + + if (!config.IsValid()) + { + Debug.LogError("[Tech3C] Invalid config: Client ID and Client Secret are required"); + return; + } + + this.config = config; + + // Ensure Tech3CSDKBridge is created to receive callbacks from native code + var bridge = Tech3CSDKBridge.Instance; + Debug.Log("[Tech3C] Tech3CSDKBridge ensured for callbacks"); + + // Create platform-specific bridge + CreateNativeBridge(); + + if (nativeBridge != null) + { + nativeBridge.Initialize(config.clientId, config.clientSecret, config); + isInitialized = true; + Debug.Log("[Tech3C] Initialization completed successfully"); + } + else + { + Debug.LogError("[Tech3C] Failed to create native bridge"); + } + } + + /// + /// Initialize the Tech3C SDK with client credentials + /// + /// The client ID + /// The client secret + public void Initialize(string clientId, string clientSecret) + { + if (string.IsNullOrEmpty(clientId) || string.IsNullOrEmpty(clientSecret)) + { + Debug.LogError("[Tech3C] Client ID and Client Secret are required"); + return; + } + + config = Tech3CConfig.CreateDefault(); + config.clientId = clientId; + config.clientSecret = clientSecret; + + Initialize(config); + } + + private void CreateNativeBridge() + { + #if UNITY_ANDROID && !UNITY_EDITOR + nativeBridge = new Tech3CAndroidBridge(); + #elif UNITY_IOS && !UNITY_EDITOR + nativeBridge = new Tech3CiOSBridge(); + #else + #if UNITY_ANDROID + nativeBridge = new Tech3CAndroidBridge(); + #elif UNITY_IOS + nativeBridge = new Tech3CiOSBridge(); + #else + Debug.LogWarning("[Tech3C] Running in Editor or unsupported platform. Using mock implementation."); + nativeBridge = new MockBridge(); + #endif + #endif + } + + #endregion + + #region Authentication + + /// + /// Show authentication screen (login/register/forgot password) + /// + /// The callback for authentication result + public void ShowAuth(IAuthCallback callback) + { + if (!isInitialized) + { + Debug.LogError("[Tech3C] SDK not initialized. Call Initialize() first."); + callback?.OnAuthError(-1, "SDK not initialized"); + return; + } + + nativeBridge?.ShowAuth(callback); + } + + /// + /// Show authentication screen without callback + /// + public void ShowAuth() + { + ShowAuth(null); + } + + #endregion + + #region User Management + + /// + /// Logout current user + /// + /// The callback for logout result + public void Logout(ILogoutCallback callback) + { + if (!isInitialized) + { + Debug.LogError("[Tech3C] SDK not initialized. Call Initialize() first."); + callback?.OnLogoutError(-1, "SDK not initialized"); + return; + } + + nativeBridge?.Logout(callback); + } + + /// + /// Logout current user without callback + /// + public void Logout() + { + Logout(null); + } + + /// + /// Get user information + /// + /// The callback for user info result + public void GetUserInfo(IUserInfoCallback callback) + { + if (!isInitialized) + { + Debug.LogError("[Tech3C] SDK not initialized. Call Initialize() first."); + callback?.OnUserInfoError(-1, "SDK not initialized"); + return; + } + + nativeBridge?.GetUserInfo(callback); + } + + /// + /// Get user information without callback + /// + public void GetUserInfo() + { + GetUserInfo(null); + } + + #endregion + + #region State Checkers + + /// + /// Check if user is logged in + /// + public bool IsLoggedIn() + { + if (!isInitialized) + { + Debug.LogWarning("[Tech3C] SDK not initialized"); + return false; + } + + return nativeBridge?.IsLoggedIn() ?? false; + } + + /// + /// Check if access token is expired + /// + public bool IsTokenExpired() + { + if (!isInitialized) + { + Debug.LogWarning("[Tech3C] SDK not initialized"); + return true; + } + + return nativeBridge?.IsTokenExpired() ?? true; + } + + #endregion + + #region Token Management + + /// + /// Get access token + /// + public string GetAccessToken() + { + if (!isInitialized) + { + Debug.LogWarning("[Tech3C] SDK not initialized"); + return null; + } + + return nativeBridge?.GetAccessToken(); + } + + /// + /// Get refresh token + /// + public string GetRefreshToken() + { + if (!isInitialized) + { + Debug.LogWarning("[Tech3C] SDK not initialized"); + return null; + } + + return nativeBridge?.GetRefreshToken(); + } + + #endregion + + #region User Information + + /// + /// Get user ID + /// + public string GetUserId() + { + if (!isInitialized) + { + Debug.LogWarning("[Tech3C] SDK not initialized"); + return null; + } + + return nativeBridge?.GetUserId(); + } + + /// + /// Get device ID + /// + public string GetDeviceId() + { + if (!isInitialized) + { + Debug.LogWarning("[Tech3C] SDK not initialized"); + return null; + } + + return nativeBridge?.GetDeviceId(); + } + + /// + /// Get login timestamp + /// + public long GetLoginTime() + { + if (!isInitialized) + { + Debug.LogWarning("[Tech3C] SDK not initialized"); + return 0; + } + + return nativeBridge?.GetLoginTime() ?? 0; + } + + /// + /// Get token expiry timestamp + /// + public long GetTokenExpiry() + { + if (!isInitialized) + { + Debug.LogWarning("[Tech3C] SDK not initialized"); + return 0; + } + + return nativeBridge?.GetTokenExpiry() ?? 0; + } + + #endregion + + #region Configuration + + /// + /// Set display language + /// + /// The language to set + public void SetLanguage(Language language) + { + if (!isInitialized) + { + Debug.LogWarning("[Tech3C] SDK not initialized"); + return; + } + + nativeBridge?.SetLanguage(language); + } + + /// + /// Set debug mode + /// + /// Enable or disable debug mode + public void SetDebug(bool debug) + { + if (!isInitialized) + { + Debug.LogWarning("[Tech3C] SDK not initialized"); + return; + } + + nativeBridge?.SetDebug(debug); + } + + #endregion + + #region Cleanup + + /// + /// Cleanup SDK resources + /// + public void Cleanup() + { + nativeBridge?.Cleanup(); + nativeBridge = null; + config = null; + isInitialized = false; + Debug.Log("[Tech3C] Cleanup completed"); + } + + private void OnDestroy() + { + Cleanup(); + } + + #endregion + + #region Properties + + /// + /// Get the current configuration + /// + public Tech3CConfig Config => config; + + /// + /// Check if SDK is initialized + /// + public bool IsInitialized => isInitialized; + + #endregion + } + + /// + /// Mock bridge for testing in editor or unsupported platforms + /// + internal class MockBridge : ITech3CNativeBridge + { + private bool isLoggedIn = false; + private string accessToken = "mock_access_token"; + private string refreshToken = "mock_refresh_token"; + private string userId = "mock_user_id"; + + public void Initialize(string clientId, string clientSecret, Tech3CConfig config) + { + Debug.Log($"[Tech3C Mock] Initialized with Client ID: {clientId}"); + } + + public void ShowAuth(IAuthCallback callback) + { + Debug.Log("[Mock3C Mock] ShowAuth called"); + isLoggedIn = true; + string password = "mock_password"; + callback?.OnAuthSuccess(userId, password, accessToken, refreshToken, LoginType.ACCOUNT, DateTime.Now.Ticks + 3600000); + } + + public void Logout(ILogoutCallback callback) + { + Debug.Log("[Tech3C Mock] Logout called"); + isLoggedIn = false; + callback?.OnLogoutSuccess(); + } + + public void GetUserInfo(IUserInfoCallback callback) + { + Debug.Log("[Tech3C Mock] GetUserInfo called"); + callback?.OnUserInfoReceived(userId, "mock_username", "mock@example.com", "1234567890"); + } + + public bool IsLoggedIn() => isLoggedIn; + + public string GetAccessToken() => isLoggedIn ? accessToken : null; + + public string GetRefreshToken() => isLoggedIn ? refreshToken : null; + + public string GetUserId() => isLoggedIn ? userId : null; + + public string GetDeviceId() => "mock_device_id"; + + public long GetLoginTime() => isLoggedIn ? DateTime.Now.Ticks : 0; + + public long GetTokenExpiry() => isLoggedIn ? DateTime.Now.Ticks + 3600000 : 0; + + public bool IsTokenExpired() => false; + + public void SetLanguage(Language language) + { + Debug.Log($"[Tech3C Mock] Language set to {language}"); + } + + public void SetDebug(bool debug) + { + Debug.Log($"[Tech3C Mock] Debug mode set to {debug}"); + } + + public void Cleanup() + { + Debug.Log("[Tech3C Mock] Cleanup completed"); + } + } +} diff --git a/Assets/Tech3C/Runtime/Tech3CSDK.cs.meta b/Assets/Tech3C/Runtime/Tech3CSDK.cs.meta new file mode 100644 index 0000000000..72d6fb5d15 --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CSDK.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3afb6189c673cea45a34e6e75c1f5ccb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Runtime/Tech3CSDKBridge.cs b/Assets/Tech3C/Runtime/Tech3CSDKBridge.cs new file mode 100644 index 0000000000..4c0b34086e --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CSDKBridge.cs @@ -0,0 +1,332 @@ +using UnityEngine; +using System; + +namespace Tech3C +{ + /// + /// Bridge component to receive callbacks from native Android/iOS SDK via Unity messaging + /// This GameObject receives UnitySendMessage calls from native code + /// + public class Tech3CSDKBridge : MonoBehaviour + { + private static Tech3CSDKBridge instance; + + // Callback references + private static IAuthCallback authCallback; + private static ILogoutCallback logoutCallback; + private static IUserInfoCallback userInfoCallback; + + #region Singleton + + public static Tech3CSDKBridge Instance + { + get + { + if (instance == null) + { + GameObject go = new GameObject("Tech3CSDKBridge"); + instance = go.AddComponent(); + DontDestroyOnLoad(go); + } + return instance; + } + } + + private void Awake() + { + if (instance == null) + { + instance = this; + DontDestroyOnLoad(gameObject); + Debug.Log("[Tech3C Bridge] Bridge initialized"); + } + else if (instance != this) + { + Destroy(gameObject); + } + } + + #endregion + + #region Set Callbacks + + /// + /// Set the auth callback to be invoked when auth events occur + /// + public static void SetAuthCallback(IAuthCallback callback) + { + authCallback = callback; + Debug.Log("[Tech3C Bridge] Auth callback set"); + } + + /// + /// Set the logout callback to be invoked when logout events occur + /// + public static void SetLogoutCallback(ILogoutCallback callback) + { + logoutCallback = callback; + Debug.Log("[Tech3C Bridge] Logout callback set"); + } + + /// + /// Set the user info callback to be invoked when user info events occur + /// + public static void SetUserInfoCallback(IUserInfoCallback callback) + { + userInfoCallback = callback; + Debug.Log("[Tech3C Bridge] User info callback set"); + } + + #endregion + + #region Auth Callbacks + + /// + /// Called from native code when authentication is successful + /// Message format: "userId|password|accessToken|refreshToken|loginType|expiryTime" + /// + public void OnAuthSuccess(string message) + { + Debug.Log($"[Tech3C Bridge] OnAuthSuccess received: {message}"); + + if (authCallback == null) + { + Debug.LogWarning("[Tech3C Bridge] No auth callback registered"); + return; + } + + try + { + string[] parts = message.Split('|'); + if (parts.Length >= 6) + { + string userId = parts[0]; + string password = parts[1]; + string accessToken = parts[2]; + string refreshToken = parts[3]; + LoginType loginType = (LoginType)Enum.Parse(typeof(LoginType), parts[4]); + long expiryTime = long.Parse(parts[5]); + + Debug.Log($"[Tech3C Bridge] Parsed auth success: userId={userId}, loginType={loginType}"); + authCallback.OnAuthSuccess(userId, password, accessToken, refreshToken, loginType, expiryTime); + } + else + { + Debug.LogError($"[Tech3C Bridge] Invalid message format: {message}"); + } + } + catch (Exception e) + { + Debug.LogError($"[Tech3C Bridge] Error parsing auth success message: {e.Message}"); + } + } + + /// + /// Called from native code when authentication is cancelled + /// + public void OnAuthCancelled(string message) + { + Debug.Log("[Tech3C Bridge] OnAuthCancelled received"); + + if (authCallback == null) + { + Debug.LogWarning("[Tech3C Bridge] No auth callback registered"); + return; + } + + authCallback.OnAuthCancelled(); + } + + /// + /// Called from native code when an authentication error occurs + /// Message format: "errorCode|errorMessage" + /// + public void OnAuthError(string message) + { + Debug.Log($"[Tech3C Bridge] OnAuthError received: {message}"); + + if (authCallback == null) + { + Debug.LogWarning("[Tech3C Bridge] No auth callback registered"); + return; + } + + try + { + string[] parts = message.Split('|'); + int errorCode = -1; + string errorMessage = "Unknown error"; + + if (parts.Length >= 1) + { + int.TryParse(parts[0], out errorCode); + } + if (parts.Length >= 2) + { + errorMessage = parts[1]; + } + + Debug.Log($"[Tech3C Bridge] Parsed auth error: code={errorCode}, message={errorMessage}"); + authCallback.OnAuthError(errorCode, errorMessage); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C Bridge] Error parsing auth error message: {e.Message}"); + } + } + + #endregion + + #region Logout Callbacks + + /// + /// Called from native code when logout is successful + /// + public void OnLogoutSuccess(string message) + { + Debug.Log("[Tech3C Bridge] OnLogoutSuccess received"); + + if (logoutCallback == null) + { + Debug.LogWarning("[Tech3C Bridge] No logout callback registered"); + return; + } + + logoutCallback.OnLogoutSuccess(); + } + + /// + /// Called from native code when a logout error occurs + /// Message format: "errorCode|errorMessage" + /// + public void OnLogoutError(string message) + { + Debug.Log($"[Tech3C Bridge] OnLogoutError received: {message}"); + + if (logoutCallback == null) + { + Debug.LogWarning("[Tech3C Bridge] No logout callback registered"); + return; + } + + try + { + string[] parts = message.Split('|'); + int errorCode = -1; + string errorMessage = "Unknown error"; + + if (parts.Length >= 1) + { + int.TryParse(parts[0], out errorCode); + } + if (parts.Length >= 2) + { + errorMessage = parts[1]; + } + + logoutCallback.OnLogoutError(errorCode, errorMessage); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C Bridge] Error parsing logout error message: {e.Message}"); + } + } + + #endregion + + #region User Info Callbacks + + /// + /// Called from native code when user info is received + /// Message format: "userId|username|email|phone" + /// + public void OnUserInfoReceived(string message) + { + Debug.Log($"[Tech3C Bridge] OnUserInfoReceived received: {message}"); + + if (userInfoCallback == null) + { + Debug.LogWarning("[Tech3C Bridge] No user info callback registered"); + return; + } + + try + { + string[] parts = message.Split('|'); + if (parts.Length >= 4) + { + string userId = parts[0]; + string username = parts[1]; + string email = parts[2]; + string phone = parts[3]; + + Debug.Log($"[Tech3C Bridge] Parsed user info: userId={userId}, username={username}"); + userInfoCallback.OnUserInfoReceived(userId, username, email, phone); + } + else + { + Debug.LogError($"[Tech3C Bridge] Invalid message format: {message}"); + } + } + catch (Exception e) + { + Debug.LogError($"[Tech3C Bridge] Error parsing user info message: {e.Message}"); + } + } + + /// + /// Called from native code when user info retrieval is cancelled + /// + public void OnUserInfoCancelled(string message) + { + Debug.Log("[Tech3C Bridge] OnUserInfoCancelled received"); + + if (userInfoCallback == null) + { + Debug.LogWarning("[Tech3C Bridge] No user info callback registered"); + return; + } + + userInfoCallback.OnUserInfoCancelled(); + } + + /// + /// Called from native code when a user info error occurs + /// Message format: "errorCode|errorMessage" + /// + public void OnUserInfoError(string message) + { + Debug.Log($"[Tech3C Bridge] OnUserInfoError received: {message}"); + + if (userInfoCallback == null) + { + Debug.LogWarning("[Tech3C Bridge] No user info callback registered"); + return; + } + + try + { + string[] parts = message.Split('|'); + int errorCode = -1; + string errorMessage = "Unknown error"; + + if (parts.Length >= 1) + { + int.TryParse(parts[0], out errorCode); + } + if (parts.Length >= 2) + { + errorMessage = parts[1]; + } + + userInfoCallback.OnUserInfoError(errorCode, errorMessage); + } + catch (Exception e) + { + Debug.LogError($"[Tech3C Bridge] Error parsing user info error message: {e.Message}"); + } + } + + #endregion + } +} diff --git a/Assets/Tech3C/Runtime/Tech3CSDKBridge.cs.meta b/Assets/Tech3C/Runtime/Tech3CSDKBridge.cs.meta new file mode 100644 index 0000000000..353dcb291b --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CSDKBridge.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 46cf26ff28457b04890e322b5b161a67 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Runtime/Tech3CiOSBridge.cs b/Assets/Tech3C/Runtime/Tech3CiOSBridge.cs new file mode 100644 index 0000000000..2aa3a12b95 --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CiOSBridge.cs @@ -0,0 +1,147 @@ +using UnityEngine; +using System; + +namespace Tech3C +{ + /// + /// Bridge class for iOS platform to communicate with Tech3C native SDK + /// Note: iOS implementation requires native framework. This is a placeholder. + /// + public class Tech3CiOSBridge : ITech3CNativeBridge + { + private bool initialized = false; + + /// + /// Initialize the Tech3C SDK + /// + public void Initialize(string clientId, string clientSecret, Tech3CConfig config) + { + Debug.LogWarning("[Tech3C] iOS platform is not yet supported. Please provide the native iOS framework."); + initialized = true; + } + + /// + /// Show authentication screen + /// + public void ShowAuth(IAuthCallback callback) + { + Debug.LogWarning("[Tech3C] ShowAuth is not implemented for iOS platform"); + callback?.OnAuthError(-1, "iOS platform not supported"); + } + + /// + /// Logout current user + /// + public void Logout(ILogoutCallback callback) + { + Debug.LogWarning("[Tech3C] Logout is not implemented for iOS platform"); + callback?.OnLogoutError(-1, "iOS platform not supported"); + } + + /// + /// Get user information + /// + public void GetUserInfo(IUserInfoCallback callback) + { + Debug.LogWarning("[Tech3C] GetUserInfo is not implemented for iOS platform"); + callback?.OnUserInfoError(-1, "iOS platform not supported"); + } + + /// + /// Check if user is logged in + /// + public bool IsLoggedIn() + { + Debug.LogWarning("[Tech3C] IsLoggedIn is not implemented for iOS platform"); + return false; + } + + /// + /// Get access token + /// + public string GetAccessToken() + { + Debug.LogWarning("[Tech3C] GetAccessToken is not implemented for iOS platform"); + return null; + } + + /// + /// Get refresh token + /// + public string GetRefreshToken() + { + Debug.LogWarning("[Tech3C] GetRefreshToken is not implemented for iOS platform"); + return null; + } + + /// + /// Get user ID + /// + public string GetUserId() + { + Debug.LogWarning("[Tech3C] GetUserId is not implemented for iOS platform"); + return null; + } + + /// + /// Get device ID + /// + public string GetDeviceId() + { + Debug.LogWarning("[Tech3C] GetDeviceId is not implemented for iOS platform"); + return null; + } + + /// + /// Get login time + /// + public long GetLoginTime() + { + Debug.LogWarning("[Tech3C] GetLoginTime is not implemented for iOS platform"); + return 0; + } + + /// + /// Get token expiry time + /// + public long GetTokenExpiry() + { + Debug.LogWarning("[Tech3C] GetTokenExpiry is not implemented for iOS platform"); + return 0; + } + + /// + /// Check if token is expired + /// + public bool IsTokenExpired() + { + Debug.LogWarning("[Tech3C] IsTokenExpired is not implemented for iOS platform"); + return false; + } + + /// + /// Set language + /// + public void SetLanguage(Language language) + { + Debug.LogWarning("[Tech3C] SetLanguage is not implemented for iOS platform"); + } + + /// + /// Set debug mode + /// + public void SetDebug(bool debug) + { + Debug.LogWarning("[Tech3C] SetDebug is not implemented for iOS platform"); + } + + /// + /// Cleanup resources + /// + public void Cleanup() + { + Debug.Log("[Tech3C] iOS bridge cleanup completed"); + initialized = false; + } + } +} diff --git a/Assets/Tech3C/Runtime/Tech3CiOSBridge.cs.meta b/Assets/Tech3C/Runtime/Tech3CiOSBridge.cs.meta new file mode 100644 index 0000000000..327d3972f3 --- /dev/null +++ b/Assets/Tech3C/Runtime/Tech3CiOSBridge.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7199bd7af3b75294c84f9d6451df86d4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Samples.meta b/Assets/Tech3C/Samples.meta new file mode 100644 index 0000000000..a7dd7ed56a --- /dev/null +++ b/Assets/Tech3C/Samples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a947977eda82ae34b85413ea17ef265a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Tech3C/Samples/Tech3CSimpleDemo.cs b/Assets/Tech3C/Samples/Tech3CSimpleDemo.cs new file mode 100644 index 0000000000..0c609186bb --- /dev/null +++ b/Assets/Tech3C/Samples/Tech3CSimpleDemo.cs @@ -0,0 +1,473 @@ +using UnityEngine; +using UnityEngine.UI; +using UnityEngine.EventSystems; +using System; + +namespace Tech3C +{ + /// + /// Simple demo that creates UI programmatically + /// Just attach this script to any GameObject in your scene + /// + public class Tech3CSimpleDemo : MonoBehaviour + { + [Header("Configuration")] + public string clientId = "your_client_id"; + public string clientSecret = "your_client_secret"; + + private Canvas canvas; + private Text logText; + private AuthCallback authCallback; + private LogoutCallback logoutCallback; + + private GameObject dialogPanel; + private Text dialogText; + private Button dialogCloseButton; + + private void Start() + { + EnsureEventSystem(); + CreateUI(); + SetupCallbacks(); + + // Auto-initialize SDK + if (!string.IsNullOrEmpty(clientId) && !string.IsNullOrEmpty(clientSecret)) + { + Log($"Initializing Tech3C SDK...\n Client ID: {clientId}"); + Tech3CSDK.Instance.Initialize(clientId, clientSecret); + + if (Tech3CSDK.Instance.IsInitialized) + { + Log("✓ SDK Initialized Successfully!"); + } + else + { + Log("✗ Failed to initialize SDK"); + } + } + else + { + Log("âš  Client ID and/or Client Secret not set. Please configure in Inspector."); + } + + Debug.Log("[Tech3C Demo] Tech3C SDK Simple Demo Started"); + } + + private void EnsureEventSystem() + { + if (EventSystem.current == null) + { + GameObject eventSystemGO = new GameObject("EventSystem"); + eventSystemGO.AddComponent(); + eventSystemGO.AddComponent(); + Debug.Log("[Tech3C Demo] EventSystem created"); + } + } + + private void CreateUI() + { + // Create Canvas + GameObject canvasGO = new GameObject("Tech3CDemoCanvas"); + canvasGO.transform.SetParent(transform); + canvas = canvasGO.AddComponent(); + canvas.renderMode = RenderMode.ScreenSpaceOverlay; + + // Configure CanvasScaler for responsive 16:9 ratio + CanvasScaler canvasScaler = canvasGO.AddComponent(); + canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; + canvasScaler.referenceResolution = new Vector2(1920, 1080); // 16:9 ratio + canvasScaler.screenMatchMode = CanvasScaler.ScreenMatchMode.MatchWidthOrHeight; + canvasScaler.matchWidthOrHeight = 0.5f; // Balance between width and height + + canvasGO.AddComponent(); + + // Create Scroll Panel + GameObject scrollPanel = new GameObject("ScrollPanel"); + scrollPanel.transform.SetParent(canvasGO.transform, false); + RectTransform scrollPanelRect = scrollPanel.AddComponent(); + scrollPanelRect.anchorMin = Vector2.zero; + scrollPanelRect.anchorMax = Vector2.one; + scrollPanelRect.sizeDelta = Vector2.zero; + Image scrollPanelImage = scrollPanel.AddComponent(); + scrollPanelImage.color = new Color(0.2f, 0.2f, 0.2f, 1f); + + // Create ScrollRect + ScrollRect scrollRect = scrollPanel.AddComponent(); + scrollRect.horizontal = false; + scrollRect.vertical = true; + scrollRect.scrollSensitivity = 50f; + + // Create Content Panel + GameObject panel = new GameObject("Content"); + panel.transform.SetParent(scrollPanel.transform, false); + RectTransform panelRect = panel.AddComponent(); + panelRect.anchorMin = new Vector2(0, 1); + panelRect.anchorMax = new Vector2(1, 1); + panelRect.pivot = new Vector2(0.5f, 1f); + panelRect.sizeDelta = new Vector2(0, 0); + scrollRect.content = panelRect; + + // Create Vertical Layout Group + VerticalLayoutGroup layoutGroup = panel.AddComponent(); + layoutGroup.childControlHeight = false; + layoutGroup.childControlWidth = true; + layoutGroup.childForceExpandWidth = true; + layoutGroup.childForceExpandHeight = false; + layoutGroup.spacing = 15; + layoutGroup.padding = new RectOffset(40, 40, 40, 40); + ContentSizeFitter contentSizeFitter = panel.AddComponent(); + contentSizeFitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize; + + // Create Title + CreateTextResponsive(panel.transform, "Tech3C SDK Demo", 28, TextAnchor.MiddleCenter, 60); + + // Create Separator + CreateTextResponsive(panel.transform, "--- Authentication ---", 18, TextAnchor.MiddleCenter, 30); + + // Create Show Auth Button + Button showAuthButton = CreateButtonResponsive(panel.transform, "Show Auth Screen", 70); + showAuthButton.onClick.AddListener(OnShowAuthClick); + + // Create Logout Button + Button logoutButton = CreateButtonResponsive(panel.transform, "Logout", 70); + logoutButton.onClick.AddListener(OnLogoutClick); + + // Create Log Text + CreateTextResponsive(panel.transform, "Logs:", 16, TextAnchor.MiddleLeft, 35); + logText = CreateTextResponsive(panel.transform, "Ready...", 16, TextAnchor.MiddleLeft, 400); + logText.color = Color.green; + + // Reposition panel + panelRect.anchoredPosition = Vector2.zero; + } + + private void SetupCallbacks() + { + // Auth callback + authCallback = new AuthCallback(); + authCallback.OnAuthSuccessEvent += (userId, password, accessToken, refreshToken, loginType, expiryTime) => + { + Debug.Log($"[Tech3C Demo] === AUTH SUCCESS CALLBACK FIRED ==="); + Debug.Log($"[Tech3C Demo] UserId: {userId}"); + Debug.Log($"[Tech3C Demo] Password: {password?.Substring(0, Math.Min(3, password?.Length ?? 0))}..."); + Debug.Log($"[Tech3C Demo] LoginType: {loginType}"); + Debug.Log($"[Tech3C Demo] AccessToken: {accessToken?.Substring(0, Math.Min(20, accessToken?.Length ?? 0))}..."); + Debug.Log($"[Tech3C Demo] RefreshToken: {refreshToken?.Substring(0, Math.Min(20, refreshToken?.Length ?? 0))}..."); + Debug.Log($"[Tech3C Demo] ExpiryTime: {expiryTime}"); + + Log($"✓ Auth Success!\n User ID: {userId}\n Password: {password}\n Login Type: {loginType}\n Token: {accessToken?.Substring(0, Math.Min(20, accessToken?.Length ?? 0))}..."); + + ShowAuthSuccessDialog(userId, password, loginType.ToString()); + }; + authCallback.OnAuthCancelledEvent += () => + { + Debug.Log($"[Tech3C Demo] === AUTH CANCELLED CALLBACK FIRED ==="); + Log("✗ Auth Cancelled by user"); + }; + authCallback.OnAuthErrorEvent += (errorCode, errorMessage) => + { + Debug.Log($"[Tech3C Demo] === AUTH ERROR CALLBACK FIRED ==="); + Debug.Log($"[Tech3C Demo] ErrorCode: {errorCode}"); + Debug.Log($"[Tech3C Demo] ErrorMessage: {errorMessage}"); + Log($"✗ Auth Error [{errorCode}]: {errorMessage}"); + }; + + // Logout callback + logoutCallback = new LogoutCallback(); + logoutCallback.OnLogoutSuccessEvent += () => + { + Debug.Log($"[Tech3C Demo] === LOGOUT SUCCESS CALLBACK FIRED ==="); + Log("✓ Logout Successful"); + }; + logoutCallback.OnLogoutErrorEvent += (errorCode, errorMessage) => + { + Debug.Log($"[Tech3C Demo] === LOGOUT ERROR CALLBACK FIRED ==="); + Debug.Log($"[Tech3C Demo] ErrorCode: {errorCode}"); + Debug.Log($"[Tech3C Demo] ErrorMessage: {errorMessage}"); + Log($"✗ Logout Error [{errorCode}]: {errorMessage}"); + }; + } + + #region Button Handlers + + private void OnInitializeClick(string newClientId, string newClientSecret) + { + if (string.IsNullOrEmpty(newClientId) || string.IsNullOrEmpty(newClientSecret)) + { + Log("✗ Client ID and Client Secret are required!"); + return; + } + + clientId = newClientId; + clientSecret = newClientSecret; + + Log($"Initializing Tech3C SDK...\n Client ID: {clientId}"); + Tech3CSDK.Instance.Initialize(clientId, clientSecret); + + if (Tech3CSDK.Instance.IsInitialized) + { + Log("✓ SDK Initialized Successfully!"); + } + else + { + Log("✗ Failed to initialize SDK"); + } + } + + private void OnShowAuthClick() + { + if (!Tech3CSDK.Instance.IsInitialized) + { + Log("✗ SDK not initialized. Click Initialize first!"); + return; + } + + Log("Opening Auth Screen..."); + Tech3CSDK.Instance.ShowAuth(authCallback); + } + + private void OnLogoutClick() + { + if (!Tech3CSDK.Instance.IsInitialized) + { + Log("✗ SDK not initialized."); + return; + } + + Log("Logging out..."); + Tech3CSDK.Instance.Logout(logoutCallback); + } + + #endregion + + #region UI Helper Methods + + private Button CreateButton(Transform parent, string text, float width, float height) + { + GameObject buttonGO = new GameObject(text.Replace(" ", "_")); + buttonGO.transform.SetParent(parent, false); + + RectTransform rect = buttonGO.AddComponent(); + rect.sizeDelta = new Vector2(width, height); + + Image image = buttonGO.AddComponent(); + image.color = new Color(0.3f, 0.5f, 0.8f, 1f); + + Button button = buttonGO.AddComponent