📄 int_guild.c
字号:
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 + -