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 + -
显示快捷键?