done flow learn skill

This commit is contained in:
VDH
2026-01-12 19:07:37 +07:00
parent 59f70616e9
commit 61f4660dba
26 changed files with 1633 additions and 339 deletions
@@ -0,0 +1,627 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1448650841350251410
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1931146730219979515}
- component: {fileID: 7931617368933511578}
- component: {fileID: 5031655611580643013}
m_Layer: 5
m_Name: TitileText (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1931146730219979515
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1448650841350251410}
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: 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: 84}
m_SizeDelta: {x: 200, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7931617368933511578
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1448650841350251410}
m_CullTransparentMesh: 1
--- !u!114 &5031655611580643013
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1448650841350251410}
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: MessageBox
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: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 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}
--- !u!1 &3318234767486795022
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7677644201189461152}
- component: {fileID: 5808684862484431307}
- component: {fileID: 6436262686944836630}
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 &7677644201189461152
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3318234767486795022}
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: 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_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5808684862484431307
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3318234767486795022}
m_CullTransparentMesh: 1
--- !u!114 &6436262686944836630
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3318234767486795022}
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: OK
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: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 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}
--- !u!1 &4839074738306786208
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7906706137011413807}
- component: {fileID: 8280971203118505009}
- component: {fileID: 8250962023850685786}
- component: {fileID: 7766051278568089760}
m_Layer: 5
m_Name: ButtonExit
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7906706137011413807
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4839074738306786208}
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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 160, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8280971203118505009
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4839074738306786208}
m_CullTransparentMesh: 1
--- !u!114 &8250962023850685786
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4839074738306786208}
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!114 &7766051278568089760
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4839074738306786208}
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: 8250962023850685786}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &5199518178703117250
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6428994832978992641}
- component: {fileID: 655909173274991632}
- component: {fileID: 7448521238108099750}
m_Layer: 5
m_Name: MessageText (TMP) (1)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6428994832978992641
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5199518178703117250}
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: 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_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &655909173274991632
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5199518178703117250}
m_CullTransparentMesh: 1
--- !u!114 &7448521238108099750
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5199518178703117250}
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: 'Content
'
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: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 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}
--- !u!1 &5492547392745930423
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8578995796031649400}
- component: {fileID: 2243330050876855902}
- component: {fileID: 3372223705930781376}
- component: {fileID: 8056968728849250909}
m_Layer: 5
m_Name: MessageBox
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8578995796031649400
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5492547392745930423}
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: 7906706137011413807}
- {fileID: 1931146730219979515}
- {fileID: 6428994832978992641}
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_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2243330050876855902
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5492547392745930423}
m_CullTransparentMesh: 1
--- !u!114 &3372223705930781376
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5492547392745930423}
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!114 &8056968728849250909
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5492547392745930423}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7397a97ad381b754689dee54c66ed470, type: 3}
m_Name:
m_EditorClassIdentifier:
titleText: {fileID: 5031655611580643013}
messageText: {fileID: 7448521238108099750}
okButton: {fileID: 7766051278568089760}
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 54cccb2c6a758a24183474cd385ccb2c
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -27,3 +27,5 @@ MonoBehaviour:
prefab: {fileID: 977375840943150650, guid: 51bad2e6d1ec69a4683135ce85288faa, type: 3}
- id: Win_Hpmpxp
prefab: {fileID: 6032603119232429246, guid: 8350aa55906d08448bb47e10a473ca61, type: 3}
- id: DlgMessageBox
prefab: {fileID: 5492547392745930423, guid: 54cccb2c6a758a24183474cd385ccb2c, type: 3}
@@ -162,5 +162,6 @@ namespace BrewMonster.Managers
+26 -23
View File
@@ -1138,6 +1138,9 @@ namespace BrewMonster
return false;
}
public CECSkill GetCurSkill() { return m_pCurSkill; }
public bool IsHangerOn() { return m_bHangerOn; }
public bool PlaySkillCastActionWithName(int idSkill, string szActName, bool bNoFX/* =false */)
{
return m_pActionController != null
@@ -1573,31 +1576,31 @@ namespace BrewMonster
{
bool bRet = false;
/* if (vPos.y < fWaterHei - m_MoveConst.fShoreDepth)
bRet = true;
else if (vPos.y < fWaterHei && fWaterHei - fGndHei > m_MoveConst.fShoreDepth)
bRet = true;
*/
// if (vPos.y < fWaterHei - m_MoveConst.fWaterSurf - m_aabb.Extents.y)
// if (vPos.y < fWaterHei - m_MoveConst.fWaterSurf + 0.01f)
/* if (vPos.y < fWaterHei - m_MoveConst.fShoreDepth)
bRet = true;
else if (vPos.y < fWaterHei && fWaterHei - fGndHei > m_MoveConst.fShoreDepth)
bRet = true;
*/
// if (vPos.y < fWaterHei - m_MoveConst.fWaterSurf - m_aabb.Extents.y)
// if (vPos.y < fWaterHei - m_MoveConst.fWaterSurf + 0.01f)
/*
if (vPos.y < fWaterHei - m_MoveConst.fShoreDepth)
bRet = true;
else if (vPos.y < fWaterHei - m_MoveConst.fWaterSurf + 0.01f && fWaterHei - fGndHei > m_MoveConst.fShoreDepth)
bRet = true;
*/
/*
if (vPos.y < fWaterHei - m_MoveConst.fShoreDepth)
bRet = true;
else if (vPos.y < fWaterHei - m_MoveConst.fWaterSurf + 0.01f && fWaterHei - fGndHei > m_MoveConst.fShoreDepth)
bRet = true;
*/
//@note : modify the water test. By Kuiwu[12/10/2005]
if (vPos.y + m_aabbServer.Extents.y<fWaterHei - m_MoveConst.fWaterSurf - 0.001f)
{
bRet = true;
}
//else if (vPos.y + m_aabb.Extents.y < fWaterHei- m_MoveConst.fWaterSurf + 1E-4f && vPos.y - fGndHei >= 0.2f )
else if (vPos.y + m_aabbServer.Extents.y<fWaterHei- m_MoveConst.fWaterSurf + 1E-4f && vPos.y - fGndHei >= 0.01f )
{
bRet = true;
}
//@note : modify the water test. By Kuiwu[12/10/2005]
if (vPos.y + m_aabbServer.Extents.y < fWaterHei - m_MoveConst.fWaterSurf - 0.001f)
{
bRet = true;
}
//else if (vPos.y + m_aabb.Extents.y < fWaterHei- m_MoveConst.fWaterSurf + 1E-4f && vPos.y - fGndHei >= 0.2f )
else if (vPos.y + m_aabbServer.Extents.y < fWaterHei - m_MoveConst.fWaterSurf + 1E-4f && vPos.y - fGndHei >= 0.01f)
{
bRet = true;
}
return bRet;
@@ -1446,6 +1446,11 @@ namespace CSNetwork.S2CCommand
public int idTask;
}
public struct SevLearnSkillCONTENT
{
public int idSkill;
}
public struct cmd_sevnpc_serve2
{
public int service_type;
@@ -617,6 +617,20 @@ namespace CSNetwork.C2SCommand
return SerializeCommand(CommandID.SEVNPC_SERVE, cmd, content);
}
public static Octets CreateNPCSevLearnSkillCmd(int idSkill)
{
var cmd = new cmd_sevnpc_serve
{
service_type = NPC_service_type.GP_NPCSEV_LEARN,
len = (uint)Marshal.SizeOf<SevLearnSkillCONTENT>()
};
SevLearnSkillCONTENT content = new SevLearnSkillCONTENT()
{
idSkill = idSkill
};
return SerializeCommand(CommandID.SEVNPC_SERVE, cmd, content);
}
public static Octets CreateNPCSevBuyCmd(int itemNum, CSNetwork.C2SCommand.npc_trade_item[] items)
{
if (itemNum <= 0 || items == null || items.Length < itemNum)
@@ -787,6 +787,9 @@ namespace CSNetwork
case CommandID.COOLTIME_DATA:
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_COOLTIMEDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
break;
case CommandID.LEARN_SKILL:
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_LEARNSKILL, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
break;
}
}
@@ -1305,6 +1308,13 @@ namespace CSNetwork
SendProtocol(gamedatasend);
}
public void c2s_SendCmdNPCSevLearnSkill(int idSkill)
{
gamedatasend gamedatasend = new gamedatasend();
gamedatasend.Data = C2SCommandFactory.CreateNPCSevLearnSkillCmd(idSkill);
SendProtocol(gamedatasend);
}
public void c2s_SendCmdNPCSevBuy(int itemNum, C2SCommand.npc_trade_item[] items)
{
if (itemNum <= 0 || items == null || items.Length < itemNum)
@@ -262,7 +262,10 @@ namespace BrewMonster.Network
RequestInventoryAsync(p, onOneDone);
}
}
public static void c2s_SendCmdNPCSevLearnSkill(int idSkill)
{
Instance._gameSession.c2s_SendCmdNPCSevLearnSkill(idSkill);
}
public static void c2s_CmdNPCSevHello(int nid)
{
Instance._gameSession.c2s_SendCmdNPCSevHello(nid);
@@ -232,6 +232,10 @@ namespace BrewMonster.Scripts.Skills
return enumSkillFitLevelState.SKILL_FIT_LEVEL;
}
public int CheckLearnCondition(int skillID)
{
return CECGameRun.Instance.GetHostPlayer().CheckSkillLearnCondition(skillID, true);
}
public int GetRequiredBook(int skillID, int level)
{
int itemId = ElementSkill.GetRequiredBook((uint)skillID, level);
@@ -559,6 +563,40 @@ namespace BrewMonster.Scripts.Skills
}
return GetSkillCurrentLevel(skillID) >= level;
}
// Called when a skill is learned / 当学习新技能后调用
public void OnLearnSkill(int skillID, int skillLevel)
{
if (!m_allProfSkills.ContainsKey(skillID))
{
return;
}
// 检查学习新技能后是否有技能被覆盖 / Check if any skills are overridden after learning the new skill
bool newOverridden = false;
var juniors = GetJunior(skillID);
if (juniors.Count > 0)
{
newOverridden = true;
}
if (newOverridden)
{
CECSkillPanelChange change = new CECSkillPanelChange(
CECSkillPanelChange.enumChangeMask.CHANGE_SKILL_OVERRIDDEN,
skillID,
skillLevel);
EventBus.PublishClass(change);
}
else
{
CECSkillPanelChange change = new CECSkillPanelChange(
CECSkillPanelChange.enumChangeMask.CHANGE_SKILL_LEVEL_UP,
skillID,
skillLevel);
EventBus.PublishClass(change);
}
}
}
public enum enumSkillFitLevelState
@@ -248,7 +248,10 @@ namespace BrewMonster.Scripts.Skills
public virtual int GetShowOrder() { return 0; }
// üܼ
public virtual int SetLevel(int level) { return 0; }
// 󼶱?
public static int SetLevel(uint id, int level)
{
return SkillWrapper.Instance.SetLevel(id, level);
}
public virtual int GetMaxLevel() { return 0; }
public static byte GetType(uint id)
{
@@ -339,5 +342,87 @@ namespace BrewMonster.Scripts.Skills
int ret = skill.GetRequiredMoney();
return ret;
}
// 学习技能条件检查 // Learning skill condition check
// 返回值 // Return values:
// 0: 成功 // Success
// 1: 技能点不够 // Not enough skill points
// 2: 等级不够 // Level not enough
// 3: 错误 // Error
// 4: 职业不匹配 // Profession mismatch
// 5: 技能ID // Skill ID error
// 6: 钱不够 // Not enough money
// 7: 阶级不符 // Rank mismatch
// 9: 前置技能级别不够 // Prerequisite skill level not enough
// 10: 熟练度不够 // Ability not enough
// 11: 被覆盖 // Overridden
// 12: 境界等级不够 // Realm level not enough
public static int LearnCondition(uint id, LearnRequirement info, int ilevel)
{
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;
if (srank > prank)
ret = 7;
else
{
srank = (int)(srank * 0.1);
prank = (int)(prank * 0.1);
if (srank != prank && srank != 0)
ret = 7;
}
if (ilevel < 1 || ilevel > skill.GetMaxLevel())
ret = 3;
else if (info.profession != skill.GetCls() && skill.GetCls() != 255)
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)
{
uint pre_id = kvp.Key;
int pre_level = kvp.Value;
if (pre_id > 0 && wrapper.GetLevel(pre_id) < pre_level && !wrapper.IsOverridden(pre_id))
{
ret = 9;
break;
}
}
if (ilevel > 1)
{
skill.SetLevel(ilevel - 1);
int ability = skill.GetMaxability();
if (ability > 0 && wrapper.GetAbility(id) < ability)
ret = 10;
}
if (info.realm_level < skill.GetRequiredRealmLevel())
ret = 12;
return ret;
}
}
}
@@ -56,5 +56,43 @@ namespace BrewMonster.Assets.PerfectWorld.Scripts.Skills
}
return false;
}
public int GetLevel(uint id)
{
if (map.TryGetValue(id, out PersistentData data))
return data.level;
return 0;
}
public int GetAbility(uint id)
{
if (map.TryGetValue(id, out PersistentData data))
return data.ability;
return 0;
}
public int SetAbility(uint id, int ability)
{
if (map.TryGetValue(id, out PersistentData data))
{
int old = data.ability;
data.ability = ability;
map[id] = data;
return old;
}
return 0;
}
public int SetLevel(uint id, int level)
{
if (map.TryGetValue(id, out PersistentData data))
{
int old = data.level;
data.level = level;
map[id] = data;
return old;
}
return 0;
}
}
}
+299 -295
View File
@@ -1,296 +1,300 @@
using System.Collections.Generic;
using UnityEngine;
namespace BrewMonster.Scripts.Skills
{
public class Range
{
/// <summary>0=point 1=line 2=self sphere 3=target sphere 4=cone 5=self</summary>
public byte type; // 0 1 2 3Ŀ 4Բ׶ 5
public bool IsPoint() { return type == 0; }
public bool IsLine() { return type == 1; }
public bool IsSelfBall() { return type == 2; }
public bool IsTargetBall() { return type == 3; }
public bool IsSector() { return type == 4; }
public bool IsSelf() { return type == 5; }
public bool NoTarget() { return type == 2 || type == 5; }
}
// ռλ // Placeholder Skill class
public class Skill : ElementSkill
{
protected SkillStub stub;
protected PlayerWrapper player;
protected uint id;
protected uint level;
Skill(uint i, SkillStub s)
{
id = i;
stub = s;
player = new PlayerWrapper();
}
public static Skill Create(uint id, int n)
{
SkillStub stub = SkillStub.GetStub(id);
if (stub == null)
return null;
Skill skill = new Skill(id, stub);
int max = skill.GetMaxLevel();
if (n > max)
skill.SetLevel(max);
else
skill.SetLevel(n);
return skill;
}
public override int GetMaxLevel() { return stub.GetMaxLevel(); }
public override int SetLevel(int l)
{
uint tmp = level;
level = (uint)l;
return (int)tmp;
}
public override int GetItemCost() { return stub.itemcost; }
public int GetLevel() { return (int)level; }
public PlayerWrapper GetPlayer()
{
return player;
}
public override int GetRank() { return stub.rank; }
public override bool IsInstant() { return stub.time_type == 1; }
public override int GetCls()
{
return stub.GetCls();
}
public override Dictionary<uint, int> GetJunior()
{
return stub.is_senior != 0 ? stub.pre_skills : new Dictionary<uint, int>();
}
public override int GetRangeType() { return stub.GetRange().type; }
public override int GetTargetType()
{
if (stub.restrict_corpse == 1)
return 2;
if (stub.restrict_corpse == 2)
return 3;
if (stub.type == (int)skill_type.TYPE_ATTACK || stub.type == (int)skill_type.TYPE_CURSE)
return 1;
if (stub.type == (int)skill_type.TYPE_BLESSPET)
return 4;
if (stub.GetRange().NoTarget())
return 0;
return 1;
}
public override byte GetType() { return stub.type; }
public override int GetCommonCoolDown() { return stub.commoncooldown; }
public override string GetIcon()
{
return stub.GetIcon();
}
public override string GetName() { return stub.GetName(); }
public override float GetPrayRange(float range, float prayplus)
{
player.SetRange(range);
player.SetPrayrangeplus(prayplus);
if (stub.type == (int)skill_type.TYPE_ATTACK || stub.type == (int)skill_type.TYPE_CURSE)
{
if (stub.auto_attack)
{
float r = 0.3f * stub.GetPraydistance(this);
if (r >= 1.0)
return stub.GetPraydistance(this) - 1.0f;
else
return (float)0.7 * stub.GetPraydistance(this);
}
else
return stub.GetPraydistance(this);
}
if (stub.type == (int)skill_type.TYPE_JUMP)
return stub.GetPraydistance(this);
if (stub.GetRange().NoTarget())
return -1;
else
return stub.GetPraydistance(this);
}
public override int GetCoolingTime() { return stub.GetCoolingtime(this); }
public int GetRequiredSp() { return stub.GetRequiredSp(this); }
public int GetRequiredMoney() { return stub.GetRequiredMoney(this); }
public override Dictionary<uint, int> GetRequiredSkill() { return stub.pre_skills; }
}
public abstract class SkillStub
{
public const int MIN_LEVEL = 1;
public const int MAX_LEVEL = 10;
// Base info
public uint id; // Ψһֱʶ // Unique identifier
public int cls; // ְҵ // Class/Profession
public string name; // // Skill name
public string nativename; // // Native name
public string icon; // ͼ // Skill icon
public int max_level; // 󼶱? // Maximum level
public byte type; // ? 1 2 3ٻ 4 5 // Skill type: 1-Normal 2-Special 3-Partner 4-Mount 5-Other
// Execute condition
public bool allow_ride; // ? // Allow while riding
public short attr; // , 1256 ѡһ Ĭϣ // Attribute: 1-Metal 2-Earth 3-Wood 4-Water 5-Fire 6-Special (Choose one, default none)
public int rank; // // Rank
public int eventflag; // Event flag
public byte is_senior; // Senior flag
public bool is_inherent; // ܣѧ // Inherent skill, cannot be learned
public bool is_movingcast; // ƶʩ // Can cast while moving
public int npcdelay; // NPC delay
public int showorder; // Display order
public byte allow_forms; // Allowed forms
public int apcost; // AP cost
public int apgain; // AP gain
public byte doenchant; // Do enchant
public byte dobless; // Do bless
public int arrowcost; // Arrow cost
public Dictionary<uint, int> pre_skills;
// Execute condition
public bool allow_land; // ½Ч // Effective on land
public bool allow_air; // Ч // Effective in air
public bool allow_water; // ˮЧ // Effective in water
public bool notuse_in_combat; // ս״̬ // Cannot use in combat state
public int restrict_corpse; // ֻʬЧ // Only effective on corpses
public bool restrict_change; // ǷԱ // Whether can transform
public bool restrict_attach; // ǷԸ // Whether can possess
public bool auto_attack; // ʹúǷԶ // Whether to auto attack after use
public byte time_type; // ˲ // Instant cast type
public byte long_range;
public byte posdouble; // λѡ // Position selection
public int clslimit; // ְҵ // Class restriction
public int commoncooldown; // ȴmask bit0-4 ȴ0-4 bit5-9 Ʒȴ0-4
// Common cooldown mask bit0-4 skill cooldown 0-4 bit5-9 item cooldown 0-4
public int commoncooldowntime; // ȴʱλ // Cooldown time in milliseconds
public int itemcost; // ͷʱƷ >0Ч // Item cost when casting, effective if >0
// // Combo related
public int combosk_preskill;
public int combosk_interval;
public int combosk_nobreak;
public string effect;
public string aerial_effect;
public Range range;
public bool has_stateattack;
public List<int> restrict_weapons = new List<int>();
public static Dictionary<uint, SkillStub> map = new Dictionary<uint, SkillStub>();
public static Dictionary<uint, SkillStub> GetMap() => map;
public static Dictionary<uint, List<uint>> comboSkillMap = new Dictionary<uint, List<uint>>();
public static Dictionary<uint, List<uint>> GetComboSkMap() => comboSkillMap;
public static Dictionary<uint, List<uint>> inheritSkillMap = new Dictionary<uint, List<uint>>();
/*#if UNITY_EDITOR
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void OnPlay()
{
BMLogger.LogError("SkillStub OnPlay Reset");
map = new Dictionary<uint, SkillStub>();
comboSkillMap = new Dictionary<uint, List<uint>>();
inheritSkillMap = new Dictionary<uint, List<uint>>();
}
#endif*/
public SkillStub(uint i)
{
id = i;
is_inherent = (false);
is_movingcast = (false);
itemcost = (0);
combosk_preskill = (0);
combosk_interval = (0);
combosk_nobreak = (0);
if (GetStub(id) == null)
{
GetMap().Add(id, this);
}
}
public static List<uint> GetInherentSkillList(uint cls)
{
return inheritSkillMap[cls];
}
public static SkillStub GetStub(uint i)
{
return GetMap().TryGetValue(i, out var stub) ? stub : null;
}
public int GetItemCost() { return itemcost; }
public static void InitStaticData()
{
var map = GetMap();
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);
}
}
public List<uint> GetPostComboSkill(uint id)
{
var m = GetComboSkMap();
if (m.TryGetValue(id, out var list)) return list;
return null;
}
// ΪC++תĽӿ // The following methods are converted from C++
public uint GetId() { return id; }
public int GetCls() { return cls; }
public string GetName() { return name; }
public string GetIcon() { return icon; }
public int GetMaxLevel() { return max_level; }
public Range GetRange() { return range; }
public bool IsMovingSkill() { return is_movingcast; }
public byte GetType() { return type; } // System.Object.GetType // Hide System.Object.GetType
// ʱ // Runtime-related virtual functions
public virtual int GetCoolingtime(Skill skill) { return 5000; }
public virtual int GetRequiredSp(Skill skill) { return 0; }
public virtual int GetRequiredLevel(Skill skill) { return 0; }
public virtual int GetMaxAbility(Skill skill) { return 0; }
public virtual int GetRequiredItem(Skill skill) { return 0; }
public virtual int GetRequiredMoney(Skill skill) { return 0; }
public virtual int GetRequiredRealmLevel(Skill skill) { return 0; }
public virtual float GetPraydistance(Skill skill) { return 0f; }
public virtual float GetMpcost(Skill skill) { return 0f; }
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; }
// ЧԼ // Validate weapon restriction
public bool ValidWeapon(int weapon)
{
if (restrict_weapons != null)
{
int i;
for (i = 0; i < restrict_weapons.Count; i++)
{
if (weapon == restrict_weapons[i])
return true;
}
if (i > 0 && i >= restrict_weapons.Count)
return false;
}
return true;
}
}
using System.Collections.Generic;
using UnityEngine;
namespace BrewMonster.Scripts.Skills
{
public class Range
{
/// <summary>0=point 1=line 2=self sphere 3=target sphere 4=cone 5=self</summary>
public byte type; // 0 1 2 3Ŀ 4Բ׶ 5
public bool IsPoint() { return type == 0; }
public bool IsLine() { return type == 1; }
public bool IsSelfBall() { return type == 2; }
public bool IsTargetBall() { return type == 3; }
public bool IsSector() { return type == 4; }
public bool IsSelf() { return type == 5; }
public bool NoTarget() { return type == 2 || type == 5; }
}
// ռλ // Placeholder Skill class
public class Skill : ElementSkill
{
protected SkillStub stub;
protected PlayerWrapper player;
protected uint id;
protected uint level;
Skill(uint i, SkillStub s)
{
id = i;
stub = s;
player = new PlayerWrapper();
}
public static Skill Create(uint id, int n)
{
SkillStub stub = SkillStub.GetStub(id);
if (stub == null)
return null;
Skill skill = new Skill(id, stub);
int max = skill.GetMaxLevel();
if (n > max)
skill.SetLevel(max);
else
skill.SetLevel(n);
return skill;
}
public override int GetMaxLevel() { return stub.GetMaxLevel(); }
public override int SetLevel(int l)
{
uint tmp = level;
level = (uint)l;
return (int)tmp;
}
public override int GetItemCost() { return stub.itemcost; }
public int GetLevel() { return (int)level; }
public PlayerWrapper GetPlayer()
{
return player;
}
public override int GetRank() { return stub.rank; }
public override bool IsInstant() { return stub.time_type == 1; }
public override int GetCls()
{
return stub.GetCls();
}
public override Dictionary<uint, int> GetJunior()
{
return stub.is_senior != 0 ? stub.pre_skills : new Dictionary<uint, int>();
}
public override int GetRangeType() { return stub.GetRange().type; }
public override int GetRequiredLevel() { return stub.GetRequiredLevel(this); }
public override int GetTargetType()
{
if (stub.restrict_corpse == 1)
return 2;
if (stub.restrict_corpse == 2)
return 3;
if (stub.type == (int)skill_type.TYPE_ATTACK || stub.type == (int)skill_type.TYPE_CURSE)
return 1;
if (stub.type == (int)skill_type.TYPE_BLESSPET)
return 4;
if (stub.GetRange().NoTarget())
return 0;
return 1;
}
public override byte GetType() { return stub.type; }
public override int GetCommonCoolDown() { return stub.commoncooldown; }
public override string GetIcon()
{
return stub.GetIcon();
}
public override string GetName() { return stub.GetName(); }
public override float GetPrayRange(float range, float prayplus)
{
player.SetRange(range);
player.SetPrayrangeplus(prayplus);
if (stub.type == (int)skill_type.TYPE_ATTACK || stub.type == (int)skill_type.TYPE_CURSE)
{
if (stub.auto_attack)
{
float r = 0.3f * stub.GetPraydistance(this);
if (r >= 1.0)
return stub.GetPraydistance(this) - 1.0f;
else
return (float)0.7 * stub.GetPraydistance(this);
}
else
return stub.GetPraydistance(this);
}
if (stub.type == (int)skill_type.TYPE_JUMP)
return stub.GetPraydistance(this);
if (stub.GetRange().NoTarget())
return -1;
else
return stub.GetPraydistance(this);
}
public override int GetCoolingTime() { return stub.GetCoolingtime(this); }
public int GetRequiredSp() { return stub.GetRequiredSp(this); }
public int GetRequiredMoney() { return stub.GetRequiredMoney(this); }
public override Dictionary<uint, int> GetRequiredSkill() { return stub.pre_skills; }
public int GetRequiredRealmLevel() { return stub.GetRequiredRealmLevel(this); }
public int GetMaxability() { return stub.GetMaxAbility(this); }
public uint GetId() { return id; }
}
public abstract class SkillStub
{
public const int MIN_LEVEL = 1;
public const int MAX_LEVEL = 10;
// Base info
public uint id; // Ψһֱʶ // Unique identifier
public int cls; // ְҵ // Class/Profession
public string name; // // Skill name
public string nativename; // // Native name
public string icon; // ͼ // Skill icon
public int max_level; // 󼶱? // Maximum level
public byte type; // ? 1 2 3ٻ 4 5 // Skill type: 1-Normal 2-Special 3-Partner 4-Mount 5-Other
// Execute condition
public bool allow_ride; // ? // Allow while riding
public short attr; // , 1256 ѡһ Ĭϣ // Attribute: 1-Metal 2-Earth 3-Wood 4-Water 5-Fire 6-Special (Choose one, default none)
public int rank; // // Rank
public int eventflag; // Event flag
public byte is_senior; // Senior flag
public bool is_inherent; // ܣѧ // Inherent skill, cannot be learned
public bool is_movingcast; // ƶʩ // Can cast while moving
public int npcdelay; // NPC delay
public int showorder; // Display order
public byte allow_forms; // Allowed forms
public int apcost; // AP cost
public int apgain; // AP gain
public byte doenchant; // Do enchant
public byte dobless; // Do bless
public int arrowcost; // Arrow cost
public Dictionary<uint, int> pre_skills;
// Execute condition
public bool allow_land; // ½Ч // Effective on land
public bool allow_air; // Ч // Effective in air
public bool allow_water; // ˮЧ // Effective in water
public bool notuse_in_combat; // ս״̬ // Cannot use in combat state
public int restrict_corpse; // ֻʬЧ // Only effective on corpses
public bool restrict_change; // ǷԱ // Whether can transform
public bool restrict_attach; // ǷԸ // Whether can possess
public bool auto_attack; // ʹúǷԶ // Whether to auto attack after use
public byte time_type; // ˲ // Instant cast type
public byte long_range;
public byte posdouble; // λѡ // Position selection
public int clslimit; // ְҵ // Class restriction
public int commoncooldown; // ȴmask bit0-4 ȴ0-4 bit5-9 Ʒȴ0-4
// Common cooldown mask bit0-4 skill cooldown 0-4 bit5-9 item cooldown 0-4
public int commoncooldowntime; // ȴʱλ // Cooldown time in milliseconds
public int itemcost; // ͷʱƷ >0Ч // Item cost when casting, effective if >0
// // Combo related
public int combosk_preskill;
public int combosk_interval;
public int combosk_nobreak;
public string effect;
public string aerial_effect;
public Range range;
public bool has_stateattack;
public List<int> restrict_weapons = new List<int>();
public static Dictionary<uint, SkillStub> map = new Dictionary<uint, SkillStub>();
public static Dictionary<uint, SkillStub> GetMap() => map;
public static Dictionary<uint, List<uint>> comboSkillMap = new Dictionary<uint, List<uint>>();
public static Dictionary<uint, List<uint>> GetComboSkMap() => comboSkillMap;
public static Dictionary<uint, List<uint>> inheritSkillMap = new Dictionary<uint, List<uint>>();
/*#if UNITY_EDITOR
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void OnPlay()
{
BMLogger.LogError("SkillStub OnPlay Reset");
map = new Dictionary<uint, SkillStub>();
comboSkillMap = new Dictionary<uint, List<uint>>();
inheritSkillMap = new Dictionary<uint, List<uint>>();
}
#endif*/
public SkillStub(uint i)
{
id = i;
is_inherent = (false);
is_movingcast = (false);
itemcost = (0);
combosk_preskill = (0);
combosk_interval = (0);
combosk_nobreak = (0);
if (GetStub(id) == null)
{
GetMap().Add(id, this);
}
}
public static List<uint> GetInherentSkillList(uint cls)
{
return inheritSkillMap[cls];
}
public static SkillStub GetStub(uint i)
{
return GetMap().TryGetValue(i, out var stub) ? stub : null;
}
public int GetItemCost() { return itemcost; }
public static void InitStaticData()
{
var map = GetMap();
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);
}
}
public List<uint> GetPostComboSkill(uint id)
{
var m = GetComboSkMap();
if (m.TryGetValue(id, out var list)) return list;
return null;
}
// ΪC++תĽӿ // The following methods are converted from C++
public uint GetId() { return id; }
public int GetCls() { return cls; }
public string GetName() { return name; }
public string GetIcon() { return icon; }
public int GetMaxLevel() { return max_level; }
public Range GetRange() { return range; }
public bool IsMovingSkill() { return is_movingcast; }
public byte GetType() { return type; } // System.Object.GetType // Hide System.Object.GetType
// ʱ // Runtime-related virtual functions
public virtual int GetCoolingtime(Skill skill) { return 5000; }
public virtual int GetRequiredSp(Skill skill) { return 0; }
public virtual int GetRequiredLevel(Skill skill) { return 0; }
public virtual int GetMaxAbility(Skill skill) { return 0; }
public virtual int GetRequiredItem(Skill skill) { return 0; }
public virtual int GetRequiredMoney(Skill skill) { return 0; }
public virtual int GetRequiredRealmLevel(Skill skill) { return 0; }
public virtual float GetPraydistance(Skill skill) { return 0f; }
public virtual float GetMpcost(Skill skill) { return 0f; }
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; }
// ЧԼ // Validate weapon restriction
public bool ValidWeapon(int weapon)
{
if (restrict_weapons != null)
{
int i;
for (i = 0; i < restrict_weapons.Count; i++)
{
if (weapon == restrict_weapons[i])
return true;
}
if (i > 0 && i >= restrict_weapons.Count)
return false;
}
return true;
}
}
}
@@ -168,3 +168,4 @@ namespace BrewMonster
@@ -169,3 +169,4 @@ namespace BrewMonster
@@ -100,3 +100,4 @@ namespace BrewMonster
+1 -1
View File
@@ -14,7 +14,7 @@ namespace BrewMonster.UI
protected Canvas m_canvas;
protected Dictionary<int, string> m_StringTable = new Dictionary<int, string>();
protected Dictionary<int, string> m_auiDialog_stringTable = new Dictionary<int, string>();
protected Dictionary<string, AUIDialog> m_DlgName = new Dictionary<string, AUIDialog>();
public Dictionary<string, AUIDialog> m_DlgName = new Dictionary<string, AUIDialog>();
public string GetStringFromTable(int idString)
{
@@ -0,0 +1,28 @@
using BrewMonster.UI;
using UnityEngine;
using static CECUIManager;
namespace BrewMonster
{
public class CDlgMessageBox : AUIDialog
{
[SerializeField] private TMPro.TextMeshProUGUI titleText;
[SerializeField] private TMPro.TextMeshProUGUI messageText;
[SerializeField] private UnityEngine.UI.Button okButton;
private void Awake()
{
okButton.onClick.AddListener(OnOkClicked);
}
private void OnOkClicked()
{
EventBus.Publish(new MessageBoxEvent(1,this));
Show(false);
}
public void ShowMessageBox(string title, string message)
{
SetName(title);
messageText.text = message;
Show(true);
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 6672523dc3dacfa46b2104f504acdb6e
@@ -13,13 +13,28 @@ namespace BrewMonster.UI
protected uint m_dwData;
protected object m_pvData;
protected AUIManager m_pAUIManager = null;
string m_szName;
public virtual void Show(bool value)
{
gameObject.SetActive(value);
OnShowDialogue();
}
public string GetName()
{
return m_szName;
}
public bool SetName(string pszName)
{
if (m_pAUIManager.m_DlgName[pszName])
return false;
m_pAUIManager.m_DlgName.Remove(m_szName);
m_szName = pszName;
m_pAUIManager.m_DlgName[m_szName] = this;
return true;
}
public void SetData(uint dwData, string strName)
{
m_strDataName = strName;
@@ -83,22 +98,22 @@ namespace BrewMonster.UI
public virtual void OnEnable()
{
}
public virtual void OnDisable()
{
}
public virtual void Awake()
{
}
public virtual void Start()
{
}
public virtual void Update()
@@ -107,7 +122,7 @@ namespace BrewMonster.UI
}
public virtual void OnShowDialogue()
{
}
public virtual bool Render()
@@ -1,4 +1,5 @@
using BrewMonster.Scripts.Skills;
using BrewMonster.UI;
using System;
using TMPro;
using UnityEngine;
@@ -23,6 +24,95 @@ namespace BrewMonster
private const string l_colorRed = "<color=#ff0000>";
private const string l_colorClose = "</color>";
private void Awake()
{
m_upgradeBtn.onClick.AddListener(OnCommand_Upgrade);
}
private void OnCommand_Upgrade()
{
CECHostPlayer player = GetHostPlayer();
if (player == null)
{
return;
}
var uiManager = CECUIManager.Instance;
var gameUIMan = uiManager.GetInGameUIMan();
if (player.IsDead() ||
player.IsSitting() ||
player.IsChangingFace() ||
player.IsTrading() ||
player.GetBoothState() != 0 ||
player.IsRooting() ||
player.IsHangerOn() ||
player.GetCurSkill() != null ||
player.IsFighting())
{
uiManager.ShowMessageBox("MessageBox", gameUIMan.GetStringFromTable(11327));
}
int nCondition = CECHostSkillModel.Instance.CheckLearnCondition(m_skillID);
int nCheckCode = 0;
if (1 == nCondition)
{
nCheckCode = 270;
}
else if (6 == nCondition)
{
nCheckCode = 527;
}
else if (7 == nCondition)
{
nCheckCode = 541;
}
else if (8 == nCondition)
{
nCheckCode = 271;
}
else if (9 == nCondition)
{
nCheckCode = 556;
}
else if (10 == nCondition)
{
nCheckCode = 557;
}
else if (12 == nCondition)
{
nCheckCode = 11168;
}
else
{
BMLogger.LogError("CheckLearnCondition: " + (nCheckCode == 0));
}
if (nCheckCode == 0)
{
int needMoney = CECHostSkillModel.Instance.GetSkillMoney(m_skillID, m_curLevel + 1);
int needSp = CECHostSkillModel.Instance.GetSkillSp(m_skillID, m_curLevel + 1);
string str = string.Format(GetStringFromTable(11326), needMoney, needSp);
uiManager.ShowMessageBox("Game_LearnSkill", str);
//GetGameUIMan()->MessageBox("Game_LearnSkill", str, //GetGameUIMan()->GetStringFromTable(231),
// MB_OKCANCEL, A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox);
//pMsgBox->SetData(m_skillID);
// 򿪶ԻʱNPC͵HelloϢûյظٴη
/* if (!gameUIMan.m_pDlgSkillAction.IsReceivedNPCGreeting())
{
CECHostSkillModel::Instance().SendHelloToSkillLearnNPC();
}*/
}
else
{
/* GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(nCheckCode), MB_OK,
A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox);
pMsgBox->SetLife(3);*/
}
}
public void UpdateSkill(int skillID)
{
CECHostSkillModel model = CECHostSkillModel.Instance;
@@ -46,15 +136,15 @@ namespace BrewMonster
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 = GNET::ElementSkill::GetRequiredLevel(m_skillID, 1);
reqRealmLevel = GNET::ElementSkill::GetRequiredRealmLevel(m_skillID, 1);*/
}
else
{
/* 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 = GNET::ElementSkill::GetRequiredLevel(m_skillID, m_curLevel);
reqRealmLevel = GNET::ElementSkill::GetRequiredRealmLevel(m_skillID, m_curLevel);*/
}
string skillName = model.GetSkillName(m_skillID);
@@ -108,11 +198,11 @@ namespace BrewMonster
if (spOK && moneyOK && preSkillOK)
{
m_upgradeBtn.interactable = true;
m_upgradeBtn.interactable = true;
}
else
{
m_upgradeBtn.interactable = (false);
m_upgradeBtn.interactable = (false);
}
/*string strSp;
+207 -2
View File
@@ -502,6 +502,8 @@ namespace BrewMonster
case int value when value == EC_MsgDef.MSG_PM_PLAYERGATHER: OnMsgPlayerGather(Msg); break;
case int value when value == EC_MsgDef.MSG_HST_COOLTIMEDATA: OnMsgHstCoolTimeData(Msg); break;
case int value when value == EC_MsgDef.MSG_HST_SETCOOLTIME: OnMsgHstSetCoolTime(Msg); break;
case int value when value == EC_MsgDef.MSG_HST_LEARNSKILL: OnMsgHstLearnSkill(Msg); break;
}
@@ -525,6 +527,53 @@ namespace BrewMonster
}*/
}
private void OnMsgHstLearnSkill(ECMSG Msg)
{
BMLogger.LogError("OnMsgHstLearnSkill");
cmd_learn_skill pCmd = GPDataTypeHelper.FromBytes<cmd_learn_skill>((byte[])Msg.dwParam1);
CECSkill pSkill = GetNormalSkill(pCmd.skill_id);
if (pSkill != null)
{
if (pCmd.skill_level > 0)
{
pSkill.LevelUp();
ElementSkill.SetLevel((uint)pCmd.skill_id, pCmd.skill_level);
}
else
{
RemoveNormalSkill(pCmd.skill_id);
}
}
else if (pCmd.skill_level > 0)
{
pSkill = new CECSkill(pCmd.skill_id, pCmd.skill_level);
if (pSkill == null)
{
Debug.Assert(pSkill != null);
return;
}
if (!pSkill.GetJunior().Empty())
{
ReplaceJuniorSkill(pSkill);
}
else
{
if (pSkill.GetType() != (int)CECSkill.SkillType.TYPE_PASSIVE &&
pSkill.GetType() != (int)CECSkill.SkillType.TYPE_PRODUCE &&
pSkill.GetType() != (int)CECSkill.SkillType.TYPE_LIVE)
m_aPtSkills.Add(pSkill);
else
m_aPsSkills.Add(pSkill);
}
ElementSkill.SetLevel((uint)pCmd.skill_id, pCmd.skill_level);
}
CECHostSkillModel.Instance.OnLearnSkill(pCmd.skill_id, pCmd.skill_level);
}
private void OnMsgHstSetCoolTime(ECMSG Msg)
{
BMLogger.LogError("HoangDev : OnMsgHstSetCoolTime ");
@@ -5080,7 +5129,7 @@ namespace BrewMonster
// }
// UpdateMonsterSpiritGfx(dwDeltaTime);
}
public byte GetRealmLevel(){ return m_RealmLevel; }
public byte GetRealmLevel() { return m_RealmLevel; }
// Level up
public void LevelUp()
@@ -5292,7 +5341,7 @@ namespace BrewMonster
}
// Can jump or take off in water ?
bool IsSitting()
public bool IsSitting()
{
return (m_dwStates & PlayerNPCState.GP_STATE_SITDOWN) != 0 ? true : false;
}
@@ -6133,5 +6182,161 @@ namespace BrewMonster
}
}
}
// Remove skill reference / 删除技能引用
void RemoveSkillReference(int idSkill)
{
if (idSkill <= 0) return;
// Remove reference to self skill / 删除对技能的引用
if (m_pPrepSkill != null && m_pPrepSkill.GetSkillID() == idSkill)
m_pPrepSkill = null;
if (m_pCurSkill != null && m_pCurSkill.GetSkillID() == idSkill)
m_pCurSkill = null;
if (m_pComboSkill != null && m_pComboSkill.FindSkillID(idSkill))
ClearComboSkill();
if (m_pWorkMan != null)
{
CECHPWork pWork = m_pWorkMan.GetWork(CECHPWork.Host_work_ID.WORK_TRACEOBJECT);
if (pWork != null)
{
CECHPWorkTrace pWorkTrace = pWork as CECHPWorkTrace;
if (pWorkTrace != null &&
pWorkTrace.GetTraceReason() == CECHPWorkTrace.Trace_reason.TRACE_SPELL &&
pWorkTrace.GetPrepSkill() != null &&
pWorkTrace.GetPrepSkill().GetSkillID() == idSkill)
pWorkTrace.Reset();
}
}
int i;
for (i = 0; i < HostCfgConstants.NUM_HOSTSCSETS1; i++)
{
if (m_aSCSets1[i] != null)
m_aSCSets1[i].RemoveSkillShortcut(idSkill);
}
for (i = 0; i < HostCfgConstants.NUM_HOSTSCSETS2; i++)
{
if (m_aSCSets2[i] != null)
m_aSCSets2[i].RemoveSkillShortcut(idSkill);
}
}
// Remove skill / 删除技能
void RemoveNormalSkill(int idSkill)
{
// Delete equipped skills / 删除装备技能
if (idSkill <= 0) return;
RemoveSkillReference(idSkill);
// Delete skill list pointer / 删除技能列表指针
int i;
for (i = 0; i < m_aPtSkills.Count; i++)
{
if (m_aPtSkills[i].GetSkillID() == idSkill)
{
m_aPtSkills.RemoveAt(i);
return;
}
}
for (i = 0; i < m_aPsSkills.Count; i++)
{
if (m_aPsSkills[i].GetSkillID() == idSkill)
{
m_aPsSkills.RemoveAt(i);
return;
}
}
for (i = 0; i < m_aGoblinSkills.Count; i++)
{
if (m_aGoblinSkills[i].GetSkillID() == idSkill)
{
m_aGoblinSkills.RemoveAt(i);
return;
}
}
}
// Clear combo skill / 清除连击技能
void ClearComboSkill()
{
if (m_pComboSkill != null)
{
m_pComboSkill = null;
}
}
// Replace specified skill with it's senior skill / 用高级技能替换指定的低级技能
void ReplaceJuniorSkill(CECSkill pSeniorSkill)
{
if (pSeniorSkill == null)
{
Debug.Assert(pSeniorSkill != null);
return;
}
SkillArrayWrapper juniorArray = pSeniorSkill.GetJunior();
if (juniorArray.Empty())
{
Debug.Assert(false);
return;
}
int i;
// Update shortcuts ... / 更新快捷方式...
for (i = 0; i < HostCfgConstants.NUM_HOSTSCSETS1; i++)
{
if (m_aSCSets1[i] != null)
m_aSCSets1[i].ReplaceSkillID(juniorArray, pSeniorSkill);
}
for (i = 0; i < HostCfgConstants.NUM_HOSTSCSETS2; i++)
{
if (m_aSCSets2[i] != null)
m_aSCSets2[i].ReplaceSkillID(juniorArray, pSeniorSkill);
}
// Update skill groups ... / 更新技能组...
// Note: Combo skill update logic may need to be added here
// Original C++ code had EC_VIDEO_SETTING and combo skill group logic
}
public int CheckSkillLearnCondition(int idSkill, bool bCheckBook)
{
int iLevel = 1;
CECSkill pSkill = GetNormalSkill(idSkill);
if (pSkill !=null)
iLevel = pSkill.GetSkillLevel() + 1;
if (iLevel == 1 && bCheckBook)
{
// Do we have the skill book ?
int idBook = ElementSkill.GetRequiredBook((uint)idSkill, iLevel);
if (idBook != 0 /*&& m_pPack.FindItem(idBook) < 0*/)
return 8;
}
// Build player information
LearnRequirement Info;
Info.level = GetMaxLevelSofar();
Info.sp = m_BasicProps.iSP;
Info.money = m_iMoneyCnt;
Info.profession = m_iProfession;
Info.rank = m_BasicProps.iLevel2;
Info.realm_level = GetRealmLevel();
return ElementSkill.LearnCondition((uint)idSkill, Info, iLevel);
}
}
}
+88 -3
View File
@@ -1,10 +1,12 @@
using System;
using System.Collections.Generic;
using BrewMonster;
using BrewMonster.Network;
using BrewMonster.UI;
using CSNetwork;
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UIElements;
public class CECUIManager : MonoSingleton<CECUIManager>
{
@@ -22,14 +24,16 @@ public class CECUIManager : MonoSingleton<CECUIManager>
[SerializeField] private Canvas canvasDlg;
[SerializeField] private CDlgQuickBar cDlgQuickBar;
[SerializeField] private Button btnSecondClick;
[SerializeField] private UnityEngine.UI.Button btnSecondClick;
[SerializeField] CDlgQuickBar m_pDlgQuickBar1;
CDlgMessageBox m_pDlgMessageBox;
protected override void Awake()
{
base.Awake();
EventBus.Subscribe<CECHostPlayer.NPCINFO>(ShowUINPC);
EventBus.Subscribe<NPCDiedEvent>(TryHideUINPC);
EventBus.Subscribe<MessageBoxEvent>(OnMessageBox);
gameUI = new CECGameUIMan();
gameUI.SetDependency(dialogResouce, canvasDlg);
@@ -97,6 +101,77 @@ public class CECUIManager : MonoSingleton<CECUIManager>
Debug.LogWarning($"Không tìm thấy UI {componentName} đã spawn trong canvasDlg. Type found: {(type != null ? type.FullName : "null")}");
}
public void ShowMessageBox(string title, string message)
{
var msgBox = GetInGameUIMan().GetDialog("DlgMessageBox") as CDlgMessageBox;
if (msgBox != null)
{
msgBox.ShowMessageBox(title, message);
}
else
{
Debug.LogError("DlgMessageBox not found in InGameUIMan");
}
}
private void OnMessageBox(MessageBoxEvent messageBoxEvent)
{
int iRetVal = messageBoxEvent.iRetVal;
AUIDialog pDlg = messageBoxEvent.pDlg;
if (pDlg == m_pDlgMessageBox)
{
OnNewMessageBox(iRetVal);
return;
}
UnityGameSession pSession = UnityGameSession.Instance;
CECHostPlayer pHost = CECGameRun.Instance.GetHostPlayer();
if (string.Equals(pDlg.GetName(), "Game_Quit", StringComparison.OrdinalIgnoreCase))
{
}
else if ((string.Equals(pDlg.GetName(), "Game_TeachSkill", StringComparison.OrdinalIgnoreCase) && DialogBoxCommandIDs.IDOK == iRetVal) ||
(string.Equals(pDlg.GetName(), "Game_LearnSkill", StringComparison.OrdinalIgnoreCase) && DialogBoxCommandIDs.IDOK == iRetVal))
{
if (string.Equals(pDlg.GetName(), "Game_TeachSkill", StringComparison.OrdinalIgnoreCase))
{
}
else if (string.Equals(pDlg.GetName(), "Game_LearnSkill", StringComparison.OrdinalIgnoreCase))
{
int skillID = (int)pDlg.GetData();
int nCondition = pHost.CheckSkillLearnCondition(skillID, true);
if (0 == nCondition)
{
UnityGameSession.c2s_SendCmdNPCSevLearnSkill(skillID);
}
/*else if (1 == nCondition)
AddChatMessage(GetStringFromTable(270), GP_CHAT_MISC);
else if (6 == nCondition)
AddChatMessage(GetStringFromTable(527), GP_CHAT_MISC);
else if (7 == nCondition)
AddChatMessage(GetStringFromTable(541), GP_CHAT_MISC);
else if (8 == nCondition)
AddChatMessage(GetStringFromTable(271), GP_CHAT_MISC);
else if (9 == nCondition)
AddChatMessage(GetStringFromTable(556), GP_CHAT_MISC);
else if (10 == nCondition)
AddChatMessage(GetStringFromTable(557), GP_CHAT_MISC);
else if (12 == nCondition)
AddChatMessage(GetStringFromTable(11168), GP_CHAT_MISC);*/
}
}
}
private bool OnNewMessageBox(int iRetVal)
{
return true;
}
private System.Type FindTypeByName(string componentName)
{
@@ -270,4 +345,14 @@ public class CECUIManager : MonoSingleton<CECUIManager>
}
}
}
public struct MessageBoxEvent
{
public int iRetVal;
public AUIDialog pDlg;
public MessageBoxEvent(int retVal, AUIDialog dlg)
{
iRetVal = retVal;
pDlg = dlg;
}
}
}
+19
View File
@@ -0,0 +1,19 @@
/*
* Dialog Box Command IDs
* Converted from Windows API definitions
*/
public static class DialogBoxCommandIDs
{
public const int IDOK = 1;
public const int IDCANCEL = 2;
public const int IDABORT = 3;
public const int IDRETRY = 4;
public const int IDIGNORE = 5;
public const int IDYES = 6;
public const int IDNO = 7;
public const int IDCLOSE = 8;
public const int IDHELP = 9;
public const int IDTRYAGAIN = 10;
public const int IDCONTINUE = 11;
public const int IDTIMEOUT = 32000;
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: d1c0dbd48a553e9498f6b0d391ec9707
+8
View File
@@ -120,5 +120,13 @@ namespace BrewMonster
offset += size;
}
}
// Learn skill command / 学习技能命令
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_learn_skill
{
public int skill_id; // Skill ID / 技能ID
public int skill_level; // Skill level / 技能等级
}
}