src/proto2/NetworkServer.cc
author terom
Mon, 24 Nov 2008 17:14:29 +0000
changeset 96 4a801210096c
parent 89 825c4613e087
child 107 505bfa531496
permissions -rw-r--r--
fix movement physics+network code to some degree, jumping is now buggy?
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
     7
NetworkServer::NetworkServer (GameState &state, const NetworkAddress &listen_addr) : 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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)
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    21
    NetworkServerPlayer *player = new NetworkServerPlayer(*this, node);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    22
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    23
    // add to players
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
}
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    29
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    34
    // remove from list
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
        
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    38
NetworkServerPlayer::NetworkServerPlayer (NetworkServer &server, NetworkNode *node) : 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    45
    slots.connect(node->sig_disconnected(), this, &NetworkServerPlayer::on_disconnected);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    49
    NetworkPacket hello_pkt;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    50
    hello_pkt.write_vector(position);
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    51
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    55
    for (std::list<NetworkServerPlayer*>::iterator it = server.players.begin(); it != server.players.end(); it++) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    56
        NetworkServerPlayer *player = *it;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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);
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    61
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    62
        player_pkt.write_vector(player->position);
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    63
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    67
    // broadcast NETMSG_PLAYER_JOIN to all clients except current
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    71
void NetworkServerPlayer::on_disconnected (void) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    72
    NetworkPacket pkt;
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    73
    
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    74
    Engine::log(INFO, "server_player.disconnected") << "node=" << node << ", obj=" << obj;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    75
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    76
    // remove from server
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    77
    server.handle_disconnect(this);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    78
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    79
    // tell other clients
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    82
    // free
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
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
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
    86
void NetworkServerPlayer::on_move (NetworkNode *src, NetworkPacket &pkt) {
96
4a801210096c fix movement physics+network code to some degree, jumping is now buggy?
terom
parents: 89
diff changeset
    87
    // sanity-check, other players shouldn't move
4a801210096c fix movement physics+network code to some degree, jumping is now buggy?
terom
parents: 89
diff changeset
    88
    if (src != node) {
4a801210096c fix movement physics+network code to some degree, jumping is now buggy?
terom
parents: 89
diff changeset
    89
        Engine::log(WARN, "server_player.on_move") << "packet from wrong src=" << src << ", node=" << node;
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    90
        return;
96
4a801210096c fix movement physics+network code to some degree, jumping is now buggy?
terom
parents: 89
diff changeset
    91
    }
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    92
    
96
4a801210096c fix movement physics+network code to some degree, jumping is now buggy?
terom
parents: 89
diff changeset
    93
    PlayerInput_Move input = pkt.read_uint16();
23
8d802b573cf0 fixed more network code, there's actually a high probability of it working now
terom
parents: 22
diff changeset
    94
96
4a801210096c fix movement physics+network code to some degree, jumping is now buggy?
terom
parents: 89
diff changeset
    95
    Engine::log(INFO, "server_player.on_move") << "player=" << obj << ", old_pos=" << position << ", input=" << input;
66
1415a2d45686 working simple network-physics code
terom
parents: 60
diff changeset
    96
    
96
4a801210096c fix movement physics+network code to some degree, jumping is now buggy?
terom
parents: 89
diff changeset
    97
    // apply input
4a801210096c fix movement physics+network code to some degree, jumping is now buggy?
terom
parents: 89
diff changeset
    98
    handleMove(input);  
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
    99
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
   100
    // send position update
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
   101
    send_position_update();
22
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
   102
}
24
b81cb670e6b2 the great :retab
terom
parents: 23
diff changeset
   103
        
22
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
   104
void NetworkServerPlayer::send_position_update (void) {
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
   105
    NetworkPacket pkt;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
   106
    pkt.write_vector(position);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
   107
    pkt.write_vector(velocity);
22
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
   108
66
1415a2d45686 working simple network-physics code
terom
parents: 60
diff changeset
   109
    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
   110
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents: 66
diff changeset
   111
    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
   112
}
b70d30e1b0fe all the network code is now there, although it doesn't quite work
terom
parents: 21
diff changeset
   113