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

📄 pet_event.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 2 页
字号:
				CHAR_setWorkInt( talker, CHAR_WORKWARPCHECK, TRUE );
				return TRUE;
			}
		}else{
			if( PetTalk_BSCheck( meindex, talker, buff2) == TRUE ){
				CHAR_setWorkInt( talker, CHAR_WORKWARPCHECK, TRUE );
				return TRUE;
			}
		}
	}
	CHAR_setWorkInt( talker, CHAR_WORKWARPCHECK, FALSE );
	return FALSE;
}

BOOL PetTalk_BSCheck(int meindex,int talker,char* buf)
{
	char buff2[128];
	int kosuu,temp=-1,flg=0;
	char buff1[128],buff3[128];
	if(strstr( buf, "-") != NULL)	{
		//buff3为抓宠物ID
		getStringFromIndexWithDelim( buf, "-", 2, buff3, sizeof(buff3));
		temp = atoi( buff3);
		getStringFromIndexWithDelim( buf, "-", 1, buff1, sizeof(buff1));
		strcpy( buf, buff1);
        }                         
	if(strstr( buf, "<") != NULL){
		getStringFromIndexWithDelim( buf, "<", 2, buff2, sizeof(buff2));
		kosuu = atoi( buff2);
		getStringFromIndexWithDelim( buf, "<", 1, buff2, sizeof(buff2));

		if(PetTalk_FreeIfCheck( meindex, talker, buff2, kosuu, 1, temp)==TRUE){
			return TRUE;
		}
	}else if(strstr( buf, ">") != NULL){
		getStringFromIndexWithDelim( buf, ">", 2, buff2, sizeof(buff2));
		kosuu = atoi(buff2);
		getStringFromIndexWithDelim( buf, ">" ,1, buff2, sizeof(buff2));

		if(PetTalk_FreeIfCheck( meindex, talker, buff2, kosuu, 2, temp)==TRUE){
			return TRUE;
		}
	}else if(strstr( buf, "!" ) != NULL){
		getStringFromIndexWithDelim( buf, "!=", 2, buff2, sizeof(buff2));
		kosuu = atoi( buff2);
		getStringFromIndexWithDelim( buf, "!=", 1, buff2, sizeof(buff2));
		if(PetTalk_FreeIfCheck( meindex, talker, buff2, kosuu, 0, temp) == TRUE){
			return FALSE;
		}else{
			return TRUE;
		}

	}else if(strstr( buf, "=") != NULL){
		getStringFromIndexWithDelim( buf, "=", 2, buff2, sizeof(buff2));
		kosuu = atoi( buff2);
		getStringFromIndexWithDelim( buf, "=", 1, buff2, sizeof(buff2));

		if( strstr( buf, "PET"))	{
			flg = 3;
		}
		if(strstr( buf, "*") != NULL){
			if( PetTalk_WarpManReduce( meindex, talker, buf)==TRUE){
				return TRUE;
			}
		}else if(PetTalk_FreeIfCheck( meindex, talker, buff2, kosuu, flg, temp)==TRUE){
			return TRUE;
		}
	}
	return FALSE;
}

BOOL PetTalk_FreeIfCheck(int meindex,int talker,char* buf,int kosuu,int flg, int temp)
{
	int Type = -1;
	if(strcmp(buf,"LV")==0){
		if(PetTalk_LevelCheck(meindex,talker,kosuu,flg)==TRUE){
				return TRUE;
		}
	}
	
	if( strcmp( buf, "TRANS") == 0 )	{
		if( PetTalk_CheckTrans( meindex, talker, kosuu, flg) == TRUE )
			return TRUE;
	}
	if( strcmp( buf, "PET") == 0 )	{
		if( temp > 0 )	{
			if( PetTalk_CheckMyPet( meindex, talker, kosuu, flg, temp) == TRUE )
				return TRUE;
		}else
			return FALSE;
	}	
	if(strcmp( buf, "ITEM")==0){
		if(PetTalk_ItemCheck(meindex,talker,kosuu,flg)==TRUE){
				return TRUE;
		}
	}
	if(strcmp( buf, "ENDEV")==0){
		if(NPC_EventCheckFlg( talker, kosuu)==TRUE){
				return TRUE;
		}
	}
	if(strcmp( buf, "NOWEV")==0){
		if(NPC_NowEventCheckFlg( talker, kosuu)==TRUE){
				return TRUE;
		}
	}
	if(strcmp( buf, "HP" ) == 0 )	{
		Type = 0;
		if( PetTalk_CheckMyType( meindex, talker, kosuu, flg, Type ) == TRUE )	{
			return TRUE;
		}
	}
#ifdef _PET_TALKBBI
    if(strcmp( buf, "BBI" ) == 0 )	{
		if( PET_CheckPlayerBBI( meindex, talker, kosuu, flg)== TRUE)	{
			return TRUE;
		}
	}
#endif
	return FALSE;
}
BOOL PetTalk_CheckMyType( int meindex, int toindex, int kosuu, int flg, int Type )	{
	int MyType=0,MyMaxType=0;
	switch( Type )	{
	case 0:	//HP
		MyType = CHAR_getInt( toindex, CHAR_HP);
		MyMaxType = CHAR_getWorkInt( toindex, CHAR_WORKMAXHP);
		MyMaxType = (MyMaxType * kosuu )/ 100;
		if( PetTalk_BigSmallLastCheck( MyMaxType, MyType , flg ) == TRUE )	{
			return TRUE;
		}
	break;
	}
	return FALSE;
}

BOOL PetTalk_WarpManReduce(int meindex,int talker,char *buf)
{
	char buf2[512];
	char buf3[256];
	int id=0;
	int i;
	int itemindex;
	int itemno;
	int kosuu;
	int cnt=0;
	
	getStringFromIndexWithDelim(buf,"=",2,buf2,sizeof(buf2));
	getStringFromIndexWithDelim(buf2,"*",1,buf3,sizeof(buf3));
	itemno = atoi(buf3);
	getStringFromIndexWithDelim(buf2,"*",2,buf3,sizeof(buf3));
	kosuu = atoi(buf3);
	for( i=0 ; i < CHAR_MAXITEMHAVE;i++ ){
		itemindex=CHAR_getItemIndex( talker , i );
		if( ITEM_CHECKINDEX(itemindex) ){
			id=ITEM_getInt(itemindex ,ITEM_ID );
			if(itemno==id){
				cnt++;
				if(cnt==kosuu){
					return TRUE;
				}
			}
		}
	}
	return FALSE;
}

BOOL PetTalk_LevelCheck(int meindex,int talker,int level,int flg)
{
	int mylevel;
	mylevel=CHAR_getInt(talker,CHAR_LV);
	if(PetTalk_BigSmallLastCheck(level,mylevel,flg)==TRUE)	{
		return TRUE;
	}
	return FALSE;
}

BOOL PetTalk_CheckTrans(int meindex,int talker,int trans,int flg)
{
	int myTrans;
	myTrans=CHAR_getInt(talker, CHAR_TRANSMIGRATION);
	if( PetTalk_BigSmallLastCheck( trans, myTrans, flg ) == TRUE )	{
             return TRUE;
        }                   
	return FALSE;
}

BOOL PetTalk_CheckMyPet( int meindex, int talker, int petLv, int flg, int petid)
{
	int petsel,petindex=-1;	

	for(petsel=0 ; petsel < CHAR_MAXPETHAVE ; petsel++)     {
		petindex = CHAR_getCharPet( talker, petsel);
		if( petindex == -1  )
			continue;
	        if(CHAR_getInt( petindex, CHAR_PETID) !=  petid )
			continue;
		break;
	}
	if( petsel  == CHAR_MAXPETHAVE )	{
		return FALSE;
	}else	{	//找到条件宠
		if( PetTalk_BigSmallLastCheck( petLv, CHAR_getInt( petindex, CHAR_LV), flg ) == TRUE  )
			return TRUE;
	}
	return FALSE;                                             
}

BOOL PetTalk_ItemCheck(int meindex,int talker,int itemNo,int flg)
{
	int i;
	int itemindex=-1;
	int id;
	for( i=0;i<CHAR_MAXITEMHAVE;i++ ){
		itemindex = CHAR_getItemIndex( talker , i );
		if( ITEM_CHECKINDEX( itemindex) )	{
			id=ITEM_getInt(itemindex ,ITEM_ID );
			if( PetTalk_BigSmallLastCheck(itemNo,id,flg) == TRUE )
				return TRUE;
		}
	}
	return FALSE;
}

BOOL PetTalk_BigSmallLastCheck(int point1,int mypoint,int flg)
{
	if(flg==0){
		if(point1==mypoint) {
			return TRUE;
		}	
	}else if(flg==1){
		if(mypoint < point1) {
			return TRUE;
		}
	}else if(flg==2){
		if(mypoint > point1) {
			return TRUE;
		}
	}
	return FALSE;
}
#else
void PET_Talkfunc(  int meindex, int talkerindex, char *msg, int color)
{
	print("\n PET_Talkfunc(...) return; ");
	return;
}
#endif

void PET_CleanFreePetAll()
{
	int objindex;
	int objmaxnum = OBJECT_getNum();

	for( objindex=0; objindex<objmaxnum; objindex++)	{
		if( CHECKOBJECT( objindex ) == FALSE ) continue;
		PET_CleanPetdeletetime( objindex);
	}
}

int PET_CleanPetdeletetime( int objmeindex)
{
	int		pindex;

	if( OBJECT_getType(objmeindex) != OBJTYPE_CHARA ) return 0;
	pindex = OBJECT_getIndex( objmeindex);
	if( CHAR_getInt( pindex, CHAR_WHICHTYPE) != CHAR_TYPEPET) return 0;
#ifdef _MARKET_TRADE
	if( CHAR_getWorkInt( pindex, CHAR_WORKTRADETYP) == TRADETYPE_SELL) return 0;
#endif
	if( CHAR_getInt( pindex, CHAR_MAILMODE) != CHAR_PETMAIL_NONE) {
	}else if( CHAR_getWorkInt( pindex, CHAR_WORKPETFOLLOWMODE) == CHAR_PETFOLLOW_NOW ){
	}else {
#ifdef _PET_LOSTPET
//		CHAR_CharSaveLostPet( pindex, 0);
#endif
		LogPet(
			"系统",
			"Watchfunc",
			CHAR_getChar( pindex, CHAR_NAME),
			CHAR_getInt( pindex, CHAR_LV),
			"timeout_lost(系统清除-地上自由宠)",
			CHAR_getInt( pindex, CHAR_FLOOR),
			CHAR_getInt( pindex,CHAR_X ),
			CHAR_getInt( pindex,CHAR_Y ),
			CHAR_getChar( pindex, CHAR_UNIQUECODE)   // shan 2001/12/14
		);
		CHAR_CharaDelete(pindex);
		return 1;
	}
	return 0;
}

void PET_CHECKFreePetIsIt( int petindex)
{
	int petputtime, defmaxtime;
	defmaxtime = getPetdeletetime();
	petputtime = CHAR_getInt( petindex, CHAR_PUTPETTIME);

	if( NowTime.tv_sec < ( petputtime + getPetdeletetime() ) ) return;

#ifdef _PET_LOSTPET
//	CHAR_CharSaveLostPet( petindex, 0);
#endif

	LogPet(
			"系统",
			"Watchfunc",
			CHAR_getChar( petindex, CHAR_NAME),
			CHAR_getInt( petindex, CHAR_LV),
			"timeout_lost(系统清除-地上自由宠)",
			CHAR_getInt( petindex, CHAR_FLOOR),
			CHAR_getInt( petindex,CHAR_X ),
			CHAR_getInt( petindex,CHAR_Y ),
			CHAR_getChar( petindex, CHAR_UNIQUECODE)   // shan 2001/12/14
		);

	CHAR_CharaDelete(petindex);
}

#define PETFOLLOW_TIME 60*60
void PET_Watchfunc( int objmeindex, int objmoveindex, CHAR_ACTION act, int x, int y, int dir,
                           int* opt, int optlen )
{
	int		pindex;
	int		petindex;
	int		petputtime;
	
	if( OBJECT_getType(objmoveindex) != OBJTYPE_CHARA ) return;
	pindex = OBJECT_getIndex( objmoveindex);
	if( CHAR_getInt( pindex, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) return;
	petindex = OBJECT_getIndex( objmeindex);
	petputtime = CHAR_getInt( petindex, CHAR_PUTPETTIME);

#ifdef _MARKET_TRADE
	if( CHAR_getWorkInt( petindex, CHAR_WORKTRADETYP) != TRADETYPE_SELL)	{
#endif
		if( CHAR_getInt( petindex, CHAR_MAILMODE) != CHAR_PETMAIL_NONE) {
			//宠邮不处理
		}else if( CHAR_getWorkInt( petindex, CHAR_WORKPETFOLLOWMODE) == CHAR_PETFOLLOW_NOW ){
			if( NowTime.tv_sec >= (petputtime + 60*60) ) {
				int	ownerindex = CHAR_getWorkInt( petindex, CHAR_WORKPLAYERINDEX);
				if( CHAR_CHECKINDEX( ownerindex) ){
					if( CHAR_pickupFollowPet( ownerindex, petindex ) )	{
						return;
					}
					CHAR_talkToCli( ownerindex, -1, "溜宠太久,宠物走失了!!", CHAR_COLORYELLOW );
				}
#ifdef _PET_LOSTPET
				CHAR_CharSaveLostPet( petindex, 1);
				LogPet(
					"系统",
					"Watchfunc",
					CHAR_getChar( petindex, CHAR_NAME),
					CHAR_getInt( petindex, CHAR_LV),
					"timeout_lost(系统扣留-溜宠自由宠)",
					CHAR_getInt( petindex, CHAR_FLOOR),
					CHAR_getInt( petindex,CHAR_X ),
					CHAR_getInt( petindex,CHAR_Y ),
					CHAR_getChar( petindex, CHAR_UNIQUECODE)   // shan 2001/12/14
				);
				print("系统扣留-溜宠自由宠:%s\n", CHAR_getUseName( petindex));
				CHAR_CharaDelete( petindex);
#else
				CHAR_setInt( petindex, CHAR_PUTPETTIME, NowTime.tv_sec);
				CHAR_setWorkInt( petindex, CHAR_WORKPETFOLLOWMODE, CHAR_PETFOLLOW_NONE);
				LogPet(
					CHAR_getChar( pindex, CHAR_NAME ),
					CHAR_getChar( pindex, CHAR_CDKEY ),
					CHAR_getChar( petindex, CHAR_NAME),
					CHAR_getInt( petindex, CHAR_LV),
					"timeout_lost(溜宠太久,宠物走失))",
					CHAR_getInt( pindex,CHAR_FLOOR),
					CHAR_getInt( pindex,CHAR_X ),
	 				CHAR_getInt( pindex,CHAR_Y ),
					CHAR_getChar( petindex, CHAR_UNIQUECODE)   // shan 2001/12/14

				);
#endif
				return;
			}

		}else{
			PET_CHECKFreePetIsIt( petindex);
		}
#ifdef _MARKET_TRADE
	}
#endif
	if( CHAR_getInt( petindex, CHAR_MAILMODE) == CHAR_PETMAIL_IDLE3 ||
		CHAR_getInt( petindex, CHAR_MAILMODE) == CHAR_PETMAIL_IDLE2){
		if( act == CHAR_ACTATTACK) {
			if( NPC_Util_isFaceToChara( pindex,petindex,1 ) == TRUE ) {
				int action[2] = { CHAR_ACTDAMAGE, CHAR_ACTGUARD};
				CHAR_sendWatchEvent( objmeindex, action[RAND(0,1)], NULL,0,FALSE);
				CHAR_setWorkInt( petindex, CHAR_WORKACTION, act);
			}
		}
	}else if( CHAR_getInt( petindex, CHAR_MAILMODE) != CHAR_PETMAIL_NONE) {
		;
	}else if( CHAR_getWorkInt( petindex, CHAR_WORKFIXAI) >= 100 ) {
		int	workpindex = CHAR_getWorkInt( petindex, CHAR_WORKPLAYERINDEX);
		if( act == CHAR_ACTWALK && CHAR_CHECKINDEX( workpindex) && workpindex == pindex ){
			dir = NPC_Util_GetDirCharToChar( petindex, pindex, 0);
			if( dir != -1 ) {
				if( CHAR_getInt( petindex, CHAR_DIR) != dir ) {
					CHAR_setInt( petindex, CHAR_DIR, dir);
					CHAR_sendWatchEvent( CHAR_getWorkInt( petindex, CHAR_WORKOBJINDEX),
											CHAR_ACTTURN,NULL,0,TRUE);
				}
			}
		}else if( NPC_Util_isFaceToFace( petindex, pindex, 2 ) == TRUE ) {
			switch( act) {
			  case CHAR_ACTATTACK:
			  case CHAR_ACTDAMAGE:
			  case CHAR_ACTDOWN:
			  case CHAR_ACTSTAND:
			  case CHAR_ACTACTIONWALK:
			  case CHAR_ACTGUARD:
              case CHAR_ACTACTIONSTAND:
				CHAR_sendWatchEvent( objmeindex, act, NULL,0,FALSE);
				CHAR_setWorkInt( petindex, CHAR_WORKACTION, act);
				break;
			  default:
			  	break;
			}
		}
	}else {
/*
#ifdef _MARKET_TRADE
		if( CHAR_getWorkInt( petindex, CHAR_WORKTRADETYP) != TRADETYPE_SELL)	{
#endif
			if( CHAR_getWorkInt( petindex, CHAR_WORKPETFOLLOWMODE) != CHAR_PETFOLLOW_NOW ){
				if( RAND(0,30) == 1 ) {
					CHAR_walk( petindex,RAND( 0,7),0);
				}
			}
#ifdef _MARKET_TRADE
		}
#endif
*/
	}
	return;
}

#ifdef _PET_TALKBBI
BOOL PET_CheckPlayerBBI( int meindex, int charindex, int BBI, int flg)
{
	int MyBBI;
	if( !CHAR_CHECKINDEX( charindex))
		return FALSE;
	if( BBI < 0 )
		return FALSE;
	MyBBI = CHAR_getInt( charindex, CHAR_BASEIMAGENUMBER);

	if(flg==0){
		if(BBI==MyBBI)
			return TRUE;
	}else if(flg==1){
		if(BBI < MyBBI)
			return TRUE;
	}else if(flg==2){
		if(BBI > MyBBI)
			return TRUE;
	}

	return FALSE;
}
#endif

⌨️ 快捷键说明

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