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

📄 party.c

📁 最新的仙镜传说服务器C语言源码
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "party.h"#include "db.h"#include "timer.h"#include "pc.h"#include "map.h"#include "battle.h"#include "intif.h"#include "clif.h"#include "socket.h"#define PARTY_SEND_XYHP_INVERVAL	1000	// 嵗昗傗俫俹憲怣偺娫妘static struct dbt* party_db;int party_send_xyhp_timer(int tid,unsigned int tick,int id,int data);// 弶婜壔void do_init_party(void){	party_db=numdb_init();	add_timer_func_list(party_send_xyhp_timer,"party_send_xyhp_timer");	add_timer_interval(gettick()+PARTY_SEND_XYHP_INVERVAL,party_send_xyhp_timer,0,0,PARTY_SEND_XYHP_INVERVAL);}// 専嶕struct party *party_search(int party_id){	return numdb_search(party_db,party_id);}// 嶌惉梫媮int party_create(struct map_session_data *sd,char *name){	if(sd->status.party_id==0)		intif_create_party(sd,name);	else		clif_party_created(sd,2);	return 0;}// 嶌惉壜斲int party_created(int account_id,int fail,int party_id,char *name){	struct map_session_data *sd;	sd=map_id2sd(account_id);	if(sd==NULL)		return 0;		if(fail==0){		struct party *p;		sd->status.party_id=party_id;		if((p=numdb_search(party_db,party_id))!=NULL){			printf("party: id already exists!\n");			exit(1);		}		p=calloc(sizeof(struct party), 1);		if(p==NULL){			printf("party: out of memory!\n");			exit(1);		}		p->party_id=party_id;		memcpy(p->name,name,24);		numdb_insert(party_db,party_id,p);		clif_party_created(sd,0);	}else{		clif_party_created(sd,1);	}	return 0;}// 忣曬梫媮int party_request_info(int party_id){	return intif_request_partyinfo(party_id);}// 強懏僉儍儔偺妋擣int party_check_member(struct party *p){	int i;	struct map_session_data *sd;	for(i=0;i<fd_max;i++){		if(session[i] && (sd=session[i]->session_data) && sd->state.auth){			if(sd->status.party_id==p->party_id){				int j,f=1;				for(j=0;j<MAX_PARTY;j++){	// 僷乕僥傿偵僨乕僞偑偁傞偐妋擣					if(	p->member[j].account_id==sd->status.account_id){						if(	strcmp(p->member[j].name,sd->status.name)==0 )							f=0;	// 僨乕僞偑偁傞						else							p->member[j].sd=NULL;	// 摨岰暿僉儍儔偩偭偨					}				}				if(f){					sd->status.party_id=0;					if(battle_config.error_log)						printf("party: check_member %d[%s] is not member\n",sd->status.account_id,sd->status.name);				}			}		}	}	return 0;}// 忣曬強摼幐攕乮偦偺ID偺僉儍儔傪慡晹枹強懏偵偡傞乯int party_recv_noinfo(int party_id){	int i;	struct map_session_data *sd;	for(i=0;i<fd_max;i++){		if(session[i] && (sd=session[i]->session_data) && sd->state.auth){			if(sd->status.party_id==party_id)				sd->status.party_id=0;		}	}	return 0;}// 忣曬強摼int party_recv_info(struct party *sp){	struct party *p;	int i;		if((p=numdb_search(party_db,sp->party_id))==NULL){		p=calloc(sizeof(struct party), 1);		if(p==NULL){			printf("party: out of memory!\n");			exit(1);		}		numdb_insert(party_db,sp->party_id,p);				// 嵟弶偺儘乕僪側偺偱儐乕僓乕偺僠僃僢僋傪峴偆		party_check_member(sp);	}	memcpy(p,sp,sizeof(struct party));		for(i=0;i<MAX_PARTY;i++){	// sd偺愝掕		struct map_session_data *sd = map_id2sd(p->member[i].account_id);		p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id)?sd:NULL;	}	clif_party_info(p,-1);	for(i=0;i<MAX_PARTY;i++){	// 愝掕忣曬偺憲怣//		struct map_session_data *sd = map_id2sd(p->member[i].account_id);		struct map_session_data *sd = p->member[i].sd;		if(sd!=NULL && sd->party_sended==0){			clif_party_option(p,sd,0x100);			sd->party_sended=1;		}	}		return 0;}// 僷乕僥傿傊偺姪桿int party_invite(struct map_session_data *sd,int account_id){	struct map_session_data *tsd= map_id2sd(account_id);	struct party *p=party_search(sd->status.party_id);	int i;		if(tsd==NULL || p==NULL)		return 0;	if( tsd->status.party_id>0 || tsd->party_invite>0 ){	// 憡庤偺強懏妋擣		clif_party_inviteack(sd,tsd->status.name,0);		return 0;	}	for(i=0;i<MAX_PARTY;i++){	// 摨傾僇僂儞僩妋擣		if(p->member[i].account_id==account_id){			clif_party_inviteack(sd,tsd->status.name,0);			return 0;		}	}		tsd->party_invite=sd->status.party_id;	tsd->party_invite_account=sd->status.account_id;	clif_party_invite(sd,tsd);	return 0;}// 僷乕僥傿姪桿傊偺曉摎int party_reply_invite(struct map_session_data *sd,int account_id,int flag){	struct map_session_data *tsd= map_id2sd(account_id);	if(flag==1){	// 彸戻		//inter嶪傊捛壛梫媮		intif_party_addmember( sd->party_invite, sd->status.account_id );		return 0;	}	else {		// 嫅斲		sd->party_invite=0;		sd->party_invite_account=0;		if(tsd==NULL)			return 0;		clif_party_inviteack(tsd,sd->status.name,1);	}	return 0;}// 僷乕僥傿偑捛壛偝傟偨int party_member_added(int party_id,int account_id,int flag){	struct map_session_data *sd= map_id2sd(account_id),*sd2;	if(sd==NULL && flag==0){		if(battle_config.error_log)			printf("party: member added error %d is not online\n",account_id);		intif_party_leave(party_id,account_id); // 僉儍儔懁偵搊榐偱偒側偐偭偨偨傔扙戅梫媮傪弌偡		return 0;	}	sd2=map_id2sd(sd->party_invite_account);	sd->party_invite=0;	sd->party_invite_account=0;		if(flag==1){	// 幐攕		if( sd2!=NULL )			clif_party_inviteack(sd2,sd->status.name,0);		return 0;	}			// 惉岟	sd->party_sended=0;	sd->status.party_id=party_id;		if( sd2!=NULL)		clif_party_inviteack(sd2,sd->status.name,2);	// 偄偪偍偆嫞崌妋擣	party_check_conflict(sd);	return 0;}// 僷乕僥傿彍柤梫媮int party_removemember(struct map_session_data *sd,int account_id,char *name){	struct party *p = party_search(sd->status.party_id);	int i;	if(p==NULL)		return 0;	for(i=0;i<MAX_PARTY;i++){	// 儕乕僟乕偐偳偆偐僠僃僢僋		if(p->member[i].account_id==sd->status.account_id)			if(p->member[i].leader==0)				return 0;	}	for(i=0;i<MAX_PARTY;i++){	// 強懏偟偰偄傞偐挷傋傞		if(p->member[i].account_id==account_id){			intif_party_leave(p->party_id,account_id);			return 0;		}	}	return 0;}// 僷乕僥傿扙戅梫媮int party_leave(struct map_session_data *sd){	struct party *p = party_search(sd->status.party_id);	int i;	if(p==NULL)		return 0;		for(i=0;i<MAX_PARTY;i++){	// 強懏偟偰偄傞偐		if(p->member[i].account_id==sd->status.account_id){			intif_party_leave(p->party_id,sd->status.account_id);			return 0;		}	}	return 0;}// 僷乕僥傿儊儞僶偑扙戅偟偨int party_member_leaved(int party_id,int account_id,char *name){	struct map_session_data *sd=map_id2sd(account_id);	struct party *p=party_search(party_id);	if(p!=NULL){		int i;		for(i=0;i<MAX_PARTY;i++)			if(p->member[i].account_id==account_id){				clif_party_leaved(p,sd,account_id,name,0x00);				p->member[i].account_id=0;				p->member[i].sd=NULL;			}	}	if(sd!=NULL && sd->status.party_id==party_id){		sd->status.party_id=0;		sd->party_sended=0;	}	return 0;}// 僷乕僥傿夝嶶捠抦int party_broken(int party_id){	struct party *p;	int i;	if( (p=party_search(party_id))==NULL )		return 0;		for(i=0;i<MAX_PARTY;i++){		if(p->member[i].sd!=NULL){			clif_party_leaved(p,p->member[i].sd,				p->member[i].account_id,p->member[i].name,0x10);			p->member[i].sd->status.party_id=0;			p->member[i].sd->party_sended=0;		}	}	numdb_erase(party_db,party_id);	return 0;}// 僷乕僥傿偺愝掕曄峏梫媮int party_changeoption(struct map_session_data *sd,int exp,int item){	struct party *p;	if( sd->status.party_id==0 || (p=party_search(sd->status.party_id))==NULL )		return 0;	intif_party_changeoption(sd->status.party_id,sd->status.account_id,exp,item);	return 0;}// 僷乕僥傿偺愝掕曄峏捠抦int party_optionchanged(int party_id,int account_id,int exp,int item,int flag){	struct party *p;	struct map_session_data *sd=map_id2sd(account_id);	if( (p=party_search(party_id))==NULL)		return 0;	if(!(flag&0x01)) p->exp=exp;	if(!(flag&0x10)) p->item=item;	clif_party_option(p,sd,flag);	return 0;}// 僷乕僥傿儊儞僶偺堏摦捠抦int party_recv_movemap(int party_id,int account_id,char *map,int online,int lv){	struct party *p;	int i;	if( (p=party_search(party_id))==NULL)		return 0;	for(i=0;i<MAX_PARTY;i++){		struct party_member *m=&p->member[i];		if(m->account_id==account_id){			memcpy(m->map,map,16);			m->online=online;			m->lv=lv;			break;		}	}	if(i==MAX_PARTY){		if(battle_config.error_log)			printf("party: not found member %d on %d[%s]",account_id,party_id,p->name);		return 0;	}		for(i=0;i<MAX_PARTY;i++){	// sd嵞愝掕		struct map_session_data *sd= map_id2sd(p->member[i].account_id);		p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id)?sd:NULL;	}	party_send_xy_clear(p);	// 嵗昗嵞捠抦梫惪		clif_party_info(p,-1);	return 0;}// 僷乕僥傿儊儞僶偺堏摦int party_send_movemap(struct map_session_data *sd){	struct party *p;	if( sd->status.party_id==0 )		return 0;	intif_party_changemap(sd,1);	if( sd->party_sended!=0 )	// 傕偆僷乕僥傿僨乕僞偼憲怣嵪傒		return 0;	// 嫞崌妋擣		party_check_conflict(sd);		// 偁傞側傜僷乕僥傿忣曬憲怣	if( (p=party_search(sd->status.party_id))!=NULL ){		party_check_member(p);	// 強懏傪妋擣偡傞		if(sd->status.party_id==p->party_id){			clif_party_info(p,sd->fd);			clif_party_option(p,sd,0x100);			sd->party_sended=1;		}	}		return 0;}// 僷乕僥傿儊儞僶偺儘僌傾僂僩int party_send_logout(struct map_session_data *sd){	struct party *p;	if( sd->status.party_id>0 )		intif_party_changemap(sd,0);		// sd偑柍岠偵側傞偺偱僷乕僥傿忣曬偐傜嶍彍	if( (p=party_search(sd->status.party_id))!=NULL ){		int i;		for(i=0;i<MAX_PARTY;i++)			if(p->member[i].sd==sd)				p->member[i].sd=NULL;	}		return 0;}// 僷乕僥傿儊僢僙乕僕憲怣int party_send_message(struct map_session_data *sd,char *mes,int len){	if(sd->status.party_id==0)		return 0;	intif_party_message(sd->status.party_id,sd->status.account_id,mes,len);	return 0;}// 僷乕僥傿儊僢僙乕僕庴怣int party_recv_message(int party_id,int account_id,char *mes,int len){	struct party *p;	if( (p=party_search(party_id))==NULL)		return 0;	clif_party_message(p,account_id,mes,len);	return 0;}// 僷乕僥傿嫞崌妋擣int party_check_conflict(struct map_session_data *sd){	intif_party_checkconflict(sd->status.party_id,sd->status.account_id,sd->status.name);	return 0;}// 埵抲傗俫俹捠抦梡int party_send_xyhp_timer_sub(void *key,void *data,va_list ap){	struct party *p=(struct party *)data;	int i;	for(i=0;i<MAX_PARTY;i++){		struct map_session_data *sd;		if((sd=p->member[i].sd)!=NULL){			// 嵗昗捠抦			if(sd->party_x!=sd->bl.x || sd->party_y!=sd->bl.y){				clif_party_xy(p,sd);				sd->party_x=sd->bl.x;				sd->party_y=sd->bl.y;			}			// 俫俹捠抦			if(sd->party_hp!=sd->status.hp){				clif_party_hp(p,sd);				sd->party_hp=sd->status.hp;			}					}	}	return 0;}// 埵抲傗俫俹捠抦int party_send_xyhp_timer(int tid,unsigned int tick,int id,int data){	numdb_foreach(party_db,party_send_xyhp_timer_sub,tick);	return 0;}// 埵抲捠抦僋儕傾int party_send_xy_clear(struct party *p){	int i;	for(i=0;i<MAX_PARTY;i++){		struct map_session_data *sd;		if((sd=p->member[i].sd)!=NULL){			sd->party_x=-1;			sd->party_y=-1;			sd->party_hp=-1;		}	}	return 0;}// HP捠抦偺昁梫惈専嵏梡乮map_foreachinmovearea偐傜屇偽傟傞乯int party_send_hp_check(struct block_list *bl,va_list ap){	int party_id;	int *flag;	struct map_session_data *sd=(struct map_session_data *)bl;	party_id=va_arg(ap,int);	flag=va_arg(ap,int *);		if(sd->status.party_id==party_id){		*flag=1;		sd->party_hp=-1;	}	return 0;}// 宱尡抣岞暯暘攝int party_exp_share(struct party *p,int map,int base_exp,int job_exp){	struct map_session_data *sd;	int i,c;	for(i=c=0;i<MAX_PARTY;i++)		if((sd=p->member[i].sd)!=NULL && sd->bl.m==map)			c++;	if(c==0)		return 0;	for(i=0;i<MAX_PARTY;i++)		if((sd=p->member[i].sd)!=NULL && sd->bl.m==map)			pc_gainexp(sd,base_exp/c+1,job_exp/c+1);	return 0;}// 摨偠儅僢僾偺僷乕僥傿儊儞僶乕慡懱偵張棟傪偐偗傞// type==0 摨偠儅僢僾//     !=0 夋柺撪void party_foreachsamemap(int (*func)(struct block_list*,va_list),	struct map_session_data *sd,int type,...){	struct party *p=party_search(sd->status.party_id);	va_list ap;	int i;	int x0,y0,x1,y1;	struct block_list *list[MAX_PARTY];	int blockcount=0;			if(p==NULL)		return;	x0=sd->bl.x-AREA_SIZE;	y0=sd->bl.y-AREA_SIZE;	x1=sd->bl.x+AREA_SIZE;	y1=sd->bl.y+AREA_SIZE;	va_start(ap,type);		for(i=0;i<MAX_PARTY;i++){		struct party_member *m=&p->member[i];		if(m->sd!=NULL){			if(sd->bl.m!=m->sd->bl.m)				continue;			if(type!=0 &&				(m->sd->bl.x<x0 || m->sd->bl.y<y0 ||				 m->sd->bl.x>x1 || m->sd->bl.y>y1 ) )				continue;			list[blockcount++]=&m->sd->bl; 		}	}	map_freeblock_lock();	// 儊儌儕偐傜偺夝曻傪嬛巭偡傞		for(i=0;i<blockcount;i++)		if(list[i]->prev)	// 桳岠偐偳偆偐僠僃僢僋			func(list[i],ap);	map_freeblock_unlock();	// 夝曻傪嫋壜偡傞	va_end(ap);}

⌨️ 快捷键说明

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