X-Git-Url: http://deadsoftware.ru/gitweb?p=netwar.git;a=blobdiff_plain;f=server.c;h=38c6790f9ba58a05819bd7f702ccd08baeb49e15;hp=ea28583e06de04a2ead618e666593f6e92e2dc22;hb=HEAD;hpb=c4b04d12861ae0eac6315b1c2170013422136f80 diff --git a/server.c b/server.c index ea28583..38c6790 100644 --- 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();