Merge remote-tracking branch 'origin/develop' into feature/add-vfx

This commit is contained in:
NguyenVanDat
2025-11-13 09:13:15 +07:00
86 changed files with 16387 additions and 500 deletions
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: dfcf99e0d0f5f4460989aafc79d64b82
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fbe0894d8bb02420b91603e804090540
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8027cada0ef5e4a9f827001b4747174d
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,314 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &700152255263326765
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5053903421260846465}
- component: {fileID: 4314770845850481090}
m_Layer: 5
m_Name: TreeViewItem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5053903421260846465
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 700152255263326765}
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: 3882154025378162395}
- {fileID: 5827054231092576763}
m_Father: {fileID: 0}
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: 250, y: 80}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &4314770845850481090
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 700152255263326765}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3428dd2e9dd644e0b0cb408bd3202f21, type: 3}
m_Name:
m_EditorClassIdentifier:
m_text: {fileID: 1383932928540251694}
m_Button: {fileID: 1762532130762754577}
m_uItemData: 0
OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &2040002976300010419
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3882154025378162395}
- component: {fileID: 2230410216357545400}
- component: {fileID: 9062463037674165507}
- component: {fileID: 1762532130762754577}
m_Layer: 5
m_Name: Image
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3882154025378162395
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2040002976300010419}
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: 5053903421260846465}
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 &2230410216357545400
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2040002976300010419}
m_CullTransparentMesh: 1
--- !u!114 &9062463037674165507
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2040002976300010419}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &1762532130762754577
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2040002976300010419}
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: 9062463037674165507}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1 &2916175606199835458
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5827054231092576763}
- component: {fileID: 5842649278580849339}
- component: {fileID: 1383932928540251694}
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 &5827054231092576763
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2916175606199835458}
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: 5053903421260846465}
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 &5842649278580849339
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2916175606199835458}
m_CullTransparentMesh: 1
--- !u!114 &1383932928540251694
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2916175606199835458}
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: New Text
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4278190080
m_fontColor: {r: 0, g: 0, b: 0, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 61.25
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}
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8752f9e95e4124abfb0d46a2cbe805e4
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 32f72ac9a8ef64a2ebb76719571780c1
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ac46beb7dcb944fc78a3e09d50be3a8a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: 123746285331b4b27a5ca0293f881a6c
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: 8690caffb21524eba944b517f4964558
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: 18b0178edf1b14a1e9a19b2230e0e270
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: 01b79c3dc401e4fdfb17b72d677f9fbd
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 950 B

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: 00976b2e066af4e1f85ff5f3c94b5d48
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 400 B

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: f9eb4327d68ef4ce281200cbbdff3f96
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: f4b9078f8552646528dc61807b96dce2
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: ef3296c82b3934a24b288ac6309eb7a7
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 3, y: 3, z: 3, w: 3}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 1537655665
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: 429873f63148845839a3ecfe5aa4ed07
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 582 KiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: 4744752b0496d42d0b1c52fcb705e044
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: 42074c4f5f76b4cbc9043df8f430af5f
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 817 B

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: 9de07872267c5419b9fa9c849eb45858
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: 9d4b52827a31d42438c5b84e7f9729a0
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: c3391972be9854a8fa42de37bb973f08
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: 8f24853d9cfea43389e8fb3101ffaae1
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: c2cc7625a1f3a4f569a5be891f29df19
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: 73873399fec964578b62204f20c40517
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: e09a5d2cb3c3f4c858754a1e90a44abd
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: b545f49a479374ffaaec0c8f123b0c5f
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: 38df93573cefb49559326bf3e14ec118
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
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: 1
spriteTessellationDetail: -1
textureType: 8
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: 512
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: WebGL
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
+2 -2
View File
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2aa98a02adb67b6e2d5b55a5619691e4e19904987941d3656b4245e369b5891c
size 4784
oid sha256:3c602a4daacba2ea32dd2bdda69ac81ef5613c2afec5fde068ca6d58fe03ae4a
size 22217
@@ -7,6 +7,9 @@ using Unity.VisualScripting;
namespace ModelRenderer.Scripts.GameData
{
/// <summary>
/// config data of Inventory, Shop, NPC Shop, ...
/// </summary>
public class elementdataman
{
@@ -0,0 +1,67 @@
using UnityEngine;
using System;
namespace BrewMonster.Network
{
public partial class EC_Game
{
private static uint m_AbsTickStart;
private static int m_AbsTimeStart;
private static int m_iTimeError; // 服务器与本机时间差(秒) // Time error in seconds
private static int m_iTimeZoneBias; // 服务器时区偏移(秒) // Server timezone bias in seconds
// 设置时间误差 // Set time error
public static void SetServerTime(int iSevTime, int iTimeZoneBias)
{
Debug.Log($"SetServerTime, iSevTime = {iSevTime}, iTimeZoneBias = {iTimeZoneBias}");
int iOldTimeError = m_iTimeError;
int nowUnix = (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds();
m_iTimeError = iSevTime - nowUnix; // 记录与本机的时间差 // store delta with local
m_iTimeZoneBias = iTimeZoneBias; // 记录服务器时区偏移 // store server timezone bias
// 计算服务器本地时间并设置昼夜 // Compute server local time and set time of day
var serverLocal = DateTimeOffset.FromUnixTimeSeconds((long)iSevTime + iTimeZoneBias);
int nTimeInDay = serverLocal.Hour * 3600 + serverLocal.Minute * 60 + serverLocal.Second;
// GetGameRun()->GetWorld()->GetSunMoon()->SetTimeOfTheDay(nTimeInDay / (4.0f * 3600.0f));
// 设置昼夜时间(原逻辑保留为注释) // Set time of day (original call left commented)
// 防沉迷时长修正 // Anti-wallow playtime adjust
// S2C::player_wallow_info wallowinfo = GetGameRun()->GetWallowInfo();
// if (wallowinfo.anti_wallow_active)
// {
// wallowinfo.play_time += m_iTimeError - iOldTimeError;
// GetGameRun()->SetWallowInfo(wallowinfo);
// }
// 初始化绝对时间参考点 // Initialize absolute time reference
m_AbsTimeStart = iSevTime;
m_AbsTickStart = (uint)(Time.realtimeSinceStartup * 1000.0f);
Debug.Log($"timeGetTime(), TickStart = {m_AbsTickStart}");
}
public static int GetServerAbsTime()
{
uint curTick = (uint)(Time.realtimeSinceStartup * 1000.0f);
if (curTick < m_AbsTickStart)
{
// if player run this game more than 49.71 days...
uint sec = (((uint)~0u - m_AbsTickStart + 1u) + curTick) / 1000u;
m_AbsTickStart = curTick;
m_AbsTimeStart += (int)sec;
return m_AbsTimeStart;
}
else
{
uint sec = (curTick - m_AbsTickStart) / 1000u;
return m_AbsTimeStart + (int)sec;
}
}
public float timeGetTime()
{
return Time.time;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8a2ddad1f3474e129d674cb1626ee925
timeCreated: 1762332519
@@ -4,9 +4,11 @@ using UnityEngine;
using BrewMonster;
using System.Collections.Generic;
using System.IO;
using CSNetwork;
namespace BrewMonster.Network
{
public class EC_Game
public partial class EC_Game
{
#region Fields
private static ATaskTemplMan m_pTaskMan; // Task template manager
@@ -0,0 +1,11 @@
partial class CECPlayer
{
protected int m_iMoneyCnt; // Amount of money the player has
public int GetMoneyAmount(){ return m_iMoneyCnt; }
public byte GetShapeMask()
{
// restore the original data from 8~15 bit
return (byte)((m_iShape & 0xff00) >> 8);
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 374bbbec130949df8eabff08a278da8b
timeCreated: 1762416128
@@ -16,7 +16,7 @@ using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.SceneManagement;
public abstract class CECPlayer : CECObject
public abstract partial class CECPlayer : CECObject
{
[SerializeField] protected Transform parentModel;
[SerializeField] protected TextMeshProUGUI txtName;
@@ -1451,5 +1451,12 @@ namespace CSNetwork.GPDataType
{
public byte type;
};
public struct cmd_server_time
{
public int time;
public int timebias;
public int lua_version;
};
}
@@ -651,6 +651,12 @@ namespace CSNetwork
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_INFO00, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
pCmdHeader);
break;
case CommandID.SERVER_TIME:
{
cmd_server_time pcmd_server_time = GPDataTypeHelper.FromBytes<cmd_server_time>(pDataBuf);
EC_ManMessage.PostMessage(EC_MsgDef.MSG_SERVERTIME, -1, 0, pcmd_server_time.time, pcmd_server_time.timebias);
break;
}
case CommandID.SCENE_SERVICE_NPC_LIST:
{
CECHostSkillModel.Instance.RecvNPCServiceList(protocol.Data);
@@ -6,13 +6,17 @@ using UnityEngine;
namespace BrewMonster.Scripts.Task
{
/// <summary>
/// contains and manages all task templates
/// init in EC_Game
/// </summary>
public class ATaskTemplMan
{
public const ulong TASK_PACK_MAGIC = 0x93858361;
public const ulong _task_templ_cur_version = 121;
private ulong g_ulNewCount = 0;// do we need this?
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>();
private Dictionary<ulong, ATaskTempl> m_AllTemplMap = new Dictionary<ulong, ATaskTempl>();
private Dictionary<ulong, ATaskTempl> m_DynTaskMap = new Dictionary<ulong, ATaskTempl>();
@@ -29,6 +33,7 @@ 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;
@@ -70,18 +75,20 @@ namespace BrewMonster.Scripts.Task
// 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);
Debug.Log((int)tph.item_count);
//BMLogger.Log($" [MH] Task File Lenght: {fs.Length}");
for (int i = 874; i < 875; i++) //TODO: tph.item_count
// 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]);
// 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...");
// 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");
@@ -92,6 +99,8 @@ namespace BrewMonster.Scripts.Task
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());
@@ -136,11 +145,37 @@ namespace BrewMonster.Scripts.Task
{
}
public ATaskTempl GetTopTaskByID(uint ulID)
{
if (m_TaskTemplMap.TryGetValue(ulID, out ATaskTempl task))
{
return task;
}
return null;
}
public ATaskTempl GetTaskTemplByID(uint ulID)
{
if (m_TaskTemplMap.TryGetValue((uint)ulID, out ATaskTempl task))
{
return task;
}
return null;
}
public bool CanGiveUpTask(uint ulTaskId)
{
var pTempl = GetTaskTemplByID(ulTaskId);
if (pTempl == null) return false;
pTempl = pTempl.GetTopTask();
return pTempl.m_FixedData.m_bCanGiveUp;
}
private void AddOneTaskTempl(ATaskTempl pTask)
{
//todo: recheck - wrong logic
if (m_AllTemplMap.ContainsKey(pTask.m_FixedData.m_ID))
if (m_TaskTemplMap.ContainsKey(pTask.m_FixedData.m_ID))
{
CECTaskInterface.WriteLog(0, (int)pTask.m_FixedData.m_ID, 0, "Dup Task Found");
// Optionally log duplicate task found, e.g.:
@@ -172,10 +207,10 @@ namespace BrewMonster.Scripts.Task
if (pTask.m_FixedData.m_bAutoDeliver && pTask.m_FixedData.m_bDisplayInExclusiveUI)
m_ExlusiveAwardTaskMap[pTask.m_FixedData.m_ID] = pTask;
//#if _TASK_CLIENT
// if (pTask.m_ulDelvNPC != 0 && pTask.m_bCanSeekOut)
// m_TasksCanSeekOut.Add(pTask);
//#endif
#if _TASK_CLIENT
if (pTask.m_FixedData.m_ulDelvNPC != 0 && pTask.m_FixedData.m_bCanSeekOut)
m_TasksCanSeekOut.Add(pTask);
#endif
AddTaskToMap(pTask);
}
@@ -262,5 +297,19 @@ namespace BrewMonster.Scripts.Task
}
return true;
}
#if _TASK_CLIENT
public bool IsTaskToPush(int id)
{
// TODO: Implement this method properly
// int count = m_TasksToPush.size();
// for (size_t i = 0; i < count; ++i) {
// ATaskTempl pTempl = m_TasksToPush[i].task;
// if (pTempl && (int)pTempl->m_ID == id) return true;
// }
return false;
}
#endif
}
}
@@ -1,11 +1,160 @@
using BrewMonster.Network;
using BrewMonster.Scripts.Player;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using BrewMonster.Scripts.Managers;
using CSNetwork.GPDataType;
using PerfectWorld.Scripts.Task;
using UnityEngine;
namespace BrewMonster.Scripts.Task
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class Kill_Player_Requirements
{
public const uint MAX_OCCPU_MASK = ((uint)1 << TaskInterfaceConstants.MAX_OCCUPATIONS) - 1u;
public uint m_ulOccupations;
public int m_iMinLevel;
public int m_iMaxLevel;
public int m_iGender;
public int m_iForce;
public Kill_Player_Requirements()
{
m_iMinLevel = 10;
m_iMaxLevel = 100;
m_iGender = 0;
m_iForce = 0;
m_ulOccupations = MAX_OCCPU_MASK;
}
public bool IsMeetAllOccupation()
{
return m_ulOccupations == MAX_OCCPU_MASK;
}
public bool CheckRequirements(int iOccupation, int iLevel, bool bGender, int iForce)
{
bool bForce = false;
// У2ΪŮ // In editor: 1 is male, 2 is female
int iGender = bGender ? 2 : 1;
// 0ûҪ // In editor: 0 means no force requirement
if (m_iForce == 0)
{
bForce = true;
}
// ʾҪ // Otherwise indicates there is a force requirement
else
{
// ͻҹֱõһλʾ // Map force ids to bit positions
int iForceMask = 0;
if (iForce == 0)
{
return false;
}
else if (iForce == 1004)
{
iForceMask = 1 << 0;
}
else if (iForce == 1005)
{
iForceMask = 1 << 1;
}
else if (iForce == 1006)
{
iForceMask = 1 << 2;
}
bForce = (m_iForce & iForceMask) != 0;
}
return ((m_ulOccupations & (1u << iOccupation)) != 0)
&& m_iMinLevel <= iLevel
&& m_iMaxLevel >= iLevel
&& (m_iGender != 0 ? m_iGender == iGender : true)
&& bForce;
}
}
#if _TASK_CLIENT
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Task_State_info
{
public uint m_ulTimeLimit;
public uint m_ulTimePassed;
public uint m_ulNPCToProtect;
public uint m_ulProtectTime;
public uint m_ulWaitTime;
public uint m_ulErrCode;
public uint m_ulGoldWanted;
public uint m_ulReachLevel;
public uint m_ulReachReincarnation;
public uint m_ulReachRealm;
public uint m_ulPremLevelMin;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct m_MonsterWanted_s
{
public uint m_ulMonsterId;
public uint m_ulMonstersToKill;
public uint m_ulMonstersKilled;
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = TaskInterfaceConstants.MAX_MONSTER_WANTED)]
public m_MonsterWanted_s[] m_MonsterWanted;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct m_ItemsWanted_s
{
public uint m_ulItemId;
public uint m_ulItemsToGet;
public uint m_ulItemsGained;
public uint m_ulMonsterId;
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = TaskInterfaceConstants.MAX_ITEM_WANTED)]
public m_ItemsWanted_s[] m_ItemsWanted;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct TASK_INFO_PLAYER
{
public uint m_ulPlayersToKill;
public uint m_ulPlayersKilled;
public Kill_Player_Requirements m_Requirements;
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = TaskInterfaceConstants.MAX_PLAYER_WANTED)]
public TASK_INFO_PLAYER[] m_PlayerWanted;
// abase::vector<wchar_t*> m_TaskCharArr (assumed 3 pointers: start, finish, end_of_storage; 32-bit layout)
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct abase_vector_wchar_t_ptr
{
public uint _start;
public uint _finish;
public uint _end_of_storage;
}
public abase_vector_wchar_t_ptr m_TaskCharArr;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Task_Award_Preview
{
public uint m_ulGold;
public uint m_ulExp;
public uint m_ulRealmExp;
public uint m_ulSP;
public bool m_bHasItem;
public bool m_bItemKnown;
public uint m_ulItemTypes;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = TaskInterfaceConstants.MAX_ITEM_AWARD)]
public uint[] m_ItemsId;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = TaskInterfaceConstants.MAX_ITEM_AWARD)]
public uint[] m_ItemsNum;
public int m_iForceActivity;
public int m_iForceContrib;
public int m_iForceRepu;
}
#endif
public class TaskInterfaceConstants
{
// Task Prerequisite Error Code
@@ -157,8 +306,6 @@ namespace BrewMonster.Scripts.Task
public const int TASK_WORLD_CONTRIBUTION_SPEND_PER_DAY = 30; // 免费玩家每日消费贡献度上限 // Daily contribution spend cap for free players
}
public class CECTaskInterface : TaskInterface
{
public const int TASK_MAX_DELIVER_COUNT = 5;
@@ -179,11 +326,14 @@ namespace BrewMonster.Scripts.Task
CECHostPlayer m_pHost;
ActiveTaskList m_pActiveListBuf; // Active task list buffer
object[] m_pFinishedListBuf; // Finished task list buffer
object[] m_pFinishedTimeListBuf; // Finished time list buffer
object[] m_pFinishedCountListBuf;// Finished count list buffer
object[] m_pStorageTaskListBuf; // Storage tasks list buffer
// private byte[] m_pActiveListRawBuf; // raw buffer backing for active list (converted from C++)
byte[] m_pFinishedListBuf; // Finished task list buffer
byte[] m_pFinishedTimeListBuf; // Finished time list buffer
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 bool m_bForceNavigateFinish;
public CECTaskInterface()
{
@@ -200,88 +350,70 @@ namespace BrewMonster.Scripts.Task
m_pStorageTaskListBuf = null;
}
public bool Init(object[] pActiveListBuf, int iActiveListLen, object[] pFinishedListBuf, int iFinishedListLen, object[] pFinishedTimeListBuf, int iFinishedTimeListLen, object[] pFinishedCountListBuf, int iFinishedCountListLen, object[] pStorageTaskListBuf, int iStorageTaskListLen)
{
// if (!(m_pActiveListBuf = a_malloc(TASK_ACTIVE_LIST_BUF_SIZE)))
// {
// glb_ErrorOutput(ECERR_NOTENOUGHMEMORY, "CECTaskInterface::Init", __LINE__);
// return false;
// }
// Initialize object
public bool Init(byte[] pActiveListBuf, int iActiveListLen, byte[] pFinishedListBuf,
int iFinishedListLen, byte[] pFinishedTimeListBuf, int iFinishedTimeListLen,
byte[] pFinishedCountListBuf, int iFinishedCountListLen, byte[] pStorageTaskListBuf, int iStorageTaskListLen)
{
// basic argument check (converted from ASSERT)
if (pActiveListBuf == null || pFinishedListBuf == null || pFinishedTimeListBuf == null || pFinishedCountListBuf == null)
{
return false;
}
//if (!(m_pFinishedListBuf = a_malloc(TASK_FINISHED_LIST_BUF_SIZE)))
//{
// a_free(m_pActiveListBuf);
// m_pFinishedListBuf = NULL;
// glb_ErrorOutput(ECERR_NOTENOUGHMEMORY, "CECTaskInterface::Init", __LINE__);
// return false;
//}
BMLogger.Log($"pActiveListBuf: {pActiveListBuf.Length} - {TaskInterfaceConstants.TASK_ACTIVE_LIST_BUF_SIZE}");
// allocate internal buffers and copy; remaining bytes are zero-initialized in C#
// m_pActiveListRawBuf = new byte[TaskInterfaceConstants.TASK_ACTIVE_LIST_BUF_SIZE];
// {
// int copy = Mathf.Min(iActiveListLen, TaskInterfaceConstants.TASK_ACTIVE_LIST_BUF_SIZE);
// if (copy > 0) System.Buffer.BlockCopy(pActiveListBuf, 0, m_pActiveListRawBuf, 0, copy);
// }
m_pActiveListBuf = new ActiveTaskList();
m_pActiveListBuf.ReadFromBuffer(pActiveListBuf);
//if (!(m_pFinishedTimeListBuf = a_malloc(TASK_FINISH_TIME_LIST_BUF_SIZE)))
//{
// a_free(m_pActiveListBuf);
// a_free(m_pFinishedListBuf);
// glb_ErrorOutput(ECERR_NOTENOUGHMEMORY, "CECTaskInterface::Init", __LINE__);
// return false;
//}
m_pFinishedListBuf = new byte[TaskInterfaceConstants.TASK_FINISHED_LIST_BUF_SIZE];
{
int copy = Mathf.Min(iFinishedListLen, TaskInterfaceConstants.TASK_FINISHED_LIST_BUF_SIZE);
if (copy > 0) System.Buffer.BlockCopy(pFinishedListBuf, 0, m_pFinishedListBuf, 0, copy);
}
//if (!(m_pFinishedCountListBuf = a_malloc(TASK_FINISH_COUNT_LIST_BUF_SIZE)))
//{
// a_free(m_pActiveListBuf);
// a_free(m_pFinishedListBuf);
// a_free(m_pFinishedCountListBuf);
// glb_ErrorOutput(ECERR_NOTENOUGHMEMORY, "CECTaskInterface::Init", __LINE__);
// return false;
//}
m_pFinishedTimeListBuf = new byte[TaskInterfaceConstants.TASK_FINISH_TIME_LIST_BUF_SIZE];
{
int copy = Mathf.Min(iFinishedTimeListLen, TaskInterfaceConstants.TASK_FINISH_TIME_LIST_BUF_SIZE);
if (copy > 0) System.Buffer.BlockCopy(pFinishedTimeListBuf, 0, m_pFinishedTimeListBuf, 0, copy);
}
//if (!(m_pStorageTaskListBuf = a_malloc(TASK_STORAGE_LIST_BUF_SIZE)))
//{
// a_free(m_pActiveListBuf);
// a_free(m_pFinishedListBuf);
// a_free(m_pFinishedCountListBuf);
// a_free(m_pStorageTaskListBuf);
// glb_ErrorOutput(ECERR_NOTENOUGHMEMORY, "CECTaskInterface::Init", __LINE__);
// return false;
//}
//ASSERT(pActiveListBuf && pFinishedListBuf && pFinishedTimeListBuf && pFinishedCountListBuf);
//memcpy(m_pActiveListBuf, pActiveListBuf, iActiveListLen);
//memcpy(m_pFinishedListBuf, pFinishedListBuf, iFinishedListLen);
//memcpy(m_pFinishedTimeListBuf, pFinishedTimeListBuf, iFinishedTimeListLen);
//memcpy(m_pFinishedCountListBuf, pFinishedCountListBuf, iFinishedCountListLen);
//memcpy(m_pStorageTaskListBuf, pStorageTaskListBuf, iStorageTaskListLen);
m_pFinishedCountListBuf = new byte[TaskInterfaceConstants.TASK_FINISH_COUNT_LIST_BUF_SIZE];
{
int copy = Mathf.Min(iFinishedCountListLen, TaskInterfaceConstants.TASK_FINISH_COUNT_LIST_BUF_SIZE);
if (copy > 0) System.Buffer.BlockCopy(pFinishedCountListBuf, 0, m_pFinishedCountListBuf, 0, copy);
}
//// Clear rest buffer
//if (iActiveListLen < TASK_ACTIVE_LIST_BUF_SIZE)
// memset((BYTE*)m_pActiveListBuf + iActiveListLen, 0, TASK_ACTIVE_LIST_BUF_SIZE - iActiveListLen);
m_pStorageTaskListBuf = new byte[TaskInterfaceConstants.TASK_STORAGE_LIST_BUF_SIZE];
{
int copy = Mathf.Min(iStorageTaskListLen, TaskInterfaceConstants.TASK_STORAGE_LIST_BUF_SIZE);
if (copy > 0) System.Buffer.BlockCopy(pStorageTaskListBuf, 0, m_pStorageTaskListBuf, 0, copy);
}
//if (iFinishedListLen < TASK_FINISHED_LIST_BUF_SIZE)
// memset((BYTE*)m_pFinishedListBuf + iFinishedListLen, 0, TASK_FINISHED_LIST_BUF_SIZE - iFinishedListLen);
// Clear rest buffer // 清理剩余缓冲区
// No-op in C# because arrays are zero-initialized.
//if (iFinishedTimeListLen < TASK_FINISH_TIME_LIST_BUF_SIZE)
// memset((BYTE*)m_pFinishedTimeListBuf + iFinishedTimeListLen, 0, TASK_FINISH_TIME_LIST_BUF_SIZE - iFinishedTimeListLen);
ATaskTemplMan pTaskMan = GetTaskTemplMan();
pTaskMan.Release();
string task_data_path = Path.Combine(Application.streamingAssetsPath, "data/tasks.data");
pTaskMan.LoadTasksFromPack(task_data_path, true);
pTaskMan.LoadNPCInfoFromPack("data\\task_npc.data");
pTaskMan.VerifyDynTasksPack("userdata\\dyn_tasks.data");
InitActiveTaskList();
//if (iFinishedCountListLen < TASK_FINISH_COUNT_LIST_BUF_SIZE)
// memset((BYTE*)m_pFinishedCountListBuf + iFinishedCountListLen, 0, TASK_FINISH_COUNT_LIST_BUF_SIZE - iFinishedCountListLen);
m_bForceNavigateFinish = false;
//if (iStorageTaskListLen < TASK_STORAGE_LIST_BUF_SIZE)
// memset((BYTE*)m_pStorageTaskListBuf + iStorageTaskListLen, 0, TASK_STORAGE_LIST_BUF_SIZE - iStorageTaskListLen);
Debug.Log("[Dat]- Init GetTaskTemplMan");
ATaskTemplMan pTaskMan = GetTaskTemplMan();
if (pTaskMan == null)
{
Debug.LogError("[Dat]- fail to create ATaskTemplMan");
return false;
}
pTaskMan.Release();
// pTaskMan.LoadTasksFromPack("data\\tasks.data", true);
// pTaskMan.LoadNPCInfoFromPack("data\\task_npc.data");
// pTaskMan.VerifyDynTasksPack("userdata\\dyn_tasks.data");
// InitActiveTaskList();
//m_bForceNavigateFinish = false;
return true;
}
return true;
}
public void CheckPQEnterWorldInit()
{
@@ -309,6 +441,31 @@ namespace BrewMonster.Scripts.Task
{
//do something?
}
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();
}
public int GetCommonItemCount(uint ulCommonItem)
{
// CECInventory pPack = m_pHost.GetPack();
//EC_Inventory pPack = m_pHost.GetPack();
// return pPack != null ? EC_Inventory.GetItemTotalNum( 0, (int)ulCommonItem) : 0;
// paramater 1 to get type inventory (0:inventoty, 1:equip,...)
return EC_Inventory.GetItemTotalNum(EC_Inventory.IVTRTYPE_PACK, (int)ulCommonItem);
}
public int GetTaskItemCount(uint ulTaskItem)
{
// CECInventory* pPack = m_pHost->GetTaskPack();
// return pPack ? pPack->GetItemTotalNum((int)ulTaskItem) : 0;
return EC_Inventory.GetItemTotalNum(EC_Inventory.IVTRTYPE_TASKPACK, (int)ulTaskItem);
}
private ATaskTemplMan GetTaskTemplMan()
{
@@ -317,6 +474,518 @@ namespace BrewMonster.Scripts.Task
private ActiveTaskList GetActiveTaskList()
{
return m_pActiveListBuf;
}
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;
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 bool CheckTaskForbid(uint task_id){ return false; }
public bool IsAtCrossServer()
{
// TODO: cross server
// return CECCrossServer.Instance().IsOnSpecialServer();
return false;
}
public uint GetPlayerLevel()
{
return (uint)m_pHost.GetBasicProps().iLevel;
}
public uint GetGoldNum()
{
return (uint)m_pHost.GetMoneyAmount();
}
public int GetGlobalValue(int lKey)
{
return EC_Game.GetGameRun().GetCommonData(lKey);
}
public byte GetShapeMask()
{
return m_pHost.GetShapeMask();
}
public int GetPos(float[] pos)
{
A3DVECTOR3 vPos = m_pHost.GetPos();
if (pos != null && pos.Length >= 3)
{
pos[0] = vPos.x;
pos[1] = vPos.y;
pos[2] = vPos.z;
}
var world = World.CECWorld.Instance;
return world != null ? world.GetInstanceID() : 0;
}
public bool CheckSimpleTaskFinshConditon(uint task_id)
{
ATaskTempl pTempl = GetTaskTemplMan().GetTaskTemplByID(task_id);
if (pTempl == null) return false;
if (pTempl.m_FixedData.m_enumMethod == (uint)TaskMethod.enumTMSimpleClientTask && pTempl.m_FixedData.m_uiEmotion != 0)
{
if (m_emotionTask != null && m_emotionTask.TryGetValue(task_id, out bool finished))
return finished;
return false;
}
else if (pTempl.m_FixedData.m_enumMethod == (uint)TaskMethod.enumTMSimpleClientTaskForceNavi)
{
return GetForceNavigateFinishFlag();
}
return true;
}
public int GetFactionConsumeContrib()
{
return m_pHost.GetContribInfo().consume_contrib;
}
public int GetFactionExpContrib()
{
return m_pHost.GetContribInfo().exp_contrib;
}
public bool HasTask(uint ulTaskId)
{
ActiveTaskList pLst = GetActiveTaskList();
if (pLst == null) return false;
for (int i = 0; i < pLst.m_uTaskCount; i++)
{
ActiveTaskEntry entry = pLst.m_TaskEntries[i];
if ((uint)entry.m_ID == ulTaskId && entry.GetTempl() != null)
return true;
}
return false;
}
#if _TASK_CLIENT
// Prepare award preview based on task and state
public void GetTaskAwardPreview(uint ulTaskId, ref Task_Award_Preview p, bool bActiveTask=true)
{
// Zero and init output
p = default;
if (p.m_ItemsId == null) p.m_ItemsId = new uint[TaskInterfaceConstants.MAX_ITEM_AWARD];
if (p.m_ItemsNum == null) p.m_ItemsNum = new uint[TaskInterfaceConstants.MAX_ITEM_AWARD];
// Gather context
ActiveTaskList pLst = GetActiveTaskList();
uint ulCurTime = GetCurTime();
ATaskTempl pTempl = null;
AWARD_DATA ad = default;
uint ulMulti = 1u;
// Resolve template and dynamic award when active
if (bActiveTask && pLst != null)
{
for (int i = 0; i < pLst.m_uTaskCount; i++)
{
ActiveTaskEntry CurEntry = pLst.m_TaskEntries[i];
if (CurEntry.m_ID != ulTaskId || CurEntry.m_ulTemplAddr == 0) continue;
pTempl = CurEntry.GetTempl();
// TODO: CalcAwardData/CalcAwardMulti not implemented yet in C#; use fixed success award and multiplier 1
if (pTempl != null)
{
ad = pTempl.m_FixedData.m_Award_S;
ulMulti = 1u;
}
if (ulMulti == 0u) return;
break;
}
}
// Fallback to top template when inactive
else
{
pTempl = GetTaskTemplMan().GetTopTaskByID(ulTaskId);
if (pTempl == null) return;
ad = pTempl.m_FixedData.m_Award_S;
}
// Fill basic award fields
unchecked
{
p.m_ulGold = ad.m_ulGoldNum * ulMulti;
p.m_ulExp = ad.m_ulExp * ulMulti;
p.m_ulSP = ad.m_ulSP * ulMulti;
}
p.m_iForceActivity = ad.m_iForceActivity;
p.m_iForceContrib = ad.m_iForceContribution;
p.m_iForceRepu = ad.m_iForceReputation;
p.m_ulRealmExp = ad.m_ulRealmExp;
// Apply level coefficient if configured (coefficient table not available; skip scaling)
if (ad.m_bUseLevCo)
{
uint ulLev = GetPlayerLevel();
if (ulLev == 0) ulLev = 1;
uint ulUpper = 0;
if (pTempl != null && pTempl.GetTopTask() != null)
ulUpper = pTempl.GetTopTask().m_FixedData.m_ulPremise_Lev_Max;
if (ulUpper != 0 && ulLev > ulUpper) ulLev = ulUpper;
// NOTE: Original code multiplies by _lev_co[ulLev-1]. Not available here; keep as-is.
}
// Candidate items handling
if (ad.m_ulCandItems == 1 && ad.m_CandItems != null && ad.m_CandItems.Length > 0)
{
p.m_bHasItem = true;
p.m_bItemKnown = true;
AWARD_ITEMS_CAND ic = ad.m_CandItems[0];
if (ic.m_bRandChoose)
{
p.m_bItemKnown = false;
}
else
{
for (int j = 0; j < ic.m_ulAwardItems; j++)
{
ITEM_WANTED wi = ic.m_AwardItems[j];
if (!wi.m_bCommonItem) continue;
else if (wi.m_fProb != 1.0f)
{
p.m_bItemKnown = false;
break;
}
else
{
// Period conversion not implemented; assume valid
if (p.m_ulItemTypes < TaskInterfaceConstants.MAX_ITEM_AWARD)
{
p.m_ItemsId[p.m_ulItemTypes] = wi.m_ulItemTemplId;
p.m_ItemsNum[p.m_ulItemTypes] = wi.m_ulItemNum;
p.m_ulItemTypes++;
}
}
}
}
}
else if (ad.m_ulCandItems > 1)
{
p.m_bHasItem = true;
}
// Done
return;
}
public uint GetTaskCount()
{
ActiveTaskList pLst = GetActiveTaskList();
uint ulCount = 0;
if (pLst == null) return 0u;
for (int i = 0; i < pLst.m_uTaskCount; i++)
{
ActiveTaskEntry CurEntry = pLst.m_TaskEntries[i];
ATaskTempl pTempl = CurEntry.GetTempl();
if (pTempl != null
&& !pTempl.m_FixedData.m_bDisplayInTitleTaskUI
&& CurEntry.m_ParentIndex == (char)0xff)
{
if (!pTempl.m_FixedData.m_bHidden || pTempl.m_FixedData.m_bShowPrompt)
{
ulCount++;
}
}
}
return ulCount;
}
public uint GetTaskId(uint ulIndex)
{
ActiveTaskList pLst = GetActiveTaskList();
byte uTopCount = 0;
int uCount = 0;
if (pLst == null) return 0u;
while (uCount < pLst.m_uTaskCount)
{
ActiveTaskEntry CurEntry = pLst.m_TaskEntries[uCount];
ATaskTempl pTempl = CurEntry.GetTempl();
if (pTempl != null
&& !pTempl.m_FixedData.m_bDisplayInTitleTaskUI
&& CurEntry.m_ParentIndex == (char)0xff)
{
if (!pTempl.m_FixedData.m_bHidden || pTempl.m_FixedData.m_bShowPrompt)
{
if (ulIndex == uTopCount)
return CurEntry.m_ID;
else
uTopCount++;
}
}
uCount++;
}
return 0u;
}
#endif
private bool GetForceNavigateFinishFlag()
{
return m_bForceNavigateFinish;
}
public void GetTaskStateInfo(uint ulTaskId, ref Task_State_info pInfo, bool bActiveTask=true)
{
// 清零并准备输出结构 // Zero and prepare output struct
pInfo = default;
if (pInfo.m_MonsterWanted == null)
pInfo.m_MonsterWanted = new Task_State_info.m_MonsterWanted_s[TaskInterfaceConstants.MAX_MONSTER_WANTED];
if (pInfo.m_ItemsWanted == null)
pInfo.m_ItemsWanted = new Task_State_info.m_ItemsWanted_s[TaskInterfaceConstants.MAX_ITEM_WANTED];
if (pInfo.m_PlayerWanted == null)
pInfo.m_PlayerWanted = new Task_State_info.TASK_INFO_PLAYER[TaskInterfaceConstants.MAX_PLAYER_WANTED];
ActiveTaskList pLst = GetActiveTaskList();
uint ulCurTime = GetCurTime(); // 当前时间 // current time
ATaskTempl pTempl = null;
ActiveTaskEntry foundEntry = default;
bool hasFoundEntry = false;
if (bActiveTask)
{
// 在激活任务列表中查找 // Search in active task list
for (int i = 0; i < pLst.m_uTaskCount; i++)
{
ActiveTaskEntry CurEntry = pLst.m_TaskEntries[i];
if (CurEntry.m_ID != ulTaskId || CurEntry.m_ulTemplAddr == 0) continue;
pTempl = CurEntry.GetTempl();
foundEntry = CurEntry;
hasFoundEntry = true;
// 检查任务是否可以完成 // Check if task can be completed
if (pTempl != null && pTempl.CanFinishTask(this, CurEntry, ulCurTime))
{
pInfo.m_ulErrCode = pTempl.RecursiveCheckAward(this, pLst, CurEntry, ulCurTime, -1);
if (pInfo.m_ulErrCode == TaskInterfaceConstants.TASK_AWARD_FAIL_LEVEL_CHECK)
{
ATaskTempl pParent = pTempl;
while (pParent != null && pParent.m_FixedData.m_ulPremise_Lev_Min == 0)
pParent = pParent.m_pParent;
if (pParent != null)
pInfo.m_ulPremLevelMin = pParent.m_FixedData.m_ulPremise_Lev_Min;
}
}
pInfo.m_ulTimePassed = ulCurTime > CurEntry.m_ulTaskTime ? (ulCurTime - CurEntry.m_ulTaskTime) : 0;
if (pTempl != null && pTempl.m_FixedData.m_ulPremise_Lev_Min != 0)
{
if (pTempl.m_FixedData.m_bPremCheckMaxHistoryLevel != 0 && GetPlayerLevel() < pTempl.m_FixedData.m_ulPremise_Lev_Min)
{
pInfo.m_ulErrCode = TaskInterfaceConstants.TASK_AWARD_FAIL_LEVEL_CHECK;
pInfo.m_ulPremLevelMin = pTempl.m_FixedData.m_ulPremise_Lev_Min;
}
}
break;
}
}
else
{
pTempl = GetTaskTemplMan().GetTopTaskByID(ulTaskId);
}
if (pTempl == null)
return;
// 基本任务要求 // Basic task requirements
if (pTempl.m_FixedData.m_ulTimeLimit != 0) pInfo.m_ulTimeLimit = pTempl.m_FixedData.m_ulTimeLimit;
if (pTempl.m_FixedData.m_ulGoldWanted != 0) pInfo.m_ulGoldWanted = pTempl.m_FixedData.m_ulGoldWanted;
// 任务类型分支 // Task method branches
if (pTempl.m_FixedData.m_enumMethod == (uint)TaskMethod.enumTMCollectNumArticle)
{
for (int j = 0; j < pTempl.m_FixedData.m_ulItemsWanted; j++)
{
var iw = pTempl.m_FixedData.m_ItemsWanted[j];
pInfo.m_ItemsWanted[j].m_ulItemId = iw.m_ulItemTemplId;
pInfo.m_ItemsWanted[j].m_ulItemsToGet = iw.m_ulItemNum;
pInfo.m_ItemsWanted[j].m_ulItemsGained = ATaskTempl._get_item_count(this, iw.m_ulItemTemplId, iw.m_bCommonItem);
}
}
else if (pTempl.m_FixedData.m_enumMethod == (uint)TaskMethod.enumTMKillNumMonster)
{
int ulItemCount = 0;
int ulMonsterCount = 0;
for (int j = 0; j < pTempl.m_FixedData.m_ulMonsterWanted; j++)
{
var mw = pTempl.m_FixedData.m_MonsterWanted[j];
if (mw.m_ulDropItemId != 0)
{
pInfo.m_ItemsWanted[ulItemCount].m_ulMonsterId = mw.m_ulMonsterTemplId;
pInfo.m_ItemsWanted[ulItemCount].m_ulItemId = mw.m_ulDropItemId;
pInfo.m_ItemsWanted[ulItemCount].m_ulItemsToGet = mw.m_ulDropItemCount;
pInfo.m_ItemsWanted[ulItemCount].m_ulItemsGained = ATaskTempl._get_item_count(this, mw.m_ulDropItemId, mw.m_bDropCmnItem);
ulItemCount++;
}
else
{
pInfo.m_MonsterWanted[ulMonsterCount].m_ulMonsterId = mw.m_ulMonsterTemplId;
pInfo.m_MonsterWanted[ulMonsterCount].m_ulMonstersToKill = mw.m_ulMonsterNum;
if (bActiveTask && hasFoundEntry)
{
pInfo.m_MonsterWanted[ulMonsterCount].m_ulMonstersKilled = foundEntry.m_wMonsterNum[j];
}
ulMonsterCount++;
}
}
}
else if (pTempl.m_FixedData.m_enumMethod == (uint)TaskMethod.enumTMKillPlayer)
{
int ulItemCount = 0;
int ulPlayerCount = 0;
for (int j = 0; j < pTempl.m_FixedData.m_ulPlayerWanted; j++)
{
var pw = pTempl.m_FixedData.m_PlayerWanted[j];
if (pw.m_ulDropItemId != 0)
{
pInfo.m_ItemsWanted[ulItemCount].m_ulItemId = pw.m_ulDropItemId;
pInfo.m_ItemsWanted[ulItemCount].m_ulItemsToGet = pw.m_ulDropItemCount;
pInfo.m_ItemsWanted[ulItemCount].m_ulItemsGained = ATaskTempl._get_item_count(this, pw.m_ulDropItemId, pw.m_bDropCmnItem);
ulItemCount++;
}
else
{
pInfo.m_PlayerWanted[ulPlayerCount].m_ulPlayersToKill = pw.m_ulPlayerNum;
if (bActiveTask && hasFoundEntry)
{
pInfo.m_PlayerWanted[ulPlayerCount].m_ulPlayersKilled = foundEntry.m_wMonsterNum[j];
}
pInfo.m_PlayerWanted[ulPlayerCount].m_Requirements = pw.m_Requirements;
ulPlayerCount++;
}
}
}
else if (pTempl.m_FixedData.m_enumMethod == (uint)TaskMethod.enumTMProtectNPC)
{
pInfo.m_ulNPCToProtect = pTempl.m_FixedData.m_ulNPCToProtect;
pInfo.m_ulProtectTime = pTempl.m_FixedData.m_ulProtectTimeLen;
}
else if (pTempl.m_FixedData.m_enumMethod == (uint)TaskMethod.enumTMWaitTime)
{
pInfo.m_ulWaitTime = pTempl.m_FixedData.m_ulWaitTime;
}
else if (pTempl.m_FixedData.m_enumMethod == (uint)TaskMethod.enumTMGlobalValOK)
{
pTempl.GetGlobalTaskChar(this, pInfo.m_TaskCharArr);
}
else if (pTempl.m_FixedData.m_enumMethod == (uint)TaskMethod.enumTMReachLevel)
{
pInfo.m_ulReachLevel = pTempl.m_FixedData.m_ulReachLevel;
pInfo.m_ulReachReincarnation = pTempl.m_FixedData.m_ulReachReincarnationCount;
pInfo.m_ulReachRealm = pTempl.m_FixedData.m_ulReachRealmLevel;
}
return;
}
private uint GetCurTime()
{
// use this to avoid task hack by changing the system time
return (uint)EC_Game.GetServerAbsTime();
}
}
}
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 51efd16502ff14aba89b11b4a0a50acd
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7c4d0bbc7b1d74528bf58ca8c5e1de34
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,232 @@
### Unity UI Structure for Quest/Task System
This document outlines a high-level Unity UI structure that mirrors the legacy C++ dialogs: `DlgTask`, `DlgTaskList`, `DlgTaskTrace`, `DlgTaskConfirm`, and the hint popup in `DlgTaskConfirm`. It provides an overview diagram, scene hierarchy, and per-GameObject component lists.
---
### Diagram: UI Surfaces and Controllers
```mermaid
flowchart TD
Canvas[(Canvas)]
subgraph Windows
QuestWin[QuestWindow (DlgTask)]
TaskListWin[TaskListWindow (DlgTaskList)]
TaskConfirmWin[TaskConfirmWindow (CDlgTaskConfirm)]
TaskHintPop[TaskHintPopup (CDlgTaskHintPop)]
QuestTraceMinion[QuestTraceMinion (DlgTaskTrace)]
end
Canvas --> QuestWin
Canvas --> TaskListWin
Canvas --> TaskConfirmWin
Canvas --> TaskHintPop
Canvas --> QuestTraceMinion
subgraph Systems
TaskService[TaskService]
TaskTemplateRepo[TaskTemplateRepository]
ElementDataService[ElementDataService]
end
TaskService --> QuestWin
TaskService --> TaskListWin
TaskService --> QuestTraceMinion
TaskService --> TaskConfirmWin
TaskService --> TaskHintPop
TaskTemplateRepo --> QuestWin
TaskTemplateRepo --> TaskListWin
TaskTemplateRepo --> QuestTraceMinion
ElementDataService --> QuestWin
ElementDataService --> QuestTraceMinion
```
---
### UI Hierarchy (Scene)
```text
Canvas
├── QuestWindow (DlgTask)
│ ├── Header
│ │ ├── TitleText
│ │ └── CloseButton
│ ├── TopTabs
│ │ ├── HaveQuestToggle
│ │ └── SearchQuestToggle
│ ├── Body
│ │ ├── LeftPane
│ │ │ └── QuestTreeView (ScrollView)
│ │ └── RightPane
│ │ ├── Description (TextArea/ScrollView)
│ │ ├── ItemsAndAwards
│ │ │ ├── AwardItemsGrid
│ │ │ └── BaseAwardLabel
│ │ ├── ActionRow
│ │ │ ├── AbandonButton
│ │ │ ├── FinishTaskButton
│ │ │ └── GotoNPCButton
│ │ └── TraceRow
│ │ ├── ShowTraceToggle
│ │ └── TraceLabel
│ └── Footer
│ └── QuestCountLabel
├── TaskListWindow (DlgTaskList)
│ ├── Header (Title + Close)
│ ├── StorageInfo
│ │ ├── RefreshItemIcon
│ │ ├── RefreshRemainingLabel
│ │ └── DailyDeliverRemainingLabel
│ ├── TaskList (ScrollView)
│ └── Footer
│ ├── AcceptButton
│ └── RefreshButton
├── TaskConfirmWindow (CDlgTaskConfirm)
│ ├── Header (Title + MinimizeButton)
│ └── Content
│ ├── TaskRow[1..N]
│ │ ├── TaskNameLabel
│ │ └── DoneButton
│ └── AutoSizer
├── TaskHintPopup (CDlgTaskHintPop)
│ ├── Body
│ │ ├── MessageText
│ │ └── ShowTasksToConfirmButton (flashing)
│ └── CloseButton
└── QuestTraceMinion (DlgTaskTrace)
├── Header
│ ├── Title
│ ├── CollapseCheckbox
│ └── ModeTabs (Traced | Titles | Contribution)
├── TraceText (TextArea/ScrollView + name-links)
└── InlineButtons (positioned near hovered line)
├── UntraceButton
├── MapButton
├── ChatButton
└── FinishByContributionButton
```
---
### Components per GameObject
- Canvas
- Components: Canvas, Canvas Scaler, Graphic Raycaster
- Notes: Screen Space - Overlay (default) or Camera; match reference resolution for DPI scaling
- QuestWindow (DlgTask)
- Components: RectTransform, CanvasRenderer, Image
- Scripts: QuestWindowController (maps to `DlgTask` behaviors)
- Children and key components:
- Header: HorizontalLayoutGroup, Image
- TitleText: TextMeshProUGUI
- CloseButton: Button, Image
- TopTabs: HorizontalLayoutGroup
- HaveQuestToggle: Toggle (ToggleGroup), Image, TextMeshProUGUI
- SearchQuestToggle: Toggle (ToggleGroup), Image, TextMeshProUGUI
- Body: HorizontalLayoutGroup
- LeftPane
- QuestTreeView: ScrollRect, Mask, Image
- Viewport: RectTransform, Mask, Image
- Content: VerticalLayoutGroup, ContentSizeFitter
- TreeItem prefab(s): Button, LayoutElement, TextMeshProUGUI, Optional Expand/Collapse Toggle
- RightPane
- Description: ScrollRect, Mask, Image
- Viewport -> Content: TextMeshProUGUI (rich text, link handlers)
- ItemsAndAwards
- AwardItemsGrid: GridLayoutGroup; ItemIcon prefab: Image, Button, TooltipTrigger
- BaseAwardLabel: TextMeshProUGUI
- ActionRow: HorizontalLayoutGroup
- AbandonButton: Button, Image, TextMeshProUGUI
- FinishTaskButton: Button, Image, TextMeshProUGUI
- GotoNPCButton: Button, Image, TextMeshProUGUI
- TraceRow: HorizontalLayoutGroup
- ShowTraceToggle: Toggle, TextMeshProUGUI
- TraceLabel: TextMeshProUGUI
- Footer
- QuestCountLabel: TextMeshProUGUI
- TaskListWindow (DlgTaskList)
- Components: RectTransform, Image
- Scripts: TaskListWindowController (maps to `DlgTaskList` behaviors)
- Children:
- Header: TitleText (TextMeshProUGUI), CloseButton (Button)
- StorageInfo: HorizontalLayoutGroup
- RefreshItemIcon: Image, TooltipTrigger
- RefreshRemainingLabel: TextMeshProUGUI
- DailyDeliverRemainingLabel: TextMeshProUGUI
- TaskList: ScrollRect, Mask, Image
- Viewport -> Content: VerticalLayoutGroup
- TaskRow prefab: Button, LayoutElement, TextMeshProUGUI
- Footer: HorizontalLayoutGroup
- AcceptButton: Button
- RefreshButton: Button
- TaskConfirmWindow (CDlgTaskConfirm)
- Components: RectTransform, Image, VerticalLayoutGroup
- Scripts: TaskConfirmWindowController
- Children:
- Header: TitleText (TextMeshProUGUI), MinimizeButton (Button)
- Content: VerticalLayoutGroup, ContentSizeFitter
- TaskRow prefab (repeat):
- TaskNameLabel: TextMeshProUGUI
- DoneButton: Button
- TaskHintPopup (CDlgTaskHintPop)
- Components: RectTransform, Image, ContentSizeFitter
- Scripts: TaskHintPopupController
- Children:
- MessageText: TextMeshProUGUI
- ShowTasksToConfirmButton: Button (with flashing/animation)
- CloseButton: Button
- QuestTraceMinion (DlgTaskTrace)
- Components: RectTransform, Image
- Scripts: QuestTraceMinionController (name-link text + hover inline buttons)
- Children:
- Header: HorizontalLayoutGroup
- Title: TextMeshProUGUI
- CollapseCheckbox: Toggle
- ModeTabs: ToggleGroup
- TracedToggle: Toggle, TextMeshProUGUI
- TitlesToggle: Toggle, TextMeshProUGUI
- ContributionToggle: Toggle, TextMeshProUGUI
- TraceText: ScrollRect, Mask, Image
- Viewport -> Content: TextMeshProUGUI (supports name-links via hyperlink callbacks)
- InlineButtons (anchored to hovered line area):
- UntraceButton: Button (hidden by default)
- MapButton: Button
- ChatButton: Button
- FinishByContributionButton: Button
---
### Mapping From C++ Dialogs to Unity Objects
- DlgTask → QuestWindow + QuestWindowController
- Tabs: Have vs Search mode → ToggleGroup state
- TreeView + RightPane (Description, Items/Awards, Abandon/Finish/GotoNPC)
- DlgTaskList → TaskListWindow + TaskListWindowController
- Storage tasks, RefreshItem icon, Accept/Refresh actions
- DlgTaskConfirm → TaskConfirmWindow + TaskConfirmWindowController
- Dynamic list of confirmable tasks with Done buttons; auto-resize
- CDlgTaskHintPop → TaskHintPopup + TaskHintPopupController
- Flashing button to open TaskConfirmWindow
- DlgTaskTrace → QuestTraceMinion + QuestTraceMinionController
- Collapsible panel; modes: Traced | Titles | Contribution
- Name-linked lines with inline Untrace/Map/Chat/Finish-by-Contribution
---
### Notes and Recommendations
- Prefer TextMeshPro for text rendering and link handling.
- Implement a simple runtime TreeView using nested layout elements and expand/collapse toggles; or use UI Toolkit if available.
- Keep each window as a prefab to support reuse and additive loading; wire controllers via serialized references.
- Centralize data access in `TaskService`, `TaskTemplateRepository`, and `ElementDataService` to mirror `TaskTemplMan`, `ElementDataMan`, and task interfaces.
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: b430595362eaf4a248b120d46a7dc5e2
guid: 02427e8a29d684a1da528b3d56458908
TextScriptImporter:
externalObjects: {}
userData:
@@ -2,6 +2,50 @@ namespace BrewMonster.Scripts.Task
{
public interface TaskInterface
{
bool Init(object[] pActiveListBuf, int iActiveListLen, object[] pFinishedListBuf, int iFinishedListLen, object[] pFinishedTimeListBuf, int iFinishedTimeListLen, object[] pFinishedCountListBuf, int iFinishedCountListLen, object[] pStorageTaskListBuf, int iStorageTaskListLen);
bool Init(byte[] pActiveListBuf, int iActiveListLen, byte[] pFinishedListBuf,
int iFinishedListLen, byte[] pFinishedTimeListBuf, int iFinishedTimeListLen,
byte[] pFinishedCountListBuf, int iFinishedCountListLen, byte[] pStorageTaskListBuf,
int iStorageTaskListLen);
/// <summary>
/// Get task state info for a task id. 清理并填充任务状态信息 // Clean and fill task state info
/// </summary>
/// <param name="ulTaskId">任务ID // Task ID</param>
/// <param name="pInfo">输出任务状态 // Output task state</param>
/// <param name="bActiveTask">是否在激活列表中查找 // Whether to search in active list</param>
void GetTaskStateInfo(uint ulTaskId, ref Task_State_info pInfo, bool bActiveTask);
bool CheckTaskForbid(uint task_id);
bool IsAtCrossServer();
bool IsDeliverLegal();
int GetCommonItemCount(uint ulCommonItem);
int GetTaskItemCount(uint ulTaskItem);
uint GetPlayerLevel();
uint GetGoldNum();
int GetGlobalValue(int lKey);
byte GetShapeMask();
int GetPos(float[] pos);
bool CheckSimpleTaskFinshConditon(uint task_id);
int GetFactionConsumeContrib();
int GetFactionExpContrib();
bool HasTask(uint ulTaskId);
#if _TASK_CLIENT
void GetTaskAwardPreview(uint ulTaskId,ref Task_Award_Preview p, bool bActiveTask = true);
uint GetTaskCount();
uint GetTaskId(uint ulIndex);
#endif
}
}
@@ -1,290 +0,0 @@
if(m_ID == 33519UL){
// Log all non-pointer properties of ATaskTemplFixedData, one per line
a_LogOutput(1, "[MH] m_ID=%lu", m_ID);
// m_szName skipped as complex char array; name already converted above
a_LogOutput(1, "[MH] m_bHasSign=%d", (int)m_bHasSign);
a_LogOutput(1, "[MH] m_ulType=%lu", m_ulType);
a_LogOutput(1, "[MH] m_ulTimeLimit=%lu", m_ulTimeLimit);
a_LogOutput(1, "[MH] m_bOfflineFail=%d", (int)m_bOfflineFail);
a_LogOutput(1, "[MH] m_bAbsFail=%d", (int)m_bAbsFail);
a_LogOutput(1, "[MH] m_tmAbsFailTime={year=%ld,month=%ld,day=%ld,hour=%ld,min=%ld,wday=%ld}",
(long)m_tmAbsFailTime.year,(long)m_tmAbsFailTime.month,(long)m_tmAbsFailTime.day,(long)m_tmAbsFailTime.hour,(long)m_tmAbsFailTime.min,(long)m_tmAbsFailTime.wday);
a_LogOutput(1, "[MH] m_bItemNotTakeOff=%d", (int)m_bItemNotTakeOff);
a_LogOutput(1, "[MH] m_bAbsTime=%d", (int)m_bAbsTime);
a_LogOutput(1, "[MH] m_ulTimetable=%lu", m_ulTimetable);
{
char buf[1024];
int off = 0;
off += snprintf(buf + off, (size_t)(sizeof(buf) - off), "[");
for (unsigned long i = 0; i < (unsigned long)MAX_TIMETABLE_SIZE; ++i){
off += snprintf(buf + off, (size_t)(sizeof(buf) - off), "%s%d", (i?",":""), (int)m_tmType[i]);
if (off < 0 || off >= (int)sizeof(buf)) break;
}
snprintf(buf + (off<0?0:off), (size_t)((off<0?0:sizeof(buf)-off)), "]");
a_LogOutput(1, "[MH] m_tmType=%s", buf);
}
a_LogOutput(1, "[MH] m_lAvailFrequency=%ld", m_lAvailFrequency);
a_LogOutput(1, "[MH] m_lPeriodLimit=%ld", m_lPeriodLimit);
a_LogOutput(1, "[MH] m_bChooseOne=%d", (int)m_bChooseOne);
a_LogOutput(1, "[MH] m_bRandOne=%d", (int)m_bRandOne);
a_LogOutput(1, "[MH] m_bExeChildInOrder=%d", (int)m_bExeChildInOrder);
a_LogOutput(1, "[MH] m_bParentAlsoFail=%d", (int)m_bParentAlsoFail);
a_LogOutput(1, "[MH] m_bParentAlsoSucc=%d", (int)m_bParentAlsoSucc);
a_LogOutput(1, "[MH] m_bCanGiveUp=%d", (int)m_bCanGiveUp);
a_LogOutput(1, "[MH] m_bCanRedo=%d", (int)m_bCanRedo);
a_LogOutput(1, "[MH] m_bCanRedoAfterFailure=%d", (int)m_bCanRedoAfterFailure);
a_LogOutput(1, "[MH] m_bClearAsGiveUp=%d", (int)m_bClearAsGiveUp);
a_LogOutput(1, "[MH] m_bNeedRecord=%d", (int)m_bNeedRecord);
a_LogOutput(1, "[MH] m_bFailAsPlayerDie=%d", (int)m_bFailAsPlayerDie);
a_LogOutput(1, "[MH] m_ulMaxReceiver=%lu", m_ulMaxReceiver);
a_LogOutput(1, "[MH] m_bDelvInZone=%d", (int)m_bDelvInZone);
a_LogOutput(1, "[MH] m_ulDelvWorld=%lu", m_ulDelvWorld);
a_LogOutput(1, "[MH] m_ulDelvRegionCnt=%lu", m_ulDelvRegionCnt);
a_LogOutput(1, "[MH] m_bEnterRegionFail=%d", (int)m_bEnterRegionFail);
a_LogOutput(1, "[MH] m_ulEnterRegionWorld=%lu", m_ulEnterRegionWorld);
a_LogOutput(1, "[MH] m_ulEnterRegionCnt=%lu", m_ulEnterRegionCnt);
a_LogOutput(1, "[MH] m_bLeaveRegionFail=%d", (int)m_bLeaveRegionFail);
a_LogOutput(1, "[MH] m_ulLeaveRegionWorld=%lu", m_ulLeaveRegionWorld);
a_LogOutput(1, "[MH] m_ulLeaveRegionCnt=%lu", m_ulLeaveRegionCnt);
a_LogOutput(1, "[MH] m_bLeaveForceFail=%d", (int)m_bLeaveForceFail);
a_LogOutput(1, "[MH] m_bTransTo=%d", (int)m_bTransTo);
a_LogOutput(1, "[MH] m_ulTransWldId=%lu", m_ulTransWldId);
a_LogOutput(1, "[MH] m_TransPt={x=%f,y=%f,z=%f}", m_TransPt.x, m_TransPt.y, m_TransPt.z);
a_LogOutput(1, "[MH] m_lMonsCtrl=%ld", m_lMonsCtrl);
a_LogOutput(1, "[MH] m_bTrigCtrl=%d", (int)m_bTrigCtrl);
a_LogOutput(1, "[MH] m_bAutoDeliver=%d", (int)m_bAutoDeliver);
a_LogOutput(1, "[MH] m_bDisplayInExclusiveUI=%d", (int)m_bDisplayInExclusiveUI);
a_LogOutput(1, "[MH] m_bReadyToNotifyServer=%d", (int)m_bReadyToNotifyServer);
a_LogOutput(1, "[MH] m_bUsedInTokenShop=%d", (int)m_bUsedInTokenShop);
a_LogOutput(1, "[MH] m_bDeathTrig=%d", (int)m_bDeathTrig);
a_LogOutput(1, "[MH] m_bClearAcquired=%d", (int)m_bClearAcquired);
a_LogOutput(1, "[MH] m_ulSuitableLevel=%lu", m_ulSuitableLevel);
a_LogOutput(1, "[MH] m_bShowPrompt=%d", (int)m_bShowPrompt);
a_LogOutput(1, "[MH] m_bKeyTask=%d", (int)m_bKeyTask);
a_LogOutput(1, "[MH] m_ulDelvNPC=%lu", m_ulDelvNPC);
a_LogOutput(1, "[MH] m_ulAwardNPC=%lu", m_ulAwardNPC);
a_LogOutput(1, "[MH] m_bSkillTask=%d", (int)m_bSkillTask);
a_LogOutput(1, "[MH] m_bCanSeekOut=%d", (int)m_bCanSeekOut);
a_LogOutput(1, "[MH] m_bShowDirection=%d", (int)m_bShowDirection);
a_LogOutput(1, "[MH] m_bMarriage=%d", (int)m_bMarriage);
a_LogOutput(1, "[MH] m_ulChangeKeyCnt=%lu", m_ulChangeKeyCnt);
a_LogOutput(1, "[MH] m_bSwitchSceneFail=%d", (int)m_bSwitchSceneFail);
a_LogOutput(1, "[MH] m_bHidden=%d", (int)m_bHidden);
a_LogOutput(1, "[MH] m_bDeliverySkill=%d", (int)m_bDeliverySkill);
a_LogOutput(1, "[MH] m_iDeliveredSkillID=%d", m_iDeliveredSkillID);
a_LogOutput(1, "[MH] m_iDeliveredSkillLevel=%d", m_iDeliveredSkillLevel);
a_LogOutput(1, "[MH] m_bShowGfxFinished=%d", (int)m_bShowGfxFinished);
a_LogOutput(1, "[MH] m_bChangePQRanking=%d", (int)m_bChangePQRanking);
a_LogOutput(1, "[MH] m_bCompareItemAndInventory=%d", (int)m_bCompareItemAndInventory);
a_LogOutput(1, "[MH] m_ulInventorySlotNum=%lu", m_ulInventorySlotNum);
a_LogOutput(1, "[MH] m_bPQTask=%d", (int)m_bPQTask);
a_LogOutput(1, "[MH] m_ulPQExpCnt=%lu", m_ulPQExpCnt);
a_LogOutput(1, "[MH] m_bPQSubTask=%d", (int)m_bPQSubTask);
a_LogOutput(1, "[MH] m_bClearContrib=%d", (int)m_bClearContrib);
a_LogOutput(1, "[MH] m_ulMonsterContribCnt=%lu", m_ulMonsterContribCnt);
a_LogOutput(1, "[MH] m_iPremNeedRecordTasksNum=%d", m_iPremNeedRecordTasksNum);
a_LogOutput(1, "[MH] m_bShowByNeedRecordTasksNum=%d", (int)m_bShowByNeedRecordTasksNum);
a_LogOutput(1, "[MH] m_iPremiseFactionContrib=%d", m_iPremiseFactionContrib);
a_LogOutput(1, "[MH] m_bShowByFactionContrib=%d", (int)m_bShowByFactionContrib);
a_LogOutput(1, "[MH] m_bAccountTaskLimit=%d", (int)m_bAccountTaskLimit);
a_LogOutput(1, "[MH] m_bRoleTaskLimit=%d", (int)m_bRoleTaskLimit);
a_LogOutput(1, "[MH] m_ulAccountTaskLimitCnt=%lu", m_ulAccountTaskLimitCnt);
a_LogOutput(1, "[MH] m_bLeaveFactionFail=%d", (int)m_bLeaveFactionFail);
a_LogOutput(1, "[MH] m_bNotIncCntWhenFailed=%d", (int)m_bNotIncCntWhenFailed);
a_LogOutput(1, "[MH] m_bNotClearItemWhenFailed=%d", (int)m_bNotClearItemWhenFailed);
a_LogOutput(1, "[MH] m_bDisplayInTitleTaskUI=%d", (int)m_bDisplayInTitleTaskUI);
a_LogOutput(1, "[MH] m_ucPremiseTransformedForm=%u", (unsigned int)m_ucPremiseTransformedForm);
a_LogOutput(1, "[MH] m_bShowByTransformed=%d", (int)m_bShowByTransformed);
a_LogOutput(1, "[MH] m_ulPremise_Lev_Min=%lu", m_ulPremise_Lev_Min);
a_LogOutput(1, "[MH] m_ulPremise_Lev_Max=%lu", m_ulPremise_Lev_Max);
a_LogOutput(1, "[MH] m_bPremCheckMaxHistoryLevel=%lu", m_bPremCheckMaxHistoryLevel);
a_LogOutput(1, "[MH] m_bShowByLev=%d", (int)m_bShowByLev);
a_LogOutput(1, "[MH] m_bPremCheckReincarnation=%d", (int)m_bPremCheckReincarnation);
a_LogOutput(1, "[MH] m_ulPremReincarnationMin=%lu", m_ulPremReincarnationMin);
a_LogOutput(1, "[MH] m_ulPremReincarnationMax=%lu", m_ulPremReincarnationMax);
a_LogOutput(1, "[MH] m_bShowByReincarnation=%d", (int)m_bShowByReincarnation);
a_LogOutput(1, "[MH] m_bPremCheckRealmLevel=%d", (int)m_bPremCheckRealmLevel);
a_LogOutput(1, "[MH] m_ulPremRealmLevelMin=%lu", m_ulPremRealmLevelMin);
a_LogOutput(1, "[MH] m_ulPremRealmLevelMax=%lu", m_ulPremRealmLevelMax);
a_LogOutput(1, "[MH] m_bPremCheckRealmExpFull=%d", (int)m_bPremCheckRealmExpFull);
a_LogOutput(1, "[MH] m_bShowByRealmLevel=%d", (int)m_bShowByRealmLevel);
a_LogOutput(1, "[MH] m_ulPremItems=%lu", m_ulPremItems);
a_LogOutput(1, "[MH] m_bShowByItems=%d", (int)m_bShowByItems);
a_LogOutput(1, "[MH] m_bPremItemsAnyOne=%d", (int)m_bPremItemsAnyOne);
a_LogOutput(1, "[MH] m_ulGivenItems=%lu", m_ulGivenItems);
a_LogOutput(1, "[MH] m_ulGivenCmnCount=%lu", m_ulGivenCmnCount);
a_LogOutput(1, "[MH] m_ulGivenTskCount=%lu", m_ulGivenTskCount);
a_LogOutput(1, "[MH] m_ulPremise_Deposit=%lu", m_ulPremise_Deposit);
a_LogOutput(1, "[MH] m_bShowByDeposit=%d", (int)m_bShowByDeposit);
a_LogOutput(1, "[MH] m_lPremise_Reputation=%ld", m_lPremise_Reputation);
a_LogOutput(1, "[MH] m_lPremise_RepuMax=%ld", m_lPremise_RepuMax);
a_LogOutput(1, "[MH] m_bShowByRepu=%d", (int)m_bShowByRepu);
a_LogOutput(1, "[MH] m_ulPremise_Task_Count=%lu", m_ulPremise_Task_Count);
{
char buf[1024];
int off = 0;
off += snprintf(buf + off, (size_t)(sizeof(buf) - off), "[");
for (unsigned long i = 0; i < m_ulPremise_Task_Count && i < (unsigned long)MAX_PREM_TASK_COUNT; ++i){
off += snprintf(buf + off, (size_t)(sizeof(buf) - off), "%s%lu", (i?",":""), m_ulPremise_Tasks[i]);
if (off < 0 || off >= (int)sizeof(buf)) break;
}
snprintf(buf + (off<0?0:off), (size_t)((off<0?0:sizeof(buf)-off)), "]");
a_LogOutput(1, "[MH] m_ulPremise_Tasks=%s", buf);
}
a_LogOutput(1, "[MH] m_bShowByPreTask=%d", (int)m_bShowByPreTask);
a_LogOutput(1, "[MH] m_ulPremise_Task_Least_Num=%lu", m_ulPremise_Task_Least_Num);
a_LogOutput(1, "[MH] m_ulPremise_Period=%lu", m_ulPremise_Period);
a_LogOutput(1, "[MH] m_bShowByPeriod=%d", (int)m_bShowByPeriod);
a_LogOutput(1, "[MH] m_ulPremise_Faction=%lu", m_ulPremise_Faction);
a_LogOutput(1, "[MH] m_iPremise_FactionRole=%d", m_iPremise_FactionRole);
a_LogOutput(1, "[MH] m_bShowByFaction=%d", (int)m_bShowByFaction);
a_LogOutput(1, "[MH] m_ulGender=%lu", m_ulGender);
a_LogOutput(1, "[MH] m_bShowByGender=%d", (int)m_bShowByGender);
a_LogOutput(1, "[MH] m_ulOccupations=%lu", m_ulOccupations);
{
char buf[1024];
int off = 0;
off += snprintf(buf + off, (size_t)(sizeof(buf) - off), "[");
for (unsigned long i = 0; i < m_ulOccupations && i < (unsigned long)MAX_OCCUPATIONS; ++i){
off += snprintf(buf + off, (size_t)(sizeof(buf) - off), "%s%lu", (i?",":""), m_Occupations[i]);
if (off < 0 || off >= (int)sizeof(buf)) break;
}
snprintf(buf + (off<0?0:off), (size_t)((off<0?0:sizeof(buf)-off)), "]");
a_LogOutput(1, "[MH] m_Occupations=%s", buf);
}
a_LogOutput(1, "[MH] m_bShowByOccup=%d", (int)m_bShowByOccup);
a_LogOutput(1, "[MH] m_bPremise_Spouse=%d", (int)m_bPremise_Spouse);
a_LogOutput(1, "[MH] m_bShowBySpouse=%d", (int)m_bShowBySpouse);
a_LogOutput(1, "[MH] m_bPremiseWeddingOwner=%d", (int)m_bPremiseWeddingOwner);
a_LogOutput(1, "[MH] m_bShowByWeddingOwner=%d", (int)m_bShowByWeddingOwner);
a_LogOutput(1, "[MH] m_bGM=%d", (int)m_bGM);
a_LogOutput(1, "[MH] m_bShieldUser=%d", (int)m_bShieldUser);
a_LogOutput(1, "[MH] m_bShowByRMB=%d", (int)m_bShowByRMB);
a_LogOutput(1, "[MH] m_ulPremRMBMin=%lu", m_ulPremRMBMin);
a_LogOutput(1, "[MH] m_ulPremRMBMax=%lu", m_ulPremRMBMax);
a_LogOutput(1, "[MH] m_bCharTime=%d", (int)m_bCharTime);
a_LogOutput(1, "[MH] m_bShowByCharTime=%d", (int)m_bShowByCharTime);
a_LogOutput(1, "[MH] m_iCharStartTime=%d", m_iCharStartTime);
a_LogOutput(1, "[MH] m_iCharEndTime=%d", m_iCharEndTime);
a_LogOutput(1, "[MH] m_tmCharEndTime={year=%ld,month=%ld,day=%ld,hour=%ld,min=%ld,wday=%ld}",
(long)m_tmCharEndTime.year,(long)m_tmCharEndTime.month,(long)m_tmCharEndTime.day,(long)m_tmCharEndTime.hour,(long)m_tmCharEndTime.min,(long)m_tmCharEndTime.wday);
a_LogOutput(1, "[MH] m_ulCharTimeGreaterThan=%lu", m_ulCharTimeGreaterThan);
a_LogOutput(1, "[MH] m_ulPremise_Cotask=%lu", m_ulPremise_Cotask);
a_LogOutput(1, "[MH] m_ulCoTaskCond=%lu", m_ulCoTaskCond);
a_LogOutput(1, "[MH] m_ulMutexTaskCount=%lu", m_ulMutexTaskCount);
{
char buf[512];
int off = 0;
off += snprintf(buf + off, (size_t)(sizeof(buf) - off), "[");
for (unsigned long i = 0; i < m_ulMutexTaskCount && i < (unsigned long)MAX_MUTEX_TASK_COUNT; ++i){
off += snprintf(buf + off, (size_t)(sizeof(buf) - off), "%s%lu", (i?",":""), m_ulMutexTasks[i]);
if (off < 0 || off >= (int)sizeof(buf)) break;
}
snprintf(buf + (off<0?0:off), (size_t)((off<0?0:sizeof(buf)-off)), "]");
a_LogOutput(1, "[MH] m_ulMutexTasks=%s", buf);
}
{
char buf[256];
snprintf(buf, sizeof(buf), "[%ld,%ld,%ld,%ld]", (long)m_lSkillLev[0], (long)m_lSkillLev[1], (long)m_lSkillLev[2], (long)m_lSkillLev[3]);
a_LogOutput(1, "[MH] m_lSkillLev=%s", buf);
}
a_LogOutput(1, "[MH] m_DynTaskType=%d", (int)m_DynTaskType);
a_LogOutput(1, "[MH] m_ulSpecialAward=%lu", m_ulSpecialAward);
a_LogOutput(1, "[MH] m_bTeamwork=%d", (int)m_bTeamwork);
a_LogOutput(1, "[MH] m_bRcvByTeam=%d", (int)m_bRcvByTeam);
a_LogOutput(1, "[MH] m_bSharedTask=%d", (int)m_bSharedTask);
a_LogOutput(1, "[MH] m_bSharedAchieved=%d", (int)m_bSharedAchieved);
a_LogOutput(1, "[MH] m_bCheckTeammate=%d", (int)m_bCheckTeammate);
a_LogOutput(1, "[MH] m_fTeammateDist=%f", m_fTeammateDist);
a_LogOutput(1, "[MH] m_bAllFail=%d", (int)m_bAllFail);
a_LogOutput(1, "[MH] m_bCapFail=%d", (int)m_bCapFail);
a_LogOutput(1, "[MH] m_bCapSucc=%d", (int)m_bCapSucc);
a_LogOutput(1, "[MH] m_fSuccDist=%f", m_fSuccDist);
a_LogOutput(1, "[MH] m_bDismAsSelfFail=%d", (int)m_bDismAsSelfFail);
a_LogOutput(1, "[MH] m_bRcvChckMem=%d", (int)m_bRcvChckMem);
a_LogOutput(1, "[MH] m_fRcvMemDist=%f", m_fRcvMemDist);
a_LogOutput(1, "[MH] m_bCntByMemPos=%d", (int)m_bCntByMemPos);
a_LogOutput(1, "[MH] m_fCntMemDist=%f", m_fCntMemDist);
a_LogOutput(1, "[MH] m_bAllSucc=%d", (int)m_bAllSucc);
a_LogOutput(1, "[MH] m_bCoupleOnly=%d", (int)m_bCoupleOnly);
a_LogOutput(1, "[MH] m_bDistinguishedOcc=%d", (int)m_bDistinguishedOcc);
a_LogOutput(1, "[MH] m_ulTeamMemsWanted=%lu", m_ulTeamMemsWanted);
a_LogOutput(1, "[MH] m_bShowByTeam=%d", (int)m_bShowByTeam);
a_LogOutput(1, "[MH] m_bPremNeedComp=%d", (int)m_bPremNeedComp);
a_LogOutput(1, "[MH] m_nPremExp1AndOrExp2=%d", m_nPremExp1AndOrExp2);
a_LogOutput(1, "[MH] m_Prem1KeyValue={lType=%d,lNum=%ld,op=%d,rType=%d,rNum=%ld}", m_Prem1KeyValue.nLeftType, (long)m_Prem1KeyValue.lLeftNum, m_Prem1KeyValue.nCompOper, m_Prem1KeyValue.nRightType, (long)m_Prem1KeyValue.lRightNum);
a_LogOutput(1, "[MH] m_Prem2KeyValue={lType=%d,lNum=%ld,op=%d,rType=%d,rNum=%ld}", m_Prem2KeyValue.nLeftType, (long)m_Prem2KeyValue.lLeftNum, m_Prem2KeyValue.nCompOper, m_Prem2KeyValue.nRightType, (long)m_Prem2KeyValue.lRightNum);
a_LogOutput(1, "[MH] m_bPremCheckForce=%d", (int)m_bPremCheckForce);
a_LogOutput(1, "[MH] m_iPremForce=%d", m_iPremForce);
a_LogOutput(1, "[MH] m_bShowByForce=%d", (int)m_bShowByForce);
a_LogOutput(1, "[MH] m_iPremForceReputation=%d", m_iPremForceReputation);
a_LogOutput(1, "[MH] m_bShowByForceReputation=%d", (int)m_bShowByForceReputation);
a_LogOutput(1, "[MH] m_iPremForceContribution=%d", m_iPremForceContribution);
a_LogOutput(1, "[MH] m_bShowByForceContribution=%d", (int)m_bShowByForceContribution);
a_LogOutput(1, "[MH] m_iPremForceExp=%d", m_iPremForceExp);
a_LogOutput(1, "[MH] m_bShowByForceExp=%d", (int)m_bShowByForceExp);
a_LogOutput(1, "[MH] m_iPremForceSP=%d", m_iPremForceSP);
a_LogOutput(1, "[MH] m_bShowByForceSP=%d", (int)m_bShowByForceSP);
a_LogOutput(1, "[MH] m_iPremForceActivityLevel=%d", m_iPremForceActivityLevel);
a_LogOutput(1, "[MH] m_bShowByForceActivityLevel=%d", (int)m_bShowByForceActivityLevel);
a_LogOutput(1, "[MH] m_bPremIsKing=%d", (int)m_bPremIsKing);
a_LogOutput(1, "[MH] m_bShowByKing=%d", (int)m_bShowByKing);
a_LogOutput(1, "[MH] m_bPremNotInTeam=%d", (int)m_bPremNotInTeam);
a_LogOutput(1, "[MH] m_bShowByNotInTeam=%d", (int)m_bShowByNotInTeam);
a_LogOutput(1, "[MH] m_iPremTitleNumTotal=%lu", m_iPremTitleNumTotal);
a_LogOutput(1, "[MH] m_iPremTitleNumRequired=%lu", m_iPremTitleNumRequired);
a_LogOutput(1, "[MH] m_bShowByTitle=%d", (int)m_bShowByTitle);
{
char buf[128];
snprintf(buf, sizeof(buf), "[%d,%d]", m_iPremHistoryStageIndex[0], m_iPremHistoryStageIndex[1]);
a_LogOutput(1, "[MH] m_iPremHistoryStageIndex=%s", buf);
}
a_LogOutput(1, "[MH] m_bShowByHistoryStage=%d", (int)m_bShowByHistoryStage);
a_LogOutput(1, "[MH] m_ulPremGeneralCardCount=%lu", m_ulPremGeneralCardCount);
a_LogOutput(1, "[MH] m_bShowByGeneralCard=%d", (int)m_bShowByGeneralCard);
a_LogOutput(1, "[MH] m_iPremGeneralCardRank=%d", m_iPremGeneralCardRank);
a_LogOutput(1, "[MH] m_ulPremGeneralCardRankCount=%lu", m_ulPremGeneralCardRankCount);
a_LogOutput(1, "[MH] m_bShowByGeneralCardRank=%d", (int)m_bShowByGeneralCardRank);
a_LogOutput(1, "[MH] m_enumMethod=%lu", m_enumMethod);
a_LogOutput(1, "[MH] m_enumFinishType=%lu", m_enumFinishType);
a_LogOutput(1, "[MH] m_ulPlayerWanted=%lu", m_ulPlayerWanted);
a_LogOutput(1, "[MH] m_ulMonsterWanted=%lu", m_ulMonsterWanted);
a_LogOutput(1, "[MH] m_ulItemsWanted=%lu", m_ulItemsWanted);
a_LogOutput(1, "[MH] m_ulGoldWanted=%lu", m_ulGoldWanted);
a_LogOutput(1, "[MH] m_iFactionContribWanted=%d", m_iFactionContribWanted);
a_LogOutput(1, "[MH] m_iFactionExpContribWanted=%d", m_iFactionExpContribWanted);
a_LogOutput(1, "[MH] m_ulNPCToProtect=%lu", m_ulNPCToProtect);
a_LogOutput(1, "[MH] m_ulProtectTimeLen=%lu", m_ulProtectTimeLen);
a_LogOutput(1, "[MH] m_ulNPCMoving=%lu", m_ulNPCMoving);
a_LogOutput(1, "[MH] m_ulNPCDestSite=%lu", m_ulNPCDestSite);
a_LogOutput(1, "[MH] m_ulReachSiteCnt=%lu", m_ulReachSiteCnt);
a_LogOutput(1, "[MH] m_ulReachSiteId=%lu", m_ulReachSiteId);
a_LogOutput(1, "[MH] m_ulWaitTime=%lu", m_ulWaitTime);
a_LogOutput(1, "[MH] m_TreasureStartZone={x=%f,y=%f,z=%f}", m_TreasureStartZone.x, m_TreasureStartZone.y, m_TreasureStartZone.z);
a_LogOutput(1, "[MH] m_ucZonesNumX=%u", (unsigned int)m_ucZonesNumX);
a_LogOutput(1, "[MH] m_ucZonesNumZ=%u", (unsigned int)m_ucZonesNumZ);
a_LogOutput(1, "[MH] m_ucZoneSide=%u", (unsigned int)m_ucZoneSide);
a_LogOutput(1, "[MH] m_ulLeaveSiteCnt=%lu", m_ulLeaveSiteCnt);
a_LogOutput(1, "[MH] m_ulLeaveSiteId=%lu", m_ulLeaveSiteId);
a_LogOutput(1, "[MH] m_bFinNeedComp=%d", (int)m_bFinNeedComp);
a_LogOutput(1, "[MH] m_nFinExp1AndOrExp2=%d", m_nFinExp1AndOrExp2);
a_LogOutput(1, "[MH] m_Fin1KeyValue={lType=%d,lNum=%ld,op=%d,rType=%d,rNum=%ld}", m_Fin1KeyValue.nLeftType, (long)m_Fin1KeyValue.lLeftNum, m_Fin1KeyValue.nCompOper, m_Fin1KeyValue.nRightType, (long)m_Fin1KeyValue.lRightNum);
a_LogOutput(1, "[MH] m_Fin2KeyValue={lType=%d,lNum=%ld,op=%d,rType=%d,rNum=%ld}", m_Fin2KeyValue.nLeftType, (long)m_Fin2KeyValue.lLeftNum, m_Fin2KeyValue.nCompOper, m_Fin2KeyValue.nRightType, (long)m_Fin2KeyValue.lRightNum);
a_LogOutput(1, "[MH] m_ulExpCnt=%lu", m_ulExpCnt);
a_LogOutput(1, "[MH] m_ulTaskCharCnt=%lu", m_ulTaskCharCnt);
a_LogOutput(1, "[MH] m_ucTransformedForm=%u", (unsigned int)m_ucTransformedForm);
a_LogOutput(1, "[MH] m_ulReachLevel=%lu", m_ulReachLevel);
a_LogOutput(1, "[MH] m_ulReachReincarnationCount=%lu", m_ulReachReincarnationCount);
a_LogOutput(1, "[MH] m_ulReachRealmLevel=%lu", m_ulReachRealmLevel);
a_LogOutput(1, "[MH] m_uiEmotion=%u", (unsigned int)m_uiEmotion);
a_LogOutput(1, "[MH] m_ulAwardType_S=%lu", m_ulAwardType_S);
a_LogOutput(1, "[MH] m_ulAwardType_F=%lu", m_ulAwardType_F);
a_LogOutput(1, "[MH] m_ulParent=%lu", m_ulParent);
a_LogOutput(1, "[MH] m_ulPrevSibling=%lu", m_ulPrevSibling);
a_LogOutput(1, "[MH] m_ulNextSibling=%lu", m_ulNextSibling);
a_LogOutput(1, "[MH] m_ulFirstChild=%lu", m_ulFirstChild);
a_LogOutput(1, "[MH] m_bIsLibraryTask=%d", (int)m_bIsLibraryTask);
a_LogOutput(1, "[MH] m_fLibraryTasksProbability=%f", m_fLibraryTasksProbability);
a_LogOutput(1, "[MH] m_bIsUniqueStorageTask=%d", (int)m_bIsUniqueStorageTask);
a_LogOutput(1, "[MH] m_iWorldContribution=%d", m_iWorldContribution);
}
+101 -10
View File
@@ -29,20 +29,66 @@ namespace PerfectWorld.Scripts.Task
public char m_NextSblIndex; // Next sibling node index
public char m_ChildIndex; // Child node index
public char m_uState; // Task state
public ulong m_ulTaskTime; // Timestamp
public uint m_ulTaskTime; // Timestamp
public ushort m_uCapTaskId; // Captain task ID
public ulong m_ulTemplAddr; // Template address
public ulong m_ulCapTemplAddr; // Captain task template address
public uint m_ulTemplAddr; // Template address
public uint m_ulCapTemplAddr; // Captain task template address
public static int Size()
{
return 2 + 1 + 1 + 1 + 1 + 1 + 4 + 2 + 4 + 4;
}
};
// ´óСΪTASK_DATA_BUF_MAX_LEN
public class ActiveTaskEntry : TASK_ENTRY_FIXED_DATA
{
// Buffer union simplified (C# does not support union directly)
public byte[] m_BufData; // Raw data buffer
public ushort[] m_wMonsterNum; // Monster numbers
// unsigned char m_BufData[TASK_DATA_BUF_MAX_LEN-sizeof(TASK_ENTRY_FIXED_DATA)];
public byte[] m_BufData = new byte[TaskInterfaceConstants.TASK_DATA_BUF_MAX_LEN - 21 ]; // Raw data buffer
// nsigned short m_wMonsterNum[MAX_MONSTER_WANTED];
public ushort[] m_wMonsterNum = new ushort[TaskInterfaceConstants.MAX_MONSTER_WANTED]; // Monster numbers
public int m_iUsefulData1;
public char m_iUsefulData2;
public void ReadFromBuffer(byte[] buffer, ref int offset)
{
m_ID = BitConverter.ToUInt16(buffer, offset);
offset += 2;
m_ParentIndex = (char)buffer[offset++];
m_PrevSblIndex = (char)buffer[offset++];
m_NextSblIndex = (char)buffer[offset++];
m_ChildIndex = (char)buffer[offset++];
m_uState = (char)buffer[offset++];
m_ulTaskTime = BitConverter.ToUInt32(buffer, offset);
offset += 4;
m_uCapTaskId = BitConverter.ToUInt16(buffer, offset);
offset += 2;
m_ulTemplAddr = BitConverter.ToUInt32(buffer, offset);
offset += 4;
m_ulCapTemplAddr = BitConverter.ToUInt32(buffer, offset);
offset += 4;
// Read remaining buffer data
Array.Copy(buffer, offset, m_BufData, 0, m_BufData.Length);
// offset += bufDataLength; // in C++ have union, so we dont plus offset here
// Additional fields can be read here as needed
m_wMonsterNum = new ushort[TaskInterfaceConstants.MAX_MONSTER_WANTED];
for (int i = 0; i < TaskInterfaceConstants.MAX_MONSTER_WANTED; i++)
{
m_wMonsterNum[i] = BitConverter.ToUInt16(buffer, offset);
// offset += 2; // in C++ have union, so we dont plus offset here
}
m_iUsefulData1 = BitConverter.ToInt32(buffer, offset);
// offset += 4; // in C++ have union, so we dont plus offset here
m_iUsefulData2 = (char)buffer[offset]; // in C++ have union, so we dont plus offset here
offset += m_BufData.Length;
}
// bool IsFinished() const { return (m_uState & TASK_STATE_FINISHED) != 0; }
// bool IsSuccess() const { return (m_uState & TASK_STATE_SUCCESS) != 0; }
@@ -73,11 +119,28 @@ namespace PerfectWorld.Scripts.Task
//
public ATaskTempl GetTempl()
{
if (m_ulTemplAddr == 0) return null;
return Marshal.PtrToStructure<ATaskTempl>(
new IntPtr(unchecked((long)m_ulTemplAddr))
);
// return reinterpret_cast<const ATaskTempl*>(m_ulTemplAddr);
// Managed fallback: resolve via template manager by ID
try
{
var man = BrewMonster.Network.EC_Game.GetTaskTemplateMan();
if (man != null)
{
var templ = man.GetTaskTemplByID(m_ID);
if (templ != null) return templ;
}
}
catch { }
// Legacy pointer path (likely unused in managed port)
if (m_ulTemplAddr != 0)
{
try
{
return Marshal.PtrToStructure<ATaskTempl>(new IntPtr(unchecked((long)m_ulTemplAddr)));
}
catch { }
}
return null;
}
// const ATaskTempl* GetCap() const { return reinterpret_cast<const ATaskTempl*>(m_ulCapTemplAddr); }
// const ATaskTempl* GetCapOrSelf() const
@@ -147,7 +210,35 @@ namespace PerfectWorld.Scripts.Task
set => _flags = (byte)((_flags & 0x01) | ((value & 0x7F) << 1));
}
// ActiveTaskEntry m_TaskEntries[TASK_ACTIVE_LIST_MAX_LEN];
public ActiveTaskEntry[] m_TaskEntries = new ActiveTaskEntry[CECTaskInterface.TASK_ACTIVE_LIST_MAX_LEN];
// --- Methods ---
public void ReadFromBuffer(byte[] buffer)
{
// header use same data slot with m_uTaskCount etc. cause C++ use union here
// so, we dont plus into offset after copy header
int offset = 0;
Array.Copy(buffer, offset, header, 0, header.Length);
// offset += header.Length;
m_uTaskCount = buffer[offset++];
m_uUsedCount = buffer[offset++];
m_Version = BitConverter.ToUInt16(buffer, offset);
offset += 2;
m_uTopShowTaskCount = buffer[offset++];
m_uListState = buffer[offset++];
m_uTopHideTaskCount = buffer[offset++];
_flags = buffer[offset++];
for (int i = 0; i < m_uTaskCount; i++)
{
ActiveTaskEntry entry = new ActiveTaskEntry();
entry.ReadFromBuffer(buffer, ref offset);
m_TaskEntries[i] = entry;
}
}
// void UpdateTaskMask(unsigned long& ulMask) const;
// void UpdateUsedCount();
@@ -0,0 +1,294 @@
using BrewMonster.Scripts.Task;
using PerfectWorld.Scripts.Task;
namespace BrewMonster.Scripts.Task
{
public partial class ATaskTempl
{
#if _TASK_CLIENT
// bool CanShowTask (TaskInterface* pTask) const;
// bool HasShowCond() const;
public void GetGlobalTaskChar(TaskInterface pTask, Task_State_info.abase_vector_wchar_t_ptr TaskCharArr)
{
// Build display strings for global expressions
// 生成用于显示的全局表达式字符串
for (int i = 0; i < (int)m_FixedData.m_ulTaskCharCnt; i++)
{
// Read one UTF-16 row from m_pTaskChar and convert to C# string
// 从 m_pTaskChar 读取一行 UTF-16 并转换为 C# 字符串
int colCount = BrewMonster.Scripts.Task.TaskTemplConstants.TASK_AWARD_MAX_DISPLAY_CHAR_LEN;
ushort[] row = new ushort[colCount];
for (int j = 0; j < colCount; j++)
{
row[j] = m_FixedData.m_pTaskChar[i, j];
}
string src = ModelRenderer.Scripts.Common.ByteToStringUtils.UshortArrayToUnicodeString(row);
if (string.IsNullOrEmpty(src))
{
continue;
}
// Parse '%' placeholders like %1, %2... and replace with computed values
// 解析形如 %1, %2 的占位符并替换为计算结果
var sb = new System.Text.StringBuilder();
int idx = 0;
char percent = '%'; // Percent sign
// % (percent sign)
while (idx < src.Length)
{
int pos = src.IndexOf(percent, idx);
if (pos >= 0)
{
// Append text before '%'
// 追加 '%' 之前的文本
sb.Append(src, idx, pos - idx);
int j = pos + 1;
int startDigits = j;
while (j < src.Length && char.IsDigit(src[j])) j++;
string digits = (j > startDigits) ? src.Substring(startDigits, j - startDigits) : string.Empty;
int nVal;
// If there's a valid index after '%', compute the global expression value
// ȡõȫֱʽк (get referenced global expression index)
if (!string.IsNullOrEmpty(digits) && int.TryParse(digits, out nVal) && nVal != 0)
{
// Compute one global expression
// ȫֱʽ
int nRet = (int)CalcOneGlobalExp(pTask, nVal - 1);
// Convert number to string and append
// תַַ
sb.Append(nRet.ToString());
// Skip all digits after '%<digits>'
// 跳过 '%' 后面的所有数字
idx = j;
continue;
}
else
{
// No valid number found; keep the '%'
// 未找到合法数字;保留 '%'
sb.Append(percent);
idx = pos + 1;
}
}
else
{
// No more '%' found; append the rest
// δҵȫֱʽֱʾ
sb.Append(src, idx, src.Length - idx);
break;
}
}
string result = sb.ToString();
if (!string.IsNullOrEmpty(result))
{
// Original: TaskCharArr.push_back(pszNewchar);
// 原逻辑:将结果指针压入向量(此处托管环境不直接推入原生向量)
// NOTE: If needed, map 'result' into UI/managed list here.
}
}
}
private float CalcOneGlobalExp(TaskInterface pTask, int nIndex)
{
// Evaluate one global expression row
// 计算一行全局表达式
if (nIndex < 0 || nIndex >= (int)m_FixedData.m_ulExpCnt)
{
return 0f;
}
try
{
int colCount = BrewMonster.Scripts.Task.TaskTemplConstants.TASK_AWARD_MAX_DISPLAY_CHAR_LEN;
float result = 0f;
for (int i = 0; i < colCount; i++)
{
TASK_EXPRESSION expr = m_FixedData.m_pExpArr[nIndex, i];
if (expr.type == -1) break; // Sentinel terminator // 结束标记
// Fallback evaluation: accumulate values
// 回退求值:累加表达式值
result += expr.value;
}
return result;
}
catch (System.Exception ex)
{
CECTaskInterface.WriteLog(0, (int)m_FixedData.m_ID, 0, $"CalcOneGlobalExp, Expression run err: {ex.Message}");
return 0f;
}
}
// bool CanShowInExclusiveUI (TaskInterface* pTask, unsigned long ulCurTime) const;
#else
// void NotifyClient (TaskInterface* pTask, const ActiveTaskEntry* pEntry, unsigned char uReason, unsigned long ulCurTime, unsigned long ulParam = 0, int dps = 0, int dph = 0) const;
// bool CheckGlobalRequired (TaskInterface* pTask, unsigned long ulSubTaskId, const TaskPreservedData* pPreserve, const TaskGlobalData* pGlobal, unsigned short reason) const;
// bool CheckKillMonster (TaskInterface* pTask, ActiveTaskList* pList, ActiveTaskEntry* pEntry, unsigned long ulTemplId, unsigned long ulLev, bool bTeam, float fRand, int dps, int dph) const;
// bool CheckKillPlayer (TaskInterface* pTask, ActiveTaskList* pList, ActiveTaskEntry* pEntry, int iOccupation, int iLevel, bool bGender, int iForce, float fRand) const;
// void CheckCollectItem (TaskInterface* pTask, ActiveTaskList* pList, ActiveTaskEntry* pEntry, bool bAtNPC, int nChoice) const;
// void CheckMonsterKilled (TaskInterface* pTask, ActiveTaskList* pList, ActiveTaskEntry* pEntry, bool bAtNPC, int nChoice) const;
// void CheckMining (TaskInterface* pTask, ActiveTaskList* pList, ActiveTaskEntry* pEntry) const;
// void CheckWaitTime (TaskInterface* pTask, ActiveTaskList* pList, ActiveTaskEntry* pEntry, unsigned long ulCurTime, bool bAtNPC, int nChoice) const;
// void GiveUpOneTask (TaskInterface* pTask, ActiveTaskList* pList, ActiveTaskEntry* pEntry, bool bForce) const;
// void OnSetFinished (TaskInterface* pTask, ActiveTaskList* pList, ActiveTaskEntry* pEntry, bool bNotifyMem = true) const;
// bool DeliverAward (TaskInterface* pTask, ActiveTaskList* pList, ActiveTaskEntry* pEntry, int nChoice, bool bNotifyTeamMem = true, TaskGlobalData* pGlobal = NULL) const;
// void RemoveAcquiredItem (TaskInterface* pTask, bool bClearTask, bool bSuccess) const;
// void TakeAwayGivenItems (TaskInterface* pTask) const;
// bool OnDeliverTeamMemTask (TaskInterface* pTask, TaskGlobalData* pGlobal) const;
// unsigned long CheckDeliverTask (TaskInterface* pTask, unsigned long ulSubTaskId, TaskGlobalData* pGlobal, bool bNotifyErr = true, bool bMemTask = false, unsigned long ulCapId = 0) const;
// bool HasGlobalData() const;
#endif
#if _TASK_CLIENT
// void SyncTaskType(); // ʹ
// bool GetShowGfxFlag() { return m_bShowGfxFinished;}
// const wchar_t* GetDescription() const { assert(m_pwstrDescript); return (wchar_t*)m_pwstrDescript; }
// const wchar_t* GetOkText() const { assert(m_pwstrOkText); return (wchar_t*)m_pwstrOkText; }
// const wchar_t* GetNoText() const { assert(m_pwstrNoText); return (wchar_t*)m_pwstrNoText; }
// const wchar_t* GetTribute() const { assert(m_pwstrTribute); return (wchar_t*)m_pwstrTribute; }
//
// const talk_proc* GetDeliverTaskTalk() const { return &m_DelvTaskTalk; }
// const talk_proc* GetUnqualifiedTalk() const { return &m_UnqualifiedTalk; }
// const talk_proc* GetDeliverItemTalk() const { return &m_DelvItemTalk; }
// const talk_proc* GetUnfinishedTalk() const { return &m_ExeTalk; }
// const talk_proc* GetAwardTalk() const { return &m_AwardTalk; }
//
// unsigned long GetDeliverNPC() const { return m_ulDelvNPC; }
public uint GetAwardNPC() { return m_FixedData.m_ulAwardNPC; }
//
// void SaveToTextFile(FILE* fp);
// bool SaveToTextFile(const char* szPath);
// void SaveToBinFile(FILE* fp) { SaveBinary(fp); }
// void SaveDescription(FILE* fp);
// void SaveDescriptionBin(FILE* fp);
// void SaveTribute(FILE* fp);
// void SaveTributeBin(FILE* fp);
// void SaveAllText(FILE* fp);
// int MarshalKillMonster(char* pData);
// int MarshalCollectItems(char* pData);
// int MarshalDynTask(char* pData);
// int MarshalSpecialAwardData(char* pData);
//
// ATaskTempl& operator= (const ATaskTempl& src);
// bool operator == (const ATaskTempl& src) const
// {
// return *(ATaskTemplFixedData*)this == *(const ATaskTemplFixedData*)&src;
// }
#endif
public bool _compare_key_value(TaskInterface pTask, COMPARE_KEY_VALUE CompKeyVal)
{
long lleftValue = CompKeyVal.lLeftNum;
if (CompKeyVal.nLeftType == 0)
{
lleftValue = pTask.GetGlobalValue(CompKeyVal.lLeftNum);
}
long lRightValue = CompKeyVal.lRightNum;
if (CompKeyVal.nRightType == 0)
{
lRightValue = pTask.GetGlobalValue(CompKeyVal.lRightNum);
}
switch(CompKeyVal.nCompOper)
{
case 0:
{
if (lleftValue > lRightValue)
return true;
}
break;
case 1:
{
if (lleftValue == lRightValue)
return true;
}
break;
case 2:
{
if (lleftValue < lRightValue)
return true;
}
break;
default:
break;
}
return false;
}
// Early out: skip if this phase does not require key-value comparison
public uint CheckGlobalKeyValue(TaskInterface pTask, bool bFinCheck)
{
if ((bFinCheck && !m_FixedData.m_bFinNeedComp)
|| (!bFinCheck && !m_FixedData.m_bPremNeedComp))
{
return 0;
}
// Initialize comparison flags
bool bFlag1 = false;
bool bFlag2 = false;
if (bFinCheck)
{
// Finish-conditions branch: evaluate two key-value comparisons
bFlag1 = _compare_key_value(pTask, m_FixedData.m_Fin1KeyValue);
bFlag2 = _compare_key_value(pTask, m_FixedData.m_Fin2KeyValue);
// Evaluate logical mode: 0 = OR, 1 = AND
if ((m_FixedData.m_nFinExp1AndOrExp2 == 0 && (bFlag1 || bFlag2))
|| (m_FixedData.m_nFinExp1AndOrExp2 == 1 && (bFlag1 && bFlag2)))
{
return 0;
}
}
else
{
// Premise-conditions branch: evaluate two key-value comparisons
bFlag1 = _compare_key_value(pTask, m_FixedData.m_Prem1KeyValue);
bFlag2 = _compare_key_value(pTask, m_FixedData.m_Prem2KeyValue);
// Evaluate logical mode: 0 = OR, 1 = AND
if ((m_FixedData.m_nPremExp1AndOrExp2 == 0 && (bFlag1 || bFlag2))
|| (m_FixedData.m_nPremExp1AndOrExp2 == 1 && (bFlag1 && bFlag2)))
{
return 0;
}
}
// Failure: global key-value prerequisite not satisfied
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_GLOBAL_KEYVAL;
}
public bool CheckReachLevel(BrewMonster.Scripts.Task.TaskInterface pTask)
{
bool bLevel = true, bReincarnationCount = true, bRealmLevel = true;
if (m_FixedData.m_ulReachLevel != 0) bLevel = pTask.GetPlayerLevel() >= m_FixedData.m_ulReachLevel;
if (m_FixedData.m_ulReachReincarnationCount != 0) bReincarnationCount = GetReincarnationCount(pTask) >= m_FixedData.m_ulReachReincarnationCount;
if (m_FixedData.m_ulReachRealmLevel != 0) bRealmLevel = GetRealmLevel(pTask) >= m_FixedData.m_ulReachRealmLevel;
return bLevel && bReincarnationCount && bRealmLevel;
}
private static uint GetReincarnationCount(BrewMonster.Scripts.Task.TaskInterface pTask)
{
return 0u;
}
private static uint GetRealmLevel(BrewMonster.Scripts.Task.TaskInterface pTask)
{
var host = BrewMonster.Network.EC_Game.GetGameRun()?.GetHostPlayer();
if (host != null)
{
var bp = host.GetBasicProps();
return (uint)bp.iLevel2;
}
return 0u;
}
public bool IsKeyTask()
{
ATaskTempl m = GetTopTask();
return m.m_FixedData.m_bKeyTask;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: f79c86592e7741088fa3bb1ccfaab885
timeCreated: 1762413881
+251 -23
View File
@@ -298,9 +298,25 @@ namespace BrewMonster.Scripts.Task
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct PLAYER_WANTED
{
public uint m_ulTemplID; // Player Template ID
public uint m_ulCount; // Count
public uint m_ulLevel; // Level
// old data of DUCK
// public uint m_ulTemplID; // Player Template ID
// public uint m_ulCount; // Count
// public uint m_ulLevel; // Level
// MH: New data
public uint m_ulPlayerNum;
public uint m_ulDropItemId;
public uint m_ulDropItemCount;
[MarshalAs(UnmanagedType.U1)]
public bool m_bDropCmnItem;
public float m_fDropProb;
public Kill_Player_Requirements m_Requirements;
public string GetLog()
{
return string.Format("PLAYER_WANTED: Num={0}, DropItemID={1}, DropItemCount={2}, DropCmnItem={3}, DropProb={4}",
m_ulPlayerNum, m_ulDropItemId, m_ulDropItemCount, m_bDropCmnItem, m_fDropProb);
}
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
@@ -411,10 +427,11 @@ namespace BrewMonster.Scripts.Task
{
public uint m_iRankingStart;
public uint m_iRankingEnd;
[MarshalAs(UnmanagedType.U1)]
public bool m_bCommonItem;
public ulong m_ulAwardItemId;
public ulong m_ulAwardItemNum;
public long m_lPeriod;
public uint m_ulAwardItemId;
public uint m_ulAwardItemNum;
public int m_lPeriod;
public bool Equals(RANKING_AWARD src)
{
@@ -1212,7 +1229,12 @@ namespace BrewMonster.Scripts.Task
}
}
public class ATaskTempl
/// <summary>
/// 任务模板类 // Task Template Class
/// include
/// </summary>
public partial class ATaskTempl
{
public ATaskTemplFixedData m_FixedData;
@@ -1250,15 +1272,211 @@ namespace BrewMonster.Scripts.Task
CheckDepth();
return true;
}
public string GetDescription()
{
return ByteToStringUtils.UshortArrayToUnicodeString(m_pwstrDescript);
}
public bool CanFinishTask(TaskInterface pTask, ActiveTaskEntry pEntry, uint ulCurTime)
{
bool ret = false;
while (true)
{
// 若发放非法则不允许完成 // If delivery is illegal, cannot finish
if (pTask == null || pEntry == null) break;
if (!pTask.IsDeliverLegal()) break;
// 已完成直接返回 // Already finished -> true
if (pEntry.IsFinished())
{
ret = true;
break;
}
switch ((TaskCompletionMethod)m_FixedData.m_enumMethod)
{
case TaskCompletionMethod.enumTMCollectNumArticle:
// 背包中已拥有所有需要的物品 // Has all required items
ret = HasAllItemsWanted(pTask);
break;
case TaskCompletionMethod.enumTMWaitTime:
// 等待时间达成 // Wait time satisfied
ret = (m_FixedData.m_ulWaitTime == 0)
|| (pEntry.m_ulTaskTime + (ulong)m_FixedData.m_ulWaitTime < (ulong)ulCurTime);
break;
case TaskCompletionMethod.enumTMTalkToNPC:
// 对话类任务可直接完成 // Talk-to-NPC tasks complete immediately
ret = true;
break;
case TaskCompletionMethod.enumTMGlobalValOK:
// 全局变量满足条件 // Global variable meets condition
ret = CheckGlobalKeyValue(pTask, true) == 0;
break;
case TaskCompletionMethod.enumTMTransform:
{
int playerShapeType = pTask.GetShapeMask();
// 变身职业判断 // Transform occupation check
if (m_FixedData.m_ucTransformedForm == 0x80)
{
if ((playerShapeType >> 6) == 2) ret = true;
}
// 特定形态匹配 // Specific form match
else if (m_FixedData.m_ucTransformedForm == playerShapeType) ret = true;
}
break;
case TaskCompletionMethod.enumTMReachTreasureZone:
{
// 到达藏宝区网格 // Reach treasure zone grid
float[] pos = new float[3];
uint ulWorldId = (uint)pTask.GetPos(pos);
if (ulWorldId == 1)
{
ushort uTreasureLocIndex = (ushort)(pEntry.m_iUsefulData1 & 0xFFFF);
float fTreasureLocX = m_FixedData.m_TreasureStartZone.x + ((uTreasureLocIndex % m_FixedData.m_ucZonesNumX) - 1) * (float)m_FixedData.m_ucZoneSide;
float fTreasureLocZ = m_FixedData.m_TreasureStartZone.z + (uTreasureLocIndex / m_FixedData.m_ucZonesNumX) * (float)m_FixedData.m_ucZoneSide;
ret = pos[0] >= fTreasureLocX && pos[2] >= fTreasureLocZ
&& pos[0] <= fTreasureLocX + (float)m_FixedData.m_ucZoneSide
&& pos[2] <= fTreasureLocZ + (float)m_FixedData.m_ucZoneSide;
}
}
break;
case TaskCompletionMethod.enumTMSimpleClientTask:
case TaskCompletionMethod.enumTMSimpleClientTaskForceNavi:
{
// 简单客户端任务条件 // Simple client task condition
ret = pTask.CheckSimpleTaskFinshConditon(m_FixedData.m_ID);
}
break;
case TaskCompletionMethod.enumTMReachLevel:
// 达到等级条件 // Reach level condition
ret = CheckReachLevel(pTask);
break;
default:
break;
}
break;
}
// 等级前置校验 // Premise level check
if (m_FixedData.m_ulPremise_Lev_Min != 0)
{
if (m_FixedData.m_bPremCheckMaxHistoryLevel == 0 && pTask.GetPlayerLevel() < m_FixedData.m_ulPremise_Lev_Min)
ret = false;
}
return ret;
}
public bool HasAllItemsWanted(TaskInterface pTask)
{
if (m_FixedData.m_ulGoldWanted != 0 && pTask.GetGoldNum() < m_FixedData.m_ulGoldWanted)
return false;
if (m_FixedData.m_iFactionContribWanted != 0 && pTask.GetFactionConsumeContrib() < m_FixedData.m_iFactionContribWanted)
return false;
if (m_FixedData.m_iFactionExpContribWanted != 0 && pTask.GetFactionExpContrib() < m_FixedData.m_iFactionExpContribWanted)
return false;
int i = 0;
for (; i < (int)m_FixedData.m_ulItemsWanted; i++)
{
ITEM_WANTED iw = m_FixedData.m_ItemsWanted[i];
uint ulNum = _get_item_count(
pTask,
iw.m_ulItemTemplId,
iw.m_bCommonItem);
if (ulNum == 0 || ulNum < iw.m_ulItemNum) return false;
}
return true;
}
// 递归检查奖励条件并返回错误码 // Recursively check award prerequisites and return error code
public uint RecursiveCheckAward(TaskInterface pTask, ActiveTaskList pList, ActiveTaskEntry pEntry, uint ulCurTime, int nChoice)
{
// 计数器与预算初始化 // Initialize counters and budget
uint ulCmnCount = 0;
uint ulTskCount = 0;
uint ulTopCount = 0;
byte uBudget = 0;
long lReputation = 0;
// 任务屏蔽检查 // Task forbid check
if (pTask.CheckTaskForbid(m_FixedData.m_ID)) return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_TASK_FORBID;
// 跨服限制检查 // Cross-server account limit check
if (m_FixedData.m_bAccountTaskLimit && pTask.IsAtCrossServer())
return (uint)TaskInterfaceConstants.TASK_AWARD_FAIL_CROSSSERVER_NO_ACOUNT_LIMIT;
// TODO: Implement recursive award calculation
// Recursively calculate award and return early on error
// uint ulRet = RecursiveCalcAward(pTask, pList, pEntry, ulCurTime, nChoice, out ulCmnCount, out ulTskCount, out ulTopCount, out uBudget, out lReputation);
// if (ulRet != 0) return ulRet;
// 顶部任务计数拆分 // Split top task counters
uint ulTopShowCount = (ulTopCount & 0xffff0000u) >> 16;
uint ulTopHideCount = (ulTopCount & 0x000000ffu);
uint ulTitleTaskCount = (ulTopCount & 0x0000ff00u) >> 8;
// 顶部任务数量上限检查 // Top task caps check
if ((ulTopShowCount != 0 && (uint)pList.m_uTopShowTaskCount + ulTopShowCount > (uint)GetMaxSimultaneousCount(pList))
|| (ulTopHideCount != 0 && (uint)pList.m_uTopHideTaskCount + ulTopHideCount > (uint)TASK_HIDDEN_COUNT)
|| (ulTitleTaskCount != 0 && (uint)pList.m_uTitleTaskCount + ulTitleTaskCount > (uint)TASK_TITLE_TASK_COUNT))
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_FULL;
// 活动列表容量检查 // Active list capacity check
if (uBudget != 0 && (uint)pList.m_uUsedCount + uBudget > (uint)CECTaskInterface.TASK_ACTIVE_LIST_MAX_LEN)
return (uint)TaskInterfaceConstants.TASK_PREREQU_FAIL_NO_SPACE;
// TODO: Item grant legality check
// if ((ulCmnCount != 0 && !pTask.CanDeliverCommonItem(ulCmnCount))
// || (ulTskCount != 0 && !pTask.CanDeliverTaskItem(ulTskCount)))
// return (uint)TaskInterfaceConstants.TASK_AWARD_FAIL_GIVEN_ITEM;
// TODO: Reputation non-negative check
// if (lReputation != 0 && pTask.GetReputation() + lReputation < 0)
// return (uint)TaskInterfaceConstants.TASK_AWARD_FAIL_REPUTATION;
// 一切正常 // All good
return 0u;
}
public static uint _get_item_count(TaskInterface pTask, uint ulItemId, bool bCommon)
{
return (uint)( bCommon ? pTask.GetCommonItemCount(ulItemId) : pTask.GetTaskItemCount(ulItemId) );
}
// 占位:最大同时任务上限 // Placeholder: maximum simultaneous tasks cap
private static int GetMaxSimultaneousCount(ActiveTaskList list)
{
return int.MaxValue;
}
// 占位:隐藏与标题任务上限 // Placeholder: hidden/title task caps
private const int TASK_HIDDEN_COUNT = int.MaxValue;
private const int TASK_TITLE_TASK_COUNT = int.MaxValue;
private void LoadBinary(FileStream fp)
{
LoadFixedDataFromBinFile(fp);
// BMLogger.Log($"---- Pointer Log {m_FixedData.m_ID} ---- \n {pointerLog} ");
LoadDescriptionBin(fp);
pointerLog += $" After LoadDescriptionBin : {fp.Position}\n";
LoadTributeBin(fp);
pointerLog += $" After LoadTributeBin : {fp.Position}\n";
BMLogger.Log($"---- Pointer Log ---- \n {pointerLog} ");
// TODO: Check task type consistency
# if _TASK_CLIENT
@@ -1309,6 +1527,9 @@ namespace BrewMonster.Scripts.Task
// 读取子任务数量 // Read subtask count
long readBytes = 0;
m_nSubCount = AAssit.ReadFromBinaryOf<int>(fp, ref readBytes);
pointerLog += $" After m_nSubCount : {fp.Position}\n";
// BMLogger.Log($"---- Pointer Log {m_FixedData.m_ID} ---- \n {pointerLog} ");
// for (int i = 0; i < m_nSubCount; i++)
// {
@@ -1372,7 +1593,7 @@ namespace BrewMonster.Scripts.Task
private void ConvertFixedData(FileStream fp, int x2)
{
long readBytes = 0;
BMLogger.Log($"LoadFixedDataFromBinFile: {fp.Length}");
// BMLogger.Log($"LoadFixedDataFromBinFile: {fp.Length}");
ATaskTemplFixedData fixedData = new ATaskTemplFixedData();
string logContent = "";
@@ -2338,7 +2559,7 @@ namespace BrewMonster.Scripts.Task
pointerLog += $" After read Raw of FixedData: {fp.Position} \n";
BMLogger.LogError($" === Task Data {fixedData.m_ID} loaded === \n {logContent} ");
// BMLogger.LogError($" === Task Data {fixedData.m_ID} loaded === \n {logContent} ");
ConvertPointersOfFixedData(fp, ref fixedData, ref readBytes);
@@ -2678,7 +2899,8 @@ namespace BrewMonster.Scripts.Task
for (int i = 0; i < fixedData.m_ulPlayerWanted; i++)
{
fixedData.m_PlayerWanted[i] = AAssit.ReadFromBinaryOf<PLAYER_WANTED>(fp, ref readBytes);
pwLog += $" {i} = (Tpl:{fixedData.m_PlayerWanted[i].m_ulTemplID}, Cnt:{fixedData.m_PlayerWanted[i].m_ulCount}, Lev:{fixedData.m_PlayerWanted[i].m_ulLevel}) || ";
//pwLog += $" {i} = (Tpl:{fixedData.m_PlayerWanted[i].m_ulTemplID}, Cnt:{fixedData.m_PlayerWanted[i].m_ulCount}, Lev:{fixedData.m_PlayerWanted[i].m_ulLevel}) || ";
pwLog += $" {i} = {fixedData.m_PlayerWanted[i].GetLog() }|| ";
}
logContent += $"m_PlayerWanted: {pwLog}\n";
}
@@ -2795,9 +3017,11 @@ namespace BrewMonster.Scripts.Task
logContent += $"m_pLeaveSite: {fixedData.m_pLeaveSite}\n";
}
BMLogger.LogError($" === Task Pointer Datas {fixedData.m_ID} loaded === \n {logContent} ");
// BMLogger.LogError($" === Task Pointer Datas {fixedData.m_ID} loaded === \n {logContent} ");
pointerLog += $" Start read m_Award_S , pointer at : {fp.Position} \n";
// BMLogger.Log($"---- Pointer Log {fixedData.m_ID} ---- \n {pointerLog} ");
LoadAwardDataBin(fp, ref fixedData.m_Award_S, TaskTemplConstants._task_templ_cur_version, ref readBytes);
pointerLog += $" Start read m_Award_F complete : {fp.Position} \n";
LoadAwardDataBin(fp, ref fixedData.m_Award_F, TaskTemplConstants._task_templ_cur_version, ref readBytes);
pointerLog += $" After Award_S and Award_F complete : {fp.Position} \n";
@@ -3044,7 +3268,7 @@ namespace BrewMonster.Scripts.Task
logContent += $"m_iWorldContribution: {ad.m_iWorldContribution} \n";
logContent += "------ Start Pointer datas of AWARD_DATA ------ \n";
pointerLog += $"After Raw Data of AWARD_DATA, pointer : {fp.Position}\n";
// Start convert Pointer Data of AWARD_DATA
//Debug.Log($"ad.m_ulCandItems : {ad.m_ulCandItems}");
if (ad.m_ulCandItems > 0)
@@ -3068,7 +3292,7 @@ namespace BrewMonster.Scripts.Task
LoadAwardMonstersBin(fp, ref ad.m_SummonedMonsters, ulVersion, ref readBytes);
}
logContent += $"m_SummonedMonsters : {ad.m_ulSummonedMonsters} elements / Pointer : {fp.Position} \n";
pointerLog += $" After LoadAwardMonstersBin, pointer : {fp.Position}\n";
if (ad.m_ulPQRankingAwardCnt > 0)
{
@@ -3077,6 +3301,7 @@ namespace BrewMonster.Scripts.Task
LoadAwardPQRankingBin(fp, ref ad.m_PQRankingAward, ulVersion, ref readBytes);
}
logContent += $" AWARD_DATA.m_PQRankingAward : {ad.m_ulPQRankingAwardCnt} elements / {fp.Position} \n";
pointerLog += $" After LoadAwardPQRankingBin, pointer : {fp.Position}\n";
ad.m_pTitleAward = AAssit.ReadArrayFromBinary<TITLE_AWARD>(fp, (int)ad.m_ulTitleNum,ref readBytes);
logContent += $" AWARD_DATA.m_pTitleAward : {ad.m_ulTitleNum} elements / {fp.Position} \n";
@@ -3092,6 +3317,7 @@ namespace BrewMonster.Scripts.Task
logContent += $" AWARD_DATA.m_plChangeKey : {ad.m_ulChangeKeyCnt} elements / {fp.Position} \n";
logContent += $" AWARD_DATA.m_plChangeKeyValue : {ad.m_ulChangeKeyCnt} elements / {fp.Position} \n";
logContent += $" AWARD_DATA.m_pbChangeType : {ad.m_ulChangeKeyCnt} elements / {fp.Position} \n";
pointerLog += $" After ad.m_pbChangeType, pointer : {fp.Position}\n";
if (ad.m_ulHistoryChangeCnt > 0)
{
@@ -3131,6 +3357,7 @@ namespace BrewMonster.Scripts.Task
}
}
logContent += $" AWARD_DATA.m_pszExp and m_pExpArr : {ad.m_ulExpCnt} rows / {fp.Position} \n";
pointerLog += $" After ad.m_pExpArr, pointer : {fp.Position}\n";
if (ad.m_ulTaskCharCnt > 0)
{
@@ -3144,8 +3371,9 @@ namespace BrewMonster.Scripts.Task
}
}
logContent += $" AWARD_DATA.m_pTaskChar : {ad.m_ulTaskCharCnt} rows / {fp.Position} \n";
pointerLog += $" After ad.m_pTaskChar, pointer : {fp.Position}\n";
BMLogger.LogError( $" ---- Data of AWARD_DATA ---- \n {logContent} " );
// BMLogger.LogError( $" ---- Data of AWARD_DATA ---- \n {logContent} " );
return true;
}
@@ -3164,7 +3392,7 @@ namespace BrewMonster.Scripts.Task
pointerLog += $" After Read AWARD_ITEMS_CAND.m_ulAwardItems : {fp.Position}\n";
Debug.Log( $"ic.m_bRandChoose : {ic.m_bRandChoose} ic.m_ulAwardItems : {ic.m_ulAwardItems}");
// Debug.Log( $"ic.m_bRandChoose : {ic.m_bRandChoose} ic.m_ulAwardItems : {ic.m_ulAwardItems}");
// return true;
@@ -3282,7 +3510,7 @@ namespace BrewMonster.Scripts.Task
valueLog += $" m_pwstrNoText : { ByteToStringUtils.UshortArrayToUnicodeString(m_pwstrNoText) } \n";
BMLogger.LogError( $" ---- Data of Task Description ---- \n {valueLog} " );
// BMLogger.LogError( $" ---- Data of Task Description ---- \n {valueLog} " );
return true;
}
@@ -3309,9 +3537,9 @@ namespace BrewMonster.Scripts.Task
convert_txt(m_pwstrTribute, (int)len, (char)m_FixedData.m_ID);
}
BMLogger.Log($" --- m_pwstrTribute ---- \n " +
$" Len : {len} \n " +
$" content: {ByteToStringUtils.UshortArrayToUnicodeString(m_pwstrTribute)}");
// BMLogger.Log($" --- m_pwstrTribute ---- \n " +
// $" Len : {len} \n " +
// $" content: {ByteToStringUtils.UshortArrayToUnicodeString(m_pwstrTribute)}");
return true;
}
@@ -3776,7 +4004,7 @@ namespace BrewMonster.Scripts.Task
}
// 同步任务类型 // Sync task type
private ATaskTempl GetTopTask()
public ATaskTempl GetTopTask()
{
ATaskTempl pTop = this;
while (pTop.m_pParent != null)
+3
View File
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 93f7619812eb476db0dc2115acf53bfe
timeCreated: 1762243990
@@ -0,0 +1,77 @@
using System;
using UnityEngine;
using UnityEngine.Events;
namespace BrewMonster.PerfectWorld.Scripts.Task.UI
{
public class TaskTreeView : MonoBehaviour
{
[SerializeField] private TaskTreeViewItem m_pTreeViewItemPrefab;
private TaskTreeViewItem[] m_aTreeViewItems;
public void SetItemData(TaskTreeViewItem item, uint taskType)
{
item.SetItemData(taskType);
}
public uint GetItemData(TaskTreeViewItem item)
{
return item.GetItemData();
}
public TaskTreeViewItem GetNextSiblingItem(TaskTreeViewItem item)
{
if (m_aTreeViewItems == null)
{
m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewItem>();
}
for (int i = 0; i < m_aTreeViewItems.Length - 1; i++)
{
if (m_aTreeViewItems[i] == item)
{
return m_aTreeViewItems[i + 1];
}
}
return null;
}
public TaskTreeViewItem InsertItem(string text, TaskTreeViewItem pParent, TaskTreeViewItem pAfter)
{
// Create a new item GameObject and component
TaskTreeViewItem pItem = Instantiate(m_pTreeViewItemPrefab);
GameObject go = pItem.gameObject;
if (pItem == null) return null;
// Parent: root (this) if null; otherwise under given parent item
var parentTransform = (pParent != null ? pParent.transform : this.transform);
go.transform.SetParent(parentTransform, false);
// Set sibling position: after specific item if provided; otherwise append to end
if (pAfter != null && pAfter.transform.parent == parentTransform)
{
int afterIndex = pAfter.transform.GetSiblingIndex();
go.transform.SetSiblingIndex(afterIndex + 1);
}
else
{
go.transform.SetAsLastSibling();
}
// Optionally set label text if a TMP_Text is attached under the item (not required here)
// var label = go.GetComponentInChildren<TMPro.TMP_Text>(true);
// if (label != null) label.text = text ?? string.Empty;
pItem.SetItemText(text);
// Refresh local cache of items
m_aTreeViewItems = GetComponentsInChildren<TaskTreeViewItem>();
return pItem;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8688b7d87bac4c16b9eaa3408f8ea419
timeCreated: 1762506361
@@ -0,0 +1,64 @@
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace BrewMonster.PerfectWorld.Scripts.Task.UI
{
public class TaskTreeViewItem : MonoBehaviour, IPointerClickHandler
{
[SerializeField] private TMP_Text m_text;
[SerializeField] private Button m_Button;
[Header("DEBUG")]
[SerializeField] private uint m_uItemData;
public UnityEvent<uint> OnClick = new UnityEvent<uint>();
public void SetItemData(uint uItemData)
{
m_uItemData = uItemData;
}
public uint GetItemData()
{
return m_uItemData;
}
public void SetItemTextColor(Color color)
{
if (m_text != null)
{
m_text.color = color;
}
}
public void SetItemText(string text)
{
if (m_text != null)
{
m_text.text = text;
}
}
public void OnPointerClick(PointerEventData eventData)
{
OnClick.Invoke(m_uItemData);
// EventBus.Publish(new TaskItemClickEvent() { Data = m_uItemData });
TaskWindow.Instance.OnEventLButtonDown_Tv_Quest(m_uItemData);
}
}
public struct TaskItemClickEvent
{
public uint Data;
public TaskItemClickEvent(uint data)
{
Data = data;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 3428dd2e9dd644e0b0cb408bd3202f21
timeCreated: 1762506395
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 101488732bfd4d2fab4ea07f7ac6731f
timeCreated: 1762246845
@@ -152,6 +152,7 @@ namespace BrewMonster.UI
private async void OnEnterWorldComplete()
{
EC_Game.Init();
await Task.Delay(2000);
// Request all known packages: 0=Inventory,1=Equipment,2=Task
UnityGameSession.RequestAllInventoriesAsync(() => { /*BMLogger.Log("Sent Inventory Detail Requests (all packs)");*/ }, 0, 1, 2);
@@ -160,7 +161,7 @@ namespace BrewMonster.UI
await Task.Delay(10000);
UnityGameSession.RequesrQueryPlayerCash();
await Task.Delay(1000);
EC_Game.Init();
}
//private void OnInventoryReceived(List<InventoryItem> inventoryData)
+7 -2
View File
@@ -4,10 +4,12 @@ using BrewMonster.Scripts.World;
using CSNetwork.GPDataType;
using CSNetwork.Protocols.RPCData;
using System.Data;
using BrewMonster.Network;
using CSNetwork;
using Unity.Cinemachine;
using UnityEngine;
public partial class CECGameRun : MonoBehaviour
public partial class CECGameRun : MonoBehaviour, IMsgHandler
{
private static CECGameRun instance;
@@ -18,7 +20,7 @@ public partial class CECGameRun : MonoBehaviour
[SerializeField] private GameObject _testVfxPrefab;
//[SerializeField] private Transform ground;
CECHostPlayer hostPlayer;
public CinemachineFreeLook freeLookCam;
public float rotateSpeedX = 300f; // tốc độ xoay ngang
public float rotateSpeedY = 2f; // tốc độ xoay dọc
@@ -56,6 +58,8 @@ public partial class CECGameRun : MonoBehaviour
{
instance = this;
}
EC_ManMessage.RegisterHandler(this);
}
public void Log(string s)
@@ -117,6 +121,7 @@ public partial class CECGameRun : MonoBehaviour
GameObject character = Instantiate(characterPrefab, transform);
return character.gameObject;
}
private void OnDestroy()
{
instance = null;
+38
View File
@@ -0,0 +1,38 @@
using System.Collections.Generic;
using BrewMonster.Network;
using CSNetwork;
using CSNetwork.GPDataType;
// Game runtime partial class
partial class CECGameRun : IMsgHandler
{
private readonly Dictionary<int, int> m_CommonDataTab = new Dictionary<int, int>();
public int GetCommonData(int key)
{
// Lookup a common data value by key
// 按键查找通用数据值
if (m_CommonDataTab != null && m_CommonDataTab.TryGetValue(key, out var value))
return value;
else
return 0;
}
private CECCounter l_QueryServerTime = new CECCounter(); // ѯǰʱ
public int HandlerId => -1;
public bool ProcessMessage(ECMSG Msg)
{
switch (Msg.dwMsg)
{
case CommandID.SERVER_TIME:
EC_Game.SetServerTime((int)Msg.dwParam1, (int)Msg.dwParam2);
l_QueryServerTime.Reset();
break;
}
return true;
}
}
+3
View File
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 598459b2399743b5ba1eb55fd1d9611e
timeCreated: 1762861835
+121
View File
@@ -0,0 +1,121 @@
using System;
using BrewMonster.Scripts.Task;
using CSNetwork;
using CSNetwork.GPDataType;
using UnityEngine;
using System.Runtime.InteropServices;
// ׶ // Contribution info
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct CONTRIB_INFO
{
public int consume_contrib; // ѵ // Consume contribution
public int exp_contrib; // ɶһɾ // Experience contribution
public int cumulate_contrib; // ۻֵ // Cumulative contribution
// public CONTRIB_INFO()
// {
// consume_contrib = 0;
// exp_contrib = 0;
// cumulate_contrib = 0;
// }
}
public partial class CECHostPlayer
{
private int m_idTradePlayer; // ID of player who is trading with us
private CECTaskInterface m_pTaskInterface;
private int m_iBoothState; // Booth state. 0, none; 1, prepare; 2, open booth; 3, visite other's booth
private CONTRIB_INFO m_contribInfo;
public CECTaskInterface GetTaskInterface()
{
return m_pTaskInterface;
}
// Is host player trading ?
public bool IsTrading() { return m_idTradePlayer != 0; }
public CONTRIB_INFO GetContribInfo()
{
return m_contribInfo;
}
public int GetBoothState()
{
return m_iBoothState;
}
private void OnMsgHstTaskData(ECMSG Msg)
{
// decode header to distinguish TASK_DATA vs TASK_VAR_DATA
// if (!(Msg.dwParam2 is cmd_header header))
// {
// Debug.LogError("OnMsgHstTaskData: invalid header");
// return;
// }
int header = Convert.ToInt32(Msg.dwParam2);
byte[] pDataBuf = Msg.dwParam1 as byte[];
if (pDataBuf == null)
{
Debug.LogError("OnMsgHstTaskData: missing payload buffer");
return;
}
if (header == CommandID.TASK_DATA)
{
#if !LOAD_TASK_TEMPL
return; // Task templates loading not implemented in C#
#endif
// Parse aggregated task buffers
cmd_task_data pCmd = cmd_task_data.FromBuffer(pDataBuf);
// cmd_task_data pCmd = GPDataTypeHelper.FromBytes<cmd_task_data>(pDataBuf);
// Release and recreate task interface
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))
{
Debug.LogError("CECHostPlayer::OnMsgHstTaskData, failed to initialize task interface");
return;
}
m_pTaskInterface.CheckPQEnterWorldInit();
// check if player has equipped goblin (not yet implemented in C#)
// TODO: implement goblin initialization when equipment system is ready
// GET_ALL_DATA end flag tasks were here in C++ (LoadConfigData), omitted in C#
// if (UpdateEquipSkills()) UpdateEquipSkillCoolDown(); // methods not ported yet
}
else if (header == CommandID.TASK_VAR_DATA)
{
// Minimal forwarding; original code passes inner data pointer and size
if (m_pTaskInterface != null)
{
OnServerNotify(m_pTaskInterface, pDataBuf, pDataBuf.Length);
}
else
{
Debug.LogError("OnMsgHstTaskData: m_pTaskInterface is null on TASK_VAR_DATA");
}
}
}
private void OnServerNotify(CECTaskInterface pInterface, byte[] data, int size)
{
// TODO: Implement server notify handling for task var data
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: c3d2b8f770fdd49619648d2a7aace2f4
+1 -75
View File
@@ -1171,81 +1171,7 @@ public partial class CECHostPlayer : CECPlayer
#region Task
public void OnMsgHstTaskData(ECMSG Msg)
{
int cmd = Convert.ToInt32(Msg.dwParam2);
if (cmd == CommandID.TASK_DATA)
{
//Debug.Log("[Dat]- OnMsgHstTaskData- TASK_DATA");
//a_LogOutput(1, "[Dat]- EC_HostMsg- OnMsgHstTaskData- TASK_DATA");
//cmd_task_data* pCmd = (cmd_task_data*)Msg.dwParam1;
//ASSERT(pCmd);
//int iActiveListSize = (int)pCmd.active_list_size;
//BYTE* pData = (BYTE*)pCmd + sizeof(size_t);
//void* pActiveListbuf = pData;
//pData += iActiveListSize;
//int iFinishedListSize = *(int*)pData;
//pData += sizeof(int);
//void* pFinishedListBuf = pData;
//pData += iFinishedListSize;
//int iFinishTimeListSize = *(int*)pData;
//pData += sizeof(int);
//void* pFinishTimeListBuf = pData;
//pData += iFinishTimeListSize;
//int iFinishedCountListSize = *(int*)pData;
//pData += sizeof(int);
//void* pFinishedCountListBuf = pData;
//pData += iFinishedCountListSize;
//int iStorageTasksListSize = *(int*)pData;
//pData += sizeof(int);
//void* pStorageTaskListBuf = pData;
//pData += iStorageTasksListSize;
//A3DRELEASE(m_pTaskInterface);
//todo
//var m_pTaskInterface = new CECTaskInterface(this);
//if (!m_pTaskInterface.Init(null, 0, null, 0,
// null, 0, null, 0, null, 0))
//{
// //a_LogOutput(1, "CECHostPlayer::OnMsgHstTaskData, failed to initialize task interface");
// return;
//}
//m_pTaskInterface.CheckPQEnterWorldInit();
//// check if player has equipped goblin
//if (m_pEquipPack.GetItem(EQUIPIVTR_GOBLIN) != NULL)
//{
// CECIvtrGoblin* pIvtrGoblin = (CECIvtrGoblin*)m_pEquipPack.GetItem(EQUIPIVTR_GOBLIN);
// m_pGoblin = new CECHostGoblin();
// m_pGoblin.Init(pIvtrGoblin.GetTemplateID(), pIvtrGoblin, this);
//}
//// Note: this command now is also used as the end flag of responding
//// for GET_ALL_DATA request
//g_pGame.GetGameSession().LoadConfigData();
//// ¸ù¾Ý×°±¸°ü¹ü¸üÐÂ×°±¸¼¼Äܵ½¼¼ÄÜÁбí
//if (UpdateEquipSkills())
// UpdateEquipSkillCoolDown();
}
else if (cmd == CommandID.TASK_VAR_DATA)
{
//cmd_task_var_data* pCmd = (cmd_task_var_data*)Msg.dwParam1;
//ASSERT(pCmd);
//if (m_pTaskInterface)
// OnServerNotify(m_pTaskInterface, pCmd.data, pCmd.size);
//else
// ASSERT(m_pTaskInterface);
}
}
#endregion
+8 -3
View File
@@ -33,18 +33,23 @@ struct cmd_notify_hostpos
struct cmd_task_data
{
public uint active_list_size;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
public byte[] active_list;
public uint finished_list_size;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
public byte[] finished_list;
public uint finished_time_list_size;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
public byte[] finished_time_list;
public uint finished_count_size;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
public byte[] finished_count;
public uint storage_task_size;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
public byte[] storage_task;
public static cmd_task_data FromPointer(IntPtr ptr)
@@ -62,7 +67,7 @@ struct cmd_task_data
cmd_task_data result = new cmd_task_data();
int offset = 0;
result.active_list_size = (uint)ReadULong(buffer, ref offset);
result.active_list_size = (uint)ReadULong(buffer, ref offset, 4);
result.active_list = ReadBytes(buffer, ref offset, (int)result.active_list_size);
result.finished_list_size = (uint)ReadULong(buffer, ref offset);
@@ -80,10 +85,10 @@ struct cmd_task_data
return result;
}
private static ulong ReadULong(byte[] buffer, ref int offset)
private static ulong ReadULong(byte[] buffer, ref int offset, int plusOffset = 4)
{
ulong value = BitConverter.ToUInt64(buffer, offset);
offset += 8;
offset += plusOffset;
return value;
}