Merge remote-tracking branch 'origin/develop' into feature/HP_jump

# Conflicts:
#	Assets/Scenes/a61.unity
This commit is contained in:
Tungdv
2025-12-17 10:41:27 +07:00
101 changed files with 12282 additions and 1600 deletions
@@ -1699,6 +1699,12 @@ MonoBehaviour:
- equipment
- models
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 1442e7dcfba1366488f9abeab708864a
m_Address: "models/npcs/\u602A\u7269/32\u7269\u54C1\u5996/\u9B54\u6CD5\u5C01\u5370\u7684\u5B9D\u7BB1/\u9B54\u6CD5\u5C01\u5370\u7684\u5B9D\u7BB1\u5C0F.ecm"
m_ReadOnly: 0
m_SerializedLabels:
- models
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 14581b8af110f2547a48143cb80e5798
m_Address: "models/players/\u88C5\u5907/\u5973/13b\u6B66\u4FA0\u804C\u4E1A\u88C5\u4E0A\u8863/\u5973\u901A\u752813b\u6B66\u4FA0\u804C\u4E1A\u88C5\u4E0A\u8863.ecm"
m_ReadOnly: 0
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 7c4d0bbc7b1d74528bf58ca8c5e1de34
guid: e91d249ceb608ee4bb7b880be5e7a448
folderAsset: yes
DefaultImporter:
externalObjects: {}
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e4bd1ac89ebb2164ab48076ee3cbb56b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 390d29f03a8935448bef8884b836b7d3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,137 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-3115309107172234749
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier:
version: 10
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Box01_0
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHATEST_ON
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: 2450
stringTagMap:
RenderType: TransparentCutout
disabledShaderPasses:
- MOTIONVECTORS
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 2800000, guid: 914f1d1ec5673224388f8ae4eb93958a, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: 914f1d1ec5673224388f8ae4eb93958a, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 1
- _AlphaToMask: 1
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.001
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 0
- _WorkflowMode: 1
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5722cad6c9220a248b32d02be1e7015f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,203 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!43 &4300000
Mesh:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Box01_0
serializedVersion: 11
m_SubMeshes:
- serializedVersion: 2
firstByte: 0
indexCount: 66
topology: 0
baseVertex: 0
firstVertex: 0
vertexCount: 32
localAABB:
m_Center: {x: 0.004867792, y: 0.29433393, z: 0.000000014901161}
m_Extent: {x: 0.4090197, y: 0.2940315, z: 0.27242136}
m_Shapes:
vertices: []
shapes: []
channels: []
fullWeights: []
m_BindPose:
- e00: -0.016946318
e01: 0.9998566
e02: 0.000000029802326
e03: -0.039453417
e10: -0.00000008940697
e11: -0.00000011920929
e12: 1
e13: 0.000000006428704
e20: 0.9998565
e21: 0.016946256
e22: 0
e23: -0.0006686648
e30: 0
e31: 0
e32: 0
e33: 1
- e00: 1
e01: 0
e02: 0
e03: 0
e10: 0
e11: 1
e12: 0
e13: 0
e20: 0
e21: 0
e22: 1
e23: 0
e30: 0
e31: 0
e32: 0
e33: 1
m_BoneNameHashes:
m_RootBoneNameHash: 0
m_BonesAABB:
- m_Min: {x: -0.046164893, y: -0.27242136, z: -0.40475747}
m_Max: {x: 0.55567646, y: 0.27242136, z: 0.42313}
- m_Min: {x: Infinity, y: Infinity, z: Infinity}
m_Max: {x: -Infinity, y: -Infinity, z: -Infinity}
m_VariableBoneCountWeights:
m_Data:
m_MeshCompression: 0
m_IsReadable: 1
m_KeepVertices: 1
m_KeepIndices: 1
m_IndexFormat: 0
m_IndexBuffer: 0200010000000000030002000600050004000400070006000a00090008000c000b000a000d000c000a000d000a0008000e000d000800110010000f000f00120011001500140013001700160015001800170015001800150013001900180013001c001b001a001a001d001c0002001f001e001e00010002001f001c001d001d001e001f00
m_VertexData:
serializedVersion: 3
m_VertexCount: 32
m_Channels:
- stream: 0
offset: 0
format: 0
dimension: 3
- stream: 0
offset: 12
format: 0
dimension: 3
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 1
offset: 0
format: 0
dimension: 2
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 2
offset: 0
format: 0
dimension: 4
- stream: 2
offset: 16
format: 10
dimension: 4
m_DataSize: 2048
_typelessdata: 00edcebe4ecbb83ecb7a8b3e22830bb47a3b0b3f8cd3563fffeccebea1b7093fe477213e02bde6b3d783443f0f11243f0ee9d33ea1b7093fed77213e3dfbdcb3d783443f0f11243f0de9d33e4ecbb83ecf7a8b3e3e4e03b4793b0b3f8cd3563f0de9d33e73949e39d17a8b3ef29643b46878b1330000803f00edcebe73949e39cb7a8b3e22b56ab4000000000000803f00edcebe4ecbb83ecb7a8b3ef29643b46878b1330000803f0de9d33e4ecbb83ecf7a8b3ec2781cb4687831340000803f00edcebe73949e39cb7a8b3e000080bff5e251329c3230b4fdeccebea1919e39cf7a8bbe000080bfb94b74a89c3230b4fdeccebe4ecbb83ed07a8bbe000080bf99531bb2aeb51db4feeccebea1b7093fed7721be000080bfed6278b3441637b4ffeccebe1e9f163f6db8a3b3000080bf5ddb1fb403f0cab3ffeccebea1b7093fe477213e000080bfc8802bb2ac1a20b400edcebe4ecbb83ecb7a8b3e000080bf00000000f0728bb4fdeccebea1919e39cf7a8bbec1781c346778b1b3000080bf10e9d33ea1919e39cb7a8bbec1781c346778b1b3000080bf10e9d33e4ecbb83ecc7a8bbec1781c346778b1b3000080bffdeccebe4ecbb83ed07a8bbec1781c346778b1b3000080bf10e9d33ea1919e39cb7a8bbe0000803f0de351329d3230340de9d33e73949e39d17a8b3e0000803fba4bf4289c3230340de9d33e4ecbb83ecf7a8b3e0000803f89531bb2b1b51d340ee9d33ea1b7093fed77213e0000803ff66278b3421637340fe9d33e1e9f163f589d82330000803f5edb1fb403f0ca330fe9d33ea1b7093fe57721be0000803fc1802bb2ad1a203410e9d33e4ecbb83ecc7a8bbe0000803f1b58c128ef728b34fdeccebe4ecbb83ed07a8bbe0ff6fe337c3b0b3f8cd356bf10e9d33e4ecbb83ecc7a8bbe0ff6fe337c3b0b3f8cd356bf0fe9d33ea1b7093fe57721be80b2de33a404313f19ef38bffeeccebea1b7093fed7721bedfe3ab33b908573f4be90abfffeccebe1e9f163f6db8a3b3d802b9b2128f7e3f5300d93d0fe9d33e1e9f163f589d823375ae7632128f7e3f5300d9bd0000013f000000000000013f0000d03d00007f3f0000d03d00007f3f000000000000fe3e00007f3f0000803b00007f3f0000803b0000433f0000fe3e0000433f0000013f0000803f00007f3f0000803f00007f3f0000463f0000633f00002a3f00003f3f0000233f00001a3f00002a3f0000013f0000463f0000013f0000203f00007f3f0000203f00007f3f0000c43e0000013f0000c43e0000013f0000803f00007f3f0000803f00007f3f0000463f0000633f00002a3f00003f3f0000233f00001a3f00002a3f0000013f0000463f0000013f0000c43e00007f3f0000c43e00007f3f0000923e0000013f0000923e0000013f0000443e00007f3f0000443e0000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f000000000000000000000000000000000000000000000000000000000000803f00000000000000000000000000000000000000000000000000000000
m_CompressedMesh:
m_Vertices:
m_NumItems: 0
m_Range: 0
m_Start: 0
m_Data:
m_BitSize: 0
m_UV:
m_NumItems: 0
m_Range: 0
m_Start: 0
m_Data:
m_BitSize: 0
m_Normals:
m_NumItems: 0
m_Range: 0
m_Start: 0
m_Data:
m_BitSize: 0
m_Tangents:
m_NumItems: 0
m_Range: 0
m_Start: 0
m_Data:
m_BitSize: 0
m_Weights:
m_NumItems: 0
m_Data:
m_BitSize: 0
m_NormalSigns:
m_NumItems: 0
m_Data:
m_BitSize: 0
m_TangentSigns:
m_NumItems: 0
m_Data:
m_BitSize: 0
m_FloatColors:
m_NumItems: 0
m_Range: 0
m_Start: 0
m_Data:
m_BitSize: 0
m_BoneIndices:
m_NumItems: 0
m_Data:
m_BitSize: 0
m_Triangles:
m_NumItems: 0
m_Data:
m_BitSize: 0
m_UVInfo: 0
m_LocalAABB:
m_Center: {x: 0.004867792, y: 0.29433393, z: 0.000000014901161}
m_Extent: {x: 0.4090197, y: 0.2940315, z: 0.27242136}
m_MeshUsageFlags: 0
m_CookingOptions: 30
m_BakedConvexCollisionMesh:
m_BakedTriangleCollisionMesh:
'm_MeshMetrics[0]': 1
'm_MeshMetrics[1]': 1
m_MeshOptimizationFlags: 1
m_StreamData:
serializedVersion: 2
offset: 0
size: 0
path:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 58c1a2d10ae2b914a88a2281bb5bf96a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 4300000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,119 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &6140007671914382511
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8903825486503764437}
- component: {fileID: 8750203408594128925}
- component: {fileID: 5166826509143948991}
- component: {fileID: 5459939725609795997}
m_Layer: 0
m_Name: Box01_0
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8903825486503764437
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6140007671914382511}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &8750203408594128925
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6140007671914382511}
m_Mesh: {fileID: 4300000, guid: 58c1a2d10ae2b914a88a2281bb5bf96a, type: 2}
--- !u!137 &5166826509143948991
SkinnedMeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6140007671914382511}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 3
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 5722cad6c9220a248b32d02be1e7015f, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
serializedVersion: 2
m_Quality: 0
m_UpdateWhenOffscreen: 0
m_SkinnedMotionVectors: 1
m_Mesh: {fileID: 4300000, guid: 58c1a2d10ae2b914a88a2281bb5bf96a, type: 2}
m_Bones:
- {fileID: 0}
- {fileID: 0}
m_BlendShapeWeights: []
m_RootBone: {fileID: 0}
m_AABB:
m_Center: {x: 0, y: 0, z: 0}
m_Extent: {x: 0, y: 0, z: 0}
m_DirtyAABB: 0
--- !u!114 &5459939725609795997
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6140007671914382511}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2189a384460241f89635c90802d6c270, type: 3}
m_Name:
m_EditorClassIdentifier:
_skeletonBuilder: {fileID: 0}
_meshFilter: {fileID: 8750203408594128925}
_skinnedMeshRenderer: {fileID: 5166826509143948991}
BoneNames:
- Bone02
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 3ea4854beb922e24fb53875ae9bb6740
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,380 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &2142465482498032316
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 9116329449756975279}
- component: {fileID: 5602719492404425111}
m_Layer: 0
m_Name: "\u9B54\u6CD5\u5C01\u5370\u7684\u5B9D\u7BB1"
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &9116329449756975279
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2142465482498032316}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1682221397893027975}
- {fileID: 2287142222681038928}
- {fileID: 6560746386147567036}
m_Father: {fileID: 2504815096422338851}
m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0}
--- !u!95 &5602719492404425111
Animator:
serializedVersion: 7
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2142465482498032316}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 0}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_StabilizeFeet: 0
m_AnimatePhysics: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!1 &2342673677820808233
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5751786341065879054}
m_Layer: 0
m_Name: HH_fx01
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &5751786341065879054
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2342673677820808233}
serializedVersion: 2
m_LocalRotation: {x: -0.0000000305647, y: 0.70108974, z: 0.00000003005105, w: 0.7130731}
m_LocalPosition: {x: 0.27565014, y: 8.647188e-11, z: 0.003151229}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 4632241631221141121}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &4838574376121939473
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1682221397893027975}
- component: {fileID: 2675749075624738704}
- component: {fileID: 6676038990753274020}
m_Layer: 0
m_Name: CustomMeshRender
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!4 &1682221397893027975
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4838574376121939473}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 9116329449756975279}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &2675749075624738704
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4838574376121939473}
m_Mesh: {fileID: 0}
--- !u!137 &6676038990753274020
SkinnedMeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4838574376121939473}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 3
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
serializedVersion: 2
m_Quality: 0
m_UpdateWhenOffscreen: 0
m_SkinnedMotionVectors: 1
m_Mesh: {fileID: 0}
m_Bones: []
m_BlendShapeWeights: []
m_RootBone: {fileID: 0}
m_AABB:
m_Center: {x: 0, y: 0, z: 0}
m_Extent: {x: 0, y: 0, z: 0}
m_DirtyAABB: 0
--- !u!1 &5034815621241663843
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2504815096422338851}
- component: {fileID: 2886303939034520672}
m_Layer: 0
m_Name: "\u9B54\u6CD5\u5C01\u5370\u7684\u5B9D\u7BB1\u5C0F"
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2504815096422338851
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5034815621241663843}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 9116329449756975279}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!65 &2886303939034520672
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5034815621241663843}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 1, y: 0.58143216, z: 0.54702204}
m_Center: {x: 0, y: 0.2912911, z: -0.0027312338}
--- !u!1 &8235708353750757754
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2287142222681038928}
m_Layer: 0
m_Name: 000
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2287142222681038928
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8235708353750757754}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -1, z: -0, w: 0}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 4632241631221141121}
m_Father: {fileID: 9116329449756975279}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &9203708403987941035
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4632241631221141121}
m_Layer: 0
m_Name: Bone02
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4632241631221141121
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9203708403987941035}
serializedVersion: 2
m_LocalRotation: {x: 0.49574533, y: 0.50421876, z: 0.5042188, w: 0.49574536}
m_LocalPosition: {x: -0.000000018803775, y: 0.039459076, z: -0.0000000017248172}
m_LocalScale: {x: 0.99999994, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 5751786341065879054}
m_Father: {fileID: 2287142222681038928}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &2349975245296796777
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 9116329449756975279}
m_Modifications:
- target: {fileID: 5166826509143948991, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: m_RootBone
value:
objectReference: {fileID: 2287142222681038928}
- target: {fileID: 5166826509143948991, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: 'm_Bones.Array.data[0]'
value:
objectReference: {fileID: 4632241631221141121}
- target: {fileID: 5166826509143948991, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: 'm_Bones.Array.data[1]'
value:
objectReference: {fileID: 2287142222681038928}
- target: {fileID: 6140007671914382511, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: m_Name
value: Box01_0
objectReference: {fileID: 0}
- target: {fileID: 8903825486503764437, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8903825486503764437, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8903825486503764437, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8903825486503764437, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8903825486503764437, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 8903825486503764437, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 8903825486503764437, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 8903825486503764437, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8903825486503764437, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8903825486503764437, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
m_RemovedComponents:
- {fileID: 5459939725609795997, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
--- !u!4 &6560746386147567036 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8903825486503764437, guid: 3ea4854beb922e24fb53875ae9bb6740, type: 3}
m_PrefabInstance: {fileID: 2349975245296796777}
m_PrefabAsset: {fileID: 0}
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 1442e7dcfba1366488f9abeab708864a
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 87f438b49a50c704f89eb173bedc5588
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 56f4c39291f183847bd5aaaf3fb10d28
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 26996bc8b154b9a4db3ac53deae61246
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: 914f1d1ec5673224388f8ae4eb93958a
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
@@ -6483,8 +6483,8 @@ MonoBehaviour:
m_TargetGraphic: {fileID: 7392889747821849613}
m_HandleRect: {fileID: 2343337405992641122}
m_Direction: 2
m_Value: 1
m_Size: 1
m_Value: 0
m_Size: 0.9999435
m_NumberOfSteps: 0
m_OnValueChanged:
m_PersistentCalls:
@@ -7244,7 +7244,7 @@ GameObject:
- component: {fileID: 5506476487848131018}
- component: {fileID: 125385901698294646}
m_Layer: 5
m_Name: TaskWindow
m_Name: DlgTask
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -8731,7 +8731,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 8395333742829132721, guid: 9456de25596014039bd4d0d3927b709a, type: 3}
propertyPath: m_AnchoredPosition.y
value: 336.93002
value: 336.93
objectReference: {fileID: 0}
- target: {fileID: 8395333742829132721, guid: 9456de25596014039bd4d0d3927b709a, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
@@ -0,0 +1,397 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &111271885693053298
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 562642038236230410}
- component: {fileID: 3682957078725161371}
m_Layer: 5
m_Name: EmotionWindow
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &562642038236230410
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 111271885693053298}
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: 6149182975052679886}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &3682957078725161371
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 111271885693053298}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e42ed2cbf208e60488b8bc1d63a3b1d7, type: 3}
m_Name:
m_EditorClassIdentifier:
slot: 0
--- !u!1 &2171808091279523492
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2795398590258317195}
- component: {fileID: 659088020461764430}
- component: {fileID: 8890278808492480577}
- component: {fileID: 1984081446122729312}
m_Layer: 5
m_Name: Button
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2795398590258317195
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2171808091279523492}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 2.5381, y: 2.5381, z: 2.5381}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 3590330098133380806}
m_Father: {fileID: 6149182975052679886}
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: -435}
m_SizeDelta: {x: 160, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &659088020461764430
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2171808091279523492}
m_CullTransparentMesh: 1
--- !u!114 &8890278808492480577
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2171808091279523492}
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: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
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 &1984081446122729312
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2171808091279523492}
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: 8890278808492480577}
m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 3682957078725161371}
m_TargetAssemblyTypeName: BrewMonster.UI.EmoteWindow, Assembly-CSharp
m_MethodName: OnDragClick
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!1 &4678669480211337198
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6149182975052679886}
- component: {fileID: 3021640613906495181}
- component: {fileID: 7003611699134334505}
m_Layer: 5
m_Name: Image
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6149182975052679886
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4678669480211337198}
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: 2795398590258317195}
m_Father: {fileID: 562642038236230410}
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 &3021640613906495181
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4678669480211337198}
m_CullTransparentMesh: 1
--- !u!114 &7003611699134334505
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4678669480211337198}
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.8679245, g: 0.7242908, b: 0.1514774, a: 0.20392157}
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 &6260694520480554099
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3590330098133380806}
- component: {fileID: 7504965690579856955}
- component: {fileID: 8982944209707270503}
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 &3590330098133380806
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6260694520480554099}
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: 2795398590258317195}
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 &7504965690579856955
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6260694520480554099}
m_CullTransparentMesh: 1
--- !u!114 &8982944209707270503
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6260694520480554099}
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: WaveHand
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: eb88919320b4229459c83b6b1f8f1e7b
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -17,3 +17,9 @@ MonoBehaviour:
prefab: {fileID: 8237288432181259026, guid: 7653e7e64393ec24c903f0606499b8c4, type: 3}
- id: DialogNPCShop
prefab: {fileID: 8237288432181259026, guid: eaeb778b6aab3d74299373b3a96b72c4, type: 3}
- id: Win_Award
prefab: {fileID: 903595479696773158, guid: cf26d96ae7d984ba8a5b6cef44adffeb, type: 3}
- id: Win_Task
prefab: {fileID: 6999114045547682248, guid: 8027cada0ef5e4a9f827001b4747174d, type: 3}
- id: Win_SkillSubAction
prefab: {fileID: 111271885693053298, guid: eb88919320b4229459c83b6b1f8f1e7b, type: 3}
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2ec5e9190fb72ed1fa3a747cdae7ac86540f744820346de9c230c39ec766666d
size 16461
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 33049cc5acda8a341a74cc739bf0961b
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+2 -2
View File
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:79aee339596409d8a47e0a553b1257768bd84fa0e0d6261052b33c1077658ab0
size 41493
oid sha256:e3e518641de396e1b30dd202ff94dc35518476c7efd747501f45f10021136ca7
size 10723
@@ -10,7 +10,7 @@ namespace BrewMonster.Network
private static int m_AbsTimeStart;
private static int m_iTimeError; // 服务器与本机时间差(秒) // Time error in seconds
private static int m_iTimeZoneBias; // 服务器时区偏移(秒) // Server timezone bias in seconds
public static int GetTimeZoneBias() { return m_iTimeZoneBias; }
// 设置时间误差 // Set time error
public static void SetServerTime(int iSevTime, int iTimeZoneBias)
{
@@ -403,7 +403,7 @@ public class CECNPCMan : IMsgHandler
pNPC.SetSelectedTarget(pCmd.iTargetID);
pNPC.SetWorldHealthImage((float)pCmd.iHP , (float)pCmd.iMaxHP);
EventBus.Publish(new NPCINFO(pNPC.GetName(),pCmd.iHP,pCmd.iMaxHP, pCmd.idNPC));
EventBus.Publish(new CECHostPlayer.NPCINFO(pNPC.GetName(),pCmd.iHP,pCmd.iMaxHP, pCmd.idNPC));
}
break;
}
@@ -791,6 +791,14 @@ namespace BrewMonster.Scripts
{
return IsWorkRunning(Host_work_ID.WORK_SIT);
}
public bool IsStanding()
{
return IsWorkRunning(Host_work_ID.WORK_STAND);
}
public bool IsBeingBound()
{
return IsWorkRunning(Host_work_ID.WORK_BEBOUND);
}
//todo: use this method
public void FinishAllWork(bool bGotoStand)
{
@@ -516,7 +516,7 @@ namespace BrewMonster.Scripts
return true;
}
if ((GetMoveRelDirMask() & (uint)((MOVE_DIR.MD_LEFT | MOVE_DIR.MD_RIGHT | MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_BACK))) != 0)
if ((GetMoveRelDirMask() & (uint)((CECHostPlayer.MOVE_DIR.MD_LEFT | CECHostPlayer.MOVE_DIR.MD_RIGHT | CECHostPlayer.MOVE_DIR.MD_FORWARD | CECHostPlayer.MOVE_DIR.MD_BACK))) != 0)
m_iDestType = DestTypes.DEST_PUSH;
if (m_iDestType == DestTypes.DEST_2D)
@@ -652,7 +652,7 @@ namespace BrewMonster.Scripts
fSpeed = m_pHost.GetGroundSpeed();
bool bFinish = false;
if (m_pHost.GetPushDir(ref vMoveDir, (uint)(MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_BACK | MOVE_DIR.MD_LEFT | MOVE_DIR.MD_RIGHT), fDeltaTime))
if (m_pHost.GetPushDir(ref vMoveDir, (uint)(CECHostPlayer.MOVE_DIR.MD_FORWARD | CECHostPlayer.MOVE_DIR.MD_BACK | CECHostPlayer.MOVE_DIR.MD_LEFT | CECHostPlayer.MOVE_DIR.MD_RIGHT), fDeltaTime))
{
if (vMoveDir != Vector3.zero)
{
@@ -799,7 +799,7 @@ namespace BrewMonster.Scripts
if (!m_bReachedHeight)
{
m_pHost.m_vVelocity.y = 0.0f;
m_pHost.m_dwMoveRelDir &= ~((uint)(MOVE_DIR.MD_ABSUP | MOVE_DIR.MD_ABSDOWN));
m_pHost.m_dwMoveRelDir &= ~((uint)(CECHostPlayer.MOVE_DIR.MD_ABSUP | CECHostPlayer.MOVE_DIR.MD_ABSDOWN));
m_bReachedHeight = true;
}
}
@@ -809,13 +809,13 @@ namespace BrewMonster.Scripts
{
if (vCurPos.y < m_fAutoHeight * 10.0f)
{
m_pHost.m_dwMoveRelDir &= ~((uint)(MOVE_DIR.MD_ABSDOWN));
m_pHost.m_dwMoveRelDir |= ((uint)MOVE_DIR.MD_ABSUP);
m_pHost.m_dwMoveRelDir &= ~((uint)(CECHostPlayer.MOVE_DIR.MD_ABSDOWN));
m_pHost.m_dwMoveRelDir |= ((uint)CECHostPlayer.MOVE_DIR.MD_ABSUP);
}
else if (vCurPos.y > m_fAutoHeight * 10.0f)
{
m_pHost.m_dwMoveRelDir &= ~((uint)(MOVE_DIR.MD_ABSUP));
m_pHost.m_dwMoveRelDir |= (uint)MOVE_DIR.MD_ABSDOWN;
m_pHost.m_dwMoveRelDir &= ~((uint)(CECHostPlayer.MOVE_DIR.MD_ABSUP));
m_pHost.m_dwMoveRelDir |= (uint)CECHostPlayer.MOVE_DIR.MD_ABSDOWN;
}
}
else // Auto adjust height, so we should refresh move height
@@ -832,7 +832,7 @@ namespace BrewMonster.Scripts
}
}
if ((m_pHost.m_dwMoveRelDir & (uint)(MOVE_DIR.MD_LEFT | MOVE_DIR.MD_RIGHT | MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_BACK)) != 0)
if ((m_pHost.m_dwMoveRelDir & (uint)(CECHostPlayer.MOVE_DIR.MD_LEFT | CECHostPlayer.MOVE_DIR.MD_RIGHT | CECHostPlayer.MOVE_DIR.MD_FORWARD | CECHostPlayer.MOVE_DIR.MD_BACK)) != 0)
m_iDestType = DestTypes.DEST_PUSH;
ON_AIR_CDR_INFO cdr = m_pHost.m_AirCDRInfo;
@@ -840,7 +840,7 @@ namespace BrewMonster.Scripts
if (m_iDestType == DestTypes.DEST_DIR)
{
Vector3 vPushDir = Vector3.zero;
m_pHost.GetPushDir(ref vPushDir, (uint)MOVE_DIR.MD_ALL, 0);
m_pHost.GetPushDir(ref vPushDir, (uint)CECHostPlayer.MOVE_DIR.MD_ALL, 0);
vPushDir.x = vPushDir.z = 0.0f;
float fSpeed1H = m_pHost.m_vVelocity.MagnitudeH();
@@ -881,7 +881,7 @@ namespace BrewMonster.Scripts
else if (m_iDestType == DestTypes.DEST_2D)
{
Vector3 vPushDir = Vector3.zero;
m_pHost.GetPushDir(ref vPushDir, (uint)MOVE_DIR.MD_ALL, 0f);
m_pHost.GetPushDir(ref vPushDir, (uint)CECHostPlayer.MOVE_DIR.MD_ALL, 0f);
vPushDir.x = vPushDir.z = 0.0f;
float fSpeed1H = m_pHost.m_vVelocity.MagnitudeH();
@@ -1017,7 +1017,7 @@ namespace BrewMonster.Scripts
else if (m_iDestType == DestTypes.DEST_PUSH)
{
Vector3 vPushDir = Vector3.zero, vUp;
bool bPush = m_pHost.GetPushDir(ref vPushDir, (uint)(MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_BACK | MOVE_DIR.MD_LEFT | MOVE_DIR.MD_RIGHT), fDeltaTime);
bool bPush = m_pHost.GetPushDir(ref vPushDir, (uint)(CECHostPlayer.MOVE_DIR.MD_FORWARD | CECHostPlayer.MOVE_DIR.MD_BACK | CECHostPlayer.MOVE_DIR.MD_LEFT | CECHostPlayer.MOVE_DIR.MD_RIGHT), fDeltaTime);
if (!bPush)
{
@@ -1027,7 +1027,7 @@ namespace BrewMonster.Scripts
}
int nPitchDir = 0;
if ((m_pHost.m_dwMoveRelDir & (int)(MOVE_DIR.MD_LEFT | MOVE_DIR.MD_RIGHT)) == 0)
if ((m_pHost.m_dwMoveRelDir & (int)(CECHostPlayer.MOVE_DIR.MD_LEFT | CECHostPlayer.MOVE_DIR.MD_RIGHT)) == 0)
{
A3DVECTOR3 vOldDir = m_pHost.GetModelMoveDir();
vOldDir.y = 0;
@@ -1043,27 +1043,27 @@ namespace BrewMonster.Scripts
A3DVECTOR3 vUp_fAngle = A3DVECTOR3.CrossProduct(vOldDir, vNewDir);
if (vUp_fAngle.y > 0) nPitchDir = 1;
else nPitchDir = -1;
if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_BACK) != 0)
if ((m_pHost.m_dwMoveRelDir & (uint)CECHostPlayer.MOVE_DIR.MD_BACK) != 0)
nPitchDir = -nPitchDir;
}
}
if (m_pHost.m_dwMoveRelDir != 0)
{
if ((m_pHost.m_dwMoveRelDir & ~(uint)(MOVE_DIR.MD_ABSDOWN | MOVE_DIR.MD_ABSUP)) != 0)
if ((m_pHost.m_dwMoveRelDir & ~(uint)(CECHostPlayer.MOVE_DIR.MD_ABSDOWN | CECHostPlayer.MOVE_DIR.MD_ABSUP)) != 0)
{
float fPitchDelta = (/*m_pHost.UsingWing()*/m_pHost.GetWingType() == enumWingType.WINGTYPE_WING ? push_pitch_vel_wing : push_pitch_vel_fly_sword) * fDeltaTime;
if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_LEFT) != 0 || nPitchDir == -1)
if ((m_pHost.m_dwMoveRelDir & (uint)CECHostPlayer.MOVE_DIR.MD_LEFT) != 0 || nPitchDir == -1)
{
if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_BACK) != 0)
if ((m_pHost.m_dwMoveRelDir & (uint)CECHostPlayer.MOVE_DIR.MD_BACK) != 0)
m_fPushPitch -= fPitchDelta;
else
m_fPushPitch += fPitchDelta;
}
else if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_RIGHT) != 0 || nPitchDir == 1)
else if ((m_pHost.m_dwMoveRelDir & (uint)CECHostPlayer.MOVE_DIR.MD_RIGHT) != 0 || nPitchDir == 1)
{
if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_BACK) != 0)
if ((m_pHost.m_dwMoveRelDir & (uint)CECHostPlayer.MOVE_DIR.MD_BACK) != 0)
m_fPushPitch += fPitchDelta;
else
m_fPushPitch -= fPitchDelta;
@@ -1097,7 +1097,7 @@ namespace BrewMonster.Scripts
}
// if (bPush)
if (bPush || (m_pHost.m_dwMoveRelDir & (uint)(MOVE_DIR.MD_ABSDOWN | MOVE_DIR.MD_ABSUP)) != 0)
if (bPush || (m_pHost.m_dwMoveRelDir & (uint)(CECHostPlayer.MOVE_DIR.MD_ABSDOWN | CECHostPlayer.MOVE_DIR.MD_ABSUP)) != 0)
{
// float pa = bPush ? EC_PUSH_ACCE : 0.0f;
float pa = CECHostMove.EC_PUSH_ACCE;
@@ -1113,12 +1113,12 @@ namespace BrewMonster.Scripts
if (bPush)
vVelDir = vPushDir;
if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_ABSDOWN) != 0)
if ((m_pHost.m_dwMoveRelDir & (uint)CECHostPlayer.MOVE_DIR.MD_ABSDOWN) != 0)
{
vVelDir += -EC_Utility.ToVector3(GPDataTypeHelper.g_vAxisY);
vVelDir.Normalize();
}
else if ((m_pHost.m_dwMoveRelDir & (uint)MOVE_DIR.MD_ABSUP) != 0)
else if ((m_pHost.m_dwMoveRelDir & (uint)CECHostPlayer.MOVE_DIR.MD_ABSUP) != 0)
{
vVelDir += EC_Utility.ToVector3(GPDataTypeHelper.g_vAxisY);
vVelDir.Normalize();
@@ -1,16 +1,17 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Reflection;
using System.Text;
using CSNetwork.GPDataType;
using BrewMonster.Network;
using BrewMonster;
using BrewMonster.Common;
using BrewMonster.Network;
using BrewMonster.Scripts;
using CSNetwork.GPDataType;
using ModelRenderer.Scripts.GameData;
using PerfectWorld.Scripts.Managers;
using BrewMonster.Scripts;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace BrewMonster.Scripts.Managers
{
@@ -23,7 +24,7 @@ namespace BrewMonster.Scripts.Managers
[Header("Detail Panel (assign in Inspector)")]
[SerializeField] private GameObject detailPanelRoot;
[SerializeField] private Vector2 detailPanelOffset = new Vector2(20f, 0f);
[SerializeField] private Vector2 detailPanelOffset = new Vector2(20f, 0f);
[SerializeField] private bool hideDetailOnStart = true;
[SerializeField] private TextOutlet nameText;
[SerializeField] private TextOutlet descriptionText;
@@ -35,35 +36,41 @@ namespace BrewMonster.Scripts.Managers
[SerializeField] private bool autoRefresh = true;
[SerializeField] private float refreshInterval = 1.0f;
[SerializeField] private bool showEquipmentDetails = true;
[Header("Money UI (assign any text fields to mirror money amount)")]
[SerializeField] private List<UnityEngine.UI.Text> moneyTextsLegacy = new List<UnityEngine.UI.Text>();
[SerializeField] private List<TMPro.TextMeshProUGUI> moneyTextsTMP = new List<TMPro.TextMeshProUGUI>();
[Header("Cash UI (assign any text fields to mirror cash amount)")]
[SerializeField] private List<UnityEngine.UI.Text> cashTextsLegacy = new List<UnityEngine.UI.Text>();
[SerializeField] private List<TMPro.TextMeshProUGUI> cashTextsTMP = new List<TMPro.TextMeshProUGUI>();
[Header("Money UI (assign any text fields to mirror money amount)")]
[SerializeField] private List<UnityEngine.UI.Text> moneyTextsLegacy = new List<UnityEngine.UI.Text>();
[SerializeField] private List<TMPro.TextMeshProUGUI> moneyTextsTMP = new List<TMPro.TextMeshProUGUI>();
[Header("Cash UI (assign any text fields to mirror cash amount)")]
[SerializeField] private List<UnityEngine.UI.Text> cashTextsLegacy = new List<UnityEngine.UI.Text>();
[SerializeField] private List<TMPro.TextMeshProUGUI> cashTextsTMP = new List<TMPro.TextMeshProUGUI>();
private float lastRefreshTime;
// Pending currency cache for when UI is not yet active
private static bool s_hasPendingMoney;
private static ulong s_pendingMoneyAmount;
private static ulong s_pendingMoneyMaxAmount;
private static bool s_hasPendingCash;
private static int s_pendingCashAmount;
// Pending currency cache for when UI is not yet active
private static bool s_hasPendingMoney;
private static ulong s_pendingMoneyAmount;
private static ulong s_pendingMoneyMaxAmount;
private static bool s_hasPendingCash;
private static int s_pendingCashAmount;
// Flags to prevent log spam for extended description warnings
// 防止扩展描述警告日志刷屏的标志
private static bool m_HasLoggedExtDescNull = false;
private static bool m_HasLoggedExtDescNotInit = false;
private static bool m_HasLoggedExtDescError = false;
// Flags to prevent log spam for extended description warnings
// 防止扩展描述警告日志刷屏的标志
private static bool m_HasLoggedExtDescNull = false;
private static bool m_HasLoggedExtDescNotInit = false;
private static bool m_HasLoggedExtDescError = false;
private InventoryModel model;
private InventoryView view;
// Drag-and-drop state
private int draggedItemSourceSlot = -1;
private byte draggedItemSourcePackage = 0;
[SerializeField] private Image currentDragImage;
private bool isDragging = false;
// === Text Formatting Methods ===
/// <summary>
/// Format text for TextMeshPro components with rich text support
/// </summary>
@@ -73,7 +80,7 @@ namespace BrewMonster.Scripts.Managers
{
return EC_Utility.FormatForTextMeshPro(text);
}
// Current selected item for equip/unequip operations
private byte currentSelectedPackage;
private int currentSelectedSlot;
@@ -88,6 +95,20 @@ namespace BrewMonster.Scripts.Managers
{
model = new InventoryModel();
view = new InventoryView();
if (currentDragImage == null)
{
var canvas = GetComponentInParent<Canvas>();
if (canvas == null)
{
canvas = FindAnyObjectByType<Canvas>();
}
var go = new GameObject("DragImage", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image));
go.transform.SetParent(canvas.transform, false);
currentDragImage = go.GetComponent<Image>();
currentDragImage.raycastTarget = false;
currentDragImage.gameObject.SetActive(false);
}
}
private void Start()
@@ -97,15 +118,15 @@ namespace BrewMonster.Scripts.Managers
{
ShowDetailPanel(false);
}
// Apply any pending currency values captured before the UI became active
ApplyPendingCurrency();
// Apply any pending currency values captured before the UI became active
ApplyPendingCurrency();
}
private void OnEnable()
{
// Ensure cached values are pushed when the UI is enabled
ApplyPendingCurrency();
}
private void OnEnable()
{
// Ensure cached values are pushed when the UI is enabled
ApplyPendingCurrency();
}
private void Update()
{
@@ -128,109 +149,109 @@ namespace BrewMonster.Scripts.Managers
view.RenderPackage(fashionPackButtons, fshItems, PKG_FASHION, OnInventoryButtonClicked, GetDisplayTextForItem);
}
/// <summary>
/// Update all configured money text components with the current amount.
/// Call this when GET_OWN_MONEY arrives.
/// </summary>
public void UpdateMoney(ulong amount, ulong maxAmount)
{
string text = amount.ToString();
if (moneyTextsLegacy != null)
{
for (int i = 0; i < moneyTextsLegacy.Count; i++)
{
var t = moneyTextsLegacy[i];
if (t != null) t.text = text;
}
}
if (moneyTextsTMP != null)
{
for (int i = 0; i < moneyTextsTMP.Count; i++)
{
var t = moneyTextsTMP[i];
if (t != null) t.text = text;
}
}
}
/// <summary>
/// Update all configured cash text components with the current boutique cash amount.
/// Call this when PLAYER_CASH arrives.
/// </summary>
public void UpdateCash(int amount)
{
string text = amount.ToString();
if (cashTextsLegacy != null)
{
for (int i = 0; i < cashTextsLegacy.Count; i++)
{
var t = cashTextsLegacy[i];
if (t != null) t.text = text;
}
}
if (cashTextsTMP != null)
{
for (int i = 0; i < cashTextsTMP.Count; i++)
{
var t = cashTextsTMP[i];
if (t != null) t.text = text;
}
}
}
/// <summary>
/// Update all configured money text components with the current amount.
/// Call this when GET_OWN_MONEY arrives.
/// </summary>
public void UpdateMoney(ulong amount, ulong maxAmount)
{
string text = amount.ToString();
if (moneyTextsLegacy != null)
{
for (int i = 0; i < moneyTextsLegacy.Count; i++)
{
var t = moneyTextsLegacy[i];
if (t != null) t.text = text;
}
}
if (moneyTextsTMP != null)
{
for (int i = 0; i < moneyTextsTMP.Count; i++)
{
var t = moneyTextsTMP[i];
if (t != null) t.text = text;
}
}
}
// Public static entry points to cache values when UI is unavailable
public static void CacheMoney(ulong amount, ulong maxAmount)
{
s_pendingMoneyAmount = amount;
s_pendingMoneyMaxAmount = maxAmount;
s_hasPendingMoney = true;
// If an instance exists (even inactive), push immediately so the value is ready
var all = Resources.FindObjectsOfTypeAll<EC_InventoryUI>();
if (all != null)
{
for (int i = 0; i < all.Length; i++)
{
var ui = all[i];
if (ui != null && ui.gameObject.scene.IsValid())
{
ui.ApplyPendingCurrency();
break;
}
}
}
}
/// <summary>
/// Update all configured cash text components with the current boutique cash amount.
/// Call this when PLAYER_CASH arrives.
/// </summary>
public void UpdateCash(int amount)
{
string text = amount.ToString();
if (cashTextsLegacy != null)
{
for (int i = 0; i < cashTextsLegacy.Count; i++)
{
var t = cashTextsLegacy[i];
if (t != null) t.text = text;
}
}
if (cashTextsTMP != null)
{
for (int i = 0; i < cashTextsTMP.Count; i++)
{
var t = cashTextsTMP[i];
if (t != null) t.text = text;
}
}
}
public static void CacheCash(int amount)
{
s_pendingCashAmount = amount;
s_hasPendingCash = true;
// If an instance exists (even inactive), push immediately so the value is ready
var all = Resources.FindObjectsOfTypeAll<EC_InventoryUI>();
if (all != null)
{
for (int i = 0; i < all.Length; i++)
{
var ui = all[i];
if (ui != null && ui.gameObject.scene.IsValid())
{
ui.ApplyPendingCurrency();
break;
}
}
}
}
// Public static entry points to cache values when UI is unavailable
public static void CacheMoney(ulong amount, ulong maxAmount)
{
s_pendingMoneyAmount = amount;
s_pendingMoneyMaxAmount = maxAmount;
s_hasPendingMoney = true;
// If an instance exists (even inactive), push immediately so the value is ready
var all = Resources.FindObjectsOfTypeAll<EC_InventoryUI>();
if (all != null)
{
for (int i = 0; i < all.Length; i++)
{
var ui = all[i];
if (ui != null && ui.gameObject.scene.IsValid())
{
ui.ApplyPendingCurrency();
break;
}
}
}
}
private void ApplyPendingCurrency()
{
if (s_hasPendingMoney)
{
UpdateMoney(s_pendingMoneyAmount, s_pendingMoneyMaxAmount);
}
if (s_hasPendingCash)
{
UpdateCash(s_pendingCashAmount);
}
}
public static void CacheCash(int amount)
{
s_pendingCashAmount = amount;
s_hasPendingCash = true;
// If an instance exists (even inactive), push immediately so the value is ready
var all = Resources.FindObjectsOfTypeAll<EC_InventoryUI>();
if (all != null)
{
for (int i = 0; i < all.Length; i++)
{
var ui = all[i];
if (ui != null && ui.gameObject.scene.IsValid())
{
ui.ApplyPendingCurrency();
break;
}
}
}
}
private void ApplyPendingCurrency()
{
if (s_hasPendingMoney)
{
UpdateMoney(s_pendingMoneyAmount, s_pendingMoneyMaxAmount);
}
if (s_hasPendingCash)
{
UpdateCash(s_pendingCashAmount);
}
}
private void OnInventoryButtonClicked(byte package, int slot)
{
@@ -242,13 +263,13 @@ namespace BrewMonster.Scripts.Managers
currentSelectedPackage = package;
currentSelectedSlot = slot;
currentSelectedItem = itemData;
// Create equipment object if this is equipment
currentSelectedEquipment = CreateEquipmentFromItemData(itemData);
// Position detail panel near the clicked item button
PositionDetailPanelNearButton(package, slot);
// Position detail panel near the clicked item button
PositionDetailPanelNearButton(package, slot);
FillDetailPanel(package, itemData);
}
else
@@ -266,19 +287,19 @@ namespace BrewMonster.Scripts.Managers
return null;
var equipment = new EC_IvtrEquip(itemData.m_tid, itemData.m_expire_date);
// Set basic properties (use default values since InventoryItemData doesn't have these)
equipment.Price = 0;
equipment.Count = itemData.m_iCount;
equipment.PriceScale = 1.0f;
equipment.ScaleType = 0;
// Parse item info if available (use Content field)
if (itemData.Content != null && itemData.Content.Length > 0)
{
equipment.SetItemInfo(itemData.Content, itemData.Content.Length);
}
return equipment;
}
@@ -418,7 +439,7 @@ namespace BrewMonster.Scripts.Managers
// Call RequestDropIvrtItem with slot index and amount
UnityGameSession.RequestDropIvrtItem((byte)currentSelectedSlot, 1);
Debug.Log($"[InventoryUI] Drop request sent for inventory item {currentSelectedItem.m_tid} from slot {currentSelectedSlot} with amount {currentSelectedItem.m_iCount}");
// Refresh inventory after drop
RefreshAll();
}
@@ -430,12 +451,12 @@ namespace BrewMonster.Scripts.Managers
// Call RequestDropEquipItem with slot index
UnityGameSession.RequestDropEquipItem((byte)currentSelectedSlot);
Debug.Log($"[InventoryUI] Drop request sent for equipment item {currentSelectedItem.m_tid} from slot {currentSelectedSlot}");
// Refresh inventory after drop
RefreshAll();
}
private int FindEmptyInventorySlot()
{
var inventoryData = model.GetInventoryData(PKG_INVENTORY);
@@ -451,7 +472,7 @@ namespace BrewMonster.Scripts.Managers
}
return -1;
}
/// <summary>
/// Get item description from string table
/// </summary>
@@ -490,10 +511,10 @@ namespace BrewMonster.Scripts.Managers
{
Debug.LogWarning($"[InventoryUI] Error getting item description for ID {templateId}: {ex.Message}");
}
return null;
}
/// <summary>
/// Get extended item description from string table
/// </summary>
@@ -532,10 +553,10 @@ namespace BrewMonster.Scripts.Managers
{
Debug.LogWarning($"[InventoryUI] Error getting extended item description for ID {templateId}: {ex.Message}");
}
return null;
}
/// <summary>
/// Get user-friendly text for item state
/// </summary>
@@ -602,7 +623,7 @@ namespace BrewMonster.Scripts.Managers
bool hasItem = items != null && items.TryGetValue(slot, out itemData);
button.onClick.RemoveAllListeners();
int capturedSlot = slot;
button.onClick.AddListener(() => onClick(package, capturedSlot));
button.onClick.AddListener(() => onClick(package, capturedSlot));
// Optional visual tweaks based on state/count
var image = button.GetComponent<Image>();
if (image != null)
@@ -627,6 +648,24 @@ namespace BrewMonster.Scripts.Managers
image.enabled = true;
}
}
var eventTrigger = button.GetComponent<EventTrigger>();
if (eventTrigger == null)
eventTrigger = button.gameObject.AddComponent<EventTrigger>();
eventTrigger.triggers.Clear();
void AddEvent(EventTriggerType type, UnityEngine.Events.UnityAction<BaseEventData> action)
{
var entry = new EventTrigger.Entry { eventID = type };
entry.callback.AddListener(action);
eventTrigger.triggers.Add(entry);
}
AddEvent(EventTriggerType.BeginDrag, (data) => ((EC_InventoryUI)button.GetComponentInParent<EC_InventoryUI>()).OnBeginDrag((PointerEventData)data));
AddEvent(EventTriggerType.Drag, (data) => ((EC_InventoryUI)button.GetComponentInParent<EC_InventoryUI>()).OnDrag((PointerEventData)data));
AddEvent(EventTriggerType.EndDrag, (data) => ((EC_InventoryUI)button.GetComponentInParent<EC_InventoryUI>()).OnEndDrag((PointerEventData)data));
AddEvent(EventTriggerType.Drop, (data) => ((EC_InventoryUI)button.GetComponentInParent<EC_InventoryUI>()).OnDrop((PointerEventData)data));
}
}
}
@@ -649,7 +688,7 @@ namespace BrewMonster.Scripts.Managers
tmp.text = FormatForTextMeshPro(value ?? string.Empty);
}
}
/// <summary>
/// Set text with explicit formatting preference
/// </summary>
@@ -657,10 +696,10 @@ namespace BrewMonster.Scripts.Managers
/// <param name="preferTextMeshPro">Whether to prefer TextMeshPro formatting</param>
public void SetFormatted(string value, bool preferTextMeshPro = true)
{
string formattedText = preferTextMeshPro ?
FormatForTextMeshPro(value ?? string.Empty) :
string formattedText = preferTextMeshPro ?
FormatForTextMeshPro(value ?? string.Empty) :
EC_Utility.FormatForLegacyText(value ?? string.Empty);
if (legacy != null)
{
legacy.text = formattedText;
@@ -675,7 +714,7 @@ namespace BrewMonster.Scripts.Managers
public void RefreshLayout(GameObject gameObject)
{
var parent = gameObject.GetComponent<RectTransform>();
// Force Unity to rebuild layout immediately
parent.ForceUpdateRectTransforms();
LayoutRebuilder.ForceRebuildLayoutImmediate(parent);
@@ -689,115 +728,115 @@ namespace BrewMonster.Scripts.Managers
}
}
private Button GetButtonForSlot(byte package, int slot)
{
List<Button> list = null;
switch (package)
{
case PKG_INVENTORY:
list = inventoryPackButtons;
break;
case PKG_EQUIPMENT:
list = equipmentPackButtons;
break;
case PKG_FASHION:
list = fashionPackButtons;
break;
}
if (list == null || slot < 0 || slot >= list.Count)
{
return null;
}
return list[slot];
}
private Button GetButtonForSlot(byte package, int slot)
{
List<Button> list = null;
switch (package)
{
case PKG_INVENTORY:
list = inventoryPackButtons;
break;
case PKG_EQUIPMENT:
list = equipmentPackButtons;
break;
case PKG_FASHION:
list = fashionPackButtons;
break;
}
if (list == null || slot < 0 || slot >= list.Count)
{
return null;
}
return list[slot];
}
private void PositionDetailPanelNearButton(byte package, int slot)
{
if (detailPanelRoot == null)
{
return;
}
var panelRect = detailPanelRoot.transform as RectTransform;
if (panelRect == null)
{
return;
}
private void PositionDetailPanelNearButton(byte package, int slot)
{
if (detailPanelRoot == null)
{
return;
}
var panelRect = detailPanelRoot.transform as RectTransform;
if (panelRect == null)
{
return;
}
var button = GetButtonForSlot(package, slot);
if (button == null)
{
return;
}
var buttonRect = button.transform as RectTransform;
if (buttonRect == null)
{
return;
}
var button = GetButtonForSlot(package, slot);
if (button == null)
{
return;
}
var buttonRect = button.transform as RectTransform;
if (buttonRect == null)
{
return;
}
var canvas = panelRect.GetComponentInParent<Canvas>();
if (canvas == null)
{
return;
}
var parentRect = panelRect.parent as RectTransform;
if (parentRect == null)
{
return;
}
var canvas = panelRect.GetComponentInParent<Canvas>();
if (canvas == null)
{
return;
}
var parentRect = panelRect.parent as RectTransform;
if (parentRect == null)
{
return;
}
Camera eventCamera = canvas.renderMode == RenderMode.ScreenSpaceOverlay ? null : canvas.worldCamera;
Vector3 worldCenter = buttonRect.TransformPoint(buttonRect.rect.center);
Vector2 screenPoint = RectTransformUtility.WorldToScreenPoint(eventCamera, worldCenter);
Vector2 localPoint;
if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRect, screenPoint, eventCamera, out localPoint))
{
return;
}
Camera eventCamera = canvas.renderMode == RenderMode.ScreenSpaceOverlay ? null : canvas.worldCamera;
Vector3 worldCenter = buttonRect.TransformPoint(buttonRect.rect.center);
Vector2 screenPoint = RectTransformUtility.WorldToScreenPoint(eventCamera, worldCenter);
Vector2 localPoint;
if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRect, screenPoint, eventCamera, out localPoint))
{
return;
}
float btnHalfW = buttonRect.rect.width * 0.5f;
float panelW = panelRect.rect.width;
float panelH = panelRect.rect.height;
float pivotX = panelRect.pivot.x;
float pivotY = panelRect.pivot.y;
float btnHalfW = buttonRect.rect.width * 0.5f;
float panelW = panelRect.rect.width;
float panelH = panelRect.rect.height;
float pivotX = panelRect.pivot.x;
float pivotY = panelRect.pivot.y;
// Compute right-placement candidate (panel's left edge at button's right edge + offset)
float leftEdgeRightPlacement = localPoint.x + btnHalfW + detailPanelOffset.x;
float candidateXRight = leftEdgeRightPlacement + pivotX * panelW;
// Compute right-placement candidate (panel's left edge at button's right edge + offset)
float leftEdgeRightPlacement = localPoint.x + btnHalfW + detailPanelOffset.x;
float candidateXRight = leftEdgeRightPlacement + pivotX * panelW;
// Compute left-placement candidate (panel's right edge at button's left edge - offset)
float rightEdgeLeftPlacement = localPoint.x - btnHalfW - detailPanelOffset.x;
float candidateXLeft = rightEdgeLeftPlacement - (1f - pivotX) * panelW;
// Compute left-placement candidate (panel's right edge at button's left edge - offset)
float rightEdgeLeftPlacement = localPoint.x - btnHalfW - detailPanelOffset.x;
float candidateXLeft = rightEdgeLeftPlacement - (1f - pivotX) * panelW;
// Vertical clamping honoring pivot
float minY = parentRect.rect.yMin + pivotY * panelH;
float maxY = parentRect.rect.yMax - (1f - pivotY) * panelH;
float candidateY = Mathf.Clamp(localPoint.y + detailPanelOffset.y, minY, maxY);
// Vertical clamping honoring pivot
float minY = parentRect.rect.yMin + pivotY * panelH;
float maxY = parentRect.rect.yMax - (1f - pivotY) * panelH;
float candidateY = Mathf.Clamp(localPoint.y + detailPanelOffset.y, minY, maxY);
// Choose side based on available space
float rightEdgeOfRight = candidateXRight + (1f - pivotX) * panelW;
float canvasRight = parentRect.rect.xMax;
float canvasLeft = parentRect.rect.xMin;
float leftEdgeOfLeft = candidateXLeft - pivotX * panelW;
// Choose side based on available space
float rightEdgeOfRight = candidateXRight + (1f - pivotX) * panelW;
float canvasRight = parentRect.rect.xMax;
float canvasLeft = parentRect.rect.xMin;
float leftEdgeOfLeft = candidateXLeft - pivotX * panelW;
Vector2 finalPos;
if (rightEdgeOfRight <= canvasRight)
{
finalPos = new Vector2(candidateXRight, candidateY);
}
else if (leftEdgeOfLeft >= canvasLeft)
{
finalPos = new Vector2(candidateXLeft, candidateY);
}
else
{
// Fallback: clamp within canvas horizontally
float minX = canvasLeft + pivotX * panelW;
float maxX = canvasRight - (1f - pivotX) * panelW;
finalPos = new Vector2(Mathf.Clamp(candidateXRight, minX, maxX), candidateY);
}
Vector2 finalPos;
if (rightEdgeOfRight <= canvasRight)
{
finalPos = new Vector2(candidateXRight, candidateY);
}
else if (leftEdgeOfLeft >= canvasLeft)
{
finalPos = new Vector2(candidateXLeft, candidateY);
}
else
{
// Fallback: clamp within canvas horizontally
float minX = canvasLeft + pivotX * panelW;
float maxX = canvasRight - (1f - pivotX) * panelW;
finalPos = new Vector2(Mathf.Clamp(candidateXRight, minX, maxX), candidateY);
}
panelRect.anchoredPosition = finalPos;
}
panelRect.anchoredPosition = finalPos;
}
private void FillDetailPanel(byte package, EC_IvtrItem item)
{
@@ -875,8 +914,8 @@ namespace BrewMonster.Scripts.Managers
// Display extended description if found (exactly like C++ checks: if (!szExtDesc || !szExtDesc[0]))
// 如果找到扩展描述则显示(完全像C++检查:if (!szExtDesc || !szExtDesc[0])
string displayText = !string.IsNullOrEmpty(szExtDesc)
? szExtDesc.Replace("\\r", "\n")
string displayText = !string.IsNullOrEmpty(szExtDesc)
? szExtDesc.Replace("\\r", "\n")
: "";
// Debug logging to diagnose issues
@@ -1000,7 +1039,118 @@ namespace BrewMonster.Scripts.Managers
}
}
}
public void OnBeginDrag(PointerEventData eventData)
{
var btn = eventData.pointerDrag?.GetComponent<Button>();
if (btn != null)
{
for (int i = 0; i < inventoryPackButtons.Count; i++)
{
if (btn == inventoryPackButtons[i])
{
var invItems = model.GetInventoryData(PKG_INVENTORY);
if(invItems == null || !invItems.ContainsKey(i))
{
return;
}
draggedItemSourceSlot = i;
draggedItemSourcePackage = PKG_INVENTORY;
var img = btn.GetComponent<Image>();
if (img != null && currentDragImage != null)
{
currentDragImage.sprite = img.sprite;
currentDragImage.SetNativeSize();
currentDragImage.color = img.color;
currentDragImage.gameObject.SetActive(true);
isDragging = true;
}
break;
}
}
for (int i = 0; i < equipmentPackButtons.Count; i++)
{
if (btn == equipmentPackButtons[i])
{
var equipItems = model.GetInventoryData(PKG_EQUIPMENT);
if(equipItems == null || !equipItems.ContainsKey(i))
{
return;
}
draggedItemSourceSlot = i;
draggedItemSourcePackage = PKG_EQUIPMENT;
var img = btn.GetComponent<Image>();
if (img != null && currentDragImage != null)
{
currentDragImage.sprite = img.sprite;
currentDragImage.SetNativeSize();
currentDragImage.color = img.color;
currentDragImage.gameObject.SetActive(true);
isDragging = true;
}
return;
}
}
}
}
public void OnDrag(PointerEventData eventData)
{
if(isDragging && currentDragImage != null)
{
currentDragImage.transform.position = eventData.position;
}
}
public void OnEndDrag(PointerEventData eventData)
{
draggedItemSourceSlot = -1;
draggedItemSourcePackage = 0;
if(currentDragImage != null)
{
currentDragImage.gameObject.SetActive(false);
isDragging = false;
}
}
public void OnDrop(PointerEventData eventData)
{
var btn = eventData.pointerCurrentRaycast.gameObject?.GetComponent<Button>();
if (btn != null && draggedItemSourcePackage == PKG_INVENTORY)
{
for (int i = 0; i < equipmentPackButtons.Count; i++)
{
if (btn == equipmentPackButtons[i])
{
UnityGameSession.RequestEquipItemAsync((byte)draggedItemSourceSlot, (byte)i, () =>
{
Debug.Log($"[InventoryUI] Drag-drop equip: từ inventory slot {draggedItemSourceSlot} sang equipment slot {i}");
RefreshAll();
});
break;
}
}
}
else if(btn != null && draggedItemSourcePackage == PKG_EQUIPMENT)
{
for (int i = 0; i < inventoryPackButtons.Count; i++)
{
if (btn == inventoryPackButtons[i])
{
UnityGameSession.RequestEquipItemAsync((byte)i, (byte)draggedItemSourceSlot, () =>
{
Debug.Log($"[InventoryUI] Drag-drop unequip: từ equipment slot {draggedItemSourceSlot} sang inventory slot {i}");
RefreshAll();
});
break;
}
}
}
draggedItemSourceSlot = -1;
draggedItemSourcePackage = 0;
}
}
}
}
@@ -548,6 +548,7 @@ namespace BrewMonster.Scripts.Managers
/// This class intentionally keeps C++-style naming and layout so other C++ systems
/// can be ported over with minimal friction.
/// </summary>
/// TODO: have to rename to CECIvtrItem to match C++ naming
public class EC_IvtrItem
{
// NOTE: The nested enums and fields mirror the original C++ names and values.
@@ -62,6 +62,7 @@ namespace PerfectWorld.Scripts.Managers
case int value3 when value3 == EC_MsgDef.MSG_PM_PLAYERATKRESULT:
case int value4 when value4 == EC_MsgDef.MSG_PM_CASTSKILL:
case int value5 when value5 == EC_MsgDef.MSG_PM_ENCHANTRESULT:
case int value6 when value6 == EC_MsgDef.MSG_PM_PLAYERDOEMOTE:
TransmitMessage(Msg);
break;
case int value when value == EC_MsgDef.MSG_PM_PLAYERDIED:
@@ -620,6 +621,18 @@ namespace PerfectWorld.Scripts.Managers
case int value2 when value2 == CommandID.PLAYER_CAST_RUNE_SKILL: cid = (GPDataTypeHelper.FromBytes<cmd_player_cast_rune_skill>((byte[])Msg.dwParam1)).caster; break;
case int value2 when value2 == CommandID.PLAYER_CAST_RUNE_INSTANT_SKILL: cid = (GPDataTypeHelper.FromBytes<cmd_player_cast_rune_instant_skill>((byte[])Msg.dwParam1)).caster; break;
}
break;
case long value when value == EC_MsgDef.MSG_PM_PLAYERDOEMOTE:
if (Convert.ToInt32(Msg.dwParam2) == CommandID.OBJECT_DO_EMOTE)
{
cmd_object_do_emote pCmdDoEmote = GPDataTypeHelper.FromBytes<cmd_object_do_emote>((byte[])Msg.dwParam1);
cid = pCmdDoEmote.id;
}
else // Msg.dwParam2 == OBJECT_EMOTE_RESTORE
{
// cid = ((cmd_object_emote_restore*)Msg.dwParam1)->id;
}
break;
case long value when value == EC_MsgDef.MSG_PM_ENCHANTRESULT:
+11 -4
View File
@@ -1515,13 +1515,20 @@ namespace BrewMonster
m_ExtProps.df = (ROLEEXTPROP_DEF)pData;
break;
default:
//ASSERT(0);
return;
}
default:
//ASSERT(0);
return;
}
}
#region Team
// Get team to which this player belongs to
// public CECTeam GetTeam() { return m_pTeam; }
#endregion
}
public struct PlayActionEvent
{
public string AnimationName;
@@ -20,7 +20,7 @@ namespace CSNetwork.C2SCommand
}
// Generic command serializationw
public static Octets SerializeCommand<T>(CommandID cmdId, T command)
public static Octets SerializeCommand<T>(CommandID cmdId, T command, bool writeLength = true)
where T : struct
{
var octets = new Octets();
@@ -29,7 +29,7 @@ namespace CSNetwork.C2SCommand
WriteBasicValue(octets, (ushort)cmdId);
// Write command body
WriteStruct(octets, command);
WriteStruct(octets, command, writeLength);
return octets;
}
@@ -72,7 +72,7 @@ namespace CSNetwork.C2SCommand
return octets;
}
private static void WriteStruct<T>(Octets octets, T value)
private static void WriteStruct<T>(Octets octets, T value, bool writeLength=true)
where T : struct
{
// Get fields of the struct
@@ -99,7 +99,7 @@ namespace CSNetwork.C2SCommand
}
else if (fieldType.IsArray)
{
WriteArray(octets, (Array)fieldValue);
WriteArray(octets, (Array)fieldValue, writeLength);
}
}
else if (fieldType.IsEnum)
@@ -187,7 +187,7 @@ namespace CSNetwork.C2SCommand
octets.Insert(octets.Size, strBytes.AsSpan(0, length).ToArray());
}
private static void WriteArray(Octets octets, Array array)
private static void WriteArray(Octets octets, Array array, bool writeLength)
{
if (octets == null)
return;
@@ -197,7 +197,7 @@ namespace CSNetwork.C2SCommand
return;
}
if (array.Length > 1 )
if (array.Length != 1 && writeLength)
{
WriteBasicValue(octets, array.Length);
}
@@ -686,6 +686,14 @@ namespace CSNetwork.C2SCommand
return octets;
}
public static Octets CreateEmoteActionCmd(int wPose)
{
cmd_emote_action pCmd = new cmd_emote_action()
{
action = (ushort)wPose
};
return SerializeCommand(CommandID.EMOTE_ACTION, pCmd);
}
// TODO: Check orginal C++ implementation
public static Octets CreateTaskNotifyCmd(byte[] pData, uint dwDataSize)
@@ -700,7 +708,40 @@ namespace CSNetwork.C2SCommand
size = dwDataSize,
placeholder = pData
};
return SerializeCommand(CommandID.TASK_NOTIFY, cmd);
return SerializeCommand( CommandID.TASK_NOTIFY, cmd, false);
}
public static Octets CreateAutoTeamSetGoalCommand(int type, int goal_id, int op)
{
// int iSize = sizeof(cmd_header) + sizeof(cmd_auto_team_set_goal);
// uint itemSize = (uint)Marshal.SizeOf<cmd_auto_team_set_goal>();
// uint totalLen = contentSize + (uint)itemNum * itemSize;
// BYTE* pBuf = (BYTE*)a_malloctemp(iSize);
// if(!pBuf) return;
//
// ((cmd_header*)pBuf)->cmd = C2S::AUTO_TEAM_SET_GOAL;
//
// cmd_auto_team_set_goal pCmd = (cmd_auto_team_set_goal*)(pBuf + sizeof(cmd_header));
cmd_auto_team_set_goal pCmd = new cmd_auto_team_set_goal()
{
goal_type = type,
goal_id = goal_id,
op = op
};
//
// g_pGame->GetGameSession()->SendGameData(pBuf, iSize);
//
// a_freetemp(pBuf);
// var cmd = new CMD_GetAllData
// {
// byPack = Convert.ToByte(byPack),
// byEquip = Convert.ToByte(byEquip),
// byTask = Convert.ToByte(byTask)
// };
// Serialize the command and return the serialized data
return SerializeCommand(CommandID.AUTO_TEAM_SET_GOAL, pCmd);
}
}
}
@@ -1,6 +1,7 @@
using BrewMonster;
using BrewMonster.Network;
using System.Collections.Generic;
using BrewMonster;
namespace CSNetwork
{
@@ -63,6 +64,11 @@ namespace CSNetwork
for (i = 0; i < count; i++)
{
ECMSG msg = Instance.m_MsgList.Dequeue();
if (!Instance.m_MsgHandlerList.ContainsKey(msg.iManager))
{
BMLogger.LogError("Did not find handler ID: " + msg.iManager);
continue;
}
Instance.m_tempHandler = Instance.m_MsgHandlerList[msg.iManager];
if (Instance.m_tempHandler != null)
{
@@ -184,7 +184,7 @@ namespace CSNetwork
public static int MSG_PM_PLAYERSITDOWN = 369; // Player sit down / stand up
public const int MSG_PM_PLAYERATKRESULT = 370; // Player attack result
public static int MSG_PM_PLAYEREXTSTATE = 371; // Player extend states changed
public static int MSG_PM_PLAYERDOEMOTE = 372; // Player do emotion
public const int MSG_PM_PLAYERDOEMOTE = 372; // Player do emotion
public static int MSG_PM_PLAYERUSEITEM = 373; // Player use item
public static int MSG_PM_PLAYERCUSTOM = 374; // Player custom data
public static int MSG_PM_ENCHANTRESULT = 375; // Enchant result
@@ -1390,6 +1390,26 @@ namespace CSNetwork.GPDataType
Marshal.FreeHGlobal(ptr);
}
}
public static T FromBytes<T>(byte[] data, ref long startIndex) where T : struct
{
int size = Marshal.SizeOf<T>();
if (data.Length - startIndex < size)
throw new ArgumentException("Buffer không đủ dữ liệu");
IntPtr ptr = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(data, (int)startIndex, ptr, size);
startIndex += size;
return Marshal.PtrToStructure<T>(ptr);
}
finally
{
Marshal.FreeHGlobal(ptr);
}
}
public static T FromBytes<T>(byte[] data, bool force, int startIndex = 0) where T : struct
{
int size = Marshal.SizeOf<T>();
@@ -1812,6 +1832,15 @@ namespace CSNetwork.GPDataType
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_modify_title_notify
{
public ushort id;
public int expiretime;
public char flag;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct cmd_emote_action
{
public ushort action;
public ushort id;
public int expiretime;
public char flag;
@@ -1874,5 +1903,31 @@ namespace CSNetwork.GPDataType
public int vigour;
public ROLEEXTPROP prop;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_auto_team_set_goal
{
public int goal_type; // 0 unknown, 1 task, 2 Activity
public int op;
public int goal_id;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_object_do_emote
{
public int id;
public ushort emotion;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct cmd_task_deliver_item
{
public int type;
public int expire_date;
public uint amount;
public uint slot_amount;
public byte where; //ĸ0 ׼2 1 װ
public byte index; //󲿷ַĸλ
}
}
@@ -352,6 +352,13 @@ namespace CSNetwork
OnPrtcPlayerBaseInfoRe(protocol);
break;
case ProtocolType.PROTOCOL_GETUICONFIG_RE: OnPrtcGetConfigRe(protocol); break;
case ProtocolType.PROTOCOL_AUTOTEAMSETGOAL_RE:
{
// CECAutoTeam pAutoTeam = CECGameRun.Instance.GetHostPlayer().GetAutoTeam();
// if( pAutoTeam !=null)
// pAutoTeam.OnPrtcAutoTeamSetGoalRe((AutoTeamSetGoal_Re)protocol);
}
break;
default:
_logger.Log(LogType.Warning, $"Received unhandled protocol type: {protocol.GetPType()}");
break;
@@ -498,6 +505,8 @@ namespace CSNetwork
break;
case CommandID.PICKUP_ITEM:
case CommandID.HOST_OBTAIN_ITEM:
// case CommandID.PRODUCE_ONCE:
case CommandID.TASK_DELIVER_ITEM:
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_PICKUPITEM, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
pCmdHeader);
break;
@@ -735,6 +744,10 @@ namespace CSNetwork
case CommandID.OWN_EXT_PROP:
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_OWNEXTPROP, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
break;
case CommandID.OBJECT_DO_EMOTE:
case CommandID.OBJECT_EMOTE_RESTORE:
EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERDOEMOTE, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
break;
}
}
@@ -1313,11 +1326,17 @@ namespace CSNetwork
iCount += iNumSend;
}
}
public void c2s_SendCmdEmoteAction(uint wPose)
{
gamedatasend gamedatasend = new gamedatasend();
gamedatasend.Data = C2SCommandFactory.CreateEmoteActionCmd((int)wPose);
SendProtocol(gamedatasend);
}
public void c2s_SendCmdTaskNotify(byte[] pData, uint dwDataSize)
{
gamedatasend gamedatasend = new gamedatasend();
gamedatasend.Data = C2SCommandFactory.CreateTaskNotifyCmd(pData, dwDataSize);
gamedatasend.Data = C2SCommandFactory.CreateTaskNotifyCmd( pData, dwDataSize);
BMLogger.Log($"[MH Task] c2s_SendCmdTaskNotify Command ID : {pData[0]} Size: {dwDataSize}");
SendProtocol(gamedatasend);
}
@@ -1327,5 +1346,12 @@ namespace CSNetwork
gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(C2SCommand.CommandID.STAND_UP);
SendProtocol(gamedatasend);
}
public void c2s_SendCmdAutoTeamSetGoal(int type, int goal_id, int op)
{
gamedatasend gamedatasend = new gamedatasend();
gamedatasend.Data = C2SCommandFactory.CreateAutoTeamSetGoalCommand(type,goal_id, op);
SendProtocol(gamedatasend);
}
}
}
@@ -0,0 +1,56 @@
namespace CSNetwork.Protocols
{
namespace BrewMonster
{
public class AutoTeamSetGoal_Re : Protocol
{
public int roleid { get; set; }
public int goal_type { get; set; }
public int op { get; set; }
public int goal_id { get; set; }
public int retcode { get; set; }
public int localsid { get; set; }
public AutoTeamSetGoal_Re() : base(ProtocolType.PROTOCOL_AUTOTEAMSETGOAL_RE)
{
}
public override Protocol Clone() => new AutoTeamSetGoal_Re
{
roleid = roleid,
goal_type = goal_type,
op = op,
goal_id = goal_id,
retcode = retcode,
localsid = localsid
};
public override void Marshal(OctetsStream os)
{
os.Write(roleid);
os.Write(goal_type);
os.Write(op);
os.Write(goal_id);
os.Write(retcode);
os.Write(localsid);
}
public override void Unmarshal(OctetsStream os)
{
roleid = os.ReadInt32();
goal_type = os.ReadInt32();
op = os.ReadInt32();
goal_id = os.ReadInt32();
retcode = os.ReadInt32();
localsid = os.ReadInt32();
}
public override int PriorPolicy() => 1;
public override bool SizePolicy(int size) => size <= 32;
public override string ToString => $" Type={Type}"; // - CMD_ID: {Enum.GetName(typeof(CommandID), BitConverter.ToUInt16(Data.ByteArray.Take(2).ToArray()))
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 2e2c269d6707b37478238369cf01884f
@@ -166,7 +166,19 @@ namespace CSNetwork.Protocols
private static bool ValidateProtocol(uint type, uint size)
{
var stub = _protocolMap.GetValueOrDefault(type);
return stub != null && size <= MaxProtocolSize;
if (stub == null)
{
_logger.Warning($"ValidateProtocol: Protocol type {type} not found. Returning false.");
return false;
}
if (size > MaxProtocolSize)
{
_logger.Warning($"ValidateProtocol: Protocol type {type} size {size} is greater than MaxProtocolSize {MaxProtocolSize}. Returning false.");
return false;
}
return true;
}
private const int MaxProtocolSize = 16 * 1024 * 1024; // 16MB max size
@@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
namespace CSNetwork.Protocols
{
public class getcustomdata_re : Protocol
{
public int Result { get; set; }
public int Roleid { get; set; }
public int Localsid { get; set; }
public Octets UiConfig { get; set; }
public int retcode { get; set; }
public int roleid { get; set; }
public uint localsid { get; set; }
public uint cus_roleid { get; set; }
public Octets customdata {get; set;}
public getcustomdata_re() : base(ProtocolType.PROTOCOL_GETCUSTOMDATA_RE)
{
customdata = new Octets();
}
public override Protocol Clone() => new getcustomdata_re
{
retcode = retcode,
roleid = roleid,
localsid = localsid,
cus_roleid = cus_roleid,
customdata = customdata
};
public override void Marshal(OctetsStream os)
{
os.Write(retcode);
os.Write(roleid);
os.Write(localsid);
os.Write(cus_roleid);
os.Write(customdata);
}
public override void Unmarshal(OctetsStream os)
{
retcode = os.ReadInt32();
roleid = os.ReadInt32();
localsid = os.ReadUInt32();
cus_roleid = os.ReadUInt32();
customdata = os.ReadOctets();
}
public override int PriorPolicy() => 1;
public override bool SizePolicy(int size) => size <= 4096;
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 6fa7e46f896407f499da351c8772b6d2
@@ -343,11 +343,20 @@ namespace BrewMonster.Network
Instance._gameSession.c2s_SendCmdGetAllData(byPack, byEquip, byTask);
}
public static void c2s_CmdEmoteAction(uint wPose)
{
Instance._gameSession.c2s_SendCmdEmoteAction(wPose);
}
public static void c2s_CmdTaskNotify( byte[] pBuf, uint sz)
{
Instance._gameSession.c2s_SendCmdTaskNotify( pBuf, sz);
}
public static void c2s_CmdAutoTeamSetGoal(int type, int goal_id, int op)
{
Instance._gameSession.c2s_SendCmdAutoTeamSetGoal(type, goal_id, op);//{ ::c2s_SendCmdAutoTeamSetGoal(type, goal_id, op); }
}
#endregion
public static void GetRoleBaseInfo(int iNumRole, List<int> aRoleIDs)
@@ -363,6 +372,7 @@ namespace BrewMonster.Network
public void LoadScene(string sceneName, LoadSceneMode mode, Action<bool> actDone)
{
// SceneLoadService.Load(sceneName, mode, actDone);
StartCoroutine(LoadSceneCoroutine(sceneName, mode, actDone));
}
@@ -40,6 +40,10 @@ namespace PerfectWorld.Scripts
{
var matterType = matterData.GetType();
var fileMatterField = matterType.GetField("file_matter", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (fileMatterField == null)
{
fileMatterField = matterType.GetField("file_model", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
}
if (fileMatterField != null)
{
@@ -59,7 +63,7 @@ namespace PerfectWorld.Scripts
if (matterObject.GetComponent<Collider>() == null)
{
var collider = matterObject.AddComponent<BoxCollider>();
collider.size = matterObject.GetComponentInChildren<MeshRenderer>().bounds.size;
collider.size = matterObject.GetComponentInChildren<Renderer>().bounds.size;
}
// Create text object to display item name above the cube
@@ -778,20 +778,154 @@ namespace BrewMonster
{
return m_iSCType;
}
//public abstract CECShortcut Clone();
public virtual CECShortcut Clone()
{
return new CECShortcut();
}
public virtual bool Execute() { return true; }
}
/* public class CECSCCommand : CECShortcut
{
public const int CMD_PLAYPOSE = 1; // Example constant
public override ShortcutType GetType() => ShortcutType.SCT_COMMAND;
public override CECShortcut Clone() => null;
public int GetCommandID() => 0;
public int GetParam() => 0;
}
public class CECSCCommand : CECShortcut
{
private int m_iCommand; // Command ID
private uint m_dwParam; // Parameter
public enum CommandID
{
CMD_UNKNOWN = -1,
CMD_SITDOWN = 0,
CMD_WALKRUN,
CMD_NORMALATTACK,
CMD_FINDTARGET,
CMD_ASSISTATTACK,
CMD_INVITETOTEAM,
CMD_LEAVETEAM,
CMD_KICKTEAMMEM,
CMD_FINDTEAM,
CMD_STARTTRADE,
CMD_SELLBOOTH,
CMD_BUYBOOTH,
CMD_PLAYPOSE,
CMD_INVITETOFACTION,
CMD_FLY,
CMD_PICKUP,
CMD_GATHER,
CMD_RUSHFLY,
CMD_BINDBUDDY,
}
public CECSCCommand(int iCommand)
{
m_iSCType = (int)ShortcutType.SCT_COMMAND;
m_iCommand = iCommand;
m_dwParam = 0;
}
public class CECSCSkill : CECShortcut
public CECSCCommand(CECSCCommand src)
{
m_iCommand = src.m_iCommand;
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()
{
CECHostPlayer pHost = CECGameRun.Instance.GetHostPlayer();
if (!pHost || !pHost.IsAllResReady())
return false;
// if (GetCoolTime(0)>0)
// {
// bool bForbidCmd = true;
// if (m_iCommand == CMD_RUSHFLY && pHost.GetRushFlyFlag())
// bForbidCmd = false;
//
// if (bForbidCmd)
// {
// 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 (int)CommandID.CMD_PLAYPOSE: pHost.CmdStartPose((int)m_dwParam); break;
// case CMD_INVITETOFACTION: pHost->CmdInviteToFaction(); break;
// case CMD_FLY:
// {
// // Èç¹ûÆï³ËÒª·ÉÐУ¬ÔòÕâЩ action switcher£¬·ñÔò 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;
default:
return false;
}
return true;
}
// Get item cool time
int GetCoolTime(ref int piMax/* NULL */)
{
CECHostPlayer pHost = CECGameRun.Instance.GetHostPlayer();
int iTime = 0;
switch ((CommandID)m_iCommand)
{
case CommandID.CMD_RUSHFLY:
// iTime = pHost.GetCoolTime(GP_CT_FLY_RUSH, piMax);
break;
case CommandID.CMD_PLAYPOSE:
// todo need to get cooldown here
// iTime = pHost.GetCoolTime(GP_CT_EMOTE, piMax);
break;
case CommandID.CMD_BINDBUDDY:
{
// CECCounter& cnt = pHost->GetBindCmdCoolCnt();
// iTime = cnt.GetPeriod() - cnt.GetCounter();
//
// if (piMax)
// *piMax = cnt.GetPeriod();
break;
}
default:
// if (piMax) *piMax = 0;
break;
}
return iTime;
}
}
/* public class CECSCSkill : CECShortcut
{
private CECSkill m_pSkill;
public override ShortcutType GetType() => ShortcutType.SCT_SKILL;
@@ -0,0 +1,185 @@
using BrewMonster.Network;
using CSNetwork.GPDataType;
namespace BrewMonster
{
public class CECAutoTeam
{
public const float TASK_TEAM_DISTANCE = 300.0f;
public enum AutoTeamType
{
TYPE_UNKNOWN,
TYPE_TASK,
TYPE_ACTIVITY,
}
protected int m_iType; // Auto team type
protected int m_iCurGoal; // For task-based teams: task ID; otherwise activity/event ID
protected A3DVECTOR3 m_vTaskPos; // In task teams: player position
protected CECCounter m_cntCancel;
// CECAutoTeam::CECAutoTeam()
// {
// m_iType = TYPE_UNKNOWN;
// m_iCurGoal = 0;
// m_vTaskPos.Clear();
// m_cntCancel.SetPeriod(500);
// m_cntCancel.Reset();
// }
public void Tick(float dwDeltaTime)
{
if (m_iType == (int)AutoTeamType.TYPE_TASK && m_iCurGoal>0 && m_cntCancel.IncCounter(dwDeltaTime))
{
A3DVECTOR3 vPos = CECGameRun.Instance.GetHostPlayer().GetPos();
var target = m_vTaskPos - vPos;
if (target.MagnitudeH() > TASK_TEAM_DISTANCE)
{
m_vTaskPos = vPos;
Cancel((int)AutoTeamType.TYPE_TASK);
}
m_cntCancel.Reset();
}
}
public bool DoAutoTeam(int type, int iGoalID)
{
// if(EC_Game.GetGameRun().GetHostPlayer().GetTeam())
// return false;
//todo need to get bAutoTeamForTask
var bAutoTeamForTask = 1;
if( type == (int)AutoTeamType.TYPE_TASK && bAutoTeamForTask<=0)//&& !g_pGame->GetConfigs()->GetGameSettings().bAutoTeamForTask
return false;
// Èç¹ûÕýÔÚ½øÐл×é¶ÓÇëÇó£¬ÔòºöÂÔÆäËûÇëÇó
//todo need to get m_iCurGoal
if( m_iType == (int)AutoTeamType.TYPE_TASK && m_iCurGoal>0)// && m_iCurGoal
return false;
// ¼Ç¼´ËʱµÄλÖÃ
if( type == (int)AutoTeamType.TYPE_TASK )
m_vTaskPos = EC_Game.GetGameRun().GetHostPlayer().GetPos();
if( m_iType == type && m_iCurGoal == iGoalID )
return false;
UnityGameSession.c2s_CmdAutoTeamSetGoal(type, iGoalID, 1);
return true;
}
void Cancel(int type)
{
if (m_iType == type && m_iCurGoal>0)
UnityGameSession.c2s_CmdAutoTeamSetGoal(type, m_iCurGoal, 0);
}
// public void OnPrtcAutoTeamSetGoalRe(Protocol p)
// {
// enum
// {
// ERR_INVALID_GOAL = -1,
// ERR_INVALID_ROLE_STATUS = -2,
// };
//
// using namespace GNET;
// AutoTeamSetGoal_Re* pProto = (AutoTeamSetGoal_Re*)p;
// if( pProto->retcode == 0 )
// {
// if( pProto->op == 1 )
// {
// m_iType = (int)pProto->goal_type;
// m_iCurGoal = pProto->goal_id;
//
// if( pProto->goal_type == TYPE_ACTIVITY )
// GetGameUIMan()->AddChatMessage(GetGameUIMan()->GetStringFromTable(10864), GP_CHAT_MISC);
//
// // ¸üнçÃæ
// CDlgActivity* pDlg = dynamic_cast<CDlgActivity*>(GetGameUIMan()->GetDialog("Win_Activity"));
// if( pDlg ) pDlg->UpdateActivityList(true);
// }
// }
// else
// {
// if( pProto->goal_type == TYPE_ACTIVITY )
// {
// if( pProto->op == 1 && pProto->retcode == ERR_INVALID_GOAL )
// GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(10860), MB_OK, A3DCOLORRGBA(255, 255, 255, 160));
// else if( pProto->op == 0 && pProto->retcode == ERR_INVALID_ROLE_STATUS )
// GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(10861), MB_OK, A3DCOLORRGBA(255, 255, 255, 160));
// }
// }
// }
// void CECAutoTeam::OnPrtcPlayerLeave(GNET::Protocol* p)
// {
// enum
// {
// REASON_COMPOSE_TEAM = 0,
// REASON_INVALID_STATUS,
// REASON_PLAYER_OP,
// REASON_JOIN_TEAM,
// REASON_TIMEOUT,
// };
//
// using namespace GNET;
// AutoTeamPlayerLeave* pProto = (AutoTeamPlayerLeave*)p;
// if( m_iType == TYPE_ACTIVITY )
// {
// switch(pProto->reason)
// {
// case REASON_INVALID_STATUS:
// GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(10862), MB_OK, A3DCOLORRGBA(255, 255, 255, 160));
// break;
// case REASON_TIMEOUT:
// GetGameUIMan()->AddChatMessage(GetGameUIMan()->GetStringFromTable(10863), GP_CHAT_MISC);
// break;
// }
// }
//
// m_iCurGoal = 0;
// m_iType = TYPE_UNKNOWN;
//
// // ¸üнçÃæ
// CDlgActivity* pDlg = dynamic_cast<CDlgActivity*>(GetGameUIMan()->GetDialog("Win_Activity"));
// if( pDlg ) pDlg->UpdateActivityList(true);
// }
//
// void CECAutoTeam::OnWorldChanged()
// {
// if( !IsMatchingForActivity() )
// return;
//
// bool bFound = false;
// int world_id = g_pGame->GetGameRun()->GetWorld()->GetInstanceID();
// for( size_t i=0;i<CECUIConfig::Instance().GetGameUI().nAutoTeamTransmitEnabledMap.size();i++ )
// {
// if( world_id == CECUIConfig::Instance().GetGameUI().nAutoTeamTransmitEnabledMap[i] )
// {
// bFound = true;
// break;
// }
// }
//
// if( !bFound )
// {
// GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(10865), MB_OK, A3DCOLORRGBA(255, 255, 255, 160));
// Cancel(TYPE_ACTIVITY);
// }
// }
//
// CECGameUIMan* CECAutoTeam::GetGameUIMan()
// {
// return g_pGame->GetGameRun()->GetUIManager()->GetInGameUIMan();
// }
//
// CECGameSession* CECAutoTeam::GetGameSession()
// {
// return g_pGame->GetGameSession();
// }
//
// CECHostPlayer* CECAutoTeam::GetHostPlayer()
// {
// return g_pGame->GetGameRun()->GetHostPlayer();
// }
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 0c340e14ce1c73c409d397575cdf8029
@@ -458,7 +458,7 @@ namespace BrewMonster
string strName = Encoding.Unicode.GetString(roleBase.name.ByteArray);
SetPlayerBriefInfo(roleBase.cls, roleBase.gender, strName);
EventBus.Publish(new NPCINFO(strName, 100,100, p.Roleid));
EventBus.Publish(new CECHostPlayer.NPCINFO(strName, 100,100, p.Roleid));
BMLogger.Log($"SetPlayerModel: {roleBase.cls} {roleBase.gender}");
await SetPlayerModel((byte)roleBase.cls, (byte)roleBase.gender);
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a3ad7cd15f37d924f824fbd72715dd2f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,91 @@
using System;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using TMPro;
using System.Collections;
using System.Threading;
using Cysharp.Threading.Tasks;
namespace BrewMonster
{
public class LoadingSceneController : MonoSingleton<LoadingSceneController>
{
[Header("UI")]
public GameObject goContent;
public Slider progressBar;
public TMP_Text percentText;
public TMP_Text loadingText;
private bool finished;
private CancellationTokenSource cts;
public void ShowLoadingScene(bool active)
{
goContent.SetActive(active);
// if (active)
// {
// Debug.LogError("Loading scene controller started");
//
// finished = false;
// loadingText.text = "Loading...";
// UpdateUI(0);
//
// cts?.Cancel();
// cts = new CancellationTokenSource();
//
// ObserveLoadingAsync(cts.Token).Forget();
// }
// else
// {
// cts?.Cancel();
// }
}
async UniTaskVoid ObserveLoadingAsync(CancellationToken token)
{
try
{
while (!finished && !token.IsCancellationRequested)
{
float progress = Mathf.Clamp01(SceneLoader.LoadingProgress / 100f);
UpdateUI(progress);
if (SceneLoader.SceneLoadProcess == SceneLoadProcess.EndLoading)
{
finished = true;
await EndLoadingAsync(token);
break;
}
await UniTask.Yield(PlayerLoopTiming.Update, token);
}
}
catch (OperationCanceledException)
{
// Normal cancel ignore
}
}
async UniTask EndLoadingAsync(CancellationToken token)
{
UpdateUI(1f);
loadingText.text = "Entering scene...";
await UniTask.Delay(TimeSpan.FromSeconds(0.2f), cancellationToken: token);
ShowLoadingScene(false);
}
public void UpdateUI(float progress)
{
progressBar.value = progress;
percentText.text = $"{Mathf.RoundToInt(progress * 100f)}%";
}
public void SetLoadingText(string content)
{
loadingText.text = content;
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: c0f91323d4b23b4428e423d2c724d821
@@ -0,0 +1,22 @@
using System;
using UnityEngine.SceneManagement;
namespace BrewMonster
{
public class SceneLoadService
{
public static void Load(
string sceneName,
LoadSceneMode mode = LoadSceneMode.Single,
Action<bool> actDone = null
)
{
if(string.IsNullOrEmpty(sceneName)) return;
SceneLoader.TargetScene = sceneName;
SceneLoader.LoadMode = mode;
SceneLoader.OnDone = actDone;
SceneManager.LoadScene(sceneName, mode);
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a87111a93f052894082eb4175befa2ed
@@ -0,0 +1,20 @@
using System;
using UnityEngine.SceneManagement;
namespace BrewMonster
{
public enum SceneLoadProcess
{
Loading,
EndLoading,
}
public class SceneLoader
{
public static string TargetScene;
public static LoadSceneMode LoadMode;
public static Action<bool> OnDone;
public static SceneLoadProcess SceneLoadProcess;
public static int LoadingProgress;
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 5faa62ff51365184f9a9cea81bce8188
+829 -67
View File
@@ -4,7 +4,9 @@ using ModelRenderer.Scripts.GameData;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using PerfectWorld.Scripts.Task;
using System.Threading;
using CSNetwork.GPDataType;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace BrewMonster.Scripts.Task
@@ -21,6 +23,16 @@ namespace BrewMonster.Scripts.Task
public const ulong TASK_PACK_MAGIC = 0x93858361;
public const ulong _task_templ_cur_version = 121;
private const int DYN_TASK_CUR_VERSION = 10;
private const int DYN_TASK_VERIFY_SVR = 8711;
private const int DYN_TASK_DELIVER_SVR = 8889;
private const int TASK_NPC_INFO_VERSION = 1;
private const int SEEK_SET = 0; /* set file offset to offset */
private const int SEEK_CUR = 1; /* set file offset to current plus offset */
private const int SEEK_END = 2; /* set file offset to EOF plus offset */
private ulong g_ulNewCount = 0;// do we need this? // MH: I think not, it look like a debug counter
private Dictionary<ulong, ATaskTempl> m_TaskTemplMap = new Dictionary<ulong, ATaskTempl>();
@@ -40,10 +52,23 @@ namespace BrewMonster.Scripts.Task
private List<ATaskTempl> m_SkillTaskLst = new List<ATaskTempl>();
private List<ATaskTempl> m_TmLmtChkLst = new List<ATaskTempl>();
private List<ATaskTempl> m_TasksCanSeekOut = new List<ATaskTempl>();
private elementdataman m_pEleDataMan;
// Dictionary<uint, ATaskTempl> m_DynTaskMap = new ();
uint m_ulDynTasksTimeMark;
byte[] m_pDynTasksData;
uint m_ulDynTasksDataSize;
byte[] m_pNPCInfoData;
uint m_ulNPCInfoDataSize;
uint m_ulNPCInfoTimeMark;
private Dictionary<uint, NPC_INFO> m_NPCInfoMap = new ();
#if _TASK_CLIENT
// char m_szDynPackPath[512];
private string m_szDynPackPath;
bool m_bDynTasksVerified;
protected special_award m_SpecialAward;
#endif
@@ -56,78 +81,202 @@ namespace BrewMonster.Scripts.Task
m_pEleDataMan = pMan;
}
public bool LoadTasksFromPack(string szPackPath, bool bLoadDescript)
public async UniTask<bool> LoadTasksFromPack(string szPackPath, bool bLoadDescript, Action<float> onProgress, CancellationToken token)
{
//TaskInterface::WriteLog(0, 0, 2, "LoadPack begin");
// //TaskInterface::WriteLog(0, 0, 2, "LoadPack begin");
// BMLogger.Log("[Dat]- szPackPath: " + szPackPath);
// if (!File.Exists(szPackPath))
// {
// BMLogger.LogError("[Dat]- File not found: " + szPackPath);
// return false;
// }
//
// long readBytes = 0;
// FileStream fs = new FileStream(szPackPath, FileMode.Open, FileAccess.Read);
//
// TASK_PACK_HEADER tph = AAssit.ReadFromBinaryOf<TASK_PACK_HEADER>(fs, ref readBytes);
//
// if (tph.magic != TASK_PACK_MAGIC
// || tph.version != _task_templ_cur_version)
// return false;
//
// if (tph.item_count == 0) return true;
//
// uint[] pOffs = new uint[tph.item_count];
// g_ulNewCount++;
//
//
// // fread(pOffs, sizeof(long), tph.item_count, fp);
// // read File and prepare offset array before loading tasks
// pOffs = AAssit.ReadArrayFromBinary<uint>(fs, (int)tph.item_count, ref readBytes);
//
// Debug.Log((int)tph.item_count);
// //BMLogger.Log($" [MH] Task File Lenght: {fs.Length}");
// // for (int i = 2058; i < 2059; i++) //TODO: tph.item_count
// Debug.Log($" Starting to load {tph.item_count} task templates...");
// for (int i = 0; i < tph.item_count; i++)
// {
// // mvoe file pointer to task offset
// fs.Seek(pOffs[i], SeekOrigin.Begin);
// // BMLogger.Log(" [MH] Loading Task Templ at offset: " + pOffs[i]);
//
// ATaskTempl pTempl = new ATaskTempl();
// g_ulNewCount++;
//
// // Debug.Log($"Task Index {i}: Attempting to load task template...");
// if (!pTempl.LoadFromBinFile(fs))
// {
// CECTaskInterface.WriteLog(0, (int)pTempl.m_FixedData.m_ID, 0, "Cant Load Task");
// // LOG_DELETE(pTempl);
// continue;
// }
//
// AddOneTaskTempl(pTempl);
// // TaskInterface::WriteLog(0, pTempl->m_ID, 2, "LoadTask");
// }
//
// Debug.Log($" Finished loading {m_TaskTemplMap.Count} task templates.");
//
// // // char log[1024];
// // // sprintf(log, "LoadTask, Count = %d", m_TaskTemplMap.size());
// // // TaskInterface::WriteLog(0, 0, 2, log);
//
// // //todo: check
// // // LOG_DELETE_ARR(pOffs);
// fs.Close();
// #if !_TASK_CLIENT
// UpdateTimeLimitCheckList();
// #else
// SortTasksCanSeekOut();
// #endif
//
//
// #if _ELEMENTCLIENT
// // TODO: implement task error logging if needed
// // _task_err.Release();
// // _task_err.Init("Configs\\task_err.txt", true);
// #endif
//
// return true;
BMLogger.Log("[Dat]- szPackPath: " + szPackPath);
if (!File.Exists(szPackPath))
{
BMLogger.LogError("[Dat]- File not found: " + szPackPath);
return false;
}
long readBytes = 0;
FileStream fs = new FileStream(szPackPath, FileMode.Open, FileAccess.Read);
TASK_PACK_HEADER tph = AAssit.ReadFromBinaryOf<TASK_PACK_HEADER>(fs, ref readBytes);
if (tph.magic != TASK_PACK_MAGIC
|| tph.version != _task_templ_cur_version)
return false;
if (tph.item_count == 0) return true;
uint[] pOffs = new uint[tph.item_count];
g_ulNewCount++;
// fread(pOffs, sizeof(long), tph.item_count, fp);
// read File and prepare offset array before loading tasks
pOffs = AAssit.ReadArrayFromBinary<uint>(fs, (int)tph.item_count, ref readBytes);
Debug.Log((int)tph.item_count);
//BMLogger.Log($" [MH] Task File Lenght: {fs.Length}");
// for (int i = 2058; i < 2059; i++) //TODO: tph.item_count
Debug.Log($" Starting to load {tph.item_count} task templates...");
for (int i = 0; i < tph.item_count; i++)
{
// mvoe file pointer to task offset
fs.Seek(pOffs[i], SeekOrigin.Begin);
// BMLogger.Log(" [MH] Loading Task Templ at offset: " + pOffs[i]);
ATaskTempl pTempl = new ATaskTempl();
g_ulNewCount++;
// Debug.Log($"Task Index {i}: Attempting to load task template...");
if (!pTempl.LoadFromBinFile(fs))
{
CECTaskInterface.WriteLog(0, (int)pTempl.m_FixedData.m_ID, 0, "Cant Load Task");
// LOG_DELETE(pTempl);
continue;
}
AddOneTaskTempl(pTempl);
// TaskInterface::WriteLog(0, pTempl->m_ID, 2, "LoadTask");
}
List<ATaskTempl> loadedTasks;
// thread-safe capture
Action<float> workerReport = p =>
{
// workerProgress = p;
};
try
{
// background thread
loadedTasks = await UniTask.RunOnThreadPool(() => LoadTasksFromPack_Internal(szPackPath, onProgress, token), cancellationToken: token);
}
catch (Exception e)
{
Debug.LogException(e);
return false;
}
Debug.Log($" Starting to load {loadedTasks.Count} task templates...");
// int batch = 0;
// foreach (var templ in loadedTasks)
// {
// AddOneTaskTempl(templ);
// g_ulNewCount++;
//
// // avoid frame spike
// if (++batch >= 20)
// {
// batch = 0;
// await UniTask.Yield();
// }
// }
int count = loadedTasks.Count;
for (int i = 0; i < count; i++)
{
AddOneTaskTempl(loadedTasks[i]);
g_ulNewCount++;
onProgress?.Invoke(0.8f + (i + 1) / (float)count * 0.2f);
if (i % 20 == 0)
await UniTask.Yield();
}
onProgress?.Invoke(1f);
Debug.Log($" Finished loading {m_TaskTemplMap.Count} task templates.");
// // char log[1024];
// // sprintf(log, "LoadTask, Count = %d", m_TaskTemplMap.size());
// // TaskInterface::WriteLog(0, 0, 2, log);
// //todo: check
// // LOG_DELETE_ARR(pOffs);
fs.Close();
// UpdateTimeLimitCheckList();
#if _ELEMENTCLIENT
_task_err.Release();
_task_err.Init("Configs\\task_err.txt", true);
#if !_TASK_CLIENT
UpdateTimeLimitCheckList();
#else
SortTasksCanSeekOut();
#endif
return true;
}
private static List<ATaskTempl> LoadTasksFromPack_Internal(string szPackPath, Action<float> onProgress, CancellationToken token)
{
long readBytes = 0;
var tasks = new List<ATaskTempl>();
using (var fs = new FileStream(
szPackPath,
FileMode.Open,
FileAccess.Read,
FileShare.Read))
{
TASK_PACK_HEADER tph =
AAssit.ReadFromBinaryOf<TASK_PACK_HEADER>(fs, ref readBytes);
if (tph.magic != TASK_PACK_MAGIC ||
tph.version != _task_templ_cur_version)
throw new Exception("Invalid task pack header");
if (tph.item_count == 0)
return tasks;
uint[] pOffs =
AAssit.ReadArrayFromBinary<uint>(fs, (int)tph.item_count, ref readBytes);
const float TASK_LOAD_WEIGHT = 0.8f;
for (int i = 0; i < tph.item_count; i++)
{
if (token.IsCancellationRequested)
return tasks;
// percentCount += percent;
float progress =
((i + 1) / (float)tph.item_count) * TASK_LOAD_WEIGHT;
onProgress?.Invoke(progress);
// LoadingSceneController.Instance.UpdateUI(percentCount);
// Debug.LogError($"pc: {percentCount}");
fs.Seek(pOffs[i], SeekOrigin.Begin);
ATaskTempl templ = new ATaskTempl();
if (!templ.LoadFromBinFile(fs))
continue;
tasks.Add(templ);
}
}
return tasks;
}
// General method to read a struct from a FileStream
private T ReadStruct<T>(FileStream stream) where T : struct
@@ -147,15 +296,206 @@ namespace BrewMonster.Scripts.Task
handle.Free();
}
}
public bool LoadNPCInfoFromPack(string szPath)
public async UniTask<bool> LoadNPCInfoFromPack(string szPath)
{
// // TODO: Implement NPC info loading if needed
// // FILE* fp = fopen(szPath, "rb");
// FileStream fp = new FileStream(szPath, FileMode.Open, FileAccess.Read);
// // if (fp == null)
// // {
// // TaskInterface::WriteLog(0, 0, 0, "LoadNPCInfoFromPack, no such file");
// // return false;
// // }
//
// // fseek(fp, 0, SEEK_END);
// // size_t sz = ftell(fp);
// // fseek(fp, 0, SEEK_SET);
// long sz = fp.Length;
//
// if (sz == 0)
// {
// BMLogger.LogError("[ATaskTemplMan] LoadNPCInfoFromPack, file size is 0");
// fp.Close();
// return false;
// }
//
// long offset = 0;
// byte[] buf = new Byte[sz];
// g_ulNewCount++;
// // fread(buf, 1, sz, fp);
// buf = AAssit.ReadArrayFromBinary<byte>( fp, (int)sz, ref offset);
// // fclose(fp);
// fp.Close();
//
// if (!UnmarshalNPCInfo(buf, (int)sz, false))
// {
// // LOG_DELETE_ARR(buf);
// return false;
// }
//
// #if _TASK_CLIENT
// // LOG_DELETE_ARR(buf);
// #else
// m_pNPCInfoData = buf;
// m_ulNPCInfoDataSize = (uint)sz;
// #endif
//
// return true;
if (!File.Exists(szPath))
{
BMLogger.LogError("[ATaskTemplMan] LoadNPCInfoFromPack, no such file");
return false;
}
byte[] buf;
try
{
// 1️⃣ background thread
buf = await UniTask.RunOnThreadPool(
() => LoadNPCInfoFromPack_Internal(szPath)
);
}
catch (Exception e)
{
Debug.LogException(e);
return false;
}
// 2️⃣ main thread (Unity-safe)
g_ulNewCount++;
if (!UnmarshalNPCInfo(buf, buf.Length, false))
return false;
#if _TASK_CLIENT
// nothing to store
#else
m_pNPCInfoData = buf;
m_ulNPCInfoDataSize = (uint)buf.Length;
#endif
return true;
}
public void VerifyDynTasksPack(string szPath)
private static byte[] LoadNPCInfoFromPack_Internal(string szPath)
{
using (var fs = new FileStream(
szPath,
FileMode.Open,
FileAccess.Read,
FileShare.Read))
{
long sz = fs.Length;
if (sz == 0)
throw new Exception("NPC info file size is 0");
long offset = 0;
return AAssit.ReadArrayFromBinary<byte>(
fs,
(int)sz,
ref offset
);
}
}
public async UniTask<bool> VerifyDynTasksPack(string szPath)
{
// // TODO: Implement dynamic task pack verification if needed
// // strcpy(m_szDynPackPath, szPath);
// m_szDynPackPath = szPath;
//
//
// // FILE* fp = fopen(szPath, "rb");
// FileStream fp = new FileStream(szPath, FileMode.Open, FileAccess.Read);
// // if (fp == NULL) return;
//
// // C++
// // fseek(fp, 0, SEEK_END);
// // size_t sz = ftell(fp);
// // fseek(fp, 0, SEEK_SET);
//
// // C#
// long offset = 0;
// long sz = fp.Length;
//
// int header_sz = Marshal.SizeOf<DYN_TASK_PACK_HEADER>();
//
// if (sz < header_sz)
// {
// // fclose(fp);
// fp.Close();
// return;
// }
//
// // C++
// // char* buf = new char[header_sz];
// // g_ulNewCount++;
// // fread(buf, 1, header_sz, fp);
// // fclose(fp);
//
// byte[] buf = new byte[header_sz];
// g_ulNewCount++;
// buf = AAssit.ReadArrayFromBinary<byte>(fp, header_sz, ref offset);
// fp.Close();
//
// UnmarshalDynTasks(buf, header_sz, true);
// // LOG_DELETE_ARR(buf);
// store path on main thread
m_szDynPackPath = szPath;
if (!File.Exists(szPath))
return false;
byte[] headerBuf;
try
{
// 1️⃣ background thread
headerBuf = await UniTask.RunOnThreadPool(
() => VerifyDynTasksPack_Internal(szPath)
);
}
catch (Exception e)
{
Debug.LogException(e);
return false;
}
if (headerBuf == null)
return false;
// 2️⃣ main thread
g_ulNewCount++;
UnmarshalDynTasks(headerBuf, headerBuf.Length, true);
return true;
}
private static byte[] VerifyDynTasksPack_Internal(string szPath)
{
using (var fs = new FileStream(
szPath,
FileMode.Open,
FileAccess.Read,
FileShare.Read))
{
long sz = fs.Length;
int headerSize = Marshal.SizeOf<DYN_TASK_PACK_HEADER>();
if (sz < headerSize)
return null;
long offset = 0;
return AAssit.ReadArrayFromBinary<byte>(
fs,
headerSize,
ref offset
);
}
}
public ATaskTempl GetTopTaskByID(uint ulID)
{
if (m_TaskTemplMap.TryGetValue(ulID, out ATaskTempl task))
@@ -239,7 +579,7 @@ namespace BrewMonster.Scripts.Task
pChild = pChild.m_pNextSibling;
}
}
#if !_TASK_CLIENT
void UpdateTimeLimitCheckList()
{
m_TmLmtChkLst.Clear();
@@ -253,7 +593,7 @@ namespace BrewMonster.Scripts.Task
}
}
#endif
public bool InitStorageTask()
{
m_StorageEssenseMap.Clear();
@@ -428,6 +768,40 @@ namespace BrewMonster.Scripts.Task
ATaskTempl._notify_svr(pTask, uReason, uTaskID);
}
static bool compare_tasks_canseekout( ATaskTempl lhs, ATaskTempl rhs)
{
if (lhs.m_FixedData.m_ulPremItems != 0 && rhs.m_FixedData.m_ulPremItems == 0) return true;
else if (lhs.m_FixedData.m_ulPremItems == 0 && rhs.m_FixedData.m_ulPremItems != 0) return false;
else if (lhs.m_FixedData.m_ulPremItems != 0 && rhs.m_FixedData.m_ulPremItems != 0) return lhs.m_FixedData.m_ID > rhs.m_FixedData.m_ID;
else return lhs.m_FixedData.m_ulPremise_Lev_Min > rhs.m_FixedData.m_ulPremise_Lev_Min;
}
/// <summary>
/// Comparator tương đương C++ version
/// </summary>
private static int CompareTasksCanSeekOut(ATaskTempl lhs, ATaskTempl rhs)
{
// Rule 1: Ưu tiên task có PremItems
bool lhsHasPrem = lhs.m_FixedData.m_ulPremItems != 0;
bool rhsHasPrem = rhs.m_FixedData.m_ulPremItems != 0;
if (lhsHasPrem && !rhsHasPrem) return -1; // lhs lên trước
if (!lhsHasPrem && rhsHasPrem) return 1; // rhs lên trước
// Rule 2: Nếu cả hai có PremItems → sắp theo ID giảm dần
if (lhsHasPrem && rhsHasPrem)
return rhs.m_FixedData.m_ID.CompareTo(lhs.m_FixedData.m_ID); // ID lớn đứng trước
// Rule 3: Nếu không có PremItems → LevelMin giảm dần
return rhs.m_FixedData.m_ulPremise_Lev_Min.CompareTo(lhs.m_FixedData.m_ulPremise_Lev_Min);
}
void SortTasksCanSeekOut()
{
// std::sort(m_TasksCanSeekOut.begin(), m_TasksCanSeekOut.end(), compare_tasks_canseekout);
m_TasksCanSeekOut.Sort(CompareTasksCanSeekOut);
}
public void CheckAutoDelv(TaskInterface pTask)
{
ATaskTempl pTempl = null;
@@ -486,13 +860,15 @@ namespace BrewMonster.Scripts.Task
}
// extarn from TaskServer
#endif
#if !_TASK_CLIENT
private void OnTaskGiveUpOneTask(TaskInterface pTask, uint ulTaskId, bool bForce)
{
TaskServer.OnTaskGiveUpOneTask(pTask, ulTaskId, bForce);
}
#endif
public void OnForgetLivingSkill(TaskInterface pTask)
{
// FinishedTaskList* pList = static_cast<FinishedTaskList*>(pTask->GetFinishedTaskList()); // C++
@@ -502,12 +878,12 @@ namespace BrewMonster.Scripts.Task
{
pList.RemoveTask(m_SkillTaskLst[i].GetID());
#if _TASK_CLIENT
#if !_TASK_CLIENT
OnTaskGiveUpOneTask(pTask, m_SkillTaskLst[i].GetID(), false);
#endif
}
#if _TASK_CLIENT
#if !_TASK_CLIENT
task_notify_base notify = new task_notify_base();
notify.reason = TaskTemplConstants.TASK_SVR_NOTIFY_FORGET_SKILL;
@@ -517,5 +893,391 @@ namespace BrewMonster.Scripts.Task
#endif
}
// process part
#if _TASK_CLIENT
// void GetTitleTasks(TaskInterface pTask, TaskTemplLst lst);
// void GetAvailableTasks(TaskInterface* pPlayer, TaskTemplLst& lst);
// void ManualTrigTask(TaskInterface* pTask, unsigned long ulTask);
// void ForceGiveUpTask(TaskInterface* pTask, unsigned long ulTask);
// void ForceRemoveFinishTask(TaskInterface* pTask, unsigned long ulTask);
public bool IsDynTasksVerified() { return m_bDynTasksVerified; }
void SetDynTasksVerified(bool b) { m_bDynTasksVerified = b; }
public void OnDynTasksTimeMark(TaskInterface pTask, uint ulTimeMark, ushort version)
{
if (version != DYN_TASK_CUR_VERSION)
return;
if (m_ulDynTasksTimeMark == ulTimeMark && LoadDynTasksFromPack(m_szDynPackPath))
{
SetDynTasksVerified(true);
pTask.InitActiveTaskList();
UpdateDynDataNPCService();
}
else
_notify_svr(pTask, ClientNotificationConstants.TASK_CLT_NOTIFY_DYN_DATA, 0);
}
public void OnDynTasksData(TaskInterface pTask, byte[] data, int sz, bool ended)
{
if (m_bDynTasksVerified)
{
// assert(false);
return;
}
uint new_sz = (uint)(sz + m_ulDynTasksDataSize);
var buf = new byte[new_sz];
g_ulNewCount++;
if (m_pDynTasksData != null && m_ulDynTasksDataSize > 0)
{
// memcpy(buf, m_pDynTasksData, m_ulDynTasksDataSize);
Buffer.BlockCopy(
m_pDynTasksData, // src
0, // src offset
buf, // dst
0, // dst offset
(int)m_ulDynTasksDataSize // bytes
);
}
// memcpy(buf + m_ulDynTasksDataSize, data, sz);
Buffer.BlockCopy(
data, // src
0, // src offset
buf, // dst
(int)m_ulDynTasksDataSize, // dst offset
sz // bytes
);
// LOG_DELETE_ARR(m_pDynTasksData);
m_pDynTasksData = buf;
m_ulDynTasksDataSize = new_sz;
if (ended)
{
// a_LogOutput(1, "[Dat Task] OnDynTasksData");
if (UnmarshalDynTasks(m_pDynTasksData, (int)m_ulDynTasksDataSize, false))
{
if (m_pDynTasksData!=null && m_pDynTasksData.Length>0)
{
try
{
using (FileStream fs = new FileStream(m_szDynPackPath, FileMode.Create, FileAccess.Write))
{
fs.Write(m_pDynTasksData, 0, (int)m_ulDynTasksDataSize);
}
}
catch (Exception ex)
{
BMLogger.LogError($"[ATaskTemplMan] Failed to write dyn tasks pack: {ex.Message}");
}
}
SetDynTasksVerified(true);
pTask.InitActiveTaskList();
UpdateDynDataNPCService();
}
// LOG_DELETE_ARR(m_pDynTasksData);
m_pDynTasksData = null;
m_ulDynTasksDataSize = 0;
}
}
// void OnStorageData(TaskInterface* pTask, const void* data);
// void OnSpecialAward(const special_award* p,TaskInterface* pTask);
// void VerifyDynTasksPack(const char* szPath);
// const special_award* GetSpecialAward() const { return &m_SpecialAward; }
public void ClearSpecailAward()
{
// memset(&m_SpecialAward, 0, sizeof(m_SpecialAward));
m_SpecialAward = new special_award();
}
// void SortTasksCanSeekOut();
// void UpdateTasksSeekOutDiff(TaskInterface* pTask);
// bool IsTaskToPush(int id);
// void ClearTasksToPush() { m_TasksToPush.clear(); }
// bool HasTaskToPush() { return !m_TasksToPush.empty(); }
void UpdateDynDataNPCService()
{
// assert(m_pEleDataMan);
DATA_TYPE dt = default;
NPC_TASK_IN_SERVICE service = (NPC_TASK_IN_SERVICE)m_pEleDataMan.get_data_ptr(
DYN_TASK_VERIFY_SVR,
ID_SPACE.ID_SPACE_ESSENCE,
ref dt
);
if (dt != DATA_TYPE.DT_NPC_TASK_IN_SERVICE)
{
BMLogger.LogError($"UpdateDynDataNPCService, wrong service, dt = {dt}");
return;
}
NPC_TASK_OUT_SERVICE deliver = (NPC_TASK_OUT_SERVICE)m_pEleDataMan.get_data_ptr(
DYN_TASK_DELIVER_SVR,
ID_SPACE.ID_SPACE_ESSENCE,
ref dt
);
if (dt != DATA_TYPE.DT_NPC_TASK_OUT_SERVICE)
{
BMLogger.LogError($"UpdateDynDataNPCService, wrong service, dt = {dt}");
return;
}
deliver.id_tasks ??= new uint[256];
service.id_tasks ??= new uint[256];
deliver.id_tasks.AsSpan().Clear();
service.id_tasks.AsSpan().Clear();
foreach (var kv in m_DynTaskMap)
{
ATaskTempl p = kv.Value;
if (p != null && p.m_FixedData.m_DynTaskType != (byte)DynTaskType.enumDTTGiftCard)
{
mount_task_out_service(p, ref deliver);
mount_task_in_service(p, ref service);
}
}
}
#else
void CheckDeathTrig(TaskInterface* pTask);
void OnTaskCheckAllTimeLimits(unsigned long ulCurTime);
void OnTaskGetDynTasksTimeMark(TaskInterface* pTask);
void OnTaskGetDynTasksData(TaskInterface* pTask);
void OnTaskGetSpecialAward(TaskInterface* pTask);
void OnTaskRemoveFinishTask(TaskInterface* pTask, unsigned long ulTask);
void OnTaskUpdateStorage(TaskInterface* pTask, unsigned long ulCurTime);
bool UpdateStorage(TaskInterface* pTask, StorageTaskList* pLst, unsigned long ulCurTime, unsigned long idStorage);
bool UpdateOneStorageDebug(TaskInterface* pTask, unsigned long ulCurTime, int idStorage, bool bUseDayAsSeed);
#endif
bool UnmarshalNPCInfo(byte[] data, int data_size, bool header_only)
{
if (data_size < Marshal.SizeOf<TASK_NPC_PACK_HEADER>())
{
// TaskInterface::WriteLog(0, 0, 0, "UnmarshalNPCInfo, wrong size");
BMLogger.LogError($" [ATaskTemplMan] UnmarshalNPCInfo, wrong size: {data_size} < {Marshal.SizeOf<TASK_NPC_PACK_HEADER>()}");
return false;
}
// const char* p = data;
// TASK_NPC_PACK_HEADER* header = (TASK_NPC_PACK_HEADER*)p;
// p += sizeof(TASK_NPC_PACK_HEADER);
TASK_NPC_PACK_HEADER header = GPDataTypeHelper.FromBytes<TASK_NPC_PACK_HEADER>(data);
var p = Marshal.SizeOf<TASK_NPC_PACK_HEADER>();
if (header.version != TASK_NPC_INFO_VERSION)
{
// TaskInterface::WriteLog(0, 0, 0, "UnmarshalNPCInfo, wrong version");
BMLogger.LogError($" [ATaskTemplMan] UnmarshalNPCInfo, wrong version: {header.version}");
return false;
}
if (header.pack_size != data_size)
{
// TaskInterface::WriteLog(0, 0, 0, "UnmarshalNPCInfo, wrong header");
BMLogger.LogError($" [ATaskTemplMan] UnmarshalNPCInfo, wrong header: pack_size {header.pack_size} != data_size {data_size}");
return false;
}
m_ulNPCInfoTimeMark = (uint)header.time_mark;
if (header_only)
return true;
// const NPC_INFO* pInfos = (const NPC_INFO*)p;
for (int i = 0; i < header.npc_count; i++)
{
// const NPC_INFO& info = pInfos[i];
// m_NPCInfoMap[info.id] = info;
NPC_INFO info = GPDataTypeHelper.FromBytes<NPC_INFO>(data, p);
p += Marshal.SizeOf<NPC_INFO>();
m_NPCInfoMap[info.id] = info;
}
return true;
}
bool UnmarshalDynTasks(byte[] data, int data_size, bool header_only)
{
if (data_size < Marshal.SizeOf<DYN_TASK_PACK_HEADER>())
{
// TaskInterface::WriteLog(0, 0, 0, "UnmarshalDynTasks, wrong size");
BMLogger.LogError(" [ATaskTemplMan] UnmarshalDynTasks, wrong size");
return false;
}
// C++
// const char* p = data;
// DYN_TASK_PACK_HEADER* header = (DYN_TASK_PACK_HEADER*)p;
// p += sizeof(DYN_TASK_PACK_HEADER);
DYN_TASK_PACK_HEADER header = GPDataTypeHelper.FromBytes<DYN_TASK_PACK_HEADER>(data);
long p = Marshal.SizeOf<DYN_TASK_PACK_HEADER>();
if (header.version != DYN_TASK_CUR_VERSION)
{
// TaskInterface::WriteLog(0, 0, 0, "UnmarshalDynTasks, wrong version");
BMLogger.LogError($" [ATaskTemplMan] UnmarshalDynTasks, wrong version: {header.version}");
return false;
}
if (header.pack_size != data_size)
{
// TaskInterface::WriteLog(0, 0, 0, "UnmarshalDynTasks, wrong header");
BMLogger.LogError($" [ATaskTemplMan] UnmarshalDynTasks, wrong header: pack_size {header.pack_size} != data_size {data_size}");
return false;
}
m_ulDynTasksTimeMark = (uint)header.time_mark;
if (header_only)
return true;
// BMLogger.Log($" [ATaskTemplMan] UnmarshalDynTasks, loading {header.task_count} tasks, data_size: {data_size}");
for (int i = 0; i < header.task_count; i++)
{
ATaskTempl pTempl = new ATaskTempl();
g_ulNewCount++;
pTempl.UnmarshalDynTask(data, ref p);
// BMLogger.Log($" [MH Task] after load UnmarshalDynTask[{i}] pointer at : {p - Marshal.SizeOf<DYN_TASK_PACK_HEADER>()}");
AddOneTaskTempl(pTempl);
// TaskInterface::WriteLog(0, pTempl->GetID(), 2, "LoadDynTask");
}
#if _TASK_CLIENT
SortTasksCanSeekOut();
#endif
// assert(p == data + data_size);
return true;
}
void mount_task_out_service(ATaskTempl task, ref NPC_TASK_OUT_SERVICE svr)
{
if (task.IsAutoDeliver())
return;
if (task.m_pParent != null && !task.m_pParent.m_FixedData.m_bChooseOne)
return;
uint[] tasks = svr.id_tasks;
for (int i = 0; i < tasks.Length; i++)
{
if (tasks[i] != 0)
continue;
tasks[i] = task.GetID();
break;
}
ATaskTempl child = task.m_pFirstChild;
while (child != null)
{
mount_task_out_service(child,ref svr);
child = child.m_pNextSibling;
}
}
void mount_task_in_service(ATaskTempl task,ref NPC_TASK_IN_SERVICE svr)
{
if ((TaskFinishType)task.m_FixedData.m_enumFinishType == TaskFinishType.enumTFTNPC)
{
uint[] tasks = svr.id_tasks;
for (int i = 0; i < tasks.Length; i++)
{
if (tasks[i] != 0)
continue;
tasks[i] = task.GetID();
break;
}
}
ATaskTempl child = task.m_pFirstChild;
while (child != null)
{
mount_task_in_service(child, ref svr);
child = child.m_pNextSibling;
}
}
bool LoadDynTasksFromPack(string szPath)
{
// TaskInterface::WriteLog(0, 0, 2, "LoadDynPack begin");
// FILE* fp = fopen(szPath, "rb");
FileStream fp = new FileStream(szPath, FileMode.Open, FileAccess.Read);
if (fp == null)
{
// TaskInterface::WriteLog(0, 0, 0, "LoadDynTasksFromPack, no such file");
BMLogger.LogError("[ATaskTemplMan] LoadDynTasksFromPack, no such file");
return false;
}
// fseek(fp, 0, SEEK_END);
// size_t sz = ftell(fp);
// fseek(fp, 0, SEEK_SET);
long sz = fp.Length;
if (sz == 0)
{
fp.Close();
return false;
}
// char* buf = new char[sz];
byte[] buf = new byte[sz];
g_ulNewCount++;
// fread(buf, 1, sz, fp);
long offset = 0;
buf = AAssit.ReadArrayFromBinary<byte>( fp, (int)sz, ref offset);
fp.Close();
if (!UnmarshalDynTasks(buf, (int)sz, false))
{
// LOG_DELETE_ARR(buf);
return false;
}
#if _TASK_CLIENT
// LOG_DELETE_ARR(buf);
#else
m_pDynTasksData = buf;
m_ulDynTasksDataSize = sz;
UpdateDynDataNPCService();
#endif
return true;
}
}
[ StructLayout(LayoutKind.Sequential, Pack = 1) ]
public struct TASK_NPC_PACK_HEADER
{
public uint pack_size;
public int time_mark;
public short version;
public short npc_count;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DYN_TASK_PACK_HEADER
{
public uint pack_size;
public int time_mark;
public ushort version;
public ushort task_count;
};
}
@@ -2,8 +2,12 @@ using BrewMonster.Network;
using CSNetwork.GPDataType;
using PerfectWorld.Scripts.Task;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using BrewMonster.UI;
using CSNetwork;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace BrewMonster.Scripts.Task
@@ -306,6 +310,32 @@ namespace BrewMonster.Scripts.Task
}
public class CECTaskInterface : TaskInterface
{
private CancellationTokenSource _cts;
public void Despose()
{
_cts?.Cancel();
_cts?.Dispose();
}
public int GetCurHistoryStageIndex()
{
return EC_Game.GetGameRun().GetCurStageIndex() + 1;
}
public uint GetObtainedGeneralCardCount()
{
return 0;
//return m_pHost ? m_pHost.GetGeneralCardData().GetObtainedCount() : 0;
}public uint GetObtainedGeneralCardCountByRank(int rank)
{
return 0;
//return m_pHost ? m_pHost.GetGeneralCardData().GetObtainedCount() : 0;
}
public bool HaveGotTitle(uint id_designation)
{
return true;
}
// public const int TASK_MAX_DELIVER_COUNT = 5;
// public const int TASK_STORAGE_COUNT = 32;
// public const int TASK_STORAGE_LEN = 10;
@@ -330,7 +360,7 @@ namespace BrewMonster.Scripts.Task
byte[] m_pFinishedCountListBuf;// Finished count list buffer
byte[] m_pStorageTaskListBuf; // Storage tasks list buffer
private Dictionary<int, bool> m_TasksToConfirm = new Dictionary<int, bool>();
private readonly System.Collections.Generic.Dictionary<uint, bool> m_emotionTask = new System.Collections.Generic.Dictionary<uint, bool>();
private readonly Dictionary<uint, bool> m_emotionTask = new System.Collections.Generic.Dictionary<uint, bool>();
private bool m_bForceNavigateFinish;
private int m_tmFinishDlgShown;
public CECTaskInterface()
@@ -349,16 +379,19 @@ namespace BrewMonster.Scripts.Task
}
// Initialize object
public bool Init(byte[] pActiveListBuf, int iActiveListLen, byte[] pFinishedListBuf,
public async UniTask<bool> Init(byte[] pActiveListBuf, int iActiveListLen, byte[] pFinishedListBuf,
int iFinishedListLen, byte[] pFinishedTimeListBuf, int iFinishedTimeListLen,
byte[] pFinishedCountListBuf, int iFinishedCountListLen, byte[] pStorageTaskListBuf, int iStorageTaskListLen)
{
_cts = new CancellationTokenSource();
// basic argument check (converted from ASSERT)
if (pActiveListBuf == null || pFinishedListBuf == null || pFinishedTimeListBuf == null || pFinishedCountListBuf == null)
{
return false;
}
// SceneLoader.SceneLoadProcess = SceneLoadProcess.Loading;
// SceneLoader.LoadingProgress = 0;
LoadingSceneController.Instance.ShowLoadingScene(true);
m_pActiveListBuf = new ActiveTaskList();
m_pActiveListBuf.ReadFromBuffer(pActiveListBuf);
@@ -393,9 +426,12 @@ namespace BrewMonster.Scripts.Task
ATaskTemplMan pTaskMan = GetTaskTemplMan();
pTaskMan.Release();
LoadingSceneController.Instance.ShowLoadingScene(true);
LoadingSceneController.Instance.UpdateUI(0f);
LoadingSceneController.Instance.SetLoadingText("Loading Tasks From Pack");
#if UNITY_EDITOR
/* if (TaskTest.Instance &&
if (TaskTest.Instance &&
TaskTest.Instance.WasLoadTaskData &&
pTaskMan.TaskLoadedCount > 100)
{
@@ -403,17 +439,29 @@ namespace BrewMonster.Scripts.Task
}
else
{
//string task_data_path = Path.Combine(Application.streamingAssetsPath, "data/tasks.data");
//pTaskMan.LoadTasksFromPack(task_data_path, true);
}*/
string task_data_path = Path.Combine(Application.streamingAssetsPath, "data/tasks.data");
await pTaskMan.LoadTasksFromPack(task_data_path, true, (x) =>
{
UniTask.Void(async () =>
{
await UniTask.SwitchToMainThread();
LoadingSceneController.Instance.UpdateUI(x);
});
}, _cts.Token);
}
#else
string task_data_path = Path.Combine(Application.streamingAssetsPath, "data/tasks.data");
pTaskMan.LoadTasksFromPack(task_data_path, true);
await pTaskMan.LoadTasksFromPack(task_data_path, true);
#endif
var task_npc_path = Path.Combine(Application.streamingAssetsPath, "data/task_npc.data");
await pTaskMan.LoadNPCInfoFromPack(task_npc_path);
var dyn_tasks_path = Path.Combine(Application.streamingAssetsPath, "data/dyn_tasks.data");
await pTaskMan.VerifyDynTasksPack(dyn_tasks_path);
pTaskMan.LoadNPCInfoFromPack("data\\task_npc.data");
pTaskMan.VerifyDynTasksPack("userdata\\dyn_tasks.data");
InitActiveTaskList();
SceneLoader.SceneLoadProcess = SceneLoadProcess.EndLoading;
LoadingSceneController.Instance.ShowLoadingScene(false);
m_bForceNavigateFinish = false;
@@ -449,10 +497,8 @@ namespace BrewMonster.Scripts.Task
public bool IsDeliverLegal()
{
// return !m_pHost.IsTrading() && m_pHost.GetBoothState() == 0 && !m_pHost.IsDead();
return !m_pHost.IsTrading() && m_pHost.GetBoothState() == 0 && !m_pHost.IsDead();
return true;
// TODO: implement
return m_pHost.IsTrading() && m_pHost.GetBoothState() == 0 && !m_pHost.IsDead();
}
public int GetCommonItemCount(uint ulCommonItem)
@@ -482,81 +528,304 @@ namespace BrewMonster.Scripts.Task
return m_pActiveListBuf;
}
private void InitActiveTaskList()
// private void InitActiveTaskList()
// {
// ActiveTaskList pLst = GetActiveTaskList();
// if (pLst == null) return;
//
// ATaskTemplMan pMan = GetTaskTemplMan();
// if (pMan == null) return;
//
// // reset counters
// pLst.m_uTopShowTaskCount = 0;
// pLst.m_uTopHideTaskCount = 0;
// pLst.m_uTitleTaskCount = 0;
//
// byte i = 0;
// while (i < pLst.m_uTaskCount)
// {
// ActiveTaskEntry entry = pLst.m_TaskEntries[i];
// if (entry == null)
// {
// i++;
// continue;
// }
//
// // repair sibling linkage
// if (entry.m_NextSblIndex != (char)0xff)
// {
// ActiveTaskEntry entryNextSbl = pLst.m_TaskEntries[entry.m_NextSblIndex];
// if (entryNextSbl == null || entryNextSbl.m_PrevSblIndex != (char)i)
// {
// entry.m_NextSblIndex = (char)0xff;
// }
// }
//
// // resolve template for top-level entries; children left unresolved in C#
// if (entry.m_ParentIndex == (char)0xff)
// {
// // entry.m_ulTemplAddr = 0u;
// entry.m_ulTemplAddr = pMan.GetTopTaskByID(entry.m_ID) != null ? 1u : 0u;
//
// ATaskTempl topTempl = pMan.GetTopTaskByID(entry.m_ID);
// if (topTempl != null)
// {
// if (topTempl.m_FixedData.m_bHidden)
// pLst.m_uTopHideTaskCount++;
// else if (topTempl.m_FixedData.m_bDisplayInTitleTaskUI)
// pLst.m_uTitleTaskCount++;
// else
// pLst.m_uTopShowTaskCount++;
// }
// }
// else
// {
// entry.m_ulTemplAddr = 0u;
// }
//
// // cap template best-effort (no pointer in managed)
// if (entry.m_uCapTaskId != 0)
// {
// ATaskTempl cap = pMan.GetTopTaskByID(entry.m_uCapTaskId);
// entry.m_ulCapTemplAddr = 0u;
// if (cap == null)
// {
// entry.m_uCapTaskId = 0;
// }
// }
// else
// {
// entry.m_ulCapTemplAddr = 0u;
// }
//
// i++;
// }
//
// // approximate used count
// pLst.m_uUsedCount = pLst.m_uTaskCount;
// }
public void InitActiveTaskList()
{
ActiveTaskList pLst = GetActiveTaskList();
if (pLst == null) return;
FinishedTaskList pFnsh = GetFinishedTaskList();
// TaskFinishTimeList* pFnshTime = static_cast<TaskFinishTimeList*>(GetFinishedTimeList());
TaskFinishTimeList pFnshTime = new TaskFinishTimeList(GetFinishedTimeList());
TaskFinishCountList pFnshCount = new TaskFinishCountList();
pFnshCount.ReadFromBytes(GetFinishedCntList());
ActiveTaskEntry[] pEntries = pLst.m_TaskEntries;
ATaskTemplMan pMan = GetTaskTemplMan();
if (pMan == null) return;
// reset counters
if (!CheckVersion() || !pLst.IsValid() || !pFnsh.IsValid() || !pFnshTime.IsValid())
{
pLst.RemoveAll();
pFnsh.RemoveAll();
pFnshTime.RemoveAll();
// TaskInterface::WriteLog(0, 0, 0, "InitLst, list is invalid");
}
if(!pFnshCount.IsValid())
{
pFnshCount.RemoveAll();
// TaskInterface::WriteLog(0, 0, 0, "InitLst, finish count list is invalid");
}
if (pFnsh.m_FnshHeader.m_Version == 0){
List<FnshedTaskEntryOld> list_old = new ();
// list_old.reserve(pFnsh->m_FnshHeader.m_uTaskCount);
list_old.Capacity = pFnsh.m_FnshHeader.m_uTaskCount; // C# equivalent of reserve
// FnshedTaskListOld* pListOld = (FnshedTaskListOld*)pFnsh;
FnshedTaskListOld pListOld = new FnshedTaskListOld(pFnsh.m_Buf);
for (int i = 0; i < pFnsh.m_FnshHeader.m_uTaskCount; i++)
{
list_old.Add(pListOld.m_aTaskList[i]);
}
var FnshHeader = pFnsh.m_FnshHeader;
FnshHeader.m_Version = 1;
pFnsh.m_FnshHeader = FnshHeader;
for (int i = 0; i < pFnsh.m_FnshHeader.m_uTaskCount; i++)
{
pFnsh.m_aTaskList[i].m_uTaskId = (ushort)(list_old[i].m_uTaskId & 0x7fff);
pFnsh.m_aTaskList[i].m_Mask = (byte)(list_old[i].m_uTaskId >> 15);
}
}
#if _TASK_CLIENT
// Debug output of finished tasks, for developer use -> not converted to C#
// FILE* fp = fopen("logs\\Tasks.log", "wb");
//
// if (fp)
// {
// unsigned short magic = 0xfeff;
// fwrite(&magic, sizeof(magic), 1, fp);
//
// for (unsigned long n = 0; n < pFnsh->m_FnshHeader.m_uTaskCount; n++)
// {
// ATaskTempl* pTempl = GetTaskTemplMan()->GetTaskTemplByID(pFnsh->m_aTaskList[n].m_uTaskId);
//
// fwprintf(
// fp,
// L"task = %d, name = %s\r\n",
// pFnsh->m_aTaskList[n].m_uTaskId,
// pTempl ? pTempl->GetName() : L"");
// }
//
// for (unsigned short m = 0; m < pFnshTime->m_uCount; m++)
// {
// ATaskTempl* pTempl = GetTaskTemplMan()->GetTaskTemplByID(pFnshTime->m_aList[m].m_uTaskId);
// unsigned long his_time = pFnshTime->m_aList[m].m_ulTimeMark;
// his_time -= unsigned long(TaskInterface::GetTimeZoneBias() * 60);
//
// if ((long)(his_time) < 0)
// his_time = 0;
//
// tm t = *gmtime((time_t*)&his_time);
// wchar_t buf[256];
// swprintf(buf, L"%d-%02d-%02d-%02d-%02d-%02d", t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
//
// fwprintf(
// fp,
// L"task = %d, deliver time = %s, name = %s\r\n",
// pFnshTime->m_aList[m].m_uTaskId,
// buf,
// pTempl ? pTempl->GetName() : L"");
// }
//
// fclose(fp);
// }
if (!GetTaskTemplMan().IsDynTasksVerified())
{
// ȡ̬ʱǩ
_notify_svr(this, ClientNotificationConstants.TASK_CLT_NOTIFY_DYN_TIMEMARK, 0);
}
else
{
// Ϣ
GetTaskTemplMan().ClearSpecailAward();
_notify_svr(this, ClientNotificationConstants.TASK_CLT_NOTIFY_SPECIAL_AWARD, 0);
// ȡֿ
_notify_svr(this, ClientNotificationConstants.TASK_CLT_NOTIFY_STORAGE, 0);
}
#else
uint ulCurTime = GetCurTime();
const ATaskTempl pTempl;
pLst.m_Version = TASK_ENTRY_DATA_CUR_VER;
bool bTimeMarkUpdated = pLst.IsTimeMarkUpdate();
pLst.m_uTopShowTaskCount = 0;
pLst.m_uTopHideTaskCount = 0;
pLst.m_uTitleTaskCount = 0;
#endif
byte i = 0;
while (i < pLst.m_uTaskCount)
// unsigned char i = 0;
for (int i=0; i < pLst.m_uTaskCount; i++)
{
ActiveTaskEntry entry = pLst.m_TaskEntries[i];
if (entry == null)
{
i++;
continue;
}
ActiveTaskEntry entry = pEntries[i];
// repair sibling linkage
if (entry.m_NextSblIndex != (char)0xff)
if (!entry.IsValid((char)i, (char)pLst.m_uTaskCount))
{
ActiveTaskEntry entryNextSbl = pLst.m_TaskEntries[entry.m_NextSblIndex];
if (entryNextSbl == null || entryNextSbl.m_PrevSblIndex != (char)i)
{
entry.m_NextSblIndex = (char)0xff;
}
pLst.RemoveAll();
// TaskInterface::WriteLog(0, 0, 0, "InitLst, active list is invalid");
break;
}
// resolve template for top-level entries; children left unresolved in C#
if (entry.m_ParentIndex == (char)0xff)
{
// entry.m_ulTemplAddr = 0u;
entry.m_ulTemplAddr = pMan.GetTopTaskByID(entry.m_ID) != null ? 1u : 0u;
ATaskTempl topTempl = pMan.GetTopTaskByID(entry.m_ID);
if (topTempl != null)
{
if (topTempl.m_FixedData.m_bHidden)
pLst.m_uTopHideTaskCount++;
else if (topTempl.m_FixedData.m_bDisplayInTitleTaskUI)
pLst.m_uTitleTaskCount++;
else
pLst.m_uTopShowTaskCount++;
}
}
else
{
entry.m_ulTemplAddr = 0u;
}
// cap template best-effort (no pointer in managed)
if (entry.m_uCapTaskId != 0)
{
ATaskTempl cap = pMan.GetTopTaskByID(entry.m_uCapTaskId);
entry.m_ulCapTemplAddr = 0u;
if (cap == null)
{
entry.m_uCapTaskId = 0;
}
}
else
{
entry.m_ulCapTemplAddr = 0u;
}
i++;
}
// approximate used count
pLst.m_uUsedCount = pLst.m_uTaskCount;
int i1 = 0;
while (i1 < pLst.m_uTaskCount)
{
ActiveTaskEntry entry = pEntries[i1];
if (entry.m_NextSblIndex != 0xff) {
ActiveTaskEntry entryNextSbl = pEntries[entry.m_NextSblIndex];
if (entryNextSbl.m_PrevSblIndex != i1) entry.m_NextSblIndex = (char)0xff;
}
if (entry.m_ParentIndex == 0xff)
entry.m_ulTemplAddr = pMan.GetTopTaskByID(entry.m_ID).m_FixedData.m_ID;
else
{
ATaskTempl pParent = pLst.m_TaskEntries[entry.m_ParentIndex].GetTempl();
if (pParent != null)
entry.m_ulTemplAddr = pParent.GetConstSubById(entry.m_ID).m_FixedData.m_ID;
else
entry.m_ulTemplAddr = 0;
}
#if !_TASK_CLIENT
// if (entry.m_ulTemplAddr != 0)
// {
// // TaskInterface::WriteLog(0, entry.m_ID, 0, "InitLst, Cant Find Task");
//
// pLst.ClearTask(this, entry, false);
// continue;
// }
//
// // ûɣ
// if (entry.m_ChildIndex == 0xff
// && entry.GetTempl().m_FixedData.m_enumMethod == (uint)TaskCompletionMethod.enumTMNone
// && !entry.IsFinished())
// {
// // TaskInterface::WriteLog(0, entry.m_ID, 0, "InitLst, Task is Impossible");
// pLst.ClearTask(this, entry, false);
// continue;
// }
#endif
if (entry.m_uCapTaskId != 0)
{
entry.m_ulCapTemplAddr = GetTaskTemplMan().GetTopTaskByID(entry.m_uCapTaskId).m_FixedData.m_ID;
if (entry.m_ulCapTemplAddr != 0)
{
entry.m_uCapTaskId = 0;
// TaskInterface::WriteLog(0, entry.m_uCapTaskId, 0, "InitLst, Cant Find CapTask");
}
}
else
entry.m_ulCapTemplAddr = 0;
#if !_TASK_CLIENT
// if (bTimeMarkUpdated != 0)
// {
// var pTempl = entry.GetTempl();
//
// if (!pTempl.m_FixedData.m_bAbsTime && !pTempl.m_FixedData.m_bPQTask && !pTempl.m_FixedData.m_bPQSubTask)
// entry.m_ulTaskTime = ulCurTime - entry.m_ulTaskTime;
// }
#endif
#if !_TASK_CLIENT
// ʼеءʾ
// if (entry.m_ParentIndex == 0xff)
// {
// if (entry.GetTempl()->m_bHidden)
// pLst->m_uTopHideTaskCount++;
// else if (entry.GetTempl()->m_bDisplayInTitleTaskUI)
// pLst->m_uTitleTaskCount++;
// else pLst->m_uTopShowTaskCount++;
//
// }
#endif
i1++;
}
#if !_TASK_CLIENT
// pLst->SetTimeMarkUpdate();
// pLst->UpdateTaskMask(*GetTaskMask());
#endif
pLst.UpdateUsedCount();
}
public bool CheckTaskForbid(uint task_id){ return false; }
@@ -978,7 +1247,14 @@ namespace BrewMonster.Scripts.Task
return 0u;
}
public bool CanDeliverCommonItem(uint ulTypes)
{
return m_pHost.GetPack().GetEmptySlotNum() >= (int)(ulTypes);
}
public bool CanDeliverTaskItem(uint ulTypes)
{
return m_pHost.GetTaskPack().GetEmptySlotNum() >= (int)ulTypes;
}
public void ShowPunchBagMessage(bool bSucced,bool bMax,uint MonsterTemplID,int dps,int dph)
{
// TODO : implement UI message box
@@ -1018,6 +1294,7 @@ namespace BrewMonster.Scripts.Task
// }
}
#endif
@@ -1292,7 +1569,7 @@ namespace BrewMonster.Scripts.Task
void _notify_svr(TaskInterface pTask, byte uReason, ushort uTaskID)
{
TaskClient._notify_svr(pTask, uReason, uTaskID);
}
public bool IsTaskReadyToConfirm(int iTaskID)
@@ -1316,6 +1593,17 @@ namespace BrewMonster.Scripts.Task
return ret;
}
// 设置存储任务列表缓冲区 // Set storage task list buffer
public void SetStorageTaskListBuffer(byte[] data)
{
if (data == null || m_pStorageTaskListBuf == null) return;
int copy = Mathf.Min(data.Length, m_pStorageTaskListBuf.Length);
if (copy > 0)
{
System.Buffer.BlockCopy(data, 0, m_pStorageTaskListBuf, 0, copy);
}
}
public uint GetTaskMask()
{
return 0;
@@ -1325,7 +1613,10 @@ namespace BrewMonster.Scripts.Task
{
return m_pFinishedTimeListBuf;
}
public byte[] GetFinishedCntList()
{
return m_pFinishedCountListBuf;
}
void SetForceNavigateFinishFlag(bool bFinish) { m_bForceNavigateFinish = bFinish;} //
public void OnNewTask(int iTaskID)
{
@@ -1386,11 +1677,11 @@ namespace BrewMonster.Scripts.Task
public void UpdateTaskUI(uint idTask, int reason)
{
// TODO: update task UI
// CECGameUIMan* pGameUI = g_pGame->GetGameRun()->GetUIManager()->GetInGameUIMan();
// if (pGameUI)
// {
// pGameUI->UpdateTask(idTask, reason);
// }
CECGameUIMan pGameUI = CECUIManager.Instance.GetInGameUIMan();
if (pGameUI != null )
{
pGameUI.UpdateTask(idTask, reason);
}
}
public bool IsTitleDataReady()
@@ -1429,6 +1720,84 @@ namespace BrewMonster.Scripts.Task
// g_pGame->GetGameSession()->c2s_CmdTaskNotify(pBuf, sz);
UnityGameSession.c2s_CmdTaskNotify(pBuf, sz);
}
#region Emote
public void SetEmotion(int emotion)
{
ActiveTaskList pList = GetActiveTaskList();
List<ActiveTaskEntry> aEntries = new List<ActiveTaskEntry>(pList.m_TaskEntries);
ATaskTempl pTempl;
if (emotion < (int)TaskInterface.CommandTaskAction.CMD_EMOTION_BINDBUDDY)// pTempl->m_uiEmotion ֵΪ0±íʾ²»¼ì²é£¬ËùÒÔËùÓбíÇéÐòºÅ¶¼ºóÒÆ1
emotion += 1;
for (int i = 0; i < pList.m_uTaskCount; i++)
{
ActiveTaskEntry curEntry = aEntries[i];
pTempl = curEntry.GetTempl();
if (pTempl != null &&
pTempl.m_FixedData.m_enumMethod == (uint)TaskCompletionMethod.enumTMSimpleClientTask &&
pTempl.m_FixedData.m_uiEmotion > 0)
{
uint id = pTempl.GetID();
// Check if map does not contain OR value == false
if (!m_emotionTask.TryGetValue(id, out bool exists) || !exists)
{
m_emotionTask[id] = (pTempl.m_FixedData.m_uiEmotion == (uint)emotion);
}
}
}
}
// void CECTaskInterface::UpdateTaskEmotionAction(unsigned int task_id)
// {
// if (m_emotionTask.find(task_id)!=m_emotionTask.end())
// {
// m_emotionTask[task_id] = false;
// }
// }
// void CECTaskInterface::UpdateEmotionDlg(unsigned int task)
// {
// ActiveTaskList* pList = static_cast<ActiveTaskList*>(GetActiveTaskList());
// ActiveTaskEntry* aEntries = pList->m_TaskEntries;
// unsigned char i;
// const ATaskTempl* pTempl, *pTarget = NULL;
// ActiveTaskEntry* pTargetEntry = NULL;
//
// for (i = 0; i < pList->m_uTaskCount; i++)
// {
// ActiveTaskEntry& CurEntry = aEntries[i];
// pTempl = CurEntry.GetTempl();
//
// if (!pTempl || pTempl->GetID() == task)
// continue;
//
// if (pTempl && pTempl->m_enumMethod==enumTMSimpleClientTask && pTempl->m_uiEmotion)
// {
// pTarget = pTempl;
// pTargetEntry = &CurEntry;
// break;
// }
// }
// if (pTarget && pTargetEntry && !pTempl->CanFinishTask(this, pTargetEntry, GetCurTime()))
// {
// PopEmotionUI(pTarget->GetID(),pTarget->m_uiEmotion,true);
// }
// }
// void TaskInterface::PopEmotionUI(unsigned int task_id,unsigned int uiEmotion,bool bShow)
// {
// CECGameUIMan* pGameUI = g_pGame->GetGameRun()->GetUIManager()->GetInGameUIMan();
//
// if (pGameUI)
// {
// pGameUI->PopTaskEmotionDlg(task_id,uiEmotion,bShow);
// }
// }
#endregion
}
@@ -0,0 +1,375 @@
# Task System High-Level Architecture Document
This document provides a high-level overview of the Task System architecture, including communication protocols, data flow, and system components.
---
## Table of Contents
1. [Protocol Communication](#protocol-communication)
2. [System Architecture](#system-architecture)
3. [Data Flow Diagrams](#data-flow-diagrams)
4. [Key Components](#key-components)
5. [Message Types](#message-types)
---
## Protocol Communication
### Primary Protocol Name
The Task System uses the following protocol for client-server communication:
- **Protocol Name**: `c2s_CmdTaskNotify` (Client to Server)
- **Command ID**: `TASK_NOTIFY` (value: 70) in `CommandID` enum
- **Server Response**: Various `TASK_SVR_NOTIFY_*` notification messages
### Protocol Implementation
- **Client Side**: `UnityGameSession.c2s_CmdTaskNotify(byte[] pBuf, uint sz)`
- **Server Side**: `GameSession.c2s_SendCmdTaskNotify(byte[] pData, uint dwDataSize)`
- **Base Structure**: `task_notify_base` containing `reason` (byte) and `task` (ushort)
---
## System Architecture
### High-Level Component Diagram
```mermaid
graph TB
subgraph Client["Client Side"]
UI[Task UI Components]
TaskClient[TaskClient]
TaskInterface[CECTaskInterface]
TaskTemplMan[ATaskTemplMan]
ActiveList[ActiveTaskList]
FinishedList[FinishedTaskList]
end
subgraph Network["Network Layer"]
UnitySession[UnityGameSession]
GameSession[GameSession]
end
subgraph Server["Server Side"]
TaskServer[TaskServer]
ServerLogic[Server Task Logic]
end
UI --> TaskClient
TaskClient --> TaskInterface
TaskInterface --> TaskTemplMan
TaskInterface --> ActiveList
TaskInterface --> FinishedList
TaskClient --> UnitySession
UnitySession --> GameSession
GameSession -->|c2s_CmdTaskNotify| ServerLogic
ServerLogic --> TaskServer
ServerLogic -->|TASK_SVR_NOTIFY_*| GameSession
GameSession --> UnitySession
UnitySession --> TaskClient
```
---
## Data Flow Diagrams
### 1. Task Accept Flow
```mermaid
sequenceDiagram
participant UI as Task UI
participant TC as TaskClient
participant TI as TaskInterface
participant NS as Network Session
participant S as Server
UI->>TC: User clicks Accept Task
TC->>TI: CanDeliverTask(taskId)
TI->>TI: CheckPrerequisite()
alt Prerequisites Met
TC->>NS: c2s_CmdTaskNotify(TASK_CLT_NOTIFY_MANUAL_TRIG)
NS->>S: Send notification
S->>S: Validate & Process
S->>NS: TASK_SVR_NOTIFY_NEW
NS->>TC: OnServerNotify()
TC->>TI: Update ActiveTaskList
TC->>UI: UpdateTaskUI()
else Prerequisites Failed
TC->>UI: Show Error Message
end
```
### 2. Task Completion Flow
```mermaid
sequenceDiagram
participant Game as Game Logic
participant TC as TaskClient
participant TI as TaskInterface
participant NS as Network Session
participant S as Server
Game->>TC: OnTaskCheckStatus()
TC->>TI: Check task conditions
TI->>TI: CanFinishTask()
TI->>TI: RecursiveCheckAward()
alt Task Can Complete
TC->>NS: c2s_CmdTaskNotify(TASK_CLT_NOTIFY_CHECK_FINISH)
NS->>S: Send completion request
S->>S: Validate completion
S->>S: Process awards
S->>NS: TASK_SVR_NOTIFY_COMPLETE
NS->>TC: OnServerNotify()
TC->>TI: Update task state
TC->>TI: Apply awards
TC->>UI: UpdateTaskUI()
end
```
### 3. Task Give Up Flow
```mermaid
sequenceDiagram
participant UI as Task UI
participant TC as TaskClient
participant TI as TaskInterface
participant NS as Network Session
participant S as Server
UI->>TC: User clicks Give Up
TC->>TI: GiveUpTask(taskId)
TC->>NS: c2s_CmdTaskNotify(TASK_CLT_NOTIFY_CHECK_GIVEUP)
NS->>S: Send give up request
S->>S: Validate give up
S->>NS: TASK_SVR_NOTIFY_GIVE_UP
NS->>TC: OnServerNotify()
TC->>TI: Remove from ActiveTaskList
TC->>UI: UpdateTaskUI()
```
### 4. Task Progress Update Flow
```mermaid
sequenceDiagram
participant Game as Game Logic
participant TC as TaskClient
participant TI as TaskInterface
participant NS as Network Session
participant S as Server
Game->>Game: Monster killed / Item collected
Game->>S: Progress update (via game protocol)
S->>S: Update task progress
S->>NS: TASK_SVR_NOTIFY_MONSTER_KILLED
S->>NS: TASK_SVR_NOTIFY_PLAYER_KILLED
NS->>TC: OnServerNotify()
TC->>TI: Update ActiveTaskEntry
TC->>UI: UpdateTaskUI()
```
### 5. Task Initialization Flow
```mermaid
sequenceDiagram
participant Game as Game Run
participant TI as TaskInterface
participant TM as TaskTemplMan
participant NS as Network Session
participant S as Server
Game->>TI: Init(activeList, finishedList, ...)
TI->>TM: LoadTasksFromPack()
TI->>TI: InitActiveTaskList()
TI->>NS: Request dynamic tasks time mark
NS->>S: TASK_CLT_NOTIFY_DYN_TIMEMARK
S->>NS: TASK_SVR_NOTIFY_DYN_TIME_MARK
NS->>TI: OnServerNotify()
TI->>NS: Request storage tasks
NS->>S: TASK_CLT_NOTIFY_STORAGE
S->>NS: TASK_SVR_NOTIFY_STORAGE
NS->>TI: OnServerNotify()
```
---
## Key Components
### Client-Side Components
#### 1. **TaskInterface** (`CECTaskInterface`)
- **Purpose**: Main interface for task operations
- **Key Methods**:
- `Init()`: Initialize task system with data buffers
- `GetTaskStateInfo()`: Get current task state
- `CanDeliverTask()`: Check if task can be accepted
- `NotifyServer()`: Send notifications to server
#### 2. **TaskClient**
- **Purpose**: Client-side task logic and status checking
- **Key Methods**:
- `OnTaskCheckStatus()`: Periodic task status validation
- `OnServerNotify()`: Handle server notifications
- `_notify_svr()`: Send client notifications to server
#### 3. **ATaskTemplMan**
- **Purpose**: Task template manager
- **Key Methods**:
- `LoadTasksFromPack()`: Load task templates from data files
- `GetTaskTemplByID()`: Retrieve task template by ID
- `GetTopTaskByID()`: Get top-level task template
#### 4. **ActiveTaskList**
- **Purpose**: Manages currently active tasks
- **Structure**: Contains array of `ActiveTaskEntry` objects
- **Key Fields**:
- `m_uTaskCount`: Number of active tasks
- `m_TaskEntries[]`: Array of task entries
#### 5. **FinishedTaskList**
- **Purpose**: Tracks completed tasks
- **Structure**: Contains list of finished task IDs and metadata
### Server-Side Components
#### 1. **TaskServer**
- **Purpose**: Server-side task operations
- **Key Methods**:
- `OnTaskGiveUpOneTask()`: Handle task abandonment
---
## Message Types
### Client-to-Server Notifications (`TASK_CLT_NOTIFY_*`)
| Constant | Value | Description |
|----------|-------|-------------|
| `TASK_CLT_NOTIFY_CHECK_FINISH` | 1 | Request task completion check |
| `TASK_CLT_NOTIFY_CHECK_GIVEUP` | 2 | Request task give up |
| `TASK_CLT_NOTIFY_REACH_SITE` | 3 | Notify reached target location |
| `TASK_CLT_NOTIFY_AUTO_DELV` | 4 | Auto-deliver task |
| `TASK_CLT_NOTIFY_MANUAL_TRIG` | 5 | Manual task trigger (accept) |
| `TASK_CLT_NOTIFY_FORCE_GIVEUP` | 6 | Force give up task |
| `TASK_CLT_NOTIFY_DYN_TIMEMARK` | 7 | Request dynamic tasks time mark |
| `TASK_CLT_NOTIFY_DYN_DATA` | 8 | Request dynamic tasks data |
| `TASK_CLT_NOTIFY_SPECIAL_AWARD` | 9 | Request special award info |
| `TASK_CLT_NOTIFY_LEAVE_SITE` | 10 | Notify left target location |
| `TASK_CLT_NOTIFY_PQ_CHECK_INIT` | 11 | Public Quest check init |
| `TASK_CLT_NOTIFY_STORAGE` | 12 | Request storage tasks |
| `TASK_CLT_NOTIFY_REQUEST_TREASURE_INDEX` | 14 | Request treasure map index |
| `TASK_CLT_NOTIFY_15DAYS_NOLOGIN` | 15 | 15 days no login notification |
| `TASK_CLT_NOTIFY_SPECIAL_AWARD_MASK` | 16 | Special award mask |
| `TASK_CLT_NOTIFY_TITLE_TASK` | 17 | Title task notification |
| `TASK_CLT_NOTIFY_CHOOSE_AWARD` | 18 | Choose award notification |
| `TASK_CLT_NOTIFY_BUY_TOKENSHOP_ITEM` | 20 | Buy token shop item |
| `TASK_CLT_NOTIFY_FINISH_TASK_BY_WORLD_CONTRIBUTION` | 21 | Finish task by world contribution |
| `TASK_CLT_NOTIFY_RM_FINISH_TASK` | 150 | Remove finished task |
### Server-to-Client Notifications (`TASK_SVR_NOTIFY_*`)
| Constant | Value | Description |
|----------|-------|-------------|
| `TASK_SVR_NOTIFY_NEW` | 1 | New task assigned |
| `TASK_SVR_NOTIFY_COMPLETE` | 2 | Task completed |
| `TASK_SVR_NOTIFY_GIVE_UP` | 3 | Task given up |
| `TASK_SVR_NOTIFY_MONSTER_KILLED` | 4 | Monster killed (progress update) |
| `TASK_SVR_NOTIFY_FINISHED` | 5 | Task finished |
| `TASK_SVR_NOTIFY_ERROR_CODE` | 6 | Task error code |
| `TASK_SVR_NOTIFY_FORGET_SKILL` | 7 | Forget skill notification |
| `TASK_SVR_NOTIFY_DYN_TIME_MARK` | 8 | Dynamic tasks time mark |
| `TASK_SVR_NOTIFY_DYN_DATA` | 9 | Dynamic tasks data |
| `TASK_SVR_NOTIFY_SPECIAL_AWARD` | 10 | Special award notification |
| `TASK_SVR_NOTIFY_STORAGE` | 11 | Storage tasks data |
| `TASK_SVR_NOTIFY_DIS_GLOBAL_VAL` | 12 | Disable global value |
| `TASK_SVR_NOTIFY_TREASURE_MAP` | 13 | Treasure map notification |
| `TASK_SVR_NOTIFY_SET_TASK_LIMIT` | 14 | Set task limit |
| `TASK_SVR_NOTIFY_PLAYER_KILLED` | 15 | Player killed (progress update) |
---
## Data Structures
### Task Notification Base Structure
```csharp
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct task_notify_base
{
public byte reason; // Notification reason (TASK_CLT_NOTIFY_* or TASK_SVR_NOTIFY_*)
public ushort task; // Task ID
}
```
### Active Task Entry
```csharp
public class ActiveTaskEntry : TASK_ENTRY_FIXED_DATA
{
public ushort m_ID; // Task ID
public char m_ParentIndex; // Parent node index
public char m_ChildIndex; // Child node index
public uint m_ulTaskTime; // Task start timestamp
public uint m_ulTemplAddr; // Template address (ID in C#)
public ushort[] m_wMonsterNum; // Monster kill counts
// ... additional fields
}
```
---
## Task State Machine
```mermaid
stateDiagram-v2
[*] --> Available: Task Template Loaded
Available --> Active: Accept Task (TASK_CLT_NOTIFY_MANUAL_TRIG)
Active --> InProgress: Task Started
InProgress --> Completed: Conditions Met (TASK_CLT_NOTIFY_CHECK_FINISH)
InProgress --> Failed: Timeout / Fail Condition
InProgress --> Abandoned: Give Up (TASK_CLT_NOTIFY_CHECK_GIVEUP)
Completed --> Finished: Awards Applied (TASK_SVR_NOTIFY_COMPLETE)
Failed --> [*]
Abandoned --> [*]
Finished --> [*]
```
---
## Error Codes
The system uses various error codes defined in `TaskInterfaceConstants`:
- `TASK_PREREQU_FAIL_*`: Prerequisite check failures (1-66)
- `TASK_AWARD_FAIL_*`: Award processing failures (150-160)
Common error codes:
- `TASK_PREREQU_FAIL_BELOW_LEVEL`: Player level too low
- `TASK_PREREQU_FAIL_NO_SPACE`: No space for new task
- `TASK_PREREQU_FAIL_PREV_TASK`: Previous task not completed
- `TASK_AWARD_FAIL_GIVEN_ITEM`: Item award failed
---
## Notes
1. **Version Checking**: The system includes version checking for task list compatibility
2. **Dynamic Tasks**: Supports dynamic tasks that can be updated at runtime
3. **Storage Tasks**: Library/storage tasks system for task management
4. **Public Quests**: Special quest type (PQ) with shared state
5. **Task Templates**: Tasks are defined in data files (`tasks.data`, `task_npc.data`, `dyn_tasks.data`)
---
## References
- `TaskInterface.cs`: Core task interface definition
- `CECTaskInterface.cs`: Client implementation of task interface
- `TaskClient.cs`: Client-side task logic
- `TaskServer.cs`: Server-side task operations
- `TaskTempl.cs`: Task template constants and structures
- `TaskProcess.cs`: Task entry and list structures
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 4f968fa1b610f4dca8de367446d9d7d9
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+25 -26
View File
@@ -290,7 +290,7 @@ namespace BrewMonster.Scripts.Task
&& pos[2] >= min.z && pos[2] <= max.z;
}
private static void _notify_svr(TaskInterface pTask, byte uReason, ushort uTaskID)
public static void _notify_svr(TaskInterface pTask, byte uReason, ushort uTaskID)
{
ATaskTempl._notify_svr(pTask, uReason, uTaskID);
}
@@ -314,7 +314,7 @@ namespace BrewMonster.Scripts.Task
// Marshal base notification structure from buffer
task_notify_base pNotify = GPDataTypeHelper.FromBytes<task_notify_base>(pBuf);
BMLogger.Log($"[TaskClient] OnServerNotify: reason={pNotify.reason}, task={pNotify.task}");
BMLogger.Log($"[MH Task] TaskClient.OnServerNotify: reason={pNotify.reason}, task={pNotify.task}");
ATaskTempl pTempl = null;
ActiveTaskEntry pEntry = null;
@@ -356,14 +356,14 @@ namespace BrewMonster.Scripts.Task
else if (pNotify.reason == TaskTemplConstants.TASK_SVR_NOTIFY_DYN_TIME_MARK)
{
// TODO: svr_task_dyn_time_mark struct not defined; need to define or use alternative
// if (sz != Marshal.SizeOf<svr_task_dyn_time_mark>()) return;
if (sz != Marshal.SizeOf<svr_task_dyn_time_mark>()) return;
// TODO: OnDynTasksTimeMark method not found in ATaskTemplMan; implement if needed
// ATaskTemplMan pMan = GetTaskTemplMan(pTask);
// if (pMan != null)
// {
// svr_task_dyn_time_mark dynMark = Marshal.PtrToStructure<svr_task_dyn_time_mark>(handle.AddrOfPinnedObject());
// pMan.OnDynTasksTimeMark(pTask, dynMark.time_mark, dynMark.version);
// }
ATaskTemplMan pMan = GetTaskTemplMan();
if (pMan != null)
{
svr_task_dyn_time_mark dynMark = GPDataTypeHelper.FromBytes<svr_task_dyn_time_mark>(pBuf);
pMan.OnDynTasksTimeMark(pTask, dynMark.time_mark, dynMark.version);
}
return;
}
// Handle dynamic task data notification
@@ -371,13 +371,13 @@ namespace BrewMonster.Scripts.Task
{
if (sz <= (uint)Marshal.SizeOf<task_notify_base>()) return;
// TODO: OnDynTasksData method not found in ATaskTemplMan; implement if needed
// ATaskTemplMan pMan = GetTaskTemplMan(pTask);
// if (pMan != null)
// {
// byte[] dynData = new byte[sz - Marshal.SizeOf<task_notify_base>()];
// Array.Copy(pBuf, Marshal.SizeOf<task_notify_base>(), dynData, 0, dynData.Length);
// pMan.OnDynTasksData(pTask, dynData, (uint)dynData.Length, pNotify.task != 0);
// }
ATaskTemplMan pMan = GetTaskTemplMan();
if (pMan != null)
{
byte[] dynData = new byte[sz - Marshal.SizeOf<task_notify_base>()];
Array.Copy(pBuf, Marshal.SizeOf<task_notify_base>(), dynData, 0, dynData.Length);
pMan.OnDynTasksData(pTask, dynData, dynData.Length, pNotify.task != 0);
}
return;
}
// Handle storage data notification
@@ -462,16 +462,15 @@ namespace BrewMonster.Scripts.Task
{
// Monster kill count >= 2 triggers auto team
// TODO: svr_monster_killed struct not defined; need to define or use alternative
// if (sz == Marshal.SizeOf<svr_monster_killed>())
// {
// svr_monster_killed pKilled = Marshal.PtrToStructure<svr_monster_killed>(handle.AddrOfPinnedObject());
// if (pKilled.monster_num >= 2)
// {
// // TODO: CECAutoTeam and DoAutoTeam not found; implement auto team if needed
// // CECAutoTeam pAutoTeam = g_pGame.GetGameRun().GetHostPlayer().GetAutoTeam();
// // pAutoTeam.DoAutoTeam(CECAutoTeam.TYPE_TASK, pNotify.task);
// }
// }
if (sz == Marshal.SizeOf<svr_monster_killed>())
{
svr_monster_killed pKilled = GPDataTypeHelper.FromBytes<svr_monster_killed>(pBuf) ;//Marshal.PtrToStructure<svr_monster_killed>(pNotify.AddrOfPinnedObject());
if (pKilled.monster_num >= 2)
{
// CECAutoTeam pAutoTeam = EC_Game.GetGameRun().GetHostPlayer().GetAutoTeam();
// pAutoTeam.DoAutoTeam((int)CECAutoTeam.AutoTeamType.TYPE_TASK, pNotify.task);
}
}
// TODO: CECUIHelper.OnTaskProcessUpdated not found; implement UI update if needed
// CECUIHelper.OnTaskProcessUpdated(pNotify.task);
}
@@ -1,4 +1,5 @@
using BrewMonster.Network;
using Cysharp.Threading.Tasks;
using PerfectWorld.Scripts.Task;
namespace BrewMonster.Scripts.Task
@@ -47,7 +48,7 @@ namespace BrewMonster.Scripts.Task
public interface TaskInterface
{
bool Init(byte[] pActiveListBuf, int iActiveListLen, byte[] pFinishedListBuf,
UniTask<bool> Init(byte[] pActiveListBuf, int iActiveListLen, byte[] pFinishedListBuf,
int iFinishedListLen, byte[] pFinishedTimeListBuf, int iFinishedTimeListLen,
byte[] pFinishedCountListBuf, int iFinishedCountListLen, byte[] pStorageTaskListBuf,
int iStorageTaskListLen);
@@ -94,6 +95,14 @@ namespace BrewMonster.Scripts.Task
uint CanDeliverTask(uint ulTaskId);
void UpdateTaskUI(uint idTask, int reason);
#endif
public enum CommandTaskAction
{
CMD_EMOTION_BINDBUDDY = 1024, // If there are other non-expression actions, they will be 1025, 1026...
CMD_EMOTION_SITDOWN, // Sit down
CMD_JUMP_TRICKACTION, // Jump and roll
CMD_RUN_TRICKACTION, // Run and roll
}
// bool HasTask(uint taskId);
// bool CheckTaskForbid(uint taskId);
long GetGlobalValue(long key);
@@ -122,6 +131,7 @@ namespace BrewMonster.Scripts.Task
int GetExp();
int GetSP();
int GetForceActivityLevel();
bool HaveGotTitle(uint id_designation);
bool IsKing();
bool IsInTeam();
uint GetAccountTotalCash();
@@ -151,6 +161,16 @@ namespace BrewMonster.Scripts.Task
int GetPlayerId();
void PopChatMessage(int iIndex, int dwNum=0);
void InitActiveTaskList();
bool CanDeliverCommonItem(uint ulItemTypes);
bool CanDeliverTaskItem(uint ulItemTypes);
static int GetTimeZoneBias()
{
return EC_Game.GetTimeZoneBias();
}
int GetCurHistoryStageIndex();
byte[] GetFinishedCntList();
uint GetObtainedGeneralCardCount();
uint GetObtainedGeneralCardCountByRank(int rank);
}
}
+162 -38
View File
@@ -1,6 +1,7 @@
using System;
using System.Runtime.InteropServices;
using BrewMonster.Scripts.Task;
using CSNetwork.GPDataType;
using UnityEngine;
namespace BrewMonster.Scripts.Task
@@ -19,6 +20,109 @@ namespace BrewMonster.Scripts.Task
TASK_STATE_AWARD_NOTIFY_TEAM = 0x10, // Award has been notified to team
TASK_STATE_CONTRIBUTION_FINISH = 0x20 // Contribution finished
}
[StructLayout( LayoutKind.Sequential, Pack = 1 )]
public struct TaskFinishCountList
{
public static ushort m_uCount;
public static TaskFinishCountEntry[] m_aList = new TaskFinishCountEntry[(uint)TaskInterfaceConstants.TASK_FINISH_COUNT_MAX_LEN];
public uint Search(uint ulID, ref uint ulTime)
{
for (ushort i = 0; i < TaskFinishCountList.m_uCount; i++)
{
if (TaskFinishCountList.m_aList[i].m_uTaskId == (ushort)ulID)
{
ulTime = TaskFinishCountList.m_aList[i].m_ulFinishTime;
return TaskFinishCountList.m_aList[i].m_ulFinishCount;
}
}
return 0u;
}
public void ResetAt(uint ulID)
{
for (ushort i = 0; i < m_uCount; i++)
if (m_aList[i].m_uTaskId == (ushort)ulID)
m_aList[i].m_ulFinishCount = 0;
}
public void AddOrUpdate(uint ulID, uint ulFinishTime)
{
for (ushort i = 0; i < m_uCount; i++)
{
if (m_aList[i].m_uTaskId == (ushort)ulID)
{
m_aList[i].m_ulFinishCount ++;
m_aList[i].m_ulFinishTime = ulFinishTime;
return;
}
}
if (m_uCount >= (uint)TaskInterfaceConstants.TASK_FINISH_COUNT_MAX_LEN)
return;
m_aList[m_uCount].m_uTaskId = (ushort)ulID;
m_aList[m_uCount].m_ulFinishCount = 1;
m_aList[m_uCount].m_ulFinishTime = ulFinishTime;
m_uCount++;
}
public void RemoveAll()
{
m_uCount = 0;
m_aList = new TaskFinishCountEntry[(uint)TaskInterfaceConstants.TASK_FINISH_COUNT_MAX_LEN];
}
public bool IsValid() { return m_uCount <= TaskInterfaceConstants.TASK_FINISH_COUNT_MAX_LEN; }
public bool ReadFromBytes(byte[] data)
{
if (data == null || data.Length < 2)
return false;
// Read m_uCount (2 bytes)
m_uCount = BitConverter.ToUInt16(data, 0);
// Read m_aList array
int entrySize = Marshal.SizeOf<TaskFinishCountEntry>();
int expectedSize = 2 + entrySize * TaskInterfaceConstants.TASK_FINISH_COUNT_MAX_LEN;
if (data.Length < expectedSize)
return false;
if (m_aList == null || m_aList.Length != TaskInterfaceConstants.TASK_FINISH_COUNT_MAX_LEN)
m_aList = new TaskFinishCountEntry[TaskInterfaceConstants.TASK_FINISH_COUNT_MAX_LEN];
for (int i = 0; i < TaskInterfaceConstants.TASK_FINISH_COUNT_MAX_LEN; i++)
{
int offset = 2 + i * entrySize;
m_aList[i] = GPDataTypeHelper.FromBytes<TaskFinishCountEntry>(data[offset..(offset + entrySize)]);
}
return true;
}
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct TaskFinishCountEntry
{
public ushort m_uTaskId;
public uint m_ulFinishCount;
public uint m_ulFinishTime;
public uint m_ulUnused2;
};
[StructLayout( LayoutKind.Sequential, Pack = 1 )]
public class TASK_
{
public const int TASK_DEFAULT_MAX_SIMULTANEOUS_COUT = 20;
public const int TASK_MAX_SIMULTANEOUS_COUT = 30;
public const int TASK_HIDDEN_COUNT = 30; // formally 6, for test
public const int TASK_TITLE_TASK_COUNT = 10;
}
[StructLayout( LayoutKind.Sequential, Pack = 1 )]
// Cur Size 21 bytes
@@ -32,7 +136,7 @@ namespace BrewMonster.Scripts.Task
public char m_uState; // Task state
public uint m_ulTaskTime; // Timestamp
public ushort m_uCapTaskId; // Captain task ID
public uint m_ulTemplAddr; // Template address
public uint m_ulTemplAddr; // Template address -> In C++ this is a pointer, here we use uint to store the ID of the template
public uint m_ulCapTemplAddr; // Captain task template address
};
@@ -180,34 +284,34 @@ namespace BrewMonster.Scripts.Task
// }
// bool HasParent() const { return m_ParentIndex != 0xff; }
// bool HasChildren() const { return m_ChildIndex != 0xff; }
// bool IsValid(unsigned char uIndex, unsigned char uMaxCount) const
// {
// if (m_ParentIndex != 0xff)
// {
// if (m_ParentIndex >= uIndex || m_ParentIndex >= uMaxCount)
// return false;
// }
//
// if (m_PrevSblIndex != 0xff)
// {
// if (m_PrevSblIndex >= uIndex || m_PrevSblIndex >= uMaxCount)
// return false;
// }
//
// if (m_NextSblIndex != 0xff)
// {
// if (m_NextSblIndex <= uIndex || m_NextSblIndex >= uMaxCount)
// return false;
// }
//
// if (m_ChildIndex != 0xff)
// {
// if (m_ChildIndex <= uIndex || m_ChildIndex >= uMaxCount)
// return false;
// }
//
// return true;
// }
public bool IsValid(char uIndex, char uMaxCount)
{
if (m_ParentIndex != 0xff)
{
if (m_ParentIndex >= uIndex || m_ParentIndex >= uMaxCount)
return false;
}
if (m_PrevSblIndex != 0xff)
{
if (m_PrevSblIndex >= uIndex || m_PrevSblIndex >= uMaxCount)
return false;
}
if (m_NextSblIndex != 0xff)
{
if (m_NextSblIndex <= uIndex || m_NextSblIndex >= uMaxCount)
return false;
}
if (m_ChildIndex != 0xff)
{
if (m_ChildIndex <= uIndex || m_ChildIndex >= uMaxCount)
return false;
}
return true;
}
};
public class ActiveTaskList
@@ -309,7 +413,17 @@ namespace BrewMonster.Scripts.Task
}
// void UpdateTaskMask(unsigned long& ulMask) const;
// void UpdateUsedCount();
public void UpdateUsedCount()
{
m_uUsedCount = 0;
for (int i = 0; i < m_uTaskCount; i++)
{
ATaskTempl pTempl = m_TaskEntries[i].GetTempl();
if (pTempl == null) continue;
if (pTempl.m_pParent != null) continue;
m_uUsedCount += pTempl.m_uDepth;
}
}
void RealignTask(ActiveTaskEntry pEntry, byte uReserve)
{
// TODO: implement RealignTask logic
@@ -431,7 +545,7 @@ namespace BrewMonster.Scripts.Task
ATaskTempl pTempl = pEntry.GetTempl();
// ȥõƷ
#if _TASK_CLIENT
#if !_TASK_CLIENT
if (bRemoveItem && pTempl != null)
{
if (bRemoveAcquired || pTempl.m_FixedData.m_bClearAcquired) pTempl.RemoveAcquiredItem(pTask, bClearTask, false);
@@ -505,13 +619,23 @@ namespace BrewMonster.Scripts.Task
//
// return NULL;
// }
// void RemoveAll()
// {
// unsigned short ver = m_Version;
// memset(this, 0, sizeof(*this));
// m_Version = ver;
// }
// bool IsValid() const { return m_uTaskCount <= TASK_ACTIVE_LIST_MAX_LEN; }
public void RemoveAll()
{
ushort version = m_Version; // Preserve the version
Array.Clear(header, 0, header.Length); // Clear the header array
m_Version = version; // Restore the version
m_uTaskCount = 0; // Reset task count
m_uUsedCount = 0; // Reset used count
m_uTopShowTaskCount = 0; // Reset top show task count
m_uTopHideTaskCount = 0; // Reset top hide task count
m_uTitleTaskCount = 0; // Reset title task count
for (int i = 0; i < m_TaskEntries.Length; i++) // Clear all task entries
{
m_TaskEntries[i] = null;
}
}
public bool IsValid() { return m_uTaskCount <= TaskInterfaceConstants.TASK_ACTIVE_LIST_MAX_LEN; }
// bool IsTimeMarkUpdate() const { return (m_uListState & TLIST_STATE_UPDATE_TIME_MARK) != 0; }
// void SetTimeMarkUpdate() { m_uListState |= TLIST_STATE_UPDATE_TIME_MARK; }
// void ClearTimeMarkUpdate() { m_uListState &= ~TLIST_STATE_UPDATE_TIME_MARK; }
@@ -40,11 +40,16 @@ namespace BrewMonster.Scripts.Task
if (ulRet != 0u) goto ret_here;
}
// else if (pList->GetEntry(m_ID)) // English: Already has the same task
else if (pTask.HasTask(m_FixedData.m_ID))
else if (pList.GetEntry(m_FixedData.m_ID) != null)
{
ulRet = (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_SAME_TASK;
goto ret_here;
}
/*else if (pTask.HasTask(m_FixedData.m_ID))
{
ulRet = (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_SAME_TASK;
goto ret_here;
}*/
// Ƿ // English: Is task forbidden
if (pTask.CheckTaskForbid(m_FixedData.m_ID))
@@ -58,7 +63,7 @@ namespace BrewMonster.Scripts.Task
{
for (byte i = 0; i < pList.m_uTaskCount; i++)
{
var CurEntry = pList.m_TaskEntries[i];
ActiveTaskEntry CurEntry = pList.m_TaskEntries[i];
if (CurEntry == null) continue;
ATaskTempl pTempl = CurEntry.GetTempl();
@@ -267,8 +272,12 @@ namespace BrewMonster.Scripts.Task
ret_here:
// TODO: pTask.GetPlayerId() not available in managed interface; use 0
string log = $"CheckPrerequisite: ret = {ulRet}";
CECTaskInterface.WriteLog(0, (int)m_FixedData.m_ID, 1, log);
// Only log failures to reduce noise
if (ulRet != 0)
{
string log = $"CheckPrerequisite Task {m_FixedData.m_ID}: FAIL code {ulRet}";
CECTaskInterface.WriteLog(0, (int)m_FixedData.m_ID, 1, log);
}
return ulRet;
}
@@ -789,7 +798,7 @@ namespace BrewMonster.Scripts.Task
// return 0u;
var m_bHidden = m_FixedData.m_bHidden;
var m_bDisplayInTitleTaskUI = m_FixedData.m_bHidden;
var m_bDisplayInTitleTaskUI = m_FixedData.m_bDisplayInTitleTaskUI;
var m_ID = m_FixedData.m_ID;
@@ -819,7 +828,14 @@ namespace BrewMonster.Scripts.Task
// 检查交付所需道具容量合法性 // English: Check deliverable item capacity
public uint CheckGivenItems(TaskInterface pTask)
{
// TODO: Use m_FixedData.m_ulGivenItems, m_ulGivenCmnCount, m_ulGivenTskCount and pTask.CanDeliver* API when fields confirmed
if (m_FixedData.m_ulGivenItems != 0)
{
if (!pTask.IsDeliverLegal()) return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_GIVEN_ITEM;
if (m_FixedData.m_ulGivenCmnCount != 0 && !pTask.CanDeliverCommonItem(m_FixedData.m_ulGivenCmnCount)
|| m_FixedData.m_ulGivenTskCount != 0 && !pTask.CanDeliverTaskItem(m_FixedData.m_ulGivenTskCount))
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_GIVEN_ITEM;
}
return 0u;
}
@@ -827,7 +843,13 @@ namespace BrewMonster.Scripts.Task
// 检查任务可接时间表 // English: Check task timetable window
public uint CheckTimetable(uint ulCurTime)
{
// TODO: Implement judge_time_date against m_FixedData.m_tmStart/m_tmEnd/m_tmType
if (m_FixedData.m_ulTimetable == 0) return 0;
// TODO: Implement judge_time_date function to properly check time windows
// C++ logic: if ANY timetable entry matches current time, return 0; else return TASK_PREREQU_FAIL_WRONG_TIME
// For now, since judge_time_date is not implemented, we allow the task to pass
// This is a temporary workaround - proper implementation should check each timetable entry
// WARNING: This may allow tasks to show when they shouldn't, but prevents blocking valid tasks
return 0u;
}
@@ -835,23 +857,119 @@ namespace BrewMonster.Scripts.Task
// 检查任务发放频率限制(日/周/月/年) // English: Check deliver frequency limits (day/week/month/year)
public uint CheckDeliverTime(TaskInterface pTask, uint ulCurTime)
{
// TODO: Implement with FinishedTimeList/FinishedCntList and timezone bias when types are available
return 0u;
// C++: if (m_lAvailFrequency == enumTAFNormal) return 0;
if (m_FixedData.m_lAvailFrequency == (int)TaskAwardFreq.enumTAFNormal)
return 0u;
// Basic implementation: Check if task was never completed
// If task was never completed (Search returns 0), allow it
// TODO: Full implementation should also check time periods (daily/weekly/monthly/yearly)
// and compare last completion time with current time
byte[] finishedTimeListBuf = pTask.GetFinishedTimeList();
if (finishedTimeListBuf == null || finishedTimeListBuf.Length == 0)
{
// No finished time list, task was never completed, allow it
return 0u;
}
TaskFinishTimeList pTimeList = new TaskFinishTimeList();
pTimeList.ReadFromBuffer(finishedTimeListBuf);
// Check if list is full
if (pTimeList.m_uCount >= TaskInterfaceConstants.TASK_FINISH_TIME_MAX_LEN)
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_FULL;
// Search for task completion time
uint ulTaskTime = pTimeList.Search(m_FixedData.m_ID);
// If task was never completed (Search returns 0), allow it
if (ulTaskTime == 0)
return 0u;
// Task was completed - TODO: Check if within same period based on frequency
// For now, return error to prevent showing tasks that were already completed
// This is a temporary fix - proper implementation should check time periods
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_WRONG_TIME;
}
// inline unsigned long ATaskTempl::CheckFnshLst(TaskInterface* pTask, unsigned long ulCurTime) const
// 检查完成与失败记录是否允许重复领取 // English: Check finished/failed list for redo permissions
public uint CheckFnshLst(TaskInterface pTask, uint ulCurTime)
{
// TODO: Implement using FinishedTaskList and m_FixedData.m_bCanRedo/m_bCanRedoAfterFailure
// Get top task ID - finished task list stores top-level task IDs
// 获取顶层任务ID - 已完成任务列表存储的是顶层任务ID
ATaskTempl pTopTempl = GetTopTask();
uint taskIdToCheck = pTopTempl != null ? pTopTempl.m_FixedData.m_ID : m_FixedData.m_ID;
// Use top task's redo flags
// 使用顶层任务的重做标志
bool bCanRedo = pTopTempl != null ? pTopTempl.m_FixedData.m_bCanRedo : m_FixedData.m_bCanRedo;
bool bCanRedoAfterFailure = pTopTempl != null ? pTopTempl.m_FixedData.m_bCanRedoAfterFailure : m_FixedData.m_bCanRedoAfterFailure;
// If both redo flags are true, task can always be redone, skip check
// 如果两个重做标志都为true,任务总是可以重做,跳过检查
if (bCanRedo && bCanRedoAfterFailure)
return 0u;
FinishedTaskList pFinished = (FinishedTaskList)pTask.GetFinishedTaskList();
int nRet = pFinished.SearchTask(taskIdToCheck);
// nRet: -1 = not found, 0 = successfully completed, 1 = failed
// 成功完成不能接任务,或失败后不能重新接任务
// If successfully completed and can't redo, or failed and can't redo after failure
if ((nRet == 0 && !bCanRedo) || (nRet == 1 && !bCanRedoAfterFailure))
{
// Debug: Log why task is blocked
string taskName = GetTaskName(pTopTempl ?? this);
UnityEngine.Debug.Log($"[CheckFnshLst] Task {taskIdToCheck} '{taskName}' blocked: nRet={nRet}, bCanRedo={bCanRedo}, bCanRedoAfterFailure={bCanRedoAfterFailure}");
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_CANT_REDO;
}
return 0u;
}
// Helper to get task name for debugging
private string GetTaskName(ATaskTempl pTempl)
{
if (pTempl == null || pTempl.m_FixedData.m_szName == null)
return "Unknown";
try
{
return ModelRenderer.Scripts.Common.ByteToStringUtils.UshortArrayToUnicodeString(pTempl.m_FixedData.m_szName);
}
catch
{
return "Error";
}
}
// inline unsigned long ATaskTempl::CheckDeliverCount(TaskInterface* pTask) const
// 检查周期内角色/账号次数限制 // English: Check period deliver counts for role/account
public uint CheckDeliverCount(TaskInterface pTask)
{
// TODO: Implement with FinishedCountList/FinishedTaskList based on account/role limits
if (m_FixedData.m_bAccountTaskLimit && m_FixedData.m_lPeriodLimit != 0)
{
if (pTask.IsAtCrossServer())
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_CROSSSERVER_NO_ACOUNT_LIMIT;
byte[] finishedCntListBuf = pTask.GetFinishedCntList();
TaskFinishCountList pFnshList = new TaskFinishCountList();
pFnshList.ReadFromBytes(finishedCntListBuf);
uint ulTemp = 0;
uint nRet = pFnshList.Search(m_FixedData.m_ID, ref ulTemp);
if ((uint)nRet >= m_FixedData.m_lPeriodLimit)
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_MAX_ACC_CNT;
}
else if (m_FixedData.m_bRoleTaskLimit && m_FixedData.m_lPeriodLimit != 0)
{
FinishedTaskList pFnshList = (FinishedTaskList)pTask.GetFinishedTaskList();
long finish_count = pFnshList.SearchTaskFinishCount(m_FixedData.m_ID);
if (finish_count >= m_FixedData.m_lPeriodLimit)
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_MAX_ROLE_CNT;
}
return 0u;
}
@@ -951,8 +1069,32 @@ namespace BrewMonster.Scripts.Task
// 前置道具检查(任一/全部) // English: Prerequisite item check (any/ALL)
public uint CheckItems(TaskInterface pTask)
{
// TODO: Implement using m_FixedData.m_ulPremItems, m_bPremItemsAnyOne, m_PremItems[]
return 0u;
uint i = 0;
uint ret = m_FixedData.m_bPremItemsAnyOne ? (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_NO_ITEM : 0;
for (; i < m_FixedData.m_ulPremItems; i++)
{
ITEM_WANTED wi = m_FixedData.m_PremItems[i];
if (m_FixedData.m_bPremItemsAnyOne)
{
if (_get_item_count(pTask, wi.m_ulItemTemplId, wi.m_bCommonItem) >= wi.m_ulItemNum)
{
ret = 0;
break;
}
}
else
{
if (_get_item_count(pTask, wi.m_ulItemTemplId, wi.m_bCommonItem) < wi.m_ulItemNum)
{
ret = (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_NO_ITEM;
break;
}
}
}
return ret;
}
// inline unsigned long ATaskTempl::CheckFaction(TaskInterface* pTask) const
@@ -1020,22 +1162,78 @@ namespace BrewMonster.Scripts.Task
// 前置任务 // English: Previous tasks
public uint CheckPreTask(TaskInterface pTask)
{
// TODO: Implement using FinishedTaskList and m_FixedData.m_ulPremise_Tasks[*]
return 0u;
uint i;
FinishedTaskList pFinished = (FinishedTaskList)pTask.GetFinishedTaskList();
uint iPremTaskFinishedCount = 0;
for (i = 0; i < m_FixedData.m_ulPremise_Task_Count; i++)
{
if (m_FixedData.m_ulPremise_Task_Least_Num == 0)
{
if (pFinished.SearchTask(m_FixedData.m_ulPremise_Tasks[i]) != 0)
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_PREV_TASK;
}
else if (pFinished.SearchTask(m_FixedData.m_ulPremise_Tasks[i]) == 0)
{
iPremTaskFinishedCount++;
}
}
return m_FixedData.m_ulPremise_Task_Least_Num != 0 ?
(iPremTaskFinishedCount < m_FixedData.m_ulPremise_Task_Least_Num ? (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_PREV_TASK : 0) : 0;
}
// (No inline in provided snippet) 互斥任务 // English: Mutex task
public uint CheckMutexTask(TaskInterface pTask, uint ulCurTime)
{
// TODO: Implement when mutex task data is available
return 0u;
uint i;
FinishedTaskList pFinished = (FinishedTaskList)pTask.GetFinishedTaskList();
uint iPremTaskFinishedCount = 0;
for (i = 0; i < m_FixedData.m_ulPremise_Task_Count; i++)
{
if (m_FixedData.m_ulPremise_Task_Least_Num == 0)
{
if (pFinished.SearchTask(m_FixedData.m_ulPremise_Tasks[i]) != 0)
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_PREV_TASK;
}
else if (pFinished.SearchTask(m_FixedData.m_ulPremise_Tasks[i]) == 0)
{
iPremTaskFinishedCount++;
}
}
return m_FixedData.m_ulPremise_Task_Least_Num != 0 ? (iPremTaskFinishedCount < m_FixedData.m_ulPremise_Task_Least_Num ?
(uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_PREV_TASK : 0) : 0;
}
// inline unsigned long ATaskTempl::CheckInZone(TaskInterface* pTask) const
// 区域检查 // English: In-zone check
public uint CheckInZone(TaskInterface pTask)
{
// TODO: Implement worldId + region bounding box check using m_FixedData.m_ulDelvWorld and m_pDelvRegion
if (m_FixedData.m_bDelvInZone)
{
float[] pos = new float[3];
uint ulWorldId = (uint)pTask.GetPos(pos);
/* if (ulWorldId != m_ulDelvWorld ||
!is_in_zone(
m_DelvMinVert,
m_DelvMaxVert,
pos))
return TASK_PREREQU_FAIL_NOT_IN_ZONE;*/
if(ulWorldId != m_FixedData.m_ulDelvWorld)
return (uint) TaskInterfaceConstants.TASK_PREREQU_FAIL_NOT_IN_ZONE;
for (uint i=0; i < m_FixedData.m_ulDelvRegionCnt; i++)
{
Task_Region t = m_FixedData.m_pDelvRegion[i];
if(is_in_zone(t.zvMin,t.zvMax,pos))
return 0;
}
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_NOT_IN_ZONE;
}
return 0u;
}
@@ -1043,7 +1241,11 @@ namespace BrewMonster.Scripts.Task
// 组队接任务要求 // English: Team-task requirements
public uint CheckTeamTask(TaskInterface pTask)
{
// TODO: Implement full team captain and member checks per HasAllTeamMemsWanted
// if (m_FixedData.m_bTeamwork && m_FixedData.m_bRcvByTeam) // ӽ
// {
// if (!pTask.IsCaptain()) return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_NOT_CAPTAIN;
// return HasAllTeamMemsWanted(pTask, true);
// }
return 0u;
}
@@ -1072,7 +1274,28 @@ namespace BrewMonster.Scripts.Task
// 结婚任务条件 // English: Marriage task requirements
public uint CheckMarriage(TaskInterface pTask)
{
// TODO: Implement two-person team with opposite gender per original logic if APIs exist
//TODO:
/*if (m_FixedData.m_bMarriage)
{
if (pTask.IsAtCrossServer())
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_CROSSSERVER_NO_MARRIAGE;
if (pTask.IsMarried())
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_ILLEGAL_MEM;
if (!pTask.IsInTeam())
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_ILLEGAL_MEM;
if (pTask.GetTeamMemberNum() != 2)
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_ILLEGAL_MEM;
task_team_member_info m1, m2;
pTask.GetTeamMemberInfo(0, &m1);
pTask.GetTeamMemberInfo(1, &m2);
if (m1.m_bMale == m2.m_bMale)
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_ILLEGAL_MEM;
}*/
return 0u;
}
@@ -1081,6 +1304,17 @@ namespace BrewMonster.Scripts.Task
public uint CheckLivingSkill(TaskInterface pTask)
{
// TODO: Loop m_FixedData.m_lSkillLev[MAX_LIVING_SKILLS] with skill ids and pTask.HasLivingSkill/GetLivingSkillLevel
// unsigned long i;
//
// for (i = 0; i < MAX_LIVING_SKILLS; i++)
// {
// if (m_lSkillLev[i] == 0)
// continue;
//
// if (!pTask.HasLivingSkill(_living_skill_ids[i])
// || pTask->GetLivingSkillLevel(_living_skill_ids[i]) < m_lSkillLev[i])
// return TASK_PREREQU_FAIL_LIVING_SKILL;
// }
return 0u;
}
@@ -1237,7 +1471,30 @@ namespace BrewMonster.Scripts.Task
// 称号检查 // English: Title check
public uint CheckTitle(TaskInterface pTask)
{
// TODO: Implement using m_FixedData.m_iPremTitleNumTotal/m_iPremTitleNumRequired and award title arrays
if (m_FixedData.m_iPremTitleNumTotal != 0) {
int iNumRequired = (int)m_FixedData.m_iPremTitleNumTotal;
if (m_FixedData.m_iPremTitleNumRequired > 0 && m_FixedData.m_iPremTitleNumRequired < m_FixedData.m_iPremTitleNumTotal)
iNumRequired = (int)m_FixedData.m_iPremTitleNumRequired;
int iTitleCount = 0;
for (uint i = 0; i < m_FixedData.m_iPremTitleNumTotal; ++i) {
if (pTask.HaveGotTitle((uint)m_FixedData.m_PremTitles[i]))
iTitleCount++;
}
if (iTitleCount < iNumRequired)
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_TITLE;
}
if (m_Award_S.m_ulTitleNum != 0) {
for (uint i = 0; i < m_Award_S.m_ulTitleNum; ++i) {
if (pTask.HaveGotTitle(m_Award_S.m_pTitleAward[i].m_ulTitleID))
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_TITLE;
}
}
if (m_Award_F.m_ulTitleNum != 0) {
for (uint i = 0; i < m_Award_F.m_ulTitleNum; ++i) {
if (pTask.HaveGotTitle(m_Award_F.m_pTitleAward[i].m_ulTitleID))
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_TITLE;
}
}
return 0u;
}
@@ -1245,7 +1502,13 @@ namespace BrewMonster.Scripts.Task
// 历史阶段 // English: History stage
public uint CheckHistoryStage(TaskInterface pTask)
{
// TODO: Implement using pTask.GetCurHistoryStageIndex() and m_FixedData.m_iPremHistoryStageIndex[2]
int index = pTask.GetCurHistoryStageIndex();
if (m_FixedData.m_iPremHistoryStageIndex[0] != 0 && (index <=0 || index < m_FixedData.m_iPremHistoryStageIndex[0]))
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_HISTORYSTAGE;
if (m_FixedData.m_iPremHistoryStageIndex[1] != 0 && (index <=0 || index > m_FixedData.m_iPremHistoryStageIndex[1]))
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_HISTORYSTAGE;
return 0u;
}
@@ -1253,7 +1516,11 @@ namespace BrewMonster.Scripts.Task
// 将星卡收集数量 // English: General card collection count
public uint CheckCardCollection(TaskInterface pTask)
{
// TODO: Implement using pTask.GetObtainedGeneralCardCount() and m_FixedData.m_ulPremGeneralCardCount
uint count = pTask.GetObtainedGeneralCardCount();
if (m_FixedData.m_ulPremGeneralCardCount != 0 && (count < m_FixedData.m_ulPremGeneralCardCount))
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_CARD_COUNT_COLLECTION;
return 0u;
}
@@ -1261,7 +1528,10 @@ namespace BrewMonster.Scripts.Task
// 指定品级将星卡数量 // English: Specific rank general card count
public uint CheckCardRankCount(TaskInterface pTask)
{
// TODO: Implement using pTask.GetObtainedGeneralCardCountByRank(rank) and m_FixedData fields
if (m_FixedData.m_iPremGeneralCardRank >= 0 && m_FixedData.m_ulPremGeneralCardRankCount != 0) {
uint count = pTask.GetObtainedGeneralCardCountByRank(m_FixedData.m_iPremGeneralCardRank);
if (count < m_FixedData.m_ulPremGeneralCardRankCount) return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_CARD_COUNT_RANK;
}
return 0u;
}
@@ -200,18 +200,18 @@ namespace BrewMonster.Scripts.Task
}
struct tm {
int tm_sec; /* seconds after the minute [0-60] */
int tm_min; /* minutes after the hour [0-59] */
int tm_hour; /* hours since midnight [0-23] */
int tm_mday; /* day of the month [1-31] */
int tm_mon; /* months since January [0-11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday [0-6] */
int tm_yday; /* days since January 1 [0-365] */
int tm_isdst; /* Daylight Savings Time flag */
long tm_gmtoff; /* offset from UTC in seconds */
byte tm_zone; /* timezone abbreviation */
public struct tm {
public int tm_sec; /* seconds after the minute [0-60] */
public int tm_min; /* minutes after the hour [0-59] */
public int tm_hour; /* hours since midnight [0-23] */
public int tm_mday; /* day of the month [1-31] */
public int tm_mon; /* months since January [0-11] */
public int tm_year; /* years since 1900 */
public int tm_wday; /* days since Sunday [0-6] */
public int tm_yday; /* days since January 1 [0-365] */
public int tm_isdst; /* Daylight Savings Time flag */
public long tm_gmtoff; /* offset from UTC in seconds */
public byte tm_zone; /* timezone abbreviation */
};
[StructLayout(LayoutKind.Explicit)]
@@ -356,6 +356,12 @@ namespace BrewMonster.Scripts.Task
header.m_Reserved = m_Buf[3];
return header;
}
set
{
Array.Copy(BitConverter.GetBytes(value.m_uTaskCount), 0, m_Buf, 0, 2);
m_Buf[2] = value.m_Version;
m_Buf[3] = value.m_Reserved;
}
}
@@ -389,45 +395,68 @@ namespace BrewMonster.Scripts.Task
return true;
}
public int GetTaskPos(ulong ulID)
public int GetTaskPos(uint ulID)
{
// TODO: Implement logic to get task position
//throw new NotImplementedException();
ushort uTaskCount = m_FnshHeader.m_uTaskCount;
if (uTaskCount == 0) return -1;
return 0;
FnshedTaskEntry[] taskList = m_aTaskList;
if (uTaskCount == 1)
{
if (ulID == taskList[0].m_uTaskId)
return 0;
else
return -1;
}
uint ulStart = 0;
uint ulEnd = (uint)(uTaskCount - 1);
while (ulStart + 1 < ulEnd)
{
uint ulMid = (ulStart + ulEnd) >> 1;
if (ulID == taskList[ulMid].m_uTaskId)
return (int)ulMid;
else if (ulID < taskList[ulMid].m_uTaskId)
ulEnd = ulMid;
else
ulStart = ulMid;
}
if (taskList[ulStart].m_uTaskId == ulID)
return (int)ulStart;
if (taskList[ulEnd].m_uTaskId == ulID)
return (int)ulEnd;
return -1;
}
public void AddOneTask(ulong ulID, bool bSuccess)
public void AddOneTask(uint ulID, bool bSuccess)
{
// TODO: Implement logic to add one task
// TODO: Implement logic to add one task (for future use)
//throw new NotImplementedException();
}
public void RemoveTask(ulong ulID)
public void RemoveTask(uint ulID)
{
// TODO: Implement logic to remove a task
// TODO: Implement logic to remove a task (for future use)
//throw new NotImplementedException();
// unsigned long ulPos = GetTaskPos(ulID);
// if (static_cast<int>(ulPos) < 0) return;
//
// m_FnshHeader.m_uTaskCount--;
//
// if (m_FnshHeader.m_uTaskCount <= ulPos)
// return;
//
// memmove(
// &m_aTaskList[ulPos],
// &m_aTaskList[ulPos+1],
// (m_FnshHeader.m_uTaskCount-ulPos) * sizeof(FnshedTaskEntry));
}
public int SearchTask(ulong ulID)
// SearchTask returns:
// -1 = task not found (never completed)
// 0 = task successfully completed
// 1 = task failed
public int SearchTask(uint ulID)
{
// TODO: Implement logic to search for a task
//throw new NotImplementedException();
return 0;
int nPos = GetTaskPos(ulID);
if (nPos < 0) return -1;
FnshedTaskEntry[] taskList = m_aTaskList;
return taskList[nPos].m_Mask;
}
public byte SearchTaskFinishCount(ulong ulID)
@@ -461,4 +490,91 @@ namespace BrewMonster.Scripts.Task
return m_FnshHeader.m_uTaskCount <= TaskInterfaceConstants.TASK_FINISHED_LIST_MAX_LEN;
}
}
public struct FnshedTaskEntryOld
{
public ushort m_uTaskId;
};
[ StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct FnshedTaskListOld
{
// union
// {
// struct
// {
// FnshedTaskListHeader m_FnshHeader;
// FnshedTaskEntryOld m_aTaskList[TASK_FINISHED_LIST_MAX_LEN];
// };
// unsigned char m_Buf[TASK_FINISHED_LIST_BUF_SIZE_OLD];
// };
public FnshedTaskListHeader m_FnshHeader
{
get
{
var FnshHeader = new FnshedTaskListHeader
{
m_uTaskCount = BitConverter.ToUInt16(m_Buf, 0),
m_Version = m_Buf[2],
m_Reserved = m_Buf[3]
};
return FnshHeader;
}
set {
Array.Copy(BitConverter.GetBytes(value.m_uTaskCount), 0, m_Buf, 0, 2);
m_Buf[2] = value.m_Version;
m_Buf[3] = value.m_Reserved;
}
}
// [MarshalAs(UnmanagedType.ByValArray, SizeConst = TaskInterfaceConstants.TASK_FINISHED_LIST_MAX_LEN)]
public FnshedTaskEntryOld[] m_aTaskList
{
get
{
FnshedTaskEntryOld[] taskList = new FnshedTaskEntryOld[TaskInterfaceConstants.TASK_FINISHED_LIST_MAX_LEN];
for (int i=0; i < m_FnshHeader.m_uTaskCount; i++)
{
int size = Marshal.SizeOf<FnshedTaskEntryOld>();
int startIndex = i * size + 4; // 4 bytes for m_FnshHeader
int endIndex = startIndex + size;
taskList[i] = GPDataTypeHelper.FromBytes<FnshedTaskEntryOld>(m_Buf[startIndex..endIndex]);
}
return taskList;
}
set
{
for (int i=0; i < value.Length && i < TaskInterfaceConstants.TASK_FINISHED_LIST_MAX_LEN; i++)
{
int size = Marshal.SizeOf<FnshedTaskEntryOld>();
int startIndex = i * size + 4; // 4 bytes for m_FnshHeader
byte[] entryBytes = GPDataTypeHelper.ToBytes(value[i]);
Array.Copy(entryBytes, 0, m_Buf, startIndex, size);
}
}
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = TaskInterfaceConstants.TASK_FINISHED_LIST_BUF_SIZE_OLD)]
public byte[] m_Buf;
public FnshedTaskListOld(byte[] data)
{
m_Buf = new byte[TaskInterfaceConstants.TASK_FINISHED_LIST_BUF_SIZE];
Array.Copy(data, m_Buf, TaskInterfaceConstants.TASK_FINISHED_LIST_BUF_SIZE_OLD);
}
};
[ StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct svr_task_dyn_time_mark
{
public task_notify_base baseObj;
public uint time_mark;
public ushort version;
}
}
+846 -20
View File
@@ -356,6 +356,76 @@ namespace BrewMonster.Scripts.Task
public float x;
public float y;
public float z;
// Property to access as array (union equivalent)
// 作为数组访问的属性(联合体等价) // Property to access as array (union equivalent)
public float[] v
{
get
{
return new float[] { x, y, z };
}
}
// Indexer for array-like access
// 数组式访问的索引器 // Indexer for array-like access
public float this[int index]
{
get
{
switch (index)
{
case 0: return x;
case 1: return y;
case 2: return z;
default: throw new IndexOutOfRangeException();
}
}
set
{
switch (index)
{
case 0: x = value; break;
case 1: y = value; break;
case 2: z = value; break;
default: throw new IndexOutOfRangeException();
}
}
}
public static bool operator ==(ZONE_VERT left, ZONE_VERT right)
{
return (left.x == right.x && left.y == right.y && left.z == right.z);
}
public static bool operator !=(ZONE_VERT left, ZONE_VERT right)
{
return !(left == right);
}
public override bool Equals(object obj)
{
if (obj is ZONE_VERT)
{
return this == (ZONE_VERT)obj;
}
return false;
}
public override int GetHashCode()
{
return x.GetHashCode() ^ y.GetHashCode() ^ z.GetHashCode();
}
public bool great_than(float[] v)
{
return x >= v[0] && y >= v[1] && z >= v[2];
}
public bool less_than(float[] v)
{
return x <= v[0] && y <= v[1] && z <= v[2];
}
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
@@ -1190,8 +1260,6 @@ namespace BrewMonster.Scripts.Task
enumTaskTimeWeek,
enumTaskTimeDay
};
/// <summary>
/// Completion Method
/// </summary>
@@ -1306,6 +1374,22 @@ namespace BrewMonster.Scripts.Task
public ushort m_uCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = TaskInterfaceConstants.TASK_FINISH_TIME_MAX_LEN)]
public TaskFinishTimeEntry[] m_aList;
public TaskFinishTimeList(byte[] data)
{
int offset = 0;
m_uCount = BitConverter.ToUInt16(data, offset);
offset += sizeof(ushort);
m_aList = new TaskFinishTimeEntry[TaskInterfaceConstants.TASK_FINISH_TIME_MAX_LEN];
for (int i = 0; i < TaskInterfaceConstants.TASK_FINISH_TIME_MAX_LEN; i++)
{
m_aList[i].m_uTaskId = BitConverter.ToUInt16(data, offset);
offset += sizeof(ushort);
m_aList[i].m_ulTimeMark = BitConverter.ToUInt32(data, offset);
offset += sizeof(uint);
}
}
public void ReadFromBuffer(byte[] data)
{
@@ -1350,7 +1434,7 @@ namespace BrewMonster.Scripts.Task
m_uCount++;
}
void RemoveAll()
public void RemoveAll()
{
m_uCount = 0;
for (int i = 0; i < TaskInterfaceConstants.TASK_FINISH_TIME_MAX_LEN; i++)
@@ -1359,11 +1443,45 @@ namespace BrewMonster.Scripts.Task
m_aList[i].m_ulTimeMark = 0;
}
}
bool IsValid() { return m_uCount <= TaskInterfaceConstants.TASK_FINISH_TIME_MAX_LEN; }
public bool IsValid() { return m_uCount <= TaskInterfaceConstants.TASK_FINISH_TIME_MAX_LEN; }
};
/*public bool judge_time_date(task_tm tmStart, task_tm tmEnd, uint ulCurTime, task_tm_type tm_type)
{
tm _time, _time_tomorrow;
uint ulTimeTomorrow;
bool last_day;
#if _TASK_CLIENT
ulCurTime -= (uint)(TaskInterface.GetTimeZoneBias() * 60);
if ((long)(ulCurTime) < 0)
ulCurTime = 0;
_time = DateTimeOffset.FromUnixTimeSeconds(ulCurTime).UtcDateTime;
_time_tomorrow = _time.AddDays(1);
#else
_time = *localtime((time_t*)&ulCurTime);
ulTimeTomorrow = ulCurTime + 24 * 3600;
_time_tomorrow = *localtime((time_t*)&ulTimeTomorrow);
#endif
last_day = (_time.tm_mon != _time_tomorrow.tm_mon);
switch (tm_type)
{
case enumTaskTimeDate:
return tmStart->before(&_time) && tmEnd->after(&_time);
case enumTaskTimeMonth:
return tmStart->before_per_month(&_time, last_day) && tmEnd->after_per_month(&_time, last_day);
case enumTaskTimeWeek:
return tmStart->before_per_week(&_time) && tmEnd->after_per_week(&_time);
case enumTaskTimeDay:
return tmStart->before_per_day(&_time) && tmEnd->after_per_day(&_time);
}
return false;
}*/
/// <summary>
/// 任务模板类 // Task Template Class
/// include
@@ -1372,6 +1490,11 @@ namespace BrewMonster.Scripts.Task
{
public ATaskTemplFixedData m_FixedData;
public bool is_in_zone(ZONE_VERT _min, ZONE_VERT _max, float[] pos)
{
return _min.less_than(pos) && _max.great_than(pos);
}
//Hierarchy
public ATaskTempl m_pParent;
public ATaskTempl m_pPrevSibling;
@@ -1403,19 +1526,23 @@ namespace BrewMonster.Scripts.Task
/* ÈÎÎñ½áÊøºóµÄ½±Àø */
uint m_ulAwardType_S;
uint m_ulAwardType_F;
uint m_ulAwardType_S => m_FixedData.m_ulAwardType_S;
uint m_ulAwardType_F => m_FixedData.m_ulAwardType_F;
// ʱ¼äÏÞÖÆ
uint m_ulTimeLimit;
uint m_ulTimeLimit => m_FixedData.m_ulTimeLimit;
/* ÆÕͨºÍ°´Ã¿¸ö·½Ê½ */
AWARD_DATA m_Award_S = new AWARD_DATA(); /* ³É¹¦ */
AWARD_DATA m_Award_F = new AWARD_DATA(); /* ʧ°Ü */
AWARD_DATA m_Award_S => m_FixedData.m_Award_S; /* ³É¹¦ */
AWARD_DATA m_Award_F => m_FixedData.m_Award_F; /* ʧ°Ü */
/* ʱ¼ä±ÈÀý·½Ê½ */
AWARD_RATIO_SCALE m_AwByRatio_S;
AWARD_RATIO_SCALE m_AwByRatio_F;
AWARD_RATIO_SCALE m_AwByRatio_S => m_FixedData.m_AwByRatio_S;
AWARD_RATIO_SCALE m_AwByRatio_F => m_FixedData.m_AwByRatio_F;
/* °´»ñµÃÎï±ÈÀý·½Ê½ */
AWARD_ITEMS_SCALE m_AwByItems_S;
AWARD_ITEMS_SCALE m_AwByItems_F;
AWARD_ITEMS_SCALE m_AwByItems_S => m_FixedData.m_AwByItems_S;
AWARD_ITEMS_SCALE m_AwByItems_F => m_FixedData.m_AwByItems_F;
uint g_ulNewCount = 0;
public bool LoadFromBinFile(FileStream fp)
{
LoadBinary(fp);
@@ -1628,12 +1755,13 @@ namespace BrewMonster.Scripts.Task
LoadTributeBin(fp);
pointerLog += $" After LoadTributeBin : {fp.Position}\n";
// TODO: Check task type consistency
# if _TASK_CLIENT
CheckMask();
#else
SyncTaskType();
#endif
// Check task type consistency
# if _TASK_CLIENT
SyncTaskType();
#else
CheckMask();
#endif
// namechar code = (namechar)m_ID;
@@ -4349,5 +4477,703 @@ namespace BrewMonster.Scripts.Task
return true;
}
public uint GetType() { return m_FixedData.m_ulType; }
void Init()
{
m_FixedData.m_bCanRedo = true;
m_FixedData.m_bParentAlsoFail = true;
m_FixedData.m_bCanGiveUp = true;
m_FixedData.m_bCanRedoAfterFailure = true;
m_FixedData.m_bClearAcquired = true;
m_FixedData.m_enumMethod = (uint)TaskCompletionMethod.enumTMNone;
m_FixedData.m_enumFinishType = (uint)TaskFinishType.enumTFTDirect;
m_FixedData.m_bShowByDeposit = true;
m_FixedData.m_bShowByGender = true;
m_FixedData.m_bShowByItems = true;
m_FixedData.m_bShowByFactionContrib = true;
m_FixedData.m_bShowByNeedRecordTasksNum = true;
m_FixedData.m_bShowByLev = true;
m_FixedData.m_bShowByOccup = true;
m_FixedData.m_bShowByPreTask = true;
m_FixedData.m_bShowByRepu = true;
m_FixedData.m_bShowByTeam = true;
m_FixedData.m_bShowByFaction = true;
m_FixedData.m_bShowByPeriod = true;
m_FixedData.m_bShowPrompt = true;
m_FixedData.m_bShowByCharTime = true;
m_FixedData.m_bShowByRMB = true;
m_FixedData.m_bShowBySpouse = true;
m_FixedData.m_bShowByWeddingOwner = true;
m_FixedData.m_bShowByKing = true;
m_FixedData.m_bShowByNotInTeam = true;
m_FixedData.m_bShowByGeneralCard = true;
m_FixedData.m_ulDelvWorld = 1;
m_FixedData.m_ulTransWldId = 1;
m_FixedData.m_ulReachSiteId = 1;
m_FixedData.m_lPeriodLimit = 1;
m_FixedData.m_bCanSeekOut = false;
m_FixedData.m_bShowDirection = true;
m_FixedData.m_bDeliverySkill = false; // verison 77
m_FixedData.m_iDeliveredSkillID = 0;
m_FixedData.m_iDeliveredSkillLevel = 0;
m_FixedData.m_bShowGfxFinished = false; // version 78
m_FixedData.m_bChangePQRanking = false; // version 79. Ĭ PQ ı
m_FixedData.m_bDisplayInExclusiveUI = false;
m_FixedData.m_bReadyToNotifyServer = false;
m_FixedData.m_bDistinguishedOcc = false;
m_FixedData.m_bUsedInTokenShop = false;
m_FixedData.m_iPremise_FactionRole = 6;
m_FixedData.m_TreasureStartZone.x = 0;
m_FixedData.m_TreasureStartZone.y = 0;
m_FixedData.m_TreasureStartZone.z = 0;
m_FixedData.m_ucZonesNumX = 1;
m_FixedData.m_ucZonesNumZ = 1;
m_FixedData.m_ucZoneSide = 10;
m_FixedData.m_ucPremiseTransformedForm = 0xFF;
m_FixedData.m_bShowByForce = true;
m_FixedData.m_bShowByForceContribution = true;
m_FixedData.m_bShowByForceReputation = true;
m_FixedData.m_bShowByForceExp = true;
m_FixedData.m_bShowByForceSP = true;
m_FixedData.m_bShowByForceActivityLevel = true;
m_FixedData.m_bShowByReincarnation = true;
m_FixedData.m_bShowByRealmLevel = true;
m_FixedData.m_bShowByGeneralCardRank = true;
m_FixedData.m_bShowByHistoryStage = true;
m_FixedData.m_iPremForceActivityLevel = -1;
m_FixedData.m_iPremGeneralCardRank = -1;
}
void UnmarshalSpecialAwardData(byte[] data, ref long p)
{
// const char* p = pData;
// m_ulSpecialAward = *(long*)p;
// p += sizeof(long);
m_FixedData.m_ulSpecialAward = GPDataTypeHelper.FromBytes<uint>(data, ref p);
// return p - pData;
}
void UnmarshalKillMonster(byte[] data, ref long p)
// int ATaskTempl::UnmarshalKillMonster(const char* pData)
{
// const char* p = pData;
m_FixedData.m_ulMonsterWanted = GPDataTypeHelper.FromBytes<byte>(data, ref p);
#if !TASK_TEMPL_EDITOR
if (m_FixedData.m_ulMonsterWanted != 0)
{
m_FixedData.m_MonsterWanted = new MONSTER_WANTED[m_FixedData.m_ulMonsterWanted];
g_ulNewCount++;
}
#endif
int sz = (int)(m_FixedData.m_ulMonsterWanted * Marshal.SizeOf<MONSTER_WANTED>());
if (sz != 0)
{
// memcpy(m_FixedData.m_MonsterWanted, p, sz);
for( int i = 0; i < m_FixedData.m_MonsterWanted.Length; i++)
{
m_FixedData.m_MonsterWanted[i] = GPDataTypeHelper.FromBytes<MONSTER_WANTED>(data, ref p);
}
}
// return p - pData;
}
void UnmarshalCollectItems(byte[] data, ref long p)
// int ATaskTempl::UnmarshalCollectItems(const char* pData)
{
// const char* p = pData;
m_FixedData.m_ulItemsWanted = GPDataTypeHelper.FromBytes<byte>(data, ref p);
if (m_FixedData.m_ulItemsWanted != 0)
{
#if !TASK_TEMPL_EDITOR
m_FixedData.m_ItemsWanted = new ITEM_WANTED[m_FixedData.m_ulItemsWanted];
g_ulNewCount++;
#endif
int sz = (int)(m_FixedData.m_ulItemsWanted * Marshal.SizeOf<ITEM_WANTED>());
// memcpy(m_FixedData.m_ItemsWanted, p, sz);
// p += sz;
for( int i = 0; i < m_FixedData.m_ItemsWanted.Length; i++)
{
m_FixedData.m_ItemsWanted[i] = GPDataTypeHelper.FromBytes<ITEM_WANTED>(data, ref p);
}
}
m_FixedData.m_ulGoldWanted = GPDataTypeHelper.FromBytes<uint>(data, ref p);
m_FixedData.m_iFactionContribWanted = GPDataTypeHelper.FromBytes<int>(data, ref p);
m_FixedData.m_iFactionExpContribWanted = GPDataTypeHelper.FromBytes<int>(data, ref p);
// return p - pData;
}
void unmarshal_str(byte[] data, ushort[] s, ref long p)
// inline int unmarshal_str(const char* data, task_char*& s)
{
// const char* p = data;
int len = GPDataTypeHelper.FromBytes<int>( data, ref p);
s = new ushort[len + 1];
g_ulNewCount++;
s[len] = 0;
if (len != 0)
{
// len *= sizeof(task_char);
// memcpy(s, p, len);
// p += len;
for (int i = 0; i < len; i++)
{
s[i] = GPDataTypeHelper.FromBytes<ushort>(data, ref p);
}
}
// return p - data;
}
void unmarshal_option(ref talk_proc.option opt, byte[] data, ref long p)
// int unmarshal_option(talk_proc::option* opt, const char* data)
{
// const char* p = data;
opt.id = GPDataTypeHelper.FromBytes<uint>( data, ref p);
opt.param = GPDataTypeHelper.FromBytes<uint>(data, ref p);
uint sz = GPDataTypeHelper.FromBytes<uint>(data, ref p);
if (sz != 0)
{
// memcpy(opt->text, p, sz);
// p += sz;
opt.text = new ushort[sz / sizeof(ushort)];
for (int i = 0; i < opt.text.Length; i++)
{
opt.text[i] = GPDataTypeHelper.FromBytes<ushort>(data, ref p);
}
}
// return p - data;
}
void unmarshal_window(ref talk_proc.window win, byte[] data, ref long p)
// int unmarshal_window(talk_proc::window* win, const char* data)
{
// const char* p = data;
win.id = GPDataTypeHelper.FromBytes<byte>(data, ref p);
win.id_parent = GPDataTypeHelper.FromBytes<byte>(data, ref p);
win.talk_text_len = GPDataTypeHelper.FromBytes<int>(data, ref p);
if (win.talk_text_len != 0)
{
// C++
// win->talk_text = new namechar[win->talk_text_len];
// size_t sz = sizeof(namechar) * win->talk_text_len;
// memcpy(win->talk_text, p, sz);
// p += sz;
// g_ulNewCount++;
win.talk_text = new ushort[win.talk_text_len];
for (int i = 0; i < win.talk_text_len; i++)
{
win.talk_text[i] = GPDataTypeHelper.FromBytes<ushort>(data, ref p);
}
g_ulNewCount++;
}
win.num_option = GPDataTypeHelper.FromBytes<byte>( data, ref p);
if (win.num_option != 0)
{
// C++
// win->options = new talk_proc::option[win->num_option];
// memset(win->options, 0, sizeof(talk_proc::option) * win->num_option);
// g_ulNewCount++;
//
// for (int i = 0; i < win->num_option; i++)
// p += unmarshal_option(&win->options[i], p);
win.options = new talk_proc.option[win.num_option];
g_ulNewCount++;
for (int i = 0; i < win.num_option; i++)
{
win.options[i] = new talk_proc.option();
unmarshal_option(ref win.options[i], data, ref p);
}
}
// return p - data;
}
void unmarshal_talk_proc(ref talk_proc talk, byte[] data, ref long p)
// int unmarshal_talk_proc(talk_proc* talk, const char* data)
{
// const char* p = data;
int sz = GPDataTypeHelper.FromBytes<int>(data, ref p);
if (sz != 0)
{
// memcpy(talk->text, p, sz);
// p += sz;
for( int i = 0; i < talk.text.Length; i++)
{
talk.text[i] = GPDataTypeHelper.FromBytes<ushort>(data, ref p);
}
}
talk.num_window = GPDataTypeHelper.FromBytes<byte>(data, ref p);
if (talk.num_window != 0)
{
// C++
// talk->windows = new talk_proc::window[talk->num_window];
// memset(talk->windows, 0, sizeof(talk_proc::window) * talk->num_window);
// g_ulNewCount++;
//
// for (int i = 0; i < talk->num_window; i++)
// p += unmarshal_window(&talk->windows[i], p);
talk.windows = new talk_proc.window[talk.num_window];
g_ulNewCount++;
for (int i = 0; i < talk.num_window; i++)
{
talk.windows[i] = new talk_proc.window();
unmarshal_window(ref talk.windows[i], data, ref p);
}
}
// return p - data;
}
public void UnmarshalDynTask(byte[] pData, ref long p)
{
Init();
// const char* p = pData;
// int p = 0;
uint token_mask1, token_mask2;
token_mask1 = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
token_mask2 = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
int token_count = 0;
// dyn type
m_FixedData.m_DynTaskType = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
// top task
if (m_pParent == null)
{
switch (m_FixedData.m_DynTaskType)
{
case (byte)DynTaskType.enumDTTSpecialAward:
case (byte)DynTaskType.enumDTTGiftCard:
UnmarshalSpecialAwardData(pData, ref p);
break;
default:
break;
}
}
// id
m_FixedData.m_ID = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
// name
// char len = *p; p++;
// len *= sizeof(task_char);
// memcpy(m_szName, p, len);
// p += len;
byte nameLen = pData[p++];
// int nameByteLen = nameLen * sizeof(ushort);
m_FixedData.m_szName = new ushort[nameLen];
for (int i = 0; i < nameLen; i++)
{
m_FixedData.m_szName[i] = GPDataTypeHelper.FromBytes<ushort>(pData, ref p);
}
// choose one
m_FixedData.m_bChooseOne = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// rand one
m_FixedData.m_bRandOne = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// in order
m_FixedData.m_bExeChildInOrder = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// parent fail
m_FixedData.m_bParentAlsoFail = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// parent succ
m_FixedData.m_bParentAlsoSucc = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// give up
m_FixedData.m_bCanGiveUp = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// redo
m_FixedData.m_bCanRedo = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// redo after fail
m_FixedData.m_bCanRedoAfterFailure = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// clear as give up
m_FixedData.m_bClearAsGiveUp = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// record
m_FixedData.m_bNeedRecord = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// die
m_FixedData.m_bFailAsPlayerDie = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// auto deliver
m_FixedData.m_bAutoDeliver = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// death trig
m_FixedData.m_bDeathTrig = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// clear acquired
m_FixedData.m_bClearAcquired = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// spouse
m_FixedData.m_bPremise_Spouse = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// teamwork
m_FixedData.m_bTeamwork = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// direction
m_FixedData.m_bShowDirection = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
// level
m_FixedData.m_ulPremise_Lev_Min = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
m_FixedData.m_ulPremise_Lev_Max = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
// 0: time limit
if (((1 << token_count++) & token_mask1) != 0)
{
m_FixedData.m_ulTimeLimit = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
}
// 1: reputation
if (((1 << token_count++) & token_mask1) != 0)
{
m_FixedData.m_lPremise_Reputation = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
}
// 2: period
if (((1 << token_count++) & token_mask1) != 0)
{
m_FixedData.m_ulPremise_Period = GPDataTypeHelper.FromBytes<ushort>(pData, ref p);
}
// 3: prem items
if (((1 << token_count++) & token_mask1) != 0)
{
m_FixedData.m_ulPremItems = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
#if !TASK_TEMPL_EDITOR
m_FixedData.m_PremItems = new ITEM_WANTED[m_FixedData.m_ulPremItems];
g_ulNewCount++;
#endif
int sz = (int)(m_FixedData.m_ulPremItems * Marshal.SizeOf<ITEM_WANTED>());
// memcpy(m_PremItems, p, sz);
Array.Copy( pData, p, m_FixedData.m_PremItems, 0, sz );
p += sz;
}
// 4: delv in zone
if (((1 << token_count++) & token_mask1) != 0)
{
m_FixedData.m_bDelvInZone = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
m_FixedData.m_ulDelvWorld = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
m_FixedData.m_ulDelvRegionCnt = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
for (int i=0; i< m_FixedData.m_ulDelvRegionCnt; i++)
{
m_FixedData.m_pDelvRegion[i] = GPDataTypeHelper.FromBytes<Task_Region>(pData, ref p);
}
/* m_DelvMinVert = *(ZONE_VERT*)p;
p += sizeof(ZONE_VERT);
m_DelvMaxVert = *(ZONE_VERT*)p;
p += sizeof(ZONE_VERT);*/
}
// 5: trans to
if (((1 << token_count++) & token_mask1) != 0)
{
m_FixedData.m_bTransTo = GPDataTypeHelper.FromBytes<byte>(pData, ref p) != 0;
m_FixedData.m_ulTransWldId = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
m_FixedData.m_TransPt = GPDataTypeHelper.FromBytes<ZONE_VERT>(pData, ref p);
}
// 6: given items
if (((1 << token_count++) & token_mask1) != 0)
{
m_FixedData.m_ulGivenItems =GPDataTypeHelper.FromBytes<byte>(pData, ref p);
m_FixedData.m_ulGivenCmnCount = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
m_FixedData.m_ulGivenTskCount = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
#if !TASK_TEMPL_EDITOR
m_FixedData.m_GivenItems = new ITEM_WANTED[m_FixedData.m_ulGivenItems];
g_ulNewCount++;
#endif
int sz = (int)(m_FixedData.m_ulGivenItems * Marshal.SizeOf<ITEM_WANTED>());
// memcpy(m_GivenItems, p, sz);
Array.Copy( pData, p, m_FixedData.m_GivenItems, 0, sz );
p += sz;
}
// 7: deposit
if (((1 << token_count++) & token_mask1) != 0)
{
m_FixedData.m_ulPremise_Deposit = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
}
// 8: pre task
if (((1 << token_count++) & token_mask1) != 0)
{
m_FixedData.m_ulPremise_Task_Count = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
m_FixedData.m_ulPremise_Task_Least_Num = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
// size_t sz = sizeof(long) * m_ulPremise_Task_Count;
// memcpy(m_ulPremise_Tasks, p, sz);
for (int i = 0; i < m_FixedData.m_ulPremise_Task_Count; i++)
{
m_FixedData.m_ulPremise_Tasks[i] = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
}
}
// 9: gender
if (((1 << token_count++) & token_mask1) != 0)
{
m_FixedData.m_ulGender = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
}
// 10: occupation
if (((1 << token_count++) & token_mask1) != 0)
{
m_FixedData.m_ulOccupations = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
// size_t sz = sizeof(long) * m_ulOccupations;
// memcpy(m_Occupations, p, sz);
for (int i = 0; i < m_FixedData.m_ulOccupations; i++)
{
m_FixedData.m_Occupations[i] = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
}
}
// 11: mutex task
if (((1 << token_count++) & token_mask1) != 0)
{
m_FixedData.m_ulMutexTaskCount = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
// size_t sz = sizeof(long) * m_ulMutexTaskCount;
// memcpy(m_ulMutexTasks, p, sz);
for( int i = 0; i < m_FixedData.m_ulMutexTaskCount; i++ )
{
m_FixedData.m_ulMutexTasks[i] = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
}
}
// 12: time table
if (((1 << token_count++) & token_mask1) != 0)
{
m_FixedData.m_ulTimetable = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
#if !TASK_TEMPL_EDITOR
m_FixedData.m_tmStart = new task_tm[m_FixedData.m_ulTimetable];
g_ulNewCount++;
m_FixedData.m_tmEnd = new task_tm[m_FixedData.m_ulTimetable];
g_ulNewCount++;
#endif
int sz=0;
sz = (int)(sizeof(byte) * m_FixedData.m_ulTimetable);
// memcpy(m_tmType, p, sz);
Array.Copy( pData, p, m_FixedData.m_tmType, 0, sz );
p += sz;
sz = (int)(Marshal.SizeOf<task_tm>() * m_FixedData.m_ulTimetable);
// memcpy(m_tmStart, p, sz);
// p += sz;
for (int i = 0; i < m_FixedData.m_ulTimetable; i++)
{
m_FixedData.m_tmStart[i] = GPDataTypeHelper.FromBytes<task_tm>(pData, ref p);
}
// memcpy(m_tmEnd, p, sz);
// p += sz;
for (int i = 0; i < m_FixedData.m_ulTimetable; i++)
{
m_FixedData.m_tmEnd[i] = GPDataTypeHelper.FromBytes<task_tm>(pData, ref p);
}
}
// method
m_FixedData.m_enumMethod = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
switch (m_FixedData.m_enumMethod)
{
case (uint)TaskCompletionMethod.enumTMKillNumMonster:
// p += UnmarshalKillMonster(p);
UnmarshalKillMonster( pData, ref p);
break;
case (uint)TaskCompletionMethod.enumTMCollectNumArticle:
// p += UnmarshalCollectItems(p);
UnmarshalCollectItems(data:pData, ref p);
break;
case (uint)TaskCompletionMethod.enumTMReachSite:
m_FixedData.m_ulReachSiteId = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
// C++
// memcpy(m_pReachSite, p, sizeof(Task_Region)*m_ulReachSiteCnt);
// p += sizeof(Task_Region)*m_ulReachSiteCnt;
// Use m_ulReachSiteCnt instead of m_ulReachSiteId for count
// Default to 1 if not set (matching C++ behavior)
uint reachSiteCnt = m_FixedData.m_ulReachSiteCnt;
if (reachSiteCnt == 0) reachSiteCnt = 1;
// Allocate array if needed
if (m_FixedData.m_pReachSite == null || m_FixedData.m_pReachSite.Length < reachSiteCnt)
{
m_FixedData.m_pReachSite = new Task_Region[reachSiteCnt];
}
for (int i = 0; i < reachSiteCnt; i++)
{
m_FixedData.m_pReachSite[i] = GPDataTypeHelper.FromBytes<Task_Region>(pData, ref p);
}
// memcpy(&m_ReachSiteMax, p, sizeof(ZONE_VERT));
// p += sizeof(ZONE_VERT);
break;
case (uint)TaskCompletionMethod.enumTMLeaveSite:
m_FixedData.m_ulLeaveSiteId = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
// memcpy(m_pLeaveSite, p, sizeof(Task_Region)*m_ulLeaveSiteCnt);
// p += sizeof(ZONE_VERT);
// Use m_ulLeaveSiteCnt instead of m_ulLeaveSiteId for count
// Default to 1 if not set (matching C++ behavior)
uint leaveSiteCnt = m_FixedData.m_ulLeaveSiteCnt;
if (leaveSiteCnt == 0) leaveSiteCnt = 1;
// Allocate array if needed
if (m_FixedData.m_pLeaveSite == null || m_FixedData.m_pLeaveSite.Length < leaveSiteCnt)
{
m_FixedData.m_pLeaveSite = new Task_Region[leaveSiteCnt];
}
// Read the items
long pBefore = p;
for (int i = 0; i < leaveSiteCnt; i++)
{
m_FixedData.m_pLeaveSite[i] = GPDataTypeHelper.FromBytes<Task_Region>(pData, ref p);
}
// C++ bug: advance by sizeof(ZONE_VERT) instead of sizeof(Task_Region)*m_ulLeaveSiteCnt
// So we need to adjust p to match the C++ behavior
long bytesShouldAdvance = Marshal.SizeOf<ZONE_VERT>();
p = pBefore + bytesShouldAdvance;
// memcpy(&m_LeaveSiteMax, p, sizeof(ZONE_VERT));
// p += sizeof(ZONE_VERT);
break;
case (uint)TaskCompletionMethod.enumTMWaitTime:
m_FixedData.m_ulWaitTime = GPDataTypeHelper.FromBytes<uint>(pData, ref p);
break;
}
// finish type
m_FixedData.m_enumFinishType = GPDataTypeHelper.FromBytes<byte>(pData, ref p);
// award
// C++: p += m_Award_S->UnmarshalBasicData(p);
// Need to pass array starting from current position p
byte[] awardData = new byte[pData.Length - (int)p];
Array.Copy(pData, (int)p, awardData, 0, awardData.Length);
p += m_Award_S.UnmarshalBasicData(awardData);
// talks
unmarshal_str(pData, m_pwstrDescript, ref p);
unmarshal_str(pData, m_pwstrOkText, ref p);
unmarshal_str(pData, m_pwstrNoText, ref p);
unmarshal_talk_proc(ref m_DelvTaskTalk, pData, ref p);
unmarshal_talk_proc(ref m_UnqualifiedTalk, pData, ref p);
unmarshal_talk_proc(ref m_DelvItemTalk, pData, ref p);
unmarshal_talk_proc(ref m_ExeTalk, pData, ref p);
unmarshal_talk_proc(ref m_AwardTalk, pData, ref p);
#if !_TASK_CLIENT
CheckMask();
#else
SyncTaskType();
#endif
m_nSubCount = GPDataTypeHelper.FromBytes<int>( pData, ref p);
for (int i = 0; i < m_nSubCount; i++)
{
// ATaskTempl* pSub = new ATaskTempl;
// g_ulNewCount++;
// AddSubTaskTempl(pSub);
// p += pSub->UnmarshalDynTask(p);
ATaskTempl pSub = new ATaskTempl();
g_ulNewCount++;
AddSubTaskTempl( pSub );
pSub.UnmarshalDynTask( pData , ref p);
}
SynchID();
if (m_pParent == null) CheckDepth();
// return p - pData;
}
public bool IsAutoDeliver()
{
return m_FixedData.m_bDeathTrig || m_FixedData.m_bAutoDeliver;
}
}
}
+91 -13
View File
@@ -1,9 +1,10 @@
using BrewMonster;
using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
using BrewMonster.Scripts.Task.UI;
using BrewMonster.Scripts.UI;
using ModelRenderer.Scripts.Common;
using PerfectWorld.Scripts.Task;
using UnityEngine;
@@ -13,13 +14,41 @@ namespace BrewMonster.Scripts.Task
{
public class TaskTest : MonoSingleton<TaskTest>
{
public GameObject m_pTaskDlg;
public static ATaskTemplMan m_pTaskMan; // use static to store loaded data across instances
public bool WasLoadTaskData = false;
public bool AutoLoadData;
[Header("Test Dlg Award Options")]
[SerializeField] private uint _awardItemID = 1001;
[SerializeField] private KeyCode _awardkey = KeyCode.A;
private CancellationTokenSource _cts;
protected override void Awake()
{
base.Awake();
_cts = new CancellationTokenSource();
}
private void OnValidate()
{
WasLoadTaskData = m_pTaskMan != null && m_pTaskMan.TaskLoadedCount > 0;
if (!WasLoadTaskData && AutoLoadData)
{
LoadTaskData();
}
}
private void OnDestroy()
{
_cts?.Cancel();
_cts?.Dispose();
}
private void OnApplicationQuit()
{
_cts?.Cancel();
}
private void Update()
@@ -27,24 +56,73 @@ namespace BrewMonster.Scripts.Task
#if UNITY_EDITOR
if (Input.GetKeyDown(KeyCode.Q))
{
m_pTaskDlg.SetActive(!m_pTaskDlg.activeInHierarchy);
var dlgTaskGO = CECUIManager.Instance.GetInGameUIMan().GetDialog("Win_Task");
var dlgTask = (dlgTaskGO) as DlgTask;
if (dlgTask && !dlgTask.gameObject.activeInHierarchy)
{
dlgTask.Show(true);
}
else
{
dlgTask.Show(false);
}
}
if (Input.GetKeyDown(_awardkey))
{
var pShow1 = CECUIManager.Instance.GetInGameUIMan().GetDialog("Win_Award");
CDlgAward pAward = (pShow1) as CDlgAward;
if (pAward && !pAward.gameObject.activeInHierarchy)
{
pAward.UpdateAwardItem((ushort)_awardItemID, true);
pAward.Show(true);
}
else
{
pAward.Show(false);
}
}
if (Input.GetKeyDown(KeyCode.E))
{
var dlg = CECUIManager.Instance.GetInGameUIMan().GetDialog("Win_SkillSubAction");
if (dlg && !dlg.gameObject.activeInHierarchy)
{
dlg.Show(true);
}
else
{
dlg.Show(false);
}
}
#endif
}
[ContextMenu("Show Task Name")]
public void ShowTaskName()
{
// [ContextMenu("Test Npc Service Log")]
// public void LogNpcService()
// {
// // Debug.Log($" idFun = {(ExpTypes.SERVICE_TYPE)(-2147483641)} | idService = {44515} ");
// }
var text01 = ByteToStringUtils.UshortArrayToUnicodeString(m_pTaskMan
.GetTaskTemplByID((uint)TaskTemplConstants.TASK_SPECIAL_AWARD[0]).m_FixedData.m_szName);
var text02 = ByteToStringUtils.UshortArrayToUnicodeString(m_pTaskMan
.GetTaskTemplByID((uint)TaskTemplConstants.TASK_SPECIAL_AWARD[1]).m_FixedData.m_szName);
Debug.Log($" Task Name 01: {text01} \n Task Name 02: {text02}");
// [ContextMenu("Show Task Name")]
// public void ShowTaskName()
// {
//
// var text01 = ByteToStringUtils.UshortArrayToUnicodeString(m_pTaskMan
// .GetTaskTemplByID((uint)TaskTemplConstants.TASK_SPECIAL_AWARD[0]).m_FixedData.m_szName);
// var text02 = ByteToStringUtils.UshortArrayToUnicodeString(m_pTaskMan
// .GetTaskTemplByID((uint)TaskTemplConstants.TASK_SPECIAL_AWARD[1]).m_FixedData.m_szName);
// Debug.Log($" Task Name 01: {text01} \n Task Name 02: {text02}");
// }
[ContextMenu("Size Of ZONE_VERT")]
public void SizeOfTest()
{
int size = Marshal.SizeOf(typeof(ZONE_VERT));
BMLogger.Log("Size of ATaskTemplFixedData: " + size);
}
[ContextMenu("Load Data")]
void LoadTaskData()
async void LoadTaskData()
{
if (m_pTaskMan == null)
{
@@ -52,7 +130,7 @@ namespace BrewMonster.Scripts.Task
}
string path = Path.Combine(Application.streamingAssetsPath, "data/tasks.data");
WasLoadTaskData = m_pTaskMan.LoadTasksFromPack(path, true);
WasLoadTaskData = await m_pTaskMan.LoadTasksFromPack(path, true,(x)=>{},_cts.Token);
}
[ContextMenu("Test Size")]
+98 -15
View File
@@ -5,8 +5,10 @@ using BrewMonster.Managers;
using BrewMonster.Scripts.Managers;
using BrewMonster.Network;
using BrewMonster.Scripts.Task;
using BrewMonster.Scripts.UI;
using BrewMonster.UI;
using CSNetwork.GPDataType;
using ModelRenderer.Scripts.Common;
using ModelRenderer.Scripts.GameData;
using NUnit.Framework;
using PerfectWorld.Scripts.Task;
@@ -132,8 +134,6 @@ namespace BrewMonster.Scripts.Task.UI
// [中文] 任务跟踪计时器
// [English] Task trace counter
private CECCounter m_TaskTraceCounter = new (); // CECCounter -> object placeholder
public static DlgTask Instance;
#region Unity METHODS
@@ -151,7 +151,7 @@ namespace BrewMonster.Scripts.Task.UI
m_pBtn_HaveQuest.onClick.AddListener(OnCommand_havequest);
m_pBtn_SearchQuest.onClick.AddListener(OnCommand_searchquest);
m_pBtn_Abandon.onClick.AddListener(OnCommand_abandon);
OnInitDialog();
}
@@ -160,12 +160,7 @@ namespace BrewMonster.Scripts.Task.UI
{
Tick();
}
private void OnDestroy()
{
Instance = null;
}
#endregion
#region PUBLIC METHODS
@@ -202,7 +197,49 @@ namespace BrewMonster.Scripts.Task.UI
}
public void OnCommand_showtrace(string szCommand) {}
public void OnCommand_focus(string szCommand) {}
public void OnCommand_abandon(string szCommand) {}
public void OnCommand_abandon()
{
// [中文] 放弃任务:发送通知到服务器 // [English] Abandon task: send notification to server
// Get the currently selected task from the tree view
var pTree = m_pTv_Quest;
var pSelectedItem = pTree?.GetSelectedItem();
if (pSelectedItem == null)
{
BMLogger.LogWarning("Cannot abandon task: No task is currently selected");
return;
}
// Get the task ID from the selected item
uint selectedTaskId = pTree.GetItemData(pSelectedItem);
if (selectedTaskId == 0)
{
BMLogger.LogWarning("Cannot abandon task: Selected item has no task ID");
return;
}
CECTaskInterface pTask = GetHostPlayer()?.GetTaskInterface();
if (pTask == null)
{
BMLogger.LogError("Cannot abandon task: TaskInterface is null");
return;
}
// Get the task template to find the top-level task
ATaskTemplMan pMan = EC_Game.GetTaskTemplateMan();
ATaskTempl pTempl = pMan?.GetTaskTemplByID(selectedTaskId);
if (pTempl == null)
{
BMLogger.LogError($"Cannot abandon task: Task template {selectedTaskId} not found");
return;
}
// Get the top-level task ID (tasks can have subtasks)
ATaskTempl pTopTask = pTempl.GetTopTask();
uint topTaskId = pTopTask != null ? pTopTask.GetID() : selectedTaskId;
// Send notification to server to abandon the currently selected task
TaskClient._notify_svr(pTask, (byte)ClientNotificationConstants.TASK_CLT_NOTIFY_CHECK_GIVEUP, (ushort)topTaskId);
}
public void OnCommand_CANCEL(string szCommand) {}
public void OnCommand_TreasureMap(string szCommand) {}
public void OnCommand_FinishTask(string szCommand) {}
@@ -1110,22 +1147,41 @@ namespace BrewMonster.Scripts.Task.UI
if (edm != null && edm.essence_id_data_type_map.TryGetValue(id, out var dtype)
&& dtype == DATA_TYPE.DT_MONSTER_ESSENCE
&& edm.essence_id_data_map.TryGetValue(id, out var obj)
&& obj is MONSTER_ESSENCE me)
&& obj is MONSTER_ESSENCE pMonster)
{
strName = ModelRenderer.Scripts.Common.ByteToStringUtils.UshortArrayToUnicodeString(me.name);
// strName = ModelRenderer.Scripts.Common.ByteToStringUtils.UshortArrayToUnicodeString(me.name);
bool bFind = false;
A3DVECTOR3 vPos = CECUIHelper.GetTaskObjectCoordinates((int)id, ref bFind);
// TODO: serialize position info if found
// ACHAR szPos[100];
// EditBoxItemBase item(enumEICoord);
// item.SetName(pMonster->name);
if (bFind)
{
// a_sprintf(szPos, _AL("%f %f %f %d"), vPos.x, vPos.y, vPos.z, id);
// item.SetInfo(szPos);
// item.SetColor(A3DCOLORRGB(0, 255, 0));
// strName = (ACHAR)AUICOMMON_ITEM_CODE_START + item.Serialize();
}
else
{
strName = ByteToStringUtils.UshortArrayToUnicodeString(pMonster.name);
}
}
// Build description for this monster requirement
// 构建该怪物需求描述
string strTemp;
string strTemp = "";
if (tsi.m_MonsterWanted[i].m_ulMonstersToKill > 0)
{
strTemp = string.Format(GetStringFromTable(7624), strName,
strTemp += Format(GetStringFromTable(7624), strName,
tsi.m_MonsterWanted[i].m_ulMonstersKilled, tsi.m_MonsterWanted[i].m_ulMonstersToKill);
}
else
{
strTemp = string.Format(GetStringFromTable(256), tsi.m_MonsterWanted[i].m_ulMonstersKilled);
strTemp += Format(GetStringFromTable(256), tsi.m_MonsterWanted[i].m_ulMonstersKilled);
}
// Prefix label for first/next item
@@ -1406,6 +1462,33 @@ namespace BrewMonster.Scripts.Task.UI
// // whether the task can be traced
// bool IsTaskTraceable(int idTask);
string Format( string formatStr, params object[] args )
{
var newStr = "";
int argIndex = 0;
for (int i = 0; i < formatStr.Length; i++)
{
if (formatStr[i] == '%' && i + 1 < formatStr.Length)
{
char formatSpec = formatStr[i + 1];
i++; // Skip the format specifier character
if (argIndex < args.Length)
{
newStr += args[argIndex].ToString();
argIndex++;
}
}
else
{
newStr += formatStr[i];
}
}
return newStr;
}
#endregion
}
@@ -0,0 +1,132 @@
using BrewMonster.Assets.PerfectWorld.Scripts.UI.GamePlay;
using BrewMonster.Network;
using UnityEngine;
using UnityEngine.UI;
namespace BrewMonster.UI
{
public class EmoteWindow : AUIDialog
{
public override void Show(bool value)
{
base.Show(value);
// int i, j;
// char szName[40];
// string strFile;
// CECShortcut pSCThis;
// PAUIIMAGEPICTURE pImage;
// PAUILABEL pLabel;
// CECGameRun pGameRun = EC_Game.GetGameRun();
// CECShortcutSet[] a_pSC =
// {
// pGameRun.GetGenCmdShortcuts(),
// pGameRun.GetTeamCmdShortcuts(),
// pGameRun.GetTradeCmdShortcuts(),
// pGameRun.GetPoseCmdShortcuts()
// };
// char *a_pszPrefix[] = { "BscCmd_", "TeamCmd_","TradeCmd_", "FaceCmd_" };
// char *a_pszTxtPrefix[] = { "Txt_BscCmd", "Txt_TeamCmd", "Txt_TradeCmd", "Txt_FaceCmd" };
// int objCount[] = { 9, 3, 3, 30 };
//
// a_LogOutput(1, "[Dat Emote] CDlgSkillSubAction::OnShowDialog");
// a_LogOutput(1, "[Dat Emote] CDlgSkillSubAction::OnShowDialog szName: %s", szName);
//
// for( i = 0; i < sizeof(a_pSC) / sizeof(CECShortcutSet *); i++ )
// {
// for( j = 0; j < objCount[i]; j++ )
// {
// sprintf(szName, "%s%02d", a_pszPrefix[i], j + 1);
// pImage = dynamic_cast<AUIImagePicture*>(GetDlgItem(szName));
//
// sprintf(szName, "%s%02d", a_pszTxtPrefix[i], j + 1);
// pLabel = dynamic_cast<AUILabel*>(GetDlgItem(szName));
//
// if( !pImage ) break;
//
// if (j < a_pSC[i]->GetShortcutNum()) {
// pSCThis = a_pSC[i]->GetShortcut(j);
// pImage->SetDataPtr(pSCThis,"ptr_CECShortcut");
//
// af_GetFileTitle(pSCThis->GetIconFile(), strFile);
// strFile.MakeLower();
// pImage->SetCover(GetGameUIMan()->m_pA2DSpriteIcons[CECGameUIMan::ICONS_ACTION],
// GetGameUIMan()->m_IconMap[CECGameUIMan::ICONS_ACTION][strFile]);
//
// pLabel->SetText(pSCThis->GetDesc());
// } else {
// pImage->Show(false);
// pLabel->Show(false);
// }
// }
// }
// ÔÚÇл»½çÃæ·ç¸ñµÄʱºò£¬´Ëʱ¿ÉÄܸ¸¶Ô»°¿òÖ¸ÕëΪ¿Õ
// if (GetParentDlgControl()) {
// SIZE size;
// size.cx = 326;
// size.cy = 720;
// size.cx = (int)(size.cx * m_pAUIManager->GetWindowScale() + 0.5f);
// size.cy = (int)(size.cy * m_pAUIManager->GetWindowScale() + 0.5f);
//
// if (!m_bSetVScroll) {
// GetParentDlgControl()->SetSubDialogOrgSize(size.cx, size.cy);
// m_bSetVScroll = true;
// }
// }
}
public int slot;
[ContextMenu("Test")]
public void OnDragClick() //PAUIDIALOG pDlgSrc, PAUIOBJECT pObjSrc, PAUIDIALOG pDlgOver, PAUIOBJECT pObjOver
{
// bool bInAutoMode = CECAutoPolicy::GetInstance().IsAutoPolicyEnabled();
// if (strstr(pDlgSrc->GetName(), "Win_Quickbar") ||
// 0 == stricmp(pDlgSrc->GetName(), "Win_SkillSubAction")) // 20140708 ÐµĶ¯×÷½çÃæ
// {
// if (bInAutoMode) return;
//todo: dummy call StartGame
// EC_Game.GetGameRun().StartGame(0, Vector3.zero);
if (EC_Game.GetGameRun().GetPoseCmdShortcuts() == null)
{
EC_Game.GetGameRun().StartGame(0, Vector3.zero);
}
CECShortcut pSC = EC_Game.GetGameRun().GetPoseCmdShortcuts().GetShortcut(slot);
// if (CDlgAutoHelp::IsAutoHelp() && strstr(pDlgSrc->GetName(), "Win_Quickbar"))
// {
// a_LogOutput(1, "[Dat Emote] Win_Quickbar");
// if (pSC->GetType() == CECShortcut::SCT_SKILL)
// {
// CECSCSkill* pSkillSC = dynamic_cast<CECSCSkill*>(pSC);
// if (pSkillSC && pSkillSC->GetSkill())
// CDlgWikiShortcut::PopSkillWiki(GetGameUIMan(), pSkillSC->GetSkill()->GetSkillID());
//
// }
// else if (pSC->GetType() == CECShortcut::SCT_ITEM)
// {
// CECSCItem* pItemSC = dynamic_cast<CECSCItem*>(pSC);
// CECIvtrItem* pItem = CECIvtrItem::CreateItem(pItemSC->GetItemTID(), 0, 1);
// if (pItem)
// {
// CDlgWikiShortcut::PopItemWiki(GetGameUIMan(), pItem);
// delete pItem;
// }
// }
// else
// {
// GetGameUIMan()->MessageBox("", GetStringFromTable(10754), MB_OK,
// A3DCOLORRGBA(255, 255, 255, 160));
// }
// }
// else
// {
if (pSC != null) // && pObjSrc->GetDataPtr("ptr_CECShortcut") == pSC
{
// a_LogOutput(1, "[Dat Emote] ptr_CECShortcut");
pSC.Execute();
}
// }
// }
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: e42ed2cbf208e60488b8bc1d63a3b1d7
@@ -110,8 +110,10 @@ namespace BrewMonster.Scripts.Task.UI
public TaskTreeViewItem GetItemByData(uint taskType)
{
if (m_aTreeViewItems == null)
{
m_aTreeViewItems = new TaskTreeViewItem[this.transform.childCount];
m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewItem>(true);
}
+22 -1
View File
@@ -35,7 +35,7 @@ namespace BrewMonster.UI
m_canvas = canvas;
}
public void Init()
public virtual void Init()
{
ImportStringTable("ingame.stf");
ImportAuiDialogStringTable("msgbox.stf");
@@ -262,6 +262,27 @@ namespace BrewMonster.UI
{
return dlg;
}
else
{
var prefab = m_dialogResouce.GetPrefabDialog(pszName);
if(prefab != null)
{
var instance = GameObject.Instantiate(prefab, m_canvas.transform);
var dialog = instance.GetComponent<AUIDialog>();
if (dialog != null)
{
dialog.SetAUIManager(this);
m_DlgName[pszName] = dialog;
return dialog;
}
}
else
{
BMLogger.LogError($" Không tìm thấy prefab chứa dialog {pszName} ");
}
}
return null;
}
}
@@ -17,6 +17,7 @@ namespace BrewMonster.UI
public virtual void Show(bool value)
{
gameObject.SetActive(value);
OnShowDialogue();
}
public void SetData(uint dwData, string strName)
@@ -98,6 +99,10 @@ namespace BrewMonster.UI
public virtual void Start()
{
}
public virtual void OnShowDialogue()
{
}
}
}
@@ -17,6 +17,7 @@ using System.Reflection;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using BrewMonster.Scripts.UI;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
@@ -1428,7 +1429,7 @@ namespace BrewMonster.UI
SetDataPtr(pTalk, "ptr_talk_proc");
if (!IsShow()) Show(true);
}
bool c(int idFunction, int iService, object pData)
{
AUIDialog pShow1 = null, pShow2 = null;
@@ -1790,7 +1791,7 @@ namespace BrewMonster.UI
return true;
}
public void OnCommand_back(string szCommand)
{
@@ -3111,6 +3112,13 @@ namespace BrewMonster.UI
{
AUIDialog pShow1 = null, pShow2 = null;
NPC_ESSENCE? pCurNPCEssence = GetGameUIMan().m_pCurNPCEssence;
// Check if the integer matches any enum value
if (Enum.IsDefined(typeof(SERVICE_TYPE), idFunction))
{
SERVICE_TYPE k = (SERVICE_TYPE)idFunction;
BMLogger.Log($" PopupCorrespondingServiceDialog: {k}");
}
if (idFunction == (int)SERVICE_TYPE.NPC_SELL || idFunction == (int)SERVICE_TYPE.NPC_BUY)
{
@@ -3208,6 +3216,7 @@ namespace BrewMonster.UI
}
else if (idFunction == (int)SERVICE_TYPE.NPC_MAKE)
{
// C++
//NPC_MAKE_SERVICE pMake = (NPC_MAKE_SERVICE)pData;
//if (pMake.produce_type == 2)
// pShow1 = m_pAUIManager.GetDialog("Win_Produce1");
@@ -3223,6 +3232,22 @@ namespace BrewMonster.UI
// GetGameUIMan().m_pDlgProduce.ClearMaterial();
//pShow2 = m_pAUIManager.GetDialog("Win_Inventory");
//GetGameUIMan().m_pDlgProduce.UpdateProduce(1, 0);
// NPC_MAKE_SERVICE pMake = (NPC_MAKE_SERVICE)pData;
// if (pMake.produce_type == 2)
// pShow1 = m_pAUIManager.GetDialog("Win_Produce1");
// else
// pShow1 = m_pAUIManager.GetDialog("Win_Produce");
// GetGameUIMan().m_pDlgProduce = (CDlgProduce*)pShow1;
// GetHostPlayer().PrepareNPCService(iService);
// pShow1.SetDataPtr(pMake, "ptr_NPC_MAKE_SERVICE");
// if (pMake.produce_type == 1 ||
// pMake.produce_type == 3 ||
// pMake.produce_type == 4 ||
// pMake.produce_type == 5)
// GetGameUIMan().m_pDlgProduce.ClearMaterial();
// pShow2 = m_pAUIManager.GetDialog("Win_Inventory");
// GetGameUIMan().m_pDlgProduce.UpdateProduce(1, 0);
}
else if (idFunction == (int)SERVICE_TYPE.NPC_DECOMPOSE)
{
@@ -3349,11 +3374,12 @@ namespace BrewMonster.UI
CECTaskInterface pTask = GetHostPlayer().GetTaskInterface();
pTask.GetAwardCandidates(opt.param, ref ad);
if (ad.m_ulCandItems > 1)
{
pShow1 = m_pAUIManager.GetDialog("Win_Award");
//CDlgAward pAward = (pShow1) as CDlgAward;
//if (pAward) pAward.UpdateAwardItem(opt.param, true);
CDlgAward pAward = (pShow1) as CDlgAward;
if (pAward) pAward.UpdateAwardItem((ushort)opt.param, true);
}
else
{
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: e3a8de291089473f9d21a99f27014a68
timeCreated: 1764934713
@@ -0,0 +1,53 @@
using UnityEngine;
using UnityEngine.UI;
namespace BrewMonster.Scripts.UI
{
public class AwardItem : MonoBehaviour
{
[SerializeField] private Image img;
[SerializeField] private Button btn;
private Vector2Int _position;
public Vector2Int Position => _position;
public void SetPositionIndex(int row, int column)
{
_position = new Vector2Int(row, column);
this.gameObject.name = "Item_" + row + "_" + column;
}
public void SetImage(Sprite sprite)
{
img.sprite = sprite;
}
public void SetText(string text)
{
// TODO: Add a Text component and set its text
}
public void SetColor(Color color)
{
// TODO : Set color to relevant UI components
}
public void SetHint(string text)
{
// TODO : Implement hint functionality
}
public void ClearCover()
{
// TODO : Implement cover clearing functionality
}
public void Show(bool show)
{
gameObject.SetActive(show);
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 9d87c7b8ac564f919171a5173812980e
timeCreated: 1764940671
@@ -0,0 +1,375 @@
using System;
using BrewMonster.Network;
using BrewMonster.Scripts.Managers;
using BrewMonster.Scripts.Task;
using BrewMonster.UI;
using PerfectWorld.Scripts.Managers;
using PerfectWorld.Scripts.Task;
using UnityEngine;
using UnityEngine.UI;
namespace BrewMonster.Scripts.UI
{
public class CDlgAward : AUIDialog
{
#region FIELDS AND PROPERTIES
private const int MIN_ROW_COUNT_TO_SHOW = 6;
[SerializeField] private Button m_pBtn_Confirm;
[SerializeField] private Vector2Int _itemSize = new Vector2Int(50, 50);
[SerializeField] private AwardItem _awardItemPrefab;
[SerializeField] private Transform _itemsParent;
[SerializeField] private Toggle[] _radioButtons;
[Header("DEBUG")]
[SerializeField] private AwardItem[] _awardItems;
bool m_bThroughNPC;
bool m_bSpendContribution;
#endregion
int _rowCount => _itemSize.x;
int _columnCount => _itemSize.y;
#region UNITY METHODS
void Awake()
{
SpawnItems();
InitRadioBtns();
m_pBtn_Confirm.onClick.AddListener(OnCommand_confirm);
}
private void InitRadioBtns()
{
for (int i = 0; i < _radioButtons.Length; i++)
{
_radioButtons[i].isOn = false;
_radioButtons[i].onValueChanged.AddListener( OnCommand_select );
}
}
private void SpawnItems()
{
for (int i = 1; i <= _rowCount; i++)
{
for (int j = 1; j <= _columnCount; j++)
{
AwardItem item = Instantiate(_awardItemPrefab ,_itemsParent);
item.SetPositionIndex(i, j);
// Positioning logic can be added here
}
}
_awardItems = new AwardItem[_rowCount];
_awardItems = GetComponentsInChildren<AwardItem>();
_awardItemPrefab.gameObject.SetActive(false);
}
#endregion
protected bool OnInitDialog()
{
m_bThroughNPC = false;
m_bSpendContribution = false;
return true;
}
public void UpdateAwardItem(ushort idTask, bool throughNPC, bool spendContribution = false)
{
AWARD_DATA ad = new AWARD_DATA();
CECTaskInterface pTask = GetHostPlayer().GetTaskInterface();
m_bThroughNPC = throughNPC;
m_bSpendContribution = spendContribution;
pTask.GetAwardCandidates(idTask, ref ad);
if (ad.m_ulCandItems > 1)
{
string szName;
string strFile = "";
string szText;
EC_IvtrItem pItem;
// AUICTranslate trans; // TODO
// int i, j, idItem, nNum;
uint idItem, nNum;
// Image pImage;
// Image pImage2;
AwardItem pImage; // Using AwardItem instead of Image
SetData(idTask, "");
// CheckRadioButton(1, 0); // TODO: maybe dont need this
m_pBtn_Confirm.gameObject.SetActive(false);
for (int i=1; i <= _rowCount; i++)
{
// sprintf(out szName, "Item_%02d01", i);
// pImage = (PAUIIMAGEPICTURE)GetDlgItem(szName);
// if (!pImage) break; // All done.
// TODO: Show/Hide radio button
// sprintf(out szName, "Rdo_Award%d", i);
// GetDlgItem(szName)->Show(false);
// _radioButtons[i-1].gameObject.SetActive(false);
GetToggleBtnAt(i).gameObject.SetActive(false);
// for (j = 1;; j++)
for (int j=1; j < _columnCount; j++)
{
// sprintf(out szName, "Item_%02d%02d", i, j);
// pImage = (PAUIIMAGEPICTURE)GetDlgItem(szName);
// if (!pImage) break; // Line done.
pImage = GetAwardItemAt(i, j);
if(!pImage) break;
if (i - 1 < (int)ad.m_ulCandItems &&
j - 1 < (int)ad.m_CandItems[i - 1].m_ulAwardItems)
{
idItem = ad.m_CandItems[i - 1].m_AwardItems[j - 1].m_ulItemTemplId;
pItem = EC_IvtrItem.CreateItem((int)idItem, 0, 1);
nNum = ad.m_CandItems[i - 1].m_AwardItems[j - 1].m_ulItemNum;
if (nNum > 1)
{
a_sprintf(out szText, _AL("%d"), nNum);
pImage.SetText(szText);
}
else
pImage.SetText(_AL(""));
pItem.GetDetailDataFromLocal();
// pImage.SetHint(trans.Translate(pItem.GetDesc())); // TODO
// af_GetFileTitle(pItem.GetIconFile(), strFile); // TODO
strFile.ToLower();
// TODO: Set the image cover here
// pImage.SetCover(GetGameUIMan().m_pA2DSpriteIcons[CECGameUIMan::ICONS_INVENTORY],
// GetGameUIMan().m_IconMap[CECGameUIMan::ICONS_INVENTORY][strFile]);
var sprite = EC_IvtrItemUtils.Instance.ResolveItemIconSprite(pItem.m_tid);
pImage.SetImage(sprite);
EC_IvtrEquip pEquip = new EC_IvtrEquip(pItem.m_tid, pItem.m_expire_date);
pImage.SetColor(
(pItem.IsEquipment() && pEquip.IsDestroying())
? new Color32(128, 128, 128, 255)
: new Color32(255, 255, 255, 255));
// delete pItem;
pItem = null;
// sprintf(out szName, "Rdo_Award%d", i);
// GetDlgItem(szName)->Show(true);
GetToggleBtnAt(i).gameObject.SetActive(true);
}
else
{
pImage.ClearCover();
pImage.SetHint(_AL(""));
pImage.SetText(_AL(""));
}
}
}
// turn off uneccessary rows
if (ad.m_ulCandItems <= MIN_ROW_COUNT_TO_SHOW)
{
// ٣ʣ
// for (i = MIN_ROW_COUNT_TO_SHOW + 1;; i++)
for (int i = MIN_ROW_COUNT_TO_SHOW + 1; i < _rowCount; i++)
{
// sprintf(out szName, "Item_%02d01", i);
// pImage = (PAUIIMAGEPICTURE)GetDlgItem(szName);
// if (!pImage) break; // All done.
pImage = GetAwardItemAt(i, i);
if (!pImage) break;
// sprintf(out szName, "Rdo_Award%d", i);
// GetDlgItem(szName)->Show(false);
GetToggleBtnAt(i).gameObject.SetActive(false);
for (int j = 1; j < _columnCount; j++)
{
// sprintf(out szName, "Item_%02d%02d", i, j);
// pImage = (PAUIIMAGEPICTURE)GetDlgItem(szName);
// if (!pImage) break;
// pImage->Show(false);
pImage = GetAwardItemAt(i, j);
pImage.Show(false);
// pImage2 = (PAUIIMAGEPICTURE)GetDlgItem(AString().Format("Img_%02d%02d", i, j));
// pImage2->Show(false);
// pImage2 = GetAwardItemAt(i, j);
}
}
// ȷϰťλãöԻС
// TODO: Thiết lập vị trí của nút xác nhận, thiết lập kích thước của hộp thoại.
// var pBtnConfirm = m_pBtn_Confirm;
// AUIObject* pImgLineMid = GetDlgItem(AString().Format("Item_%02d01", MIN_ROW_COUNT_TO_SHOW));
// AUIObject* pEdiBg = GetDlgItem("background");
// pBtnConfirm->SetPos(pBtnConfirm->GetPos(true).x,
// pImgLineMid->GetPos(true).y + pImgLineMid->GetSize().cy + 10);
// SetSize(GetSize().cx, pBtnConfirm->GetPos(true).y + pBtnConfirm->GetSize().cy + 30);
// pEdiBg->SetSize(pEdiBg->GetSize().cx, GetSize().cy - pEdiBg->GetPos(true).y - 25);
}
else
{
// ʾȫ / Show all rows
for (int i = MIN_ROW_COUNT_TO_SHOW + 1; i < _rowCount; i++)
{
// sprintf(out szName, "Item_%02d01", i);
// pImage = (PAUIIMAGEPICTURE)GetDlgItem(szName);
// if (!pImage) break; // All done.
pImage = GetAwardItemAt(i, 1);
if (!pImage) break; // All done.
if (ad.m_ulCandItems >= i)
{
// sprintf(out szName, "Rdo_Award%d", i);
// GetDlgItem(szName)->Show(true);
GetToggleBtnAt(i).gameObject.SetActive(true);
}
for (int j = 1; j < _columnCount; j++)
{
// sprintf(out szName, "Item_%02d%02d", i, j);
// pImage = (PAUIIMAGEPICTURE)GetDlgItem(szName);
// if (!pImage) break;
pImage = GetAwardItemAt(i, j);
if (!pImage) break;
pImage.Show(true);
// pImage2 = (PAUIIMAGEPICTURE)GetDlgItem(AString().Format("Img_%02d%02d", i, j));
// pImage2->Show(true);
// TODO: Handle pImage2 if needed
// AwardItem pImage2 = GetAwardItemAt(i, j);
// pImage2?.Show(true);
}
}
// ȷϰťλãöԻС
// TODO: Thiết lập vị trí của nút xác nhận, thiết lập kích thước của hộp thoại.
// AUIObject* pBtnConfirm = GetDlgItem("Btn_Confirm");
// AUIObject* pImgLineLast = GetDlgItem(AString().Format("Item_%02d01", i - 1));
// AUIObject* pEdiBg = GetDlgItem("background");
// pBtnConfirm->SetPos(pBtnConfirm->GetPos(true).x,
// pImgLineLast->GetPos(true).y + pImgLineLast->GetSize().cy + 10);
// SetSize(GetSize().cx, pBtnConfirm->GetPos(true).y + pBtnConfirm->GetSize().cy + 30);
// pEdiBg->SetSize(pEdiBg->GetSize().cx, GetSize().cy - pEdiBg->GetPos(true).y - 25);
}
}
}
void sprintf(out string szName, string format, int i)
{
// Convert C-style format specifiers to C# format
// %02d -> zero-padded 2-digit integer (D2 format)
// %d -> regular integer
string csharpFormat = format
.Replace("%02d", "{0:D2}")
.Replace("%d", "{0}");
szName = string.Format(csharpFormat, i);
}
void sprintf(out string szName, string format, int i, int j)
{
// Convert C-style format specifiers to C# format for two parameters
// %02d -> zero-padded 2-digit integer (D2 format)
// %d -> regular integer
// Replace occurrences sequentially: first -> {0}, second -> {1}
string csharpFormat = format;
int paramIndex = 0;
csharpFormat = System.Text.RegularExpressions.Regex.Replace(csharpFormat, @"%02d|%d", match =>
{
string replacement = paramIndex == 0
? (match.Value == "%02d" ? "{0:D2}" : "{0}")
: (match.Value == "%02d" ? "{1:D2}" : "{1}");
paramIndex++;
return replacement;
});
szName = string.Format(csharpFormat, i, j);
}
void a_sprintf(out string szText, string format, uint nNum)
{
// Convert C-style format specifiers to C# format
// %d -> regular integer (for uint)
string csharpFormat = format.Replace("%d", "{0}");
szText = string.Format(csharpFormat, nNum);
}
string _AL(string text)
{
// Localization helper - returns the string as-is
// In C++ this would typically handle localization, but for now just return the text
return text;
}
AwardItem GetAwardItemAt(int row, int column)
{
foreach (var item in _awardItems)
{
if (item.Position.x == row &&
item.Position.y == column)
{
return item;
}
}
return null;
}
Toggle GetToggleBtnAt(int row)
{
int index = row - 1;
if( index < 0 || index >= _radioButtons.Length)
return null;
return _radioButtons[index];
}
void OnCommand_select(bool toggleValue)
{
if(toggleValue) m_pBtn_Confirm.gameObject.SetActive(true);
}
void OnCommand_confirm()
{
// int i;
string szName;
Toggle pRadio;
uint idTask = GetData();
for( int i = 1; i < _rowCount ; i++ )
{
// sprintf(szName, "Rdo_Award%d", i);
// pRadio = (PAUIRADIOBUTTON)GetDlgItem(szName);
// if( !pRadio || !pRadio->IsShow() ) break;
pRadio = GetToggleBtnAt(i);
if(!pRadio || !pRadio.gameObject.activeInHierarchy) return;
// if( pRadio.IsChecked() )
if( pRadio.isOn )
{
if (m_bThroughNPC) {
// GetGameSession().c2s_CmdNPCSevReturnTask(idTask, i - 1);
UnityGameSession.c2s_CmdNPCSevReturnTask((int)idTask, i - 1);
GetGameUIMan().EndNPCService();
} else if (m_bSpendContribution) {
// TODO: Implement spend contribution logic
// CECTaskInterface pTask = GetHostPlayer().GetTaskInterface();
// pTask.FinishTaskSpendingWorldContribution(idTask, i - 1);
} else {
// TODO: Implement choose award logic
// CECTaskInterface pTask = GetHostPlayer().GetTaskInterface();
// pTask.ChooseAward(idTask, i - 1);
}
Show(false);
break;
}
}
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1fac4acd7d2948cb81a522265a3f3863
timeCreated: 1764934733
@@ -0,0 +1,30 @@
using BrewMonster.Scripts.Task;
using CSNetwork.GPDataType;
namespace BrewMonster.Scripts.UI
{
public class CECUIHelper
{
public static A3DVECTOR3 GetTaskObjectCoordinates(int id, ref bool in_table)
{
in_table = false;
return new A3DVECTOR3(0);
// TODO: Implement this method properly
// A3DVECTOR3 ret(0.f);
// in_table = false;
// CECGame::ObjectCoords TargetTemp;
// ret = g_pGame->GetGameRun()->GetHostPlayer()->GetObjectCoordinates(
// id, TargetTemp, in_table);
// if (!in_table && MAJOR_MAP == g_pGame->GetGameRun()->GetWorld()->GetInstanceID()) {
// ATaskTemplMan *pMan = g_pGame->GetTaskTemplateMan();
// const NPC_INFO* pInfo = pMan->GetTaskNPCInfo(id);
// if(pInfo) {
// ret.Set(pInfo->x, pInfo->z, pInfo->y);
// in_table = true;
// }
// }
// return ret;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 7b63b60ce54a4913a7fd46db93a3610e
timeCreated: 1765539869
@@ -17,8 +17,8 @@ namespace BrewMonster.UI
DlgNPC m_pDlgNPC;
public NPC_ESSENCE? m_pCurNPCEssence;
public int m_idCurFinishTask = -1;
private DlgTask m_pDlgTask => DlgTask.Instance;
private DlgTask m_pDlgTask;
public static bool TALKPROC_IS_TERMINAL(uint id)
{
return ((id & 0x80000000u) != 0) && ((id & 0x40000000u) != 0);
@@ -112,6 +112,14 @@ namespace BrewMonster.UI
{
return m_canvas;
}
public override void Init()
{
base.Init();
m_pDlgTask = GetDialog("Win_Task").GetComponent<DlgTask>();
m_pDlgTask.Show(false);
}
}
public enum EC_GAMEUI_ICONS
+6 -6
View File
@@ -21,23 +21,23 @@ namespace BrewMonster
private void Awake()
{
EventBus.Subscribe<cmd_self_info_00>(UpdateHostPlayerInfoUI);
EventBus.Subscribe<InfoHostPlayer>(UpdateNameHostPlayer);
EventBus.Subscribe<EXPToUpLevel>(UpdateNeededExp);
EventBus.Subscribe<CECHostPlayer.InfoHostPlayer>(UpdateNameHostPlayer);
EventBus.Subscribe<CECHostPlayer.EXPToUpLevel>(UpdateNeededExp);
}
private void OnDestroy()
{
EventBus.Unsubscribe<cmd_self_info_00>(UpdateHostPlayerInfoUI);
EventBus.Unsubscribe<InfoHostPlayer>(UpdateNameHostPlayer);
EventBus.Unsubscribe<EXPToUpLevel>(UpdateNeededExp);
EventBus.Unsubscribe<CECHostPlayer.InfoHostPlayer>(UpdateNameHostPlayer);
EventBus.Unsubscribe<CECHostPlayer.EXPToUpLevel>(UpdateNeededExp);
}
private void UpdateNeededExp(EXPToUpLevel obj)
private void UpdateNeededExp(CECHostPlayer.EXPToUpLevel obj)
{
neededExp = obj.NeededExp;
}
private void UpdateNameHostPlayer(InfoHostPlayer obj)
private void UpdateNameHostPlayer(CECHostPlayer.InfoHostPlayer obj)
{
nameText.text = obj.NameHostPlayer;
}
@@ -125,6 +125,9 @@ namespace BrewMonster.UI
return;
}
};
SceneLoader.SceneLoadProcess = SceneLoadProcess.Loading;
SceneLoader.LoadingProgress = 0;
LoadingSceneController.Instance.ShowLoadingScene(true);
#if TESTFAST
string nameScene = "LoginScene";
SceneManager.UnloadSceneAsync(nameScene);
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ce7649e37400b4c67baf894c0f5c049b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: cf26d96ae7d984ba8a5b6cef44adffeb
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+773 -11
View File
@@ -360,6 +360,82 @@ MonoBehaviour:
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &535331371728200948
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4202523748155545876}
- component: {fileID: 2952546852855517335}
- component: {fileID: 231049257684701080}
m_Layer: 5
m_Name: title_balo
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4202523748155545876
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 535331371728200948}
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: 1758437320524330128}
m_Father: {fileID: 5834405183358786743}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0.9196167, y: -32.088013}
m_SizeDelta: {x: -1174.1528, y: 43.0516}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2952546852855517335
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 535331371728200948}
m_CullTransparentMesh: 1
--- !u!114 &231049257684701080
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 535331371728200948}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0}
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: 10907, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
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 &539155720282061380
GameObject:
m_ObjectHideFlags: 0
@@ -1317,7 +1393,8 @@ RectTransform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Children:
- {fileID: 7063925482172052076}
m_Father: {fileID: 4359352035478671586}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -1594,8 +1671,8 @@ MonoBehaviour:
m_Calls: []
m_text: 11
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -1800,7 +1877,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &3465722549101332612
RectTransform:
m_ObjectHideFlags: 0
@@ -3938,6 +4015,142 @@ MonoBehaviour:
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &2651905178962461676
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2029797512223769462}
- component: {fileID: 954330309280962804}
- component: {fileID: 7865823041554444481}
m_Layer: 5
m_Name: Label
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2029797512223769462
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2651905178962461676}
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: 3519332252817144425}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: -104, y: 25}
m_SizeDelta: {x: 188.11, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &954330309280962804
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2651905178962461676}
m_CullTransparentMesh: 1
--- !u!114 &7865823041554444481
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2651905178962461676}
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: "Hi\u1EC7n th\u1EDDi trang"
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: 32
m_fontSizeBase: 32
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 1024
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &2750592509987921328
GameObject:
m_ObjectHideFlags: 0
@@ -5593,7 +5806,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 20.288, y: -0.00000047683716}
m_AnchoredPosition: {x: 20.288, y: -6}
m_SizeDelta: {x: 40.576, y: 40.5751}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &17867925239596439
@@ -6072,6 +6285,142 @@ MonoBehaviour:
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &4220640036313436020
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3208901167605625288}
- component: {fileID: 7569386033128686724}
- component: {fileID: 5071637812459310285}
m_Layer: 5
m_Name: text_task
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3208901167605625288
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4220640036313436020}
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: 6872360865646447011}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0.6865, y: 3.5278}
m_SizeDelta: {x: -41.1884, y: -19.5462}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7569386033128686724
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4220640036313436020}
m_CullTransparentMesh: 1
--- !u!114 &5071637812459310285
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4220640036313436020}
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: "Nhi\u1EC7m v\u1EE5"
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: 34
m_fontSizeBase: 34
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &4264043294859808470
GameObject:
m_ObjectHideFlags: 0
@@ -6852,7 +7201,8 @@ RectTransform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Children:
- {fileID: 8707107604074202174}
m_Father: {fileID: 4359352035478671586}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -6972,12 +7322,13 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 9214110446265192471}
- {fileID: 2029797512223769462}
- {fileID: 3465722549101332612}
m_Father: {fileID: 7808448733240891499}
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: 9.2092, y: -0.00000071525574}
m_AnchoredPosition: {x: -7, y: -0.00000071525574}
m_SizeDelta: {x: 233.3818, y: 57.4129}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &7290315594166205190
@@ -8068,6 +8419,7 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 4202523748155545876}
- {fileID: 9128617693675511206}
- {fileID: 4137397199301223842}
- {fileID: 7205431771786927886}
@@ -8075,7 +8427,7 @@ RectTransform:
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: 41.1442, y: 3.2666}
m_AnchoredPosition: {x: 54, y: 318}
m_SizeDelta: {x: 1633.0076, y: 911.9714}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6612065338353497036
@@ -8216,6 +8568,7 @@ MonoBehaviour:
cashTextsLegacy: []
cashTextsTMP:
- {fileID: 0}
currentDragImage: {fileID: 0}
--- !u!1 &5959049729314796227
GameObject:
m_ObjectHideFlags: 0
@@ -8882,6 +9235,142 @@ MonoBehaviour:
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &6223446317805777605
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1758437320524330128}
- component: {fileID: 1127961836107974907}
- component: {fileID: 8134697103255324050}
m_Layer: 5
m_Name: title_text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1758437320524330128
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6223446317805777605}
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: 4202523748155545876}
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 &1127961836107974907
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6223446317805777605}
m_CullTransparentMesh: 1
--- !u!114 &8134697103255324050
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6223446317805777605}
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: "T\xFAi \u0111\u1ED3"
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: 42
m_fontSizeBase: 42
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &6255257731783554890
GameObject:
m_ObjectHideFlags: 0
@@ -9505,8 +9994,8 @@ MonoBehaviour:
m_Calls: []
m_text: 11
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
@@ -9879,7 +10368,8 @@ RectTransform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Children:
- {fileID: 3208901167605625288}
m_Father: {fileID: 4359352035478671586}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -10349,6 +10839,142 @@ MonoBehaviour:
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!1 &7279443163137723823
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8707107604074202174}
- component: {fileID: 1876596778309067016}
- component: {fileID: 1378956422077819937}
m_Layer: 5
m_Name: text_task
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8707107604074202174
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7279443163137723823}
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: 7214549036987193986}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -0.3981018, y: 2.8694}
m_SizeDelta: {x: -41.9847, y: -21.7202}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1876596778309067016
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7279443163137723823}
m_CullTransparentMesh: 1
--- !u!114 &1378956422077819937
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7279443163137723823}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "Th\u1EDDi trang"
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: 34
m_fontSizeBase: 34
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &7279759448364560869
GameObject:
m_ObjectHideFlags: 0
@@ -11623,6 +12249,142 @@ RectTransform:
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 551, y: 7.1924}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &8583259348320495074
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7063925482172052076}
- component: {fileID: 2689480142295059469}
- component: {fileID: 4434492319627725834}
m_Layer: 5
m_Name: text_item
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7063925482172052076
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8583259348320495074}
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: 64585481268713917}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -0.68640137, y: 3.7756004}
m_SizeDelta: {x: -42.5614, y: -21.2807}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2689480142295059469
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8583259348320495074}
m_CullTransparentMesh: 1
--- !u!114 &4434492319627725834
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8583259348320495074}
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: "V\u1EADt ph\u1EA9m"
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: 34
m_fontSizeBase: 34
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &8589115324229298066
GameObject:
m_ObjectHideFlags: 0
+792
View File
@@ -0,0 +1,792 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &237530162348205230
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6954598778548246722}
- component: {fileID: 3039664736528355014}
- component: {fileID: 7270640488870520982}
m_Layer: 5
m_Name: PercentLabel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6954598778548246722
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 237530162348205230}
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: 2870929995814517053}
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.14340019}
m_SizeDelta: {x: 0, y: -24.9456}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3039664736528355014
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 237530162348205230}
m_CullTransparentMesh: 1
--- !u!114 &7270640488870520982
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 237530162348205230}
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: 0%
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: 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: 21.2
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: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &752022102156491388
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6794110919409434385}
- component: {fileID: 2006518316736665754}
- component: {fileID: 2487042404357809237}
m_Layer: 5
m_Name: BG
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &6794110919409434385
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 752022102156491388}
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: 2870929995814517053}
m_Father: {fileID: 1498433891306440738}
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 &2006518316736665754
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 752022102156491388}
m_CullTransparentMesh: 1
--- !u!114 &2487042404357809237
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 752022102156491388}
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: b17924b6b7c78b74f8bd81beb6099972, 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 &1253822099379841126
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8819184454638197523}
- component: {fileID: 3556704604394319723}
- component: {fileID: 655569369460596013}
m_Layer: 5
m_Name: Fill
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8819184454638197523
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1253822099379841126}
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: 1679867140415222605}
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: 10, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3556704604394319723
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1253822099379841126}
m_CullTransparentMesh: 1
--- !u!114 &655569369460596013
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1253822099379841126}
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.09411765, g: 0.4988748, b: 0.85882354, 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: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
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 &1350348288180899800
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2870929995814517053}
- component: {fileID: 3961381925820122199}
m_Layer: 5
m_Name: ProgressBar
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2870929995814517053
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1350348288180899800}
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: 7973553455093132000}
- {fileID: 1679867140415222605}
- {fileID: 7448874308476023876}
- {fileID: 6954598778548246722}
- {fileID: 4146490789493023576}
m_Father: {fileID: 6794110919409434385}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 0}
m_AnchoredPosition: {x: 0, y: 83.6369}
m_SizeDelta: {x: 1855.6492, y: 48.6686}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &3961381925820122199
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1350348288180899800}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, 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: 0
m_TargetGraphic: {fileID: 4389115248635797559}
m_FillRect: {fileID: 8819184454638197523}
m_HandleRect: {fileID: 7640072662976260491}
m_Direction: 0
m_MinValue: 0
m_MaxValue: 1
m_WholeNumbers: 0
m_Value: 0
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!1 &1682473977380559532
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7973553455093132000}
- component: {fileID: 8477954588579120357}
- component: {fileID: 7662109531967672966}
m_Layer: 5
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7973553455093132000
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1682473977380559532}
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: 2870929995814517053}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.25}
m_AnchorMax: {x: 1, y: 0.75}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8477954588579120357
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1682473977380559532}
m_CullTransparentMesh: 1
--- !u!114 &7662109531967672966
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1682473977380559532}
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.3443396, g: 0.40371305, 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: 10907, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
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 &2213993380868078032
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4146490789493023576}
- component: {fileID: 4592186959237053483}
- component: {fileID: 2031915970332984306}
m_Layer: 5
m_Name: TaskLabel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4146490789493023576
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2213993380868078032}
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: 2870929995814517053}
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: 27.5}
m_SizeDelta: {x: 0, y: -24.9456}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4592186959237053483
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2213993380868078032}
m_CullTransparentMesh: 1
--- !u!114 &2031915970332984306
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2213993380868078032}
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: Loading
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: 4278255369
m_fontColor: {r: 0.034500837, g: 1, 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: 21.2
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 1
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &3384898060590067801
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7448874308476023876}
m_Layer: 5
m_Name: Handle Slide Area
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7448874308476023876
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3384898060590067801}
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: 7640072662976260491}
m_Father: {fileID: 2870929995814517053}
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: -20, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &6500472629937108760
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1498433891306440738}
- component: {fileID: 6418851540371260803}
m_Layer: 5
m_Name: LoadingUI
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1498433891306440738
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6500472629937108760}
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: 6794110919409434385}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &6418851540371260803
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6500472629937108760}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c0f91323d4b23b4428e423d2c724d821, type: 3}
m_Name:
m_EditorClassIdentifier:
goContent: {fileID: 752022102156491388}
progressBar: {fileID: 3961381925820122199}
percentText: {fileID: 7270640488870520982}
loadingText: {fileID: 2031915970332984306}
--- !u!1 &6559642003620323789
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1679867140415222605}
m_Layer: 5
m_Name: Fill Area
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1679867140415222605
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6559642003620323789}
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: 8819184454638197523}
m_Father: {fileID: 2870929995814517053}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.25}
m_AnchorMax: {x: 1, y: 0.75}
m_AnchoredPosition: {x: -0.06518555, y: 0}
m_SizeDelta: {x: -10.1305, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &6895589902788730412
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7640072662976260491}
- component: {fileID: 7048533629971895957}
- component: {fileID: 4389115248635797559}
m_Layer: 5
m_Name: Handle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &7640072662976260491
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6895589902788730412}
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: 7448874308476023876}
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: 20, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7048533629971895957
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6895589902788730412}
m_CullTransparentMesh: 1
--- !u!114 &4389115248635797559
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6895589902788730412}
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: 10913, guid: 0000000000000000f000000000000000, type: 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
+7
View File
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 4b2c2bde3e2945e4ba4516d08d755aeb
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+181 -9
View File
@@ -11,7 +11,7 @@ GameObject:
- component: {fileID: 8811543958641262336}
- component: {fileID: 5654695830126511408}
- component: {fileID: 8557697417454442642}
- component: {fileID: 7260516219833576421}
- component: {fileID: 5585424994453215618}
m_Layer: 5
m_Name: LeftPanel
m_TagString: Untagged
@@ -30,7 +30,8 @@ RectTransform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Children:
- {fileID: 4991868400217017228}
m_Father: {fileID: 5968911800527563993}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -76,7 +77,7 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &7260516219833576421
--- !u!114 &5585424994453215618
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -85,18 +86,99 @@ MonoBehaviour:
m_GameObject: {fileID: 2432735602217839019}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Content: {fileID: 2643174602035272289}
m_Horizontal: 0
m_Vertical: 1
m_MovementType: 1
m_Elasticity: 0.1
m_Inertia: 1
m_DecelerationRate: 0.135
m_ScrollSensitivity: 1
m_Viewport: {fileID: 4991868400217017228}
m_HorizontalScrollbar: {fileID: 0}
m_VerticalScrollbar: {fileID: 0}
m_HorizontalScrollbarVisibility: 0
m_VerticalScrollbarVisibility: 0
m_HorizontalScrollbarSpacing: 0
m_VerticalScrollbarSpacing: 0
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!1 &3188947102316191659
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2643174602035272289}
- component: {fileID: 8239567059120679520}
- component: {fileID: 3792152741005663754}
m_Layer: 5
m_Name: Content
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2643174602035272289
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3188947102316191659}
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: 4991868400217017228}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0.0009808608, y: -0.00012207031}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 1}
--- !u!114 &8239567059120679520
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3188947102316191659}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
m_Name:
m_EditorClassIdentifier:
m_HorizontalFit: 2
m_VerticalFit: 2
--- !u!114 &3792152741005663754
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3188947102316191659}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Padding:
m_Left: 40
m_Left: 0
m_Right: 0
m_Top: 0
m_Bottom: 250
m_ChildAlignment: 3
m_Bottom: 0
m_ChildAlignment: 0
m_Spacing: 0
m_ChildForceExpandWidth: 0
m_ChildForceExpandHeight: 0
m_ChildForceExpandWidth: 1
m_ChildForceExpandHeight: 1
m_ChildControlWidth: 0
m_ChildControlHeight: 0
m_ChildScaleWidth: 0
@@ -238,6 +320,96 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &4925246028977896636
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4991868400217017228}
- component: {fileID: 2546164430640387909}
- component: {fileID: 5536741800137127400}
- component: {fileID: 2286220110341525918}
m_Layer: 5
m_Name: Viewport
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4991868400217017228
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4925246028977896636}
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: 2643174602035272289}
m_Father: {fileID: 8811543958641262336}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 21.9049, y: 0}
m_SizeDelta: {x: -21.905, y: -17}
m_Pivot: {x: 0, y: 1}
--- !u!222 &2546164430640387909
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4925246028977896636}
m_CullTransparentMesh: 1
--- !u!114 &5536741800137127400
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4925246028977896636}
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: 10917, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
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 &2286220110341525918
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4925246028977896636}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
m_Name:
m_EditorClassIdentifier:
m_ShowMaskGraphic: 0
--- !u!1 &6031041715831305634
GameObject:
m_ObjectHideFlags: 0
@@ -406,7 +578,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
characterItemPrefab: {fileID: 5263746738484752443, guid: 726ee9eade6587245ac1b55d2335e9b9, type: 3}
parentItems: {fileID: 8811543958641262336}
parentItems: {fileID: 2643174602035272289}
--- !u!1 &7510180475820570348
GameObject:
m_ObjectHideFlags: 0
+2 -2
View File
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b5fc1f6b6826ba51b15f551fabb6aa4e0e2d1fb53b1d30f22f33341e654470fd
size 200520807
oid sha256:49dbfd3874bae260b9c7fd5cf05128cc19c395f788f891042d55cebf488bb41f
size 200520845
+109
View File
@@ -18,6 +18,13 @@ public partial class CECGameRun
private GameObject _playerPrefab;
private GameObject _monsterPrefab;//CECMonster
private GameObject _npcServerPrefab;//CECNPCServer
// CECTeamMan* m_pTeamMan; // Team manager
private CECShortcutSet m_pNormalSCS; // Normal shortcut set
private CECShortcutSet m_pTeamSCS; // Team shortcut set
private CECShortcutSet m_pTradeSCS; // Trade shortcut set
private CECShortcutSet m_pPoseSCS; // Pose shortcut set
private CECShortcutSet m_pFactionSCS; // Faction shortcut set
// private GameRunConfig _gameRunConfig;
//[SerializeField] private Transform ground;
@@ -27,6 +34,12 @@ public partial class CECGameRun
protected CECUIManager m_pUIManager; // UI manager
public CECWorld GetWorld() { return m_pWorld; }
// Get shortcut sets
public CECShortcutSet GetGenCmdShortcuts() { return m_pNormalSCS; }
public CECShortcutSet GetTeamCmdShortcuts() { return m_pTeamSCS; }
public CECShortcutSet GetTradeCmdShortcuts() { return m_pTradeSCS; }
public CECShortcutSet GetPoseCmdShortcuts() { return m_pPoseSCS; }
public CECShortcutSet GetFactionCmdShortcuts() { return m_pFactionSCS; }
private static Dictionary<int, CECInstance> m_InstTab = new Dictionary<int, CECInstance>();
public void Init()
@@ -52,6 +65,7 @@ public partial class CECGameRun
if(!m_InstTab.ContainsKey(161))
m_InstTab.Add(161, new CECInstance());
AddressableManager.Instance.OnDispose += Dispose;
StartGame(0, Vector3.zero);
}
private static void Dispose()
@@ -68,13 +82,26 @@ public partial class CECGameRun
_monsterPrefab = await AddressableManager.Instance.LoadPrefabAsync(AddressResourceConfig.MonsterPrefab);
_npcServerPrefab = await AddressableManager.Instance.LoadPrefabAsync(AddressResourceConfig.NpcServerPrefab);
}
private bool init;
public bool StartGame(int idInst, Vector3 vHostPos)
{
if (init)
{
return false;
}
// Create shortcuts
if (!CreateShortcuts())
{
return false;
}
if (!JumpToInstance(idInst, vHostPos))
{
BMLogger.LogError("CECGameRun::StartGame, Failed to create game world.");
return false;
}
init = true;
return true;
}
@@ -315,6 +342,88 @@ public partial class CECGameRun
return true;
}
public int GetCurStageIndex()
{
// CECGameRun.unique_data* data = GetUniqueData(0);
// if (data)
// {
// if(data->type ==1)
// {
// return data->GetValueAsInt();
// }
// }
return -1;
}
// Create shortcuts
public bool CreateShortcuts()
{
// // Normal command shortcut set
m_pNormalSCS = new CECShortcutSet();
m_pNormalSCS.Init(8);
CECSCCommand pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_SITDOWN);
m_pNormalSCS.SetShortcut(0, pSC);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_WALKRUN);
m_pNormalSCS.SetShortcut(1, pSC);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_NORMALATTACK);
m_pNormalSCS.SetShortcut(2, pSC);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_FINDTARGET);
m_pNormalSCS.SetShortcut(3, pSC);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_ASSISTATTACK);
m_pNormalSCS.SetShortcut(3, pSC);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_FLY);
m_pNormalSCS.SetShortcut(4, pSC);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_PICKUP);
m_pNormalSCS.SetShortcut(5, pSC);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_GATHER);
m_pNormalSCS.SetShortcut(6, pSC);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_RUSHFLY);
m_pNormalSCS.SetShortcut(6, pSC);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_BINDBUDDY);
m_pNormalSCS.SetShortcut(7, pSC);
// Team command shortcut set
m_pTeamSCS = new CECShortcutSet();
m_pTeamSCS.Init(2);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_INVITETOTEAM);
m_pTeamSCS.SetShortcut(0, pSC);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_LEAVETEAM);
m_pTeamSCS.SetShortcut(1, pSC);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_KICKTEAMMEM);
m_pTeamSCS.SetShortcut(2, pSC);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_FINDTEAM);
m_pTeamSCS.SetShortcut(2, pSC);
// Trade command shortcut set
m_pTradeSCS = new CECShortcutSet();
m_pTradeSCS.Init(2);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_STARTTRADE);
m_pTradeSCS.SetShortcut(0, pSC);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_SELLBOOTH);
m_pTradeSCS.SetShortcut(1, pSC);
// Pose command shortcut set
m_pPoseSCS = new CECShortcutSet();
m_pPoseSCS.Init((int)RoleExpression.NUM_ROLEEXP);
for (int i = 0; i < (int)RoleExpression.NUM_ROLEEXP; i++)
{
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_PLAYPOSE);
pSC.SetParam((uint)i);
m_pPoseSCS.SetShortcut(i, pSC);
}
// Faction command shortcut set
m_pFactionSCS = new CECShortcutSet();
m_pFactionSCS.Init(1);
pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_INVITETOFACTION);
m_pFactionSCS.SetShortcut(0, pSC);
return true;
}
// Get UI manager
+17 -16
View File
@@ -7,6 +7,7 @@ using UnityEngine;
using System.Runtime.InteropServices;
using BrewMonster.Network;
using BrewMonster.UI;
using Cysharp.Threading.Tasks;
namespace BrewMonster
{
@@ -56,7 +57,7 @@ namespace BrewMonster
public CECShortcutSet GetShortcutSet1(int n) { return m_aSCSets1[n]; }
public CECShortcutSet GetShortcutSet2(int n) { return m_aSCSets2[n]; }
private void OnMsgHstTaskData(ECMSG Msg)
private async UniTaskVoid OnMsgHstTaskData(ECMSG Msg)
{
// decode header to distinguish TASK_DATA vs TASK_VAR_DATA
// if (!(Msg.dwParam2 is cmd_header header))
@@ -64,7 +65,7 @@ namespace BrewMonster
// Debug.LogError("OnMsgHstTaskData: invalid header");
// return;
// }
int header = Convert.ToInt32(Msg.dwParam2);
byte[] pDataBuf = Msg.dwParam1 as byte[];
@@ -85,12 +86,13 @@ namespace BrewMonster
m_pTaskInterface = null;
m_pTaskInterface = new CECTaskInterface(this);
if (!m_pTaskInterface.Init(
pCmd.active_list, (int)pCmd.active_list_size,
pCmd.finished_list, (int)pCmd.finished_list_size,
pCmd.finished_time_list, (int)pCmd.finished_time_list_size,
pCmd.finished_count, (int)pCmd.finished_count_size,
pCmd.storage_task, (int)pCmd.storage_task_size))
var initTask = await m_pTaskInterface.Init(
pCmd.active_list, (int)pCmd.active_list_size,
pCmd.finished_list, (int)pCmd.finished_list_size,
pCmd.finished_time_list, (int)pCmd.finished_time_list_size,
pCmd.finished_count, (int)pCmd.finished_count_size,
pCmd.storage_task, (int)pCmd.storage_task_size);
if (!initTask)
{
Debug.LogError("CECHostPlayer::OnMsgHstTaskData, failed to initialize task interface");
return;
@@ -108,16 +110,15 @@ namespace BrewMonster
}
else if (header == CommandID.TASK_VAR_DATA)
{
Debug.Log($" OnMsgHstTaskData: Received TASK_VAR_DATA, size: {pDataBuf.Length} bytes");
// Minimal forwarding; original code passes inner data pointer and size
if (m_pTaskInterface != null)
{
OnServerNotify(m_pTaskInterface, pDataBuf, pDataBuf.Length);
}
cmd_task_var_data pCmd = new cmd_task_var_data();
pCmd.ReadBuffer(pDataBuf);
// ASSERT(pCmd);
if(m_pTaskInterface!= null)
OnServerNotify(m_pTaskInterface, pCmd.data, (int)pCmd.size);
else
{
Debug.LogError("OnMsgHstTaskData: m_pTaskInterface is null on TASK_VAR_DATA");
}
// ASSERT(m_pTaskInterface);
BMLogger.LogError($" CECHostPlayer::OnMsgHstTaskData: TASK_VAR_DATA received but m_pTaskInterface is null");
}
}
File diff suppressed because it is too large Load Diff
+7 -3
View File
@@ -26,18 +26,22 @@ public class CECUIManager : MonoSingleton<CECUIManager>
protected override void Awake()
{
base.Awake();
EventBus.Subscribe<NPCINFO>(ShowUINPC);
EventBus.Subscribe<CECHostPlayer.NPCINFO>(ShowUINPC);
EventBus.Subscribe<NPCDiedEvent>(TryHideUINPC);
gameUI = new CECGameUIMan();
gameUI.SetDependency(dialogResouce, canvasDlg);
gameUI.Init();
}
private void OnDestroy()
{
EventBus.Unsubscribe<NPCINFO>(ShowUINPC);
EventBus.Unsubscribe<CECHostPlayer.NPCINFO>(ShowUINPC);
EventBus.Unsubscribe<NPCDiedEvent>(TryHideUINPC);
}
private void ShowUINPC(NPCINFO obj)
private void ShowUINPC(CECHostPlayer.NPCINFO obj)
{
npsUI.gameObject.SetActive(true);
npsUI.SetText($"{obj.CurrentHealth}/{obj.MaxHealth}", obj.Name, "");
+16 -3
View File
@@ -103,9 +103,22 @@ namespace BrewMonster
}
};
[ StructLayout(LayoutKind.Sequential, Pack = 1) ]
struct cmd_task_var_data
{
public uint size;
public int size;
public byte[] data;
};
}
public void ReadBuffer(byte[] buffer)
{
int offset = 0;
size = BitConverter.ToInt32(buffer, offset);
offset += 4;
data = new byte[size];
Buffer.BlockCopy(buffer, offset, data, 0, size);
offset += size;
}
}
}
+1
View File
@@ -1,6 +1,7 @@
{
"dependencies": {
"com.boxqkrtm.ide.cursor": "https://github.com/boxqkrtm/com.unity.ide.cursor.git",
"com.cysharp.unitask": "https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask",
"com.github-glitchenzo.nugetforunity": "https://github.com/GlitchEnzo/NuGetForUnity.git?path=/src/NuGetForUnity",
"com.unity.2d.sprite": "1.0.0",
"com.unity.addressables": "2.7.4",

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