npc.c
来自「CS反恐精英1.6的部分C源代码。」· C语言 代码 · 共 872 行 · 第 1/2 页
C
872 行
if(by+i < 0 || by+i >= map_data[m].bys)
continue;
mmo_map_sendblock(m,bx-dx*AREA_SIZE,by+i,buf,packet_len_table[0x80],0,0);
}
}
if((y+dy)/BLOCK_SIZE != y/BLOCK_SIZE && by-dy*AREA_SIZE>=0 && by-dy*AREA_SIZE<map_data[m].bys){ // y
for(i=-AREA_SIZE;i<=AREA_SIZE;i++){ // y
if(bx+i < 0 || bx+i >= map_data[m].bxs)
continue;
mmo_map_sendblock(m,bx+i,by-dy*AREA_SIZE,buf,packet_len_table[0x80],0,0);
}
}
del_block(&map_data[m].npc[n]->block);
add_block(&map_data[m].npc[n]->block,m,x+dx,y+dy);
memset(buf,0,256);
//山绩认跋柒モンスタ〖攫鼠
WBUFW(buf,0)=0x7b;
WBUFL(buf,2)=map_data[m].npc[n]->id;
WBUFW(buf,6)=map_data[m].npc[n]->u.mons.speed;
WBUFW(buf,14)=map_data[m].npc[n]->class;
WBUFL(buf,22)=tick;
set_2pos(WBUFP(buf,50),x,y,map_data[m].npc[n]->u.mons.to_x,map_data[m].npc[n]->u.mons.to_y);
WBUFB(buf,55)=0;
WBUFB(buf,56)=5;
WBUFB(buf,57)=5;
bx=(x+dx)/BLOCK_SIZE;
by=(y+dy)/BLOCK_SIZE;
if((x+dx)/BLOCK_SIZE != x/BLOCK_SIZE && bx+dx*AREA_SIZE>=0 && bx+dx*AREA_SIZE<map_data[m].bxs){ // x
for(i=-AREA_SIZE;i<=AREA_SIZE;i++){ // x
if(by+i < 0 || by+i >= map_data[m].bys)
continue;
mmo_map_sendblock(m,bx+dx*AREA_SIZE,by+i,buf,packet_len_table[0x7b],0,0);
}
}
if((y+dy)/BLOCK_SIZE != y/BLOCK_SIZE && by+dy*AREA_SIZE>=0 && by+dy*AREA_SIZE<map_data[m].bys){ // y
for(i=-AREA_SIZE;i<=AREA_SIZE;i++){ // y
if(bx+i < 0 || bx+i >= map_data[m].bxs)
continue;
mmo_map_sendblock(m,bx+i,by+dy*AREA_SIZE,buf,packet_len_table[0x7b],0,0);
}
}
}
map_data[m].npc[n]->x+=dx;
map_data[m].npc[n]->y+=dy;
dx= map_data[m].npc[n]->u.mons.to_x - map_data[m].npc[n]->x;
dy= map_data[m].npc[n]->u.mons.to_y - map_data[m].npc[n]->y;
if(dx==0 && dy==0){
map_data[m].npc[n]->u.mons.timer=
add_timer(tick+rand()%5000+5000,mons_walk,m,n);
} else {
map_data[m].npc[n]->u.mons.timer=
add_timer(tick+map_data[m].npc[n]->u.mons.speed*((dx&&dy)?14:10)/10,mons_walk,m,n);
}
return 0;
}
// if no user in map, sleep
if(map_data[m].users==0){
map_data[m].npc[n]->u.mons.timer=
add_timer(tick+rand()%5000+5000,mons_walk,m,n);
return 0;
}
// search target
//タ〖ゲットサ〖チ
//殊乖材墙な眷疥玫瑚婶尸
for(i=0;i<5;i++){
dx=rand()%(12*2+1)-12;//肌の郝筛X
dy=rand()%(12*2+1)-12;//肌の郝筛Y
ret=search_path(&sd,m,map_data[m].npc[n]->x,map_data[m].npc[n]->y,map_data[m].npc[n]->x+dx,map_data[m].npc[n]->y+dy,1);
//ret==0ならば肌へ渴むことができますよ
if(ret==0)
break;
}
// printf("N MoB X,Y,DX,DY ret %d %d %d %d %d\n",map_data[m].npc[n]->x,map_data[m].npc[n]->y,dx,dy,ret);
if(ret==0){
unsigned char buf[256];
memset(buf,0,256);
//败瓢黎モンスタ〖キャラクタ〖肋年
WBUFW(buf,0)=0x7b;
WBUFL(buf,2)=map_data[m].npc[n]->id;
WBUFW(buf,6)=map_data[m].npc[n]->u.mons.speed;
WBUFW(buf,14)=map_data[m].npc[n]->class;
WBUFL(buf,22)=tick;
set_2pos(WBUFP(buf,50),map_data[m].npc[n]->x,map_data[m].npc[n]->y,map_data[m].npc[n]->x+dx,map_data[m].npc[n]->y+dy);
WBUFB(buf,55)=0;
WBUFB(buf,56)=5;
WBUFB(buf,57)=5;
mmo_map_sendarea_mxy(m,map_data[m].npc[n]->x,map_data[m].npc[n]->y,buf,packet_len_table[0x7b]);
map_data[m].npc[n]->u.mons.to_x=map_data[m].npc[n]->x+dx;
map_data[m].npc[n]->u.mons.to_y=map_data[m].npc[n]->y+dy;
map_data[m].npc[n]->u.mons.timer=
add_timer(tick+map_data[m].npc[n]->u.mons.speed/2*((dx&&dy)?14:10)/10,mons_walk,m,n);
return 0;
}
map_data[m].npc[n]->u.mons.timer=
add_timer(tick+rand()%5000+5000,mons_walk,m,n);
// printf("SP0 speed %d\n",map_data[m].npc[n]->u.mons.timer);
return 0;
}
//モンスタ〖叫附
void respawn_mons(int m,int n)
{
unsigned char buf[256];
del_block(&map_data[m].npc[n]->block);
if(map_data[m].npc[n]->u.mons.script == 0){
if(map_data[m].npc[n]->u.mons.speed>0)
set_monster_random_point(m,n);
}
else
{
if(map_data[m].npc[n]->u.mons.speed>0)
set_monster_no_point(m,n);
}
add_block_npc(m,n);
mmo_map_set_npc(0,buf,map_data[m].npc[n]->id,map_data[m].npc[n]->class,map_data[m].npc[n]->x,map_data[m].npc[n]->y,0);
mmo_map_sendarea_mxy(m,map_data[m].npc[n]->x,map_data[m].npc[n]->y,buf,packet_len_table[0x78]);
map_data[m].npc[n]->u.mons.timer=
add_timer(gettick()+rand()%5000+5000,mons_walk,m,n);
}
//モンスタ〖叫附2
void respawn_mons2(int m,int n)
{
unsigned char buf[256];
if(map_data[m].npc[n]->u.mons.speed>0)
set_monster_random_point(m,n);
add_block_npc(m,n);
mmo_map_set_npc(0,buf,map_data[m].npc[n]->id,map_data[m].npc[n]->class,map_data[m].npc[n]->x,map_data[m].npc[n]->y,0);
mmo_map_sendarea_mxy(m,map_data[m].npc[n]->x,map_data[m].npc[n]->y,buf,packet_len_table[0x78]);
map_data[m].npc[n]->u.mons.timer=
add_timer(gettick()+rand()%5000+5000,mons_walk,m,n);
}
int read_npcdata(void)
{
//Fred1
int i,npc_txt_count,aggressive,class;
char line[2040];//1024];
FILE *fp;
// ADDED on 04/09/2003 -----------
pet_store_init_npc_id(&npc_id);
// -------------------------------
printf("Loading config files...\n");
// poring test data
mons_data[1002].max_hp=45;
mons_data[1002].base_exp=2;
mons_data[1002].job_exp=1;
mons_data[1002].dropitem[0].nameid=909; //zeropy
mons_data[1002].dropitem[0].p=8000; // 80%
// parse monster.txt
fp=fopen("config/monster2.txt","r");
if(fp){
while(fgets(line,2040,fp)){//1020,fp)){
int class,lv,max_hp,base_exp,job_exp;
int range,atk1,atk2,def1,def2,mdef1,mdef2,hit,flee;
int scale,race,ele,mode,speed,adelay,amotion,dmotion;
char name[128],JName[256],dropitem[1024],*p;
//if(sscanf(line,"%d,%s,%s,%d,%d,%d,%d\t%[^\t]",
if(sscanf(line,"%d,%[^,],%[^,],%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%[^\t]",
&class,name,JName,&lv,&max_hp,&base_exp,&job_exp,
&range,&atk1,&atk2,&def1,&def2,&mdef1,&mdef2,&hit,&flee,
&scale,&race,&ele,&mode,&speed,&adelay,&amotion,&dmotion,
dropitem)!=25)
continue;
if(class>=4000)
continue;
mons_data[class].max_hp=max_hp;
mons_data[class].base_exp=base_exp;
mons_data[class].job_exp=job_exp;
mons_data[class].lv = lv;
mons_data[class].range = range;
mons_data[class].atk1 = atk1;
mons_data[class].atk2 = atk2;
mons_data[class].def1 = def1;
mons_data[class].def2 = def2;
mons_data[class].mdef1 = mdef1;
mons_data[class].mdef2 = mdef2;
mons_data[class].hit = hit;
mons_data[class].flee = flee;
mons_data[class].scale = scale;
mons_data[class].race = race;
mons_data[class].ele = ele;
mons_data[class].mode = mode;
mons_data[class].speed = speed;
mons_data[class].adelay = adelay;
mons_data[class].amotion = amotion;
mons_data[class].dmotion = dmotion;
for(p=dropitem,i=0;p && i<16;i++,p=strchr(p,',')){
int nameid,value;
if(*p==',') p++;
if(sscanf(p,"%d:%d",&nameid,&value)!=2)
break;
mons_data[class].dropitem[i].nameid=nameid;
mons_data[class].dropitem[i].p=value;
}
}
}
fclose(fp);
fp=fopen("config/aggressive-monsters.txt","r");
//int class,aggressive;
if(fp){
while(fgets(line,1020,fp)){
aggressive=0;
if(sscanf(line,"%d:%d",&class,&aggressive)!=2)
continue;
if(class>=4000)
continue;
mons_data[class].aggressive=aggressive;
aggressive=0;
}
}
fclose(fp);
// parse npc.txt
for(npc_txt_count=0;npc_txt_count<npc_txt_num;npc_txt_count++){
fp=fopen(npc_txt[npc_txt_count],"r");
if(fp==NULL)
continue;
while(fgets(line,1020,fp)){
char mapname[256],w1[1024],w2[1024],w3[1024],w4[1024];
int x,y,dir;
if(sscanf(line,"%[^\t]\t%[^\t]\t%[^\t]\t%[^\t]",w1,w2,w3,w4)!=4 || sscanf(w1,"%[^,],%d,%d,%d",mapname,&x,&y,&dir)!=4)
continue;
for(i=0;map[i][0];i++)
if(strcmp(map[i],mapname)==0)
break;
if(map[i][0]==0)
continue;
if(strcmp(w2,"warp")==0){
int j,k,xs,ys,to_x,to_y;
map_data[i].npc[map_data[i].npc_num]=malloc(sizeof(struct npc_data));
map_data[i].npc[map_data[i].npc_num]->m=i;
map_data[i].npc[map_data[i].npc_num]->x=x;
map_data[i].npc[map_data[i].npc_num]->y=y;
map_data[i].npc[map_data[i].npc_num]->dir=0;
memcpy(map_data[i].npc[map_data[i].npc_num]->name,w3,24);
map_data[i].npc[map_data[i].npc_num]->class=WARP_CLASS;
map_data[i].npc[map_data[i].npc_num]->id=npc_id++;
sscanf(w4,"%d,%d,%[^,],%d,%d",
&xs,&ys,
map_data[i].npc[map_data[i].npc_num]->u.warp.name,
&to_x,&to_y);
xs++; ys++;
map_data[i].npc[map_data[i].npc_num]->u.warp.x=to_x;
map_data[i].npc[map_data[i].npc_num]->u.warp.y=to_y;
map_data[i].npc[map_data[i].npc_num]->u.warp.xs=xs;
map_data[i].npc[map_data[i].npc_num]->u.warp.ys=ys;
for(j=0;j<ys;j++){
unsigned char *p;
p = &map_data[i].gat[x-xs/2 + (y-ys/2+j)* map_data[i].xs ];
for(k=0;k<xs;k++,p++){
if(*p==1 || *p==5)
continue;
*p|=0x80;
}
}
//printf("npc %s %d read done\n",map[i],map_data[i].npc[map_data[i].npc_num]->id);
map_data[i].npc[map_data[i].npc_num]->block.subtype=WARP;
add_block_npc(i,map_data[i].npc_num);
map_data[i].npc_num++;
} else if(strcmp(w2,"monster")==0){
int j,class,num;
sscanf(w4,"%d,%d",&class,&num);
for(j=0;j<num;j++){
map_data[i].npc[map_data[i].npc_num]=malloc(sizeof(struct npc_data));
if(num==1 && x && y){
printf("(%d,%d) ",x,y);
map_data[i].npc[map_data[i].npc_num]->x=x;
map_data[i].npc[map_data[i].npc_num]->y=y;
map_data[i].npc[map_data[i].npc_num]->dir=0;
map_data[i].npc[map_data[i].npc_num]->u.mons.speed=-1;
} else {
set_monster_random_point(i,map_data[i].npc_num);
map_data[i].npc[map_data[i].npc_num]->u.mons.speed=200;
map_data[i].npc[map_data[i].npc_num]->u.mons.attacktimer=-1; //Aaron FIX!
}
map_data[i].npc[map_data[i].npc_num]->class=class;
map_data[i].npc[map_data[i].npc_num]->id=npc_id++;
memcpy(map_data[i].npc[map_data[i].npc_num]->name,w3,24);
map_data[i].npc[map_data[i].npc_num]->u.mons.timer=
add_timer(gettick()+rand()%5000+5000,mons_walk,i,map_data[i].npc_num);
map_data[i].npc[map_data[i].npc_num]->block.subtype=MONS;
map_data[i].npc[map_data[i].npc_num]->u.mons.hp=mons_data[map_data[i].npc[map_data[i].npc_num]->class].max_hp;
map_data[i].npc[map_data[i].npc_num]->u.mons.script = 0;
map_data[i].npc[map_data[i].npc_num]->u.mons.target_id = -1;
map_data[i].npc[map_data[i].npc_num]->u.mons.current_attack_m = i;
add_block_npc(i,map_data[i].npc_num);
map_data[i].npc_num++;
}
//printf("monster %s read done\n",w3);
} else if(strcmp(w2,"shop")==0){
char *p;
int max=32,pos=0;
struct npc_item_list *item_list;
map_data[i].npc[map_data[i].npc_num]=malloc(sizeof(struct npc_data));
map_data[i].npc[map_data[i].npc_num]->m=i;
map_data[i].npc[map_data[i].npc_num]->x=x;
map_data[i].npc[map_data[i].npc_num]->y=y;
map_data[i].npc[map_data[i].npc_num]->dir=dir;
memcpy(map_data[i].npc[map_data[i].npc_num]->name,w3,24);
map_data[i].npc[map_data[i].npc_num]->class=atoi(w4);
map_data[i].npc[map_data[i].npc_num]->id=npc_id++;
map_data[i].npc[map_data[i].npc_num]->block.subtype=SHOP;
item_list=malloc(sizeof(item_list[0])*(max+1));
p=strchr(w4,',');
while(p && pos<max){
int nameid,value;
p++;
if(sscanf(p,"%d:%d",&nameid,&value)!=2)
break;
item_list[pos].nameid=nameid;
item_list[pos].value=value;
pos++;
p=strchr(p,',');
}
item_list=realloc(item_list,sizeof(item_list[0])*(pos+1));
item_list[pos].nameid=0;
map_data[i].npc[map_data[i].npc_num]->u.shop_item=item_list;
add_block_npc(i,map_data[i].npc_num);
//printf("npc %s %d read done\n",map[i],map_data[i].npc[map_data[i].npc_num]->id);
map_data[i].npc_num++;
} else if(strcmp(w2,"script")==0){
char *buf;
int size=65536,j;
map_data[i].npc[map_data[i].npc_num]=malloc(sizeof(struct npc_data));
map_data[i].npc[map_data[i].npc_num]->m=i;
map_data[i].npc[map_data[i].npc_num]->x=x;
map_data[i].npc[map_data[i].npc_num]->y=y;
map_data[i].npc[map_data[i].npc_num]->dir=dir;
memcpy(map_data[i].npc[map_data[i].npc_num]->name,w3,24);
map_data[i].npc[map_data[i].npc_num]->class=atoi(w4);
map_data[i].npc[map_data[i].npc_num]->id=npc_id++;
map_data[i].npc[map_data[i].npc_num]->block.subtype=SCRIPT;
buf=malloc(size);
if(strchr(w4,'{'))
strcpy(buf,strchr(w4,'{'));
else
buf[0]=0;
while(1){
for(j=strlen(buf)-1;j>=0 && isspace(buf[j]);j--);
if(j>=0 && buf[j]=='}')
break;
fgets(line,1020,fp);
if(feof(fp))
break;
if(strlen(buf)+strlen(line)>=size){
size+=65536;
buf=realloc(buf,size);
}
if(strchr(buf,'{')==NULL){
if(strchr(line,'{'))
strcpy(buf,strchr(line,'{'));
} else
strcat(buf,line);
}
map_data[i].npc[map_data[i].npc_num]->u.script=parse_script(buf);
free(buf);
add_block_npc(i,map_data[i].npc_num);
//printf("npc %s %d read done\n",map[i],map_data[i].npc[map_data[i].npc_num]->id);
map_data[i].npc_num++;
}
}
fclose(fp);
}
printf("Config files loaded.\n");
return 0;
}
// ADDED on 04/09/2003 --------------------------------
int* return_npc_current_id(void)
{
return &npc_id;
}
// ----------------------------------------------------
int spawn_monster(int class,int x,int y,int i,int fd) {
char *name;
int len;
name="summonMonster";
map_data[i].npc[map_data[i].npc_num]=malloc(sizeof(struct npc_data));
x=x+rand()%3+1;
y=y+rand()%3+1;
map_data[i].npc[map_data[i].npc_num]->u.mons.to_x=map_data[i].npc[map_data[i].npc_num]->x=x;
map_data[i].npc[map_data[i].npc_num]->u.mons.to_y=map_data[i].npc[map_data[i].npc_num]->y=y;
map_data[i].npc[map_data[i].npc_num]->dir=0;
map_data[i].npc[map_data[i].npc_num]->u.mons.speed=200;
map_data[i].npc[map_data[i].npc_num]->class=class;
map_data[i].npc[map_data[i].npc_num]->id=npc_id++;
memcpy(map_data[i].npc[map_data[i].npc_num]->name,name,24);
map_data[i].npc[map_data[i].npc_num]->u.mons.timer=
add_timer(gettick()+rand()%5000,mons_walk,i,map_data[i].npc_num);
map_data[i].npc[map_data[i].npc_num]->block.subtype=MONS;
map_data[i].npc[map_data[i].npc_num]->u.mons.hp=mons_data[map_data[i].npc[map_data[i].npc_num]->class].max_hp;
map_data[i].npc[map_data[i].npc_num]->u.mons.script = 0;
map_data[i].npc[map_data[i].npc_num]->u.mons.target_id = -1;
map_data[i].npc[map_data[i].npc_num]->u.mons.current_attack_m = i;
map_data[i].npc[map_data[i].npc_num]->u.mons.attacktimer=-1;
len=mmo_map_set_npc007c(fd,WFIFOP(fd,0),npc_id-1,class,x,y);
if(len>0) mmo_map_sendarea(fd,WFIFOP(fd,0),len,0);
add_block_npc(i,map_data[i].npc_num);
map_data[i].npc_num++;
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?