src/proto2/NetworkClient.cc
author terom
Tue, 18 Nov 2008 22:58:50 +0000
branchno-netsession
changeset 35 e21cfda0edde
parent 28 3da59a3bc92e
child 36 785d220fc6b7
permissions -rw-r--r--
Merge from at r31:36

#include "NetworkClient.hh"
#include "Engine.hh"
#include "Logger.hh"

#include <cassert>

NetworkClient::NetworkClient (GameState &state, const CL_IPAddress &connect_to) : 
    NetworkCore(state), server(netsession.connect(connect_to)) {
    
    // connect slots
    slots.connect(netobjs.sig_create_object(), this, &NetworkClient::on_create_object);

    // XXX: sig_disconnected
}

void NetworkClient::on_create_object (CL_NetObject_Client &obj, int msg_type, CL_NetPacket &pkt) {
    switch (msg_type) {
        case NETMSG_SERVER_HELLO:
            on_server_hello(obj, pkt);

            break;
        
        case NETMSG_PLAYER_INFO:
            on_player_info(obj, pkt);

            break;
        
        case NETMSG_PLAYER_JOIN:
            on_player_join(obj, pkt);

            break;

        default:
            Engine::log(WARN, "client.on_create_object") << "unknown msg_type=" << msg_type << " for obj=" << obj;
    }
}
        
void NetworkClient::on_server_hello (CL_NetObject_Client &obj, CL_NetPacket &pkt) {
    // read the packet
    Vector position = readVector(pkt);
    
    Engine::log(INFO, "client.on_server_hello") << "obj=" << obj << ", pos=" << position;

    // create the LocalPlayer object
    NetworkClientLocalPlayer *player = new NetworkClientLocalPlayer(*this, obj, position);

    // inform state
    state.newLocalPlayer(player);
}
        
void NetworkClient::on_player_info (CL_NetObject_Client &obj, CL_NetPacket &pkt) {
    // read the packet
    Vector position = readVector(pkt);
    
    Engine::log(INFO, "client.on_player_info") << "obj=" << obj << ", pos=" << position;

    // create the LocalPlayer object
    NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position);

    // inform state
    state.newRemotePlayer(player);

}
        
void NetworkClient::on_player_join (CL_NetObject_Client &obj, CL_NetPacket &pkt) {
    // read the packet
    Vector position = readVector(pkt);
    
    Engine::log(INFO, "client.on_player_join") << "obj=" << obj << ", pos=" << position;
    
    // create the RemotePlayer object
    NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, position);

    // inform state
    state.newRemotePlayer(player);
}
        
void NetworkClient::player_quit (NetworkClientRemotePlayer *player) {
    // inform state
    state.removePlayer(player);

    // delete
    // XXX: leak because deleting the slot while it's being called breaks ClanLib
    //  delete player;
}

NetworkClientLocalPlayer::NetworkClientLocalPlayer (NetworkClient &client, CL_NetObject_Client &obj, Vector position) :
    LocalPlayer(client.state, position, true), client(client), obj(obj) {
    
    // receive messages
    slots.connect(obj.sig_received_message(NETMSG_PLAYER_POSITION), this, &NetworkClientLocalPlayer::on_position);
}
        
void NetworkClientLocalPlayer::applyForce (Vector force, uint16_t dt) {
    // always send move, in all cases
    CL_NetPacket pkt;
    writeVector(pkt, force);
    pkt.output.write_uint16(dt);

    obj.send(NETMSG_CLIENT_MOVE, pkt, false);
    
    // do not handle locally
}
        
void NetworkClientLocalPlayer::on_position (CL_NetPacket &pkt) {
    Vector position = readVector(pkt);
    Vector velocity = readVector(pkt);

    Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", position=" << position << ", velocity=" << velocity;
    
    // just update... 
    updatePhysics(position, velocity);
}
        
NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, CL_NetObject_Client &obj, Vector position) :
    RemotePlayer(client.state, position, true), client(client), obj(obj) {
    
    // receive messages
    slots.connect(obj.sig_received_message(NETMSG_PLAYER_POSITION), this, &NetworkClientRemotePlayer::on_position);
    slots.connect(obj.sig_received_message(NETMSG_PLAYER_QUIT), this, &NetworkClientRemotePlayer::on_quit);
}

void NetworkClientRemotePlayer::on_position (CL_NetPacket &pkt) {
    Vector position = readVector(pkt);
    Vector velocity = readVector(pkt);

    Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", position=" << position << ", velocity=" << velocity;
    
    // just update... 
    updatePhysics(position, velocity);
}

void NetworkClientRemotePlayer::on_quit (CL_NetPacket &pkt) {
    // pkt is empty
    (void) pkt;

    Engine::log(INFO, "client_player.on_quit") << "obj=" << obj;

    client.player_quit(this);
}