From 2f083c870d6f1facf415d323d5b15064c56aafaf Mon Sep 17 00:00:00 2001 From: CuongNV <> Date: Mon, 6 Apr 2026 15:23:59 +0700 Subject: [PATCH] add chat world --- .../AddressableAssetSettings.asset | 2 +- Assets/PerfectWorld/Scene/Bootstrap.unity | 4 +- .../ChatSystems/ChatSystemSO.asset | 2 +- .../Scripts/Network/CSNetwork/GameSession.cs | 5 + .../ChatSystem/prefab_ChatSystemUI.prefab | 260 ++++++++++++++++++ Assets/Scripts/ChatInputHandler.cs | 24 +- 6 files changed, 291 insertions(+), 6 deletions(-) diff --git a/Assets/AddressableAssetsData/AddressableAssetSettings.asset b/Assets/AddressableAssetsData/AddressableAssetSettings.asset index facbfd458a..eda79b7505 100644 --- a/Assets/AddressableAssetsData/AddressableAssetSettings.asset +++ b/Assets/AddressableAssetsData/AddressableAssetSettings.asset @@ -15,7 +15,7 @@ MonoBehaviour: m_DefaultGroup: 712e3991f28e549e7a56ee582a977810 m_currentHash: serializedVersion: 2 - Hash: ec556b9286c32f07c98465852313f969 + Hash: 41c41b13ea35c18cbe070571d3534efa m_OptimizeCatalogSize: 0 m_BuildRemoteCatalog: 0 m_CatalogRequestsTimeout: 0 diff --git a/Assets/PerfectWorld/Scene/Bootstrap.unity b/Assets/PerfectWorld/Scene/Bootstrap.unity index bffa094768..05360e0fde 100644 --- a/Assets/PerfectWorld/Scene/Bootstrap.unity +++ b/Assets/PerfectWorld/Scene/Bootstrap.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7245ad76b42e0f3f97f2cc7990d79ff171b5f78e64bad057b5acae21bed80395 -size 321521 +oid sha256:543e09f5571b2d48dd57646eee06f8efbc71e6aaa62d6e8a98a529dec44b7364 +size 322591 diff --git a/Assets/PerfectWorld/ScriptableObjects/ChatSystems/ChatSystemSO.asset b/Assets/PerfectWorld/ScriptableObjects/ChatSystems/ChatSystemSO.asset index 9647a2c4e3..fc7419f643 100644 --- a/Assets/PerfectWorld/ScriptableObjects/ChatSystems/ChatSystemSO.asset +++ b/Assets/PerfectWorld/ScriptableObjects/ChatSystems/ChatSystemSO.asset @@ -37,7 +37,7 @@ MonoBehaviour: prefix: - channel: 1 iconName: - icon: {fileID: 0} + icon: {fileID: 21300000, guid: 4c42fa6e60df2184fa1a7d606bdbac8c, type: 3} prefix: '!@' - channel: 7 iconName: diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs index e7b0fe974f..7fa763edc0 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs @@ -2033,6 +2033,11 @@ namespace CSNetwork { worldchat p = (worldchat)pProtocol; + // Tránh trùng với echo local trong SendChatData: server vẫn có thể broadcast + // worldchat về đúng người gửi; khi đó đã hiển thị ở SendChatData rồi. + if (p.Roleid == m_iCharID) + return true; + CECGameUIMan pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan(); CECStringTab pStrTab = EC_Game.GetFixedMsgs(); diff --git a/Assets/Prefabs/ChatSystem/prefab_ChatSystemUI.prefab b/Assets/Prefabs/ChatSystem/prefab_ChatSystemUI.prefab index 53cae663d8..58904004cc 100644 --- a/Assets/Prefabs/ChatSystem/prefab_ChatSystemUI.prefab +++ b/Assets/Prefabs/ChatSystem/prefab_ChatSystemUI.prefab @@ -298,6 +298,8 @@ MonoBehaviour: button: {fileID: 1690303811971402318} - channel: 8 button: {fileID: 5620031369785857446} + - channel: 1 + button: {fileID: 8966563982496817389} --- !u!114 &806784442167936328 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1329,6 +1331,142 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &4462775877009399025 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7795282280205679886} + - component: {fileID: 653827421901241620} + - component: {fileID: 7303489182730371871} + 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 &7795282280205679886 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4462775877009399025} + 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: 1847659348073965440} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -0.1000061, y: 1.6449986} + m_SizeDelta: {x: -10.600004, y: -13.610002} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &653827421901241620 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4462775877009399025} + m_CullTransparentMesh: 1 +--- !u!114 &7303489182730371871 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4462775877009399025} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "Th\u1EBF gi\u1EDBi" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2} + m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 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} --- !u!1 &4662784239972087670 GameObject: m_ObjectHideFlags: 0 @@ -2682,6 +2820,7 @@ RectTransform: - {fileID: 2818704151482351807} - {fileID: 7768785220414438176} - {fileID: 9191482712609232228} + - {fileID: 1847659348073965440} m_Father: {fileID: 7512115805537874560} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} @@ -2753,6 +2892,127 @@ MonoBehaviour: m_ChildScaleWidth: 1 m_ChildScaleHeight: 1 m_ReverseArrangement: 0 +--- !u!1 &7995398686206608668 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1847659348073965440} + - component: {fileID: 519132139347130033} + - component: {fileID: 2123756557947707806} + - component: {fileID: 8966563982496817389} + m_Layer: 5 + m_Name: Button (5) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1847659348073965440 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7995398686206608668} + 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: 7795282280205679886} + m_Father: {fileID: 5764262791542584507} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &519132139347130033 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7995398686206608668} + m_CullTransparentMesh: 1 +--- !u!114 &2123756557947707806 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7995398686206608668} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 3b5dda180f088234f97e05dd0bf05463, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &8966563982496817389 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7995398686206608668} + 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: 2123756557947707806} + m_OnClick: + m_PersistentCalls: + m_Calls: [] --- !u!1 &8338334069910121121 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/ChatInputHandler.cs b/Assets/Scripts/ChatInputHandler.cs index 9204c57da9..09226d7ebf 100644 --- a/Assets/Scripts/ChatInputHandler.cs +++ b/Assets/Scripts/ChatInputHandler.cs @@ -3,9 +3,12 @@ using UnityEngine; using TMPro; using CSNetwork.GPDataType; using System.Collections.Generic; +using BrewMonster; using BrewMonster.Network; +using BrewMonster.Scripts.Managers; using BrewMonster.UI; using CSNetwork; +using PerfectWorld.Scripts.Managers; namespace BrewMonster.Scripts.ChatUI { @@ -233,6 +236,11 @@ namespace BrewMonster.Scripts.ChatUI ChatChannel resolvedChannel = ParseAndSendMessage(strText, nPack, nSlot); + if (resolvedChannel == ChatChannel.GP_CHAT_FARCRY && strText.StartsWith("!@")) + m_dwTickFarCry = now; + if (resolvedChannel == ChatChannel.GP_CHAT_SUPERFARCRY && strText.StartsWith("!#")) + m_dwTickFarCry2 = now; + SaveHistory(resolvedChannel, strText, nPack, nSlot, now); ClearTextInInputField(); @@ -601,7 +609,19 @@ namespace BrewMonster.Scripts.ChatUI inputField.ActivateInputField(); } - private int GetPlayerItemCount(int id) => 0; - private int GetPlayerLevel() => 10; + /// + /// C++: GetHostPlayer()->GetPack()->GetItemTotalNum(id) — đếm túi chính. + /// + private int GetPlayerItemCount(int templateId) + { + var host = EC_Game.GetGameRun()?.GetHostPlayer(); + EC_Inventory pack = host?.GetPack(); + return pack?.GetItemTotalNum(templateId) ?? 0; + } + + private int GetPlayerLevel() + { + return EC_Game.GetGameRun()?.GetHostPlayer()?.GetBasicProps().iLevel ?? 0; + } } }