# Table of Contents - [Welcome to MIP Multiplayer HyperLink Chat System | MIP HyperLInk Chat System](#welcome-to-mip-multiplayer-hyperlink-chat-system-mip-hyperlink-chat-system) - [Guide | MIP HyperLInk Chat System](#guide-mip-hyperlink-chat-system) - [Link Item Example | MIP HyperLInk Chat System](#link-item-example-mip-hyperlink-chat-system) - [Player Controller Components | MIP HyperLInk Chat System](#player-controller-components-mip-hyperlink-chat-system) - [v1.2.1 | MIP HyperLInk Chat System](#v1-2-1-mip-hyperlink-chat-system) - [Setup on a new project | MIP HyperLInk Chat System](#setup-on-a-new-project-mip-hyperlink-chat-system) - [Our Features | MIP HyperLInk Chat System](#our-features-mip-hyperlink-chat-system) - [Game State Components | MIP HyperLInk Chat System](#game-state-components-mip-hyperlink-chat-system) - [Pawn Components | MIP HyperLInk Chat System](#pawn-components-mip-hyperlink-chat-system) - [Game Mode Components | MIP HyperLInk Chat System](#game-mode-components-mip-hyperlink-chat-system) - [v1.1 | MIP HyperLInk Chat System](#v1-1-mip-hyperlink-chat-system) - [v1.2 | MIP HyperLInk Chat System](#v1-2-mip-hyperlink-chat-system) - [How to run demo project | MIP HyperLInk Chat System](#how-to-run-demo-project-mip-hyperlink-chat-system) - [Player Controller Components | MIP HyperLInk Chat System](#player-controller-components-mip-hyperlink-chat-system) - [Our Features | MIP HyperLInk Chat System](#our-features-mip-hyperlink-chat-system) - [Guide | MIP HyperLInk Chat System](#guide-mip-hyperlink-chat-system) - [How to run demo project | MIP HyperLInk Chat System](#how-to-run-demo-project-mip-hyperlink-chat-system) - [Setup on a new project | MIP HyperLInk Chat System](#setup-on-a-new-project-mip-hyperlink-chat-system) - [v1.1 | MIP HyperLInk Chat System](#v1-1-mip-hyperlink-chat-system) --- # Welcome to MIP Multiplayer HyperLink Chat System | MIP HyperLInk Chat System > [https://www.unrealengine.com/marketplace/en-US/product/mip-hyperlink-chat-system](https://www.unrealengine.com/marketplace/en-US/product/mip-hyperlink-chat-system) > > [**Showcase video**](https://youtu.be/z1Qn3autzTU) The system currently uses Unreal RPCs to broadcast messages to recipients. However, in the upcoming project, the workload will be offloaded to a backend server, and communication will be established through Socket.IO. [**WIP showcase video**](https://youtu.be/Tb5ayC9dzqM) **Please note that the inventory system in the screenshots is not a part of this plugin; it is just meant to demonstrate what you can do with this plugin.** [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/#overview) Overview ---------------------------------------------------------------------------------- Multiplayer HyperLink Chat System is the first on the marketplace to enable Item Linking in your chat. Item Linking is a common feature in multiplayer RPG games and survival games, but I couldn't find any other product on the marketplace that can do that, so I created it for myself and decided to offer it as marketplace content. Customized Text Layout to properly wrap ImageDecorators, enabling Emoticons for this chat system. With this plugin, you can share and showcase items by generating clickable links within the chat, as well as the ability to create multiple hyperlinked text items within your chat easily. You can create up to four chat tabs, which can be added or removed. They can also be dragged around and attached or detached from the tab container. Each chat tab has its own set of Allowed Chat Channels that can be configured in real-time. [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/#quick-links) Quick links ---------------------------------------------------------------------------------------- [✨Our Features](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview/our-features) [🛠️Setup on a new project](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project) [NextOur Features](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview/our-features) Last updated 1 year ago --- # Guide | MIP HyperLInk Chat System Example Content is included in the plugin's content folder. Go to Plugins>MIPChatSystemContent>Maps and open `MIPCS_DefaultMap.` * Then make sure u run as Client or Listen Server mode. [PreviousSetup on a new project](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project) [NextLink Item Example](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/example-content/link-item-example) Last updated 1 year ago --- # Link Item Example | MIP HyperLInk Chat System This will guide you through the example functions I made in `BP_MIPCS_PC` to link an item in the chat. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/example-content/link-item-example#linkitem-in-bp_mipcs_pc) LinkItem in BP\_MIPCS\_PC ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252FKxbY7iI4gUHEpBiHB6zH%252Fimage.png%3Falt%3Dmedia%26token%3D1865043e-510f-48db-a3dc-af015b8fdcfa&width=300&dpr=4&quality=100&sign=419f2290&sv=2) This function will try to get `Item` from `ItemsDT` then call `LinkItem()` in `MIPChatItemLinker` `MIPChatItemLinker->LinkItem()` requires 1. `ItemNameString`: is what will display on the chat. 2. `ItemContent`: content u want to pass in order to construct your item, such as ItemId in this example. In my Inventory System, I pass `ItemId`, `EnhanceLevel`, `Max/Current Durability`, etc as `JSON string` in order to construct my item. 3. `Style`: is the text style defined in `DT_MIPChatRichText` such as `Legendary`, `Epic`, etc.![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252FgHWB3DVdjsCjw4CHvhPK%252Fimage.png%3Falt%3Dmedia%26token%3D09f7a9d8-8c76-41bd-b18c-7c63dafec0b4&width=300&dpr=4&quality=100&sign=1671d630&sv=2) ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/example-content/link-item-example#onitemhyperlinkedclicked-delegate) OnItemHyperLinkedClicked delegate It is a delegate in `MIPChatItemLinker` which will get triggers when u clicked on item hyperlink text. ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252F5GEyHsEc2vNGJ8mLdAA3%252Fimage.png%3Falt%3Dmedia%26token%3D457218f4-6811-4955-8769-a1874aeb1783&width=300&dpr=4&quality=100&sign=150849f1&sv=2) When it is triggered we try to find the Item and display the item tooltips. It is relatively easy for this example, since we only pass the `ItemId` as `ItemContent`. In my Inventory System, I need to parse the JSON string and get all the variables I need in order to construct my item. [PreviousGuide](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/example-content/guide) [NextPlayer Controller Components](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components) Last updated 1 year ago --- # Player Controller Components | MIP HyperLInk Chat System ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipchatitemlinkercomponent) UMIPChatItemLinkerComponent This class is responsible for linking item to the chat by generating hyperlink text. * We can link an item to the chat by calling LinkItem(). The 'InStyle' parameter represents the quality or rarity of the item. In many games, each item quality is associated with its own color. * The 'InItemContent' parameter is a base64 string containing item metadata in JSON format. Item metadata typically includes information like the item's name, durability, and enhancement level. * For now, an item link hyperlink for UMIPRichChatTextBlock will look like this: Copy "InItemDisplayName " * Please note that the whitespace after the ending tag, `" "`, is crucial. If a player removes this whitespace, we will need to end hyperlinking by calling EndHyperLinkingText(). * The 'OnChatTextChanged' function gets called when text changes in UMIPChatInputWidget. It checks if the text contains `" "`. If it doesn't, it triggers the EndHyperLinkingText() function. * Before a message is sent in UMIPChatInputWidget::OnTextCommitted, MakeHyperLinkStringForChatTextBlock is called to replace 'HyperLinkStyleToReplace', for example, `"FindControllerByPlayerName() to attempt to locate the RecipientController. If found, a message is broadcast to the recipient by calling SendMessageToClientByController() and also broadcast to the owning client by passing GetOwner() as a Controller. If RecipientController is not found, a system message is only broadcast to oneself, indicating that the RecipientName is not online. * SendMessageToClientByController works by obtaining the UMIPClientMessageReceiverComponent from the controller and then invoking the ClientMessage, which is a Client RPC. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipclientmessagereceivercomponent) UMIPClientMessageReceiverComponent This class is responsible for broadcasting message to owning client by invoking ClientMessage(), which calls MessageBroadcasterComponent->BroadcastMessage(). ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipchatcommandlistenercomponent) UMIPChatCommandListenerComponent This class will listen for text changes. There are two types of commands: AfterSpace and AfterEnter commands. 1. AfterSpace: If the first character is "/", then we check from "/" until a whitespace. Once a whitespace is found after "/", we can trigger the AfterSpace commands. 2. AfterEnter will trigger when the user hits the spacebar. This can be used for action commands, such as /dance, /hello, /cry. It can also be used to switch channel when user hit enter. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipactionchatcommandhandlercomponent) UMIPActionChatCommandHandlerComponent This class handles all action chat commands that have a direct parent tag of Tag\_ChatCommand\_AnimAction. For example, if the command string is "dance" and the command tag is "Tag\_ChatCommand\_AnimAction\_Dance", in this case the direct parent tag is Tag\_ChatCommand\_AnimAction, then this class will call DoActionChatCommand() with the CommandTag. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipemoticonhandlercomponent) UMIPEmoticonHandlerComponent This class listens for ChatTextChanged events. When the chat text changes, the OnChatTextChanged() method is called. This is where we check if a user is trying to type an emoticon. The process works by checking the text before the cursor's end position. If it ends with ":", we then check if the text following it matches any emoticon style in the set. If a match is found, we append the current text with the emoticon string in rich text image decorator format, like . Then ChatTextChangedInfo.bChanged is set to true to tell UMIPChatInputWidget::OnTextChanged() to SetText with the modified text. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipunrealrepchatthrottlercomponent) UMIPUnrealRepChatThrottlerComponent This class will retrieve a ChatThrottlersMapPtr from the DefaultChatThrottlersMap in UMIPChatSettings. In OnMessageSentOnServer(), it will check if the chat channel is present in the ChatThrottlersMapPtr. If it is, a new instance of UMIPChatThrottler will be created. The UMIPChatThrottler will start a timer for the chat delay duration, and once the timer expires, it will destroy itself and remove itself from ChatThrottlers. In OnMessageSendOnServerPreChecks(), the function will verify if the chat channel exists in ChatThrottlers. If it does, an error string message will be returned, indicating the remaining time. [PreviousLink Item Example](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/example-content/link-item-example) [NextGame State Components](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/game-state-components) Last updated 1 year ago --- # v1.2.1 | MIP HyperLInk Chat System * Hyperlink text not clickable on standalone or packaged games * Hyperlink text not clickable on listen server. * Couldn't press Enter to show chat after clicking on player name text. * Chat not hidden when losing focus by clicking on player name [Previousv1.2](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.2) [NextHow to run demo project](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/demo-project/how-to-run-demo-project) Last updated 1 year ago --- # Setup on a new project | MIP HyperLInk Chat System Step 1: Prerequisite[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project#step-1-prerequisite) * Skip step 1, 2 if u want to use the plugin from engine content and **Enable MIPChatSystem in Plugins setting** 1. Copy MIPChatSystem and paste it in new project Plugins folder 2. Copy the settings and paste it in new project DefaultGame.ini Copy [/Script/MIPChatSystem.MIPChatSettings] StyleConfigFilePath=/MIPChatSystem/DataAsset/DA_ChatTextBlockStyles.DA_ChatTextBlockStyles DefaultChatItemWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/W_ChatItem.W_ChatItem_C' DefaultChatChannelStylesMap=(((TagName="Chat.Channel.System"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_System.BP_CCS_System_C"'),((TagName="Chat.Channel.Server"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_Server.BP_CCS_Server_C"'),((TagName="Chat.Channel.General"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_General.BP_CCS_General_C"'),((TagName="Chat.Channel.Guild"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_Guild.BP_CCS_Guild_C"'),((TagName="Chat.Channel.Party"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_Party.BP_CCS_Party_C"'),((TagName="Chat.Channel.Whisper"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_Whisper.BP_CCS_Whisper_C"'),((TagName="Chat.Channel.World"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_World.BP_CCS_World_C"')) DefaultChatTextBlockStyle=(Font=(FontObject=Font'"/Engine/EngineFonts/Roboto.Roboto"',FontMaterial=None,OutlineSettings=(OutlineSize=0,bSeparateFillAlpha=False,bApplyOutlineToDropShadows=False,OutlineMaterial=None,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000)),TypefaceFontName="Regular",Size=12,LetterSpacing=0),ColorAndOpacity=(SpecifiedColor=(R=1.000000,G=0.000000,B=1.000000,A=1.000000),ColorUseRule=UseColor_Specified),ShadowOffset=(X=0.000000,Y=0.000000),ShadowColorAndOpacity=(R=0.000000,G=0.000000,B=0.000000,A=1.000000),SelectedBackgroundColor=(SpecifiedColor=(R=1.000000,G=0.000000,B=1.000000,A=1.000000),ColorUseRule=UseColor_Foreground),HighlightColor=(SpecifiedColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000),ColorUseRule=UseColor_Specified),HighlightShape=(ImageSize=(X=32.000000,Y=32.000000),Margin=(Left=0.000000,Top=0.000000,Right=0.000000,Bottom=0.000000),TintColor=(SpecifiedColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),ColorUseRule=UseColor_Specified),OutlineSettings=(CornerRadii=(X=0.000000,Y=0.000000,Z=0.000000,W=1.000000),Color=(SpecifiedColor=(R=0.000000,G=0.000000,B=0.000000,A=0.000000),ColorUseRule=UseColor_Specified),Width=0.000000,RoundingType=HalfHeightRadius,bUseBrushTransparency=False),ResourceObject=None,ResourceName="",UVRegion=(Min=(X=0.000000,Y=0.000000),Max=(X=0.000000,Y=0.000000),bIsValid=0),DrawAs=Image,Tiling=NoTile,Mirroring=NoMirror,ImageType=NoImage,bIsDynamicallyLoaded=False),StrikeBrush=(ImageSize=(X=32.000000,Y=32.000000),Margin=(Left=0.000000,Top=0.000000,Right=0.000000,Bottom=0.000000),TintColor=(SpecifiedColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),ColorUseRule=UseColor_Specified),OutlineSettings=(CornerRadii=(X=0.000000,Y=0.000000,Z=0.000000,W=1.000000),Color=(SpecifiedColor=(R=0.000000,G=0.000000,B=0.000000,A=0.000000),ColorUseRule=UseColor_Specified),Width=0.000000,RoundingType=HalfHeightRadius,bUseBrushTransparency=False),ResourceObject=None,ResourceName="",UVRegion=(Min=(X=0.000000,Y=0.000000),Max=(X=0.000000,Y=0.000000),bIsValid=0),DrawAs=Image,Tiling=NoTile,Mirroring=NoMirror,ImageType=NoImage,bIsDynamicallyLoaded=False),UnderlineBrush=(ImageSize=(X=32.000000,Y=32.000000),Margin=(Left=0.000000,Top=0.000000,Right=0.000000,Bottom=0.000000),TintColor=(SpecifiedColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),ColorUseRule=UseColor_Specified),OutlineSettings=(CornerRadii=(X=0.000000,Y=0.000000,Z=0.000000,W=1.000000),Color=(SpecifiedColor=(R=0.000000,G=0.000000,B=0.000000,A=0.000000),ColorUseRule=UseColor_Specified),Width=0.000000,RoundingType=HalfHeightRadius,bUseBrushTransparency=False),ResourceObject=None,ResourceName="",UVRegion=(Min=(X=0.000000,Y=0.000000),Max=(X=0.000000,Y=0.000000),bIsValid=0),DrawAs=Image,Tiling=NoTile,Mirroring=NoMirror,ImageType=NoImage,bIsDynamicallyLoaded=False),TransformPolicy=None,OverflowPolicy=Clip) DefaultChatTabsAndAllowedChannels=(("Chat1", (GameplayTags=((TagName="Chat.Channel.Server"),(TagName="Chat.Channel.General"),(TagName="Chat.Channel.Guild"),(TagName="Chat.Channel.Party"),(TagName="Chat.Channel.Whisper"),(TagName="Chat.Channel.World"),(TagName="Chat.Channel.System")))),("Chat2", (GameplayTags=((TagName="Chat.Channel.System"),(TagName="Chat.Channel.Whisper")))),("Chat3", (GameplayTags=((TagName="Chat.Channel.Server"),(TagName="Chat.Channel.System")))),("Chat4", (GameplayTags=((TagName="Chat.Channel.Server"),(TagName="Chat.Channel.System"),(TagName="Chat.Channel.General"))))) DefaultNewChatTabAllowedChannels=(GameplayTags=((TagName="Chat.Channel.Server"))) DefaultChatTabWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/ChatTab/W_ChatTab.W_ChatTab_C' DefaultChatTabTitleWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/ChatTab/W_ChatTabTitle.W_ChatTabTitle_C' DefaultChatTabsContainerWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/ChatTab/W_ChatTabsContainer.W_ChatTabsContainer_C' DefaultMessageReceivedProcessorClass=None DefaultRequireSenderNameChannels=(GameplayTags=((TagName="Chat.Channel.General"),(TagName="Chat.Channel.Guild"),(TagName="Chat.Channel.Party"),(TagName="Chat.Channel.Server"),(TagName="Chat.Channel.Whisper"),(TagName="Chat.Channel.World"))) DefaultChatMainWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/W_ChatMainWidget.W_ChatMainWidget_C' DefaultAllowedChannelItemWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/ChatTabSetting/W_ChatTabAllowedChannelItem.W_ChatTabAllowedChannelItem_C' DefaultChatCommandsMap=(("a", (TagName="Chat.Channel.General")),("g", (TagName="Chat.Channel.Guild")),("p", (TagName="Chat.Channel.Party")),("s", (TagName="Chat.Channel.Server")),("w", (TagName="Chat.Channel.Whisper")),("h", (TagName="Chat.Channel.World")),("r", (TagName="Chat.Channel")),("dance", (TagName="ChatCommand.AnimAction.Dance")),("bye", (TagName="ChatCommand.AnimAction.Bye")),("hello", (TagName="ChatCommand.AnimAction.Hello")),("hi", (TagName="ChatCommand.AnimAction.Hello"))) +DefaultDecoratorClasses=BlueprintGeneratedClass'/MIPChatSystem/DataAsset/BP_RichChatTextBlockHyperlinkDecorator.BP_RichChatTextBlockHyperlinkDecorator_C' +DefaultDecoratorClasses=BlueprintGeneratedClass'/MIPChatSystem/DataAsset/BP_RichChatTextBlockImageDecorator.BP_RichChatTextBlockImageDecorator_C' DefaultPlayerInfoProcessorClass=Class'/Script/MIPChatSystem.MIPChatBasePlayerInfoProcessor' DefaultNameplateWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/W_Nameplate.W_Nameplate_C' DefaultProfanityWordItemWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/ChatTabSetting/Profanity/W_ProfanityWordItem.W_ProfanityWordItem_C' DefaultChatThrottlersMap=(((TagName="Chat.Channel.Server"), (CooldownTime=5.000000))) DefaultChatChatItemLimit=20 Your DefaultGame.ini will look something like this. ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252F1PoraPN8kolCr01Pd2II%252FScreenshot%25202023-09-25%2520120159.png%3Falt%3Dmedia%26token%3D287930ac-6b76-48c9-a133-ba22e8fd3cc8&width=300&dpr=4&quality=100&sign=cb28df4f&sv=2) 1. Run your project, press `Yes` when asked `Would you like to rebuild them now?` ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252FMvk5oy0UAQoJvNiqFgce%252Fimage.png%3Falt%3Dmedia%26token%3Ddb19fbe7-d79e-4ba0-897a-5547a625eff2&width=300&dpr=4&quality=100&sign=872ec020&sv=2) Step 2: Add Player Controller Components[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project#step-2-add-player-controller-components) 1. [UMIPChatItemLinkerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipchatitemlinkercomponent) 2. [UMIPHyperLinkTextClickedListenerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umiphyperlinktextclickedlistenercomponent) 3. [UMIPPlayerNameClickedListenerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipplayernameclickedlistenercomponent) 4. [UMIPChatWidgetCreatorComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipchatwidgetcreatorcomponent) 5. [UMIPUnrealRepSendMessageProcessor](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipunrealrepsendmessageprocessor) 6. [UMIPClientMessageReceiverComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipclientmessagereceivercomponent) 7. [UMIPChatCommandListenerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipchatcommandlistenercomponent) 8. [UMIPActionChatCommandHandlerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipactionchatcommandhandlercomponent) 9. [UMIPEmoticonHandlerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipemoticonhandlercomponent) 10. [UMIPUnrealRepChatThrottlerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipunrealrepchatthrottlercomponent) Step 3: Add Game State Components[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project#step-3-add-game-state-components) 1. [UMIPBaseMessageBroadcasterComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/game-state-components#umipbasemessagebroadcastercomponent) Step 4: Add Game Mode Components[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project#step-4-add-game-mode-components) 1. [UMIPPlayerSessionListenerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/game-mode-components#umipplayersessionlistenercomponent) Step 4: Choose AMIPChatBasePlayerController for your Player Controller Parent Class[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project#step-4-choose-amipchatbaseplayercontroller-for-your-player-controller-parent-class) And copy the key binding for showing chat and cursor. ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252F79sQTgiRf6s8IsPFVrt9%252Fimage.png%3Falt%3Dmedia%26token%3Db3876250-da74-4431-b543-c99e8422f040&width=300&dpr=4&quality=100&sign=cbf3258&sv=2) Step 5: Choose AMIPChatBaseCharacter for your Character Parent Class[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project#step-5-choose-amipchatbasecharacter-for-your-character-parent-class) Step 6: Choose AMIPChatBasePlayerState for your PlayerState Parent Class[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project#step-6-choose-amipchatbaseplayerstate-for-your-playerstate-parent-class) Step 7: Choose AMIPChatBaseGameMode for your GameMode Parent Class[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project#step-7-choose-amipchatbasegamemode-for-your-gamemode-parent-class) Step 8: Choose AMIPChatWorldSettings as the world settings[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project#step-8-choose-amipchatworldsettings-as-the-world-settings) Project Settings > Engine > General Settings ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252F9MygXOHr98FAiBYy1KgD%252Fimage.png%3Falt%3Dmedia%26token%3D4276832f-55ff-48e9-8752-1ecc544eb6e9&width=300&dpr=4&quality=100&sign=c53ad3be&sv=2) Then have the editor restarted. Fill in player info in the world settings tab for as many player as u want. ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252FXq6FSBXKsPlq4OPO5sy4%252Fimage.png%3Falt%3Dmedia%26token%3D6a029c01-131e-4b18-866d-35b80fef7607&width=300&dpr=4&quality=100&sign=1b740c2f&sv=2) [PreviousOur Features](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview/our-features) [NextGuide](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/example-content/guide) Last updated 1 year ago --- # Our Features | MIP HyperLInk Chat System [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview/our-features#hyperlink-text) HyperLink Text ------------------------------------------------------------------------------------------------------------------- This feature enables item linking in the chat, allowing players to click on it to display item tooltips. ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252FvZWH5sSGyyaaqZiBcsNW%252Fchat_1.png%3Falt%3Dmedia%26token%3Dc9412a8e-80df-4a23-9efe-ad48af4a0ae7&width=768&dpr=4&quality=100&sign=5324e920&sv=2) [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview/our-features#chat-emoticons) Chat Emoticons ------------------------------------------------------------------------------------------------------------------- Can be typed into the chat using ":", can be easily add or remove emoticons of your own. ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252Fr0AX3f9bR91v01FD7TTr%252FScreenshot%25202023-10-06%2520004100.png%3Falt%3Dmedia%26token%3D5ffdcf1d-4cb2-44d9-a529-c0c5e694ed3b&width=768&dpr=4&quality=100&sign=b6ac733d&sv=2) [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview/our-features#chat-commands) Chat Commands ----------------------------------------------------------------------------------------------------------------- The Chat Command feature allows players to switch channels by using a "/" followed by a shortcut for the desired channel. This feature is highly customizable to meet your specific needs. Additionally, players can perform actions using commands, such as /bye, /hello, and /laugh. [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview/our-features#server-message) Server Message ------------------------------------------------------------------------------------------------------------------- Utilizing Unreal RPCs, this feature broadcasts messages to all clients. [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview/our-features#private-message) Private Message --------------------------------------------------------------------------------------------------------------------- Also utilizing Unreal RPCs, this feature broadcasts messages to the intended recipients. [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview/our-features#chat-tab-with-allowed-channels) Chat Tab with Allowed Channels: ---------------------------------------------------------------------------------------------------------------------------------------------------- This feature provides a chat tab that exclusively listens to the allowed channel, which can be configured at runtime. [See here](https://youtu.be/z1Qn3autzTU?si=n-INdSePp_NWS9Yt&t=82) [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview/our-features#create-and-remove-tabs) Create and Remove Tabs ----------------------------------------------------------------------------------------------------------------------------------- Users can create and remove chat tabs. [See here](https://youtu.be/z1Qn3autzTU?si=JD9JwdaK_iIjGh4b&t=61) [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview/our-features#drag-and-drop-tabs) Drag and Drop Tabs: ---------------------------------------------------------------------------------------------------------------------------- Chat tabs can be detached or attached to a tab container through drag-and-drop functionality. [See here](https://youtu.be/z1Qn3autzTU?si=6RPgRfuOCvzYulDi&t=44) [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview/our-features#undefined) ---------------------------------------------------------------------------------------------- [PreviousWelcome to MIP Multiplayer HyperLink Chat System](https://kumobooks.gitbook.io/mip-hyperlink-chat-system) [NextSetup on a new project](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project) Last updated 1 year ago --- # Game State Components | MIP HyperLInk Chat System ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/game-state-components#umipbasemessagebroadcastercomponent) UMIPBaseMessageBroadcasterComponent This class is responsible for broadcasting messages to the UGameplayMessageSubsystem by invoking MessageSubsystem.BroadcastMessage(Tag\_Chat\_Receive, InReceived). MulticastMessage(), which is a multicast RPC, and since it's a game state component, it is executed on all clients. BroadcastMessage() is used to broadcast messages to the UGameplayMessageSubsystem. [PreviousPlayer Controller Components](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components) [NextGame Mode Components](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/game-mode-components) Last updated 1 year ago --- # Pawn Components | MIP HyperLInk Chat System ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/pawn-components#umipnameplatecreatorcomponent) UMIPNameplateCreatorComponent This class create a nameplate for owner on BeginPlay() Then it does periodically sphere tracing to get other players and whether to create or destroy the other player nameplate component [PreviousGame Mode Components](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/game-mode-components) [Nextv1.1](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.1) Last updated 1 year ago --- # Game Mode Components | MIP HyperLInk Chat System ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/game-mode-components#umipplayersessionlistenercomponent) UMIPPlayerSessionListenerComponent This class is designed to listen for two specific events, FGameModeEvents::GameModePostLoginEvent and FGameModeEvents::GameModeLogoutEvent. It serves the purpose of adding player names and their corresponding controllers to the ControllerAndNameMap, which is used for locating a controller based on a player's name. This component exclusively exists on the server as a part of the game mode. [PreviousGame State Components](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/game-state-components) [NextPawn Components](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/pawn-components) Last updated 1 year ago --- # v1.1 | MIP HyperLInk Chat System ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.1#emoticons-added) Emoticons added The Text Layout has been modified to allow wrapping for inline image decorators. As a result, you can now use emoticons in the chat. Emoticons can be added to the chat by typing ":" followed by the emoticon key, and these emoticons are easily customizable. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.1#focusing-chat-or-recipient-editable-text-on-tab-key) Focusing Chat or Recipient Editable Text on Tab Key You can now press the Tab key to switch between the Chat and Recipient Editable Text Box while in the Whisper Channel. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.1#display-the-chat-input-by-pressing-the-enter-key) Display the chat input by pressing the Enter key The chat input is now hidden by default and will appear when you press the Enter key. It will automatically hide itself when the keyboard focus is lost. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.1#switch-channel-commands) Switch channel commands You can now switch between channels by using commands such as /s, /g, /h, and more. These commands are easily customizable to suit your preferences. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.1#action-commands) Action commands You can now perform certain actions, such as playing animations, by using Action Commands like /hello, /bye, /cry, and more. These commands are also easily customizable to meet your specific needs. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.1#display-channel-command-string-next-to-switch-channel-widget) Display channel command string next to switch channel widget The command key to switch to a channel is now displayed next to the switch channel widget. [PreviousPawn Components](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/pawn-components) [Nextv1.2](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.2) Last updated 1 year ago --- # v1.2 | MIP HyperLInk Chat System ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.2#limit-chat-items-to-20-only-removing-the-old-ones) Limit chat items to 20 only, removing the old ones ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.2#fix-drag-and-drop-issue-on-standalone-game) Fix drag and drop issue on standalone game ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.2#add-chat-throttlers) Add chat throttlers Can now throttle chat to prevent spamming. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.2#add-client-side-profanity-filter) Add client side profanity filter Add profanity filter by using client profanity list. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.2#nameplate) Nameplate Add nameplate widget to display Family and Character names. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.2#append-icon-for-linked-items) Append icon for linked items Linked item will have its icon appended on the left. [Previousv1.1](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.1) [Nextv1.2.1](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.2.1) Last updated 1 year ago --- # How to run demo project | MIP HyperLInk Chat System 1. Extract **MIPCS\_DedicatedServer.zip** and run **ModularInventoryServer.exe - Shortcut** 2. **Extract MIPCS\_Client.zip** and run **ModularInventory.exe** 3. Press \` key to show console command, then enter open `127.0.0.1` to join the local server. You can run as many game clients as u want to test. Press F6 to Link Item at the first index. [Previousv1.2.1](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.2.1) Last updated 1 year ago --- # Player Controller Components | MIP HyperLInk Chat System ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components#umipchatitemlinkercomponent) UMIPChatItemLinkerComponent This class is responsible for linking item to the chat by generating hyperlink text. * We can link an item to the chat by calling LinkItem(). The 'InStyle' parameter represents the quality or rarity of the item. In many games, each item quality is associated with its own color. * The 'InItemContent' parameter is a base64 string containing item metadata in JSON format. Item metadata typically includes information like the item's name, durability, and enhancement level. * For now, an item link hyperlink for UMIPRichChatTextBlock will look like this: Copy "InItemDisplayName " * Please note that the whitespace after the ending tag, `" "`, is crucial. If a player removes this whitespace, we will need to end hyperlinking by calling EndHyperLinkingText(). * The 'OnChatTextChanged' function gets called when text changes in UMIPChatInputWidget. It checks if the text contains `" "`. If it doesn't, it triggers the EndHyperLinkingText() function. * Before a message is sent in UMIPChatInputWidget::OnTextCommitted, MakeHyperLinkStringForChatTextBlock is called to replace 'HyperLinkStyleToReplace', for example, `"FindControllerByPlayerName() to attempt to locate the RecipientController. If found, a message is broadcast to the recipient by calling SendMessageToClientByController() and also broadcast to the owning client by passing GetOwner() as a Controller. If RecipientController is not found, a system message is only broadcast to oneself, indicating that the RecipientName is not online. * SendMessageToClientByController works by obtaining the UMIPClientMessageReceiverComponent from the controller and then invoking the ClientMessage, which is a Client RPC. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components#umipclientmessagereceivercomponent) UMIPClientMessageReceiverComponent This class is responsible for broadcasting message to owning client by invoking ClientMessage(), which calls MessageBroadcasterComponent->BroadcastMessage(). ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components#umipchatcommandlistenercomponent) UMIPChatCommandListenerComponent This class will listen for text changes. There are two types of commands: AfterSpace and AfterEnter commands. 1. AfterSpace: If the first character is "/", then we check from "/" until a whitespace. Once a whitespace is found after "/", we can trigger the AfterSpace commands. 2. AfterEnter will trigger when the user hits the spacebar. This can be used for action commands, such as /dance, /hello, /cry. It can also be used to switch channel when user hit enter. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components#umipactionchatcommandhandlercomponent) UMIPActionChatCommandHandlerComponent This class handles all action chat commands that have a direct parent tag of Tag\_ChatCommand\_AnimAction. For example, if the command string is "dance" and the command tag is "Tag\_ChatCommand\_AnimAction\_Dance", in this case the direct parent tag is Tag\_ChatCommand\_AnimAction, then this class will call DoActionChatCommand() with the CommandTag. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components#umipemoticonhandlercomponent) UMIPEmoticonHandlerComponent This class listens for ChatTextChanged events. When the chat text changes, the OnChatTextChanged() method is called. This is where we check if a user is trying to type an emoticon. The process works by checking the text before the cursor's end position. If it ends with ":", we then check if the text following it matches any emoticon style in the set. If a match is found, we append the current text with the emoticon string in rich text image decorator format, like . Then ChatTextChangedInfo.bChanged is set to true to tell UMIPChatInputWidget::OnTextChanged() to SetText with the modified text. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components#umipunrealrepchatthrottlercomponent) UMIPUnrealRepChatThrottlerComponent This class will retrieve a ChatThrottlersMapPtr from the DefaultChatThrottlersMap in UMIPChatSettings. In OnMessageSentOnServer(), it will check if the chat channel is present in the ChatThrottlersMapPtr. If it is, a new instance of UMIPChatThrottler will be created. The UMIPChatThrottler will start a timer for the chat delay duration, and once the timer expires, it will destroy itself and remove itself from ChatThrottlers. In OnMessageSendOnServerPreChecks(), the function will verify if the chat channel exists in ChatThrottlers. If it does, an error string message will be returned, indicating the remaining time. [PreviousLink Item Example](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/example-content/link-item-example) [NextGame State Components](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/game-state-components) Last updated 1 year ago --- # Our Features | MIP HyperLInk Chat System [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview#hyperlink-text) HyperLink Text ------------------------------------------------------------------------------------------------------ This feature enables item linking in the chat, allowing players to click on it to display item tooltips. ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252FvZWH5sSGyyaaqZiBcsNW%252Fchat_1.png%3Falt%3Dmedia%26token%3Dc9412a8e-80df-4a23-9efe-ad48af4a0ae7&width=768&dpr=4&quality=100&sign=5324e920&sv=2) [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview#chat-emoticons) Chat Emoticons ------------------------------------------------------------------------------------------------------ Can be typed into the chat using ":", can be easily add or remove emoticons of your own. ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252Fr0AX3f9bR91v01FD7TTr%252FScreenshot%25202023-10-06%2520004100.png%3Falt%3Dmedia%26token%3D5ffdcf1d-4cb2-44d9-a529-c0c5e694ed3b&width=768&dpr=4&quality=100&sign=b6ac733d&sv=2) [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview#chat-commands) Chat Commands ---------------------------------------------------------------------------------------------------- The Chat Command feature allows players to switch channels by using a "/" followed by a shortcut for the desired channel. This feature is highly customizable to meet your specific needs. Additionally, players can perform actions using commands, such as /bye, /hello, and /laugh. [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview#server-message) Server Message ------------------------------------------------------------------------------------------------------ Utilizing Unreal RPCs, this feature broadcasts messages to all clients. [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview#private-message) Private Message -------------------------------------------------------------------------------------------------------- Also utilizing Unreal RPCs, this feature broadcasts messages to the intended recipients. [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview#chat-tab-with-allowed-channels) Chat Tab with Allowed Channels: --------------------------------------------------------------------------------------------------------------------------------------- This feature provides a chat tab that exclusively listens to the allowed channel, which can be configured at runtime. [See here](https://youtu.be/z1Qn3autzTU?si=n-INdSePp_NWS9Yt&t=82) [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview#create-and-remove-tabs) Create and Remove Tabs ---------------------------------------------------------------------------------------------------------------------- Users can create and remove chat tabs. [See here](https://youtu.be/z1Qn3autzTU?si=JD9JwdaK_iIjGh4b&t=61) [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview#drag-and-drop-tabs) Drag and Drop Tabs: --------------------------------------------------------------------------------------------------------------- Chat tabs can be detached or attached to a tab container through drag-and-drop functionality. [See here](https://youtu.be/z1Qn3autzTU?si=6RPgRfuOCvzYulDi&t=44) [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview#undefined) --------------------------------------------------------------------------------- [PreviousWelcome to MIP Multiplayer HyperLink Chat System](https://kumobooks.gitbook.io/mip-hyperlink-chat-system) [NextSetup on a new project](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project) Last updated 1 year ago --- # Guide | MIP HyperLInk Chat System Example Content is included in the plugin's content folder. Go to Plugins>MIPChatSystemContent>Maps and open `MIPCS_DefaultMap.` * Then make sure u run as Client or Listen Server mode. [PreviousSetup on a new project](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals/setup-on-a-new-project) [NextLink Item Example](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/example-content/link-item-example) Last updated 1 year ago --- # How to run demo project | MIP HyperLInk Chat System 1. Extract **MIPCS\_DedicatedServer.zip** and run **ModularInventoryServer.exe - Shortcut** 2. **Extract MIPCS\_Client.zip** and run **ModularInventory.exe** 3. Press \` key to show console command, then enter open `127.0.0.1` to join the local server. You can run as many game clients as u want to test. Press F6 to Link Item at the first index. [Previousv1.2.1](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.2.1) Last updated 1 year ago --- # Setup on a new project | MIP HyperLInk Chat System Step 1: Prerequisite[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals#step-1-prerequisite) * Skip step 1, 2 if u want to use the plugin from engine content and **Enable MIPChatSystem in Plugins setting** 1. Copy MIPChatSystem and paste it in new project Plugins folder 2. Copy the settings and paste it in new project DefaultGame.ini Copy [/Script/MIPChatSystem.MIPChatSettings] StyleConfigFilePath=/MIPChatSystem/DataAsset/DA_ChatTextBlockStyles.DA_ChatTextBlockStyles DefaultChatItemWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/W_ChatItem.W_ChatItem_C' DefaultChatChannelStylesMap=(((TagName="Chat.Channel.System"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_System.BP_CCS_System_C"'),((TagName="Chat.Channel.Server"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_Server.BP_CCS_Server_C"'),((TagName="Chat.Channel.General"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_General.BP_CCS_General_C"'),((TagName="Chat.Channel.Guild"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_Guild.BP_CCS_Guild_C"'),((TagName="Chat.Channel.Party"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_Party.BP_CCS_Party_C"'),((TagName="Chat.Channel.Whisper"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_Whisper.BP_CCS_Whisper_C"'),((TagName="Chat.Channel.World"), BlueprintGeneratedClass'"/MIPChatSystem/Assets/Styles/BP_CCS_World.BP_CCS_World_C"')) DefaultChatTextBlockStyle=(Font=(FontObject=Font'"/Engine/EngineFonts/Roboto.Roboto"',FontMaterial=None,OutlineSettings=(OutlineSize=0,bSeparateFillAlpha=False,bApplyOutlineToDropShadows=False,OutlineMaterial=None,OutlineColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000)),TypefaceFontName="Regular",Size=12,LetterSpacing=0),ColorAndOpacity=(SpecifiedColor=(R=1.000000,G=0.000000,B=1.000000,A=1.000000),ColorUseRule=UseColor_Specified),ShadowOffset=(X=0.000000,Y=0.000000),ShadowColorAndOpacity=(R=0.000000,G=0.000000,B=0.000000,A=1.000000),SelectedBackgroundColor=(SpecifiedColor=(R=1.000000,G=0.000000,B=1.000000,A=1.000000),ColorUseRule=UseColor_Foreground),HighlightColor=(SpecifiedColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000),ColorUseRule=UseColor_Specified),HighlightShape=(ImageSize=(X=32.000000,Y=32.000000),Margin=(Left=0.000000,Top=0.000000,Right=0.000000,Bottom=0.000000),TintColor=(SpecifiedColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),ColorUseRule=UseColor_Specified),OutlineSettings=(CornerRadii=(X=0.000000,Y=0.000000,Z=0.000000,W=1.000000),Color=(SpecifiedColor=(R=0.000000,G=0.000000,B=0.000000,A=0.000000),ColorUseRule=UseColor_Specified),Width=0.000000,RoundingType=HalfHeightRadius,bUseBrushTransparency=False),ResourceObject=None,ResourceName="",UVRegion=(Min=(X=0.000000,Y=0.000000),Max=(X=0.000000,Y=0.000000),bIsValid=0),DrawAs=Image,Tiling=NoTile,Mirroring=NoMirror,ImageType=NoImage,bIsDynamicallyLoaded=False),StrikeBrush=(ImageSize=(X=32.000000,Y=32.000000),Margin=(Left=0.000000,Top=0.000000,Right=0.000000,Bottom=0.000000),TintColor=(SpecifiedColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),ColorUseRule=UseColor_Specified),OutlineSettings=(CornerRadii=(X=0.000000,Y=0.000000,Z=0.000000,W=1.000000),Color=(SpecifiedColor=(R=0.000000,G=0.000000,B=0.000000,A=0.000000),ColorUseRule=UseColor_Specified),Width=0.000000,RoundingType=HalfHeightRadius,bUseBrushTransparency=False),ResourceObject=None,ResourceName="",UVRegion=(Min=(X=0.000000,Y=0.000000),Max=(X=0.000000,Y=0.000000),bIsValid=0),DrawAs=Image,Tiling=NoTile,Mirroring=NoMirror,ImageType=NoImage,bIsDynamicallyLoaded=False),UnderlineBrush=(ImageSize=(X=32.000000,Y=32.000000),Margin=(Left=0.000000,Top=0.000000,Right=0.000000,Bottom=0.000000),TintColor=(SpecifiedColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),ColorUseRule=UseColor_Specified),OutlineSettings=(CornerRadii=(X=0.000000,Y=0.000000,Z=0.000000,W=1.000000),Color=(SpecifiedColor=(R=0.000000,G=0.000000,B=0.000000,A=0.000000),ColorUseRule=UseColor_Specified),Width=0.000000,RoundingType=HalfHeightRadius,bUseBrushTransparency=False),ResourceObject=None,ResourceName="",UVRegion=(Min=(X=0.000000,Y=0.000000),Max=(X=0.000000,Y=0.000000),bIsValid=0),DrawAs=Image,Tiling=NoTile,Mirroring=NoMirror,ImageType=NoImage,bIsDynamicallyLoaded=False),TransformPolicy=None,OverflowPolicy=Clip) DefaultChatTabsAndAllowedChannels=(("Chat1", (GameplayTags=((TagName="Chat.Channel.Server"),(TagName="Chat.Channel.General"),(TagName="Chat.Channel.Guild"),(TagName="Chat.Channel.Party"),(TagName="Chat.Channel.Whisper"),(TagName="Chat.Channel.World"),(TagName="Chat.Channel.System")))),("Chat2", (GameplayTags=((TagName="Chat.Channel.System"),(TagName="Chat.Channel.Whisper")))),("Chat3", (GameplayTags=((TagName="Chat.Channel.Server"),(TagName="Chat.Channel.System")))),("Chat4", (GameplayTags=((TagName="Chat.Channel.Server"),(TagName="Chat.Channel.System"),(TagName="Chat.Channel.General"))))) DefaultNewChatTabAllowedChannels=(GameplayTags=((TagName="Chat.Channel.Server"))) DefaultChatTabWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/ChatTab/W_ChatTab.W_ChatTab_C' DefaultChatTabTitleWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/ChatTab/W_ChatTabTitle.W_ChatTabTitle_C' DefaultChatTabsContainerWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/ChatTab/W_ChatTabsContainer.W_ChatTabsContainer_C' DefaultMessageReceivedProcessorClass=None DefaultRequireSenderNameChannels=(GameplayTags=((TagName="Chat.Channel.General"),(TagName="Chat.Channel.Guild"),(TagName="Chat.Channel.Party"),(TagName="Chat.Channel.Server"),(TagName="Chat.Channel.Whisper"),(TagName="Chat.Channel.World"))) DefaultChatMainWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/W_ChatMainWidget.W_ChatMainWidget_C' DefaultAllowedChannelItemWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/ChatTabSetting/W_ChatTabAllowedChannelItem.W_ChatTabAllowedChannelItem_C' DefaultChatCommandsMap=(("a", (TagName="Chat.Channel.General")),("g", (TagName="Chat.Channel.Guild")),("p", (TagName="Chat.Channel.Party")),("s", (TagName="Chat.Channel.Server")),("w", (TagName="Chat.Channel.Whisper")),("h", (TagName="Chat.Channel.World")),("r", (TagName="Chat.Channel")),("dance", (TagName="ChatCommand.AnimAction.Dance")),("bye", (TagName="ChatCommand.AnimAction.Bye")),("hello", (TagName="ChatCommand.AnimAction.Hello")),("hi", (TagName="ChatCommand.AnimAction.Hello"))) +DefaultDecoratorClasses=BlueprintGeneratedClass'/MIPChatSystem/DataAsset/BP_RichChatTextBlockHyperlinkDecorator.BP_RichChatTextBlockHyperlinkDecorator_C' +DefaultDecoratorClasses=BlueprintGeneratedClass'/MIPChatSystem/DataAsset/BP_RichChatTextBlockImageDecorator.BP_RichChatTextBlockImageDecorator_C' DefaultPlayerInfoProcessorClass=Class'/Script/MIPChatSystem.MIPChatBasePlayerInfoProcessor' DefaultNameplateWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/W_Nameplate.W_Nameplate_C' DefaultProfanityWordItemWidgetClass=WidgetBlueprintGeneratedClass'/MIPChatSystem/Widgets/ChatTabSetting/Profanity/W_ProfanityWordItem.W_ProfanityWordItem_C' DefaultChatThrottlersMap=(((TagName="Chat.Channel.Server"), (CooldownTime=5.000000))) DefaultChatChatItemLimit=20 Your DefaultGame.ini will look something like this. ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252F1PoraPN8kolCr01Pd2II%252FScreenshot%25202023-09-25%2520120159.png%3Falt%3Dmedia%26token%3D287930ac-6b76-48c9-a133-ba22e8fd3cc8&width=300&dpr=4&quality=100&sign=cb28df4f&sv=2) 1. Run your project, press `Yes` when asked `Would you like to rebuild them now?` ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252FMvk5oy0UAQoJvNiqFgce%252Fimage.png%3Falt%3Dmedia%26token%3Ddb19fbe7-d79e-4ba0-897a-5547a625eff2&width=300&dpr=4&quality=100&sign=872ec020&sv=2) Step 2: Add Player Controller Components[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals#step-2-add-player-controller-components) 1. [UMIPChatItemLinkerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipchatitemlinkercomponent) 2. [UMIPHyperLinkTextClickedListenerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umiphyperlinktextclickedlistenercomponent) 3. [UMIPPlayerNameClickedListenerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipplayernameclickedlistenercomponent) 4. [UMIPChatWidgetCreatorComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipchatwidgetcreatorcomponent) 5. [UMIPUnrealRepSendMessageProcessor](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipunrealrepsendmessageprocessor) 6. [UMIPClientMessageReceiverComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipclientmessagereceivercomponent) 7. [UMIPChatCommandListenerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipchatcommandlistenercomponent) 8. [UMIPActionChatCommandHandlerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipactionchatcommandhandlercomponent) 9. [UMIPEmoticonHandlerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipemoticonhandlercomponent) 10. [UMIPUnrealRepChatThrottlerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/player-controller-components#umipunrealrepchatthrottlercomponent) Step 3: Add Game State Components[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals#step-3-add-game-state-components) 1. [UMIPBaseMessageBroadcasterComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/game-state-components#umipbasemessagebroadcastercomponent) Step 4: Add Game Mode Components[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals#step-4-add-game-mode-components) 1. [UMIPPlayerSessionListenerComponent](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/game-mode-components#umipplayersessionlistenercomponent) Step 4: Choose AMIPChatBasePlayerController for your Player Controller Parent Class[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals#step-4-choose-amipchatbaseplayercontroller-for-your-player-controller-parent-class) And copy the key binding for showing chat and cursor. ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252F79sQTgiRf6s8IsPFVrt9%252Fimage.png%3Falt%3Dmedia%26token%3Db3876250-da74-4431-b543-c99e8422f040&width=300&dpr=4&quality=100&sign=cbf3258&sv=2) Step 5: Choose AMIPChatBaseCharacter for your Character Parent Class[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals#step-5-choose-amipchatbasecharacter-for-your-character-parent-class) Step 6: Choose AMIPChatBasePlayerState for your PlayerState Parent Class[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals#step-6-choose-amipchatbaseplayerstate-for-your-playerstate-parent-class) Step 7: Choose AMIPChatBaseGameMode for your GameMode Parent Class[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals#step-7-choose-amipchatbasegamemode-for-your-gamemode-parent-class) Step 8: Choose AMIPChatWorldSettings as the world settings[](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/fundamentals#step-8-choose-amipchatworldsettings-as-the-world-settings) Project Settings > Engine > General Settings ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252F9MygXOHr98FAiBYy1KgD%252Fimage.png%3Falt%3Dmedia%26token%3D4276832f-55ff-48e9-8752-1ecc544eb6e9&width=300&dpr=4&quality=100&sign=c53ad3be&sv=2) Then have the editor restarted. Fill in player info in the world settings tab for as many player as u want. ![](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/~gitbook/image?url=https%3A%2F%2F212510588-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F4JR9F4Xrkwgwmyb4kARy%252Fuploads%252FXq6FSBXKsPlq4OPO5sy4%252Fimage.png%3Falt%3Dmedia%26token%3D6a029c01-131e-4b18-866d-35b80fef7607&width=300&dpr=4&quality=100&sign=1b740c2f&sv=2) [PreviousOur Features](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/overview/our-features) [NextGuide](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/example-content/guide) Last updated 1 year ago --- # v1.1 | MIP HyperLInk Chat System ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes#emoticons-added) Emoticons added The Text Layout has been modified to allow wrapping for inline image decorators. As a result, you can now use emoticons in the chat. Emoticons can be added to the chat by typing ":" followed by the emoticon key, and these emoticons are easily customizable. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes#focusing-chat-or-recipient-editable-text-on-tab-key) Focusing Chat or Recipient Editable Text on Tab Key You can now press the Tab key to switch between the Chat and Recipient Editable Text Box while in the Whisper Channel. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes#display-the-chat-input-by-pressing-the-enter-key) Display the chat input by pressing the Enter key The chat input is now hidden by default and will appear when you press the Enter key. It will automatically hide itself when the keyboard focus is lost. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes#switch-channel-commands) Switch channel commands You can now switch between channels by using commands such as /s, /g, /h, and more. These commands are easily customizable to suit your preferences. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes#action-commands) Action commands You can now perform certain actions, such as playing animations, by using Action Commands like /hello, /bye, /cry, and more. These commands are also easily customizable to meet your specific needs. ### [](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes#display-channel-command-string-next-to-switch-channel-widget) Display channel command string next to switch channel widget The command key to switch to a channel is now displayed next to the switch channel widget. [PreviousPawn Components](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/key-components/pawn-components) [Nextv1.2](https://kumobooks.gitbook.io/mip-hyperlink-chat-system/patch-notes/v1.2) Last updated 1 year ago ---