📄 flydll.cpp
字号:
#include "../Fly3D.h"
flydllgroup::flydllgroup()
{
dll=0;
ndll=0;
cd=0;
ncd=0;
};
flydllgroup::~flydllgroup()
{
reset();
}
void flydllgroup::reset()
{
if (cd)
delete cd;
cd=0; ncd=0;
if (dll)
{
int i;
for( i=0;i<ndll;i++ )
{
FreeLibrary(dll[i]->hdll);
delete dll[i];
}
delete dll;
dll=0;
ndll=0;
}
}
void flydllgroup::load_default_param(bsp_object *o,char *sec,fly_pak *file)
{
o->pos.null();
o->rot.null();
o->vel.null();
o->force.null();
o->bump=0.0f;
o->friction=0.0f;
o->mass=1.0f;
o->radius=1.0f;
o->life=1;
o->col_flag=0;
o->active=0;
o->align_z(vector(0,0,1));
o->load_default_params(file,sec);
o->rotate(o->rot);
o->next_obj=flyengine->stock_obj0;
flyengine->stock_obj0=o;
int i;
for( i=0;i<o->active;i++ )
flyengine->activate(o->clone());
}
void flydllgroup::load_all_classes(fly_pak *file)
{
for( int d=0;d<ndll;d++ )
load_classes(d,file);
}
void flydllgroup::load_classes(int d,fly_pak *file)
{
if (d>=0 && d<ndll)
if (dll[d]->num_classes!=0 && dll[d]->get_class_desc!=0)
{
int i,j;
dll[d]->nclasses=dll[d]->num_classes();
class_desc **tmp=new class_desc *[ncd+dll[d]->nclasses];
if (cd)
{
memcpy(tmp,cd,sizeof(class_desc *)*ncd);
delete cd;
}
cd=tmp;
for( i=0;i<dll[d]->nclasses;i++ )
cd[i+ncd]=dll[d]->get_class_desc(i);
if (file)
{
bsp_object *o;
char str[256],ret[256];
for( i=0;i<dll[d]->nclasses;i++ )
{
j=0;
while(1)
{
sprintf(str,"%s%i",cd[i+ncd]->get_name(),j++);
// GetPrivateProfileString(str,"longname","",ret,255,file);
file->get_profile_string(str,"longname",ret);
if (ret[0]==0) break;
o=(bsp_object *)cd[i+ncd]->create();
strcpy(o->name,str);
strcpy(o->long_name,ret);
load_default_param(o,str,file);
}
}
}
ncd+=dll[d]->nclasses;
}
}
int flydllgroup::send_message(int msg,int param,void *data)
{
int i;
for( i=0;i<ndll;i++ )
if (dll[i]->fly_message(msg,param,data)==0)
return 0;
return 1;
}
int flydllgroup::add_dll(char *filename)
{
char file[256];
sprintf(file,"%splugin\\%s",flyengine->flysdkpath,filename);
HINSTANCE d=LoadLibrary(file);
if (d)
{
if (GetProcAddress(d,"num_classes")==0 ||
GetProcAddress(d,"get_class_desc")==0 ||
GetProcAddress(d,"fly_message")==0)
return -1;
flydll **tmp=new flydll *[ndll+1];
memcpy(tmp,dll,sizeof(flydll *)*ndll);
if (dll) delete dll;
dll=tmp;
dll[ndll]=new flydll;
dll[ndll]->hdll=d;
strcpy(dll[ndll]->dll_filename,filename);
dll[ndll]->num_classes=(int (*)())GetProcAddress(d,"num_classes");
dll[ndll]->get_class_desc=(class_desc *(*)(int i))GetProcAddress(d,"get_class_desc");
dll[ndll]->fly_message=(int (*)(int msg,int param,void *data))GetProcAddress(d,"fly_message");
dll[ndll]->nclasses=0;
return ndll++;
}
return -1;
}
int flydllgroup::delete_dll(char *filename)
{
int i,j=0,k;
for( i=0;i<ndll;i++ )
if (!strcmp(filename,dll[i]->dll_filename))
break;
else j+=dll[i]->nclasses;
if (i==ndll)
return 0;
for( k=j;k<j+dll[i]->nclasses;k++ )
{
char *name=cd[k]->get_name();
int len=strlen(name);
bsp_object *o=flyengine->stock_obj0;
while(o)
{
if (!strncmp(o->name,name,len))
{
bsp_object *tmp=o;
o=(bsp_object *)o->next_obj;
delete_class(tmp);
}
else o=(bsp_object *)o->next_obj;
}
}
memcpy(&cd[j],&cd[j+dll[i]->nclasses],(ncd-(j+dll[i]->nclasses))*sizeof(class_desc *));
ncd-=dll[i]->nclasses;
delete dll[i];
memcpy(&dll[i],&dll[i+1],(ndll-(i+1))*sizeof(flydll *));
ndll--;
return 1;
}
void flydllgroup::delete_references(bsp_object *o)
{
param_desc pd;
int n,k;
bsp_object *obj;
obj=flyengine->active_obj0;
while(obj)
{
n=obj->get_param_desc(0,0);
for( k=0;k<n;k++ )
{
obj->get_param_desc(k,&pd);
if (pd.type>255 || pd.type<-255 || pd.type=='d' || pd.type=='o')
if ((*((bsp_object **)pd.data))==o)
*((bsp_object **)pd.data)=0;
}
obj=(bsp_object *)obj->next_obj;
}
obj=flyengine->stock_obj0;
while(obj)
{
n=obj->get_param_desc(0,0);
for( k=0;k<n;k++ )
{
obj->get_param_desc(k,&pd);
if (pd.type>255 || pd.type<-255 || pd.type=='d' || pd.type=='o')
if ((*((bsp_object **)pd.data))==o)
*((bsp_object **)pd.data)=0;
}
obj=(bsp_object *)obj->next_obj;
}
}
void flydllgroup::delete_class(bsp_object *o)
{
bsp_object **op=0;
op=&flyengine->active_obj0;
while( *op )
{
bsp_object *tmp=*op;
if (tmp->source==o)
{
if (flyengine->cam==tmp)
flyengine->cam=0;
if (flyengine->player==tmp)
flyengine->player=0;
*op=(bsp_object *)tmp->next_obj;
tmp->next_obj=0;
delete_references(tmp);
tmp->remove_from_bsp();
delete tmp;
}
else
op=(bsp_object **)&tmp->next_obj;
}
op=&flyengine->stock_obj0;
while( *op )
{
bsp_object *tmp=*op;
if (tmp==o)
{
if (flyengine->cam==tmp)
flyengine->cam=0;
if (flyengine->player==tmp)
flyengine->player=0;
*op=(bsp_object *)tmp->next_obj;
delete_references(tmp);
tmp->next_obj=0;
delete tmp;
}
else
op=(bsp_object **)&tmp->next_obj;
}
}
bsp_object *flydllgroup::add_class(char *name)
{
int i;
bsp_object *o=0;
for( i=0;i<ncd;i++ )
if (!stricmp(name,cd[i]->get_name()))
break;
if (i<ncd)
{
o=(bsp_object *)cd[i]->create();
o->next_obj=flyengine->stock_obj0;
flyengine->stock_obj0=o;
o->pos.null();
o->rot.null();
o->vel.null();
o->force.null();
o->align_z(vector(0,0,1));
o->force.null();
o->col_flag=0;
o->bump=0;
o->friction=0;
o->life=0;
o->mass=0.0f;
o->radius=0.0;
o->active=0;
int i,j,len;
param_desc pd;
i=o->get_param_desc(0,0);
for( j=0;j<i;j++ )
{
o->get_param_desc(j,&pd);
len=4;
if (pd.type=='v' || pd.type=='c')
len=12;
else if (pd.type=='s')
len=1;
if (pd.type=='p')
*((int *)pd.data)=-1;
else memset(pd.data,0,len);
}
}
return o;
}
void flydllgroup::move_dll(char *filename,int newrelpos)
{
int i,j,k;
for( i=0;i<ndll;i++ )
if (!strcmp(filename,dll[i]->dll_filename))
break;
if (i<ndll)
{
flydll *d=dll[i];
dll[i]=dll[i+newrelpos];
dll[i+newrelpos]=d;
k=0;
for( i=0;i<ndll;i++ )
for( j=0;j<dll[i]->nclasses;j++ )
cd[k++]=dll[i]->get_class_desc(j);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -