www.pudn.com > mycode-08[1].8.24.rar > addressbook.c


#define __ADDRESSBOOK_C_ 
#include "version.h" 
 
#include  
#include  
#include  
#include  
 
#include "addressbook.h" 
#include "char.h" 
#include "handletime.h" 
#include "buf.h" 
#include "net.h" 
#include "lssproto_serv.h" 
#include "saacproto_cli.h" 
#include "object.h" 
#include "battle.h" 
#include "configfile.h" 
#include "npcutil.h" 
#include "pet.h" 
#include "petmail.h" 
#include "log.h" 
 
/*裔烂丢永本□斥及  赢赢今[票匹烂聒允月  侬  及赢今反 
 仇木动票卞允月仇午*/ 
#define ADDRESSBOOK_FIXEDMESSAGE_MAXLEN  128 
 
/* 愤坌及蟆卞簿手中卅井匀凶及匹}失玉伊旦皮永弁卞馨笛匹五卅井匀凶 
   午五及裔烂丢永本□斥 */ 
#define ADDRESSBOOK_CANTADD "那里没有任何人。" 
#define ADDRESSBOOK_CANTADD2 "无法交换名片。" 
 
/* 簿井毛笛尹月仇午互匹五凶午五}笛尹方丹午仄凶谛卞霜耨允月丢永本□斥*/ 
#define ADDRESSBOOK_ADDED "和%s交换名片 。" 
 
/* 簿井卞涌毛创尹日木凶日 */ 
#define ADDRESSBOOK_BEINGADDED "和%s交换名片 。" 
 
/* 巨件玄伉互中匀天中分匀凶午五及丢永本□斥 */ 
#define ADDRESSBOOK_MYTABLEFULL "名片匣已满。" 
 
/* 锹澎及巨件玄伉互中匀天中分匀凶午五及丢永本□斥 */ 
#define ADDRESSBOOK_HISTABLEFULL "对方的名片匣已满。" 
 
 
/* 丢永本□斥毛霜耨允月及卞岳  仄凶午五 */ 
#define ADDRESSBOOK_SENT  "送信给%s 。" 
 
/* 丢永本□斥毛霜耨允月及卞撩  仄凶午五 */ 
#define ADDRESSBOOK_UNSENT  "无法送信给%s 。" 
 
/* 簿井毛创尹方丹午仄凶互}湃卞创尹化中凶   */ 
#define ADDRESSBOOK_ALREADYADDED  "已经和%s交换过名片了。 " 
 
/*   铜毛域  读卞  丹橇谪   */ 
#define ADDRESSBOOK_GIVEADDRESS  "从%s得到名片。" 
 
/*   铜毛域  读卞丐仆月橇谪   */ 
#define ADDRESSBOOK_TAKEADDRESS1  "给%s自己的名片。" 
/*   铜毛域  读卞丐仆月橇谪   */ 
#define ADDRESSBOOK_TAKEADDRESS2  "因为%s想要名片,所以将名片给他了。" 
 
#define	ADDRESSBOOK_RETURNED1	\ 
"从%s寄来信件,但由於没有%s的名片又将信件退回。" 
 
#define	ADDRESSBOOK_RETURNED2	\ 
"寄信件给%s,但由於%s 没有名片,所以信件又被退回来了。" 
 
#define	PETMAIL_RETURNED1	\ 
"%s不在这个世界里,所以无法寄送信件给他。" 
 
 
/* static匹银丹迕[  五中袄手*/ 
char ADDRESSBOOK_returnstring[25*128]; 
 
 
 
static int ADDRESSBOOK_findBlankEntry( int cindex ); 
static BOOL ADDRESSBOOK_makeEntryFromCharaindex( int charaindex, 
												 ADDRESSBOOK_entry* ae); 
 
/*------------------------------------------------------------ 
 * 失玉伊旦皮永弁及丢永本□斥毛霜耨允月 
 * MSG皿夫玄戊伙井日勾井歹木月[ 
 * 
 * 支月仇午反}connection井日cdkey匹腹绸仄化}平乓仿  手 
 * 甲永玄仄凶日} MSG_send允月[公及午五卞}愤坌及树  互 
 * 锹澎及伉旦玄卞卅井匀凶日窒手仄卅中午中丹仇午分[ 
 * 娄醒 
 *  cindex  int     平乓仿及index 
 *  aindex  int     失玉伊旦皮永弁及index 
 *  text    char*   霜耨允月  侬   
 *  color   int     缙 
 * 忒曰袄 
 * 左件仿奶件及平乓仿卞丢永本□斥毛霜耨仄凶日TRUE , 
 * 左白仿奶件卞瓒  仄凶日FALSE毛井尹允 
 ------------------------------------------------------------*/ 
BOOL ADDRESSBOOK_sendMessage( int cindex, int aindex, char* text , int color ) 
{ 
	int 	i ; 
	char 	tmpmsg[256]; 
	char	textbuffer[2048]; 
	char	*mycd; 
	char 	*mycharaname = CHAR_getChar(cindex,CHAR_NAME ); 
	struct  tm tm1; 
	ADDRESSBOOK_entry *ae; 
	int     playernum = CHAR_getPlayerMaxNum(); 
 
	if( !CHAR_CHECKINDEX(cindex) )return FALSE; 
 
	ae = CHAR_getAddressbookEntry( cindex , aindex ); 
	if( ae == NULL )return FALSE; 
 
	//getcdkeyFromCharaIndex(cindex, mycd,sizeof(mycd) ); 
	mycd = CHAR_getChar( cindex, CHAR_CDKEY); 
      
	memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); 
 
    snprintf( textbuffer, sizeof( textbuffer),  
    		"%2d/%02d %2d:%02d|%s|-1",  
    		tm1.tm_mon +1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min, 
    		text); 
	 
	/*   扔□田□  卞中月凛 */ 
	for( i = 0 ; i < playernum ; i ++){ 
		if( CHAR_CHECKINDEX( i) && 
			strcmp( CHAR_getChar( i, CHAR_CDKEY), ae->cdkey) == 0 && 
			strcmp( CHAR_getChar( i, CHAR_NAME), ae->charname) == 0 ) 
		{ 
			/* 
			 * CDKEY 手 平乓仿  手域谯仄凶[公及平乓仿弁正及 
			 * 失玉伊旦皮永弁卞愤坌及树  互丐月井譬屯化} 
			 * 绣箕仄凶日}MSG允月[ 
			 */ 
			int index_to_my_info =  
					ADDRESSBOOK_getIndexInAddressbook( i ,  
														mycd, mycharaname); 
 
			int		fd; 
			if( index_to_my_info < 0 ){ 
				/* 
				 * 锹澎互愤坌毛坫壅仄化仄引匀化月[ 
				 * 域杀  谛卞]丢□伙互  凶午分仃骚襞允月[ 
				 */ 
				//snprintf( tmpmsg, sizeof( tmpmsg),  
				//		  ADDRESSBOOK_RETURNED1, 
				//			ae->charname 
				//			); 
 
				//CHAR_talkToCli( CONNECT_getCharaindex(i), -1,  
				//				tmpmsg , CHAR_COLORYELLOW ); 
 
				snprintf( tmpmsg, sizeof( tmpmsg),  
						  ADDRESSBOOK_RETURNED2, 
							CHAR_getChar( i, CHAR_NAME), 
							CHAR_getChar( i, CHAR_NAME)); 
 
				/* 霜曰潜卞手丢永本□斥 */ 
				CHAR_talkToCli( cindex, -1,  
								tmpmsg , CHAR_COLORYELLOW ); 
				return FALSE; 
			} 
			 
			fd = getfdFromCharaIndex( i); 
			if( fd != -1 ) { 
				lssproto_MSG_send( fd , index_to_my_info , textbuffer , color ); 
				/* 夫弘午曰 */ 
				printl( LOG_TALK, "CD=%s\tNM=%s\tT=%s" , mycd, mycharaname, textbuffer ); 
			 
			} 
 
			snprintf( tmpmsg , sizeof( tmpmsg),ADDRESSBOOK_SENT, 
					  ae->charname  ); 
			CHAR_talkToCli(cindex,-1, tmpmsg , color ); 
 
            // WON ADD 修正snprintf会导致当机的bug 
			{ 
					char tmp[1000]; 
					sprintf( tmp , "ADDRESSBOOK_sendMessage:" 
						 "Send MSG to: %s %s\n", 
						 ae->cdkey , ae->charname ); 
				//	print( tmp ); 
			} 
 
			CHAR_setInt( cindex, CHAR_SENDMAILCOUNT,  
						CHAR_getInt( cindex, CHAR_SENDMAILCOUNT)+1); 
			return TRUE; 
		} 
	} 
	/* 苇勾井日卅井匀凶凛反]失市它件玄扔□田□卞霜月 */ 
	saacproto_Message_send( acfd, mycd, mycharaname,  
							ae->cdkey, ae->charname, textbuffer, color); 
	CHAR_setInt( cindex, CHAR_SENDMAILCOUNT,  
				CHAR_getInt( cindex, CHAR_SENDMAILCOUNT)+1); 
 
 
	snprintf( tmpmsg , sizeof( tmpmsg),ADDRESSBOOK_SENT,ae->charname  ); 
	CHAR_talkToCli( cindex,-1, tmpmsg , CHAR_COLORWHITE ); 
 
	return FALSE; 
} 
/*------------------------------------------------------------ 
 * 失玉伊旦皮永弁及丢永本□斥毛霜耨允月 
 * saac 井日msg 毛熬仃午匀化弁仿奶失件玄卞禾旦玄允月[ 
 * 
 * 忒曰袄 
 ------------------------------------------------------------*/ 
BOOL ADDRESSBOOK_sendMessage_FromOther( char *fromcdkey, char *fromcharaname,  
										char *tocdkey, char *tocharaname, 
										char* text , int color ) 
{ 
#define		ADDRESSBOOK_SYSTEM			"system" 
 
	int i ; 
	char tmpmsg[256]; 
	int     playernum = CHAR_getPlayerMaxNum(); 
	 
	/* 扔□田□  毛腹绸允月 */ 
	for( i = 0 ; i < playernum ; i ++){ 
		if( CHAR_CHECKINDEX( i) && 
			strcmp( CHAR_getChar( i, CHAR_CDKEY), tocdkey) == 0 && 
			strcmp( CHAR_getChar( i, CHAR_NAME), tocharaname) == 0) 
		{ 
			int		index_to_my_info; 
			/* 
			 * CDKEY 手 平乓仿  手域谯仄凶[公及平乓仿弁正及 
			 * 失玉伊旦皮永弁卞愤坌及树  互丐月井譬屯化} 
			 * 绣箕仄凶日}MSG允月[ 
			 */ 
			  
			/* 扑旦  丞丢永本□斥互窖匀化五凶 */ 
			if( strcmp( fromcdkey, ADDRESSBOOK_SYSTEM) == 0 && 
				strcmp( fromcharaname, ADDRESSBOOK_SYSTEM ) == 0 )  
			{ 
				/* 扑旦  丞丢永本□斥毛龚仁 */ 
				CHAR_talkToCli( i, -1, text , color ); 
				break; 
			} 
			 
			index_to_my_info =  
					ADDRESSBOOK_getIndexInAddressbook( i ,  
														fromcdkey, fromcharaname); 
			if( index_to_my_info < 0 ){ 
				/* 
				 * 锹澎互愤坌毛坫壅仄化仄引匀化月[ 
				 */ 
 
				snprintf( tmpmsg, sizeof( tmpmsg), ADDRESSBOOK_RETURNED2, 
							tocharaname, tocharaname); 
 
				/* 霜曰潜卞手丢永本□斥 */ 
				saacproto_Message_send( acfd, ADDRESSBOOK_SYSTEM , ADDRESSBOOK_SYSTEM,  
										fromcdkey, fromcharaname, tmpmsg, CHAR_COLORYELLOW); 
 
			} 
			else { 
				int fd = getfdFromCharaIndex( i); 
				if( fd != -1 ) { 
					lssproto_MSG_send( fd , index_to_my_info , text , color ); 
					/* 夫弘午曰 */ 
					printl( LOG_TALK, "CD=%s\tNM=%s\tT=%s" , fromcdkey, 
															fromcharaname, text ); 
				} 
			} 
			break; 
		} 
	} 
	if( i == playernum ) return FALSE; 
	return TRUE; 
} 
 
int ADDRESSBOOK_getIndexInAddressbook(int cindex , char *cdkey, 
											 char *charname) 
{ 
	int i ; 
 
	if( !CHAR_CHECKINDEX( cindex ) ) return -1; 
 
	for( i = 0 ; i < ADDRESSBOOK_MAX ; i++){ 
		ADDRESSBOOK_entry *ae = CHAR_getAddressbookEntry( cindex , i ); 
		if( ae && ae->use && strcmp( ae->cdkey, cdkey )==0 && 
			strcmp( ae->charname , charname ) == 0 ){ 
			return i; 
		} 
	} 
	return -1; 
} 
 
BOOL ADDRESSBOOK_deleteEntry( int meindex ,int index ) 
{ 
	ADDRESSBOOK_entry ent; 
	BOOL ret; 
	if( !CHAR_CHECKINDEX( meindex ) ) return FALSE; 
 
	memset( &ent ,0, sizeof( ADDRESSBOOK_entry )); 
	ret = CHAR_setAddressbookEntry( meindex , index , &ent ); 
	if( ret == TRUE ){ 
		ADDRESSBOOK_sendAddressbookTable( meindex ); 
		return TRUE; 
	} 
	return FALSE; 
} 
 
BOOL ADDRESSBOOK_addEntry( int meindex ) 
{ 
	int objbuf[20]; 
	int found_count; 
	int front_x , front_y; 
	int i; 
	int	cnt = 0; 
	int	fd; 
    char *mycd , *tocd; 
	BOOL found = FALSE; 
 
	if( !CHAR_CHECKINDEX( meindex ) )return FALSE; 
	 
	fd = getfdFromCharaIndex( meindex); 
	if( fd == -1 ) return FALSE; 
 
	if( ADDRESSBOOK_findBlankEntry( meindex ) < 0) { 
		CHAR_talkToCli( meindex , -1,ADDRESSBOOK_MYTABLEFULL,CHAR_COLORWHITE ); 
		return FALSE; 
	} 
 
	for( i = 0; i < CONNECT_WINDOWBUFSIZE; i ++ ) { 
        CONNECT_setTradecardcharaindex( fd,i,-1); 
    } 
 
	CHAR_getCoordinationDir( CHAR_getInt( meindex, CHAR_DIR ) , 
							 CHAR_getInt( meindex , CHAR_X ), 
							 CHAR_getInt( meindex , CHAR_Y ) , 
							 1 , &front_x , &front_y ); 
 
	found_count = CHAR_getSameCoordinateObjects( objbuf, 
											arraysizeof( objbuf), 
											CHAR_getInt(meindex,CHAR_FLOOR), 
											front_x,front_y ); 
	if( found_count == 0 ){ 
		CHAR_talkToCli( meindex, -1, ADDRESSBOOK_CANTADD, CHAR_COLORWHITE); 
		return FALSE; 
	} 
	for( i = 0 ; i < found_count; i++ ){ 
		int objindex = objbuf[i]; 
		int	index = OBJECT_getIndex( objindex); 
		if( OBJECT_getType(objindex) != OBJTYPE_CHARA ) { 
			continue; 
		} 
		if( CHAR_getInt( index,CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ){ 
			continue; 
		} 
		if( index == meindex ) { 
			continue; 
		} 
		found = TRUE; 
  		if( CHAR_getWorkInt( index, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) { 
  			continue; 
  		} 
  		if(!CHAR_getFlg( index, CHAR_ISTRADECARD)) { 
  			continue; 
  		} 
		if( ADDRESSBOOK_findBlankEntry( index ) < 0 ) { 
			continue; 
		} 
        tocd = CHAR_getChar( index, CHAR_CDKEY); 
        mycd = CHAR_getChar( meindex, CHAR_CDKEY); 
		if( ADDRESSBOOK_getIndexInAddressbook( meindex, tocd, 
									CHAR_getChar( index, CHAR_NAME)) >= 0 && 
			ADDRESSBOOK_getIndexInAddressbook( index, mycd, 
										CHAR_getChar(meindex, CHAR_NAME) )  >= 0  )	{ 
			continue; 
		} 
 
        CONNECT_setTradecardcharaindex( fd,cnt,index); 
		cnt ++; 
		if( cnt == CONNECT_WINDOWBUFSIZE ) break; 
	} 
 
	if( cnt == 0 ) { 
		if( found ) { 
			CHAR_talkToCli( meindex, -1, ADDRESSBOOK_CANTADD2, CHAR_COLORWHITE); 
		}else { 
			CHAR_talkToCli( meindex, -1, ADDRESSBOOK_CANTADD, CHAR_COLORWHITE); 
		} 
		return FALSE; 
	} 
	if( cnt == 1 ) { 
		ADDRESSBOOK_addAddressBook( meindex, 
                                    CONNECT_getTradecardcharaindex(fd,0) ); 
		return TRUE; 
	}else if( cnt > 1 ) { 
		int		strlength; 
		char	msgbuf[1024]; 
		char	escapebuf[2048]; 
		strcpy( msgbuf, "1\n和谁交换名片呢?\n"); 
		strlength = strlen( msgbuf); 
		for( i = 0; 
             CONNECT_getTradecardcharaindex(fd,i) != -1  
			&& i< CONNECT_WINDOWBUFSIZE; i ++ ){ 
			char	*a = CHAR_getChar( CONNECT_getTradecardcharaindex(fd,i), 
                                       CHAR_NAME); 
			char	buf[256]; 
			snprintf( buf, sizeof( buf),"%s\n", a); 
			if( strlength + strlen( buf) > arraysizeof( msgbuf)){ 
				print( "%s:%d视窗讯息buffer不足。\n", 
						__FILE__,__LINE__); 
				break; 
			} 
			strcpy( &msgbuf[strlength], buf); 
			strlength += strlen(buf); 
		} 
		lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT,  
						WINDOW_BUTTONTYPE_CANCEL, 
						CHAR_WINDOWTYPE_SELECTTRADECARD, 
						-1, 
					makeEscapeString( msgbuf, escapebuf, sizeof(escapebuf))); 
		return TRUE; 
	} 
 
	return FALSE; 
} 
 
static int ADDRESSBOOK_findBlankEntry( int cindex ) 
{ 
	int i; 
	 
	if( CHAR_CHECKINDEX( cindex ) == FALSE )return -1; 
	 
	for( i=0 ; iuse == FALSE ) { 
			return i; 
		} 
	} 
	return -1; 
} 
 
static BOOL ADDRESSBOOK_makeEntryFromCharaindex( int charaindex, 
												 ADDRESSBOOK_entry* ae) 
{ 
	char *cdkey; 
 
	if( !CHAR_CHECKINDEX(charaindex) ) return FALSE; 
 
	memset( ae,0,sizeof(ADDRESSBOOK_entry) ); 
	cdkey = CHAR_getChar( charaindex, CHAR_CDKEY); 
	if( cdkey == NULL ){ 
		print( "ADDRESSBOOK_makeEntryFromCharaindex:" 
			   " strange! getcdkeyFromCharaIndex returns NULL!" 
			   " charaindex: %d\n" , charaindex ); 
		return FALSE; 
	} 
	strcpysafe( ae->cdkey , sizeof( ae->cdkey ),cdkey); 
 
	strcpysafe( ae->charname,sizeof( ae->charname), 
				CHAR_getChar(charaindex,CHAR_NAME) ); 
	ae->level       = CHAR_getInt( charaindex , CHAR_LV ); 
	ae->duelpoint   = CHAR_getInt( charaindex, CHAR_DUELPOINT); 
	ae->graphicsno  = CHAR_getInt( charaindex , CHAR_FACEIMAGENUMBER ); 
	ae->online = getServernumber(); 
	ae->use = TRUE; 
	ae->transmigration = CHAR_getInt( charaindex, CHAR_TRANSMIGRATION); 
 
	return TRUE; 
} 
 
void ADDRESSBOOK_notifyLoginLogout( int cindex , int flg ) 
{ 
	int i; 
	char *cd=NULL; 
	char *nm = CHAR_getChar( cindex , CHAR_NAME ); 
	int     playernum = CHAR_getPlayerMaxNum(); 
	 
	if( !CHAR_CHECKINDEX( cindex ) )return; 
	cd = CHAR_getChar( cindex, CHAR_CDKEY); 
 
	CHAR_send_DpDBUpdate_AddressBook( cindex, flg ); 
 
	for( i = 0 ; i < playernum ; i++){ 
		if( CHAR_CHECKINDEX( i) && i != cindex ) { 
			int j; 
			for( j = 0 ; juse == TRUE && 
					strcmp( ae->cdkey , cd ) == 0 && 
					strcmp( ae->charname, nm ) == 0 ){ 
 
					ae->online = (flg == 0 ) ? 0: getServernumber(); 
					ae->level = CHAR_getInt( cindex , CHAR_LV ); 
					ae->duelpoint = CHAR_getInt( cindex, CHAR_DUELPOINT); 
					ae->graphicsno = CHAR_getInt( cindex, CHAR_FACEIMAGENUMBER ); 
					ae->transmigration = CHAR_getInt( cindex, CHAR_TRANSMIGRATION); 
				 
					ADDRESSBOOK_sendAddressbookTableOne( i,j ); 
 
					break; 
				} 
			} 
		} 
	} 
 
	if( flg == 0 ){ 
		saacproto_Broadcast_send( acfd,cd, nm, "offline", 1); 
	}else if( flg == 1 ) { 
		for( i = 0 ; i < ADDRESSBOOK_MAX; i++ ){ 
			int j; 
			ADDRESSBOOK_entry* ae; 
			ae = CHAR_getAddressbookEntry( cindex, i ); 
			if( ae->use == 0 )continue; 
			ae->online = 0; 
			for( j=0 ; j < playernum ; j++ ) { 
				if( CHAR_CHECKINDEX( j) && 
					strcmp( ae->cdkey, CHAR_getChar( j, CHAR_CDKEY)) == 0 && 
					strcmp( ae->charname, CHAR_getChar( j, CHAR_NAME) )== 0){ 
					ae->level = CHAR_getInt( j, CHAR_LV ); 
					ae->graphicsno = CHAR_getInt( j, CHAR_FACEIMAGENUMBER ); 
					ae->online = getServernumber(); 
					ae->transmigration = CHAR_getInt( j, CHAR_TRANSMIGRATION); 
					break; 
				} 
			} 
			if( j == playernum) { 
#ifndef _DEATH_CONTEND 
				char buff[512]; 
				char escapebuf[1024]; 
				ae->online = 0; 
				snprintf( buff, sizeof(buff), "%s_%s", ae->cdkey, ae->charname); 
				makeEscapeString( buff, escapebuf, sizeof(escapebuf)); 
				saacproto_DBGetEntryString_send( acfd, DB_ADDRESSBOOK, escapebuf, 0,0); 
#endif 
			} 
		} 
		ADDRESSBOOK_sendAddressbookTable(cindex); 
		saacproto_Broadcast_send( acfd,cd, nm, "online", 1); 
		saacproto_MessageFlush_send( acfd, cd, nm); 
	} 
} 
 
BOOL ADDRESSBOOK_sendAddressbookTable( int cindex ) 
{ 
	int stringlen=0; 
	int i; 
 
	if( !CHAR_CHECKINDEX( cindex ) )return FALSE; 
	 
	for( i=0 ; iuse ){ 
			char tmp[CHARNAMELEN+32]; 
			char charname_escaped[CHARNAMELEN*2]; 
			makeEscapeString( ae->charname, charname_escaped , 
							  sizeof(charname_escaped  )); 
			/*  银迕白仿弘|  蟆|伊矛伙|仿奶白|白仿弘   */ 
			snprintf( tmp , sizeof( tmp ), 
					  "%d|%s|%d|%d|%d|%d|%d|" , 
					  ae->use, 
					  charname_escaped , ae->level ,  
					  ae->duelpoint,ae->online,ae->graphicsno, 
					  ae->transmigration); 
			strcpysafe  ( ADDRESSBOOK_returnstring + stringlen , 
						  sizeof(ADDRESSBOOK_returnstring) - stringlen, 
						  tmp ); 
			stringlen += strlen( tmp ); 
			if( stringlen >= sizeof(ADDRESSBOOK_returnstring) ) { 
				break; 
			} 
		}else{ 
			/*银匀化卅中犯□正手冲徇及心匹霜月  */ 
			char    tmp[32]; 
			snprintf( tmp , sizeof( tmp ), "|||||||"  ); 
			strcpysafe  ( ADDRESSBOOK_returnstring + stringlen , 
						  sizeof(ADDRESSBOOK_returnstring) - stringlen, 
						  tmp ); 
			stringlen += strlen( tmp ); 
			if( stringlen >= sizeof(ADDRESSBOOK_returnstring)) { 
				break; 
			} 
		} 
	} 
	 
	dchop( ADDRESSBOOK_returnstring, "|" ); 
 
	{ 
		int fd; 
		fd = getfdFromCharaIndex( cindex ); 
		if( fd == -1 ) return FALSE; 
		lssproto_AB_send( fd, ADDRESSBOOK_returnstring ); 
	} 
	return TRUE; 
} 
 
BOOL ADDRESSBOOK_sendAddressbookTableOne( int cindex, int num ) 
{ 
	int stringlen=0; 
	ADDRESSBOOK_entry *ae; 
 
	if( !CHAR_CHECKINDEX( cindex ) )return FALSE; 
	if( num < 0 || num > ADDRESSBOOK_MAX) return FALSE; 
	 
	ae = CHAR_getAddressbookEntry( cindex , num ); 
	 
	if( ae && ae->use ){ 
		char tmp[CHARNAMELEN+32]; 
		char charname_escaped[CHARNAMELEN*2]; 
		makeEscapeString( ae->charname, charname_escaped , 
						  sizeof(charname_escaped  )); 
		snprintf( tmp , sizeof( tmp ), 
				  "%d|%s|%d|%d|%d|%d|%d|" , 
				  ae->use, 
				  charname_escaped , ae->level ,  
				  ae->duelpoint,ae->online,ae->graphicsno, 
				  ae->transmigration); 
		strcpysafe  ( ADDRESSBOOK_returnstring + stringlen , 
					  sizeof(ADDRESSBOOK_returnstring) - stringlen, 
					  tmp ); 
		stringlen += strlen( tmp ); 
		if( stringlen >= sizeof(ADDRESSBOOK_returnstring) ) { 
			return FALSE; 
		} 
	}else{ 
		char    tmp[32]; 
		snprintf( tmp , sizeof( tmp ), "|||||||"  ); 
		strcpysafe  ( ADDRESSBOOK_returnstring + stringlen , 
					  sizeof(ADDRESSBOOK_returnstring) - stringlen, 
					  tmp ); 
		stringlen += strlen( tmp ); 
		if( stringlen >= sizeof(ADDRESSBOOK_returnstring)) { 
			return FALSE; 
		} 
	} 
 
	{ 
		int fd; 
		fd = getfdFromCharaIndex( cindex ); 
		if( fd == -1 ) return FALSE; 
		lssproto_ABI_send( fd, num, ADDRESSBOOK_returnstring ); 
	} 
	return TRUE; 
} 
 
/*------------------------------------------------------------ 
 * 夫午勾及失玉伊旦皮永弁巨件玄伉毛}  侬  卞卅云允[ 
 * 仇木反平乓仿忡绣迕卅及匹弁仿奶失件玄卞霜耨允月方曰手恳割 
 * 卅手及匹丐月  邰互丐月[ 
 * 娄醒 
 *  a   ADDRESSBOOK_entry*    侬  卞仄凶中厌瞻  尺及禾奶件正 
 * 忒曰袄 
 *  char * 
 ------------------------------------------------------------*/ 
char *ADDRESSBOOK_makeAddressbookString( ADDRESSBOOK_entry *a ) 
{ 
	char work1[256], work2[256]; 
 
	if( a->use == 0 ){ 
		/* 坞巨件玄伉分匀凶日坞  侬   */ 
		ADDRESSBOOK_returnstring[0] = '\0'; 
		return ADDRESSBOOK_returnstring; 
	} 
	 
	makeEscapeString( a->cdkey, work1, sizeof( work1 )); 
	makeEscapeString( a->charname , work2 , sizeof( work2 )); 
	snprintf( ADDRESSBOOK_returnstring, 
			  sizeof(  ADDRESSBOOK_returnstring ), 
			  "%s|%s|%d|%d|%d|%d", 
			  work1, work2, a->level, a->duelpoint, a->graphicsno,a->transmigration); 
 
	return ADDRESSBOOK_returnstring; 
 
} 
 
/*------------------------------------------------------------ 
 *   侬  祭今木化中月失玉伊旦皮永弁巨件玄伉毛}厌瞻  卞卅云允[ 
 * 仇及瑛绊厌瞻  及use动陆及树  反敦僬卞卅月[ 
 * 娄醒 
 *  in      char*                     侬   
 *  a       ADDRESSBOOK_entry*      犯□正毛璋户月赭 
 * 忒曰袄 
 * 勾友卞TRUE 
 ------------------------------------------------------------*/ 
BOOL ADDRESSBOOK_makeAddressbookEntry( char *in , ADDRESSBOOK_entry *a ) 
{ 
	char work1[256], work2[256] , work3[256] , work4[256],work5[256],work6[256]; 
	int ret; 
	if( strlen( in ) == 0 ){ 
		memset( a,0,sizeof(ADDRESSBOOK_entry) ); 
		a->use = 0; 
		return TRUE; 
	} 
	 
	getStringFromIndexWithDelim( in, "|" , 1 , work1 , sizeof( work1 )); 
	getStringFromIndexWithDelim( in, "|" , 2 , work2 , sizeof( work2 )); 
	getStringFromIndexWithDelim( in, "|" , 3 , work3 , sizeof( work3 )); 
	getStringFromIndexWithDelim( in, "|" , 4 , work4 , sizeof( work4 )); 
	getStringFromIndexWithDelim( in, "|" , 5 , work5 , sizeof( work5 )); 
	work6[0] = '\0'; 
	ret = getStringFromIndexWithDelim( in, "|" , 6 , work6 , sizeof( work6 )); 
	if( ret == FALSE ) { 
		a->transmigration = 0; 
	} 
	else { 
		a->transmigration = atoi( work6); 
	} 
	a->use = 1; 
 
	makeStringFromEscaped( work1 ); 
	makeStringFromEscaped( work2 ); 
 
	strcpysafe( a->cdkey , sizeof(a->cdkey) , work1 ); 
	strcpysafe( a->charname , sizeof(a->charname), work2 ); 
 
	a->level = atoi( work3 ); 
	a->duelpoint = atoi( work4 ); 
	a->graphicsno = atoi( work5 ); 
		 
	return FALSE; 
} 
 
void ADDRESSBOOK_addAddressBook( int meindex, int toindex) 
{ 
	char tmpstring[CHARNAMELEN + 
				  ADDRESSBOOK_FIXEDMESSAGE_MAXLEN]; 
 
	int  hisblank; 
	int	myblank; 
	int	myaddindex, toaddindex; 
	int	dir; 
    char *cdkey; 
 
	hisblank = ADDRESSBOOK_findBlankEntry( toindex ); 
	if( hisblank < 0 ) { 
		CHAR_talkToCli( meindex, -1, ADDRESSBOOK_HISTABLEFULL, CHAR_COLORWHITE); 
		return ; 
	} 
	myblank = ADDRESSBOOK_findBlankEntry( meindex ); 
	if( myblank < 0 ){ 
		CHAR_talkToCli( meindex , -1, ADDRESSBOOK_MYTABLEFULL, CHAR_COLORWHITE ); 
		return ; 
	} 
 
	cdkey = CHAR_getChar( toindex, CHAR_CDKEY); 
	myaddindex = ADDRESSBOOK_getIndexInAddressbook( meindex, cdkey,  
								CHAR_getChar( toindex, CHAR_NAME)); 
	cdkey = CHAR_getChar( meindex, CHAR_CDKEY); 
	toaddindex = ADDRESSBOOK_getIndexInAddressbook( toindex, cdkey,  
									CHAR_getChar(meindex, CHAR_NAME)); 
	if( myaddindex < 0 ){ 
		ADDRESSBOOK_entry   hisentry; 
		 
		if( ADDRESSBOOK_makeEntryFromCharaindex(toindex,&hisentry) == FALSE ){ 
			return ; 
		} 
		CHAR_setAddressbookEntry( meindex, myblank,&hisentry ); 
 
		snprintf( tmpstring, sizeof( tmpstring), 
				  toaddindex < 0 ? ADDRESSBOOK_ADDED: ADDRESSBOOK_GIVEADDRESS,  
				  hisentry.charname); 
		CHAR_talkToCli( meindex , -1,tmpstring, CHAR_COLORWHITE ); 
		ADDRESSBOOK_sendAddressbookTableOne( meindex, myblank); 
	}else{ 
		snprintf( tmpstring, sizeof( tmpstring), ADDRESSBOOK_TAKEADDRESS1, 
				  			CHAR_getChar( toindex, CHAR_NAME)); 
		CHAR_talkToCli( meindex, -1, tmpstring, CHAR_COLORWHITE); 
			 
	} 
	if( toaddindex < 0  ) { 
		ADDRESSBOOK_entry   meae; 
		if( ADDRESSBOOK_makeEntryFromCharaindex(meindex,&meae) == FALSE) { 
			return; 
		} 
		CHAR_setAddressbookEntry( toindex, hisblank,&meae ); 
		snprintf( tmpstring , sizeof( tmpstring), 
				  myaddindex < 0 ? ADDRESSBOOK_ADDED : ADDRESSBOOK_GIVEADDRESS, 
				  CHAR_getChar( meindex, CHAR_NAME ) ); 
		CHAR_talkToCli( toindex, -1, tmpstring, CHAR_COLORWHITE); 
		ADDRESSBOOK_sendAddressbookTableOne( toindex , hisblank); 
	}else { 
		if( myaddindex < 0 ) { 
		snprintf( tmpstring , sizeof( tmpstring), 
					ADDRESSBOOK_TAKEADDRESS2, 
				  CHAR_getChar( meindex, CHAR_NAME ) ); 
			CHAR_talkToCli( toindex, -1, tmpstring, CHAR_COLORWHITE); 
		} 
	} 
	dir = NPC_Util_GetDirCharToChar( toindex, meindex, 0); 
	if( dir != -1) { 
		 
		if( CHAR_getInt( toindex, CHAR_DIR) != dir) { 
			CHAR_setInt( toindex, CHAR_DIR, dir); 
		} 
		CHAR_sendWatchEvent( CHAR_getWorkInt( toindex, CHAR_WORKOBJINDEX), 
								CHAR_ACTNOD,NULL,0,TRUE); 
		CHAR_setWorkInt( toindex, CHAR_WORKACTION, CHAR_ACTNOD); 
		CHAR_sendWatchEvent( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), 
								CHAR_ACTNOD,NULL,0,TRUE); 
		CHAR_setWorkInt( meindex, CHAR_WORKACTION, CHAR_ACTNOD); 
	} 
	return; 
} 
 
 
void ADDRESSBOOK_DispatchMessage( char *cd, char *nm, char *value, int mode) 
{ 
	int		i; 
	char work[256]; 
	int	online,level,duelpoint, faceimagenumber, transmigration; 
	int	playernum = CHAR_getPlayerMaxNum(); 
	int ret; 
 
	getStringFromIndexWithDelim( value, "|" , 1 , work , sizeof( work )); 
	online = atoi( work); 
	getStringFromIndexWithDelim( value, "|" , 2 , work , sizeof( work )); 
	level = atoi( work); 
	getStringFromIndexWithDelim( value, "|" , 3 , work , sizeof( work )); 
	duelpoint = atoi( work); 
	getStringFromIndexWithDelim( value, "|" , 4 , work , sizeof( work )); 
	faceimagenumber = atoi( work); 
	ret = getStringFromIndexWithDelim( value, "|" , 5 , work , sizeof( work )); 
	if( ret ) { 
		transmigration = atoi( work); 
	} 
	else { 
		transmigration = 0; 
	} 
 
	if( online == getServernumber()) { 
		for( i = 0 ; i < playernum ; i++) { 
			if( CHAR_CHECKINDEX( i )) { 
				char *c = CHAR_getChar( i, CHAR_CDKEY); 
				char *n = CHAR_getChar( i, CHAR_NAME); 
				if( c == NULL || n == NULL ) continue; 
				if( strcmp( c , cd ) == 0 && strcmp( n, nm ) == 0 )  { 
					break; 
				} 
			} 
		} 
		if( i == playernum ) { 
			online = 0; 
			saacproto_Broadcast_send( acfd,cd, nm, "offline", 1); 
		} 
	} 
 
	for( i = 0 ; i < playernum ; i++) { 
		if( CHAR_CHECKINDEX( i )) { 
			int j; 
			for( j = 0 ; j < ADDRESSBOOK_MAX ; j++) { 
				ADDRESSBOOK_entry *ae; 
				ae = CHAR_getAddressbookEntry( i ,j ); 
				if( ae && ae->use == TRUE && 
					strcmp( ae->cdkey , cd ) == 0 && 
					strcmp( ae->charname, nm ) == 0 ) 
				{ 
					if( mode == 0 ) { 
						ae->use = FALSE; 
					}else { 
						ae->online = online; 
						ae->level = level; 
						ae->duelpoint = duelpoint; 
						ae->graphicsno = faceimagenumber; 
						ae->transmigration = transmigration; 
					} 
					ADDRESSBOOK_sendAddressbookTableOne( i,j ); 
 
					break; 
				} 
			} 
		} 
	} 
} 
 
 
BOOL ADDRESSBOOK_AutoaddAddressBook( int meindex, int toindex) 
{ 
	int  hisblank; 
	int	myblank; 
	int	myaddindex, toaddindex; 
 
	char *cdkey; 
 
	myblank = ADDRESSBOOK_findBlankEntry( meindex ); 
	hisblank = ADDRESSBOOK_findBlankEntry( toindex ); 
	if( hisblank < 0 || myblank < 0) { //"名片匣已满。" 
			return FALSE; 
	} 
	 
	cdkey = CHAR_getChar( toindex, CHAR_CDKEY); 
	myaddindex = ADDRESSBOOK_getIndexInAddressbook( meindex, cdkey,  
								CHAR_getChar( toindex, CHAR_NAME)); 
	cdkey = CHAR_getChar( meindex, CHAR_CDKEY); 
	toaddindex = ADDRESSBOOK_getIndexInAddressbook( toindex, cdkey,  
									CHAR_getChar(meindex, CHAR_NAME)); 
	if( myaddindex < 0 ){ 
		ADDRESSBOOK_entry   meae; 
		ADDRESSBOOK_entry   hisentry; 
		if( ADDRESSBOOK_makeEntryFromCharaindex(toindex,&hisentry) == FALSE || 
			ADDRESSBOOK_makeEntryFromCharaindex(meindex,&meae) == FALSE ){ 
			return FALSE; 
		} 
		CHAR_setAddressbookEntry( meindex, myblank,&hisentry ); 
		CHAR_setAddressbookEntry( toindex, hisblank,&meae ); 
		ADDRESSBOOK_sendAddressbookTableOne( meindex, myblank); 
		ADDRESSBOOK_sendAddressbookTableOne( toindex , hisblank); 
	} 
	return TRUE; 
}