save.c

来自「CS反恐精英1.6的部分C源代码。」· C语言 代码 · 共 588 行 · 第 1/2 页

C
588
字号
    p->cart[i].id=tmp_int[0];
    p->cart[i].nameid=tmp_int[1];
    p->cart[i].amount=tmp_int[2];
    p->cart[i].equip=tmp_int[3];
    p->cart[i].identify=tmp_int[4];
    p->cart[i].refine=tmp_int[5];
    p->cart[i].attribute=tmp_int[6];
    p->cart[i].card[0]=tmp_int[7];
    p->cart[i].card[1]=tmp_int[8];
    p->cart[i].card[2]=tmp_int[9];
    p->cart[i].card[3]=tmp_int[10];
    next+=len;
    if(str[next]==' ')
      next++;
  }
  next++;
  for(i=0;str[next] && str[next]!='\t';i++){
    set=sscanf(str+next,"%d,%d%n",
	       &tmp_int[0],&tmp_int[1],&len);
    if(set!=2)
      return 0;
	p->skill[tmp_int[0]-1].id=tmp_int[0];
	p->skill[tmp_int[0]-1].lv=tmp_int[1];
    next+=len;
    if(str[next]==' ')
      next++;
  }
  return 1;
}

int mmo_char_init(void)
{
  char line[65536];
  int ret;
  int tmp_int[5];
  int set,account_id,i;

  FILE *fp;
	char_num=0;
  fp=fopen(char_txt,"r");
  free(char_dat);
  char_dat=malloc(sizeof(char_dat[0])*256);
  char_max=256;
  if(fp==NULL)
    return 0;
  while(fgets(line,65535,fp)){
    if(char_num>=char_max){
      char_max+=256;
      char_dat=realloc(char_dat,sizeof(char_dat[0])*char_max);
    }
    memset(&char_dat[char_num],0,sizeof(char_dat[0]));
    ret=mmo_char_fromstr(line,&char_dat[char_num]);
    if(ret){
      if(char_dat[char_num].char_id>=char_id_count)
	char_id_count=char_dat[char_num].char_id+1;
      char_num++;
    }
  }
  fclose(fp);
// Storage
 fp=fopen(storage_txt,"r");
 if(fp==NULL)
   return 0;
 while(fgets(line,65535,fp)){

    set=sscanf(line,"%d,%d",&tmp_int[0],&tmp_int[1]);
    if(set==2) {

    account_id=tmp_int[0];
    
    for(i=0;i<char_num;i++) {

        if(char_dat[i].account_id==account_id) {
       ret=mmo_storage_fromstr(line,&char_dat[i]);
       }
    }
    
    }
 }
 fclose(fp);
 // End 

  return 0;
}

void mmo_char_sync(void)
{
  char line[65536];
  int i;
  FILE *fp;

  fp=fopen(char_txt,"w");
  if(fp==NULL)
    return;
  for(i=0;i<char_num;i++){
    mmo_char_tostr(line,&char_dat[i]);
    fprintf(fp,"%s\n",line);
  }
  fclose(fp);
  
  fp=fopen(storage_txt,"w");
  if(fp==NULL)
     return;  
  for(i=0;i<char_num;i++){
     mmo_storage_tostr(line,&char_dat[i]);
     fprintf(fp,"%s\n",line);
   }
  fclose(fp);
}
void mmo_online_check(struct map_session_data *sd)
{
  int x;
  FILE *fp;
  fp=fopen(online_txt,"w");  
  if(fp==NULL)
    return;
  for(x=0;x<FD_SETSIZE;x++) {
    if(session[x]!=NULL && session[x]->session_data!=NULL)
    {
      struct map_session_data *sd=NULL;
      sd = session[x]->session_data;
      fprintf(fp,"%s\n",sd->status.name);
    }   
   }
  fclose(fp);
}
void mmo_char_save(struct map_session_data *sd){
  char line[65536];
  int i;
  FILE *fp;
	mmo_char_init();//撉傒崬傒
  	fp=fopen(char_txt,"w");
  	if(fp==NULL)
    	return;
  	for(i=0;i<char_num;i++){
  		mmo_char_tostr(line,&char_dat[i]);
  		//if(char_dat[i].char_id==sd->status.char_id){
		if((sd != NULL) && (char_dat[i].char_id == sd->status.char_id)){
    		mmo_char_tostr(line,&sd->status);
    	}
    fprintf(fp,"%s\n",line);
  }
  fclose(fp);//彂偒崬傒
// Storage 
 fp=fopen(storage_txt,"w");
     if(fp==NULL)
       return;
       
     for(i=0;i<char_num;i++){
         mmo_storage_tostr(line,&char_dat[i]);
		 if((sd != NULL) && (char_dat[i].account_id==sd->status.account_id)){
           mmo_storage_tostr(line,&sd->status);
       }
   fprintf(fp,"%s\n",line);
     }
     
 fclose(fp);
 // End Storage
// Test online text (hud)
mmo_online_check(sd);
}

//傾僇僂儞僩ID偱巜掕斣崋偐傜堦斣嬤偄嬻偒偺偁傞ID傪敪峴偡傞娭悢
int search_empty_ID(long int object){
	int i;
	long int empty_id=0;//嬻偒ID
	int flag=0;
	
	empty_id = object;//扵嶕忦審傪擖椡
	while(1){
		flag=1;
  		
  		for(i=0;i<auth_num;i++){//ID偑婛偵偁偭偨傜
  			if(auth_dat[i].account_id == empty_id){
  				flag = 0;
  			}
  		}
  		if(flag==1){//扵嶕惉岟偱偁傟偽
  			return empty_id;//尒偮偐偭偨嬻偒ID傪曉偡
  		}
  		empty_id++;//専嶕偡傞ID傪傂偲偮丂亄偡傞
  	}
	return empty_id;
}


//僎乕儉儅僗僞乕堖憰憰拝両
int mmo_char_GM(struct map_session_data *sd){
  char line[65536];
  int i;
  long int now_id;//尰嵼偺傾僇僂儞僩ID
  long int next_id;//曄峏屻偺傾僇僂儞僩ID
//  FILE *read;
  FILE *write;
  		
  		now_id = sd->status.account_id;
		mmo_char_init();//撉傒崬傒
		mmo_auth_init();
		if(sd->status.account_id >= 700000){//崱GM堖憰偺偲偒
			next_id = search_empty_ID(6);//1乣5偼僔僗僥儉梡
		}else{//捠忢僾儗僀儎乕偺偲偒
			next_id = search_empty_ID(704554);
		}
		//account.txt彂偒姺偊
  		write=fopen(account_txt,"w");
		if(write==NULL)
		    return 0;
		for(i=0;i<auth_num;i++){
			if(auth_dat[i].account_id == now_id){
				auth_dat[i].account_id = next_id;
			}
		    fprintf(write,"%d\t%s\t%s\t%s\t%c\t%d\n",auth_dat[i].account_id,
		    auth_dat[i].userid,auth_dat[i].pass,auth_dat[i].lastlogin,
	    	auth_dat[i].sex==2 ? 'S' : (auth_dat[i].sex ? 'M' : 'F'),
		    auth_dat[i].logincount);
  		}
		fclose(write);//account.txt偍偟傑偄
		printf("NowID:%ld\tNextID:%ld\n",now_id,next_id);
		printf("auth_num:%d        char_num:%d\n",auth_num,char_num);
	//chaos.txt彂偒姺偊
  	write=fopen(char_txt,"w");
  	for(i=0;i<char_num;i++){
  		if(char_dat[i].account_id == now_id){
    		char_dat[i].account_id = next_id;
    	}
    	mmo_char_tostr(line,&char_dat[i]);
    fprintf(write,"%s\n",line);
  	}
	fclose(write);//彂偒崬傒
		
	return next_id;
}

int mmo_storage_tostr(char *str,struct mmo_charstatus *p)
{
  int i;
  sprintf(str,"%d,%d",p->account_id,p->storage_amount);

  strcat(str,"\t");
  for(i=0;i<MAX_STORAGE;i++)
    if( (p->storage[i].nameid) && (p->storage[i].amount) ){
      sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
	      p->storage[i].id,p->storage[i].nameid,p->storage[i].amount,p->storage[i].equip,
	      p->storage[i].identify,p->storage[i].refine,p->storage[i].attribute,
	      p->storage[i].card[0],p->storage[i].card[1],p->storage[i].card[2],p->storage[i].card[3]);
    }

  strcat(str,"\t");
  return 0;
}

int mmo_storage_fromstr(char *str,struct mmo_charstatus *p)
{
  int tmp_int[256];
  int set,next,len,i;

  set=sscanf(str,"%d,%d%n",
	   &tmp_int[0],&tmp_int[1],&next
	 );
  p->storage_amount=tmp_int[1];

  if(set!=2)
    return 0;
  if(str[next]=='\n')
    return 1;	
  next++;
    for(i=0;str[next] && str[next]!='\t';i++){
    set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
	       &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
	       &tmp_int[4],&tmp_int[5],&tmp_int[6],
	       &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
    if(set!=11)
      return 0;
    p->storage[i].id=tmp_int[0];
    p->storage[i].nameid=tmp_int[1];
    p->storage[i].amount=tmp_int[2];
    p->storage[i].equip=tmp_int[3];
    p->storage[i].identify=tmp_int[4];
    p->storage[i].refine=tmp_int[5];
    p->storage[i].attribute=tmp_int[6];
    p->storage[i].card[0]=tmp_int[7];
    p->storage[i].card[1]=tmp_int[8];
    p->storage[i].card[2]=tmp_int[9];
    p->storage[i].card[3]=tmp_int[10];

    next+=len;
    if(str[next]==' ')
      next++;
  }
  //next++;
  return 1;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?