X-Git-Url: http://royale.zerezo.com/git/?p=zeRace;a=blobdiff_plain;f=server.c;fp=server.c;h=c6da73074285dfe04e2ccaafcd39ec502029d662;hp=0000000000000000000000000000000000000000;hb=dde2df6289f6daf23ee1632560c4c89061ef2f4a;hpb=866e35b81c26169886388f7c93dce52f2a42809f diff --git a/server.c b/server.c new file mode 100644 index 0000000..c6da730 --- /dev/null +++ b/server.c @@ -0,0 +1,366 @@ +/* zeRace dedicated server */ + +#include +#include "network.h" +#include "car.h" +#include "tracklist.h" + +/* each client has his data */ +struct _clients +{ + char pseudo[MAXLINELENGTH]; + int connected; + int lasttime; + struct _car car; + IPaddress address; +} clients [MAX_CLIENTS]; + +/* UDP stuff */ +UDPsocket udpsock; +UDPpacket *packet; + +struct _tracklist *tracklist; +SDL_Surface *fun; + + +/* return the id of a connected address */ +int lookup(IPaddress address) +{ + int i; + for (i=0;iname); + fun=IMG_Load(tracklist->function); + + /* reset clients variables */ + for (i=0;ix; + clients[i].car.y=tracklist->y; + clients[i].car.w=30; + clients[i].car.h=30; + clients[i].car.angle=tracklist->a*2*M_PI/360; + clients[i].car.speed=0; + clients[i].car.lap=0; + clients[i].car.lastcheck=0; + } + + /* tell the clients */ + tmp=packet->data; + strcpy(tmp,"track"); + tmp+=strlen(tmp)+1; + *tmp++=1; /* startup countdown */ + strcpy(tmp,tracklist->name); + tmp+=strlen(tmp)+1; + memcpy(tmp,&time,sizeof(int)); + tmp+=sizeof(int); + memcpy(tmp,&network_speed,sizeof(int)); + tmp+=sizeof(int); + packet->len=(void *)tmp-(void *)packet->data; + for (i=0;iaddress=clients[i].address; + SDLNet_UDP_Send(udpsock,-1,packet); + } + + /* wait for everybody startup */ + for (i=0;iaddress); + + /* look for type of message */ + tmp=packet->data; + /*printf("%s\n",tmp);*/ + + /* new connection ? */ + if (strcmp(tmp,"connect")==0) + { + /* allready connected ? */ + if (id!=-1 && clients[id].connected) + { + /* should not happen */ + printf("client %d allready connected\n",id); + } + else + for (i=0;iaddress; + clients[i].connected=1; + clients[i].lasttime=time; + memset(&clients[i].car,0,sizeof(struct _car)); + tmp+=strlen(tmp)+1; + strcpy(clients[i].pseudo,tmp); + tmp+=strlen(tmp)+1; + memcpy(&clients[i].car.color,tmp,sizeof(int)); + clients[i].car.x=tracklist->x; + clients[i].car.y=tracklist->y; + clients[i].car.w=30; + clients[i].car.h=30; + clients[i].car.angle=tracklist->a*2*M_PI/360; + clients[i].car.speed=0; + clients[i].car.lap=0; + clients[i].car.lastcheck=0; + memcpy(ip,&packet->address.host,4); + printf("client %d connected at %d : %d.%d.%d.%d:%d (pseudo : %s, color : %d)\n",i,time,ip[0],ip[1],ip[2],ip[3],packet->address.port,clients[i].pseudo,clients[i].car.color); + tmp=packet->data; + strcpy(tmp,"track"); + tmp+=strlen(tmp)+1; + *tmp++=0; /* no startup countdown */ + strcpy(tmp,tracklist->name); + tmp+=strlen(tmp)+1; + memcpy(tmp,&time,sizeof(int)); + tmp+=sizeof(int); + memcpy(tmp,&network_speed,sizeof(int)); + tmp+=sizeof(int); + packet->len=(void *)tmp-(void *)packet->data; + SDLNet_UDP_Send(udpsock,-1,packet); + break; + } + } + else + + /* disconnection ? */ + if (strcmp(tmp,"disconnect")==0 && id!=-1) + { + clients[id].connected=0; + printf("client %d disconnected\n",id); + } + else + + /* keys message ? */ + if (strcmp(tmp,"keys")==0) + { + if (id==-1 || !clients[id].connected) + { + /* should not happen */ + printf("discarded \"keys\" message\n"); + } + else + { + int temp; + tmp+=strlen(tmp)+1; + memcpy(&temp,tmp,sizeof(int)); + tmp+=sizeof(int); + if (clients[id].lasttime==temp) + { + /* printf("servertime = %d lasttime = %d temp = %d strlen(tmp) = %d\n",time,clients[id].lasttime,temp,strlen(tmp)); */ + /*printf("keys = %s\n",tmp);*/ + while (*tmp) + { + move_car(&clients[id].car,*tmp-'A',fun); + /*printf("%d = %f\n",id,clients[id].car.angle);*/ + clients[id].lasttime++; + tmp++; + } + } + } + } + } + + /* check for timeouts */ + for (i=0;iaddress=clients[i].address; + strcpy(packet->data,"disconnected"); + SDLNet_UDP_Send(udpsock,-1,packet); + clients[i].connected=0; + } + + /* send update to clients */ + if (time%network_speed==0) for (i=0;idata; + strcpy(tmp,"positions"); + tmp+=strlen(tmp)+1; + memcpy(tmp,&time,sizeof(int)); + tmp+=sizeof(int); /* for server time */ + tmp+=sizeof(int); /* for client time */ + tmp+=sizeof(int); /* for number of cars */ + nb=0; + for (j=0;jdata+strlen("positions")+1+sizeof(int)+sizeof(int),&nb,sizeof(int)); + packet->len=(void *)tmp-(void *)packet->data; + memcpy(packet->data+strlen("positions")+1+sizeof(int),&clients[i].lasttime,sizeof(int)); + packet->address=clients[i].address; + SDLNet_UDP_Send(udpsock,-1,packet); + } + + /* did someone finish the track ? */ + for (i=0;idata; + strcpy(tmp,"finish"); + tmp+=strlen(tmp)+1; + tmp+=sizeof(int); /* space for number */ + nb=0; + for (i=0;i<10;i++) + { + int best_sc=-1,best_id; + for (j=0;jbest_sc) + { + best_sc=clients[j].car.lap*32+clients[j].car.lastcheck; + best_id=j; + } + if (best_sc!=-1) + { + sprintf(tmp,"%s : %d",clients[best_id].pseudo,best_sc); + tmp+=strlen(tmp)+1; + memcpy(tmp,&clients[best_id].car.color,sizeof(int)); + tmp+=sizeof(int); + clients[best_id].car.lap=-1; + nb++; + printf("top %d : %s - %d\n",nb,clients[best_id].pseudo,best_sc); + } + } + memcpy(packet->data+strlen("finish")+1,&nb,sizeof(int)); + packet->len=(void *)tmp-(void *)packet->data; + for (i=0;iaddress=clients[i].address; + SDLNet_UDP_Send(udpsock,-1,packet); + } + SDL_Delay(5000); + + tracklist=tracklist->next; + } + + return 0; +}