// This is ManiaDrive mini server.
#define RAYDIUM_NETWORK_ONLY
#include "raydium/index.c"
#define PARTY_TIMEOUT (5*60) // default : 5
#define PARTY_SCORE_TIME (10)
#define REMAINING_SEND 5
#define NET_SCORE_TRACK (RAYDIUM_NETWORK_PACKET_BASE+1)
#define NET_RESTART (RAYDIUM_NETWORK_PACKET_BASE+2)
#define NET_CHANGE_MAP (RAYDIUM_NETWORK_PACKET_BASE+3)
#define NET_REMAINING (RAYDIUM_NETWORK_PACKET_BASE+4)
#define NET_SCORE_BASE (RAYDIUM_NETWORK_PACKET_BASE+10)
char str[RAYDIUM_NETWORK_PACKET_SIZE];
char track[RAYDIUM_NETWORK_PACKET_SIZE];
float steps=0;
//char str_send[RAYDIUM_NETWORK_PACKET_SIZE];
//int freq;
char *index_text="\
This is a ManiaServer. You can connect to this server using \
the ManiaDrive game.
\
Here, you can find :
\
- Informations about current party
\
- Server console
\
\
- Live scores on the web
\
- Maniadrive website
\
- Game Engine: Raydium website
\
";
signed char switch_track(void)
{
static int last=-1;
FILE *fp;
raydium_register_variable(track,RAYDIUM_REGISTER_STR,"track");
raydium_register_variable(&last,RAYDIUM_REGISTER_INT,"last");
raydium_php_exec("mania_server_tracks.php");
raydium_register_variable_unregister_last();
raydium_register_variable_unregister_last();
if(! (fp=raydium_file_fopen(track,"rt")) )
{
raydium_log("ERROR ! cannot switch to track '%s' !",track);
return 0;
}
fclose(fp);
raydium_log("Switching to track '%s'",track);
raydium_network_server_broadcast_info(track);
return 1;
}
void change_track(char *track)
{
char buff[RAYDIUM_NETWORK_PACKET_SIZE];
raydium_log("Broadcasting MNI track '%s'",track);
strcpy(buff+RAYDIUM_NETWORK_PACKET_OFFSET,track);
raydium_network_broadcast(NET_CHANGE_MAP,buff);
}
void send_time(GLfloat step)
{
char buff[RAYDIUM_NETWORK_PACKET_SIZE];
static float t=0;
float tt;
t+=step;
if(t>=REMAINING_SEND)
{
t=0;
tt=PARTY_TIMEOUT-steps;
//raydium_log("remaining time : broadcast (%.2f)",tt);
memcpy(buff+RAYDIUM_NETWORK_PACKET_OFFSET,&tt,sizeof(float));
strcpy(buff+RAYDIUM_NETWORK_PACKET_OFFSET+sizeof(float),track);
raydium_network_broadcast(NET_REMAINING,buff);
}
}
/*
void newClient(int client)
{
char buff[RAYDIUM_NETWORK_PACKET_SIZE];
float tt=0;
memcpy(buff+RAYDIUM_NETWORK_PACKET_OFFSET,&tt,sizeof(float));
strcpy(buff+RAYDIUM_NETWORK_PACKET_OFFSET+sizeof(float),track);
raydium_network_write(&raydium_network_client_addr[client],-1,NET_REMAINING,buff);
}
*/
void change_track_netcall(GLfloat step)
{
steps+=step;
//printf("%f\n",steps);
if(steps>=(PARTY_TIMEOUT+PARTY_SCORE_TIME))
{
steps=0;
// change map
if(switch_track())
change_track(track);
}
}
void broad(int type,char *buff)
{
raydium_network_broadcast(type,buff);
// raydium_log("broadcasting %i",type);
}
void loop(void)
{
signed char type;
int id;
if(raydium_network_read(&id, &type, str)==RAYDIUM_NETWORK_DATA_OK)
{
raydium_network_broadcast(type,str);
// printf(".");
}
raydium_timecall_callback();
raydium_web_callback();
}
signed char http_req(char *req, char *response, int max_size)
{
int i;
raydium_log("-%s-",req);
if(!strcmp("data.dyn",req))
{
sprintf(response,"Party informations\n\
Running on track %s since %.2f seconds (%.2f left)\
",track,steps,PARTY_TIMEOUT-steps);
sprintf(response+strlen(response),"\
Connected players (%i max) |
\
",RAYDIUM_NETWORK_MAX_CLIENTS);
for(i=0;i%s | ",raydium_network_name[i]);
sprintf(response+strlen(response),"
");
sprintf(response+strlen(response),"\
You can find bests online scores for '%s' track here !\
",track,track);
sprintf(response+strlen(response),"Back");
return 1;
}
if(!strcmp("console.dyn",req))
{
char *hist[RAYDIUM_CONSOLE_MAX_LINES];
int i,n;
n=raydium_console_history_read(hist);
sprintf(response,"Server Console\n\
Raydium console:");
for(i=0;i");
sprintf(response+strlen(response),"
Back");
return 1;
}
return 0;
}
int main(int argc, char **argv)
{
int i;
char title[RAYDIUM_MAX_NAME_LEN];
raydium_network_only_init(argc,argv);
raydium_web_init();
raydium_web_start("ManiaDrive Server");
raydium_web_extension_add("mni","raw/unknown",NULL);
raydium_web_extension_add("dyn",NULL,http_req); // use default "writer"
raydium_web_body_default=index_text;
raydium_init_cli_option_default("title",title,"ManiaDrive Server. Use --title to change :)");
raydium_network_server_broadcast(title,"ManiaDrive",10);
// Ugly hack, for now...
raydium_network_netcall_add(broad,RAYDIUM_NETWORK_PACKET_ODE_EXPLOSION,1);
raydium_network_netcall_add(broad,RAYDIUM_NETWORK_PACKET_ODE_NEWELEM,1);
raydium_network_netcall_add(broad,RAYDIUM_NETWORK_PACKET_ODE_REMELEM,1);
raydium_network_netcall_add(broad,RAYDIUM_NETWORK_PACKET_ODE_NIDWHO,1);
raydium_network_netcall_add(broad,NET_SCORE_TRACK,1);
raydium_network_netcall_add(broad,NET_RESTART,1);
for(i=0;i