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

📄 npc_raceman.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 5 页
字号:
				break;
		}
		if( petNo >= 640 ){
			//sprintf(buuf2,"petimgnum:%d   pftable:%d   petNo:%d", petimgnum , petflgtable[2] , petNo);
			//CHAR_talkToCli( talker, -1,buuf2, CHAR_COLORYELLOW);
			strcpy(token,"\n	这只宠物怪怪的唷!");
			//log
			LogPet( CHAR_getChar( talker, CHAR_NAME ),
					CHAR_getChar( talker, CHAR_CDKEY ),
					CHAR_getChar( petindex, CHAR_NAME),
					CHAR_getInt( petindex, CHAR_LV),
					"raceman(猎宠大会非法宠记录)",
					CHAR_getInt( talker,CHAR_FLOOR),
					CHAR_getInt( talker,CHAR_X ),
					CHAR_getInt( talker,CHAR_Y ),
					CHAR_getChar( petindex, CHAR_UNIQUECODE)   
					);

			return FALSE;// 出问题罗,玩家拿不能拥有的宠物来登记 
		}

		//sprintf(buuf2,"petimgnum:%d   pftable:%d   petNo:%d", petimgnum , petflgtable[petNo] , petNo);
		//CHAR_talkToCli( talker, -1,buuf2, CHAR_COLORYELLOW);

		base = 1;
		intNo = petNo / 32 ;	
		shift = petNo % 32 ;
		base  = base << shift;

		//sprintf(buuf2,"intNo:%d   shift:%d   base:%d   data:%d", intNo , shift , base , CHAR_getInt( talker , CHAR_KINDCNT1 + intNo ));
		//CHAR_talkToCli( talker, -1,buuf2, CHAR_COLORYELLOW);

		if( CHAR_getInt( talker , CHAR_KINDCNT1 + intNo ) & base ){  
			NPC_Util_GetStrFromStrWithDelim( argstr , "repeat_msg", buf, sizeof( buf));
			sprintf(token,"\n	 %s",buf);
			return FALSE; 
		}else{
			sprintf(token,"		===         宠物登记         ==="
							"\n\n\n 您选择登记的宠物是    %s Lv:%d"
							,petname,CHAR_getInt( petindex, CHAR_LV)
							);		
		}
		*/
	}
	else
	{		
		if(NPC_Util_GetStrFromStrWithDelim( argstr , "CheckPet", buf, sizeof( buf)) != NULL ){
			checkpetID = atoi(buf);
			if( !ENEMY_CHECKINDEX( checkpetID )) return FALSE;

	//		sprintf(buuf2,"petindex:%d   checkpetID:%d  index:%d",petindex,checkpetID,index);
	//		CHAR_talkToCli( talker, -1,buuf2, CHAR_COLORYELLOW);

			/*保留gm指令dropmypet做法  结果同下段
			petarray = ENEMY_getEnemyArrayFromId( checkpetID );
			petindex2 = ENEMY_TEST_createPetIndex( petarray );
			test5  = CHAR_getInt( petindex2 , CHAR_BASEBASEIMAGENUMBER);
			*/
			
			index = ENEMYTEMP_getEnemyTempArray(ENEMY_getEnemyArrayFromId(checkpetID));
			if( !ENEMYTEMP_CHECKINDEX( index )) return FALSE;
			petimgnum  = ENEMYTEMP_getInt(index,E_T_IMGNUMBER); //GET ENEMYTEMP_enemy[index].intdata[E_T_IMGNUMBER];

			//sprintf(buuf,"check:%d   be_check:%d",petimgnum, CHAR_getInt( petindex , CHAR_BASEBASEIMAGENUMBER));           //petarry:%d   petindex2:%d  test5:%d",test1,test2,petarray,petindex2,test5);
			//CHAR_talkToCli( talker, -1,buuf, CHAR_COLORYELLOW);
		
			if(	CHAR_getInt( petindex , CHAR_BASEBASEIMAGENUMBER) == petimgnum ){

				NPC_Util_GetStrFromStrWithDelim( argstr , "PetLevel", buf, sizeof( buf));
				if (CHAR_getInt(petindex , CHAR_LV) < atoi(buf)){
					strcpy(token,"\n	这只宠物等级不够!");   	
					return  FALSE;
				}

				sprintf(token,"		===         宠物登记         ==="
								"\n\n\n 您选择登记的宠物是    %s Lv:%d"
								,petname,CHAR_getInt( petindex, CHAR_LV)
								);		
			}else{
				strcpy(token,"\n	比赛的题目没有这只宠物哦!");
				return FALSE;
			}
		}
	}
	return TRUE;	
}

int Raceman_getokask( int talker, int random )
{
	int base,i,shift;

	base = random / 32 ;
	shift = random % 32 ;
	i = 1 << shift ;
	if(	CHAR_getInt( talker , CHAR_KINDCNT1 + base ) & i ){	//为真表示解过了
		random ++;
		if( random >= asktotal ) random = 0;
		return Raceman_getokask( talker , random );
	}else
		return random;	
}
		
BOOL  Raceman_petcheckin( int meindex , int talker )
{
	int  petindex,fd,item,i,itemindex,itemid,gmode;
	char *petname;
	char id[16],name[64];
	char buf[64],buf1[64]; //buuf[128];
	char category[12];
	char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
	int  base,intNo,shift,petNo,j;	
	unsigned int  askno,asklv,temp;
	
	if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr)) == NULL) {  //读参数
		print("MsgDisp:GetArgStrErr");
		print("NPCName=%s\n", CHAR_getChar( meindex, CHAR_NAME));
		return FALSE;
	}
	
	//保险检查
	for( i = 0 ; i < 5 ; i ++ ){
		j = CHAR_getInt( talker,CHAR_CATCHCNT1 + i ) ;
		if( j++ >= 0xFFFFFF ) {
			CHAR_talkToCli( talker, -1, "很抱歉,您已经达到系统上限,无法再登记了", CHAR_COLORYELLOW);
			return FALSE;
		}
	}
	
	petindex = CHAR_getCharPet( talker, CHAR_getWorkInt( talker , CHAR_WORK_PETSELECT ) );
	if( !CHAR_CHECKINDEX(petindex) ) return FALSE;
	petname = CHAR_getUseName( petindex);

	//写入宠物栏位
	NPC_Util_GetStrFromStrWithDelim( argstr , "GameCode", buf, sizeof( buf));		
	CHAR_setInt( petindex, CHAR_CHECKIN , atoi(buf) );  
	LogPet( CHAR_getChar( talker, CHAR_NAME ),
			CHAR_getChar( talker, CHAR_CDKEY ),
			CHAR_getChar( petindex, CHAR_NAME),
			CHAR_getInt( petindex, CHAR_LV),
			"raceman(猎宠大会收宠时记录)",
			CHAR_getInt( talker,CHAR_FLOOR),
			CHAR_getInt( talker,CHAR_X ),
			CHAR_getInt( talker,CHAR_Y ),
			CHAR_getChar( petindex, CHAR_UNIQUECODE)   
			);

	//收宠
	if( NPC_Util_GetStrFromStrWithDelim( argstr, "DelFlag",buf, sizeof( buf) ) != NULL){
		if( strcmp(buf,"on")==0){
			CHAR_endCharOneArray( petindex );
			CHAR_setCharPet( talker ,  CHAR_getWorkInt( talker , CHAR_WORK_PETSELECT ) , -1);
			snprintf( category, sizeof( category), "K%d", CHAR_getWorkInt( talker , CHAR_WORK_PETSELECT ));
			CHAR_sendStatusString( talker , category );
			snprintf( category, sizeof( category), "W%d",CHAR_getWorkInt( talker , CHAR_WORK_PETSELECT ));
			CHAR_sendStatusString( talker , category );
			//log
			LogPet( CHAR_getChar( talker, CHAR_NAME ),
					CHAR_getChar( talker, CHAR_CDKEY ),
					CHAR_getChar( petindex, CHAR_NAME),
					CHAR_getInt( petindex, CHAR_LV),
					"raceman(猎宠大会收宠时记录)",
					CHAR_getInt( talker,CHAR_FLOOR),
					CHAR_getInt( talker,CHAR_X ),
					CHAR_getInt( talker,CHAR_Y ),
					CHAR_getChar( petindex, CHAR_UNIQUECODE)   
					);
		}
	}	

	//分限定种类还是不同种类
	NPC_Util_GetStrFromStrWithDelim( argstr , "GameMode", buf, sizeof( buf));		
	gmode = atoi(buf);
	if(gmode==4||gmode==5)  //不同种类
	{
		petNo = ( CHAR_getInt( talker ,CHAR_CHECKIN ) & 0x7FC00000 ) >> 22 ;	
		//petNo -= 1; 
		intNo = petNo / 32 ;	
		shift = petNo % 32 ;
		base  = 1 << shift;
		CHAR_setInt( talker , CHAR_KINDCNT1 + intNo , CHAR_getInt( talker , CHAR_KINDCNT1 + intNo ) | base );
		//sprintf(buuf,"chkin data:%d", CHAR_getInt( talker , CHAR_KINDCNT1 + intNo ) );
		//CHAR_talkToCli( talker, -1,buuf, CHAR_COLORYELLOW);

		//分成个人还是家族赛
		if(gmode == 5) //设定为家族赛
		{
			CHAR_setInt( talker,CHAR_CATCHCNT5,CHAR_getInt( talker,CHAR_CATCHCNT5 ) +1 );
			strcpy(name,CHAR_getChar(talker,CHAR_FMNAME));			//家族名称
			sprintf(id,"%d",CHAR_getWorkInt(talker, CHAR_WORKFMINDEXI));	//家族id
		}
		else	// 4
		{
			//玩家抓宠次数加1
			fd = getfdFromCharaIndex(talker);
			CHAR_setInt( talker,CHAR_CATCHCNT4,CHAR_getInt( talker,CHAR_CATCHCNT4 ) +1 );
			CONNECT_getCharname( fd, name, sizeof( name ) );  //人物名称
			CONNECT_getCdkey( fd, id , sizeof( id ) );		  //帐号		
		}
	}
	else	// 1 2 3
	{
		//分成个人还是家族赛
		if(gmode == 3) //设定为家族赛
		{
			//族长次数加1
			CHAR_setInt( talker,CHAR_CATCHCNT3,CHAR_getInt( talker,CHAR_CATCHCNT3 ) +1 );
			strcpy(name,CHAR_getChar(talker,CHAR_FMNAME));			//家族名称
			sprintf(id,"%d",CHAR_getWorkInt(talker, CHAR_WORKFMINDEXI));	//家族id
		}
		else
		{
			//玩家抓宠次数加1
			fd = getfdFromCharaIndex(talker);
			CONNECT_getCharname( fd, name, sizeof( name ) );  //人物名称
			CONNECT_getCdkey( fd, id , sizeof( id ) );		  //帐号		
			if(gmode == 1 )
				CHAR_setInt( talker,CHAR_CATCHCNT1,CHAR_getInt( talker,CHAR_CATCHCNT1 ) +1 );
			else
				CHAR_setInt( talker,CHAR_CATCHCNT2,CHAR_getInt( talker,CHAR_CATCHCNT2 ) +1 );
		}
	}

	//判断现在是比什麽
	switch(gmode)
	{
	case 1:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode1", buf, sizeof( buf)); break;
	case 2:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode2", buf, sizeof( buf)); break;
	case 3:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode3", buf, sizeof( buf)); break;
	case 4:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode4", buf, sizeof( buf)); break;
	case 5:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode5", buf, sizeof( buf)); break;
	}
	//ac做一次记录跟排名 (fd,charaindex,id,name,limittime,racetype,catchcnt,ranknum)
	//sprintf(buuf,"acfd:%d talker:%d mode:%s id:%s name:%s catchcnt:%d",acfd,talker,buf,id,name,CHAR_getInt( talker,CHAR_CATCHCNT ) );
	//CHAR_talkToCli( talker, -1, buuf, CHAR_COLORYELLOW);
	if(gmode == 3 || gmode == 5){
		saacproto_ACRaceRecordfmdo_send( acfd , talker , CHAR_getInt( talker, CHAR_FMINDEX )
			, CHAR_getInt( petindex, CHAR_BASEBASEIMAGENUMBER) , CHAR_getChar( petindex, CHAR_UNIQUECODE ) , CHAR_getChar( petindex, CHAR_NAME) );
		
		//sprintf(buuf,"acfd:%d talker:%d fmid:%d bbi:%d unicode:%s petn:%s",acfd,talker,CHAR_getInt( talker, CHAR_FMINDEX )
		//	,CHAR_getInt( petindex, CHAR_BASEBASEIMAGENUMBER),CHAR_getChar( petindex, CHAR_UNIQUECODE ),CHAR_getChar( petindex, CHAR_NAME));
		//CHAR_talkToCli( talker, -1, buuf, CHAR_COLORYELLOW);
	}
	saacproto_ACRaceRecordandSort_send( acfd , talker , buf , id , name ,
		0 , CHAR_getInt( talker,CHAR_CATCHCNT1+gmode-1 ) , 0 ) ;
	

	//猎宠证次数加1 或 决定下一个题目
  	if( NPC_Util_GetStrFromStrWithDelim( argstr, "CheckItem",
											 buf, sizeof( buf) ) != NULL)
	{
		item = atoi(buf);
		for( i = 0 ; i < CHAR_MAXITEMHAVE ; i++ ) {
			itemindex=CHAR_getItemIndex( talker , i );
			if( ITEM_CHECKINDEX( itemindex) ) {
				itemid=ITEM_getInt( itemindex ,ITEM_ID );
				//print("itemindex:%d  itemid:%d  item:%d\n",itemindex,itemid,item);
				if(itemid==item){	//找到猎宠证
					if(gmode < 4)
						sprintf( buf1, "目前猎宠记录%d只。", CHAR_getInt( talker,CHAR_CATCHCNT1+gmode-1 ) );
					else{
						if(CHAR_getInt( talker,CHAR_CATCHCNT5 ) >= asktotal ){
							sprintf( buf1,"恭喜你达到猎宠大赛终极目标,祝您抽中大奖");
						}else{
							askno = Raceman_getokask( talker , rand() % asktotal );
							asklv = asktable[askno].lowlv + rand()%((asktable[askno].highlv+1)-asktable[askno].lowlv);
							temp = (askno << 22) & 0x7FC00000;
							temp = temp | ((asklv << 14) & 0x003FC000);
							temp = temp | ((asktable[askno].bbi - 100000) & 0x00003FFF);
							CHAR_setInt(  talker , CHAR_CHECKIN , temp );  		
							if( asktable[askno].highlv == 0 )
								sprintf( buf1,"请抓给我等级%d『以上』的%s好吗。您目前记录%d种", asktable[askno].lowlv , asktable[askno].petname, CHAR_getInt( talker,CHAR_CATCHCNT1+gmode-1 ) );
							else
								sprintf( buf1,"请抓给我『只能』等级%d的%s好吗。您目前记录%d种", asklv , asktable[askno].petname, CHAR_getInt( talker,CHAR_CATCHCNT1+gmode-1 ) );
						}
					}
					ITEM_setChar( itemindex, ITEM_EFFECTSTRING, buf1);
					CHAR_sendItemDataOne( talker , i );
					break;
				}					
			}
		}
	}

	sprintf( buf,"%sLv:%d登记完成了,加油加油。",petname,CHAR_getInt( petindex, CHAR_LV ));
	CHAR_talkToCli( talker, -1, buf , CHAR_COLORWHITE);

	return TRUE;
}

//读放在saac的排名资料,而且要是目前比赛的项目
void Raceman_countrank( int meindex, int talker )
{
	char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
	int  ranknum = 0,gmode;
	char buf[64],buf1[64];

	if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr)) == NULL) {  //读参数
		print("MsgDisp:GetArgStrErr");
		print("NPCName=%s\n", CHAR_getChar( meindex, CHAR_NAME));
		return;
	}

	if(NPC_Util_GetStrFromStrWithDelim( argstr , "RankNum", buf1, sizeof( buf1)) != NULL ){	
		ranknum = atoi(buf1);
	}
	
	NPC_Util_GetStrFromStrWithDelim( argstr , "GameMode", buf, sizeof( buf));		
	gmode = atoi(buf);

	switch(gmode)
	{
	case 1:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode1", buf, sizeof( buf)); break;
	case 2:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode2", buf, sizeof( buf)); break;
	case 3:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode3", buf, sizeof( buf)); break;
	case 4:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode4", buf, sizeof( buf)); break;
	case 5:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode5", buf, sizeof( buf)); break;
	}

	saacproto_ACRaceRecordandSort_send( acfd,talker,buf,"","",gmode,0,ranknum );

}

void Raceman_renewrank( int meindex , int talker , int select )
{
	char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
	int  ranknum = 0;
	char buf[64],buf1[64];

	if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr)) == NULL) {  //读参数
		print("MsgDisp:GetArgStrErr");
		print("NPCName=%s\n", CHAR_getChar( meindex, CHAR_NAME));
		return;
	}

	if(NPC_Util_GetStrFromStrWithDelim( argstr , "RankNum", buf1, sizeof( buf1)) != NULL ){	
		ranknum = atoi(buf1);
	}

	if(NPC_Util_GetStrFromStrWithDelim( argstr , "HasGame", buf, sizeof( buf)) != NULL ){
		getStringFromIndexWithDelim( buf , "," , select , buf1 , sizeof(buf1) );		
		select = atoi(buf1);
		switch(select)
		{
		case 1:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode1", buf, sizeof( buf)); break;
		case 2:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode2", buf, sizeof( buf)); break;
		case 3:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode3", buf, sizeof( buf)); break;
		case 4:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode4", buf, sizeof( buf)); break;
		case 5:NPC_Util_GetStrFromStrWithDelim( argstr , "Mode5", buf, sizeof( buf)); break;
		default: return;
		}
		saacproto_ACRaceRecordandSort_send( acfd,talker,buf,"","",select,0,ranknum );
	}
}

//检查是否有资格领奖 
BOOL Raceman_checkprize( int meindex , int talker ,char *token)
{
	char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
	char buf[256],buf1[64];
	int  lowlevel;//最低标准  下限	
	int  gmode;

	if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr)) == NULL) {  //读参数
		print("MsgDisp:GetArgStrErr");
		print("NPCName=%s\n", CHAR_getChar( meindex, CHAR_NAME));
		return FALSE;
	}

	NPC_Util_GetStrFromStrWithDelim( argstr , "EndFlag", buf1, sizeof( buf1));
	if( strcmp(buf1,"off")==0){   // 比赛没结束 所以不能领
		NPC_Util_GetStrFromStrWithDelim( argstr , "notend_

⌨️ 快捷键说明

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