bitte schön:
Code:
// FlowNode - Dialog
// Created for "CRYTHIC" by Simon Mahalsky
//
// Dialog-Node for Crythic. It manages a conversation with NPCs

#include "StdAfx.h"
#include "Game.h"
#include "GameCVars.h"
#include "GameActions.h"
#include "HUD/HUD.h"
#include "IHardwareMouse.h"
#include "Nodes/G2FlowBaseNode.h"

#include <IActorSystem.h>
#include <StringUtils.h>

class CFlowNode_Dialog:public CFlowBaseNode, public IHardwareMouseEventListener, public IInputEventListener
{
private:
    SActivationInfo* m_actInfo;

    unsigned int m_iCursorCounter;
    
    bool b_active;
    bool b_select;
    bool b_button;
    string m_key;

    Vec2i i_mPos;

public:
    CFlowNode_Dialog::CFlowNode_Dialog(SActivationInfo* pActInfo)
    {
        b_active=false;
        b_select=false;
        b_button=false;
    }

    ~CFlowNode_Dialog()
    {
        if(gEnv->pHardwareMouse)
        {
            gEnv->pHardwareMouse->RemoveListener(this);
        }

        if(GetISystem() && GetISystem()->GetIInput())
        {
            GetISystem()->GetIInput()->RemoveEventListener(this);
        }
    }

    enum EInputPorts
    {
        EIP_Activate=0,
        EIP_Deactivate,

        // Messages:
        EIP_MsgOne,
        EIP_MsgTwo,
        EIP_MsgThree,
        EIP_MsgFour,
        EIP_MsgFive,
    };

    enum EOutputPorts
    {
        EOP_Message,
        EOP_Done,
    };

    virtual void GetMemoryStatistics(ICrySizer *s)
    {
        s->Add(*this);
    }

    virtual void GetConfiguration(SFlowNodeConfig& config)
    {
        static const SInputPortConfig in_ports[]=
        {
            InputPortConfig_Void("Activate", _HELP("Activate")),
            InputPortConfig_Void("Deactivate", _HELP("Deactivate")),
            InputPortConfig<string>("MsgOne", _HELP("MsgOne"), 0, _UICONFIG("dt=text")),
            InputPortConfig<string>("MsgTwo", _HELP("MsgTwo"), 0, _UICONFIG("dt=text")),
            InputPortConfig<string>("MsgThree", _HELP("MsgThree"), 0, _UICONFIG("dt=text")),
            InputPortConfig<string>("MsgFour", _HELP("MsgFour"), 0, _UICONFIG("dt=text")),
            InputPortConfig<string>("MsgFive", _HELP("MsgFive"), 0, _UICONFIG("dt=text")),
            {0}
        };

        static const SOutputPortConfig out_ports[]=
        {
            OutputPortConfig_Void("Message", _HELP("Message")),
            OutputPortConfig_Void("Done", _HELP("Done")),
            {0}
        };

        config.pInputPorts=in_ports;
        config.pOutputPorts=out_ports;
        config.sDescription=_HELP("Dialog");
        config.SetCategory(EFLN_WIP);
    }

    virtual void ProcessEvent(EFlowEvent event, SActivationInfo* pActInfo)
    {
        switch(event)
        {
        case eFE_Initialize:
            {
                if(gEnv->pHardwareMouse)
                {
                    gEnv->pHardwareMouse->AddListener(this);
                }
                if(GetISystem()&&GetISystem()->GetIInput())
                {
                    GetISystem()->GetIInput()->AddEventListener(this);
                }

                b_active=false;
                b_button=false;
                b_select=false;

                Movement(true);
                Mouse(false);

                break;
            }

        case eFE_Activate:
            {
                if(IsPortActive(pActInfo, EIP_Activate))
                {
                    b_active=true;

                    CHUD* pHUD=g_pGame->GetHUD();
                    if(pHUD==0)
                    {
                        return;
                    }

                    const string msgOne=GetPortString(pActInfo, EIP_MsgOne);
                    const string msgTwo=GetPortString(pActInfo, EIP_MsgTwo);
                    const string msgThree=GetPortString(pActInfo, EIP_MsgThree);
                    const string msgFour=GetPortString(pActInfo, EIP_MsgFour);
                    const string msgFive=GetPortString(pActInfo, EIP_MsgFive);
                    pHUD->DisplayCrythicDialog(msgOne, msgTwo, msgThree, msgFour, msgFive);

                    Movement(false);
                    Mouse(true);

                    // Hier das Dialog-Menü ausblenden
                }
                break;
            }
        }
    }

    virtual bool OnInputEventUI( const SInputEvent &event ) 
    {
        return false;
    }

    virtual bool OnInputEvent(const SInputEvent &rInputEvent)
    {
        if(!b_active)
        {
            return false;
        }

        if(rInputEvent.keyId==GetKeyID(m_key) && rInputEvent.state==eIS_Pressed)
        {
            b_button=!b_button;

            if(b_button)
            {
                Movement(false);
                Mouse(true);
            }
            else
            {
                Movement(true);
                Mouse(false);
            }
        }
        else if(rInputEvent.keyId==eKI_Mouse1 && rInputEvent.state==eIS_Pressed && b_button)
        {
            // Code fehlt
        }

        return false;
    }

    virtual void OnHardwareMouseEvent(int iX,int iY,EHARDWAREMOUSEEVENT eHardwareMouseEvent)
    {
        if(b_active)
        {
            if(eHardwareMouseEvent==HARDWAREMOUSEEVENT_LBUTTONDOWN)
            {
                b_select=true;
            }
            else if(eHardwareMouseEvent==HARDWAREMOUSEEVENT_LBUTTONUP)
            {
                b_select=false;
                i_mPos=Vec2i(iX, iY);
            }

            //const string g_message=FCom(return_command, return_value);
            const string g_message="#TEST-VALUE#";
            ActivateOutput(m_actInfo, EOP_Done, true);
            ActivateOutput(m_actInfo, EOP_Message, g_message);
        }
    }

private:
    void CFlowNode_Dialog::Movement(bool enable)
    {
        IActionMapManager *pActionMapManager=gEnv->pGame->GetIGameFramework()->GetIActionMapManager();
        
        if(enable)
        {
            if(pActionMapManager)
            {
                pActionMapManager->EnableFilter("no_move", false);
                pActionMapManager->EnableFilter("no_mouse", false);
            }
        }
        else
        {
            if(pActionMapManager)
            {
                pActionMapManager->EnableFilter("no_move", true);
                pActionMapManager->EnableFilter("no_mouse", true);
            }
        }
    }

    void CFlowNode_Dialog::Mouse(bool enable)
    {
        if(enable)
        {
            gEnv->pHardwareMouse->IncrementCounter();
            ++m_iCursorCounter;
        }
        else
        {
            while(m_iCursorCounter>0)
            {
                gEnv->pHardwareMouse->DecrementCounter();
                m_iCursorCounter--;
            }
        }
    }

    string CFlowNode_Dialog::FCom(const char *command, const char *value)
    {
        string ret;

        if(strcmp(command, "returnMessage"))
        {
            return ret=value;
        }
        else
        {
            return ret="";
        }
    }

    EKeyId CFlowNode_Dialog::GetKeyID(string sKey)
    {
        if(!strcmpi(sKey, "0"))
            return eKI_0;
        else if(!strcmpi(sKey, "1"))
            return eKI_1;
        else if(!strcmpi(sKey, "2"))
            return eKI_2;
        else if(!strcmpi(sKey, "3"))
            return eKI_3;
        else if(!strcmpi(sKey, "4"))
            return eKI_4;
        else if(!strcmpi(sKey, "5"))
            return eKI_5;
        else if(!strcmpi(sKey, "6"))
            return eKI_6;
        else if(!strcmpi(sKey, "7"))
            return eKI_7;
        else if(!strcmpi(sKey, "8"))
            return eKI_8;
        else if(!strcmpi(sKey, "9"))
            return eKI_9;

        else if(!strcmpi(sKey, "F1"))
            return eKI_F1;
        else if(!strcmpi(sKey, "F2"))
            return eKI_F2;
        else if(!strcmpi(sKey, "F3"))
            return eKI_F3;
        else if(!strcmpi(sKey, "F4"))
            return eKI_F4;
        else if(!strcmpi(sKey, "F5"))
            return eKI_F5;
        else if(!strcmpi(sKey, "F6"))
            return eKI_F6;
        else if(!strcmpi(sKey, "F7"))
            return eKI_F7;
        else if(!strcmpi(sKey, "F8"))
            return eKI_F8;
        else if(!strcmpi(sKey, "F9"))
            return eKI_F9;
        else if(!strcmpi(sKey, "F10"))
            return eKI_F10;

        else if(!strcmpi(sKey, "NUM0"))
            return eKI_NP_0;
        else if(!strcmpi(sKey, "NUM1"))
            return eKI_NP_1;
        else if(!strcmpi(sKey, "NUM2"))
            return eKI_NP_2;
        else if(!strcmpi(sKey, "NUM3"))
            return eKI_NP_3;
        else if(!strcmpi(sKey, "NUM4"))
            return eKI_NP_4;
        else if(!strcmpi(sKey, "NUM5"))
            return eKI_NP_5;
        else if(!strcmpi(sKey, "NUM6"))
            return eKI_NP_6;
        else if(!strcmpi(sKey, "NUM7"))
            return eKI_NP_7;
        else if(!strcmpi(sKey, "NUM8"))
            return eKI_NP_8;
        else if(!strcmpi(sKey, "NUM9"))
            return eKI_NP_9;
        else if(!strcmpi(sKey, "NUMENTER"))
            return eKI_NP_Enter;

        else if(!strcmpi(sKey, "MOUSE1"))
            return eKI_Mouse1;
        else if(!strcmpi(sKey, "MOUSE2"))
            return eKI_Mouse2;
        else if(!strcmpi(sKey, "MOUSE3"))
            return eKI_Mouse3;
        else if(!strcmpi(sKey, "MOUSE4"))
            return eKI_Mouse4;
        else if(!strcmpi(sKey, "MOUSE5"))
            return eKI_Mouse5;
        else if(!strcmpi(sKey, "MOUSE6"))
            return eKI_Mouse6;
        else if(!strcmpi(sKey, "MOUSE7"))
            return eKI_Mouse7;
        else if(!strcmpi(sKey, "MOUSE8"))
            return eKI_Mouse8;

        else if(!strcmpi(sKey, "DOWN"))
            return eKI_Down;
        else if(!strcmpi(sKey, "UP"))
            return eKI_Up;
        else if(!strcmpi(sKey, "LEFT"))
            return eKI_Left;
        else if(!strcmpi(sKey, "RIGHT"))
            return eKI_Right;

        else if(!strcmpi(sKey, "A"))
            return eKI_A;
        else if(!strcmpi(sKey, "B"))
            return eKI_B;
        else if(!strcmpi(sKey, "C"))
            return eKI_C;
        else if(!strcmpi(sKey, "D"))
            return eKI_D;
        else if(!strcmpi(sKey, "E"))
            return eKI_E;
        else if(!strcmpi(sKey, "F"))
            return eKI_F;
        else if(!strcmpi(sKey, "G"))
            return eKI_G;
        else if(!strcmpi(sKey, "H"))
            return eKI_H;
        else if(!strcmpi(sKey, "I"))
            return eKI_I;
        else if(!strcmpi(sKey, "J"))
            return eKI_J;
        else if(!strcmpi(sKey, "K"))
            return eKI_K;
        else if(!strcmpi(sKey, "L"))
            return eKI_L;
        else if(!strcmpi(sKey, "M"))
            return eKI_M;
        else if(!strcmpi(sKey, "N"))
            return eKI_N;
        else if(!strcmpi(sKey, "O"))
            return eKI_O;
        else if(!strcmpi(sKey, "P"))
            return eKI_P;
        else if(!strcmpi(sKey, "Q"))
            return eKI_Q;
        else if(!strcmpi(sKey, "R"))
            return eKI_R;
        else if(!strcmpi(sKey, "S"))
            return eKI_S;
        else if(!strcmpi(sKey, "T"))
            return eKI_T;
        else if(!strcmpi(sKey, "U"))
            return eKI_U;
        else if(!strcmpi(sKey, "V"))
            return eKI_V;
        else if(!strcmpi(sKey, "W"))
            return eKI_W;
        else if(!strcmpi(sKey, "X"))
            return eKI_X;
        else if(!strcmpi(sKey, "Y"))
            return eKI_Y;
        else if(!strcmpi(sKey, "Z"))
            return eKI_Z;

        else
            return eKI_NP_0;
    }
};

REGISTER_FLOW_NODE("Crythic:Dialog", CFlowNode_Dialog);