src/proto2/NetworkServer.cc
author terom
Thu, 20 Nov 2008 19:25:56 +0000
branchno-netsession
changeset 36 785d220fc6b7
parent 35 e21cfda0edde
child 38 4189b8bf3a5b
permissions -rw-r--r--
...
5
617813994ab1 move proto/p2 -> src/proto2
terom
parents:
diff changeset
     1
#include "NetworkServer.hh"
22
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
     2
#include "Engine.hh"
23
8d802b573cf0 fixed more network code, there's actually a high probability of it working now
terom
parents: 22
diff changeset
     3
#include "Logger.hh"
5
617813994ab1 move proto/p2 -> src/proto2
terom
parents:
diff changeset
     4
14
22e3bfb6720d NetworkServer.cc finally works as intended
terom
parents: 13
diff changeset
     5
#include <cassert>
5
617813994ab1 move proto/p2 -> src/proto2
terom
parents:
diff changeset
     6
36
terom
parents: 35
diff changeset
     7
NetworkServer::NetworkServer (GameState &state, const NetworkAddress &listen_addr) : 
terom
parents: 35
diff changeset
     8
    NetworkCore(state), netsession(NETWORK_MAGIC_ID), netobjs(netsession, NETCHAN_CORE) {
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
     9
    
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    10
    // connect slots
36
terom
parents: 35
diff changeset
    11
    slots.connect(netsession.sig_node_connected(), this, &NetworkServer::on_node_connected);
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    12
    
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    13
    // and then we listen
36
terom
parents: 35
diff changeset
    14
    netsession.listen(listen_addr);
23
8d802b573cf0 fixed more network code, there's actually a high probability of it working now
terom
parents: 22
diff changeset
    15
36
terom
parents: 35
diff changeset
    16
    Engine::log(INFO, "server") << "running, listen_addr=" << listen_addr;
5
617813994ab1 move proto/p2 -> src/proto2
terom
parents:
diff changeset
    17
}
617813994ab1 move proto/p2 -> src/proto2
terom
parents:
diff changeset
    18
36
terom
parents: 35
diff changeset
    19
void NetworkServer::on_node_connected (NetworkNode *node) {
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    20
    // create the player object (it logs it)
36
terom
parents: 35
diff changeset
    21
    NetworkServerPlayer *player = new NetworkServerPlayer(*this, node);
terom
parents: 35
diff changeset
    22
terom
parents: 35
diff changeset
    23
    // add to players
terom
parents: 35
diff changeset
    24
    players.push_back(player);
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    25
    
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    26
    // add to GameState
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    27
    state.newRemotePlayer(player);
5
617813994ab1 move proto/p2 -> src/proto2
terom
parents:
diff changeset
    28
}
36
terom
parents: 35
diff changeset
    29
        
terom
parents: 35
diff changeset
    30
void NetworkServer::handle_disconnect (NetworkServerPlayer *player) {
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    31
    // remove from state
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    32
    state.removePlayer(player);
22
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
    33
36
terom
parents: 35
diff changeset
    34
    // remove from list
terom
parents: 35
diff changeset
    35
    players.remove(player);
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    36
}
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    37
        
36
terom
parents: 35
diff changeset
    38
NetworkServerPlayer::NetworkServerPlayer (NetworkServer &server, NetworkNode *node) : 
terom
parents: 35
diff changeset
    39
    RemotePlayer(server.state, Vector(PLAYER_INITIAL_X, PLAYER_INITIAL_Y), true), server(server), obj(server.netobjs), node(node) {
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    40
    
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    41
    // log
36
terom
parents: 35
diff changeset
    42
    Engine::log(INFO, "server_player.connected") << "node=" << node << ", obj=" << obj;
22
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
    43
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    44
    // messages
36
terom
parents: 35
diff changeset
    45
    slots.connect(node->sig_disconnected(), this, &NetworkServerPlayer::on_disconnected);
terom
parents: 35
diff changeset
    46
    slots.connect(obj.sig_message(NETMSG_CLIENT_MOVE), this, &NetworkServerPlayer::on_move);
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    47
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    48
    // the initial NETMSG_PLAYER_HELLO
36
terom
parents: 35
diff changeset
    49
    NetworkPacket hello_pkt;
terom
parents: 35
diff changeset
    50
    hello_pkt.write_vector(position);
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    51
36
terom
parents: 35
diff changeset
    52
    obj.send_to(node, NETMSG_SERVER_HELLO, hello_pkt, true);
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    53
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    54
    // send other player objects
36
terom
parents: 35
diff changeset
    55
    for (std::list<NetworkServerPlayer*>::iterator it = server.players.begin(); it != server.players.end(); it++) {
terom
parents: 35
diff changeset
    56
        NetworkServerPlayer *player = *it;
terom
parents: 35
diff changeset
    57
        NetworkPacket player_pkt;
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    58
        
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    59
        // player is not in players list yet
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    60
        assert(player != this);
36
terom
parents: 35
diff changeset
    61
        
terom
parents: 35
diff changeset
    62
        player_pkt.write_vector(player->position);
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    63
36
terom
parents: 35
diff changeset
    64
        player->obj.send_to(node, NETMSG_PLAYER_INFO, player_pkt, true);
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    65
    }
22
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
    66
36
terom
parents: 35
diff changeset
    67
    // broadcast NETMSG_PLAYER_JOIN to all clients except current
terom
parents: 35
diff changeset
    68
    obj.send_all_except(NETMSG_PLAYER_JOIN, hello_pkt, node, true);
5
617813994ab1 move proto/p2 -> src/proto2
terom
parents:
diff changeset
    69
}
617813994ab1 move proto/p2 -> src/proto2
terom
parents:
diff changeset
    70
36
terom
parents: 35
diff changeset
    71
void NetworkServerPlayer::on_disconnected (void) {
terom
parents: 35
diff changeset
    72
    NetworkPacket pkt;
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    73
    
36
terom
parents: 35
diff changeset
    74
    Engine::log(INFO, "server_player.disconnected") << "node=" << node << ", obj=" << obj;
terom
parents: 35
diff changeset
    75
    
terom
parents: 35
diff changeset
    76
    // remove from server
terom
parents: 35
diff changeset
    77
    server.handle_disconnect(this);
terom
parents: 35
diff changeset
    78
    
terom
parents: 35
diff changeset
    79
    // tell other clients
terom
parents: 35
diff changeset
    80
    obj.send_all(NETMSG_PLAYER_QUIT, pkt, true);
22
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
    81
36
terom
parents: 35
diff changeset
    82
    // free
terom
parents: 35
diff changeset
    83
    delete this;
22
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
    84
}
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
    85
36
terom
parents: 35
diff changeset
    86
void NetworkServerPlayer::on_move (NetworkNode *src, NetworkPacket &pkt) {
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    87
    // sanity-check
36
terom
parents: 35
diff changeset
    88
    if (src != node)
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    89
        return;
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    90
    
36
terom
parents: 35
diff changeset
    91
    Vector impulse_force = pkt.read_vector();
terom
parents: 35
diff changeset
    92
    uint16_t impulse_ms = pkt.read_uint16();
23
8d802b573cf0 fixed more network code, there's actually a high probability of it working now
terom
parents: 22
diff changeset
    93
36
terom
parents: 35
diff changeset
    94
    Engine::log(INFO, "server_player.on_move") << "player=" << obj << ", old_pos=" << position << ", impulse=" << impulse_force << "@" << impulse_ms << "ms";
35
e21cfda0edde Merge from at r31:36
terom
parents: 26
diff changeset
    95
    
e21cfda0edde Merge from at r31:36
terom
parents: 26
diff changeset
    96
    // apply force
e21cfda0edde Merge from at r31:36
terom
parents: 26
diff changeset
    97
    applyForce(impulse_force, impulse_ms);
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    98
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    99
    // send position update
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
   100
    send_position_update();
22
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
   101
}
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
   102
        
22
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
   103
void NetworkServerPlayer::send_position_update (void) {
36
terom
parents: 35
diff changeset
   104
    NetworkPacket pkt;
terom
parents: 35
diff changeset
   105
    pkt.write_vector(position);
terom
parents: 35
diff changeset
   106
    pkt.write_vector(velocity);
22
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
   107
35
e21cfda0edde Merge from at r31:36
terom
parents: 26
diff changeset
   108
    Engine::log(INFO, "server_player.send_position_update") << "obj=" << obj << " -> " << position << "+" << velocity;
23
8d802b573cf0 fixed more network code, there's actually a high probability of it working now
terom
parents: 22
diff changeset
   109
36
terom
parents: 35
diff changeset
   110
    obj.send_all(NETMSG_PLAYER_POSITION, pkt, false);
22
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
   111
}
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
   112