BVB Source Codes

CRYENGINE Show FlowNetMsgNodes.cpp Source code

Return Download CRYENGINE: download FlowNetMsgNodes.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. // -------------------------------------------------------------------------
  4. //  File name:   FlowNetMsgNodes.cpp
  5. //  Description: FG nodes to send bidirectional client <--> server simple messages
  6. // -------------------------------------------------------------------------
  7. //  History: Dario Sancho. 15.10.2014. Created
  8. //
  9. ////////////////////////////////////////////////////////////////////////////
  10.  
  11. #include "StdAfx.h"
  12. #include "Network/NetMsgDispatcher.h"
  13.  
  14. #include <CryFlowGraph/IFlowBaseNode.h>
  15.  
  16. //////////////////////////////////////////////////////////////////////////
  17. class CFlowNode_MsgSender : public CFlowBaseNode<eNCT_Instanced>
  18. {
  19. public:
  20.         enum EInputs
  21.         {
  22.                 IN_MSG,
  23.                 IN_VALUE,
  24.                 IN_TARGET,
  25.                 IN_SEND,
  26.         };
  27.         enum EOutputs
  28.         {
  29.                 OUT_DONE,
  30.                 OUT_ERROR,
  31.         };
  32.  
  33.         CFlowNode_MsgSender(SActivationInfo* pActInfo) {}
  34.         virtual IFlowNodePtr Clone(SActivationInfo *pActInfo)
  35.         {
  36.                 return new CFlowNode_MsgSender(pActInfo);
  37.         }
  38.  
  39.         virtual void GetConfiguration(SFlowNodeConfig& config)
  40.         {
  41.                 static const SInputPortConfig in_config[] = {
  42.                         InputPortConfig<string>("Message", _HELP("The message to be sent")),
  43.                         InputPortConfig<string>("Value",   _HELP("An optional value to be sent along with the message")),
  44.                         InputPortConfig<int>("Target",     0,                                                            _HELP("Default (client sends msg to server and vice versa) - All (default + client messages are loopback to itself)"),_HELP("Target"), _UICONFIG("enum_int:Default=0,All=1")), // the values needs to coincide with SNetMsgData::ETarget
  45.                         InputPortConfig_AnyType("Send",    _HELP("Sends the message to the target")),
  46.                         { 0 }
  47.                 };
  48.                 static const SOutputPortConfig out_config[] = {
  49.                         OutputPortConfig_Void("Done",  _HELP("Outputs event if the message was successfully sent")),
  50.                         OutputPortConfig_Void("Error", _HELP("Outputs event if there was a problem with the message")),
  51.                         { 0 }
  52.                 };
  53.  
  54.                 config.pInputPorts = in_config;
  55.                 config.pOutputPorts = out_config;
  56.                 config.SetCategory(EFLN_APPROVED);
  57.         }
  58.  
  59.         virtual void ProcessEvent(EFlowEvent event, SActivationInfo* pActInfo)
  60.         {
  61.                 switch (event)
  62.                 {
  63.                 case eFE_Activate:
  64.                         if (IsPortActive(pActInfo, IN_SEND))
  65.                         {
  66.                                 const string& key = GetPortString(pActInfo, IN_MSG);
  67.                                 const string& value = GetPortString(pActInfo, IN_VALUE);
  68.                                 const int iTarget = GetPortInt(pActInfo, IN_TARGET);
  69.                                 SNetMsgData::ETarget target = SNetMsgData::ConvertTargetIntToEnum(iTarget);
  70.                                 CRY_ASSERT_MESSAGE(target != SNetMsgData::eT_Invalid, "CFlowNode_MsgSender: IN_TARGET input got converted to an invalid Enum");
  71.  
  72.                                 if (target != SNetMsgData::eT_Invalid)
  73.                                 {
  74.                                         if (CNetMessageDistpatcher* pNetMsgDispatcher = CCryAction::GetCryAction()->GetNetMessageDispatcher())
  75.                                         {
  76.                                                 NET_MSG_DISPATCHER_LOG("CFlowNode_MsgSender: %s Send message [%s/%s]", CNetMessageDistpatcher::DbgTranslateLocationToString(), key.c_str(), value.c_str());
  77.                                                 pNetMsgDispatcher->SendMessage(SNetMsgData(CNetMessageDistpatcher::GetLocation(), target, key, value));
  78.                                                 ActivateOutput(pActInfo, OUT_DONE, true);
  79.                                                 return;
  80.                                         }
  81.                                 }
  82.  
  83.                                 ActivateOutput(pActInfo, OUT_ERROR, true);
  84.                         }
  85.                         break;
  86.                 }
  87.         }
  88.  
  89.         virtual void GetMemoryUsage(ICrySizer* s) const
  90.         {
  91.                 s->Add(*this);
  92.         }
  93. };
  94.  
  95. //////////////////////////////////////////////////////////////////////////
  96. class CFlowNode_MsgReceiver : public CFlowBaseNode<eNCT_Instanced>, public INetMsgListener
  97. {
  98. public:
  99.         enum EInputs
  100.         {
  101.                 IN_ENABLED,
  102.                 IN_MSG,
  103.         };
  104.         enum EOutputs
  105.         {
  106.                 OUT_RECEIVED,
  107.                 OUT_VALUE
  108.         };
  109.  
  110.         // INetMsgListener
  111.         virtual void OnMessage(const SNetMsgData& data) override
  112.         {
  113.                 // Notify if the expected message has arrived
  114.                 const string& key = GetPortString(&m_actInfo, IN_MSG);
  115.                 if (data.key == key)
  116.                 {
  117.                         NET_MSG_DISPATCHER_LOG("CFlowNode_MsgReceiver: %s Listener received message [%s->%s]-[%s/%s]", CNetMessageDistpatcher::DbgTranslateLocationToString(), data.DbgTranslateSourceToString(), data.DbgTranslateTargetToString(), key.c_str(), data.value.c_str());
  118.                         ActivateOutput(&m_actInfo, OUT_RECEIVED, true);
  119.                         ActivateOutput(&m_actInfo, OUT_VALUE, data.value);
  120.                 }
  121.         }
  122.         // ~INetMsgListener
  123.  
  124.         CFlowNode_MsgReceiver(SActivationInfo* pActInfo)
  125.         {
  126.         }
  127.  
  128.         ~CFlowNode_MsgReceiver()
  129.         {
  130.                 Enable(false); // This unregisters the listener
  131.         }
  132.         virtual IFlowNodePtr Clone(SActivationInfo *pActInfo) override
  133.         {
  134.                 return new CFlowNode_MsgReceiver(pActInfo);
  135.         }
  136.  
  137.         virtual void GetConfiguration(SFlowNodeConfig& config) override
  138.         {
  139.                 static const SInputPortConfig in_config[] = {
  140.                         InputPortConfig<bool>("Enable",    _HELP("Enable/disable")),
  141.                         InputPortConfig<string>("Message", _HELP("Listen to this message")),
  142.                         { 0 }
  143.                 };
  144.                 static const SOutputPortConfig out_config[] = {
  145.                         OutputPortConfig_Void("Received", _HELP("Outputs event if the message was received")),
  146.                         OutputPortConfig<string>("Value", _HELP("Optional value sent along with the message")),
  147.                         { 0 }
  148.                 };
  149.  
  150.                 config.pInputPorts = in_config;
  151.                 config.pOutputPorts = out_config;
  152.                 config.SetCategory(EFLN_APPROVED);
  153.         }
  154.         virtual void ProcessEvent(EFlowEvent event, SActivationInfo* pActInfo) override
  155.         {
  156.                 switch (event)
  157.                 {
  158.                 case eFE_Initialize:
  159.                         {
  160.                                 m_actInfo = *pActInfo;  // Keep a copy of the activation info to be able to use the output ports on a call back
  161.                                 const bool enabled = GetPortBool(pActInfo, IN_ENABLED);
  162.                                 Enable(enabled);
  163.                         }
  164.                         break;
  165.                 case eFE_Activate:
  166.                         if (IsPortActive(pActInfo, IN_ENABLED))
  167.                         {
  168.                                 const bool enabled = GetPortBool(pActInfo, IN_ENABLED);
  169.                                 Enable(enabled);
  170.                         }
  171.                         break;
  172.                 }
  173.         }
  174.  
  175.         virtual void GetMemoryUsage(ICrySizer* s) const override
  176.         {
  177.                 s->Add(*this);
  178.         }
  179.  
  180. private:
  181.  
  182.         void Enable(bool enable)
  183.         {
  184.                 if (CNetMessageDistpatcher* pNetMsgDispatcher = CCryAction::GetCryAction()->GetNetMessageDispatcher())
  185.                 {
  186.                         if (enable)
  187.                                 pNetMsgDispatcher->RegisterListener(this, "CFlowNode_MsgSender");
  188.                         else
  189.                                 pNetMsgDispatcher->UnRegisterListener(this);
  190.                 }
  191.         }
  192.  
  193. private:
  194.  
  195.         SActivationInfo m_actInfo;
  196. };
  197.  
  198. REGISTER_FLOW_NODE("Multiplayer:MsgSender", CFlowNode_MsgSender)
  199. REGISTER_FLOW_NODE("Multiplayer:MsgListener", CFlowNode_MsgReceiver)
  200.  
downloadFlowNetMsgNodes.cpp Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top