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

📄 petmail.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 3 页
字号:
    }
    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;

⌨️ 快捷键说明

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