📄 flyserver.cpp
字号:
#include "../../lib/Fly3D.h"
#include <conio.h>
#define IDLE_DELAY 50
#define RUNNING_DELAY 10
class server_flyEngine : public flyEngine
{
public:
char line[80];
int cursor,linecount;
int init_multiplayer(char *gamename);
void run();
int get_keys();
int command(char *str);
int command_tokens(char *str,char **token);
void print(char *fmt, ...);
server_flyEngine()
{ cursor=0; line[0]=0; linecount=0; };
};
void main(int an, char **av)
{
if (an==3 || an==4)
{
set_engine(new server_flyEngine,0,0,FLYAPPID_FLYSERV);
char gamename[256];
strcpy(gamename,av[2]);
init_directx();
printf("Starting Fly3D server...\n\nFlySDK path: %s\n file: %s\n\n",flyengine->flysdkpath,av[1]);
if (flyengine->open_fly_file(av[1]) && flyengine->bsp)
{
printf("Scene loaded: %i plugins, %i faces, %i vertices\n\n",
flyengine->dll.ndll,flyengine->nfaces,flyengine->nvert);
if (((server_flyEngine *)flyengine)->init_multiplayer(gamename))
{
((server_flyEngine *)flyengine)->run();
directx->free_multiplayer();
}
else printf("Could not start TCP/IP multiplayer!");
}
else printf("Could not open scene file!");
free_engine();
free_directx();
}
else printf("FlyServer.exe flyfile gamename");
}
void server_flyEngine::print(char *fmt, ...)
{
char ach[128];
va_list va;
va_start( va, fmt );
wvsprintf( ach, fmt, va );
va_end( va );
strcat(ach,"\n");
if (cursor)
printf("\r%79s\r%s%s","",ach,line);
else
printf("%s",ach);
}
int server_flyEngine::init_multiplayer(char *gamename)
{
if (directx->init_multiplayer(0)==0)
return 0;
if (directx->create_game(&FLYGUID,gamename)==0)
return 0;
printf("Server started at address: %s\n\n",
directx->get_player_address(DPID_SERVERPLAYER));
return 1;
}
int server_flyEngine::get_keys()
{
int ret=0;
if (cursor==0)
{
putchar('>');
line[0]='>';
line[1]=0;
cursor=1;
}
if (_kbhit())
{
int key=_getch();
if (key==0 || key==224)
key=-_getch();
if (key==27 && cursor>1)
{
line[1]=0;
cursor=1;
printf("\r%79s\r%s","",line);
}
else
if (key==8 && cursor>1)
{
line[cursor--]=0;
printf("%c %c",8,8);
}
else
if (key==13)
{
printf("\n");
cursor=0;
ret=command(&line[1]);
line[0]=0;
}
else
if (key>27 && cursor<79)
{
line[cursor++]=key;
line[cursor]=0;
putchar(key);
}
}
return ret;
}
void server_flyEngine::run()
{
int T1=timeGetTime(),frames=0,dt;
while(1)
{
if (get_keys())
break;
if (directx->nplayers==1)
Sleep(IDLE_DELAY);
dt=step();
if (dt>0)
frames++;
if(con.linecount>linecount)
{
int i,j=con.linecount-linecount;
for( i=0;i<j;i++ )
print(con.buf[i]);
linecount=con.linecount;
}
if (dt<RUNNING_DELAY)
Sleep(RUNNING_DELAY-dt);
}
int T0=timeGetTime();
printf("\n%i fps\n",frames*1000/(T0-T1));
}
int server_flyEngine::command_tokens(char *str,char **token)
{
int ntoken=0;
do
{
while( *str==' ' )
*(str++)=0;
if (*str==0)
break;
token[ntoken]=str;
str=strchr(str,' ');
if (token[ntoken][0]=='(')
{
token[ntoken]++;
str=strchr(token[ntoken],')');
if (str)
*(str++)=0;
}
if (token[ntoken][0]=='\"')
{
token[ntoken]++;
str=strchr(token[ntoken],'\"');
if (str)
*(str++)=0;
}
ntoken++;
}while(str);
return ntoken;
}
int server_flyEngine::command(char *str)
{
char *token[256],buf[256];
int ntoken;
int i,j,k;
strcpy(buf,str);
strlwr(buf);
ntoken=command_tokens(buf,token);
if (ntoken==0)
{
set_status_msg("Invalid command!");
return 0;
}
if (!strcmp(token[0],"help") || token[0][0]=='?')
{
set_status_msg("commands:");
set_status_msg(" get [ varname | objname.objparam ]");
set_status_msg(" set [ varname | objname.objparam ] val");
set_status_msg(" list [ \"plugins\" | \"classes\" | classname | objname ]");
set_status_msg(" map [ path/level.fly ]");
set_status_msg(" activate objname");
set_status_msg(" quit");
}
else
if (!strcmp(token[0],"map"))
{
set_status_msg("map: %s",flyfile[0]==0?"(none)":flyfile);
}
else
if (!strcmp(token[0],"quit"))
return 1;
else
if (!strcmp(token[0],"list"))
{
char s[256]="";
if (ntoken==1)
{
param_desc pd;
j=get_global_param_desc(0,0);
for( k=0;k<j;k++ )
{
get_global_param_desc(k,&pd);
strcpy(s,pd.name);
strcat(s,"=");
strcat(s,pd.get_string());
set_status_msg(s);
}
}
else
if (!strcmp(token[1],"plugins"))
{
for( i=0;i<dll.ndll;i++ )
set_status_msg(dll.dll[i]->dll_filename);
}
else
if (!strcmp(token[1],"classes"))
{
for( i=0;i<dll.ncd;i++ )
{
if (i&1)
{
j=strlen(dll.cd[i-1]->get_name());
if (j<8)
strcat(s,"\t");
if (j<16)
strcat(s,"\t");
strcat(s,"\t");
}
if ((i&1)==0 && i>0)
{
set_status_msg(s);
s[0]=0;
}
strcat(s,dll.cd[i]->get_name());
}
if (s[0]!=0)
set_status_msg(s);
}
else
if (strchr(token[1],'.'))
{
char *c=strchr(token[1],'.');
*c=0;
bsp_object *o=stock_obj0;
while(o)
{
if (!stricmp(o->long_name,token[1]))
break;
o=(bsp_object *)o->next_obj;
}
if (o)
{
param_desc pd;
j=o->get_param_desc(0,0);
for( k=0;k<j;k++ )
{
o->get_param_desc(k,&pd);
if (!stricmp(c+1,pd.name))
{
strcpy(s,pd.name);
strcat(s,"=");
strcat(s,pd.get_string());
set_status_msg(s);
break;
}
}
if (k==j)
set_status_msg("Invalid object parameter !");
}
else set_status_msg("Invalid object name!");
}
else
{
for( i=0;i<dll.ncd;i++ )
if (!strcmp(token[1],dll.cd[i]->get_name()))
break;
if (i<dll.ncd)
{
j=dll.cd[i]->get_type();
bsp_object *o=stock_obj0;;
while(o)
{
if (o->type==j)
set_status_msg(o->long_name);
o=(bsp_object *)o->next_obj;
}
}
else
{
bsp_object *o=stock_obj0;
while(o)
{
if (!stricmp(o->long_name,token[1]))
break;
o=(bsp_object *)o->next_obj;
}
if (o==0)
set_status_msg("Invalid class/object name!");
else
{
param_desc pd;
j=o->get_param_desc(0,0);
for( k=0;k<j;k++ )
{
o->get_param_desc(k,&pd);
strcpy(s,pd.name);
strcat(s,"=");
strcat(s,pd.get_string());
set_status_msg(s);
}
}
}
}
}
else
if (!strcmp(token[0],"set"))
{
if (ntoken<3)
{
set_status_msg("Missing parameters!");
return 0;
}
if (strchr(token[1],'.'))
{
char *c=strchr(token[1],'.');
*c=0;
i=set_obj_param(token[1],c+1,token[2]);
if (i==1)
set_status_msg("Invalid object name!");
else if (i==2)
set_status_msg("Invalid object parameter!");
else if (i==3)
set_status_msg("Unsuported parameter type!");
else if (i==-1)
{
close_texture_cache();
init_texture_cache();
}
return 0;
}
i=get_global_param_desc(0,0);
param_desc pd;
for( j=0;j<i;j++ )
{
get_global_param_desc(j,&pd);
if (!stricmp(token[1],pd.name))
break;
}
if (j==i)
{
set_status_msg("Invalid parameter name!");
return 0;
}
pd.set_string(token[2]);
close_texture_cache();
init_texture_cache();
return 0;
}
else if (!strcmp(token[0],"activate"))
{
bsp_object *o=stock_obj0;
while(o)
{
if (!stricmp(token[1],o->long_name))
break;
o=(bsp_object *)o->next_obj;
}
if (o)
flyengine->activate(o->clone());
else set_status_msg("Invalid object name!");
}
else if (!strcmp(token[0],"get"))
{
char s[256]="";
if (!strncmp(token[1],"obj(",4))
{
char *objname=&token[1][4];
char *objparam=strchr(token[1],'.');
char *c=strchr(objname,')');
if (c==0 || objparam==0)
{
set_status_msg("Invalid sintax!");
return 0;
}
*c=0;
i=get_obj_param(objname,objparam+1,s);
if (i)
{
if (i==1)
set_status_msg("Invalid object name!");
else if (i==2)
set_status_msg("Invalid object parameter!");
else if (i==3)
set_status_msg("Unsuported parameter type!");
return 0;
}
}
else
{
i=get_global_param_desc(0,0);
param_desc pd;
for( j=0;j<i;j++ )
{
get_global_param_desc(j,&pd);
if (!stricmp(token[1],pd.name))
break;
}
if (j==i)
{
set_status_msg("Invalid variable name!");
return 0;
}
else strcpy(s,pd.get_string());
}
set_status_msg(s);
}
else
set_status_msg("Invalid command!");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -