]> git.mxchange.org Git - flightgear.git/blob - src/MultiPlayer/mpplayer.hxx
Portability fix - use SimGear when available
[flightgear.git] / src / MultiPlayer / mpplayer.hxx
1 // mpplayer.hxx -- routines for a player within a multiplayer Flightgear
2 //
3 // Written by Duncan McCreanor, started February 2003.
4 // duncan.mccreanor@airservicesaustralia.com
5 //
6 // Copyright (C) 2003  Airservices Australia
7 //
8 // This program is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU General Public License as
10 // published by the Free Software Foundation; either version 2 of the
11 // License, or (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful, but
14 // WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 // General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 //
22
23
24 #ifndef MPPLAYER_H
25 #define MPPLAYER_H
26
27 #define MPPLAYER_HID "$Id$"
28
29 /****************************************************************
30 * @version $Id$
31 *
32 * Description: This class holds information about a player in a
33 * multiplayer game. The model for a remote player is loaded and
34 * added onto the aircraft branch of the scene on calling Open.
35 * The model is unloaded from the scene when Close is called
36 * or the object is deleted. The model's positioning transform is
37 * updated by calling SetPosition. The updated position transform
38 * is applied to the model on the scene by calling Draw.
39 *
40 ******************************************************************/
41
42 #include "mpmessages.hxx"
43
44 #include <plib/sg.h>
45 #include <plib/netSocket.h>
46 #include <simgear/io/sg_socket_udp.hxx>
47 #include <simgear/props/props.hxx>
48 #include <time.h>
49
50 #include STL_STRING
51 SG_USING_STD(string);
52
53 // Number of seconds before a player is consider to be lost
54 #define TIME_TO_LIVE 10
55
56 class FGAIMultiplayer;
57
58 class MPPlayer 
59 {
60 public:
61     MPPlayer();
62     ~MPPlayer();
63     /** Enumeration of the states for the player's data */
64     enum PlayerDataState
65     {
66         PLAYER_DATA_NOT_AVAILABLE = 0, 
67         PLAYER_DATA_AVAILABLE, 
68         PLAYER_DATA_EXPIRED
69     };
70     /** Player data state */
71     typedef enum PlayerDataState TPlayerDataState;
72     /** Initialises the class.
73     * @param sIP IP address or host name for sending data to the player
74     * @param sPort Port number for sending data to the player
75     * @param sCallsign Callsign of the player (must be unique across all instances of MPPlayer).
76     * @param sModelName Path and name of the aircraft model file for the player
77     * @param bLocalPlayer True if this player is the local player, else false
78     * @return True if class opens successfully, else false
79     */
80     bool Open(const string &IP, const int &Port, const string &Callsign,
81               const string &ModelName, const bool LocalPlayer);
82     /** Closes the player connection */
83     void Close(void);
84     /** Checks if the time is valid for a position update and perhaps sets the time offset
85      */
86     bool CheckTime(int time, int timeusec);
87     /** Sets the positioning matrix held for this player
88     */
89     void SetPosition(const double lat, const double lon, const double alt,
90                      const double heading, const double roll, const double pitch,
91                      const double speedN, const double speedE, const double speedD,
92                      const double left_aileron, const double right_aileron, const double elevator, const double rudder,
93                      //const double rpms[6],
94                      const double rateH, const double rateR, const double rateP,
95                      const double accN, const double accE, const double accD);
96     /** Sets a property for this player
97     */
98     void SetProperty(string property, SGPropertyNode::Type type, double val);
99     /** Transform and place model for player
100     */
101     TPlayerDataState Draw(void);
102     /** Returns the callsign for the player
103     * @return Aircraft's callsign
104     */
105     string Callsign(void) const;
106     /** Compares the player's callsign with the given callsign
107     * @param sCallsign Callsign to compare
108     * @return True if callsign matches
109     */
110     bool CompareCallsign(const char *Callsign) const;
111     /** Populates a position message for the player
112     * @param MsgHdr Header to be populated
113     * @param PosMsg Position message to be populated
114     */
115     void FillPosMsg(T_MsgHdr *MsgHdr, T_PositionMsg *PosMsg);
116     /** Populates a mesage header with information for the player
117     * @param MsgHdr Header to be populated
118     * @param iMsgId Message type identifier to insert into header
119     */
120     void FillMsgHdr(T_MsgHdr *MsgHdr, const int iMsgId);
121 private:
122     void    LoadAI(void);       // Loads the plane into the AI core
123     bool    m_Initialised;      // True if object is initialised 
124     
125     double  m_lat;              // location, orientation, etc...
126     double  m_lon;              // ...
127     double  m_alt;              // ...
128     double  m_hdg;              // ...
129     double  m_roll;             // ...
130     double  m_pitch;            // ...
131     double  m_speedN;           // ...
132     double  m_speedE;           // ...
133     double  m_speedD;           // ...
134     double  m_accN;             // ...
135     double  m_accE;             // ...
136     double  m_accD;             // ...
137     double  m_left_aileron;     // ...
138     double  m_right_aileron;     // ...
139     double  m_elevator;         // ...
140     double  m_rudder;           // ...
141     //double  m_rpms[6];          // ...
142     double  m_rateH;            // ...
143     double  m_rateR;            // ...
144     double  m_rateP;            // ...
145
146     time_t  m_LastUpdate;       // last time update data received
147     int     m_LastTime;         // last seconds according to the packet
148     int     m_LastUTime;        // last microseconds according to the packet
149     double  m_Elapsed;          // Elapsed other-side time between responses
150     double  m_TimeOffset;       // the offset to aim for
151     double  m_LastOffset;       // the last offset we got
152     bool    m_Updated;          // Set when the player data is updated
153     string  m_Callsign;         // players callsign
154     bool    m_LocalPlayer;      // true if player is the local player
155     string  m_ModelName;        // Aircraft model name for player
156     netAddress m_PlayerAddress; // Address information for the player
157     FGAIMultiplayer *m_AIModel; // The AI model of this aircraft
158 };
159
160 #endif
161
162
163