?? int_guild.c
字號:
#include "inter.h"
#include "int_guild.h"
#include "int_storage.h"
#include "mmo.h"
#include "char.h"
#include "socket.h"
#include "db.h"
#include "lock.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char guild_txt[1024]="save/guild.txt";
char castle_txt[1024]="save/castle.txt";
static struct dbt *guild_db;
static struct dbt *castle_db;
static int guild_newid=10000;
static int guild_exp[100];
int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int flag,const char *mes);
int mapif_guild_broken(int guild_id,int flag);
int guild_check_empty(struct guild *g);
int guild_calcinfo(struct guild *g);
int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len);
int mapif_guild_info(int fd,struct guild *g);
int guild_break_sub(void *key,void *data,va_list ap);
// 僊儖僪僨乕僞偺暥帤楍傊偺曄姺
int inter_guild_tostr(char *str,struct guild *g)
{
int i,c,len;
// 婎杮僨乕僞
len=sprintf(str,"%d\t%s\t%s\t%d,%d,%d,%d,%d\t%s#\t%s#\t",
g->guild_id,g->name,g->master,
g->guild_lv,g->max_member,g->exp,g->skill_point,g->castle_id,
g->mes1,g->mes2);
// 儊儞僶乕
for(i=0;i<g->max_member;i++){
struct guild_member *m = &g->member[i];
len+=sprintf(str+len,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\t%s\t",
m->account_id,m->char_id,
m->hair,m->hair_color,m->gender,
m->class,m->lv,m->exp,m->exp_payper,m->position,
((m->account_id>0)?m->name:"-"));
}
// 栶怑
for(i=0;i<MAX_GUILDPOSITION;i++){
struct guild_position *p = &g->position[i];
len+=sprintf(str+len,"%d,%d\t%s#\t",
p->mode,p->exp_mode,p->name);
}
// 僄儞僽儗儉
len+=sprintf(str+len,"%d,%d,",g->emblem_len,g->emblem_id);
for(i=0;i<g->emblem_len;i++){
len+=sprintf(str+len,"%02x",(unsigned char)(g->emblem_data[i]));
}
len+=sprintf(str+len,"$\t");
// 摨柨儕僗僩
for(i=0,c=0;i<MAX_GUILDALLIANCE;i++)
if(g->alliance[i].guild_id>0)
c++;
len+=sprintf(str+len,"%d\t",c);
for(i=0;i<MAX_GUILDALLIANCE;i++){
struct guild_alliance *a=&g->alliance[i];
if(a->guild_id>0)
len+=sprintf(str+len,"%d,%d\t%s\t",
a->guild_id,a->opposition,a->name);
}
// 捛曻儕僗僩
for(i=0,c=0;i<MAX_GUILDEXPLUSION;i++)
if(g->explusion[i].account_id>0)
c++;
len+=sprintf(str+len,"%d\t",c);
for(i=0;i<MAX_GUILDEXPLUSION;i++){
struct guild_explusion *e=&g->explusion[i];
if(e->account_id>0)
len+=sprintf(str+len,"%d,%d,%d,%d\t%s\t%s\t%s#\t",
e->account_id,e->rsv1,e->rsv2,e->rsv3,
e->name,e->acc,e->mes );
}
// 僊儖僪僗僉儖
for(i=0;i<MAX_GUILDSKILL;i++){
len+=sprintf(str+len,"%d,%d ",g->skill[i].id,g->skill[i].lv);
}
len+=sprintf(str+len,"\t");
return 0;
}
// 僊儖僪僨乕僞偺暥帤楍偐傜偺曄姺
int inter_guild_fromstr(char *str,struct guild *g)
{
int i,j,c;
int tmp_int[16];
char tmp_str[4][256];
char tmp_str2[4096];
char *pstr;
// 婎杮僨乕僞
memset(g,0,sizeof(struct guild));
if( sscanf(str,"%d\t%[^\t]\t%[^\t]\t%d,%d,%d,%d,%d\t%[^\t]\t%[^\t]\t",&tmp_int[0],
tmp_str[0],tmp_str[1],
&tmp_int[1],&tmp_int[2],&tmp_int[3],&tmp_int[4],&tmp_int[5],
tmp_str[2],tmp_str[3]) <8)
return 1;
g->guild_id=tmp_int[0];
g->guild_lv=tmp_int[1];
g->max_member=tmp_int[2];
g->exp=tmp_int[3];
g->skill_point=tmp_int[4];
g->castle_id=tmp_int[5];
memcpy(g->name,tmp_str[0],24);
memcpy(g->master,tmp_str[1],24);
memcpy(g->mes1,tmp_str[2],60);
memcpy(g->mes2,tmp_str[3],120);
g->mes1[strlen(g->mes1)-1]=0;
g->mes2[strlen(g->mes2)-1]=0;
for(j=0;j<6 && str!=NULL;j++) // 埵抲僗僉僢僾
str=strchr(str+1,'\t');
// printf("GuildBaseInfo OK\n");
// 儊儞僶乕
for(i=0;i<g->max_member;i++){
struct guild_member *m = &g->member[i];
if( sscanf(str+1,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\t%[^\t]\t",
&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_str[0]) <11)
return 1;
m->account_id=tmp_int[0];
m->char_id=tmp_int[1];
m->hair=tmp_int[2];
m->hair_color=tmp_int[3];
m->gender=tmp_int[4];
m->class=tmp_int[5];
m->lv=tmp_int[6];
m->exp=tmp_int[7];
m->exp_payper=tmp_int[8];
m->position=tmp_int[9];
memcpy(m->name,tmp_str[0],24);
for(j=0;j<2 && str!=NULL;j++) // 埵抲僗僉僢僾
str=strchr(str+1,'\t');
}
// printf("GuildMemberInfo OK\n");
// 栶怑
for(i=0;i<MAX_GUILDPOSITION;i++){
struct guild_position *p = &g->position[i];
if( sscanf(str+1,"%d,%d\t%[^\t]\t",
&tmp_int[0],&tmp_int[1],tmp_str[0]) < 3)
return 1;
p->mode=tmp_int[0];
p->exp_mode=tmp_int[1];
tmp_str[0][strlen(tmp_str[0])-1]=0;
memcpy(p->name,tmp_str[0],24);
for(j=0;j<2 && str!=NULL;j++) // 埵抲僗僉僢僾
str=strchr(str+1,'\t');
}
// printf("GuildPositionInfo OK\n");
// 僄儞僽儗儉
tmp_int[1]=0;
if( sscanf(str+1,"%d,%d,%[^\t]\t",&tmp_int[0],&tmp_int[1],tmp_str2)< 3 &&
sscanf(str+1,"%d,%[^\t]\t",&tmp_int[0],tmp_str2) < 2 )
return 1;
g->emblem_len=tmp_int[0];
g->emblem_id=tmp_int[1];
for(i=0,pstr=tmp_str2;i<g->emblem_len;i++,pstr+=2){
int c1=pstr[0],c2=pstr[1],x1=0,x2=0;
if(c1>='0' && c1<='9')x1=c1-'0';
if(c1>='a' && c1<='f')x1=c1-'a'+10;
if(c1>='A' && c1<='F')x1=c1-'A'+10;
if(c2>='0' && c2<='9')x2=c2-'0';
if(c2>='a' && c2<='f')x2=c2-'a'+10;
if(c2>='A' && c2<='F')x2=c2-'A'+10;
g->emblem_data[i]=(x1<<4)|x2;
}
// printf("GuildEmblemInfo OK\n");
str=strchr(str+1,'\t'); // 埵抲僗僉僢僾
// 摨柨儕僗僩
if( sscanf(str+1,"%d\t",&c)< 1)
return 1;
str=strchr(str+1,'\t'); // 埵抲僗僉僢僾
for(i=0;i<c;i++){
struct guild_alliance *a = &g->alliance[i];
if( sscanf(str+1,"%d,%d\t%[^\t]\t",
&tmp_int[0],&tmp_int[1],tmp_str[0]) < 3)
return 1;
a->guild_id=tmp_int[0];
a->opposition=tmp_int[1];
memcpy(a->name,tmp_str[0],24);
for(j=0;j<2 && str!=NULL;j++) // 埵抲僗僉僢僾
str=strchr(str+1,'\t');
}
// printf("GuildAllianceInfo OK\n");
// 捛曻儕僗僩
if( sscanf(str+1,"%d\t",&c)< 1)
return 1;
str=strchr(str+1,'\t'); // 埵抲僗僉僢僾
for(i=0;i<c;i++){
struct guild_explusion *e = &g->explusion[i];
if( sscanf(str+1,"%d,%d,%d,%d\t%[^\t]\t%[^\t]\t%[^\t]\t",
&tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
tmp_str[0],tmp_str[1],tmp_str[2]) < 6)
return 1;
e->account_id=tmp_int[0];
e->rsv1=tmp_int[1];
e->rsv2=tmp_int[2];
e->rsv3=tmp_int[3];
memcpy(e->name,tmp_str[0],24);
memcpy(e->acc,tmp_str[1],24);
tmp_str[2][strlen(tmp_str[2])-1]=0;
memcpy(e->mes,tmp_str[2],40);
for(j=0;j<4 && str!=NULL;j++) // 埵抲僗僉僢僾
str=strchr(str+1,'\t');
}
// printf("GuildExplusionInfo OK\n");
// 僊儖僪僗僉儖
for(i=0;i<MAX_GUILDSKILL;i++){
if( sscanf(str+1,"%d,%d ",&tmp_int[0],&tmp_int[1]) <2)
break;
g->skill[i].id=tmp_int[0];
g->skill[i].lv=tmp_int[1];
str=strchr(str+1,' ');
}
str=strchr(str+1,'\t');
// printf("GuildSkillInfo OK\n");
return 0;
}
// 僊儖僪忛僨乕僞偺暥帤楍傊偺曄姺
int inter_guildcastle_tostr(char *str,struct guild_castle *gc)
{
// int i,c;
int len;
len=sprintf(str,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
gc->castle_id,gc->guild_id,gc->economy,gc->defense,gc->triggerE,
gc->triggerD,gc->nextTime,gc->payTime,gc->createTime,gc->visibleC,
gc->visibleG0,gc->visibleG1,gc->visibleG2,gc->visibleG3,gc->visibleG4,
gc->visibleG5,gc->visibleG6,gc->visibleG7);
return 0;
}
// 僊儖僪忛僨乕僞偺暥帤楍偐傜偺曄姺
int inter_guildcastle_fromstr(char *str,struct guild_castle *gc)
{
// int i,j,c;
int tmp_int[20];
memset(gc,0,sizeof(struct guild_castle));
if( sscanf(str,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
&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],&tmp_int[11],&tmp_int[12],&tmp_int[13],
&tmp_int[14],&tmp_int[15],&tmp_int[16],&tmp_int[17]) <18 )
return 1;
gc->castle_id=tmp_int[0];
gc->guild_id=tmp_int[1];
gc->economy=tmp_int[2];
gc->defense=tmp_int[3];
gc->triggerE=tmp_int[4];
gc->triggerD=tmp_int[5];
gc->nextTime=tmp_int[6];
gc->payTime=tmp_int[7];
gc->createTime=tmp_int[8];
gc->visibleC=tmp_int[9];
gc->visibleG0=tmp_int[10];
gc->visibleG1=tmp_int[11];
gc->visibleG2=tmp_int[12];
gc->visibleG3=tmp_int[13];
gc->visibleG4=tmp_int[14];
gc->visibleG5=tmp_int[15];
gc->visibleG6=tmp_int[16];
gc->visibleG7=tmp_int[17];
return 0;
}
// 僊儖僪娭楢僨乕僞儀乕僗撉傒崬傒
int inter_guild_readdb()
{
int i;
FILE *fp;
char line[1024];
fp=fopen("db/exp_guild.txt","r");
if(fp==NULL){
printf("can't read db/exp_guild.txt\n");
return 1;
}
i=0;
while(fgets(line,256,fp) && i<100){
if(line[0]=='/' && line[1]=='/')
continue;
guild_exp[i]=atoi(line);
i++;
}
fclose(fp);
return 0;
}
// 僊儖僪僨乕僞偺撉傒崬傒
int inter_guild_init()
{
char line[16384];
struct guild *g;
struct guild_castle *gc;
FILE *fp;
int i,c=0;
inter_guild_readdb();
guild_db=numdb_init();
castle_db=numdb_init();
if( (fp=fopen(guild_txt,"r"))==NULL )
return 1;
while(fgets(line,sizeof(line),fp)){
int i,j=0;
if( sscanf(line,"%d\t%%newid%%\n%n",&i,&j)==1 && j>0 && guild_newid<=i){
guild_newid=i;
continue;
}
g=calloc(sizeof(struct guild), 1);
if(g==NULL){
printf("int_guild: out of memory!\n");
exit(0);
}
memset(g,0,sizeof(struct guild));
if(inter_guild_fromstr(line,g)==0 && g->guild_id>0){
if( g->guild_id >= guild_newid)
guild_newid=g->guild_id+1;
numdb_insert(guild_db,g->guild_id,g);
guild_check_empty(g);
guild_calcinfo(g);
}else{
printf("int_guild: broken data [%s] line %d\n",guild_txt,c);
free(g);
}
c++;
}
fclose(fp);
// printf("int_guild: %s read done (%d guilds)\n",guild_txt,c);
c=0;//僇僂儞僞弶婜壔
if( (fp=fopen(castle_txt,"r"))==NULL ){
return 1;
}
while(fgets(line,sizeof(line),fp)){
gc=calloc(sizeof(struct guild_castle), 1);
if(gc==NULL){
printf("int_guild: out of memory!\n");
exit(0);
}
memset(gc,0,sizeof(struct guild_castle));
if(inter_guildcastle_fromstr(line,gc)==0){
numdb_insert(castle_db,gc->castle_id,gc);
}else{
printf("int_guild: broken data [%s] line %d\n",castle_txt,c);
free(gc);
}
c++;
}
if(!c){
printf(" %s - making Default Data...\n",castle_txt);
//僨僼僅儖僩僨乕僞傪嶌惉
for(i=0;i<MAX_GUILDCASTLE;i++){
gc=calloc(sizeof(struct guild_castle), 1);
if(gc==NULL){
printf("int_guild: out of memory!\n");
exit(0);
}
memset(gc,0,sizeof(struct guild_castle));
gc->castle_id=i;
gc->guild_id=0;
gc->economy=0;
gc->defense=0;
gc->triggerE=0;
gc->triggerD=0;
gc->nextTime=0;
gc->payTime=0;
gc->createTime=0;
gc->visibleC=0;
gc->visibleG0=0;
gc->visibleG1=0;
gc->visibleG2=0;
gc->visibleG3=0;
gc->visibleG4=0;
gc->visibleG5=0;
gc->visibleG6=0;
gc->visibleG7=0;
numdb_insert(castle_db,gc->castle_id,gc);
}
printf(" %s - making done\n",castle_txt);
return 0;
}
fclose(fp);
return 0;
}
struct guild *inter_guild_search(int guild_id)
{
struct guild *g;
g=numdb_search(guild_db,guild_id);
return g;
}
// 僊儖僪僨乕僞偺僙乕僽梡
int inter_guild_save_sub(void *key,void *data,va_list ap)
{
char line[16384];
FILE *fp;
inter_guild_tostr(line,(struct guild *)data);
fp=va_arg(ap,FILE *);
fprintf(fp,"%s" RETCODE,line);
return 0;
}
// 僊儖僪忛僨乕僞偺僙乕僽梡
int inter_castle_save_sub(void *key,void *data,va_list ap)
{
char line[16384];
FILE *fp;
inter_guildcastle_tostr(line,(struct guild_castle *)data);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -