~swag/armagetronad/0.2.9-sty+ct+ap-fork

« back to all changes in this revision

Viewing changes to src/engine/ePlayer.h

  • Committer: Armanelgtron
  • Date: 2015-02-04 00:27:54 UTC
  • Revision ID: armanelgtron@gmail.com-20150204002754-ir113313u429nquk
The 0.4 OP src works without crashing, so DEOP and OP is fixed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 
3
 
*************************************************************************
4
 
 
5
 
ArmageTron -- Just another Tron Lightcycle Game in 3D.
6
 
Copyright (C) 2000  Manuel Moos (manuel@moosnet.de)
7
 
 
8
 
**************************************************************************
9
 
 
10
 
This program is free software; you can redistribute it and/or
11
 
modify it under the terms of the GNU General Public License
12
 
as published by the Free Software Foundation; either version 2
13
 
of the License, or (at your option) any later version.
14
 
 
15
 
This program is distributed in the hope that it will be useful,
16
 
but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 
GNU General Public License for more details.
19
 
 
20
 
You should have received a copy of the GNU General Public License
21
 
along with this program; if not, write to the Free Software
22
 
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23
 
 
24
 
***************************************************************************
25
 
 
26
 
*/
27
 
 
28
 
#ifndef ArmageTron_PLAYER_H
29
 
#define ArmageTron_PLAYER_H
30
 
 
31
 
#ifndef MAX_INSTANT_CHAT
32
 
#define MAX_INSTANT_CHAT 25
33
 
#endif
34
 
 
35
 
#define MAX_PLAYERS 4
36
 
 
37
 
#include "rSDL.h"
38
 
 
39
 
#include "uInput.h"
40
 
#include "tList.h"
41
 
#include "tString.h"
42
 
#include "eCamera.h"
43
 
#include "eNetGameObject.h"
44
 
#include "tCallbackString.h"
45
 
#include "nSpamProtection.h"
46
 
 
47
 
#include <set>
48
 
#include <list>
49
 
#include <utility>
50
 
#include "eChat.h"
51
 
 
52
 
 
53
 
#define PLAYER_CONFITEMS (30+MAX_INSTANT_CHAT)
54
 
 
55
 
// maximal length of chat message
56
 
extern int se_SpamMaxLen;
57
 
 
58
 
// Maximum number of chat entries to save for spam analysis
59
 
extern int se_lastSaidMaxEntries;
60
 
 
61
 
// time during which no repeaded chat messages are printed
62
 
extern REAL se_alreadySaidTimeout;
63
 
 
64
 
// minimal access level for chat
65
 
extern tAccessLevel se_chatAccessLevel;
66
 
 
67
 
// time between public chat requests, set to 0 to disable
68
 
extern REAL se_chatRequestTimeout;
69
 
 
70
 
// call on commands that only work on the server; quit if it returns true
71
 
bool se_NeedsServer(char const * command, std::istream & s, bool strict = true );
72
 
 
73
 
class tConfItemBase;
74
 
class uAction;
75
 
class tOutput;
76
 
class eTeam;
77
 
class eVoter;
78
 
 
79
 
class ePlayer: public uPlayerPrototype{
80
 
    friend class eMenuItemChat;
81
 
    static uActionPlayer s_chat;
82
 
    static uActionTooltip s_chatTooltip;
83
 
 
84
 
    tConfItemBase *configuration[PLAYER_CONFITEMS];
85
 
    int            CurrentConfitem;
86
 
    void   StoreConfitem(tConfItemBase *c);
87
 
    void   DeleteConfitems();
88
 
 
89
 
    double lastTooltip_;
90
 
public:
91
 
    tString    name;                 // the player's screen name
92
 
    tString    globalID;             // the global ID of the player in user@authority form
 
1
/*
 
2
 
 
3
*************************************************************************
 
4
 
 
5
ArmageTron -- Just another Tron Lightcycle Game in 3D.
 
6
Copyright (C) 2000  Manuel Moos (manuel@moosnet.de)
 
7
 
 
8
**************************************************************************
 
9
 
 
10
This program is free software; you can redistribute it and/or
 
11
modify it under the terms of the GNU General Public License
 
12
as published by the Free Software Foundation; either version 2
 
13
of the License, or (at your option) any later version.
 
14
 
 
15
This program is distributed in the hope that it will be useful,
 
16
but WITHOUT ANY WARRANTY; without even the implied warranty of
 
17
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
18
GNU General Public License for more details.
 
19
 
 
20
You should have received a copy of the GNU General Public License
 
21
along with this program; if not, write to the Free Software
 
22
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
23
 
 
24
***************************************************************************
 
25
 
 
26
*/
 
27
 
 
28
#ifndef ArmageTron_PLAYER_H
 
29
#define ArmageTron_PLAYER_H
 
30
 
 
31
#ifndef MAX_INSTANT_CHAT
 
32
#define MAX_INSTANT_CHAT 25
 
33
#endif
 
34
 
 
35
#define MAX_PLAYERS 4
 
36
 
 
37
#include "rSDL.h"
 
38
 
 
39
#include "uInput.h"
 
40
#include "tList.h"
 
41
#include "tString.h"
 
42
#include "eCamera.h"
 
43
#include "eNetGameObject.h"
 
44
#include "tCallbackString.h"
 
45
#include "nSpamProtection.h"
 
46
 
 
47
#include <set>
 
48
#include <list>
 
49
#include <utility>
 
50
#include "eChat.h"
 
51
 
 
52
 
 
53
#define PLAYER_CONFITEMS (30+MAX_INSTANT_CHAT)
 
54
 
 
55
// maximal length of chat message
 
56
extern int se_SpamMaxLen;
 
57
 
 
58
// Maximum number of chat entries to save for spam analysis
 
59
extern int se_lastSaidMaxEntries;
 
60
 
 
61
// time during which no repeaded chat messages are printed
 
62
extern REAL se_alreadySaidTimeout;
 
63
 
 
64
// minimal access level for chat
 
65
extern tAccessLevel se_chatAccessLevel;
 
66
 
 
67
// time between public chat requests, set to 0 to disable
 
68
extern REAL se_chatRequestTimeout;
 
69
 
 
70
// call on commands that only work on the server; quit if it returns true
 
71
bool se_NeedsServer(char const * command, std::istream & s, bool strict = true );
 
72
 
 
73
class tConfItemBase;
 
74
class uAction;
 
75
class tOutput;
 
76
class eTeam;
 
77
class eVoter;
 
78
 
 
79
class ePlayer: public uPlayerPrototype{
 
80
    friend class eMenuItemChat;
 
81
    static uActionPlayer s_chat;
 
82
    static uActionTooltip s_chatTooltip;
 
83
 
 
84
    tConfItemBase *configuration[PLAYER_CONFITEMS];
 
85
    int            CurrentConfitem;
 
86
    void   StoreConfitem(tConfItemBase *c);
 
87
    void   DeleteConfitems();
 
88
 
 
89
    double lastTooltip_;
 
90
public:
 
91
    tString    name;                 // the player's screen name
 
92
    tString    globalID;             // the global ID of the player in user@authority form
93
93
    // REAL        rubberstatus;
94
 
    tString     teamname;
95
 
    bool       centerIncamOnTurn;
96
 
    bool       wobbleIncam;
97
 
    bool       autoSwitchIncam;
98
 
 
99
 
    bool       spectate;              // shall this player always spectate?
100
 
    bool       stealth;               // does this player wish to hide his/her identity?
101
 
    bool       autoLogin;             // should the player always request authentication on servers?
102
 
 
103
 
    bool                nameTeamAfterMe; // player prefers to call his team after his name
104
 
    int                 favoriteNumberOfPlayersPerTeam;
105
 
 
106
 
    eCamMode startCamera;
107
 
    bool     allowCam[10];
108
 
    int      startFOV;
109
 
    bool     smartCustomGlance; //!< flag making the smart camera use the custom settings for glancing
110
 
 
111
 
    tCHECKED_PTR(eCamera)           cam;
112
 
    tCONTROLLED_PTR(ePlayerNetID) netPlayer;
113
 
 
114
 
    int rgb[3]; // our color
115
 
 
116
 
    tString instantChatString[MAX_INSTANT_CHAT];
117
 
    // instant chat macros
118
 
 
119
 
    static uActionPlayer *se_instantChatAction[MAX_INSTANT_CHAT];
120
 
 
121
 
    ePlayer();
122
 
    virtual ~ePlayer();
123
 
 
 
94
    tString     teamname;
 
95
    bool       centerIncamOnTurn;
 
96
    bool       wobbleIncam;
 
97
    bool       autoSwitchIncam;
 
98
 
 
99
    bool       spectate;              // shall this player always spectate?
 
100
    bool       stealth;               // does this player wish to hide his/her identity?
 
101
    bool       autoLogin;             // should the player always request authentication on servers?
 
102
 
 
103
    bool                nameTeamAfterMe; // player prefers to call his team after his name
 
104
    int                 favoriteNumberOfPlayersPerTeam;
 
105
 
 
106
    eCamMode startCamera;
 
107
    bool     allowCam[10];
 
108
    int      startFOV;
 
109
    bool     smartCustomGlance; //!< flag making the smart camera use the custom settings for glancing
 
110
 
 
111
    tCHECKED_PTR(eCamera)           cam;
 
112
    tCONTROLLED_PTR(ePlayerNetID) netPlayer;
 
113
 
 
114
    int rgb[3]; // our color
 
115
 
 
116
    tString instantChatString[MAX_INSTANT_CHAT];
 
117
    // instant chat macros
 
118
 
 
119
    static uActionPlayer *se_instantChatAction[MAX_INSTANT_CHAT];
 
120
 
 
121
    ePlayer();
 
122
    virtual ~ePlayer();
 
123
 
124
124
    virtual const char *Name() const{return name;}
125
 
    virtual const char *Teamname() const{return teamname;}
126
 
 
127
 
    virtual bool Act(uAction *act,REAL x);
128
 
 
129
 
    int ID() const {return id;}
130
 
#ifndef DEDICATED
131
 
    void Render();
132
 
#endif
133
 
 
134
 
    static ePlayer * PlayerConfig(int p);
135
 
 
136
 
    static bool PlayerIsInGame(int p);
137
 
 
138
 
    // veto function for tooltips that require a controllable game object
139
 
    static bool VetoActiveTooltip(int player);
140
 
 
141
 
    static rViewport * PlayerViewport(int p);
142
 
 
143
 
    static void LogIn();          //!< sends authentication login messages for all local players
144
 
    static void SendAuthNames();  //!< sends authentication names and authentication wishes for all local players
145
 
 
146
 
    static void Init();
147
 
    static void Exit();
148
 
};
149
 
 
150
 
//! class managing access levels.
151
 
class eAccessLevelHolder
152
 
{
153
 
public:
154
 
    eAccessLevelHolder();
155
 
 
156
 
    tAccessLevel GetAccessLevel() const { return accessLevel; }
157
 
    void SetAccessLevel( tAccessLevel level );
158
 
 
159
 
private:
160
 
    tAccessLevel     accessLevel;    //!< admin access level of the current user
161
 
};
162
 
 
163
 
//! detector for turn timing assist bots
164
 
class eUncannyTimingDetector
165
 
{
166
 
public:
167
 
    //! settings for a single analyzer
168
 
    struct eUncannyTimingSettings
169
 
    {
170
 
        REAL timescale; //!< the timescale. Events are divided in two buckets, one between 0 and timescale/2, the other from timescale/2 to timescale.
171
 
        REAL maxGoodRatio; //!< the maximal allowed recent ratio of events to land in the 'good' bucket
172
 
        REAL goodHumanRatio; //!< the maximal observed ratio for a human
173
 
        int  averageOverEvents; //!< number of events to average over
174
 
 
175
 
        mutable REAL bestRatio; //!< best ratio achieved by players during this session
176
 
 
177
 
        eUncannyTimingSettings( REAL ts, REAL human, REAL max )
178
 
        : timescale( ts ), maxGoodRatio( max ), goodHumanRatio(human), averageOverEvents(40)
179
 
        , bestRatio(0)
180
 
        {}
181
 
 
182
 
        ~eUncannyTimingSettings();
183
 
    };
184
 
 
185
 
    //! single analyzer with single timescale
186
 
    class eUncannyTimingAnalysis
187
 
    {
188
 
    public:
189
 
        //! analyze a single timing event
190
 
        REAL Analyze( REAL timing, eUncannyTimingSettings const & settings );
191
 
        eUncannyTimingAnalysis();
192
 
    private:
193
 
        REAL accurateRatio; //!< ratio of events in the more accurate half
194
 
        int turnsSoFar;     //!< number of turns accounted for so far
195
 
    };
196
 
 
197
 
    //! detection level of timing aid hacks
198
 
    enum DangerLevel
199
 
    {
200
 
        DangerLevel_Low,    //!< about 25% of the tolerance reached
201
 
        DangerLevel_Medium, //!< about 50% of the tolerance reached
202
 
        DangerLevel_High,   //!< about 75% of the tolerance reached
203
 
        DangerLevel_Max     //!< 100% of the tolerance reached, worst action triggered
204
 
    };
205
 
 
206
 
    eUncannyTimingDetector();
207
 
 
208
 
    //! analzye a timing event
209
 
    void Analyze( REAL timing, ePlayerNetID * player );
210
 
private:
211
 
    //! three analyzers for varying timescales
212
 
    eUncannyTimingAnalysis fast, medium, slow;
213
 
 
214
 
    DangerLevel dangerLevel;
215
 
};
216
 
 
217
 
// the class that identifies players across the network
218
 
class ePlayerNetID: public nNetObject, public eAccessLevelHolder{
219
 
    friend class ePlayer;
220
 
    friend class eTeam;
221
 
    friend class eNetGameObject;
222
 
    friend class tControlledPTR< ePlayerNetID >;
223
 
    // access level. lower numeric values are better.
224
 
public:
225
 
    typedef std::set< eTeam * > eTeamSet;
226
 
private:
227
 
 
228
 
    int listID;                          // ID in the list of all players
229
 
    int teamListID;                      // ID in the list of the team
230
 
 
 
125
    virtual const char *Teamname() const{return teamname;}
 
126
 
 
127
    virtual bool Act(uAction *act,REAL x);
 
128
 
 
129
    int ID() const {return id;}
 
130
#ifndef DEDICATED
 
131
    void Render();
 
132
#endif
 
133
 
 
134
    static ePlayer * PlayerConfig(int p);
 
135
 
 
136
    static bool PlayerIsInGame(int p);
 
137
 
 
138
    // veto function for tooltips that require a controllable game object
 
139
    static bool VetoActiveTooltip(int player);
 
140
 
 
141
    static rViewport * PlayerViewport(int p);
 
142
 
 
143
    static void LogIn();          //!< sends authentication login messages for all local players
 
144
    static void SendAuthNames();  //!< sends authentication names and authentication wishes for all local players
 
145
 
 
146
    static void Init();
 
147
    static void Exit();
 
148
};
 
149
 
 
150
//! class managing access levels.
 
151
class eAccessLevelHolder
 
152
{
 
153
public:
 
154
    eAccessLevelHolder();
 
155
 
 
156
    tAccessLevel GetAccessLevel() const { return accessLevel; }
 
157
    void SetAccessLevel( tAccessLevel level );
 
158
 
 
159
private:
 
160
    tAccessLevel     accessLevel;    //!< admin access level of the current user
 
161
};
 
162
 
 
163
//! detector for turn timing assist bots
 
164
class eUncannyTimingDetector
 
165
{
 
166
public:
 
167
    //! settings for a single analyzer
 
168
    struct eUncannyTimingSettings
 
169
    {
 
170
        REAL timescale; //!< the timescale. Events are divided in two buckets, one between 0 and timescale/2, the other from timescale/2 to timescale.
 
171
        REAL maxGoodRatio; //!< the maximal allowed recent ratio of events to land in the 'good' bucket
 
172
        REAL goodHumanRatio; //!< the maximal observed ratio for a human
 
173
        int  averageOverEvents; //!< number of events to average over
 
174
 
 
175
        mutable REAL bestRatio; //!< best ratio achieved by players during this session
 
176
 
 
177
        eUncannyTimingSettings( REAL ts, REAL human, REAL max )
 
178
        : timescale( ts ), maxGoodRatio( max ), goodHumanRatio(human), averageOverEvents(40)
 
179
        , bestRatio(0)
 
180
        {}
 
181
 
 
182
        ~eUncannyTimingSettings();
 
183
    };
 
184
 
 
185
    //! single analyzer with single timescale
 
186
    class eUncannyTimingAnalysis
 
187
    {
 
188
    public:
 
189
        //! analyze a single timing event
 
190
        REAL Analyze( REAL timing, eUncannyTimingSettings const & settings );
 
191
        eUncannyTimingAnalysis();
 
192
    private:
 
193
        REAL accurateRatio; //!< ratio of events in the more accurate half
 
194
        int turnsSoFar;     //!< number of turns accounted for so far
 
195
    };
 
196
 
 
197
    //! detection level of timing aid hacks
 
198
    enum DangerLevel
 
199
    {
 
200
        DangerLevel_Low,    //!< about 25% of the tolerance reached
 
201
        DangerLevel_Medium, //!< about 50% of the tolerance reached
 
202
        DangerLevel_High,   //!< about 75% of the tolerance reached
 
203
        DangerLevel_Max     //!< 100% of the tolerance reached, worst action triggered
 
204
    };
 
205
 
 
206
    eUncannyTimingDetector();
 
207
 
 
208
    //! analzye a timing event
 
209
    void Analyze( REAL timing, ePlayerNetID * player );
 
210
private:
 
211
    //! three analyzers for varying timescales
 
212
    eUncannyTimingAnalysis fast, medium, slow;
 
213
 
 
214
    DangerLevel dangerLevel;
 
215
};
 
216
 
 
217
// the class that identifies players across the network
 
218
class ePlayerNetID: public nNetObject, public eAccessLevelHolder{
 
219
    friend class ePlayer;
 
220
    friend class eTeam;
 
221
    friend class eNetGameObject;
 
222
    friend class tControlledPTR< ePlayerNetID >;
 
223
    // access level. lower numeric values are better.
 
224
public:
 
225
    typedef std::set< eTeam * > eTeamSet;
 
226
private:
 
227
 
 
228
    int listID;                          // ID in the list of all players
 
229
    int teamListID;                      // ID in the list of the team
 
230
 
231
231
    bool                                                        silenced_;                  // flag indicating whether the player has been silenced
232
 
 
 
232
 
233
233
    int                             roundsSuspended_;   // number of rounds the player is currently suspended from playing
234
234
    bool                            suspended_;         // flag indicating whether the player has been suspended
235
 
    tString                         suspendReason_;     // what was the reason for suspending this person...?
236
 
 
237
 
    nTimeAbsolute                   timeCreated_;   // the time the player was created
238
 
    nTimeAbsolute                                       timeJoinedTeam; // the time the player joined the team he is in now
239
 
    tCONTROLLED_PTR(eTeam)                      nextTeam;               // the team we're in ( logically )
240
 
    tCONTROLLED_PTR(eTeam)                      currentTeam;    // the team we currently are spawned for
241
 
    eTeamSet                        invitations_;   // teams this player is invited to
242
 
 
243
 
    tCHECKED_PTR(eNetGameObject) object; // the object this player is
244
 
    // controlling
245
 
 
246
 
    int score; // points made so far
247
 
    int lastScore_; // last saved score
248
 
 
249
 
    int favoriteNumberOfPlayersPerTeam;         // join team if number of players on it is less than this; create new team otherwise
250
 
    bool nameTeamAfterMe;                                       // player prefers to call his team after his name
251
 
    bool greeted;                                               // did the server already greet him?
252
 
    bool disconnected;                                          // did he disconnect from the game?
253
 
 
254
 
    static void SwapPlayersNo(int a,int b); // swaps the players a and b
255
 
 
256
 
    ePlayerNetID& operator= (const ePlayerNetID&); // forbid copy constructor
257
 
 
258
 
    bool                        spectating_; //!< are we currently spectating? Spectators don't get assigned to teams.
259
 
    bool                        stealth_; //!< does this player want to hide his/her identity?
260
 
    bool                        chatting_;   //!< are we currently chatting?
261
 
    int                         chatFlags_;  //!< different types of reasons for beeing chatting
262
 
    bool                        allowTeamChange_; //!< allow team changes even if ALLOW_TEAM_CHANGE is disabled?
263
 
 
264
 
    //For improved remoteadmin
265
 
    tAccessLevel     lastAccessLevel;//!< access level at the time of the last name update
266
 
 
267
 
    eUncannyTimingDetector uncannyTimingDetector_; //!< detector for timingbots
268
 
 
269
 
    nMachine *      registeredMachine_; //!< the machine the player is registered with
270
 
    void RegisterWithMachine();         //!< registers with a machine
271
 
    void UnregisterWithMachine();       //!< un registers with a machine
272
 
 
273
 
    tJUST_CONTROLLED_PTR< ePlayerNetID > substitute; // the player who will replace this one next round
274
 
 
275
 
public:
276
 
    bool SetSubstitute(ePlayerNetID *p); //!< set substitute for this player
277
 
    bool ApplySubstitution();            //!< perform substitution ie remove this player from the game and replace him by his substitute at the same position
278
 
    static void ClearSubstitutes();      //!< remove all substitutes
279
 
    static void ApplySubstitutions();    //!< perform substitutions for all players
280
 
 
281
 
    enum                        ChatFlags
282
 
    {
283
 
        ChatFlags_Chat = 1,
284
 
        ChatFlags_Away = 2,
285
 
        ChatFlags_Menu = 4,
286
 
        ChatFlags_Console = 8
287
 
    };
288
 
 
289
 
    bool flagOverrideChat;
290
 
    bool flagChatState;
291
 
 
292
 
    int    pID;
 
235
    tString                         suspendReason_;     // what was the reason for suspending this person...?
 
236
 
 
237
    nTimeAbsolute                   timeCreated_;   // the time the player was created
 
238
    nTimeAbsolute                                       timeJoinedTeam; // the time the player joined the team he is in now
 
239
    tCONTROLLED_PTR(eTeam)                      nextTeam;               // the team we're in ( logically )
 
240
    tCONTROLLED_PTR(eTeam)                      currentTeam;    // the team we currently are spawned for
 
241
    eTeamSet                        invitations_;   // teams this player is invited to
 
242
 
 
243
    tCHECKED_PTR(eNetGameObject) object; // the object this player is
 
244
    // controlling
 
245
 
 
246
    int score; // points made so far
 
247
    int lastScore_; // last saved score
 
248
 
 
249
    int favoriteNumberOfPlayersPerTeam;         // join team if number of players on it is less than this; create new team otherwise
 
250
    bool nameTeamAfterMe;                                       // player prefers to call his team after his name
 
251
    bool greeted;                                               // did the server already greet him?
 
252
    bool disconnected;                                          // did he disconnect from the game?
 
253
 
 
254
    static void SwapPlayersNo(int a,int b); // swaps the players a and b
 
255
 
 
256
    ePlayerNetID& operator= (const ePlayerNetID&); // forbid copy constructor
 
257
 
 
258
    bool                        spectating_; //!< are we currently spectating? Spectators don't get assigned to teams.
 
259
    bool                        stealth_; //!< does this player want to hide his/her identity?
 
260
    bool                        chatting_;   //!< are we currently chatting?
 
261
    int                         chatFlags_;  //!< different types of reasons for beeing chatting
 
262
    bool                        allowTeamChange_; //!< allow team changes even if ALLOW_TEAM_CHANGE is disabled?
 
263
 
 
264
    //For improved remoteadmin
 
265
    tAccessLevel     lastAccessLevel;//!< access level at the time of the last name update
 
266
 
 
267
    eUncannyTimingDetector uncannyTimingDetector_; //!< detector for timingbots
 
268
 
 
269
    nMachine *      registeredMachine_; //!< the machine the player is registered with
 
270
    void RegisterWithMachine();         //!< registers with a machine
 
271
    void UnregisterWithMachine();       //!< un registers with a machine
 
272
 
 
273
    tJUST_CONTROLLED_PTR< ePlayerNetID > substitute; // the player who will replace this one next round
 
274
 
 
275
public:
 
276
    bool SetSubstitute(ePlayerNetID *p); //!< set substitute for this player
 
277
    bool ApplySubstitution();            //!< perform substitution ie remove this player from the game and replace him by his substitute at the same position
 
278
    static void ClearSubstitutes();      //!< remove all substitutes
 
279
    static void ApplySubstitutions();    //!< perform substitutions for all players
 
280
 
 
281
    enum                        ChatFlags
 
282
    {
 
283
        ChatFlags_Chat = 1,
 
284
        ChatFlags_Away = 2,
 
285
        ChatFlags_Menu = 4,
 
286
        ChatFlags_Console = 8
 
287
    };
 
288
 
 
289
    bool flagOverrideChat;
 
290
    bool flagChatState;
 
291
 
 
292
    int    pID;
293
293
    // REAL     rubberstatus;
294
 
    tString teamname;
295
 
    tArray<tString> lastSaid;
296
 
    tArray<nTimeRolling> lastSaidTimes;
297
 
    //  void SetLastSaid(tString ls);
298
 
    unsigned short r,g,b; // our color
299
 
 
300
 
    unsigned short pingCharity; // max ping you are willing to take over
301
 
 
302
 
    REAL ping;
303
 
 
304
 
    double lastSync;         //!< time of the last sync request
305
 
    double lastActivity_;    //!< time of the last activity
306
 
 
307
 
    bool loginWanted;        //!< flag indicating whether this player currently wants to log on
308
 
 
309
 
    bool renameAllowed_;     //!< specifies if the player is allowed to rename or not, does not know about votes.
310
 
 
311
 
    nSpamProtection & GetChatSpam();       //!< chat volume spam
312
 
    eChatLastSaid & GetLastSaid();         //!< last said information
313
 
    eShuffleSpamTester & GetShuffleSpam(); //!< shuffle message spam
314
 
 
315
 
    ePlayerNetID(int p=-1);
316
 
    ePlayerNetID(nMessage &m);
317
 
    virtual ~ePlayerNetID();
318
 
 
319
 
    virtual bool ActionOnQuit();
320
 
    virtual void ActionOnDelete();
321
 
 
322
 
    // chatting
323
 
    bool IsChatting() const { return chatting_; }
324
 
    void SetChatting ( ChatFlags flag, bool chatting );
325
 
 
326
 
    // spectating
327
 
    bool IsSpectating() const { return spectating_; }
328
 
 
329
 
    bool StealthMode() const { return stealth_; }
330
 
 
331
 
    // team management
332
 
    bool TeamChangeAllowed( bool informPlayer = false ) const; //!< is this player allowed to change teams?
333
 
    void SetTeamChangeAllowed(bool allowed) {allowTeamChange_ = allowed;} //!< set if this player should always be allowed to change teams
334
 
    eTeam *NextTeam()    const { return nextTeam; }                             // return the team I will be next round
335
 
    eTeam *CurrentTeam() const { return currentTeam; }          // return the team I am in
336
 
    int  TeamListID() const { return teamListID; }              // return my position in the team
337
 
    int  ListID() const { return listID; }              // return my position in the player's list
338
 
    void SetShuffleWish( int pos );                      //!< sets a desired team position
339
 
 
 
294
    tString teamname;
 
295
    tArray<tString> lastSaid;
 
296
    tArray<nTimeRolling> lastSaidTimes;
 
297
    //  void SetLastSaid(tString ls);
 
298
    unsigned short r,g,b; // our color
 
299
 
 
300
    unsigned short pingCharity; // max ping you are willing to take over
 
301
 
 
302
    REAL ping;
 
303
 
 
304
    double lastSync;         //!< time of the last sync request
 
305
    double lastActivity_;    //!< time of the last activity
 
306
 
 
307
    bool loginWanted;        //!< flag indicating whether this player currently wants to log on
 
308
 
 
309
    bool renameAllowed_;     //!< specifies if the player is allowed to rename or not, does not know about votes.
 
310
 
 
311
    nSpamProtection & GetChatSpam();       //!< chat volume spam
 
312
    eChatLastSaid & GetLastSaid();         //!< last said information
 
313
    eShuffleSpamTester & GetShuffleSpam(); //!< shuffle message spam
 
314
 
 
315
    ePlayerNetID(int p=-1);
 
316
    ePlayerNetID(nMessage &m);
 
317
    virtual ~ePlayerNetID();
 
318
 
 
319
    virtual bool ActionOnQuit();
 
320
    virtual void ActionOnDelete();
 
321
 
 
322
    // chatting
 
323
    bool IsChatting() const { return chatting_; }
 
324
    void SetChatting ( ChatFlags flag, bool chatting );
 
325
 
 
326
    // spectating
 
327
    bool IsSpectating() const { return spectating_; }
 
328
 
 
329
    bool StealthMode() const { return stealth_; }
 
330
 
 
331
    // team management
 
332
    bool TeamChangeAllowed( bool informPlayer = false ) const; //!< is this player allowed to change teams?
 
333
    void SetTeamChangeAllowed(bool allowed) {allowTeamChange_ = allowed;} //!< set if this player should always be allowed to change teams
 
334
    eTeam *NextTeam()    const { return nextTeam; }                             // return the team I will be next round
 
335
    eTeam *CurrentTeam() const { return currentTeam; }          // return the team I am in
 
336
    int  TeamListID() const { return teamListID; }              // return my position in the team
 
337
    int  ListID() const { return listID; }              // return my position in the player's list
 
338
    void SetShuffleWish( int pos );                      //!< sets a desired team position
 
339
 
340
340
    eTeam * FindDefaultTeam();                                   // find a good default team for us
341
341
    void SetDefaultTeam();                                              // register me in a good default team
342
342
    void SetTeamForce(eTeam* team );            // register me in the given team without checks
343
 
    void SetTeam(eTeam* team);                  // register me in the given team (callable on the server)
 
343
    void SetTeam(eTeam* team);                  // register me in the given team (callable on the server)
344
344
    void SetTeamWish(eTeam* team);                              // express the wish to be part of the given team (always callable)
345
 
    void SetTeamname(const char *);             // set teamname to be used for my own team
346
 
    void UpdateTeamForce();                                             // update team membership without checks
347
 
    void UpdateTeam();                                                  // update team membership
348
 
 
349
 
    eTeamSet const & GetInvitations() const ;   //!< teams this player is invited to
350
 
 
351
 
    void CreateNewTeam();                                       // create a new team and join it (on the server)
352
 
    void CreateNewTeamWish();                                   // express the wish to create a new team and join it
353
 
    virtual void ReceiveControlNet(nMessage &m);// receive the team control wish
354
 
 
355
 
    static bool Enemies( ePlayerNetID const * a, ePlayerNetID const * b ); //!< determines whether two players are opponents and can score points against each other
356
 
 
357
 
    // print out an understandable name in to s
358
 
    virtual void                        PrintName(tString &s) const;
359
 
 
360
 
    virtual bool                        AcceptClientSync() const;
361
 
    virtual void                        WriteSync(nMessage &m);
362
 
    virtual void                        ReadSync(nMessage &m);
363
 
    virtual nDescriptor&        CreatorDescriptor() const;
364
 
    virtual void                        InitAfterCreation();
365
 
    virtual bool                        ClearToTransmit(int user) const;
366
 
 
367
 
    virtual void                        NewObject(){}                                   // called when we control a new object
368
 
    virtual void                        RightBeforeDeath(int triesLeft){}       // is called right before the vehicle gets destroyed.
369
 
 
370
 
 
371
 
    void RemoveFromGame();
372
 
    void ControlObject(eNetGameObject *c);
 
345
    void SetTeamname(const char *);             // set teamname to be used for my own team
 
346
    void UpdateTeamForce();                                             // update team membership without checks
 
347
    void UpdateTeam();                                                  // update team membership
 
348
 
 
349
    eTeamSet const & GetInvitations() const ;   //!< teams this player is invited to
 
350
 
 
351
    void CreateNewTeam();                                       // create a new team and join it (on the server)
 
352
    void CreateNewTeamWish();                                   // express the wish to create a new team and join it
 
353
    virtual void ReceiveControlNet(nMessage &m);// receive the team control wish
 
354
 
 
355
    static bool Enemies( ePlayerNetID const * a, ePlayerNetID const * b ); //!< determines whether two players are opponents and can score points against each other
 
356
 
 
357
    // print out an understandable name in to s
 
358
    virtual void                        PrintName(tString &s) const;
 
359
 
 
360
    virtual bool                        AcceptClientSync() const;
 
361
    virtual void                        WriteSync(nMessage &m);
 
362
    virtual void                        ReadSync(nMessage &m);
 
363
    virtual nDescriptor&        CreatorDescriptor() const;
 
364
    virtual void                        InitAfterCreation();
 
365
    virtual bool                        ClearToTransmit(int user) const;
 
366
 
 
367
    virtual void                        NewObject(){}                                   // called when we control a new object
 
368
    virtual void                        RightBeforeDeath(int triesLeft){}       // is called right before the vehicle gets destroyed.
 
369
 
 
370
 
 
371
    void RemoveFromGame();
 
372
    void ControlObject(eNetGameObject *c);
373
373
    void ClearObject();
374
 
    void ClearRespawn();
375
 
 
376
 
    void Greet();
377
 
 
378
 
    // suspend the player from playing, forcing him to spectate
379
 
    void Suspend( int rounds = 5, tString reason = tString(""));
380
 
#ifdef KRAWALL_SERVER
381
 
    void Authenticate( tString const & authName,
382
 
                       tAccessLevel accessLevel = tAccessLevel_Authenticated,
383
 
                       ePlayerNetID const * admin = 0 );    //!< make the authentification valid
384
 
    void DeAuthenticate( ePlayerNetID const * admin = 0 );  //!< make the authentification invalid
385
 
    bool IsAuthenticated() const;                     //!< is the authentification valid?
386
 
#endif
387
 
 
388
 
    static void RequestScheduledLogins();  //!< initiates login processes for all pending wishes
389
 
 
390
 
    bool IsActive() const { return !disconnected; }
391
 
 
392
 
    bool IsSilenced( void ) const { return silenced_; }
393
 
    void SetSilenced( bool silenced ) { silenced_ = silenced; }
394
 
    bool& AccessSilenced( void ) { return silenced_; }
395
 
 
 
374
    void ClearRespawn();
 
375
 
 
376
    void Greet();
 
377
 
 
378
    // suspend the player from playing, forcing him to spectate
 
379
    void Suspend( int rounds = 5, tString reason = tString(""));
 
380
#ifdef KRAWALL_SERVER
 
381
    void Authenticate( tString const & authName, 
 
382
                       tAccessLevel accessLevel = tAccessLevel_Authenticated,
 
383
                       ePlayerNetID const * admin = 0,
 
384
                       bool messages = true );    //!< make the authentification valid
 
385
    void DeAuthenticate( ePlayerNetID const * admin = 0 );  //!< make the authentification invalid
 
386
    bool IsAuthenticated() const;                     //!< is the authentification valid?
 
387
#endif
 
388
 
 
389
    static void RequestScheduledLogins();  //!< initiates login processes for all pending wishes
 
390
 
 
391
    bool IsActive() const { return !disconnected; }
 
392
 
 
393
    bool IsSilenced( void ) const { return silenced_; }
 
394
    void SetSilenced( bool silenced ) { silenced_ = silenced; }
 
395
    bool& AccessSilenced( void ) { return silenced_; }
 
396
 
396
397
    bool IsSuspended ( void ) { return suspended_; }
397
398
    bool IsSuspended ( void ) const { return suspended_; }
398
399
    int RoundsSuspended() { return roundsSuspended_; }
399
400
    int RoundsSuspended() const { return roundsSuspended_; }
400
 
    tString ReasonSuspended() { return suspendReason_; }
401
 
 
402
 
    static void SilenceMenu();                          // menu where you can silence players
403
 
    static void PoliceMenu();                           // menu where you can silence and kick players
404
 
 
405
 
    virtual bool IsHuman() const { return true; }
406
 
 
407
 
    void Activity(); // call it if this player just showed some activity.
408
 
    REAL LastActivity() const; //!< returns how long the last activity of this player was ago
409
 
 
410
 
    eNetGameObject *Object() const;
411
 
 
412
 
    //void SetRubber(ePlayerNetID *player, REAL rubber);
413
 
    void AddScore(int points, const tOutput& reasonwin, const tOutput& reasonlose, bool shouldPrint=true);
414
 
    int Score()const {return score;}
415
 
    int TotalScore() const;
416
 
    static void ResetScoreDifferences(); //<! Resets the last stored score so ScoreDifferences takes this as a reference time
417
 
    static void LogScoreDifferences();   //<! Logs accumulated scores of all players since the last call to ResetScoreDifferences() to ladderlog.txt
418
 
    static void UpdateSuspensions();     //<! Decrements the number of rounds players are suspended for
419
 
    static void UpdateShuffleSpamTesters();    //<! Reset shuffle spam checks
420
 
    void LogScoreDifference();           //<! Logs accumulated scores since the last call to ResetScoreDifferences() to ladderlog.txt
421
 
    static void LogMatchScores();         //<! Logs match scores of all players to ladderlog.txt
422
 
 
423
 
    void AnalyzeTiming( REAL timing );   //<! analzye a timing event for timebot detection
424
 
 
425
 
    static void SortByScore(); // brings the players into the right order
426
 
    static tString Ranking( int MAX=12, bool cut = true );     // returns a ranking list
427
 
    static void RankingLadderLog();     // writes a small ranking list to ladderlog
 
401
    tString ReasonSuspended() { return suspendReason_; }
 
402
 
 
403
    static void SilenceMenu();                          // menu where you can silence players
 
404
    static void PoliceMenu();                           // menu where you can silence and kick players
 
405
 
 
406
    virtual bool IsHuman() const { return true; }
 
407
 
 
408
    void Activity(); // call it if this player just showed some activity.
 
409
    REAL LastActivity() const; //!< returns how long the last activity of this player was ago
 
410
 
 
411
    eNetGameObject *Object() const;
 
412
 
 
413
    //void SetRubber(ePlayerNetID *player, REAL rubber);
 
414
    void AddScore(int points, const tOutput& reasonwin, const tOutput& reasonlose, bool shouldPrint=true);
 
415
    int Score()const {return score;}
 
416
    int TotalScore() const;
 
417
    static void ResetScoreDifferences(); //<! Resets the last stored score so ScoreDifferences takes this as a reference time
 
418
    static void LogScoreDifferences();   //<! Logs accumulated scores of all players since the last call to ResetScoreDifferences() to ladderlog.txt
 
419
    static void UpdateSuspensions();     //<! Decrements the number of rounds players are suspended for
 
420
    static void UpdateShuffleSpamTesters();    //<! Reset shuffle spam checks
 
421
    void LogScoreDifference();           //<! Logs accumulated scores since the last call to ResetScoreDifferences() to ladderlog.txt
 
422
    static void LogMatchScores();         //<! Logs match scores of all players to ladderlog.txt
 
423
 
 
424
    void AnalyzeTiming( REAL timing );   //<! analzye a timing event for timebot detection
 
425
 
 
426
    static void SortByScore(); // brings the players into the right order
 
427
    static tString Ranking( int MAX=12, bool cut = true );     // returns a ranking list
 
428
    static void RankingLadderLog();     // writes a small ranking list to ladderlog
428
429
    static void GridPosLadderLog();     // writes a cycle positions to ladderlog
429
 
    static void OnlineStatsLadderLog(); //  writes the online players, teams and the numbers
430
 
    static void  ResetScore();  // resets the ranking list
431
 
 
432
 
    static void DisplayScores(); // display scores on the screen
433
 
 
434
 
    void GreetHighscores(tString &s); // tell him his positions in the
 
430
    static void OnlineStatsLadderLog(); //  writes the online players, teams and the numbers
 
431
    static void  ResetScore();  // resets the ranking list
 
432
 
 
433
    static void DisplayScores(); // display scores on the screen
 
434
 
 
435
    void GreetHighscores(tString &s); // tell him his positions in the
435
436
    // highscore lists (defined in game.cpp)
436
437
 
437
 
    static ePlayerNetID * ReadPlayer( std::istream & s ); //!< reads a player from the stream
438
 
 
439
 
    static void Update();           // creates ePlayerNetIDs for new players
440
 
    // and destroys those of players that have left
441
 
 
442
 
#ifdef KRAWALL_SERVER
443
 
    static tAccessLevel AccessLevelRequiredToPlay(); // is authentication required to play on this server?
444
 
#endif
445
 
 
446
 
    static bool WaitToLeaveChat(); //!< waits for players to leave chat state. Returns true if the caller should wait to proceed with whatever he wants to do.
447
 
 
448
 
    static void RemoveChatbots(); //!< removes chatbots and idling players from the game
449
 
 
450
 
    static void CompleteRebuild(); // same as above, but rebuilds every ePlayerNetID.
451
 
    static void ClearAll(); // deletes all ePlayerNetIDs.
452
 
    static void SpectateAll( bool spectate=true ); // puts all players into spectator mode.
453
 
 
454
 
    static void ThrowOutDisconnected(); // get rid of everyone that disconnected from the game
455
 
 
456
 
    void GetScoreFromDisconnectedCopy(); // get the player's data from the previous login
457
 
 
458
 
    void Chat(const tString &s);
459
 
 
460
 
    nTimeAbsolute GetTimeCreated() const { return timeCreated_; }
461
 
 
462
 
    virtual void Color( REAL&r, REAL&g, REAL&b ) const;
463
 
    virtual void TrailColor( REAL&r, REAL&g, REAL&b ) const;
464
 
 
465
 
    //Remote Admin add-ins...
466
 
    bool IsLoggedIn() const { return GetAccessLevel() < tAccessLevel_Moderator; }
467
 
    void BeLoggedIn() { SetAccessLevel( tAccessLevel_Admin ); }
468
 
    void BeNotLoggedIn() { SetAccessLevel( tAccessLevel_Program ); }
 
438
    static ePlayerNetID * ReadPlayer( std::istream & s ); //!< reads a player from the stream
 
439
 
 
440
    static void Update();           // creates ePlayerNetIDs for new players
 
441
    // and destroys those of players that have left
 
442
 
 
443
#ifdef KRAWALL_SERVER
 
444
    static tAccessLevel AccessLevelRequiredToPlay(); // is authentication required to play on this server?
 
445
#endif
 
446
 
 
447
    static bool WaitToLeaveChat(); //!< waits for players to leave chat state. Returns true if the caller should wait to proceed with whatever he wants to do.
 
448
 
 
449
    static void RemoveChatbots(); //!< removes chatbots and idling players from the game
 
450
 
 
451
    static void CompleteRebuild(); // same as above, but rebuilds every ePlayerNetID.
 
452
    static void ClearAll(); // deletes all ePlayerNetIDs.
 
453
    static void SpectateAll( bool spectate=true ); // puts all players into spectator mode.
 
454
 
 
455
    static void ThrowOutDisconnected(); // get rid of everyone that disconnected from the game
 
456
 
 
457
    void GetScoreFromDisconnectedCopy(); // get the player's data from the previous login
 
458
 
 
459
    void Chat(const tString &s);
 
460
 
 
461
    nTimeAbsolute GetTimeCreated() const { return timeCreated_; }
 
462
 
 
463
    virtual void Color( REAL&r, REAL&g, REAL&b ) const;
 
464
    virtual void TrailColor( REAL&r, REAL&g, REAL&b ) const;
 
465
 
 
466
    //Remote Admin add-ins...
 
467
    bool IsLoggedIn() const { return GetAccessLevel() < tAccessLevel_Moderator; }
 
468
    void BeLoggedIn() { SetAccessLevel( tAccessLevel_Admin ); }
 
469
    void BeNotLoggedIn() { SetAccessLevel( tAccessLevel_Program ); }
469
470
    tAccessLevel GetLastAccessLevel() const { return lastAccessLevel; }
470
471
 
471
472
    //Login Checker
472
473
    bool HasLoggedIn() { return hasLoggedIn_; }
473
 
    void SetLoggedIn(bool newValue) { hasLoggedIn_ = newValue; }
474
 
 
 
474
    void SetLoggedIn(bool newValue) { hasLoggedIn_ = newValue; }
 
475
 
475
476
    void DropFlag();
476
 
    void PassFlag(std::istream &s);
477
 
 
 
477
    void PassFlag(std::istream &s);
 
478
 
478
479
    static ePlayerNetID * FindPlayerByName( tString const & name, ePlayerNetID * requester = 0, bool print=true ); //!< finds a player by name using lax name matching. Reports errors to the console or to the requesting player.
479
 
    static ePlayerNetID * FindPlayerById(int owner_id);
480
 
 
481
 
    void UpdateName();                                           //!< update the player name from either the client's wishes, either the admin's wishes.
482
 
    static void FilterName( tString const & in, tString & out ); //!< filters a name (removes unprintables, color codes and spaces)
483
 
    static tString FilterName( tString const & in );             //!< filters a name (removes unprintables, color codes and spaces)
484
 
    bool IsAllowedToRename ( void );                             //!< tells if the user can rename or not, takes care about everything
 
480
    static ePlayerNetID * FindPlayerById(int owner_id);
 
481
 
 
482
    void UpdateName();                                           //!< update the player name from either the client's wishes, either the admin's wishes.
 
483
    static void FilterName( tString const & in, tString & out ); //!< filters a name (removes unprintables, color codes and spaces)
 
484
    static tString FilterName( tString const & in );             //!< filters a name (removes unprintables, color codes and spaces)
 
485
    bool IsAllowedToRename ( void );                             //!< tells if the user can rename or not, takes care about everything
485
486
    void AllowRename( bool allow );                              //!< Allows a player to rename (or not)
486
 
 
 
487
 
487
488
    static bool HasRenameCapability ( ePlayerNetID const *, ePlayerNetID const * admin ); //!< Checks if the admin can use the RENAME command. Used in IsAllowedToRename()
488
489
 
489
 
    void LogActivity(int activity_type);    //!< Log the activity of the player currently in motion
490
 
 
491
 
private:
492
 
    tColoredString  nameFromClient_;        //!< this player's name as the client wants it to be. Avoid using it when possilbe.
493
 
    tColoredString  nameFromServer_;        //!< this player's name as the server wants it to be. Avoid using it when possilbe.
494
 
    tColoredString  nameFromAdmin_;         //!< this player's name as the admin wants it to be. Avoid using it when possilbe.
495
 
    tColoredString  coloredName_;           //!< this player's name, cleared by the server. Use this for onscreen screen display.
496
 
    tString         name_;                  //!< this player's name without colors.
497
 
    tString         userName_;              //!< this player's name, cleared for system logs. Use for writing to files or comparing with admin input.
498
 
 
499
 
#ifdef KRAWALL_SERVER
500
 
    tString         rawAuthenticatedName_;  //!< the raw authenticated name in user@authority form.
 
490
    void LogActivity(int activity_type);    //!< Log the activity of the player currently in motion
 
491
 
 
492
private:
 
493
    tColoredString  nameFromClient_;        //!< this player's name as the client wants it to be. Avoid using it when possilbe.
 
494
    tColoredString  nameFromServer_;        //!< this player's name as the server wants it to be. Avoid using it when possilbe.
 
495
    tColoredString  nameFromAdmin_;         //!< this player's name as the admin wants it to be. Avoid using it when possilbe.
 
496
    tColoredString  coloredName_;           //!< this player's name, cleared by the server. Use this for onscreen screen display.
 
497
    tString         name_;                  //!< this player's name without colors.
 
498
    tString         userName_;              //!< this player's name, cleared for system logs. Use for writing to files or comparing with admin input.
 
499
 
 
500
#ifdef KRAWALL_SERVER
 
501
    tString         rawAuthenticatedName_;  //!< the raw authenticated name in user@authority form.
501
502
#endif
502
503
    //! Race Hack
503
504
    tString         authenticatedname;
504
505
 
505
 
    bool            hasLoggedIn_;
506
 
 
507
 
    REAL            wait_;                  //!< time in seconds WaitToLeaveChat() will wait for this player
508
 
 
509
 
    void CreateVoter();                                         // create our voter or find it
510
 
    void                        MyInitAfterCreation();
511
 
 
512
 
protected:
513
 
    virtual nMachine & DoGetMachine() const;  //!< returns the machine this object belongs to
514
 
 
515
 
    // private:
516
 
    //  virtual void AddRef();
517
 
    //  virtual void Release();
518
 
 
519
 
    // accessors
520
 
public:
521
 
    inline tColoredString const & GetNameFromClient( void ) const;      //!< Gets this player's name as the client wants it to be. Avoid using it when possilbe.
522
 
    inline ePlayerNetID const & GetNameFromClient( tColoredString & nameFromClient ) const;     //!< Gets this player's name as the client wants it to be. Avoid using it when possilbe.
523
 
    inline tColoredString const & GetColoredName( void ) const; //!< Gets this player's name, cleared by the server. Use this for onscreen screen display.
524
 
    inline ePlayerNetID const & GetColoredName( tColoredString & coloredName ) const;   //!< Gets this player's name, cleared by the server. Use this for onscreen screen display.
525
 
    inline tString const & GetName( void ) const;       //!< Gets this player's name without colors.
526
 
    inline ePlayerNetID const & GetName( tString & name ) const;        //!< Gets this player's name without colors.
527
 
 
528
 
    inline tString const & GetUserName( void ) const;   //!< Gets this player's full name. Use for writing to files or comparing with admin input.
529
 
    inline ePlayerNetID const & GetUserName( tString & userName ) const;        //!< Gets this player's name, cleared for system logs. Use for writing to files or comparing with admin input.
530
 
 
531
 
    tString const & GetLogName( void ) const{ return GetUserName(); }   //!< Gets this player's name, cleared for system logs (with escaped special characters). Use for writing to files.
532
 
    tString GetFilteredAuthenticatedName( void ) const; //!< Gets the filtered, ecaped authentication name
533
 
#ifdef KRAWALL_SERVER
534
 
    tString const & GetRawAuthenticatedName( void ) const{ return rawAuthenticatedName_; }      //!< Gets the raw, unescaped authentication name
535
 
    void SetRawAuthenticatedName( tString const & name ){ if ( !IsAuthenticated()) rawAuthenticatedName_ = name; }      //!< Sets the raw, unescaped authentication name
 
506
    bool            hasLoggedIn_;
 
507
 
 
508
    REAL            wait_;                  //!< time in seconds WaitToLeaveChat() will wait for this player
 
509
 
 
510
    void CreateVoter();                                         // create our voter or find it
 
511
    void                        MyInitAfterCreation();
 
512
 
 
513
protected:
 
514
    virtual nMachine & DoGetMachine() const;  //!< returns the machine this object belongs to
 
515
 
 
516
    // private:
 
517
    //  virtual void AddRef();
 
518
    //  virtual void Release();
 
519
 
 
520
    // accessors
 
521
public:
 
522
    inline tColoredString const & GetNameFromClient( void ) const;      //!< Gets this player's name as the client wants it to be. Avoid using it when possilbe.
 
523
    inline ePlayerNetID const & GetNameFromClient( tColoredString & nameFromClient ) const;     //!< Gets this player's name as the client wants it to be. Avoid using it when possilbe.
 
524
    inline tColoredString const & GetColoredName( void ) const; //!< Gets this player's name, cleared by the server. Use this for onscreen screen display.
 
525
    inline ePlayerNetID const & GetColoredName( tColoredString & coloredName ) const;   //!< Gets this player's name, cleared by the server. Use this for onscreen screen display.
 
526
    inline tString const & GetName( void ) const;       //!< Gets this player's name without colors.
 
527
    inline ePlayerNetID const & GetName( tString & name ) const;        //!< Gets this player's name without colors.
 
528
 
 
529
    inline tString const & GetUserName( void ) const;   //!< Gets this player's full name. Use for writing to files or comparing with admin input.
 
530
    inline ePlayerNetID const & GetUserName( tString & userName ) const;        //!< Gets this player's name, cleared for system logs. Use for writing to files or comparing with admin input.
 
531
 
 
532
    tString const & GetLogName( void ) const{ return GetUserName(); }   //!< Gets this player's name, cleared for system logs (with escaped special characters). Use for writing to files.
 
533
    tString GetFilteredAuthenticatedName( void ) const; //!< Gets the filtered, ecaped authentication name
 
534
#ifdef KRAWALL_SERVER
 
535
    tString const & GetRawAuthenticatedName( void ) const{ return rawAuthenticatedName_; }      //!< Gets the raw, unescaped authentication name
 
536
    void SetRawAuthenticatedName( tString const & name ){ if ( !IsAuthenticated()) rawAuthenticatedName_ = name; }      //!< Sets the raw, unescaped authentication name
536
537
#endif
537
538
 
538
539
    //! Race Hack
539
540
    tString const & GetAuthenticatedName() const { return authenticatedname; }
540
 
    void SetAuthenticatedName(tString name)      { authenticatedname = name; }
541
 
 
542
 
    ePlayerNetID & SetName( tString const & name ); //!< Sets this player's name. Sets processed names (colored, username, nameFromCLient) as well.
543
 
    ePlayerNetID & SetName( char    const * name ); //!< Sets this player's name. Sets processed names (colored, username, nameFromCLient) as well.
544
 
    ePlayerNetID & SetName( tString const & name , bool force ); //!< Sets this player's name. Sets processed names (colored, username, nameFromCLient) as well.
545
 
    ePlayerNetID & ForceName( tString const & name ); //!< Forces this player's name. Forces processed names (colored, username, nameFromCLient) as well.
546
 
 
547
 
    inline ePlayerNetID & SetUserName( tString const & userName );  //!< Sets this player's name, cleared for system logs. Use for writing to files or comparing with admin input. The other names stay unaffected.
548
 
 
549
 
private:
550
 
    inline ePlayerNetID & SetNameFromClient( tColoredString const & nameFromClient );   //!< Sets this player's name as the client wants it to be. Avoid using it when possilbe.
551
 
    inline ePlayerNetID & SetColoredName( tColoredString const & coloredName ); //!< Sets this player's name, cleared by the server. Use this for onscreen screen display.
552
 
};
553
 
 
554
 
extern tList<ePlayerNetID> se_PlayerNetIDs;
555
 
extern int    sr_viewportBelongsToPlayer[MAX_VIEWPORTS];
556
 
 
557
 
void se_ChatState( ePlayerNetID::ChatFlags flag, bool cs);
558
 
 
559
 
void se_SaveToScoreFile( tOutput const & out );  //!< writes something to scorelog.txt
 
541
    void SetAuthenticatedName(tString name)      { authenticatedname = name; }
 
542
 
 
543
    ePlayerNetID & SetName( tString const & name ); //!< Sets this player's name. Sets processed names (colored, username, nameFromCLient) as well.
 
544
    ePlayerNetID & SetName( char    const * name ); //!< Sets this player's name. Sets processed names (colored, username, nameFromCLient) as well.
 
545
    ePlayerNetID & SetName( tString const & name , bool force ); //!< Sets this player's name. Sets processed names (colored, username, nameFromCLient) as well.
 
546
    ePlayerNetID & ForceName( tString const & name ); //!< Forces this player's name. Forces processed names (colored, username, nameFromCLient) as well.
 
547
 
 
548
    inline ePlayerNetID & SetUserName( tString const & userName );  //!< Sets this player's name, cleared for system logs. Use for writing to files or comparing with admin input. The other names stay unaffected.
 
549
 
 
550
private:
 
551
    inline ePlayerNetID & SetNameFromClient( tColoredString const & nameFromClient );   //!< Sets this player's name as the client wants it to be. Avoid using it when possilbe.
 
552
    inline ePlayerNetID & SetColoredName( tColoredString const & coloredName ); //!< Sets this player's name, cleared by the server. Use this for onscreen screen display.
 
553
};
 
554
 
 
555
extern tList<ePlayerNetID> se_PlayerNetIDs;
 
556
extern int    sr_viewportBelongsToPlayer[MAX_VIEWPORTS];
 
557
 
 
558
void se_ChatState( ePlayerNetID::ChatFlags flag, bool cs);
 
559
 
 
560
void se_SaveToScoreFile( tOutput const & out );  //!< writes something to scorelog.txt
560
561
void se_SaveToChatLog( tOutput const & out );  //!< writes something to chatlog.txt (if enabled) and/or ladderlog
561
562
void se_SaveToLadderLog( tOutput const & out );  //!< writes something to ladderlog.txt
562
 
void se_SaveToChatLogC( tOutput const &out ); //!< writes something to chatlog_color.txt
563
 
 
564
 
//! create a global instance of this to write stuff to ladderlog.txt
565
 
class eLadderLogWriter {
566
 
    static std::list<eLadderLogWriter *> &writers();
567
 
    tString id;
568
 
    bool enabled;
569
 
    tSettingItem<bool> *conf;
570
 
    tColoredString cache;
571
 
public:
572
 
    eLadderLogWriter(char const *ID, bool enabledByDefault);
573
 
    ~eLadderLogWriter();
574
 
    //! append a field to the current message. Spaces are added automatically.
575
 
    template<typename T> eLadderLogWriter &operator<<(T const &s) {
576
 
        if(enabled) {
577
 
            cache << ' ' << s;
578
 
        }
579
 
        return *this;
580
 
    }
581
 
    void write(); //!< send to ladderlog and clear message
582
 
 
583
 
    bool isEnabled() { return enabled; } //!< check this if you're going to make expensive calculations for ladderlog output
584
 
 
585
 
    static void setAll(bool enabled); //!< enable or disable all writers
 
563
void se_SaveToChatLogC( tOutput const &out ); //!< writes something to chatlog_color.txt
 
564
 
 
565
//! create a global instance of this to write stuff to ladderlog.txt
 
566
class eLadderLogWriter {
 
567
    static std::list<eLadderLogWriter *> &writers();
 
568
    tString id;
 
569
    bool enabled;
 
570
    tSettingItem<bool> *conf;
 
571
    tColoredString cache;
 
572
public:
 
573
    eLadderLogWriter(char const *ID, bool enabledByDefault);
 
574
    ~eLadderLogWriter();
 
575
    //! append a field to the current message. Spaces are added automatically.
 
576
    template<typename T> eLadderLogWriter &operator<<(T const &s) {
 
577
        if(enabled) {
 
578
            cache << ' ' << s;
 
579
        }
 
580
        return *this;
 
581
    }
 
582
    void write(); //!< send to ladderlog and clear message
 
583
 
 
584
    bool isEnabled() { return enabled; } //!< check this if you're going to make expensive calculations for ladderlog output
 
585
 
 
586
    static void setAll(bool enabled); //!< enable or disable all writers
586
587
};
587
588
 
588
589
enum
594
595
    ACTIVITY_JOINED_GAME_FROM_SPECTATOR,
595
596
    ACTIVITY_FINISHED_RACE,
596
597
    ACTIVITY_DIED
597
 
};
598
 
 
599
 
tColoredString & operator << (tColoredString &s,const ePlayer &p);
600
 
tColoredString & operator << (tColoredString &s,const ePlayerNetID &p);
601
 
 
602
 
extern int pingCharity;
603
 
 
604
 
void se_AutoShowScores(); // show scores based on automated decision
605
 
void se_UserShowScores(bool show); // show scores based on user input
606
 
void se_SetShowScoresAuto(bool a); // disable/enable auto show scores
607
 
 
608
 
//Password stuff
609
 
void se_DeletePasswords();
610
 
extern int se_PasswordStorageMode; // 0: store in memory, -1: don't store, 1: store on file
611
 
 
612
 
tOutput& operator << (tOutput& o, const ePlayerNetID& p);
613
 
 
614
 
// greeting callback
615
 
class eCallbackGreeting: public tCallbackString
616
 
{
617
 
    static tCallbackString *anchor;
618
 
    static ePlayerNetID* greeted;
619
 
 
620
 
public:
621
 
    static tString Greet(ePlayerNetID* player);
622
 
    static ePlayerNetID* Greeted(){return greeted;}
623
 
 
624
 
    eCallbackGreeting(STRINGRETFUNC* f);
625
 
};
626
 
 
627
 
void ForceName ( std::istream & s );
628
 
 
629
 
// ******************************************************************************************
630
 
// *
631
 
// *    GetNameFromClient
632
 
// *
633
 
// ******************************************************************************************
634
 
//!
635
 
//!             @return         this player's name as the client wants it to be. Avoid using it when possilbe.
636
 
//!
637
 
// ******************************************************************************************
638
 
 
639
 
tColoredString const & ePlayerNetID::GetNameFromClient( void ) const
640
 
{
641
 
    return this->nameFromClient_;
642
 
}
643
 
 
644
 
// ******************************************************************************************
645
 
// *
646
 
// *    GetNameFromClient
647
 
// *
648
 
// ******************************************************************************************
649
 
//!
650
 
//!             @param  nameFromClient  this player's name as the client wants it to be. Avoid using it when possilbe. to fill
651
 
//!             @return         A reference to this to allow chaining
652
 
//!
653
 
// ******************************************************************************************
654
 
 
655
 
ePlayerNetID const & ePlayerNetID::GetNameFromClient( tColoredString & nameFromClient ) const
656
 
{
657
 
    nameFromClient = this->nameFromClient_;
658
 
    return *this;
659
 
}
660
 
 
661
 
// ******************************************************************************************
662
 
// *
663
 
// *    SetNameFromClient
664
 
// *
665
 
// ******************************************************************************************
666
 
//!
667
 
//!             @param  nameFromClient  this player's name as the client wants it to be. Avoid using it when possilbe. to set
668
 
//!             @return         A reference to this to allow chaining
669
 
//!
670
 
// ******************************************************************************************
671
 
 
672
 
ePlayerNetID & ePlayerNetID::SetNameFromClient( tColoredString const & nameFromClient )
673
 
{
674
 
    this->nameFromClient_ = nameFromClient;
675
 
    return *this;
676
 
}
677
 
 
678
 
// ******************************************************************************************
679
 
// *
680
 
// *    GetColoredName
681
 
// *
682
 
// ******************************************************************************************
683
 
//!
684
 
//!             @return         this player's name, cleared by the server. Use this for onscreen screen display.
685
 
//!
686
 
// ******************************************************************************************
687
 
 
688
 
tColoredString const & ePlayerNetID::GetColoredName( void ) const
689
 
{
690
 
    return this->coloredName_;
691
 
}
692
 
 
693
 
// ******************************************************************************************
694
 
// *
695
 
// *    GetColoredName
696
 
// *
697
 
// ******************************************************************************************
698
 
//!
699
 
//!             @param  coloredName     this player's name, cleared by the server. Use this for onscreen screen display. to fill
700
 
//!             @return         A reference to this to allow chaining
701
 
//!
702
 
// ******************************************************************************************
703
 
 
704
 
ePlayerNetID const & ePlayerNetID::GetColoredName( tColoredString & coloredName ) const
705
 
{
706
 
    coloredName = this->coloredName_;
707
 
    return *this;
708
 
}
709
 
 
710
 
// ******************************************************************************************
711
 
// *
712
 
// *    SetColoredName
713
 
// *
714
 
// ******************************************************************************************
715
 
//!
716
 
//!             @param  coloredName     this player's name, cleared by the server. Use this for onscreen screen display. to set
717
 
//!             @return         A reference to this to allow chaining
718
 
//!
719
 
// ******************************************************************************************
720
 
 
721
 
ePlayerNetID & ePlayerNetID::SetColoredName( tColoredString const & coloredName )
722
 
{
723
 
    this->coloredName_ = coloredName;
724
 
    return *this;
725
 
}
726
 
 
727
 
// ******************************************************************************************
728
 
// *
729
 
// *    GetName
730
 
// *
731
 
// ******************************************************************************************
732
 
//!
733
 
//!             @return         this player's name without colors.
734
 
//!
735
 
// ******************************************************************************************
736
 
 
737
 
tString const & ePlayerNetID::GetName( void ) const
738
 
{
739
 
    return this->name_;
740
 
}
741
 
 
742
 
// ******************************************************************************************
743
 
// *
744
 
// *    GetName
745
 
// *
746
 
// ******************************************************************************************
747
 
//!
748
 
//!             @param  name    this player's name without colors. to fill
749
 
//!             @return         A reference to this to allow chaining
750
 
//!
751
 
// ******************************************************************************************
752
 
 
753
 
ePlayerNetID const & ePlayerNetID::GetName( tString & name ) const
754
 
{
755
 
    name = this->name_;
756
 
    return *this;
757
 
}
758
 
 
759
 
// ******************************************************************************************
760
 
// *
761
 
// *    GetUserName
762
 
// *
763
 
// ******************************************************************************************
764
 
//!
765
 
//!             @return         this player's name, cleared for system logs. Use for writing to files or comparing with admin input.
766
 
//!
767
 
// ******************************************************************************************
768
 
 
769
 
tString const & ePlayerNetID::GetUserName( void ) const
770
 
{
771
 
    return this->userName_;
772
 
}
773
 
 
774
 
// ******************************************************************************************
775
 
// *
776
 
// *    GetUserName
777
 
// *
778
 
// ******************************************************************************************
779
 
//!
780
 
//!             @param  userName        this player's name, cleared for system logs. Use for writing to files or comparing with admin input. to fill
781
 
//!             @return         A reference to this to allow chaining
782
 
//!
783
 
// ******************************************************************************************
784
 
 
785
 
ePlayerNetID const & ePlayerNetID::GetUserName( tString & userName ) const
786
 
{
787
 
    userName = this->userName_;
788
 
    return *this;
789
 
}
790
 
 
791
 
// ******************************************************************************************
792
 
// *
793
 
// *    SetUserName
794
 
// *
795
 
// ******************************************************************************************
796
 
//!
797
 
//!             @param  userName        this player's name, cleared for system logs. Use for writing to files or comparing with admin input. to set
798
 
//!             @return         A reference to this to allow chaining
799
 
//!
800
 
// ******************************************************************************************
801
 
 
802
 
ePlayerNetID & ePlayerNetID::SetUserName( tString const & userName )
803
 
{
804
 
    this->userName_ = userName;
805
 
    return *this;
 
598
};
 
599
 
 
600
tColoredString & operator << (tColoredString &s,const ePlayer &p);
 
601
tColoredString & operator << (tColoredString &s,const ePlayerNetID &p);
 
602
 
 
603
extern int pingCharity;
 
604
 
 
605
void se_AutoShowScores(); // show scores based on automated decision
 
606
void se_UserShowScores(bool show); // show scores based on user input
 
607
void se_SetShowScoresAuto(bool a); // disable/enable auto show scores
 
608
 
 
609
//Password stuff
 
610
void se_DeletePasswords();
 
611
extern int se_PasswordStorageMode; // 0: store in memory, -1: don't store, 1: store on file
 
612
 
 
613
tOutput& operator << (tOutput& o, const ePlayerNetID& p);
 
614
 
 
615
// greeting callback
 
616
class eCallbackGreeting: public tCallbackString
 
617
{
 
618
    static tCallbackString *anchor;
 
619
    static ePlayerNetID* greeted;
 
620
 
 
621
public:
 
622
    static tString Greet(ePlayerNetID* player);
 
623
    static ePlayerNetID* Greeted(){return greeted;}
 
624
 
 
625
    eCallbackGreeting(STRINGRETFUNC* f);
 
626
};
 
627
 
 
628
void ForceName ( std::istream & s );
 
629
 
 
630
// ******************************************************************************************
 
631
// *
 
632
// *    GetNameFromClient
 
633
// *
 
634
// ******************************************************************************************
 
635
//!
 
636
//!             @return         this player's name as the client wants it to be. Avoid using it when possilbe.
 
637
//!
 
638
// ******************************************************************************************
 
639
 
 
640
tColoredString const & ePlayerNetID::GetNameFromClient( void ) const
 
641
{
 
642
    return this->nameFromClient_;
 
643
}
 
644
 
 
645
// ******************************************************************************************
 
646
// *
 
647
// *    GetNameFromClient
 
648
// *
 
649
// ******************************************************************************************
 
650
//!
 
651
//!             @param  nameFromClient  this player's name as the client wants it to be. Avoid using it when possilbe. to fill
 
652
//!             @return         A reference to this to allow chaining
 
653
//!
 
654
// ******************************************************************************************
 
655
 
 
656
ePlayerNetID const & ePlayerNetID::GetNameFromClient( tColoredString & nameFromClient ) const
 
657
{
 
658
    nameFromClient = this->nameFromClient_;
 
659
    return *this;
 
660
}
 
661
 
 
662
// ******************************************************************************************
 
663
// *
 
664
// *    SetNameFromClient
 
665
// *
 
666
// ******************************************************************************************
 
667
//!
 
668
//!             @param  nameFromClient  this player's name as the client wants it to be. Avoid using it when possilbe. to set
 
669
//!             @return         A reference to this to allow chaining
 
670
//!
 
671
// ******************************************************************************************
 
672
 
 
673
ePlayerNetID & ePlayerNetID::SetNameFromClient( tColoredString const & nameFromClient )
 
674
{
 
675
    this->nameFromClient_ = nameFromClient;
 
676
    return *this;
 
677
}
 
678
 
 
679
// ******************************************************************************************
 
680
// *
 
681
// *    GetColoredName
 
682
// *
 
683
// ******************************************************************************************
 
684
//!
 
685
//!             @return         this player's name, cleared by the server. Use this for onscreen screen display.
 
686
//!
 
687
// ******************************************************************************************
 
688
 
 
689
tColoredString const & ePlayerNetID::GetColoredName( void ) const
 
690
{
 
691
    return this->coloredName_;
 
692
}
 
693
 
 
694
// ******************************************************************************************
 
695
// *
 
696
// *    GetColoredName
 
697
// *
 
698
// ******************************************************************************************
 
699
//!
 
700
//!             @param  coloredName     this player's name, cleared by the server. Use this for onscreen screen display. to fill
 
701
//!             @return         A reference to this to allow chaining
 
702
//!
 
703
// ******************************************************************************************
 
704
 
 
705
ePlayerNetID const & ePlayerNetID::GetColoredName( tColoredString & coloredName ) const
 
706
{
 
707
    coloredName = this->coloredName_;
 
708
    return *this;
 
709
}
 
710
 
 
711
// ******************************************************************************************
 
712
// *
 
713
// *    SetColoredName
 
714
// *
 
715
// ******************************************************************************************
 
716
//!
 
717
//!             @param  coloredName     this player's name, cleared by the server. Use this for onscreen screen display. to set
 
718
//!             @return         A reference to this to allow chaining
 
719
//!
 
720
// ******************************************************************************************
 
721
 
 
722
ePlayerNetID & ePlayerNetID::SetColoredName( tColoredString const & coloredName )
 
723
{
 
724
    this->coloredName_ = coloredName;
 
725
    return *this;
 
726
}
 
727
 
 
728
// ******************************************************************************************
 
729
// *
 
730
// *    GetName
 
731
// *
 
732
// ******************************************************************************************
 
733
//!
 
734
//!             @return         this player's name without colors.
 
735
//!
 
736
// ******************************************************************************************
 
737
 
 
738
tString const & ePlayerNetID::GetName( void ) const
 
739
{
 
740
    return this->name_;
 
741
}
 
742
 
 
743
// ******************************************************************************************
 
744
// *
 
745
// *    GetName
 
746
// *
 
747
// ******************************************************************************************
 
748
//!
 
749
//!             @param  name    this player's name without colors. to fill
 
750
//!             @return         A reference to this to allow chaining
 
751
//!
 
752
// ******************************************************************************************
 
753
 
 
754
ePlayerNetID const & ePlayerNetID::GetName( tString & name ) const
 
755
{
 
756
    name = this->name_;
 
757
    return *this;
 
758
}
 
759
 
 
760
// ******************************************************************************************
 
761
// *
 
762
// *    GetUserName
 
763
// *
 
764
// ******************************************************************************************
 
765
//!
 
766
//!             @return         this player's name, cleared for system logs. Use for writing to files or comparing with admin input.
 
767
//!
 
768
// ******************************************************************************************
 
769
 
 
770
tString const & ePlayerNetID::GetUserName( void ) const
 
771
{
 
772
    return this->userName_;
 
773
}
 
774
 
 
775
// ******************************************************************************************
 
776
// *
 
777
// *    GetUserName
 
778
// *
 
779
// ******************************************************************************************
 
780
//!
 
781
//!             @param  userName        this player's name, cleared for system logs. Use for writing to files or comparing with admin input. to fill
 
782
//!             @return         A reference to this to allow chaining
 
783
//!
 
784
// ******************************************************************************************
 
785
 
 
786
ePlayerNetID const & ePlayerNetID::GetUserName( tString & userName ) const
 
787
{
 
788
    userName = this->userName_;
 
789
    return *this;
 
790
}
 
791
 
 
792
// ******************************************************************************************
 
793
// *
 
794
// *    SetUserName
 
795
// *
 
796
// ******************************************************************************************
 
797
//!
 
798
//!             @param  userName        this player's name, cleared for system logs. Use for writing to files or comparing with admin input. to set
 
799
//!             @return         A reference to this to allow chaining
 
800
//!
 
801
// ******************************************************************************************
 
802
 
 
803
ePlayerNetID & ePlayerNetID::SetUserName( tString const & userName )
 
804
{
 
805
    this->userName_ = userName;
 
806
    return *this;
806
807
}
807
808
 
808
809
ePlayerNetID *se_GetLocalPlayer();
809
 
extern bool se_highlightMyName, se_tabCompletion, se_tabCompletionWithColors;
810
 
 
811
 
#endif
812
 
 
 
810
extern bool se_highlightMyName, se_tabCompletion, se_tabCompletionWithColors;
 
811
 
 
812
#endif
 
813