📄 walk.cpp
字号:
#include "walk.h"
void mp_message(int from,mp_msg *msg);
void draw_game_status();
person_desc cd_person;
jump_pad_desc cd_jump_pad;
birth_pad_desc cd_birth_pad;
gib_desc cd_gib;
BOOL APIENTRY DllMain(HINSTANCE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
};
return TRUE;
}
__declspec( dllexport )
int num_classes()
{
return 4;
}
__declspec( dllexport )
class_desc *get_class_desc(int i)
{
switch(i)
{
case 0:
return &cd_birth_pad;
case 1:
return &cd_jump_pad;
case 2:
return &cd_gib;
case 3:
return &cd_person;
default: return 0;
}
}
__declspec( dllexport )
int fly_message(int msg,int param,void *data)
{
switch(msg)
{
case FLYM_DRAWSCENE:
if (directx->mpmode!=FLYMP_SERVER)
{
flyengine->set_camera(flyengine->cam);
flyengine->draw_bsp();
if (flyengine->stencil)
{
flyengine->start_text_mode();
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_NOTEQUAL,0,~0);
glColor3fv(&flyengine->shadowcolor.x);
glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
glBlendFunc(GL_ZERO, GL_SRC_COLOR);
glRecti(0, 0, screen_sx, screen_sy);
glDisable(GL_STENCIL_TEST);
}
}
break;
case FLYM_DRAWTEXT:
draw_game_status();
break;
case FLYM_MPUPDATE:
((person *)(flyengine->player))->mp_send_pos(
FLYMP_MSG_POS,
0xf|
((person *)(flyengine->player))->flag|
(((person *)(flyengine->player))->points<<16));
return 0;
case FLYM_MPMESSAGE:
mp_message(param,(mp_msg *)data);
return 1;
}
return 1;
}
void mp_message(int from,mp_msg *msg)
{
switch( msg->type )
{
case FLYMP_MSG_POS:
{
struct mp_data *data=(mp_data *)&msg->type;
person *s=(person *)directx->players[from].data;
if (from>0)
{
s->remove_from_bsp();
s->pos=data->pos;
s->vel=data->vel;
s->walkvec=data->walkvel;
s->ls.Y=data->Y;
s->ls.Z=data->Z;
s->ls.X=data->X;
s->ls.update_mat();
s->updownrot=data->rot;
*((local_system *)s)=s->ls;
s->rotate(s->updownrot,s->X);
s->flag=data->flag&0xffff;
s->points=(short)(data->flag>>16);
s->add_to_bsp();
}
if (from>=0 && ((data->flag&0xf)!=0xf))
if (s->g)
{
s->g->fire(s,s->player);
s->cur_anim_time=flyengine->cur_time;
s->cur_anim=2;
s->loop_anim=0;
}
}
break;
case FLYMP_MSG_DAMAGE:
{
struct mp_data_damage *data=(mp_data_damage *)&msg->type;
person *p=(person *)directx->players[from].data;
p->curshield-=data->value;
p->jumpvec=data->pushvec;
p->jumpflag=50;
if (from==0)
flyengine->filter.x=1.0f;
}
break;
case FLYMP_MSG_KILL:
{
struct mp_data_kill *data=(mp_data_kill *)&msg->type;
person *p=(person *)directx->players[from].data;
int i;
for( i=0;i<directx->nplayers;i++ )
if (directx->players[i].dpid==data->dpidpoints)
break;
p->die(i,data->hitpos,data->birthpad);
}
break;
case FLYMP_MSG_JOIN:
{
player_data *data=(player_data *)&msg->type;
person *p=(person *)flyengine->cam->clone();
p->pos.null(); p->vel.null(); p->force.null();
p->walkvec.null(); p->jumpflag=0;
p->player=directx->add_player(data->name,data->dpid,p);
flyengine->set_status_msg("%s HAS JOINED THE GAME",data->name);
flyengine->activate(p,(directx->mpmode==FLYMP_SERVER));
}
break;
case FLYMP_MSG_QUIT:
{
player_data *data=(player_data *)&msg->type;
if (from<directx->nplayers)
{
flyengine->set_status_msg("%s HAS LEFT THE GAME",directx->players[from].name);
bsp_object *obj=(bsp_object *)directx->remove_player(from);
for( int i=from;i<directx->nplayers;i++ )
((person *)directx->players[i].data)->player=i;
if (obj) obj->life=-1;
}
}
break;
}
}
void draw_game_status()
{
static DWORD t=timeGetTime();
static int frame_rate=0,frame_count=0;
static char str[256];
frame_count++;
if (flyengine->cur_time-t>1000)
{
frame_rate=frame_count*1000/(flyengine->cur_time-t);
t=flyengine->cur_time;
frame_count=0;
}
if (flyengine->cur_time - flyengine->status_msg_time > 2000)
{
sprintf(str,"FPS:%i N:%i",frame_rate,flyengine->nodedrawcount);
flyengine->draw_text( screen_sx-96, 0, str );
}
for( int i=0;i<directx->nplayers;i++)
{
sprintf(str,"%s %03i %02i",directx->players[i].name,
(int)(((person *)directx->players[i].data)->curshield*100),
((person *)directx->players[i].data)->points);
flyengine->draw_text( 0, i*16, str );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -