1 // mpplayer.hxx -- routines for a player within a multiplayer Flightgear
3 // Written by Duncan McCreanor, started February 2003.
4 // duncan.mccreanor@airservicesaustralia.com
6 // Copyright (C) 2003 Airservices Australia
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.
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.
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.
27 #define MPPLAYER_HID "$Id$"
29 /****************************************************************
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.
40 ******************************************************************/
42 #include "mpmessages.hxx"
45 #include <plib/netSocket.h>
46 #include <simgear/io/sg_socket_udp.hxx>
47 #include <simgear/props/props.hxx>
53 // Number of seconds before a player is consider to be lost
54 #define TIME_TO_LIVE 10
56 class FGAIMultiplayer;
63 /** Enumeration of the states for the player's data */
66 PLAYER_DATA_NOT_AVAILABLE = 0,
67 PLAYER_DATA_AVAILABLE,
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
80 bool Open(const string &IP, const int &Port, const string &Callsign,
81 const string &ModelName, const bool LocalPlayer);
82 /** Closes the player connection */
84 /** Checks if the time is valid for a position update and perhaps sets the time offset
86 bool CheckTime(int time, int timeusec);
87 /** Sets the positioning matrix held for this player
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
98 void SetProperty(string property, SGPropertyNode::Type type, double val);
99 /** Transform and place model for player
101 TPlayerDataState Draw(void);
102 /** Returns the callsign for the player
103 * @return Aircraft's callsign
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
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
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
120 void FillMsgHdr(T_MsgHdr *MsgHdr, const int iMsgId);
122 void LoadAI(void); // Loads the plane into the AI core
123 bool m_Initialised; // True if object is initialised
125 double m_lat; // location, orientation, etc...
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; // ...
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