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

📄 petmail.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 3 页
字号:

	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;
}



⌨️ 快捷键说明

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