~armagetronad-dev/armagetronad/armagetronad-old-glancing

« back to all changes in this revision

Viewing changes to src/engine/ePlayer.cpp

Merge with 0.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
86
86
    return s << tColoredString::ColorString(p.rgb[0]/15.0,
87
87
                                            p.rgb[1]/15.0,
88
88
                                            p.rgb[2]/15.0)
89
 
           << p.Name();
 
89
           << p.Name() << "0xRESETT";
90
90
}
91
91
 
92
92
tColoredString & operator << (tColoredString &s,const ePlayerNetID &p){
93
 
    return s << p.GetColoredName();
 
93
    return s << p.GetColoredName() << "0xRESETT";
94
94
}
95
95
 
96
96
std::ostream & operator << (std::ostream &s,const ePlayerNetID &p){
97
 
    return s << p.GetColoredName();
 
97
    return s << p.GetColoredName() << "0xRESETT";
98
98
}
99
99
 
100
100
eAccessLevelHolder::eAccessLevelHolder()
3381
3381
    se_ListTeams( p );
3382
3382
}
3383
3383
 
 
3384
static void se_ListInvites( ePlayerNetID *receiver )
 
3385
{
 
3386
    tString out;
 
3387
    out << tOutput( "$invites_header" ) << '\n';
 
3388
    for ( int i = eTeam::teams.Len() - 1; i >= 0; --i )
 
3389
    {
 
3390
        eTeam *team = eTeam::teams[ i ];
 
3391
        std::vector< const ePlayerNetID * > invites = team->InterestingInvitedPlayers();
 
3392
        if ( !invites.empty() )
 
3393
            out << *team << ": " << invites << '\n';
 
3394
    }
 
3395
    sn_ConsoleOut( out, receiver ? receiver->Owner() : 0 );
 
3396
}
 
3397
 
 
3398
static void ListInvitesFunc( std::istream & s )
 
3399
{
 
3400
    if ( se_NeedsServer( "INVITES", s ) )
 
3401
        return;
 
3402
    se_ListInvites( 0 );
 
3403
}
 
3404
 
 
3405
static tConfItemFunc listInvitesConfFunc( "INVITES", &ListInvitesFunc );
 
3406
 
3384
3407
void se_ListPastChatters(ePlayerNetID * receiver);
3385
3408
 
3386
3409
static void se_ListPlayers( ePlayerNetID * receiver, std::istream &s, tString command )
3991
4014
                        se_Ready( p );
3992
4015
                        return;
3993
4016
                    }
 
4017
                    else if ( command == "/invites" )
 
4018
                    {
 
4019
                        spam.lastSaidType_ = eChatMessageType_Command;
 
4020
                        se_ListInvites( p );
 
4021
                        return;
 
4022
                    }
3994
4023
                    else if (command == "/help") {
3995
4024
                        spam.lastSaidType_ = eChatMessageType_Command;
3996
4025
                        se_Help( p, p, s );
4748
4777
    }
4749
4778
}
4750
4779
 
4751
 
ePlayerNetID::ePlayerNetID(int p):nNetObject(),listID(-1), teamListID(-1), timeCreated_( tSysTimeFloat() ), allowTeamChange_(false), registeredMachine_(0), pID(p), ready(false)
 
4780
ePlayerNetID::ePlayerNetID(int p):nNetObject(),listID(-1), teamListID(-1), timeCreated_( tSysTimeFloat() ), invitations_(), invitationsChanged_( false ), allowTeamChange_(false), registeredMachine_(0), pID(p), ready(false)
4752
4781
{
4753
4782
    // default access level
4754
4783
    lastAccessLevel = tAccessLevel_Default;
5067
5096
{
5068
5097
    this->CreateVoter();
5069
5098
 
5070
 
    // reset spam timer
5071
 
    GetChatSpam().ResetTime();
5072
 
 
5073
5099
    this->silenced_ = se_silenceDefault;
5074
5100
    this->renameAllowed_ = true;
5075
5101
 
5077
5103
    if ( Owner() != 0 && sn_GetNetState() == nSERVER )
5078
5104
    {
5079
5105
        this->RegisterWithMachine();
 
5106
 
 
5107
        // reset spam timer
 
5108
        GetChatSpam().ResetTime();
 
5109
 
5080
5110
        if ( se_maxPlayersPerIP < nMachine::GetMachine(Owner()).GetPlayerCount() )
5081
5111
        {
5082
5112
            // kill them
6108
6138
    sync.set_team_name( teamname );
6109
6139
 
6110
6140
    sync.set_ready( ready );
 
6141
 
 
6142
    if ( sn_GetNetState() == nSERVER && ( invitationsChanged_ || ( init && invitations_.size() > 0 ) ) )
 
6143
    {
 
6144
        sync.set_invitations_changed( true );
 
6145
        for ( eTeamSet::const_iterator it = invitations_.begin(); it != invitations_.end(); ++it )
 
6146
        {
 
6147
            sync.add_invitation_team_ids( PointerToID( *it ) );
 
6148
        }
 
6149
        invitationsChanged_ = false;
 
6150
    }
6111
6151
}
6112
6152
 
6113
6153
// makes sure the passed string is not longer than the given maximum
6433
6473
    {
6434
6474
        teamname = sync.team_name();
6435
6475
    }
 
6476
 
 
6477
    if ( sn_GetNetState() != nSERVER && sync.has_invitations_changed() && sync.invitations_changed() )
 
6478
    {
 
6479
        invitations_.clear();
 
6480
        for ( int i = 0; i < sync.invitation_team_ids_size(); i++ )
 
6481
        {
 
6482
            eTeam *team = NULL;
 
6483
            IDToPointer( sync.invitation_team_ids( i ), team );
 
6484
            if ( team )
 
6485
            {
 
6486
                invitations_.insert( team );
 
6487
            }
 
6488
        }
 
6489
    }
6436
6490
    // con << "Player info updated.\n";
6437
6491
 
6438
6492
    // make sure we did not accidentally overwrite values
6470
6524
//! creates a netobject form sync data
6471
6525
ePlayerNetID::ePlayerNetID( Engine::PlayerNetIDSync const & sync, nSenderInfo const & sender )
6472
6526
: nNetObject( sync.base(), sender ),listID(-1), teamListID(-1), timeCreated_( tSysTimeFloat() )
6473
 
 , allowTeamChange_(false), registeredMachine_(0)
 
6527
 , invitations_(), invitationsChanged_( false ), allowTeamChange_(false), registeredMachine_(0)
6474
6528
{
6475
6529
    // default access level
6476
6530
    lastAccessLevel = tAccessLevel_Default;
6791
6845
#endif
6792
6846
}
6793
6847
 
 
6848
static tString se_GetScoreTableTeamDescription( const ePlayerNetID *player )
 
6849
{
 
6850
    tString out;
 
6851
    const ePlayerNetID::eTeamSet & invites = player->GetInvitations();
 
6852
    if ( player->CurrentTeam() )
 
6853
    {
 
6854
        out << *player->CurrentTeam();
 
6855
    }
 
6856
    else if ( !invites.empty() )
 
6857
    {
 
6858
        tString invitedTeam;
 
6859
        invitedTeam << **invites.begin();
 
6860
        if ( invites.size() > 1 )
 
6861
            invitedTeam << ", ...";
 
6862
        out << tOutput( "$player_scoretable_can_join", invitedTeam );
 
6863
    }
 
6864
    return out;
 
6865
}
6794
6866
 
6795
6867
tString ePlayerNetID::Ranking( int MAX, bool cut ){
6796
6868
    SortByScore();
6941
7013
                tColoredString ping;
6942
7014
                ping << int(p->ping*1000);
6943
7015
                DisplayText(.25, y, .06, ping.c_str(), sr_fontScoretable, 1);
6944
 
                if ( p->currentTeam )
 
7016
                tString team = se_GetScoreTableTeamDescription( p );
 
7017
                if ( !team.empty() )
6945
7018
                {
6946
 
                    tColoredString team;
6947
 
                    eTeam *t = p->currentTeam;
6948
 
                    team << tColoredStringProxy(t->R()/15.f, t->G()/15.f, t->B()/15.f) << t->Name();
6949
7019
                    DisplayText(.3, y, .06, team.c_str(), sr_fontScoretable, -1);
6950
7020
                }
6951
7021
            }
8052
8122
    }
8053
8123
}
8054
8124
 
 
8125
void ePlayerNetID::AddInvitation( eTeam *team )
 
8126
{
 
8127
    std::pair< eTeamSet::iterator, bool > result = invitations_.insert( team );
 
8128
    if ( result.second )
 
8129
    {
 
8130
        invitationsChanged_ = true;
 
8131
        RequestSync();
 
8132
    }
 
8133
}
 
8134
 
 
8135
bool ePlayerNetID::RemoveInvitation( eTeam *team )
 
8136
{
 
8137
    bool wasInvited = invitations_.erase( team ) > 0;
 
8138
    if ( wasInvited )
 
8139
    {
 
8140
        invitationsChanged_ = true;
 
8141
        RequestSync();
 
8142
    }
 
8143
    return wasInvited;
 
8144
}
 
8145
 
8055
8146
// teams this player is invited to
8056
8147
ePlayerNetID::eTeamSet const & ePlayerNetID::GetInvitations() const
8057
8148
{