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