diff --git a/Assets/PerfectWorld/Prefab/Task/UI/EmotionWindow.prefab b/Assets/PerfectWorld/Prefab/Task/UI/EmotionWindow.prefab new file mode 100644 index 0000000000..9842b6cba5 --- /dev/null +++ b/Assets/PerfectWorld/Prefab/Task/UI/EmotionWindow.prefab @@ -0,0 +1,397 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &111271885693053298 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 562642038236230410} + - component: {fileID: 3682957078725161371} + m_Layer: 5 + m_Name: EmotionWindow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &562642038236230410 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 111271885693053298} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6149182975052679886} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &3682957078725161371 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 111271885693053298} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e42ed2cbf208e60488b8bc1d63a3b1d7, type: 3} + m_Name: + m_EditorClassIdentifier: + slot: 0 +--- !u!1 &2171808091279523492 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2795398590258317195} + - component: {fileID: 659088020461764430} + - component: {fileID: 8890278808492480577} + - component: {fileID: 1984081446122729312} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2795398590258317195 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2171808091279523492} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 2.5381, y: 2.5381, z: 2.5381} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3590330098133380806} + m_Father: {fileID: 6149182975052679886} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -435} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &659088020461764430 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2171808091279523492} + m_CullTransparentMesh: 1 +--- !u!114 &8890278808492480577 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2171808091279523492} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1984081446122729312 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2171808091279523492} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 8890278808492480577} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 3682957078725161371} + m_TargetAssemblyTypeName: BrewMonster.UI.EmoteWindow, Assembly-CSharp + m_MethodName: OnDragClick + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &4678669480211337198 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6149182975052679886} + - component: {fileID: 3021640613906495181} + - component: {fileID: 7003611699134334505} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6149182975052679886 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4678669480211337198} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2795398590258317195} + m_Father: {fileID: 562642038236230410} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3021640613906495181 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4678669480211337198} + m_CullTransparentMesh: 1 +--- !u!114 &7003611699134334505 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4678669480211337198} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8679245, g: 0.7242908, b: 0.1514774, a: 0.20392157} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &6260694520480554099 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3590330098133380806} + - component: {fileID: 7504965690579856955} + - component: {fileID: 8982944209707270503} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3590330098133380806 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6260694520480554099} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2795398590258317195} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7504965690579856955 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6260694520480554099} + m_CullTransparentMesh: 1 +--- !u!114 &8982944209707270503 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6260694520480554099} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: WaveHand + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} diff --git a/Assets/PerfectWorld/Prefab/Task/UI/EmotionWindow.prefab.meta b/Assets/PerfectWorld/Prefab/Task/UI/EmotionWindow.prefab.meta new file mode 100644 index 0000000000..d75819fd8d --- /dev/null +++ b/Assets/PerfectWorld/Prefab/Task/UI/EmotionWindow.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: eb88919320b4229459c83b6b1f8f1e7b +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset b/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset index 58a0cfb272..6e9766d861 100644 --- a/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset +++ b/Assets/PerfectWorld/Resources/UI/DialogScriptTableObject.asset @@ -21,3 +21,5 @@ MonoBehaviour: prefab: {fileID: 903595479696773158, guid: cf26d96ae7d984ba8a5b6cef44adffeb, type: 3} - id: Win_Task prefab: {fileID: 6999114045547682248, guid: 8027cada0ef5e4a9f827001b4747174d, type: 3} + - id: Win_SkillSubAction + prefab: {fileID: 111271885693053298, guid: eb88919320b4229459c83b6b1f8f1e7b, type: 3} diff --git a/Assets/PerfectWorld/Scene/TaskTest.unity b/Assets/PerfectWorld/Scene/TaskTest.unity index 408ffe954c..269e02881b 100644 --- a/Assets/PerfectWorld/Scene/TaskTest.unity +++ b/Assets/PerfectWorld/Scene/TaskTest.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3c180e1658dbb5bd3b438f36770253ae8e04dff1d86b8b22e2bc279b683134d8 -size 10732 +oid sha256:305e74354eced472681f3a976c741e7e70d3ce8ba20714b215ac2e700299a956 +size 10892 diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs index 42ade273a7..7f44bd9e2f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs @@ -750,6 +750,14 @@ namespace BrewMonster.Scripts { return IsWorkRunning(Host_work_ID.WORK_SIT); } + public bool IsStanding() + { + return IsWorkRunning(Host_work_ID.WORK_STAND); + } + public bool IsBeingBound() + { + return IsWorkRunning(Host_work_ID.WORK_BEBOUND); + } //todo: use this method public void FinishAllWork(bool bGotoStand) { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs b/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs index 366d8c571f..a2f91a0ba7 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs @@ -62,6 +62,7 @@ namespace PerfectWorld.Scripts.Managers case EC_MsgDef.MSG_PM_FACTION_PVP_MASK_MODIFY: case EC_MsgDef.MSG_PM_PLAYERATKRESULT: case EC_MsgDef.MSG_PM_CASTSKILL: + case EC_MsgDef.MSG_PM_PLAYERDOEMOTE: TransmitMessage(Msg); break; case int value when value == EC_MsgDef.MSG_PM_PLAYERDIED: @@ -620,6 +621,18 @@ namespace PerfectWorld.Scripts.Managers case CommandID.PLAYER_CAST_RUNE_SKILL: cid = ((cmd_player_cast_rune_skill*)Msg.dwParam1).caster; break; case CommandID.PLAYER_CAST_RUNE_INSTANT_SKILL: cid = ((cmd_player_cast_rune_instant_skill*)Msg.dwParam1).caster; break;*/ } + break; + case long value when value == EC_MsgDef.MSG_PM_PLAYERDOEMOTE: + + if (Convert.ToInt32(Msg.dwParam2) == CommandID.OBJECT_DO_EMOTE) + { + cmd_object_do_emote pCmdDoEmote = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1); + cid = pCmdDoEmote.id; + } + else // Msg.dwParam2 == OBJECT_EMOTE_RESTORE + { + // cid = ((cmd_object_emote_restore*)Msg.dwParam1)->id; + } break; // ⚠️ Các case khác cũng tương tự, chỉ việc lấy ra đúng trường id / caster / user ... diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs index d9aa8caad5..d6c3aa8471 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs @@ -652,6 +652,14 @@ namespace CSNetwork.C2SCommand return octets; } + public static Octets CreateEmoteActionCmd(int wPose) + { + cmd_emote_action pCmd = new cmd_emote_action() + { + action = (ushort)wPose + }; + return SerializeCommand(CommandID.EMOTE_ACTION, pCmd); + } // TODO: Check orginal C++ implementation public static Octets CreateTaskNotifyCmd(byte[] pData, uint dwDataSize) diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs index 3d34ba5156..4133f8f6ef 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using BrewMonster; namespace CSNetwork { @@ -61,6 +62,11 @@ namespace CSNetwork for (i = 0; i < count; i++) { ECMSG msg = Instance.m_MsgList.Dequeue(); + if (!Instance.m_MsgHandlerList.ContainsKey(msg.iManager)) + { + BMLogger.LogError("Did not find handler ID: " + msg.iManager); + continue; + } Instance.m_tempHandler = Instance.m_MsgHandlerList[msg.iManager]; if (Instance.m_tempHandler != null) { diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_MsgDef.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_MsgDef.cs index 1093f94fbb..074b16e4de 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_MsgDef.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_MsgDef.cs @@ -184,7 +184,7 @@ namespace CSNetwork public static int MSG_PM_PLAYERSITDOWN = 369; // Player sit down / stand up public const int MSG_PM_PLAYERATKRESULT = 370; // Player attack result public static int MSG_PM_PLAYEREXTSTATE = 371; // Player extend states changed - public static int MSG_PM_PLAYERDOEMOTE = 372; // Player do emotion + public const int MSG_PM_PLAYERDOEMOTE = 372; // Player do emotion public static int MSG_PM_PLAYERUSEITEM = 373; // Player use item public static int MSG_PM_PLAYERCUSTOM = 374; // Player custom data public static int MSG_PM_ENCHANTRESULT = 375; // Enchant result diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs index cc9791f03f..735ffe5329 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs @@ -1759,6 +1759,12 @@ namespace CSNetwork.GPDataType public ushort id; public int expiretime; public char flag; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + struct cmd_emote_action + { + public ushort action; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] @@ -1826,6 +1832,13 @@ namespace CSNetwork.GPDataType public int op; public int goal_id; }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_object_do_emote + { + public int id; + public ushort emotion; + }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct cmd_task_deliver_item diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs index 57d055bd52..cdc1ea0d9f 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs @@ -733,6 +733,10 @@ namespace CSNetwork case CommandID.OWN_EXT_PROP: EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_OWNEXTPROP, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader); break; + case CommandID.OBJECT_DO_EMOTE: + case CommandID.OBJECT_EMOTE_RESTORE: + EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERDOEMOTE, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader); + break; } } @@ -1286,7 +1290,12 @@ namespace CSNetwork iCount += iNumSend; } } - + public void c2s_SendCmdEmoteAction(uint wPose) + { + gamedatasend gamedatasend = new gamedatasend(); + gamedatasend.Data = C2SCommandFactory.CreateEmoteActionCmd((int)wPose); + SendProtocol(gamedatasend); + } public void c2s_SendCmdTaskNotify(byte[] pData, uint dwDataSize) { gamedatasend gamedatasend = new gamedatasend(); diff --git a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs index 7891a9813d..78ee566f9e 100644 --- a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs @@ -329,6 +329,10 @@ namespace BrewMonster.Network Instance._gameSession.c2s_SendCmdGetAllData(byPack, byEquip, byTask); } + public static void c2s_CmdEmoteAction(uint wPose) + { + Instance._gameSession.c2s_SendCmdEmoteAction(wPose); + } public static void c2s_CmdTaskNotify( byte[] pBuf, uint sz) { Instance._gameSession.c2s_SendCmdTaskNotify( pBuf, sz); diff --git a/Assets/PerfectWorld/Scripts/Objet/Shortcut/CECShortcutSet.cs b/Assets/PerfectWorld/Scripts/Objet/Shortcut/CECShortcutSet.cs index 6c48aa75c9..9f8a6ae62a 100644 --- a/Assets/PerfectWorld/Scripts/Objet/Shortcut/CECShortcutSet.cs +++ b/Assets/PerfectWorld/Scripts/Objet/Shortcut/CECShortcutSet.cs @@ -778,20 +778,154 @@ namespace BrewMonster { return m_iSCType; } - //public abstract CECShortcut Clone(); + + public virtual CECShortcut Clone() + { + return new CECShortcut(); + } public virtual bool Execute() { return true; } } - /* public class CECSCCommand : CECShortcut - { - public const int CMD_PLAYPOSE = 1; // Example constant - public override ShortcutType GetType() => ShortcutType.SCT_COMMAND; - public override CECShortcut Clone() => null; - public int GetCommandID() => 0; - public int GetParam() => 0; - } + public class CECSCCommand : CECShortcut + { + private int m_iCommand; // Command ID + private uint m_dwParam; // Parameter + public enum CommandID + { + CMD_UNKNOWN = -1, + CMD_SITDOWN = 0, + CMD_WALKRUN, + CMD_NORMALATTACK, + CMD_FINDTARGET, + CMD_ASSISTATTACK, + CMD_INVITETOTEAM, + CMD_LEAVETEAM, + CMD_KICKTEAMMEM, + CMD_FINDTEAM, + CMD_STARTTRADE, + CMD_SELLBOOTH, + CMD_BUYBOOTH, + CMD_PLAYPOSE, + CMD_INVITETOFACTION, + CMD_FLY, + CMD_PICKUP, + CMD_GATHER, + CMD_RUSHFLY, + CMD_BINDBUDDY, + } + public CECSCCommand(int iCommand) + { + m_iSCType = (int)ShortcutType.SCT_COMMAND; + m_iCommand = iCommand; + m_dwParam = 0; + } - public class CECSCSkill : CECShortcut + public CECSCCommand(CECSCCommand src) + { + m_iCommand = src.m_iCommand; + m_dwParam = src.m_dwParam; + } + public const int CMD_PLAYPOSE = 1; // Example constant + // public override ShortcutType GetType() => ShortcutType.SCT_COMMAND; + public override CECShortcut Clone() => new CECSCCommand(this); + public int GetCommandID() => 0; + public int GetParam() => 0; + + // Set / Get command parameter + public void SetParam(uint dwParam) { m_dwParam = dwParam; } + + // Execute shortcut + public override bool Execute() + { + CECHostPlayer pHost = CECGameRun.Instance.GetHostPlayer(); + if (!pHost || !pHost.IsAllResReady()) + return false; + + // if (GetCoolTime(0)>0) + // { + // bool bForbidCmd = true; + // if (m_iCommand == CMD_RUSHFLY && pHost.GetRushFlyFlag()) + // bForbidCmd = false; + // + // if (bForbidCmd) + // { + // g_pGame->GetGameRun()->AddFixedMessage(FIXMSG_CMD_INCOOLTIME); + // return false; + // } + // } + switch (m_iCommand) + { + // case CMD_SITDOWN: pHost->CmdSitDown(!pHost->IsSitting()); break; + // case CMD_WALKRUN: pHost->CmdWalkRun(!pHost->GetWalkRunFlag()); break; + // case CMD_NORMALATTACK: pHost->CmdNormalAttack(); break; + // case CMD_FINDTARGET: pHost->CmdFindTarget(); break; + // case CMD_ASSISTATTACK: pHost->CmdAssistAttack(); break; + // case CMD_INVITETOTEAM: pHost->CmdInviteToTeam(); break; + // case CMD_LEAVETEAM: pHost->CmdLeaveTeam(); break; + // case CMD_KICKTEAMMEM: pHost->CmdKickTeamMember(); break; + // case CMD_FINDTEAM: pHost->CmdFindTeam(); break; + // case CMD_STARTTRADE: pHost->CmdStartTrade(); break; + // case CMD_SELLBOOTH: pHost->CmdSellBooth(); break; + // case CMD_BUYBOOTH: pHost->CmdBuyBooth(); break; + case (int)CommandID.CMD_PLAYPOSE: pHost.CmdStartPose((int)m_dwParam); break; + // case CMD_INVITETOFACTION: pHost->CmdInviteToFaction(); break; + // case CMD_FLY: + // { + // // Èç¹ûÆï³ËÒª·ÉÐУ¬ÔòÕâЩ action switcher£¬·ñÔò CmdFly + // if (!pHost->GetActionSwitcher() || !pHost->GetActionSwitcher()->OnRideToFlyAction()) + // pHost->CmdFly(); + // break; + // } + // case CMD_PICKUP: pHost->CmdPickup(); break; + // case CMD_GATHER: pHost->CmdGather(); break; + // case CMD_RUSHFLY: pHost->CmdRushFly(); break; + // case CMD_BINDBUDDY: pHost->CmdBindBuddy(pHost->GetSelectedTarget()); break; + default: + return false; + } + + return true; + } + + // Get item cool time + int GetCoolTime(ref int piMax/* NULL */) + { + CECHostPlayer pHost = CECGameRun.Instance.GetHostPlayer(); + int iTime = 0; + + switch ((CommandID)m_iCommand) + { + case CommandID.CMD_RUSHFLY: + + // iTime = pHost.GetCoolTime(GP_CT_FLY_RUSH, piMax); + break; + + case CommandID.CMD_PLAYPOSE: + // todo need to get cooldown here + // iTime = pHost.GetCoolTime(GP_CT_EMOTE, piMax); + break; + + case CommandID.CMD_BINDBUDDY: + { + // CECCounter& cnt = pHost->GetBindCmdCoolCnt(); + // iTime = cnt.GetPeriod() - cnt.GetCounter(); + // + // if (piMax) + // *piMax = cnt.GetPeriod(); + + break; + } + default: + + // if (piMax) *piMax = 0; + break; + } + + return iTime; + } + } + + /* public class CECSCSkill : CECShortcut { private CECSkill m_pSkill; public override ShortcutType GetType() => ShortcutType.SCT_SKILL; diff --git a/Assets/PerfectWorld/Scripts/Task/CECTaskInterface.cs b/Assets/PerfectWorld/Scripts/Task/CECTaskInterface.cs index e67a7c0ca4..8679b425ac 100644 --- a/Assets/PerfectWorld/Scripts/Task/CECTaskInterface.cs +++ b/Assets/PerfectWorld/Scripts/Task/CECTaskInterface.cs @@ -332,7 +332,7 @@ namespace BrewMonster.Scripts.Task byte[] m_pFinishedCountListBuf;// Finished count list buffer byte[] m_pStorageTaskListBuf; // Storage tasks list buffer private Dictionary m_TasksToConfirm = new Dictionary(); - private readonly System.Collections.Generic.Dictionary m_emotionTask = new System.Collections.Generic.Dictionary(); + private readonly Dictionary m_emotionTask = new System.Collections.Generic.Dictionary(); private bool m_bForceNavigateFinish; private int m_tmFinishDlgShown; public CECTaskInterface() @@ -1660,6 +1660,83 @@ namespace BrewMonster.Scripts.Task { return m_pFinishedCountListBuf; } + + #region Emote + + public void SetEmotion(int emotion) + { + ActiveTaskList pList = GetActiveTaskList(); + List aEntries = new List(pList.m_TaskEntries); + ATaskTempl pTempl; + + if (emotion < (int)TaskInterface.CommandTaskAction.CMD_EMOTION_BINDBUDDY)// pTempl->m_uiEmotion ֵΪ0±íʾ²»¼ì²é£¬ËùÒÔËùÓбíÇéÐòºÅ¶¼ºóÒÆ1 + emotion += 1; + + for (int i = 0; i < pList.m_uTaskCount; i++) + { + ActiveTaskEntry curEntry = aEntries[i]; + pTempl = curEntry.GetTempl(); + + if (pTempl != null && + pTempl.m_FixedData.m_enumMethod == (uint)TaskCompletionMethod.enumTMSimpleClientTask && + pTempl.m_FixedData.m_uiEmotion > 0) + { + uint id = pTempl.GetID(); + + // Check if map does not contain OR value == false + if (!m_emotionTask.TryGetValue(id, out bool exists) || !exists) + { + m_emotionTask[id] = (pTempl.m_FixedData.m_uiEmotion == (uint)emotion); + } + } + } + } + // void CECTaskInterface::UpdateTaskEmotionAction(unsigned int task_id) + // { + // if (m_emotionTask.find(task_id)!=m_emotionTask.end()) + // { + // m_emotionTask[task_id] = false; + // } + // } + // void CECTaskInterface::UpdateEmotionDlg(unsigned int task) + // { + // ActiveTaskList* pList = static_cast(GetActiveTaskList()); + // ActiveTaskEntry* aEntries = pList->m_TaskEntries; + // unsigned char i; + // const ATaskTempl* pTempl, *pTarget = NULL; + // ActiveTaskEntry* pTargetEntry = NULL; + // + // for (i = 0; i < pList->m_uTaskCount; i++) + // { + // ActiveTaskEntry& CurEntry = aEntries[i]; + // pTempl = CurEntry.GetTempl(); + // + // if (!pTempl || pTempl->GetID() == task) + // continue; + // + // if (pTempl && pTempl->m_enumMethod==enumTMSimpleClientTask && pTempl->m_uiEmotion) + // { + // pTarget = pTempl; + // pTargetEntry = &CurEntry; + // break; + // } + // } + // if (pTarget && pTargetEntry && !pTempl->CanFinishTask(this, pTargetEntry, GetCurTime())) + // { + // PopEmotionUI(pTarget->GetID(),pTarget->m_uiEmotion,true); + // } + // } + // void TaskInterface::PopEmotionUI(unsigned int task_id,unsigned int uiEmotion,bool bShow) + // { + // CECGameUIMan* pGameUI = g_pGame->GetGameRun()->GetUIManager()->GetInGameUIMan(); + // + // if (pGameUI) + // { + // pGameUI->PopTaskEmotionDlg(task_id,uiEmotion,bShow); + // } + // } + + #endregion } diff --git a/Assets/PerfectWorld/Scripts/Task/TaskInterface.cs b/Assets/PerfectWorld/Scripts/Task/TaskInterface.cs index 9b7623b4c6..8d8f97d680 100644 --- a/Assets/PerfectWorld/Scripts/Task/TaskInterface.cs +++ b/Assets/PerfectWorld/Scripts/Task/TaskInterface.cs @@ -94,6 +94,14 @@ namespace BrewMonster.Scripts.Task uint CanDeliverTask(uint ulTaskId); void UpdateTaskUI(uint idTask, int reason); #endif + public enum CommandTaskAction + { + CMD_EMOTION_BINDBUDDY = 1024, // If there are other non-expression actions, they will be 1025, 1026... + CMD_EMOTION_SITDOWN, // Sit down + CMD_JUMP_TRICKACTION, // Jump and roll + CMD_RUN_TRICKACTION, // Run and roll + } + // bool HasTask(uint taskId); // bool CheckTaskForbid(uint taskId); long GetGlobalValue(long key); diff --git a/Assets/PerfectWorld/Scripts/Task/TaskTest.cs b/Assets/PerfectWorld/Scripts/Task/TaskTest.cs index 0816038523..fb2fd75ede 100644 --- a/Assets/PerfectWorld/Scripts/Task/TaskTest.cs +++ b/Assets/PerfectWorld/Scripts/Task/TaskTest.cs @@ -1,12 +1,9 @@ -using BrewMonster; using System; using System.IO; using System.Reflection; using System.Runtime.InteropServices; using BrewMonster.Scripts.Task.UI; using BrewMonster.Scripts.UI; -using BrewMonster.UI; -using CSNetwork.Common; using ModelRenderer.Scripts.Common; using PerfectWorld.Scripts.Task; using UnityEngine; @@ -59,6 +56,18 @@ namespace BrewMonster.Scripts.Task pAward.Show(false); } } + if (Input.GetKeyDown(KeyCode.E)) + { + var dlg = CECUIManager.Instance.GetInGameUIMan().GetDialog("Win_SkillSubAction"); + if (dlg && !dlg.gameObject.activeInHierarchy) + { + dlg.Show(true); + } + else + { + dlg.Show(false); + } + } #endif } diff --git a/Assets/PerfectWorld/Scripts/Task/UI/EmoteWindow.cs b/Assets/PerfectWorld/Scripts/Task/UI/EmoteWindow.cs new file mode 100644 index 0000000000..d50eb53ae5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Task/UI/EmoteWindow.cs @@ -0,0 +1,132 @@ +using BrewMonster.Assets.PerfectWorld.Scripts.UI.GamePlay; +using BrewMonster.Network; +using UnityEngine; +using UnityEngine.UI; + +namespace BrewMonster.UI +{ + public class EmoteWindow : AUIDialog + { + public override void Show(bool value) + { + base.Show(value); + // int i, j; + // char szName[40]; + // string strFile; + // CECShortcut pSCThis; + // PAUIIMAGEPICTURE pImage; + // PAUILABEL pLabel; + // CECGameRun pGameRun = EC_Game.GetGameRun(); + // CECShortcutSet[] a_pSC = + // { + // pGameRun.GetGenCmdShortcuts(), + // pGameRun.GetTeamCmdShortcuts(), + // pGameRun.GetTradeCmdShortcuts(), + // pGameRun.GetPoseCmdShortcuts() + // }; + // char *a_pszPrefix[] = { "BscCmd_", "TeamCmd_","TradeCmd_", "FaceCmd_" }; + // char *a_pszTxtPrefix[] = { "Txt_BscCmd", "Txt_TeamCmd", "Txt_TradeCmd", "Txt_FaceCmd" }; + // int objCount[] = { 9, 3, 3, 30 }; + // + // a_LogOutput(1, "[Dat Emote] CDlgSkillSubAction::OnShowDialog"); + // a_LogOutput(1, "[Dat Emote] CDlgSkillSubAction::OnShowDialog szName: %s", szName); + // + // for( i = 0; i < sizeof(a_pSC) / sizeof(CECShortcutSet *); i++ ) + // { + // for( j = 0; j < objCount[i]; j++ ) + // { + // sprintf(szName, "%s%02d", a_pszPrefix[i], j + 1); + // pImage = dynamic_cast(GetDlgItem(szName)); + // + // sprintf(szName, "%s%02d", a_pszTxtPrefix[i], j + 1); + // pLabel = dynamic_cast(GetDlgItem(szName)); + // + // if( !pImage ) break; + // + // if (j < a_pSC[i]->GetShortcutNum()) { + // pSCThis = a_pSC[i]->GetShortcut(j); + // pImage->SetDataPtr(pSCThis,"ptr_CECShortcut"); + // + // af_GetFileTitle(pSCThis->GetIconFile(), strFile); + // strFile.MakeLower(); + // pImage->SetCover(GetGameUIMan()->m_pA2DSpriteIcons[CECGameUIMan::ICONS_ACTION], + // GetGameUIMan()->m_IconMap[CECGameUIMan::ICONS_ACTION][strFile]); + // + // pLabel->SetText(pSCThis->GetDesc()); + // } else { + // pImage->Show(false); + // pLabel->Show(false); + // } + // } + // } + +// ÔÚÇл»½çÃæ·ç¸ñµÄʱºò£¬´Ëʱ¿ÉÄܸ¸¶Ô»°¿òÖ¸ÕëΪ¿Õ + // if (GetParentDlgControl()) { + // SIZE size; + // size.cx = 326; + // size.cy = 720; + // size.cx = (int)(size.cx * m_pAUIManager->GetWindowScale() + 0.5f); + // size.cy = (int)(size.cy * m_pAUIManager->GetWindowScale() + 0.5f); + // + // if (!m_bSetVScroll) { + // GetParentDlgControl()->SetSubDialogOrgSize(size.cx, size.cy); + // m_bSetVScroll = true; + // } + // } + } + + public int slot; + [ContextMenu("Test")] + public void OnDragClick() //PAUIDIALOG pDlgSrc, PAUIOBJECT pObjSrc, PAUIDIALOG pDlgOver, PAUIOBJECT pObjOver + { + // bool bInAutoMode = CECAutoPolicy::GetInstance().IsAutoPolicyEnabled(); + + // if (strstr(pDlgSrc->GetName(), "Win_Quickbar") || + // 0 == stricmp(pDlgSrc->GetName(), "Win_SkillSubAction")) // 20140708 ÐµĶ¯×÷½çÃæ + // { + // if (bInAutoMode) return; + //todo: dummy call StartGame + // EC_Game.GetGameRun().StartGame(0, Vector3.zero); + if (EC_Game.GetGameRun().GetPoseCmdShortcuts() == null) + { + EC_Game.GetGameRun().StartGame(0, Vector3.zero); + } + CECShortcut pSC = EC_Game.GetGameRun().GetPoseCmdShortcuts().GetShortcut(slot); + // if (CDlgAutoHelp::IsAutoHelp() && strstr(pDlgSrc->GetName(), "Win_Quickbar")) + // { + // a_LogOutput(1, "[Dat Emote] Win_Quickbar"); + // if (pSC->GetType() == CECShortcut::SCT_SKILL) + // { + // CECSCSkill* pSkillSC = dynamic_cast(pSC); + // if (pSkillSC && pSkillSC->GetSkill()) + // CDlgWikiShortcut::PopSkillWiki(GetGameUIMan(), pSkillSC->GetSkill()->GetSkillID()); + // + // } + // else if (pSC->GetType() == CECShortcut::SCT_ITEM) + // { + // CECSCItem* pItemSC = dynamic_cast(pSC); + // CECIvtrItem* pItem = CECIvtrItem::CreateItem(pItemSC->GetItemTID(), 0, 1); + // if (pItem) + // { + // CDlgWikiShortcut::PopItemWiki(GetGameUIMan(), pItem); + // delete pItem; + // } + // } + // else + // { + // GetGameUIMan()->MessageBox("", GetStringFromTable(10754), MB_OK, + // A3DCOLORRGBA(255, 255, 255, 160)); + // } + // } + // else + // { + if (pSC != null) // && pObjSrc->GetDataPtr("ptr_CECShortcut") == pSC + { + // a_LogOutput(1, "[Dat Emote] ptr_CECShortcut"); + pSC.Execute(); + } + // } + // } + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Task/UI/EmoteWindow.cs.meta b/Assets/PerfectWorld/Scripts/Task/UI/EmoteWindow.cs.meta new file mode 100644 index 0000000000..8b7bd8d6f6 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Task/UI/EmoteWindow.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e42ed2cbf208e60488b8bc1d63a3b1d7 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/AUIDialog.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/AUIDialog.cs index 014e50b7a8..e437bf2489 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/AUIDialog.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/AUIDialog.cs @@ -17,6 +17,7 @@ namespace BrewMonster.UI public virtual void Show(bool value) { gameObject.SetActive(value); + OnShowDialogue(); } public void SetData(uint dwData, string strName) @@ -99,6 +100,9 @@ namespace BrewMonster.UI { } - + public virtual void OnShowDialogue() + { + + } } } diff --git a/Assets/Scripts/CECGameRun.cs b/Assets/Scripts/CECGameRun.cs index 7f43df85e0..a8ef8fdf92 100644 --- a/Assets/Scripts/CECGameRun.cs +++ b/Assets/Scripts/CECGameRun.cs @@ -18,6 +18,13 @@ public partial class CECGameRun private GameObject _playerPrefab; private GameObject _monsterPrefab;//CECMonster private GameObject _npcServerPrefab;//CECNPCServer + + // CECTeamMan* m_pTeamMan; // Team manager + private CECShortcutSet m_pNormalSCS; // Normal shortcut set + private CECShortcutSet m_pTeamSCS; // Team shortcut set + private CECShortcutSet m_pTradeSCS; // Trade shortcut set + private CECShortcutSet m_pPoseSCS; // Pose shortcut set + private CECShortcutSet m_pFactionSCS; // Faction shortcut set // private GameRunConfig _gameRunConfig; //[SerializeField] private Transform ground; @@ -27,6 +34,12 @@ public partial class CECGameRun protected CECUIManager m_pUIManager; // UI manager public CECWorld GetWorld() { return m_pWorld; } + // Get shortcut sets + public CECShortcutSet GetGenCmdShortcuts() { return m_pNormalSCS; } + public CECShortcutSet GetTeamCmdShortcuts() { return m_pTeamSCS; } + public CECShortcutSet GetTradeCmdShortcuts() { return m_pTradeSCS; } + public CECShortcutSet GetPoseCmdShortcuts() { return m_pPoseSCS; } + public CECShortcutSet GetFactionCmdShortcuts() { return m_pFactionSCS; } private static Dictionary m_InstTab = new Dictionary(); public void Init() @@ -50,6 +63,7 @@ public partial class CECGameRun //} m_InstTab.Add(161, new CECInstance()); AddressableManager.Instance.OnDispose += Dispose; + StartGame(0, Vector3.zero); } private static void Dispose() @@ -66,13 +80,26 @@ public partial class CECGameRun _monsterPrefab = await AddressableManager.Instance.LoadPrefabAsync(AddressResourceConfig.MonsterPrefab); _npcServerPrefab = await AddressableManager.Instance.LoadPrefabAsync(AddressResourceConfig.NpcServerPrefab); } + + private bool init; public bool StartGame(int idInst, Vector3 vHostPos) { + if (init) + { + return false; + } + // Create shortcuts + if (!CreateShortcuts()) + { + return false; + } if (!JumpToInstance(idInst, vHostPos)) { BMLogger.LogError("CECGameRun::StartGame, Failed to create game world."); return false; } + + init = true; return true; } @@ -315,6 +342,76 @@ public partial class CECGameRun return true; } +// Create shortcuts + public bool CreateShortcuts() + { + // // Normal command shortcut set + m_pNormalSCS = new CECShortcutSet(); + m_pNormalSCS.Init(8); + + CECSCCommand pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_SITDOWN); + m_pNormalSCS.SetShortcut(0, pSC); + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_WALKRUN); + m_pNormalSCS.SetShortcut(1, pSC); + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_NORMALATTACK); + m_pNormalSCS.SetShortcut(2, pSC); + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_FINDTARGET); + m_pNormalSCS.SetShortcut(3, pSC); + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_ASSISTATTACK); + m_pNormalSCS.SetShortcut(3, pSC); + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_FLY); + m_pNormalSCS.SetShortcut(4, pSC); + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_PICKUP); + m_pNormalSCS.SetShortcut(5, pSC); + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_GATHER); + m_pNormalSCS.SetShortcut(6, pSC); + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_RUSHFLY); + m_pNormalSCS.SetShortcut(6, pSC); + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_BINDBUDDY); + m_pNormalSCS.SetShortcut(7, pSC); + + // Team command shortcut set + m_pTeamSCS = new CECShortcutSet(); + m_pTeamSCS.Init(2); + + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_INVITETOTEAM); + m_pTeamSCS.SetShortcut(0, pSC); + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_LEAVETEAM); + m_pTeamSCS.SetShortcut(1, pSC); + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_KICKTEAMMEM); + m_pTeamSCS.SetShortcut(2, pSC); + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_FINDTEAM); + m_pTeamSCS.SetShortcut(2, pSC); + + // Trade command shortcut set + m_pTradeSCS = new CECShortcutSet(); + m_pTradeSCS.Init(2); + + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_STARTTRADE); + m_pTradeSCS.SetShortcut(0, pSC); + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_SELLBOOTH); + m_pTradeSCS.SetShortcut(1, pSC); + + // Pose command shortcut set + m_pPoseSCS = new CECShortcutSet(); + m_pPoseSCS.Init((int)RoleExpression.NUM_ROLEEXP); + + for (int i = 0; i < (int)RoleExpression.NUM_ROLEEXP; i++) + { + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_PLAYPOSE); + pSC.SetParam((uint)i); + m_pPoseSCS.SetShortcut(i, pSC); + } + + // Faction command shortcut set + m_pFactionSCS = new CECShortcutSet(); + m_pFactionSCS.Init(1); + + pSC = new CECSCCommand((int)CECSCCommand.CommandID.CMD_INVITETOFACTION); + m_pFactionSCS.SetShortcut(0, pSC); + + return true; + } // Get UI manager diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index a1c4431ae4..89f4cadb44 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -426,6 +426,7 @@ namespace BrewMonster case int value when value == EC_MsgDef.MSG_HST_STOPATTACK: OnMsgHstStopAttack(Msg); break; case int value when value == EC_MsgDef.MSG_HST_SKILLRESULT: OnMsgHstSkillResult(Msg); break; case int value when value == EC_MsgDef.MSG_HST_OWNEXTPROP: OnMsgHstExtProp(Msg); break; + case int value when value == EC_MsgDef.MSG_PM_PLAYERDOEMOTE: OnMsgPlayerDoEmote(Msg); break; } @@ -3652,6 +3653,148 @@ namespace BrewMonster m_BasicProps.iResilience = pCmd.resilience; m_BasicProps.iVigour = pCmd.vigour; } + + private void OnMsgPlayerDoEmote(ECMSG Msg) + { + if (!m_pWorkMan.IsStanding() && + !m_pWorkMan.IsBeingBound()) + return; + + int cmd = Convert.ToInt32(Msg.dwParam2); + if (cmd == CommandID.OBJECT_DO_EMOTE) + { + cmd_object_do_emote pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1); + + DoEmote(pCmd.emotion); + + // if( m_iBuddyId ) + // { + // CECPlayer pBuddy = m_pPlayerMan->GetPlayer(m_iBuddyId); + // if (pBuddy) + // pBuddy->DoEmote(pCmd->emotion); + // } + + GetTaskInterface().SetEmotion(pCmd.emotion); + } + else if (cmd == CommandID.OBJECT_EMOTE_RESTORE) + { + CECHPWork pWork = m_pWorkMan.GetRunningWork((int)WorkID.WORK_STAND); + if (pWork!=null){ + ((CECHPWorkStand)pWork).SetPoseAction((int)PLAYER_ACTION_TYPE.ACT_STAND, false); + } + } + } + + // Do emote action + private bool DoEmote(int idEmote) + { + if (!m_pWorkMan.IsStanding()) + return false; + + CECHPWorkStand pWork = m_pWorkMan.GetRunningWork(Host_work_ID.WORK_STAND) as CECHPWorkStand; + if (pWork == null) + { + Debug.LogError("Null CECHPWorkStand"); + } + + int iAction = (int)PLAYER_ACTION_TYPE.ACT_STAND; + bool bSession = false; + + // Select action according to pose + switch (idEmote) + { + case (int)RoleExpression.ROLEEXP_WAVE: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_WAVE; break; + case (int)RoleExpression.ROLEEXP_NOD: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_NOD; break; + case (int)RoleExpression.ROLEEXP_SHAKEHEAD: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_SHAKEHEAD; break; + case (int)RoleExpression.ROLEEXP_SHRUG: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_SHRUG; break; + case (int)RoleExpression.ROLEEXP_LAUGH: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_LAUGH; break; + case (int)RoleExpression.ROLEEXP_ANGRY: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_ANGRY; break; + case (int)RoleExpression.ROLEEXP_STUN: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_STUN; break; + case (int)RoleExpression.ROLEEXP_DEPRESSED: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_DEPRESSED; break; + case (int)RoleExpression.ROLEEXP_KISSHAND: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_KISSHAND; break; + case (int)RoleExpression.ROLEEXP_SHY: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_SHY; break; + case (int)RoleExpression.ROLEEXP_SALUTE: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_SALUTE; break; + + case (int)RoleExpression.ROLEEXP_SITDOWN: + + iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_SITDOWN; + bSession = true; + break; + + case (int)RoleExpression.ROLEEXP_ASSAULT: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_ASSAULT; break; + case (int)RoleExpression.ROLEEXP_THINK: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_THINK; break; + case (int)RoleExpression.ROLEEXP_DEFIANCE: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_DEFIANCE; break; + case (int)RoleExpression.ROLEEXP_VICTORY: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_VICTORY; break; + case (int)RoleExpression.ROLEEXP_GAPE: iAction = (int)PLAYER_ACTION_TYPE.ACT_GAPE; break; + case (int)RoleExpression.ROLEEXP_KISS: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_KISS; break; + case (int)RoleExpression.ROLEEXP_FIGHT: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_FIGHT; break; + case (int)RoleExpression.ROLEEXP_ATTACK1: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_ATTACK1; break; + case (int)RoleExpression.ROLEEXP_ATTACK2: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_ATTACK2; break; + case (int)RoleExpression.ROLEEXP_ATTACK3: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_ATTACK3; break; + case (int)RoleExpression.ROLEEXP_ATTACK4: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_ATTACK4; break; + case (int)RoleExpression.ROLEEXP_DEFENCE: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_DEFENCE; break; + case (int)RoleExpression.ROLEEXP_FALL: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_FALL; break; + case (int)RoleExpression.ROLEEXP_FALLONGROUND: + iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_FALLONGROUND; break; + case (int)RoleExpression.ROLEEXP_LOOKAROUND: + iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_LOOKAROUND; break; + case (int)RoleExpression.ROLEEXP_DANCE: iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_DANCE; break; + case (int)RoleExpression.ROLEEXP_FASHIONWEAPON: + iAction = (int)PLAYER_ACTION_TYPE.ACT_EXP_FASHIONWEAPON; break; + case (int)RoleExpression.ROLEEXP_TWO_KISS: iAction = (int)PLAYER_ACTION_TYPE.ACT_TWO_KISS; break; + case (int)RoleExpression.ROLEEXP_FIREWORK: iAction = (int)PLAYER_ACTION_TYPE.ACT_ATTACK_TOSS; break; + default: + break; + } + + pWork.SetPoseAction(iAction, bSession); + + return true; + } + + // Get cool time + public int GetCoolTime(int iIndex,ref int piMax/* NULL */) + { + // if (iIndex >= 0 && iIndex < GP_CT_MAX) + // { + // if (piMax>0) + // piMax = m_aCoolTimes[iIndex].iMaxTime; + // + // return m_aCoolTimes[iIndex].iCurTime; + // } + + return 0; + } + // Play a pose + public bool CmdStartPose(int iPose) + { + // first of all see if we need to cancel sitdown work. + if (m_pWorkMan.IsSitting()) + { + UnityGameSession.c2s_CmdStandUp(); + return false; + } + + if (!CanDo(ActionCanDo.CANDO_PLAYPOSE)) + return false; + + if (!m_pWorkMan.IsStanding()) + return false; + + if (iPose == (int)RoleExpression.ROLEEXP_SITDOWN) + { + // UnityGameSession.c2s_CmdSessionEmote(iPose); + } + else if (iPose == (int)RoleExpression.ROLEEXP_KISS) + { + // if (GPDataTypeHelper.ISPLAYERID(m_idSelTarget)) + // UnityGameSession.c2s_CmdConEmoteRequest(RoleExpression.ROLEEXP_KISS, m_idSelTarget); + } + else + UnityGameSession.c2s_CmdEmoteAction((uint)iPose); + + return true; + } } public enum StateAnim