DEADSOFTWARE

Изменены физические константы
[netwar.git] / server.c
index ea28583e06de04a2ead618e666593f6e92e2dc22..38c6790f9ba58a05819bd7f702ccd08baeb49e15 100644 (file)
--- a/server.c
+++ b/server.c
@@ -47,7 +47,16 @@ static void sv_sync_client(int id, bool full) {
 
        for(int i = 0; i < clientlimit; i++)
                if(full || g_player[i].updated)
-                       SendMessage(sock, client[id].address, sv_splr(i, g_player[i].live, g_player[i].x, g_player[i].y, g_player[i].r, g_player[i].vx, g_player[i].vy, g_player[i].vr));
+                       SendMessage(sock, client[id].address, sv_splr(i, g_player[i].live, g_player[i].x, g_player[i].y, g_player[i].r, g_player[i].vx, g_player[i].vy, g_player[i].vr, g_player[i].shoot));
+
+       for(int i = 0; i < MAX_BULLETS; i++)
+               if(full || g_bullet[i].updated)
+                       SendMessage(sock, client[id].address, sv_sbul(i, g_bullet[i].owner, g_bullet[i].live, g_bullet[i].x, g_bullet[i].y, g_bullet[i].vx, g_bullet[i].vy, g_bullet[i].tick));
+}
+
+static void sv_spawn_player(int id) {
+       assert(id >= 0);
+       g_player_set(id, true, randfm(), randfm(), randfm(), 0, 0, 0, PLAYER_SHOOT);
 }
 
 static void sv_kill_player(int id, bool send, const char * msg) {
@@ -58,7 +67,7 @@ static void sv_kill_player(int id, bool send, const char * msg) {
                SendMessage(sock, client[id].address, sv_kill(msg));
 
        client[id].connected = false;
-       g_player_set(id, false, 0, 0, 0, 0, 0, 0);
+       g_player_set(id, false, 0, 0, 0, 0, 0, 0, 0);
        SDL_Log("Player %s (%i) disconnected: %s", client[id].name, id, msg);
 }
 
@@ -66,60 +75,81 @@ static void sv_move_player(int id, ProtocolMessage m) {
        assert(id >= 0);
        assert(client[id].connected);
 
+       if(!g_player[id].live && m.cl.does.code.bits)
+               sv_spawn_player(id);
+
+       if(!g_player[id].live)
+               return;
+
        g_player_does(id, m.cl.does.code);
 }
 
-static void sv_register_player(IPaddress address, ProtocolMessage m) {
-       if(m.cl.info.version != PROTOCOL_VERSION)
-               SendMessage(sock, address, sv_kill("Uncompatible version"));
+static void sv_kill_address(IPaddress address, const char * msg) {
+       SDL_Log("sv_kill_address: %s", msg);
+       SendMessage(sock, address, sv_kill(msg));
+}
+
+static void sv_register_player(IPaddress address, ClInfo info) {
+       if(info.version != PROTOCOL_VERSION) {
+               sv_kill_address(address, "Uncompatible version");
+               return;
+       }
 
        int i = 0;
        while((i < clientlimit) && (client[i].connected))
                ++i;
 
-       int namesize = sizeof(m.cl.info.name);
        if(i >= clientlimit) {
-               SDL_Log("Too may clints, player %.*s disconnected", namesize, m.cl.info.name);
-               SendMessage(sock, address, sv_kill("Too many clients"));
+               sv_kill_address(address, "Too many clients");
                return;
        }
 
        client[i].connected = true;
        client[i].address   = address;
-       strncpy(client[i].name, (char*) m.cl.info.name, MAX_NAMESIZE);
+       strncpy(client[i].name, (char*) info.name, MAX_NAMESIZE);
        client[i].name[MAX_NAMESIZE - 1] = 0;
 
        SDL_Log("Player %s (%i) connected", client[i].name, i);
        SendMessage(sock, address, sv_info(name, i, clientlimit));
 
-       g_player_set(i, true, randfm(), randfm(), randfm(), 0, 0, 0);
+       sv_spawn_player(i);
        sv_sync_client(i, true);
 }
 
-static void sv_recv() {
-       IPaddress address;
-       ProtocolMessage m;
-       if(!RecvMessage(sock, &address, &m))
+static void sv_recv_ipmsg(IPaddress address, ProtocolMessage m) {
+       int id = sv_find_client(address);
+       if(id < 0 && m.type != CL_INFO)
                return;
 
        switch(m.type) {
-       case CL_INFO: sv_register_player(address, m); break;
-       case CL_KILL: sv_kill_player(sv_find_client(address), false, ""); break;
-       case CL_DOES: sv_move_player(sv_find_client(address), m); break;
-       default:      SDL_Log("invalid message %i", m.type);
+       case CL_INFO: sv_register_player(address, m.cl.info); break;
+       case CL_KILL: sv_kill_player(id, false, "");  break;
+       case CL_DOES: sv_move_player(id, m);          break;
+       default:      sv_kill_address(address, "Invalid message");
        }
 }
 
+static void sv_recv() {
+       IPaddress address;
+       ProtocolMessage m;
+       while(RecvMessage(sock, &address, &m))
+               sv_recv_ipmsg(address, m);
+}
+
 static void sv_send() {
        for(int i = 0; i < clientlimit; i++)
                if(client[i].connected)
                        sv_sync_client(i, false);
-       
+
        for(int i = 0; i < clientlimit; i++)
                g_player[i].updated = false;
+
+       for(int i = 0; i < MAX_BULLETS; i++)
+               g_bullet[i].updated = false;
 }
 
 void sv_start(uint16_t port) {
+       g_init(true);
        sock = OpenPort(port);
        lastTime = SDL_GetTicks();
        currTime = SDL_GetTicks();