////////////////////////////////////////////////////////////////////// // // multiplaymgr.hxx // // Written by Duncan McCreanor, started February 2003. // duncan.mccreanor@airservicesaustralia.com // // Copyright (C) 2003 Airservices Australia // Copyright (C) 2005 Oliver Schroeder // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as // published by the Free Software Foundation; either version 2 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ // ////////////////////////////////////////////////////////////////////// #ifndef MULTIPLAYMGR_H #define MULTIPLAYMGR_H #define MULTIPLAYTXMGR_HID "$Id$" const int MIN_MP_PROTOCOL_VERSION = 1; const int MAX_MP_PROTOCOL_VERSION = 2; #include #include #include #include #include #include #include #include class IRCConnection; class CPDLCManager; const std::string MPIRC_SERVER_HOST_DEFAULT {"mpirc.flightgear.org"}; const std::string MPIRC_SERVER_HOST_PROPERTY {"/network/mpirc/server-host"}; const std::string MPIRC_SERVER_PORT_PROPERTY {"/network/mpirc/server-port"}; const std::string MPIRC_NICK_PREFIX {"MP_IRC_"}; struct FGExternalMotionData; class MPPropertyListener; struct T_MsgHdr; class FGAIMultiplayer; class FGMultiplayMgr : public SGSubsystem { public: FGMultiplayMgr(); ~FGMultiplayMgr(); // Subsystem API. void init() override; void reinit() override; void shutdown() override; void update(double dt) override; // Subsystem identification. static const char* staticSubsystemClassId() { return "mp"; } // transmitter void SendTextMessage(const std::string &sMsgText); // receiver FGAIMultiplayer* getMultiplayer(const std::string& callsign); std::shared_ptr> popMessageHistory(); void pushMessageHistory(std::shared_ptr> message); // Remove motion information for all multiplayer aircraft, e.g. when // scrubbing during replay. void ClearMotion(); CPDLCManager *getCPDLC() { return _cpdlc.get(); }; private: std::unique_ptr _mpirc; std::unique_ptr _cpdlc; friend class MPPropertyListener; void setPropertiesChanged() { mPropertiesChanged = true; } int getProtocolToUse() { int protocolVersion = pProtocolVersion->getIntValue(); if (protocolVersion >= MIN_MP_PROTOCOL_VERSION && protocolVersion <= MAX_MP_PROTOCOL_VERSION) return protocolVersion; else return MIN_MP_PROTOCOL_VERSION; } void findProperties(); void Send(double currentMPTime); void SendMyPosition(const FGExternalMotionData& motionInfo); short get_scaled_short(double v, double scale); union MsgBuf; FGAIMultiplayer* addMultiplayer(const std::string& callsign, const std::string& modelName, const int fallback_model_index); void FillMsgHdr(T_MsgHdr *MsgHdr, int iMsgId, unsigned _len = 0u); void ProcessPosMsg(const MsgBuf& Msg, const simgear::IPAddress& SenderAddress, long stamp); void ProcessChatMsg(const MsgBuf& Msg, const simgear::IPAddress& SenderAddress); bool isSane(const FGExternalMotionData& motionInfo); int GetMsgNetwork(MsgBuf& msgBuf, simgear::IPAddress& SenderAddress); int GetMsg(MsgBuf& msgBuf, simgear::IPAddress& SenderAddress); /// maps from the callsign string to the FGAIMultiplayer typedef std::map > MultiPlayerMap; MultiPlayerMap mMultiPlayerMap; std::unique_ptr mSocket; simgear::IPAddress mServer; bool mHaveServer; bool mInitialised; std::string mCallsign; // Map between the property id's from the multiplayers network packets // and the property nodes typedef std::map > PropertyMap; PropertyMap mPropertyMap; SGPropertyNode *pProtocolVersion; SGPropertyNode *pXmitLen; SGPropertyNode *pMultiPlayDebugLevel; SGPropertyNode *pMultiPlayRange; SGPropertyNode *pMultiPlayTransmitPropertyBase; SGPropertyNode *pReplayState; SGPropertyNode *pLogRawSpeedMultiplayer; typedef std::map PropertyDefinitionMap; PropertyDefinitionMap mPropertyDefinition; bool mPropertiesChanged; MPPropertyListener* mListener; double mDt; // reciprocal of /sim/multiplay/tx-rate-hz double mNextTransmitTime = 0.0; std::deque>> mRecordMessageQueue; std::deque>> mReplayMessageQueue; }; #endif