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

📄 int_guild.c

📁 传奇3源程序, 用vc开发的
💻 C
📖 第 1 页 / 共 3 页
字号:
	fp=va_arg(ap,FILE *);
	fprintf(fp,"%s" RETCODE,line);
	return 0;
}

// 僊儖僪僨乕僞偺僙乕僽
int inter_guild_save()
{
	FILE *fp;
	int lock;
	if( (fp=lock_fopen(guild_txt,&lock))==NULL ){
		printf("int_guild: cant write [%s] !!! data is lost !!!\n",guild_txt);
		return 1;
	}
	numdb_foreach(guild_db,inter_guild_save_sub,fp);
//	fprintf(fp,"%d\t%%newid%%\n",guild_newid);
	lock_fclose(fp,guild_txt,&lock);
//	printf("int_guild: %s saved.\n",guild_txt);

	if( (fp=lock_fopen(castle_txt,&lock))==NULL ){
		printf("int_guild: cant write [%s] !!! data is lost !!!\n",castle_txt);
		return 1;
	}
	numdb_foreach(castle_db,inter_castle_save_sub,fp);
	lock_fclose(fp,castle_txt,&lock);

	return 0;
}

// 僊儖僪柤専嶕梡
int search_guildname_sub(void *key,void *data,va_list ap)
{
	struct guild *g=(struct guild *)data,**dst;
	char *str;
	str=va_arg(ap,char *);
	dst=va_arg(ap,struct guild **);
	if(strcmpi(g->name,str)==0)
		*dst=g;
	return 0;
}
// 僊儖僪柤専嶕
struct guild* search_guildname(char *str)
{
	struct guild *g=NULL;
	numdb_foreach(guild_db,search_guildname_sub,str,&g);
	return g;
}

// 僊儖僪偑嬻偐偳偆偐僠僃僢僋
int guild_check_empty(struct guild *g)
{
	int i;
	for(i=0;i<g->max_member;i++){
		if(g->member[i].account_id>0){
			return 0;
		}
	}
		// 扤傕偄側偄偺偱夝嶶
	numdb_foreach(guild_db,guild_break_sub,g->guild_id);
	numdb_erase(guild_db,g->guild_id);
	inter_guild_storage_delete(g->guild_id);
	mapif_guild_broken(g->guild_id,0);
	free(g);
	return 1;
}
// 僉儍儔偺嫞崌偑側偄偐僠僃僢僋梡
int guild_check_conflict_sub(void *key,void *data,va_list ap)
{
	struct guild *g=(struct guild *)data;
	int guild_id,account_id,char_id,i;
	
	guild_id=va_arg(ap,int);
	account_id=va_arg(ap,int);
	char_id=va_arg(ap,int);
	
	if( g->guild_id==guild_id )	// 杮棃偺強懏側偺偱栤戣側偟
		return 0;
	
	for(i=0;i<MAX_GUILD;i++){
		if(g->member[i].account_id==account_id && g->member[i].char_id==char_id){
			// 暿偺僊儖僪偵婾偺強懏僨乕僞偑偁傞偺偱扙戅
			printf("int_guild: guild conflict! %d,%d %d!=%d\n",account_id,char_id,guild_id,g->guild_id);
			mapif_parse_GuildLeave(-1,g->guild_id,account_id,char_id,0,"**僨乕僞嫞崌**");
		}
	}
	
	return 0;
}
// 僉儍儔偺嫞崌偑側偄偐僠僃僢僋
int guild_check_conflict(int guild_id,int account_id,int char_id)
{
	numdb_foreach(guild_db,guild_check_conflict_sub,guild_id,account_id,char_id);
	return 0;
}

int guild_nextexp(int level)
{
	if(level < 100)
		return guild_exp[level-1];

	return 0;
}

// 僊儖僪僗僉儖偑偁傞偐妋擣
int guild_checkskill(struct guild *g,int id){ return g->skill[id-10000].lv; }

// 僊儖僪偺忣曬偺嵞寁嶼
int guild_calcinfo(struct guild *g)
{
	int i,c,nextexp;
	struct guild before=*g;

	// 僗僉儖ID偺愝掕
	for(i=0;i<5;i++)
		g->skill[i].id=i+10000;

	// 僊儖僪儗儀儖
	if(g->guild_lv<=0) g->guild_lv=1;
	nextexp = guild_nextexp(g->guild_lv);
	if(nextexp > 0) {
		while(g->exp >= nextexp){	// 儗儀儖傾僢僾張棟
			g->exp-=nextexp;
			g->guild_lv++;
			g->skill_point++;
			nextexp = guild_nextexp(g->guild_lv);
		}
	}
	
	// 僊儖僪偺師偺宱尡抣
	g->next_exp = guild_nextexp(g->guild_lv);

	// 儊儞僶忋尷乮僊儖僪奼挘揔梡乯
	g->max_member=16+guild_checkskill(g,10004)*2;

	// 暯嬒儗儀儖偲僆儞儔僀儞恖悢
	g->average_lv=0;
	g->connect_member=0;
	for(i=c=0;i<g->max_member;i++){
		if(g->member[i].account_id>0){
			g->average_lv+=g->member[i].lv;
			c++;
			
			if(g->member[i].online>0)
				g->connect_member++;
		}
	}
	g->average_lv/=c;
	
	// 慡僨乕僞傪憲傞昁梫偑偁傝偦偆
	if(	g->max_member!=before.max_member	||
		g->guild_lv!=before.guild_lv		||
		g->skill_point!=before.skill_point	){
		mapif_guild_info(-1,g);
		return 1;
	}
		
	return 0;
}

//-------------------------------------------------------------------
// map server傊偺捠怣

// 僊儖僪嶌惉壜斲
int mapif_guild_created(int fd,int account_id,struct guild *g)
{
	WFIFOW(fd,0)=0x3830;
	WFIFOL(fd,2)=account_id;
	if(g!=NULL){
		WFIFOL(fd,6)=g->guild_id;
		printf("int_guild: created! %d %s\n",g->guild_id,g->name);
	}else{
		WFIFOL(fd,6)=0;
	}
	WFIFOSET(fd,10);
	return 0;
}
// 僊儖僪忣曬尒偮偐傜偢
int mapif_guild_noinfo(int fd,int guild_id)
{
	WFIFOW(fd,0)=0x3831;
	WFIFOW(fd,2)=8;
	WFIFOL(fd,4)=guild_id;
	WFIFOSET(fd,8);
	printf("int_guild: info not found %d\n",guild_id);
	return 0;
}
// 僊儖僪忣曬傑偲傔憲傝
int mapif_guild_info(int fd,struct guild *g)
{
	unsigned char buf[16384];
	WBUFW(buf,0)=0x3831;
	memcpy(buf+4,g,sizeof(struct guild));
	WBUFW(buf,2)=4+sizeof(struct guild);
//	printf("int_guild: sizeof(guild)=%d\n",sizeof(struct guild));
	if(fd<0)
		mapif_sendall(buf,WBUFW(buf,2));
	else
		mapif_send(fd,buf,WBUFW(buf,2));
//	printf("int_guild: info %d %s\n",p->guild_id,p->name);
	return 0;
}
// 儊儞僶捛壛壜斲
int mapif_guild_memberadded(int fd,int guild_id,int account_id,int char_id,int flag)
{
	WFIFOW(fd,0)=0x3832;
	WFIFOL(fd,2)=guild_id;
	WFIFOL(fd,6)=account_id;
	WFIFOL(fd,10)=char_id;
	WFIFOB(fd,14)=flag;
	WFIFOSET(fd,15);
	return 0;
}
// 扙戅/捛曻捠抦
int mapif_guild_leaved(int guild_id,int account_id,int char_id,int flag,
	const char *name,const char *mes)
{
	unsigned char buf[128];
	WBUFW(buf, 0)=0x3834;
	WBUFL(buf, 2)=guild_id;
	WBUFL(buf, 6)=account_id;
	WBUFL(buf,10)=char_id;
	WBUFB(buf,14)=flag;
	memcpy(WBUFP(buf,15),mes,40);
	memcpy(WBUFP(buf,55),name,24);
	mapif_sendall(buf,79);
	printf("int_guild: guild leaved %d %d %s %s\n",guild_id,account_id,name,mes);
	return 0;
}
// 僆儞儔僀儞忬懺偲Lv峏怴捠抦
int mapif_guild_memberinfoshort(struct guild *g,int idx)
{
	unsigned char buf[32];
	WBUFW(buf, 0)=0x3835;
	WBUFL(buf, 2)=g->guild_id;
	WBUFL(buf, 6)=g->member[idx].account_id;
	WBUFL(buf,10)=g->member[idx].char_id;
	WBUFB(buf,14)=g->member[idx].online;
	WBUFW(buf,15)=g->member[idx].lv;
	WBUFW(buf,17)=g->member[idx].class;
	mapif_sendall(buf,19);
	return 0;
}
// 夝嶶捠抦
int mapif_guild_broken(int guild_id,int flag)
{
	unsigned char buf[16];
	WBUFW(buf,0)=0x3836;
	WBUFL(buf,2)=guild_id;
	WBUFB(buf,6)=flag;
	mapif_sendall(buf,7);
	printf("int_guild: broken %d\n",guild_id);
	return 0;
}
// 僊儖僪撪敪尵
int mapif_guild_message(int guild_id,int account_id,char *mes,int len)
{
	unsigned char buf[512];
	WBUFW(buf,0)=0x3837;
	WBUFW(buf,2)=len+12;
	WBUFL(buf,4)=guild_id;
	WBUFL(buf,8)=account_id;
	memcpy(WBUFP(buf,12),mes,len);
	mapif_sendall(buf,len+12);
	return 0;
}

// 僊儖僪婎杮忣曬曄峏捠抦
int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len)
{
	unsigned char buf[2048];
	WBUFW(buf, 0)=0x3839;
	WBUFW(buf, 2)=len+10;
	WBUFL(buf, 4)=guild_id;
	WBUFW(buf, 8)=type;
	memcpy(WBUFP(buf,10),data,len);
	mapif_sendall(buf,len+10);
	return 0;
}
// 僊儖僪儊儞僶忣曬曄峏捠抦
int mapif_guild_memberinfochanged(int guild_id,int account_id,int char_id,
	int type,const void *data,int len)
{
	unsigned char buf[2048];
	WBUFW(buf, 0)=0x383a;
	WBUFW(buf, 2)=len+18;
	WBUFL(buf, 4)=guild_id;
	WBUFL(buf, 8)=account_id;
	WBUFL(buf,12)=char_id;
	WBUFW(buf,16)=type;
	memcpy(WBUFP(buf,18),data,len);
	mapif_sendall(buf,len+18);
	return 0;
}
// 僊儖僪僗僉儖傾僢僾捠抦
int mapif_guild_skillupack(int guild_id,int skill_num,int account_id)
{
	unsigned char buf[16];
	WBUFW(buf, 0)=0x383c;
	WBUFL(buf, 2)=guild_id;
	WBUFL(buf, 6)=skill_num;
	WBUFL(buf,10)=account_id;
	mapif_sendall(buf,14);
	return 0;
}
// 僊儖僪摨柨/揋懳捠抦
int mapif_guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2,
	int flag,const char *name1,const char *name2)
{
	unsigned char buf[128];
	WBUFW(buf, 0)=0x383d;
	WBUFL(buf, 2)=guild_id1;
	WBUFL(buf, 6)=guild_id2;
	WBUFL(buf,10)=account_id1;
	WBUFL(buf,14)=account_id2;
	WBUFB(buf,18)=flag;
	memcpy(WBUFP(buf,19),name1,24);
	memcpy(WBUFP(buf,43),name2,24);
	mapif_sendall(buf,67);
	return 0;
}

// 僊儖僪栶怑曄峏捠抦
int mapif_guild_position(struct guild *g,int idx)
{
	unsigned char buf[128];
	WBUFW(buf,0)=0x383b;
	WBUFW(buf,2)=sizeof(struct guild_position)+12;
	WBUFL(buf,4)=g->guild_id;
	WBUFL(buf,8)=idx;
	memcpy(WBUFP(buf,12),&g->position[idx],sizeof(struct guild_position));
	mapif_sendall(buf,WBUFW(buf,2));
	return 0;
}

// 僊儖僪崘抦曄峏捠抦
int mapif_guild_notice(struct guild *g)
{
	unsigned char buf[256];
	WBUFW(buf,0)=0x383e;
	WBUFL(buf,2)=g->guild_id;
	memcpy(WBUFP(buf,6),g->mes1,60);
	memcpy(WBUFP(buf,66),g->mes2,120);
	mapif_sendall(buf,186);
	return 0;
}
// 僊儖僪僄儞僽儗儉曄峏捠抦
int mapif_guild_emblem(struct guild *g)
{
	unsigned char buf[2048];
	WBUFW(buf,0)=0x383f;
	WBUFW(buf,2)=g->emblem_len+12;
	WBUFL(buf,4)=g->guild_id;
	WBUFL(buf,8)=g->emblem_id;
	memcpy(WBUFP(buf,12),g->emblem_data,g->emblem_len);
	mapif_sendall(buf,WBUFW(buf,2));
	return 0;
}

int mapif_guild_castle_dataload(int castle_id,int index,int value)
{
	unsigned char buf[16];
	WBUFW(buf, 0)=0x3840;
	WBUFW(buf, 2)=castle_id;
	WBUFB(buf, 4)=index;
	WBUFL(buf, 5)=value;
	mapif_sendall(buf,9);
	return 0;
}

int mapif_guild_castle_datasave(int castle_id,int index,int value)
{
	unsigned char buf[16];
	WBUFW(buf, 0)=0x3841;
	WBUFW(buf, 2)=castle_id;
	WBUFB(buf, 4)=index;
	WBUFL(buf, 5)=value;
	mapif_sendall(buf,9);
	return 0;
}

int mapif_guild_castle_alldataload_sub(void *key,void *data,va_list ap)
{
	int fd=va_arg(ap,int);
	int *p=va_arg(ap,int*);
	memcpy(WFIFOP(fd,*p),(struct guild_castle*)data,sizeof(struct guild_castle));
	(*p)+=sizeof(struct guild_castle);
	return 0;
}

int mapif_guild_castle_alldataload(int fd)
{
	int len=4;
	WFIFOW(fd,0)=0x3842;
	numdb_foreach(castle_db,mapif_guild_castle_alldataload_sub,fd,&len);
	WFIFOW(fd,2)=len;
	WFIFOSET(fd,len);
	return 0;
}

//-------------------------------------------------------------------
// map server偐傜偺捠怣


// 僊儖僪嶌惉梫媮
int mapif_parse_CreateGuild(int fd,int account_id,char *name,struct guild_member *master)
{
	struct guild *g;
	int i;
	
	for(i=0;i<24 && name[i];i++){
		if( !(name[i]&0xe0) || name[i]==0x7f){
			printf("int_guild: illeagal guild name [%s]\n",name);
			mapif_guild_created(fd,account_id,NULL);
			return 0;
		}
	}
	
	if( (g=search_guildname(name))!=NULL){
		printf("int_guild: same name guild exists [%s]\n",name);
		mapif_guild_created(fd,account_id,NULL);
		return 0;
	}
	g=calloc(sizeof(struct guild), 1);
	if(g==NULL){
		printf("int_guild: CreateGuild: out of memory !\n");
		mapif_guild_created(fd,account_id,NULL);
		return 0;
	}
	memset(g,0,sizeof(struct guild));
	g->guild_id=guild_newid++;
	memcpy(g->name,name,24);
	memcpy(g->master,master->name,24);
	memcpy(&g->member[0],master,sizeof(struct guild_member));
	
	g->position[0].mode=0x11;
	strcpy(g->position[                  0].name,"GuildMaster");
	strcpy(g->position[MAX_GUILDPOSITION-1].name,"Newbie");
	for(i=1;i<MAX_GUILDPOSITION-1;i++)
		sprintf(g->position[i].name,"Position %d",i+1);
	
	// 偙偙偱僊儖僪忣曬寁嶼偑昁梫偲巚傢傟傞
	g->max_member=16;

⌨️ 快捷键说明

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