char_talk.c

来自「石器时代8.0服务端完整源代码。可以直接编译」· C语言 代码 · 共 1,562 行 · 第 1/4 页

C
1,562
字号
 * 娄醒 *  message     char*           丢永本□斥     *  kind        char*           p or s or i卅及丢永本□斥 *  kindlen     int             kind 及赢今 *  body        char**          丢永本□斥    及禾奶件正□及伞  桦赭 * 忒曰袄 *  卅仄 ------------------------------------------------------------*/void CHAR_getMessageBody(char* message,char* kind,int kindlen,char** body){    int firstchar;	/* 1  侬  毛切之匀仁[1  侬匹丐月仇午反lssproto.html互忡据 */	// Nuke +1: For invalid message attack	*body = 0;    firstchar = message[0];    if( firstchar == 'P' ||        firstchar == 'S' ||        firstchar == 'D'        // CoolFish: Trade 2001/4/18	|| firstchar == 'C'        || firstchar == 'T'        || firstchar == 'W'                                        // CoolFish: Family 2001/5/28	|| firstchar == 'A'        || firstchar == 'J'        || firstchar == 'E'        || firstchar == 'M'                || firstchar == 'B'        || firstchar == 'X'        || firstchar == 'R'        || firstchar == 'L'         ){        if( kindlen >= 2 ){            kind[0] = firstchar;            kind[1] = '\0';        } else {            return;        }    } else {        return;    }	*body = message + 2;}static BOOL CHAR_Talk_check( int talkerindex, int talkedindex, int micflg ){#if 1	if( !CHAR_getFlg( talkerindex, CHAR_ISPARTYCHAT )){		int talker_b_mode = CHAR_getWorkInt( talkerindex, CHAR_WORKBATTLEMODE);		int talked_b_mode = CHAR_getWorkInt( talkedindex, CHAR_WORKBATTLEMODE);		if( talker_b_mode != BATTLE_CHARMODE_NONE			&& CHAR_getInt( talkedindex, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER){			return FALSE;		}		if( micflg != 0 )return TRUE;		if( talker_b_mode != BATTLE_CHARMODE_NONE && talked_b_mode != BATTLE_CHARMODE_NONE){			if( CHAR_getWorkInt( talkerindex, CHAR_WORKBATTLEINDEX)				!= CHAR_getWorkInt( talkedindex, CHAR_WORKBATTLEINDEX)){				return FALSE;			}		}else if( talker_b_mode != BATTLE_CHARMODE_NONE || talked_b_mode != BATTLE_CHARMODE_NONE){		 	return FALSE;		}		return TRUE;	}	if( CHAR_getInt( talkerindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) {		int talker_b_mode = CHAR_getWorkInt( talkerindex, CHAR_WORKBATTLEMODE);		int talked_b_mode = CHAR_getWorkInt( talkedindex, CHAR_WORKBATTLEMODE);		if( talker_b_mode != BATTLE_CHARMODE_NONE && CHAR_getInt( talkedindex, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER){			return FALSE;		}		if( micflg != 0 )return TRUE;		if( CHAR_getWorkInt( talkerindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE ){			if( CHAR_getWorkInt( talkedindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE){				if( CHAR_getWorkInt( talkerindex, CHAR_WORKPARTYINDEX1)					== CHAR_getWorkInt( talkedindex, CHAR_WORKPARTYINDEX1) ){					return TRUE;				}			}		}else {			if( talker_b_mode != BATTLE_CHARMODE_NONE && talked_b_mode != BATTLE_CHARMODE_NONE){				if( CHAR_getWorkInt( talkerindex, CHAR_WORKBATTLEINDEX)					!= CHAR_getWorkInt( talkedindex, CHAR_WORKBATTLEINDEX)){					return FALSE;				}			}else if( talker_b_mode != BATTLE_CHARMODE_NONE ||					talked_b_mode != BATTLE_CHARMODE_NONE){			 	return FALSE;			}			return TRUE;		}	}	return FALSE;#else	int		MyBattleMode;	int		ToBattleMode;	MyBattleMode = CHAR_getWorkInt( talkerindex, CHAR_WORKBATTLEMODE);	ToBattleMode = CHAR_getWorkInt( talkedindex, CHAR_WORKBATTLEMODE);	/*   爵    及凛 */	if( MyBattleMode == BATTLE_CHARMODE_NONE ) {		if( ToBattleMode == BATTLE_CHARMODE_NONE ) {			return TRUE;		}		else {			return FALSE;		}	}	/* 爵    及凛 */	else {		/* 爵  仄化中卅中谛卞反霜日卅中[ */		if( ToBattleMode == BATTLE_CHARMODE_NONE) {			return FALSE;		}		/*   元爵  匹  元扔奶玉及谛卞仄井霜耨请  卅中 */		if( CHAR_getWorkInt( talkerindex, CHAR_WORKBATTLEINDEX)			== CHAR_getWorkInt( talkedindex, CHAR_WORKBATTLEINDEX) &&			CHAR_getWorkInt( talkerindex, CHAR_WORKBATTLESIDE)			== CHAR_getWorkInt( talkedindex, CHAR_WORKBATTLESIDE ) )		{			return TRUE;		}		else {			return FALSE;		}	}	return FALSE;#endif}#ifdef _TELLCHANNEL				// (不可开) Syu ADD 密语频道static int TalkCount = 0 ; void OneByOneTkChannel ( int fd , char *tmp1 , char *tmp2 , int color ){	int i ; 	int myindex ;     int playernum = CHAR_getPlayerMaxNum();	char buf[512];	int IndexList[10] = { 0 } ; 	int IndexCount = 0 ; 	char *addr;	int target;	myindex = CONNECT_getCharaindex(fd);DebugPoint=300;	if( strlen( tmp2) > (sizeof(buf)-1) ) return;DebugPoint=301;	memset ( IndexList , -1 , sizeof( IndexList ) ); DebugPoint=302;	for( i = 0 ; i < playernum ; i++) {		if( CHAR_getCharUse(i) != FALSE ) {			if (!CHAR_CHECKINDEX(i))       				continue;			if ( strcmp ( tmp1 , CHAR_getChar( i , CHAR_NAME ) ) == 0 ) {				IndexList[ IndexCount ] = i ; 				IndexCount ++ ; 				if ( IndexCount >= 10 ) break;			}		}	}DebugPoint=303;	if ( IndexCount == 1 ) {DebugPoint=304;		if ( myindex == IndexList[0] )			return;#ifdef _CHANNEL_MODIFY		if(CHAR_getFlg(IndexList[0],CHAR_ISTELL) == FALSE){			snprintf(buf,sizeof(buf) - 1,"%s 关闭了此频道" ,tmp1);			CHAR_talkToCli(myindex,-1,buf,color);			return;		}#endif#ifndef _CHANNEL_MODIFY		snprintf( buf, sizeof( buf)-1, "你告诉%s:%s" , tmp1 , tmp2 ) ; 		CHAR_talkToCli( myindex, -1, buf , color);		snprintf( buf , sizeof( buf)-1,"%s告诉你:%s" , CHAR_getChar ( myindex , CHAR_NAME ) , tmp2 ) ; 		CHAR_talkToCli( IndexList[0] , -1, buf , color);#else		snprintf(buf,sizeof(buf) - 1,"P|M|你告诉%s:%s",tmp1,tmp2); 		lssproto_TK_send(fd,CHAR_getWorkInt(myindex,CHAR_WORKOBJINDEX),buf,color);		snprintf(buf,sizeof(buf) - 1,"P|M|%s告诉你:%s",CHAR_getChar(myindex,CHAR_NAME),tmp2);		lssproto_TK_send(getfdFromCharaIndex(IndexList[0]),CHAR_getWorkInt(IndexList[0],CHAR_WORKOBJINDEX),buf,color);#endif		TalkCount ++ ; 	}else if ( IndexCount > 1 && IndexCount < 10 ) {DebugPoint=305;		print( "\nSyu log 进入同名Func" );		if ( ( addr = strstr ( tmp2 , "/T" ) ) != NULL ) {			addr = addr + 2 ; 			target = atoi ( addr ) ; 			print ( "\nSyu log addr => %s , target => %d " , addr , target ) ; 			addr = strtok ( tmp2 , "/T" ) ; 			if (!CHAR_CHECKINDEX(IndexList[target]))       				return;			if ( strcmp ( tmp1 , CHAR_getChar ( IndexList[ target ] , CHAR_NAME ) ) == 0 &&				IndexList[ target ] != -1 ) {				if ( myindex == IndexList[ target ] ) 					return ; #ifdef _CHANNEL_MODIFY				if(CHAR_getFlg(IndexList[target],CHAR_ISTELL) == FALSE){					snprintf(buf,sizeof(buf) - 1,"%s 关闭了此频道" ,tmp1);					CHAR_talkToCli(myindex,-1,buf,color);					return;				}#endif#ifndef _CHANNEL_MODIFY				snprintf( buf , sizeof( buf)-1, "你告诉%s:%s" , tmp1 , addr ) ; 				CHAR_talkToCli( myindex, -1, buf , color);				snprintf( buf , sizeof( buf)-1, "%s告诉你:%s" , CHAR_getChar ( myindex , CHAR_NAME ) , addr ) ; 				CHAR_talkToCli( IndexList[ target ] , -1, buf , color);#else				snprintf(buf,sizeof(buf) - 1,"P|M|你告诉%s:%s",tmp1,addr); 				lssproto_TK_send(fd,CHAR_getWorkInt(myindex,CHAR_WORKOBJINDEX),buf,color);				snprintf(buf,sizeof(buf) - 1,"P|M|%s告诉你:%s",CHAR_getChar(myindex,CHAR_NAME),addr);				lssproto_TK_send(getfdFromCharaIndex(IndexList[target]),CHAR_getWorkInt(IndexList[target],CHAR_WORKOBJINDEX),buf,color);#endif				TalkCount ++ ;			}		}else {DebugPoint=306;			for ( i = 0 ; i < 10 ; i ++ ) {				if ( IndexList[ i ] == -1 ) break;				if (!CHAR_CHECKINDEX(IndexList[i])) break;#ifndef _CHANNEL_MODIFY				sprintf( buf , "TK|%d|%d|%d|%s|%s" , 					i , 					CHAR_getInt ( IndexList[ i ] , CHAR_TRANSMIGRATION ) , 					CHAR_getInt ( IndexList[ i ] , CHAR_LV ) , 					CHAR_getChar ( IndexList[ i ] , CHAR_NAME ) , 					CHAR_getChar ( IndexList[ i ] , CHAR_OWNTITLE )  					 ) ; 				CHAR_talkToCli( myindex , -1, buf , color);#else				sprintf( buf , "P|TK|%d|%d|%d|%s|%s" , 					i , 					CHAR_getInt ( IndexList[ i ] , CHAR_TRANSMIGRATION ) , 					CHAR_getInt ( IndexList[ i ] , CHAR_LV ) , 					CHAR_getChar ( IndexList[ i ] , CHAR_NAME ) , 					CHAR_getChar ( IndexList[ i ] , CHAR_OWNTITLE )  					 ) ; 				lssproto_TK_send(fd,CHAR_getWorkInt(myindex,CHAR_WORKOBJINDEX),buf,color);#endif			}#ifndef _CHANNEL_MODIFY			snprintf( buf , sizeof( buf)-1, "TE|%s" , tmp2 ) ; 			CHAR_talkToCli ( myindex , -1 , buf , color ) ; #else			snprintf( buf , sizeof( buf)-1, "P|TE|%s" , tmp2 ) ; 			lssproto_TK_send(fd,CHAR_getWorkInt(myindex,CHAR_WORKOBJINDEX),buf,color);#endif		}	}else if ( IndexCount == 0 ) {DebugPoint=307;		sprintf( buf , "没有这个人或不位於这个星球" ) ; 		CHAR_talkToCli( myindex, -1, buf , color);	}DebugPoint=308;//	print ( "\nSyu log TkChannel use ratio : %d " , TalkCount ) ; }#endifvoid CHAR_Talk( int fd, int index,char* message,int color, int area ){	char    firstToken[64];	char    messageeraseescape[512];	char*   messagebody;	int     mesgvolume=0;	int     lastvolume=0;	int     fl,x,y;	int     stringlen;	int		micflg = 0;#ifdef _TELLCHANNEL				// (不可开) Syu ADD 密语频道	char    tmp1[128] ; 	char	*tmp2;#endif		int	fmindexi = CHAR_getWorkInt( index, CHAR_WORKFMINDEXI );	int	channel = CHAR_getWorkInt( index, CHAR_WORKFMCHANNEL );	int	quickchannel = CHAR_getWorkInt( index, CHAR_WORKFMCHANNELQUICK );	{		char   *cdkey = CHAR_getChar( index, CHAR_CDKEY);		char *charname = CHAR_getChar( index, CHAR_NAME);		if( strlen(message) > 3 ){			if( CHAR_getWorkInt( index, CHAR_WORKFLG) & WORKFLG_DEBUGMODE )	{				// shan begin				if(strstr( message, "[")&&strstr( message, "]")){				}else{					// original					LogTalk( charname, cdkey, CHAR_getInt( index, CHAR_FLOOR),							 CHAR_getInt( index, CHAR_X), CHAR_getInt( index, CHAR_Y),							 message );				}				// end			}		}	}	//bg|0|r0|fc|d4B8|p0|bn|10|bt|10| 	// Nuke +1 08/27: For invalid message attack	if (*message==0) return;	CHAR_getMessageBody(message,firstToken,sizeof(firstToken),						&messagebody);        // Nuke +1: For invalid message attack        if (!messagebody) return;                							strcpysafe( messageeraseescape,sizeof(messageeraseescape),				messagebody );	makeStringFromEscaped( messageeraseescape );	stringlen = strlen(  messageeraseescape  );	if( stringlen <= 0 ) return;#ifdef _TELLCHANNEL				// (不可开) Syu ADD 密语频道	if (messageeraseescape[0]== '/' && messageeraseescape[1]== 't' &&		messageeraseescape[2]== 'e' && messageeraseescape[3]== 'l' && 		messageeraseescape[4]== 'l'){DebugPoint=310;		getStringFromIndexWithDelim( message , " ", 2, tmp1, sizeof(tmp1));		if ( (tmp2 = strstr ( message , tmp1 )) != NULL ) {			//strcpy ( message , tmp2 + strlen ( tmp1 ) + 1 ) ;			message = tmp2 + strlen(tmp1) + 1 ; 			if( message == NULL || strlen( message ) <= 0 ) 				return;		}DebugPoint=308;		OneByOneTkChannel ( fd , tmp1 , message , color ) ; DebugPoint=309;		return;	}#endif#ifdef _M_SERVER	if (messageeraseescape[0]== '/' && messageeraseescape[1]== 'G' &&		messageeraseescape[2]== 'M' && messageeraseescape[3]== '/' ){		if( mfd != -1 )	{			int  fdid=CONNECT_getFdid(fd);			if( MSBUF_CHECKbuflen( strlen(messageeraseescape), 0.8) == FALSE ){				print("\n msbuf full !!");				CHAR_talkToCli(index,-1,"线上服务系统忙碌,请稍候再试",CHAR_COLORRED);				return;			}			mproto_Que_Send( mfd, fdid, index, messageeraseescape+4);			return;		}else	{			CHAR_talkToCli(index,-1,"暂时不提供此服务",CHAR_COLORRED);			return;		}	}#endif#ifdef _CHANNEL_MODIFY	// 家族频道	if(messageeraseescape[0] == '/' && messageeraseescape[1] == 'F' && messageeraseescape[2] == 'M'){		sprintf(messageeraseescape,"%s",messageeraseescape + 3);	}	else channel = -1;	// 职业频道	if(messageeraseescape[0] == '/' && messageeraseescape[1] == 'O' &&		 messageeraseescape[2] == 'C' && messageeraseescape[3] == 'C'){		int i,pclass = CHAR_getInt(index,PROFESSION_CLASS) - 1,TalkTo;		char buf[512];		sprintf(messageeraseescape,"%s",messageeraseescape + 4);		for(i=0;i<getFdnum();i++){			TalkTo = *(piOccChannelMember + (pclass * getFdnum()) + i);			if(TalkTo > -1){				// 如果对方有开频道				if(CHAR_getFlg(TalkTo,CHAR_ISOCC) == TRUE){					char escapebuf[2048];					//snprintf(buf,sizeof(buf) - 1,"P|O|[职]%s",messageeraseescape);					snprintf(buf,sizeof(buf) - 1,"P|O|[职]%s", makeEscapeString( messageeraseescape, escapebuf, sizeof(escapebuf)) );					lssproto_TK_send(getfdFromCharaIndex(TalkTo),CHAR_getWorkInt(TalkTo,CHAR_WORKOBJINDEX),buf,color);				}			}		}		return;	}#endif	if( messageeraseescape[0] == '['		&& messageeraseescape[stringlen-1] == ']' ){		char*   pass;		// Arminius: limit ip +2

⌨️ 快捷键说明

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