⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 int_guild.c

📁 传奇3源程序, 用vc开发的
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -