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


#include "version.h" 
#include  
 
#include "configfile.h" 
#include "buf.h" 
#include "char_base.h" 
#include "char.h" 
#include "battle.h" 
#include "handletime.h" 
#include "map_deal.h" 
#include "addressbook.h" 
#include "lssproto_serv.h" 
#include "pet.h" 
#include "petmail.h" 
#include "npcutil.h" 
#include "log.h" 
 
#define		PETMAIL_BATTLETIMEOUT		660 
#define		PETMAIL_IDLETIMEOUT		30 
#define		PETMAIL_IDLETIME		10 
 
#define		PETMAIL_IDLE_RETURNOWNER	(60*30) 
//andy_edit 
//#define	PETMAIL_IDLEDISCARD	(60*60)  //Syu 修正宠邮等待时间为一小时 
#define	PETMAIL_IDLEDISCARD	(60*3) 
 
/* petmail 跨星系的等待时间  shan add */ 
#define         PETMAIL_JS_TIMEOUT              (2*60) 
 
static int PETMAIL_getIdleTime( int index); 
static void PETMAIL_sendPetmail( int index, int tocharaindex); 
static void PETMAIL_IdleProc1( int index); 
static void PETMAIL_IdleProc2( int index); 
static void PETMAIL_IdleProc3( int index); 
static void PETMAIL_IdleProc4( int index); 
static void PETMAIL_IdleProc5( int index); 
 
static void PETMAIL_ReturnWait( int index); 
static void PETMAIL_returnMail( int index, int tocharaindex); 
static int PETMAIL_offmsg_max;         
#define		PETMAILOFFMSGFILE			"petmail.txt" 
 
#define PETMAIL_DEFTOTALNUM 1000 
static int PetMailTotalnums = 0; 
 
BOOL PETMAIL_sendPetMail( int cindex, int aindex,  
					int havepetindex, int haveitemindex, char* text , int color ) 
{ 
	char	textbuffer[2048]; 
	struct  tm tm1; 
	Char 	*ch; 
	ADDRESSBOOK_entry *ae; 
	int		petindex; 
	int		itemindex =-1; 
	int tocharaindex,playernum,i; 
 
	//判断 人物 宠物 道具 对象名片 
	if( !CHAR_CHECKINDEX( cindex) )return FALSE; 
	if( haveitemindex != -1 ) { 
		itemindex = CHAR_getItemIndex( cindex, haveitemindex); 
		if( ITEM_CHECKINDEX( itemindex)) { 
			if( ITEM_getInt( itemindex, ITEM_CANPETMAIL) == 0 ) { 
				print( "err? crack?\n"); 
				return FALSE; 
			} 
		} 
	} 
	petindex = CHAR_getCharPet( cindex, havepetindex); 
	if( petindex == -1  ) return FALSE; 
	ch  = CHAR_getCharPointer( petindex); 
	if( ch == NULL ) return FALSE; 
	ae = CHAR_getAddressbookEntry( cindex , aindex ); 
	if( ae == NULL )return FALSE; 
 
#ifdef _AVID_TRADETRYBUG  //宠物邮件 
	if( CHAR_getWorkInt( cindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE ){ 
		CHAR_talkToCli( cindex, -1, "交易状态中无法传递宠物邮件。", CHAR_COLORYELLOW ); 
		return FALSE; 
	} 
#endif 
	//骑乘 
    if (CHAR_getInt( cindex, CHAR_RIDEPET) == havepetindex ){ 
    	CHAR_talkToCli(cindex, -1, "骑乘中的宠物无法传递宠物邮件!", CHAR_COLORYELLOW); 
    	return	FALSE; 
    } 
	if( CHAR_getWorkInt( cindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE){ 
		CHAR_talkToCli( cindex, -1, "战斗状态中无法传递宠物邮件。", CHAR_COLORYELLOW ); 
		return	FALSE; 
	} 
    if (CHAR_getInt(petindex, CHAR_PETFAMILY) == 1){ 
	   	CHAR_talkToCli(cindex, -1, "家族守护兽无法传递邮件喔!", CHAR_COLORYELLOW); 
	   	return	FALSE; 
	} 
// Terry add fix can send mail to offline character 2004/2/5 
	if(ae->online == 0){ 
		CHAR_talkToCli(cindex, -1, "该玩家不在线上!", CHAR_COLORYELLOW); 
   	return	FALSE; 
	} 
	playernum = CHAR_getPlayerMaxNum(); 
	for(i = 0;icdkey) == 0 && 
			strcmp(CHAR_getChar(i,CHAR_NAME),ae->charname) == 0 ) break; 
	} 
	if(i == playernum){ 
		CHAR_talkToCli(cindex, -1, "该玩家不在此星球上!", CHAR_COLORYELLOW); 
   	return	FALSE; 
	} 
// end 
#ifdef _MAP_TIME 
	if((CHAR_getInt(cindex,CHAR_FLOOR) >= 30017 && CHAR_getInt(cindex,CHAR_FLOOR) <= 30021)){ 
		char	msgbuf[512]; 
		snprintf(msgbuf,sizeof(msgbuf),"此地区不得寄送道具!"); 
		CHAR_talkToCli(cindex,-1,msgbuf,CHAR_COLORWHITE); 
		return FALSE; 
	} 
	if((CHAR_getInt(i,CHAR_FLOOR) >= 30017 && CHAR_getInt(i,CHAR_FLOOR) <= 30021)){ 
		char	msgbuf[512]; 
		snprintf(msgbuf,sizeof(msgbuf),"对方所在地区不得收寄送道具!"); 
		CHAR_talkToCli(cindex,-1,msgbuf,CHAR_COLORWHITE); 
		return FALSE; 
	} 
#endif 
 
#ifdef _BAD_PLAYER             // WON ADD 送坏玩家去关 
	if( CHAR_getInt(cindex,CHAR_FLOOR)==887 ){ 
		char	msgbuf[512]; 
		snprintf( msgbuf, sizeof( msgbuf), "对不起,您在招待室中,无法寄送信件。"); 
		CHAR_talkToCli( cindex, -1, msgbuf, CHAR_COLORWHITE); 
		return FALSE; 
	} 
#endif 
 
#ifdef _DEATH_FAMILY_GM_COMMAND	// WON ADD 家族战GM指令 
	{ 
		char	msgbuf[512]; 
		snprintf( msgbuf, sizeof( msgbuf), "跨星系家族PK,无法寄送信件。"); 
		CHAR_talkToCli( cindex, -1, msgbuf, CHAR_COLORWHITE); 
		return FALSE; 
	} 
#endif 
 
	// Syu Add 2003/05/30 
	if( ( CHAR_getInt(cindex,CHAR_FLOOR) >= 8200 && CHAR_getInt(cindex,CHAR_FLOOR) <= 8213 ) )  
	{ 
		char	msgbuf[512]; 
		snprintf( msgbuf, sizeof( msgbuf), "英雄战场不得寄送道具!"); 
		CHAR_talkToCli( cindex, -1, msgbuf, CHAR_COLORWHITE); 
		return FALSE; 
	} 
 
#ifdef _PET_LIMITLEVEL 
		if( CHAR_getInt( petindex, CHAR_LIMITLEVEL) > 0 )	{ 
			CHAR_talkToCli(cindex, -1, "特殊宠物不能传递邮件喔!", CHAR_COLORYELLOW); 
			return FALSE; 
		} 
#endif 
 
#ifdef _PETMAIL_DEFNUMS 
		if( CHAR_getWorkInt( cindex, CHAR_PETMAILNUMS) > 6 ){ 
			CHAR_talkToCli(cindex, -1, "邮件中宠物过多,暂时无法传递宠物邮件!", CHAR_COLORYELLOW); 
			return	FALSE; 
		}else if( PETMAIL_CheckIsMyOffmsg( cindex, ae->cdkey, ae->charname) > 5 ){ 
			CHAR_talkToCli(cindex, -1, "收件者目前邮件宠物超过5封,暂时无法传递宠物邮件!", CHAR_COLORYELLOW); 
			return	FALSE; 
		}else if( CHAR_getWorkInt( cindex, CHAR_PETMAILSENDTIME) > (int)time( NULL)){ 
			char Mess1[256]; 
			sprintf( Mess1,"需等待%d秒才能再次寄送宠物邮件!", 
				(int)time( NULL) - CHAR_getWorkInt( cindex, CHAR_PETMAILSENDTIME)); 
			CHAR_talkToCli( cindex, -1, Mess1, CHAR_COLORYELLOW); 
			return	FALSE; 
		}else if( PetMailTotalnums >= PETMAIL_DEFTOTALNUM ){ 
			CHAR_talkToCli(cindex, -1, "目前系统邮件过多,请稍後再寄。", CHAR_COLORYELLOW); 
			return	FALSE; 
		}else{ 
			int nums = CHAR_getWorkInt( cindex, CHAR_PETMAILNUMS); 
			nums ++; 
			CHAR_setWorkInt( cindex, CHAR_PETMAILNUMS, nums); 
			CHAR_setWorkInt( cindex, CHAR_PETMAILSENDTIME, (int)time( NULL)+6); 
			PetMailTotalnums ++; 
		} 
#endif 
	memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); 
    snprintf( textbuffer, sizeof( textbuffer),  
    		"%2d/%02d %2d:%02d|%s", tm1.tm_mon +1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min, text); 
	{ 
		int		offmsgindex; 
		offmsgindex = PETMAIL_addOffmsg( cindex, ae->cdkey, ae->charname, text, color); 
		if( offmsgindex == -1 ) { 
			print( "offmsg buffer over\n"); 
			return FALSE; 
		} 
 
#ifdef _FIX_PETMAIL2        // WON ADD 修正宠邮2 
		if( !PET_dropPetFLXY( cindex, havepetindex, PETMAIL_SPOOLFLOOR, PETMAIL_SPOOLX,PETMAIL_SPOOLY) ){ 
			CHAR_talkToCli( cindex, -1, "宠物邮件失败", CHAR_COLORYELLOW); 
			return FALSE; 
		} 
#endif 
		CHAR_setInt( petindex, CHAR_FLOOR, CHAR_getInt( cindex, CHAR_FLOOR)); 
		CHAR_setInt( petindex, CHAR_X, CHAR_getInt( cindex, CHAR_X)); 
		CHAR_setInt( petindex, CHAR_Y, CHAR_getInt( cindex, CHAR_Y));			 
		CHAR_sendPMEToArroundCharacter( cindex, petindex, 0, CHAR_getInt( petindex, CHAR_PETMAILEFFECT)); 
		CHAR_setInt( petindex, CHAR_MAILMODE,CHAR_PETMAIL_IDLE2); 
		CHAR_setInt( petindex, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL2); 
		strcpysafe( ch->charfunctable[CHAR_LOOPFUNC].string, 
					sizeof( ch->charfunctable[CHAR_LOOPFUNC]), "PETMAIL_Loop"); 
		CHAR_constructFunctable( petindex); 
		CHAR_setInt( petindex, CHAR_PETMAILBUFINDEX, offmsgindex); 
		CHAR_setInt( petindex, CHAR_PETMAILIDLETIME, NowTime.tv_sec); 
		CHAR_setInt( petindex, CHAR_PETMAILFROMFLOOR, CHAR_getInt( cindex, CHAR_FLOOR)); 
		CHAR_setInt( petindex, CHAR_PETMAILFROMX, CHAR_getInt( cindex, CHAR_X)); 
		CHAR_setInt( petindex, CHAR_PETMAILFROMY,CHAR_getInt( cindex, CHAR_Y));		 
 
#ifdef _WON_PET_MAIL_LOG   // WON ADD 增加寄宠邮的 LOG 
		LogPet( 
			CHAR_getChar( cindex, CHAR_NAME ),  
			CHAR_getChar( cindex, CHAR_CDKEY ), 
			CHAR_getChar( petindex, CHAR_NAME), 
			CHAR_getInt( petindex, CHAR_LV), 
			"Pet_Send_Mail(寄宠邮)", 
			CHAR_getInt( cindex,CHAR_FLOOR), 
			CHAR_getInt( cindex,CHAR_X ), 
			CHAR_getInt( cindex,CHAR_Y ), 
			CHAR_getChar( petindex, CHAR_UNIQUECODE)   
		); 
#endif 
		if( haveitemindex != -1 ) { 
			CHAR_setItemIndex( cindex, haveitemindex, -1); 
			CHAR_setItemIndex( petindex, CHAR_STARTITEMARRAY, itemindex); 
			CHAR_sendItemDataOne( cindex, haveitemindex); 
			LogItem( 
				CHAR_getChar( cindex, CHAR_NAME ), 
				CHAR_getChar( cindex, CHAR_CDKEY ), 
				itemindex, 
				"pm_have(宠邮->寄送的道具)", 
				CHAR_getInt( cindex,CHAR_FLOOR), 
				CHAR_getInt( cindex,CHAR_X ), 
	 			CHAR_getInt( cindex,CHAR_Y ), 
				ITEM_getChar( itemindex, ITEM_UNIQUECODE), 
						ITEM_getChar( itemindex, ITEM_NAME), 
						ITEM_getInt( itemindex, ITEM_ID) 
 
			); 
		} 
		{ 
			char token[256]; 
			tocharaindex = PETMAIL_CheckPlayerExist( petindex, 0); 
			sprintf( token, "寄送宠物邮件(%s)给%s。", 
				CHAR_getUseName( petindex), CHAR_getUseName( tocharaindex) ); 
			CHAR_talkToCli( cindex, -1, token, CHAR_COLORYELLOW); 
		} 
		return TRUE; 
	} 
	return FALSE; 
} 
 
static PETMAIL_offmsg * PETMAIL_offmsgbuf; 
BOOL PETMAIL_initOffmsgBuffer( int count ) 
{ 
    int size = sizeof( PETMAIL_offmsg )*count ; 
	FILE	*fp; 
    char	filename[256]; 
    char    line[2048]; 
    int		linenum = 0; 
     
    PETMAIL_offmsgbuf = (PETMAIL_offmsg*)allocateMemory( size ); 
     
    if( PETMAIL_offmsgbuf == NULL ) return FALSE; 
 
	PetMailTotalnums = 0; 
 
    memset( PETMAIL_offmsgbuf, 0,size ); 
 
    PETMAIL_offmsg_max = count; 
    snprintf( filename ,sizeof( filename ) ,"%s/%s", getStoredir(), PETMAILOFFMSGFILE); 
    fp = fopen( filename , "rt" ); 
    if( fp == NULL ) return TRUE; 
 
	while(  fgets( line, sizeof( line ), fp ) != NULL ){ 
		char	buf[1024]; 
		int		index; 
		if( !getStringFromIndexWithDelim( line, "|", 1, buf, sizeof( buf))) { 
			print( "read error line[%d]\n", linenum); 
			continue; 
		} 
		index = atoi( buf); 
		if( index >= PETMAIL_offmsg_max ) { 
			print( "index over offmsg_max [%d]\n", index); 
			continue; 
		} 
		if( PETMAIL_offmsgbuf[index].use == TRUE) { 
			print( "offmsg already use index[%d]\n", index); 
			continue; 
		} 
		 
		if( !getStringFromIndexWithDelim( line, "|", 2, buf, sizeof( buf))) { 
			print( "read error line[%d]\n", linenum); 
			continue; 
		} 
		PETMAIL_offmsgbuf[index].send_tm = atoi( buf); 
		 
		if( !getStringFromIndexWithDelim( line, "|", 3, buf, sizeof( buf))) { 
			print( "read error line[%d]\n", linenum); 
			continue; 
		} 
		PETMAIL_offmsgbuf[index].color = atoi( buf); 
		 
		if( !getStringFromIndexWithDelim( line, "|", 4, buf, sizeof( buf))) { 
			print( "read error line[%d]\n", linenum); 
			continue; 
		} 
		strcpysafe( PETMAIL_offmsgbuf[index].text,  
					sizeof( PETMAIL_offmsgbuf[index].text), 
					buf); 
		 
		if( !getStringFromIndexWithDelim( line, "|", 5, buf, sizeof( buf))) { 
			print( "read error line[%d]\n", linenum); 
			continue; 
		} 
		strcpysafe( PETMAIL_offmsgbuf[index].destcd,  
					sizeof( PETMAIL_offmsgbuf[index].destcd), 
					buf); 
		 
		if( !getStringFromIndexWithDelim( line, "|", 6, buf, sizeof( buf))) { 
			print( "read error line[%d]\n", linenum); 
			continue; 
		} 
		makeStringFromEscaped(buf); 
		strcpysafe( PETMAIL_offmsgbuf[index].destcharname,  
					sizeof( PETMAIL_offmsgbuf[index].destcharname), 
					buf); 
		if( !getStringFromIndexWithDelim( line, "|", 7, buf, sizeof( buf))) { 
			print( "read error line[%d]\n", linenum); 
			continue; 
		} 
		strcpysafe( PETMAIL_offmsgbuf[index].srccd,  
					sizeof( PETMAIL_offmsgbuf[index].srccd), 
					buf); 
		if( !getStringFromIndexWithDelim( line, "|", 8, buf, sizeof( buf))) { 
			print( "read error line[%d]\n", linenum); 
			continue; 
		} 
		makeStringFromEscaped(buf); 
		strcpysafe( PETMAIL_offmsgbuf[index].srccharname,  
					sizeof( PETMAIL_offmsgbuf[index].srccharname), 
					buf); 
		linenum ++; 
	} 
	fclose( fp); 
    return TRUE; 
     
} 
 
BOOL PETMAIL_addOffmsg( int fromindex, char *tocdkey, char *tocharaname, 
                            char *text , int color ) 
{ 
 
    int i; 
 
    for( i = 0 ; i < PETMAIL_offmsg_max; i++ ) { 
        if( PETMAIL_offmsgbuf[i].use == 0 ) { 
            PETMAIL_offmsg *om = & PETMAIL_offmsgbuf[i]; 
            om->use = 1; 
            time( & om->send_tm ); 
 
            strcpysafe( om->srccd , sizeof( om->srccd ),  
            			CHAR_getChar( fromindex, CHAR_CDKEY)); 
            strcpysafe( om->srccharname , sizeof( om->srccharname ), 
                        CHAR_getChar( fromindex, CHAR_NAME)); 
            strcpysafe( om->destcd , sizeof( om->destcd ), tocdkey ); 
            strcpysafe( om->destcharname , sizeof(om->destcharname), tocharaname); 
            strcpysafe( om->text , sizeof(om->text), text ); 
            om->color = color; 
            return i; 
        } 
    } 
    return -1; 
} 
 
PETMAIL_offmsg *PETMAIL_getOffmsg( int offmsgindex) 
{ 
	if( offmsgindex < 0 || offmsgindex >= PETMAIL_offmsg_max ) return NULL; 
	return &PETMAIL_offmsgbuf[offmsgindex]; 
} 
 
BOOL PETMAIL_deleteOffmsg( int offmsgindex) 
{ 
	if( offmsgindex < 0 || offmsgindex >= PETMAIL_offmsg_max ) return FALSE; 
	PETMAIL_offmsgbuf[offmsgindex].use = FALSE; 
	return TRUE; 
} 
 
void PETMAIL_proc( void ) 
{ 
    int i; 
	static time_t PETMAIL_check_time_store = 0; 
    time_t t; 
    time( &t ); 
    if( t < PETMAIL_check_time_store) return; 
    PETMAIL_check_time_store = t + PETMAIL_CHECK_OFFMSG_EXPIRE_INTERVAL; 
    for(i = 0; i < PETMAIL_offmsg_max ; i++){ 
        if( PETMAIL_offmsgbuf[i].use && PETMAIL_offmsgbuf[i].send_tm < ( t - PETMAIL_OFFMSG_TIMEOUT )){ 
            PETMAIL_offmsgbuf[i].use = FALSE; 
        } 
    } 
} 
 
BOOL storePetmail( void) 
{ 
	FILE	*fp; 
    char	filename[256]; 
	char	escapebuf1[ 64],escapebuf2[ 64]; 
	int		i; 
 
    /*  白央奶伙  毛菲户月  */ 
    snprintf( filename ,sizeof( filename ) ,"%s/%s" , 
    				getStoredir(), PETMAILOFFMSGFILE); 
    fp = fopen( filename , "wt" ); 
    if( fp == NULL ) return FALSE; 
    for(i = 0; i < PETMAIL_offmsg_max ; i++){ 
        if( PETMAIL_offmsgbuf[i].use ){ 
        	fprintf( fp, "%d|%ud|%d|%s|%s|%s|%s|%s|", 
        				i, (unsigned int)PETMAIL_offmsgbuf[i].send_tm, 
        				PETMAIL_offmsgbuf[i].color,  
        				PETMAIL_offmsgbuf[i].text, 
        				PETMAIL_offmsgbuf[i].destcd, 
        				makeEscapeString( PETMAIL_offmsgbuf[i].destcharname, 
        									escapebuf1, sizeof( escapebuf1)), 
        				PETMAIL_offmsgbuf[i].srccd, 
        				makeEscapeString( PETMAIL_offmsgbuf[i].srccharname, 
        									escapebuf2, sizeof( escapebuf2))); 
        } 
	} 
	fclose( fp); 
	return TRUE; 
} 
 
BOOL PETMAIL_CheckPlayerExist( int index, int mode) 
{ 
	int		i; 
	char	*searchcd = NULL; 
	char	*searchname = NULL; 
	PETMAIL_offmsg *adof; 
	int     playernum = CHAR_getPlayerMaxNum(); 
	 
	if( mode == 0 ) { 
		adof = PETMAIL_getOffmsg( CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); 
		if( adof == NULL ) return FALSE; 
		searchcd = adof->destcd; 
		searchname = adof->destcharname; 
	} 
	else if( mode == 1 ) { 
		searchcd = CHAR_getChar( index, CHAR_OWNERCDKEY); 
		searchname = CHAR_getChar( index, CHAR_OWNERCHARANAME); 
		if( searchcd == NULL || searchname == NULL ) return FALSE; 
	} 
	for( i = 0 ; i < playernum ; i ++) { 
		if( CHAR_CHECKINDEX( i) && 
			strcmp( CHAR_getChar( i, CHAR_CDKEY), searchcd ) == 0 && 
			strcmp( CHAR_getChar( i, CHAR_NAME), searchname) == 0 ) { 
			return i; 
		} 
	} 
	return -1; 
} 
 
void PETMAIL_Loopfunc( int index) 
{ 
	int		mode = CHAR_getInt( index, CHAR_MAILMODE); 
	switch( mode ){ 
	  case CHAR_PETMAIL_IDLE1: 
		PETMAIL_IdleProc1( index); 
		break; 
	  case CHAR_PETMAIL_IDLE2: 
		PETMAIL_IdleProc2( index); 
		break; 
	  case CHAR_PETMAIL_RETURNWAIT://回来等待 
	  	PETMAIL_ReturnWait( index); 
	  	break; 
	  case CHAR_PETMAIL_IDLE3: 
		PETMAIL_IdleProc3( index); 
		break; 
	  case CHAR_PETMAIL_IDLE4://寻找主人 
		PETMAIL_IdleProc4( index); 
	  	break; 
	  case CHAR_PETMAIL_IDLE5: //超过时间无法找到主人 
		PETMAIL_IdleProc5( index); 
	  	break; 
	  default: 
		break; 
	} 
} 
 
static int PETMAIL_getIdleTime( int index) 
{ 
#define		PETMAIL_DIVRANGE		25		//	坌喃允月汹 
#define		PETMAIL_IDLELEVELRANGE	10		//	坌喃允月  区 
#define		PETMAIL_IDLEUNITTIME	3		//	棉厥 
	int		d; 
	int		dex = CHAR_getWorkInt( index, CHAR_WORKQUICK) ; 
 
	d = dex / PETMAIL_DIVRANGE; 
	if( d < 0 ) d = 0; 
	if( d > PETMAIL_IDLELEVELRANGE ) d = PETMAIL_IDLELEVELRANGE; 
	d = PETMAIL_IDLELEVELRANGE - d ; 
	 
	return d * PETMAIL_IDLEUNITTIME; 
	 
#undef		PETMAIL_DIVRANGE 
#undef		PETMAIL_IDLELEVELRANGE 
#undef		PETMAIL_IDLEUNITTIME 
} 
 
static void PETMAIL_sendPetmail( int index, int tocharaindex) 
{ 
	int index_to_my_info; 
	int		itemindex,ret; 
	index_to_my_info =  ADDRESSBOOK_getIndexInAddressbook( tocharaindex,  
						CHAR_getChar( index, CHAR_OWNERCDKEY), 
						CHAR_getChar( index, CHAR_OWNERCHARANAME)); 
#ifdef _DEATH_FAMILY_GM_COMMAND	// WON ADD 家族战GM指令 
	{ 
		char	msgbuf[512]; 
		snprintf( msgbuf, sizeof( msgbuf), "跨星系家族PK,无法寄送信件。"); 
		CHAR_talkToCli( index, -1, msgbuf, CHAR_COLORWHITE); 
		return ; 
	} 
#endif 
 
	 
	if( index_to_my_info <  0 ) { 
		char	msgbuf[512]; 
 
		snprintf( msgbuf, sizeof( msgbuf),  
					"%s的%s 终於来了!" 
					"由於对方没有您的名片,所以信件被退回了。", 
					CHAR_getChar( index, CHAR_OWNERCHARANAME), 
					CHAR_getUseName( index)); 
		CHAR_talkToCli( tocharaindex, -1, msgbuf, CHAR_COLORWHITE); 
	} 
 
#ifdef _BAD_PLAYER             // WON ADD 送坏玩家去关 
	else if( CHAR_getInt(tocharaindex,CHAR_FLOOR)==887 ){ 
		char	msgbuf[512]; 
		snprintf( msgbuf, sizeof( msgbuf), 					 
					"由於您在招待室中,无法接收信件,所以信件被退回了。" ); 
		CHAR_talkToCli( tocharaindex, -1, msgbuf, CHAR_COLORWHITE); 
	} 
#endif 
 
	//Syu Add 06/16 
	else if( CHAR_getInt(tocharaindex,CHAR_FLOOR) >=8200 && 
		CHAR_getInt(tocharaindex,CHAR_FLOOR) <= 8213 ){ 
		char	msgbuf[512]; 
		snprintf( msgbuf, sizeof( msgbuf), 					 
					"英雄战场不得寄送道具!" ); 
		CHAR_talkToCli( tocharaindex, -1, msgbuf, CHAR_COLORWHITE); 
	} 
	else { 
		struct  tm tm1; 
		char	textbuffer[2048]; 
		char	escapebuf[128]; 
		int		fd; 
		PETMAIL_offmsg *offmsg; 
		itemindex = CHAR_getItemIndex( index, CHAR_STARTITEMARRAY); 
		ret = CHAR_addItemSpecificItemIndex( tocharaindex, itemindex); 
		if( ret < 0 || ret >= CHAR_MAXITEMHAVE){ 
			CHAR_DropItem( index, CHAR_STARTITEMARRAY); 
			LogItem( 
				CHAR_getChar( tocharaindex, CHAR_NAME ),  
				CHAR_getChar( tocharaindex, CHAR_CDKEY ), 
				itemindex, 
				"pm_putground(宠邮->道具栏已满,放置地上)", 
				CHAR_getInt( index,CHAR_FLOOR), 
				CHAR_getInt( index,CHAR_X ), 
	 			CHAR_getInt( index,CHAR_Y ), 
				ITEM_getChar( itemindex, ITEM_UNIQUECODE), 
						ITEM_getChar( itemindex, ITEM_NAME), 
						ITEM_getInt( itemindex, ITEM_ID) 
 
			); 
		} 
		else { 
			CHAR_setItemIndex( index, CHAR_STARTITEMARRAY, -1); 
			CHAR_sendItemDataOne( tocharaindex, ret); 
			LogItem( 
				CHAR_getChar( tocharaindex, CHAR_NAME ), 
				CHAR_getChar( tocharaindex, CHAR_CDKEY ), 
				itemindex, 
				"pm_getitem(宠邮->收到的道具)", 
				CHAR_getInt( index,CHAR_FLOOR), 
				CHAR_getInt( index,CHAR_X ), 
	 			CHAR_getInt( index,CHAR_Y ), 
				ITEM_getChar( itemindex, ITEM_UNIQUECODE), 
						ITEM_getChar( itemindex, ITEM_NAME), 
						ITEM_getInt( itemindex, ITEM_ID) 
			); 
		} 
		offmsg = PETMAIL_getOffmsg(  
						CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); 
		memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec),  
									sizeof( tm1)); 
	    snprintf( textbuffer, sizeof( textbuffer),  
	    		"%2d/%02d %2d:%02d|%s|%d|%d|%s|%d",  
	    		tm1.tm_mon +1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min, 
	    		offmsg->text,  
	    		CHAR_getInt( index, CHAR_BASEIMAGENUMBER), 
	    		CHAR_getInt( index, CHAR_LV), 
	    		makeEscapeString( CHAR_getUseName( index), escapebuf, 
	    							sizeof( escapebuf)), 
				ITEM_getInt( itemindex, ITEM_BASEIMAGENUMBER) 
	    		); 
		fd = getfdFromCharaIndex( tocharaindex); 
		if( fd != -1 ) lssproto_MSG_send( fd , index_to_my_info ,  
									textbuffer , offmsg->color ); 
		PETMAIL_deleteOffmsg( CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); 
		CHAR_setInt( index, CHAR_PETMAILBUFINDEX, -1); 
		CHAR_setInt( index, CHAR_PETSENDMAILCOUNT,  
					CHAR_getInt( index, CHAR_PETSENDMAILCOUNT) +1); 
		{ 
			char   *cdkey = CHAR_getChar( index, CHAR_CDKEY); 
			if( cdkey) printl( LOG_TALK, "CDKEY=%s\tTEXT=%s" , cdkey, offmsg->text ); 
			else 	   printl( LOG_TALK, "CDKEY=(null)\tTEXT=%s" , offmsg->text ); 
		} 
	} 
} 
 
static void PETMAIL_IdleProc1( int index) 
{ 
 
	int		tocharaindex; 
	int		warp = FALSE; 
 
	tocharaindex = PETMAIL_CheckPlayerExist( index, 0); 
	if( !CHAR_CHECKINDEX( tocharaindex) ) { 
		warp = TRUE; 
	}else { 
		if( CHAR_getInt( tocharaindex, CHAR_FLOOR) == 8215 ){//客服活动 andy 
			warp = TRUE; 
		}else if( CHAR_getWorkInt( tocharaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE ){//交易中不收邮件 
			warp = TRUE; 
		}else if( CHAR_getWorkInt( tocharaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ){		 
			int battleindex = CHAR_getWorkInt( tocharaindex, CHAR_WORKBATTLEINDEX ); 
			if( !BATTLE_CHECKINDEX( battleindex ) || BattleArray[battleindex].flgTime > 60  ){ 
				warp = TRUE; 
			} 
		}else { 
			int	ret; 
			int distance; 
			distance = NPC_Util_CharDistance( tocharaindex, index); 
			if( distance > CHAR_DEFAULTSEESIZ /2 ) { 
				warp = TRUE; 
			}else if( distance > 1 ){ 
				int dir = NPC_Util_GetDirCharToChar( index, tocharaindex, 0); 
				if( dir != -1 ) { 
					dir = NPC_Util_SuberiWalk( index, dir); 
				} 
				if( dir != -1 ) { 
					ret = CHAR_walk( index, dir, 0); 
					if( ret != CHAR_WALKSUCCESSED) { 
						dir = -1; 
					} 
				} 
				if( dir == -1 ) { 
					warp = TRUE; 
				} 
			}else { 
				PETMAIL_sendPetmail( index, tocharaindex); 
				CHAR_setInt( index, CHAR_MAILMODE,CHAR_PETMAIL_RETURNWAIT); 
				CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); 
				CHAR_setInt( index, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL2); 
			} 
		} 
	} 
	if( warp) { 
		if( CHAR_getInt( index, CHAR_FLOOR) != PETMAIL_SPOOLFLOOR) { 
			CHAR_warpToSpecificPoint( index,  
								PETMAIL_SPOOLFLOOR,  
								PETMAIL_SPOOLX,PETMAIL_SPOOLX); 
			CHAR_setInt( index, CHAR_MAILMODE,CHAR_PETMAIL_IDLE2); 
			CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); 
			CHAR_setInt( index, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL2); 
		} 
	} 
} 
 
static void PETMAIL_IdleProc2( int index) 
{ 
  	unsigned int t = CHAR_getInt( index, CHAR_PETMAILIDLETIME); 
	if( NowTime.tv_sec > t + PETMAIL_getIdleTime( index)) { 
		int		tocharaindex; 
		int		cnt; 
		tocharaindex = PETMAIL_CheckPlayerExist( index, 0); 
		if( tocharaindex != -1 ) { 
			if( CHAR_getInt( tocharaindex, CHAR_FLOOR) == 8215 ){//客服活动 andy 
			}else if( CHAR_getWorkInt( tocharaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE ){//交易中不收邮件 
			}else if( CHAR_getWorkInt( tocharaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE){ 
			}else { 
				int		fl, x, y, ch_x, ch_y; 
				fl = CHAR_getInt( tocharaindex, CHAR_FLOOR); 
				ch_x = CHAR_getInt( tocharaindex, CHAR_X); 
				ch_y = CHAR_getInt( tocharaindex, CHAR_Y); 
				for( cnt = 0; cnt < 10; cnt ++ ) { 
					x = RAND( ch_x -1, ch_x + 1); 
					y = RAND( ch_y -1, ch_y + 1); 
					if( MAP_walkAble( tocharaindex, fl,x,y)) { 
						break; 
					} 
				} 
				if( cnt == 10 ) { 
					x = ch_x;	y = ch_y; 
				} 
				CHAR_setInt( index, CHAR_MAILMODE,CHAR_PETMAIL_RETURNWAIT); 
				CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); 
				CHAR_warpToSpecificPoint( index,fl, x,y); 
				PETMAIL_sendPetmail( index, tocharaindex); 
				return; 
			} 
		}else{ 
			if( NowTime.tv_sec > t + PETMAIL_IDLETIMEOUT ) { 
				PETMAIL_deleteOffmsg( CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); 
				CHAR_setInt( index, CHAR_MAILMODE, CHAR_PETMAIL_IDLE3); 
				CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); 
				CHAR_setInt( index,	CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL1); 
			}	 
			return; 
		} 
		if( NowTime.tv_sec > t + PETMAIL_BATTLETIMEOUT ) { 
			PETMAIL_deleteOffmsg( CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); 
			CHAR_setInt( index, CHAR_MAILMODE, CHAR_PETMAIL_IDLE3); 
			CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); 
			CHAR_setInt( index,	CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL1); 
		}					 
	} 
} 
 
static void PETMAIL_ReturnWait( int index) 
{ 
  	unsigned int t = CHAR_getInt( index, CHAR_PETMAILIDLETIME); 
	if( NowTime.tv_sec > t + PETMAIL_IDLETIME) { 
		CHAR_setInt( index, CHAR_MAILMODE, CHAR_PETMAIL_IDLE3); 
		CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); 
		CHAR_setInt( index, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL1); 
	} 
} 
 
static void PETMAIL_IdleProc3( int index) 
{ 
 
	int		tocharaindex; 
	int		warp = FALSE; 
 
	tocharaindex = PETMAIL_CheckPlayerExist( index, 1); 
	if( tocharaindex == -1 ) { 
		warp = TRUE; 
	}else { 
		if( CHAR_getWorkInt( tocharaindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE) { 
			int		ret ; 
			int distance; 
			distance = NPC_Util_CharDistance( tocharaindex, index); 
			if( distance > CHAR_DEFAULTSEESIZ /2 ) { 
				warp = TRUE; 
 
			}else if( distance > 1 ){ 
				int dir = NPC_Util_GetDirCharToChar( index, tocharaindex, 0); 
				if( dir != -1 ) { 
					dir = NPC_Util_SuberiWalk( index, dir); 
				} 
				if( dir != -1 ) { 
					ret = CHAR_walk( index, dir, 0); 
					if( ret != CHAR_WALKSUCCESSED) { 
						dir = -1; 
					} 
				} 
				if( dir == -1 ) { 
					warp = TRUE; 
				} 
			}else { 
				//andy_reEdit 2003/05/30 
				warp = TRUE; 
/*				CHAR_setInt( index, CHAR_MAILMODE,CHAR_PETMAIL_IDLE5); 
				CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); 
				CHAR_setInt( index, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL2); 
				PETMAIL_returnMail( index, tocharaindex); 
*/ 
			} 
		} 
	} 
	if( warp) { 
			CHAR_warpToSpecificPoint( index,  
								PETMAIL_SPOOLFLOOR,  
								PETMAIL_SPOOLX,PETMAIL_SPOOLX); 
			CHAR_setInt( index, CHAR_MAILMODE,CHAR_PETMAIL_IDLE4); 
			CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); 
			CHAR_setInt( index, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL2); 
	} 
} 
static void PETMAIL_IdleProc4( int index) 
{ 
  	unsigned int t = CHAR_getInt( index, CHAR_PETMAILIDLETIME); 
	{ 
		int		tocharaindex; 
		int		cnt; 
		tocharaindex = PETMAIL_CheckPlayerExist( index, 1);//寻找主人 
		if( tocharaindex != -1 ) { 
			if( CHAR_getWorkInt( tocharaindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE && 
				CHAR_getWorkInt( tocharaindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_FREE ){ 
 
				int		fl, x, y, ch_x, ch_y;//回到主人身边 
				 
				fl = CHAR_getInt( tocharaindex, CHAR_FLOOR); 
				ch_x = CHAR_getInt( tocharaindex, CHAR_X); 
				ch_y = CHAR_getInt( tocharaindex, CHAR_Y); 
				for( cnt = 0; cnt < 10; cnt ++ ) { 
					x = RAND( ch_x -1, ch_x + 1); 
					y = RAND( ch_y -1, ch_y + 1); 
					if( MAP_walkAble( index, fl,x,y)) { 
						break; 
					} 
				} 
				if( cnt == 10 ) { 
					x = ch_x;	y = ch_y; 
				} 
				CHAR_setInt( index, CHAR_MAILMODE,CHAR_PETMAIL_IDLE5); 
				CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); 
				CHAR_warpToSpecificPoint( index,fl, x,y); 
				PETMAIL_returnMail( index, tocharaindex); 
			} 
		}else { 
			if( NowTime.tv_sec > t + PETMAIL_IDLE_RETURNOWNER ) {//检查等待主人时间 
				int itemindex; 
				CHAR_warpToSpecificPoint( index, //回到原先主人所在座标 
									CHAR_getInt( index, CHAR_PETMAILFROMFLOOR), 
									CHAR_getInt( index, CHAR_PETMAILFROMX), 
									CHAR_getInt( index, CHAR_PETMAILFROMY)); 
									 
				CHAR_setInt( index, CHAR_MAILMODE, CHAR_PETMAIL_IDLE5);//改变宠邮状态 
				CHAR_setInt( index,	CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL2); 
				CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); 
				if( CHAR_getInt( index, CHAR_PETMAILIDLETIME) != -1 ) { 
					PETMAIL_deleteOffmsg( CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); 
				} 
				itemindex = CHAR_getItemIndex( index, CHAR_STARTITEMARRAY);//删除附带道具 
				if( ITEM_CHECKINDEX( itemindex ) ) { 
					CHAR_DropItem( index, CHAR_STARTITEMARRAY); 
 
					LogItem( 
						CHAR_getChar( index, CHAR_OWNERCHARANAME ), 
						CHAR_getChar( index, CHAR_OWNERCDKEY ), 
						itemindex, 
						"pm_returntimeout(宠邮->逾时删除道具)", 
						CHAR_getInt( index,CHAR_FLOOR), 
						CHAR_getInt( index,CHAR_X ), 
			 			CHAR_getInt( index,CHAR_Y ), 
						ITEM_getChar( itemindex, ITEM_UNIQUECODE), 
						ITEM_getChar( itemindex, ITEM_NAME), 
						ITEM_getInt( itemindex, ITEM_ID) 
					); 
				} 
			} 
		} 
	} 
 
} 
 
static void PETMAIL_IdleProc5( int index) 
{ 
  	unsigned int t = CHAR_getInt( index, CHAR_PETMAILIDLETIME); 
	if( NowTime.tv_sec > t + PETMAIL_IDLEDISCARD) { 
		Char	*ch; 
		CHAR_setInt( index, CHAR_MAILMODE, CHAR_PETMAIL_NONE); 
		CHAR_setInt( index, CHAR_PETMAILIDLETIME, 0); 
 
#ifdef _FIX_PETMAIL         // WON ADD 修正宠邮 
		CHAR_setInt( index, CHAR_PUTPETTIME, NowTime.tv_sec ); 
#endif 
#ifdef _PETMAIL_DEFNUMS 
		PETMAIL_delPetMailTotalnums( 1); //M PET 变自由宠 
		if( PetMailTotalnums < 0 ) PetMailTotalnums = 0; 
#endif 
	    ch  = CHAR_getCharPointer( index); 
	    if( ch != NULL ) { 
			strcpysafe( ch->charfunctable[CHAR_LOOPFUNC].string, 
						sizeof( ch->charfunctable[CHAR_LOOPFUNC]), "" ); 
			CHAR_constructFunctable( index); 
		} 
#ifdef _PET_LOSTPET 
		CHAR_CharSaveLostPet( index, 2); 
		LogPet( 
			"系统", 
			"Watchfunc", 
			CHAR_getChar( index, CHAR_NAME), 
			CHAR_getInt( index, CHAR_LV), 
			"timeout_lost(系统扣留-宠邮自由宠)", 
			CHAR_getInt( index, CHAR_FLOOR), 
			CHAR_getInt( index,CHAR_X ), 
			CHAR_getInt( index,CHAR_Y ), 
			CHAR_getChar( index, CHAR_UNIQUECODE)   // shan 2001/12/14 
		); 
		print("系统扣留-宠邮自由宠:%s\n", CHAR_getUseName( index)); 
		CHAR_CharaDelete( index); 
#else 
		LogPet( 
			CHAR_getChar( index, CHAR_OWNERCHARANAME ),  
			CHAR_getChar( index, CHAR_OWNERCDKEY ), 
			CHAR_getChar( index, CHAR_NAME), 
			CHAR_getInt( index, CHAR_LV), 
			"FreePet(宠邮变回自由宠)", 
			CHAR_getInt( index,CHAR_FLOOR), 
			CHAR_getInt( index,CHAR_X ), 
			CHAR_getInt( index,CHAR_Y ), 
			CHAR_getChar( index, CHAR_UNIQUECODE)   
		); 
#endif 
 
	}else { 
		int tocharaindex = PETMAIL_CheckPlayerExist( index, 1); 
		if( tocharaindex != -1 ) { 
			if( NPC_Util_CharDistance( tocharaindex, index ) > CHAR_DEFAULTSEESIZ/2) { 
				int		fl, x, y, ch_x, ch_y; 
				int		cnt; 
				fl = CHAR_getInt( tocharaindex, CHAR_FLOOR); 
				ch_x = CHAR_getInt( tocharaindex, CHAR_X); 
				ch_y = CHAR_getInt( tocharaindex, CHAR_Y); 
				for( cnt = 0; cnt < 10; cnt ++ ) { 
					x = RAND( ch_x -1, ch_x + 1); 
					y = RAND( ch_y -1, ch_y + 1); 
					if( MAP_walkAble( index, fl,x,y)) { 
						break; 
					} 
				} 
				if( cnt == 10 ) { 
					x = ch_x;	y = ch_y; 
				} 
				CHAR_warpToSpecificPoint( index,fl, x,y); 
			} 
		} 
	} 
} 
 
static void PETMAIL_returnMail( int index, int tocharaindex) 
{ 
	char	msgbuf[512]; 
	int itemindex = CHAR_getItemIndex( index, CHAR_STARTITEMARRAY); 
	if( ITEM_CHECKINDEX( itemindex ) ) { 
		int ret = CHAR_addItemSpecificItemIndex( tocharaindex, itemindex); 
		 
		if( ret < 0 || ret >= CHAR_MAXITEMHAVE){ 
			CHAR_DropItem( index, CHAR_STARTITEMARRAY); 
 
			LogItem( 
				CHAR_getChar( tocharaindex, CHAR_NAME ),  
				CHAR_getChar( tocharaindex, CHAR_CDKEY ), 
				itemindex, 
				"pm_returnputground(宠邮->道具已满将道具放置地上)", 
				CHAR_getInt( index,CHAR_FLOOR), 
				CHAR_getInt( index,CHAR_X ), 
	 			CHAR_getInt( index,CHAR_Y ), 
				ITEM_getChar( itemindex, ITEM_UNIQUECODE), 
						ITEM_getChar( itemindex, ITEM_NAME), 
						ITEM_getInt( itemindex, ITEM_ID) 
			); 
		}else { 
			CHAR_setItemIndex( index, CHAR_STARTITEMARRAY, -1); 
			CHAR_sendItemDataOne( tocharaindex, ret); 
		} 
	} 
 
#ifdef _PETMAIL_DEFNUMS 
	{ 
		int petmailnums = CHAR_getWorkInt( tocharaindex, CHAR_PETMAILNUMS); 
		petmailnums--; 
		if( petmailnums < 0 ) petmailnums = 0; 
		CHAR_setWorkInt( tocharaindex, CHAR_PETMAILNUMS, petmailnums); 
	} 
#endif 
	if( CHAR_getInt( index, CHAR_PETMAILBUFINDEX) != -1 ) { 
		snprintf( msgbuf, sizeof( msgbuf),  
					"%s 回来了!" 
					"似乎无法寄送信件。", 
					CHAR_getUseName( index)); 
		CHAR_talkToCli( tocharaindex, -1, msgbuf, CHAR_COLORWHITE); 
		PETMAIL_deleteOffmsg( CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); 
	}else { 
		snprintf( msgbuf, sizeof( msgbuf),  
					"%s 回来了!", CHAR_getUseName( index)); 
		CHAR_talkToCli( tocharaindex, -1, msgbuf, CHAR_COLORWHITE);		 
	} 
 
#ifdef _PETMAIL_DEFNUMS 
	CHAR_AutoPickupMailPet( tocharaindex, index); 
#endif 
 
} 
 
 
#ifdef _PETMAIL_DEFNUMS 
void CHAR_AutoPickupMailPet( int charaindex, int petindex ) 
{ 
	int objindex; 
	int havepetindex; 
	char category[3]; 
	Char 	*ch; 
	if( !CHAR_CHECKINDEX( charaindex ) ) return; 
#ifdef _AVID_TRADETRYBUG //丢出宠物 
	if( CHAR_getWorkInt( charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE ){ 
		CHAR_talkToCli( charaindex, -1, "交易状态中无法自动拾回邮件宠物!", CHAR_COLORYELLOW ); 
		return; 
	} 
#endif 
	if( !CHAR_CHECKINDEX( petindex ) ) return; 
	havepetindex = CHAR_getCharPetElement( charaindex); 
	if( havepetindex == -1 ) { 
 
		CHAR_talkToCli(charaindex,-1,"宠物栏已满!无法自动拾回邮件宠物!",CHAR_COLORYELLOW); 
		// WON ADD 
		LogPet( 
			CHAR_getChar( charaindex, CHAR_NAME ),  
			CHAR_getChar( charaindex, CHAR_CDKEY ), 
			CHAR_getChar( petindex, CHAR_NAME), 
			CHAR_getInt( petindex, CHAR_LV), 
			"Pet_Full(宠物栏已满,无法拾起宠物)", 
			CHAR_getInt( charaindex,CHAR_FLOOR), 
			CHAR_getInt( charaindex,CHAR_X ), 
			CHAR_getInt( charaindex,CHAR_Y ), 
			CHAR_getChar( petindex, CHAR_UNIQUECODE)    
	    );		  
		return; 
	} 
	ch  = CHAR_getCharPointer( petindex); 
	if( ch == NULL ) return; 
 
	objindex = CHAR_getWorkInt( petindex, CHAR_WORKOBJINDEX ); 
	CHAR_ObjectDelete(objindex); 
	CHAR_setWorkInt( petindex, CHAR_WORKPLAYERINDEX, charaindex); 
	CHAR_setCharPet( charaindex, havepetindex, petindex); 
 
	CHAR_setChar( petindex, CHAR_OWNERCDKEY, CHAR_getChar( charaindex, CHAR_CDKEY)); 
	CHAR_setChar( petindex, CHAR_OWNERCHARANAME, CHAR_getChar( charaindex, CHAR_NAME)); 
 
	snprintf( category,sizeof( category),"K%d",havepetindex); 
	CHAR_sendStatusString( charaindex, category); 
	snprintf( category,sizeof( category),"W%d",havepetindex); 
	CHAR_sendStatusString( charaindex, category); 
 
	CHAR_setInt( petindex, CHAR_PUTPETTIME, 0); 
	CHAR_setWorkInt( petindex, CHAR_WORKOBJINDEX, -1); 
	CHAR_setInt( petindex, CHAR_MAILMODE, CHAR_PETMAIL_NONE); 
	PETMAIL_delPetMailTotalnums( 1); // M PET 自动捡起 
 
	strcpysafe( ch->charfunctable[CHAR_LOOPFUNC].string, 
				sizeof( ch->charfunctable[CHAR_LOOPFUNC]),""); 
	CHAR_setInt( petindex, CHAR_LOOPINTERVAL, 0); 
	CHAR_constructFunctable( petindex); 
	CHAR_complianceParameter( petindex ); 
 
	if( PetMailTotalnums < 0 ) PetMailTotalnums = 0; 
	{ 
		char    mesg[256]; 
		char    *p = NULL; 
		p = CHAR_getChar( petindex, CHAR_USERPETNAME); 
		if( strlen( p) == 0 ) { 
			p = CHAR_getChar( petindex, CHAR_NAME); 
		} 
		snprintf( mesg,sizeof(mesg), "拾回邮件宠物 %s", p); 
		CHAR_talkToCli(charaindex,-1,mesg,CHAR_COLORYELLOW); 
	} 
	LogPet( 
		CHAR_getChar( charaindex, CHAR_NAME ),  
		CHAR_getChar( charaindex, CHAR_CDKEY ), 
		CHAR_getChar( petindex, CHAR_NAME), 
		CHAR_getInt( petindex, CHAR_LV), 
		"PickupMailPet(自动收回邮宠)", 
		CHAR_getInt( charaindex,CHAR_FLOOR), 
		CHAR_getInt( charaindex,CHAR_X ), 
		CHAR_getInt( charaindex,CHAR_Y ), 
		CHAR_getChar( petindex, CHAR_UNIQUECODE)    
	); 
	return; 
} 
#endif 
 
int PETMAIL_getPetMailTotalnums() 
{ 
#ifdef _PETMAIL_DEFNUMS 
	if( PetMailTotalnums < 0 ) PetMailTotalnums = 0; 
	if( PetMailTotalnums >= PETMAIL_DEFTOTALNUM ) PetMailTotalnums = PETMAIL_DEFTOTALNUM; 
	return PetMailTotalnums; 
#else 
	return 0; 
#endif 
} 
 
void PETMAIL_delPetMailTotalnums( int numflg) 
{ 
#ifdef _PETMAIL_DEFNUMS 
	PetMailTotalnums = PetMailTotalnums - numflg; 
	if( PetMailTotalnums < 0 ) PetMailTotalnums = 0; 
#endif 
} 
 
void PETMAIL_setPetMailTotalnums( int numflg) 
{ 
	PetMailTotalnums = numflg; 
	if( PetMailTotalnums < 0 ) PetMailTotalnums = 0; 
	if( PetMailTotalnums > PETMAIL_DEFTOTALNUM+10 ) PetMailTotalnums = PETMAIL_DEFTOTALNUM + 5; 
} 
 
 
int PETMAIL_CheckIsMyOffmsg( int fromindex, char *tocdkey, char *tocharaname) 
{ 
    int i, nums=0; 
    for( i = 0 ; i < PETMAIL_offmsg_max; i++ ) { 
        if( PETMAIL_offmsgbuf[i].use == 0 ) continue; 
		if( !strcmp( tocdkey, PETMAIL_offmsgbuf[i].destcd) && 
			!strcmp( tocharaname, PETMAIL_offmsgbuf[i].destcharname) ){ 
			nums++; 
		} 
    } 
    return nums; 
}