diff --git a/server.c b/server.c
index ea28583e06de04a2ead618e666593f6e92e2dc22..38c6790f9ba58a05819bd7f702ccd08baeb49e15 100644 (file)
--- a/server.c
+++ b/server.c
for(int i = 0; i < clientlimit; i++)
if(full || g_player[i].updated)
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) {
}
static void sv_kill_player(int id, bool send, const char * msg) {
SendMessage(sock, client[id].address, sv_kill(msg));
client[id].connected = false;
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);
}
SDL_Log("Player %s (%i) disconnected: %s", client[id].name, id, msg);
}
assert(id >= 0);
assert(client[id].connected);
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);
}
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 i = 0;
while((i < clientlimit) && (client[i].connected))
++i;
- int namesize = sizeof(m.cl.info.name);
if(i >= clientlimit) {
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;
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));
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);
}
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) {
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);
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 < 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) {
}
void sv_start(uint16_t port) {
+ g_init(true);
sock = OpenPort(port);
lastTime = SDL_GetTicks();
currTime = SDL_GetTicks();
sock = OpenPort(port);
lastTime = SDL_GetTicks();
currTime = SDL_GetTicks();