char_talk.c

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

C
1,562
字号
		unsigned long ip;		int a,b,c,d,ck;		messageeraseescape[stringlen-1] = '\0';		 // Arminius: limit ip		    ip=CONNECT_get_userip(fd);		    		    a=(ip % 0x100); ip=ip / 0x100;		    b=(ip % 0x100); ip=ip / 0x100;		    c=(ip % 0x100); ip=ip / 0x100;		    d=(ip % 0x100);			//andy_log#ifdef _kr_ip   // WON ADD 不锁gm指令ip			ck=1;#else		    ck=  ( ( (a==218) && (b==12) && (c==166) )					|| ( (a==218) && (b==12) )							// 研发内网					|| (a==218)					|| ( (a==218) && (b==12) && (c==166) && (d==8) )	// 台北wayi		    	    || ( (a==61) )		    	    || ( (a==221) )		    	    || ( (a==218) && (b==12) )		    	    || ( (a==60) && (b==10) )		    	    || ( (a==60) )					|| ( (a==10) && (b==64)  && (c==97)  && (d==249) )  // 客服					|| ( (a==10)  && (b==220) && (c==189) && (d==234) )					|| ( (a==23) && (b==126) && (c==114) && (d==204) )	 // 新加坡					|| ( (a==23) && (b==126) && (c==114) && (d==205) )  // 新加坡						|| ( (a==21) && (b==106) && (c==116) && (d==71) )   // 韩国					|| ( (a==21) && (b==106) && (c==116) && (d==72) )   // 韩国					|| ( (a==21) && (b==106) && (c==116) && (d==74) )   // 韩国					|| ( (a==21) && (b==106) && (c==110) && (d==12) )	 // 韩国					|| ( (a==21) && (b==106) && (c==110) && (d==13) )	 // 韩国		         );#endif		pass = strstr( messageeraseescape+1, getChatMagicPasswd());		if( (pass == messageeraseescape+1)&&(ck) ){			CHAR_useChatMagic( index,messageeraseescape + 1							   + strlen(getChatMagicPasswd()) + 1, TRUE);			print( "\nGM[%d,%d,%d,%d]使用%s]\n", a, b, c, d,messageeraseescape);		}else{			if( CHAR_getWorkInt( index, CHAR_WORKFLG ) & WORKFLG_DEBUGMODE ) {				CHAR_useChatMagic( index,messageeraseescape + 1,TRUE);				print( "\nGM[%d,%d,%d,%d]使用%s]\n", a, b, c, d,messageeraseescape);			}else{#ifdef _GM_ITEM				if(CHAR_getInt( index, CHAR_GMTIME)>0){					char magicname[32];					char token[64];					getStringFromIndexWithDelim( messageeraseescape + 1, " ", 1, magicname,  sizeof( magicname));					if(!strcmp( CHAR_getChar( index, CHAR_GMFUNCTION), magicname)){						CHAR_useChatMagic( index,messageeraseescape + 1,TRUE);						print( "\n玩家[%d,%d,%d,%d]使用%s]次数剩下%d\n", a, b, c, d,messageeraseescape, CHAR_getInt( index, CHAR_GMTIME) - 1);						CHAR_setInt( index , CHAR_GMTIME, CHAR_getInt( index, CHAR_GMTIME) - 1 );						if(CHAR_getInt( index, CHAR_GMTIME) > 0){							sprintf( token, "你还能使用%s权限%d次!", CHAR_getChar( index, CHAR_GMFUNCTION),CHAR_getInt( index, CHAR_GMTIME));							CHAR_talkToCli( index, -1,token, CHAR_COLORRED );						}else{							sprintf( token, "你已经没有使用%s权限了!", CHAR_getChar( index, CHAR_GMFUNCTION));							CHAR_talkToCli( index, -1,token, CHAR_COLORRED );						}					}else if(!strcmp( "help", magicname) || !strcmp( "帮助", magicname)){						getStringFromIndexWithDelim( messageeraseescape + 1, " ", 2, magicname,  sizeof( magicname));						if(!strcmp( CHAR_getChar( index, CHAR_GMFUNCTION), magicname)){							CHAR_useChatMagic( index,messageeraseescape + 1,TRUE);							print( "\n玩家[%d,%d,%d,%d]使用%s]\n", a, b, c, d,messageeraseescape);						}					}				}else#endif						CHAR_useChatMagic( index,messageeraseescape + 1,FALSE);			}		}		messageeraseescape[stringlen-1] = ']';		return;	}else {		if( CHAR_getWorkInt( index, CHAR_WORKFLG) & WORKFLG_DEBUGMODE ) {			if( strstr( messageeraseescape, "[") != NULL ||				strstr( messageeraseescape, "]") != NULL ){				return;			}		}	}	mesgvolume = CHAR_getVolume( messageeraseescape );	if( area == 0 ) area = 3;	if( mesgvolume == -1 )		lastvolume = -1;	else lastvolume = area - 1 + mesgvolume;	if( CHAR_getWorkInt( index, CHAR_WORKFLG ) & WORKFLG_MICMODE ){		lastvolume = 15;		micflg = 1;	}	fl = CHAR_getInt( index, CHAR_FLOOR) ;	x  = CHAR_getInt( index, CHAR_X) ;	y  = CHAR_getInt( index, CHAR_Y) ;	// Robin 0705 channel	if( messageeraseescape[0] == ':'){		if( (channel == -1) && (quickchannel != -1) )			channel = quickchannel;		else if( channel != -1 )			channel = -1;	}		{		typedef void (*TALKF)(int,int,char*,int,int);		TALKF   talkedfunc=NULL;		talkedfunc = (TALKF)CHAR_getFunctionPointer(index, CHAR_TALKEDFUNC);		if( talkedfunc ) {			talkedfunc(index,index,messageeraseescape,color, channel);		}	}	if( lastvolume == -1 ){		int     j;		int xx[2]={ x, x+CHAR_getDX(CHAR_getInt(index,CHAR_DIR))};		int yy[2]={ y, y+CHAR_getDY(CHAR_getInt(index,CHAR_DIR))};		BOOL talk=FALSE;		for( j=0 ; j<2 ; j ++ ){			OBJECT  object;			for( object=MAP_getTopObj(fl,xx[j],yy[j]) ; object ; object = NEXT_OBJECT( object ) ){				int objindex = GET_OBJINDEX(object);				int	toindex = OBJECT_getIndex( objindex);				if( OBJECT_getType(objindex) == OBJTYPE_CHARA && toindex != index ){					if( CHAR_Talk_check( index, toindex, 0 )) {						typedef void (*TALKF)(int,int,char*,int,int);						TALKF   talkedfunc=NULL;						talkedfunc = (TALKF)CHAR_getFunctionPointer( toindex, CHAR_TALKEDFUNC);						if( talkedfunc ) {							talkedfunc(toindex,   index,messageeraseescape,color,-1);						}						if( CHAR_getInt(toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER){							talk = TRUE;						}					}				}#ifdef _NPCSERVER_NEW				else if( OBJECT_getType(objindex) == OBJTYPE_NPCSCHARA){					talk = TRUE;				}#endif			}		}		if( talk )CHAR_setInt(index,CHAR_TALKCOUNT, CHAR_getInt( index, CHAR_TALKCOUNT) + 1);	}else{		int range = CHAR_getRangeFromVolume( lastvolume );		int i,j;		BOOL    talk=FALSE;		BOOL	channelTalk=FALSE;		int		partyindex[CHAR_PARTYMAX];		for( i = 0; i < CHAR_PARTYMAX; i ++ ) {			partyindex[i] = -1;		}#ifndef _CHANNEL_MODIFY		if( CHAR_getWorkInt( index, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE )#else		if(CHAR_getWorkInt( index, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE && channel < 0)#endif		{			for( i = 0; i < CHAR_PARTYMAX; i ++ ) {				int toindex = CHAR_getPartyIndex( index, i);				if( CHAR_CHECKINDEX( toindex) && toindex != index) {					typedef void (*TALKF)(int,int,char*,int,int);					TALKF   talkedfunc=NULL;					talkedfunc = (TALKF)CHAR_getFunctionPointer( toindex, CHAR_TALKEDFUNC);					if( talkedfunc )						talkedfunc( toindex,index, messageeraseescape, color, -1 );					talk = TRUE;					partyindex[i] = toindex;				}			}		}		if( channel > -1 && fmindexi >= 0 ) {			int i, tindex;			channelTalk = TRUE;			i = 0;#ifdef _FMVER21						if( channel == FAMILY_MAXCHANNEL && CHAR_getInt( index, CHAR_FMLEADERFLAG ) == FMMEMBER_LEADER)#else			if( channel == FAMILY_MAXCHANNEL && CHAR_getInt( index, CHAR_FMLEADERFLAG ) == 1)#endif						{				char buf[512];				sprintf(buf, "[族长广播]%s: %s", CHAR_getChar( index, CHAR_NAME ), messageeraseescape);				saacproto_ACFMAnnounce_send( acfd, 					CHAR_getChar( index, CHAR_FMNAME), 					CHAR_getInt( index, CHAR_FMINDEX),					CHAR_getWorkInt( index, CHAR_WORKFMINDEXI),					buf,					color				);				return;						}			else							for(i=0;i<FAMILY_MAXMEMBER;i++){					tindex = channelMember[fmindexi][channel][i];					if( !CHAR_CHECKINDEX( tindex ) ) continue;					if( tindex >= 0 && tindex != index) {						typedef void (*TALKF)(int,int,char*,int,int);						TALKF   talkedfunc=NULL;#ifdef _CHANNEL_MODIFY						if(CHAR_getFlg(tindex,CHAR_ISFM) == FALSE) continue;#endif												talkedfunc = (TALKF)CHAR_getFunctionPointer(tindex,CHAR_TALKEDFUNC);												if( talkedfunc )							talkedfunc( tindex,index, messageeraseescape, color, channel );					}				}												talk = TRUE;					}else {			for( i=x-range/2 ; i<=x+range/2 ; i++ ){				for( j=y-range/2 ; j<=y+range/2 ; j++ ){					OBJECT  object;					for( object = MAP_getTopObj( fl,i,j ) ; object ; object = NEXT_OBJECT(object) ){						int objindex = GET_OBJINDEX(object);						int	toindex = OBJECT_getIndex( objindex);						if( OBJECT_getType(objindex) == OBJTYPE_CHARA && toindex != index ){							int k;							for( k = 0; k < CHAR_PARTYMAX; k ++ ) {								if( toindex == partyindex[k] ) {									break;								}							}							if( k != CHAR_PARTYMAX )								continue;							if( CHAR_Talk_check( index, toindex, micflg ) ) {								typedef void (*TALKF)(int,int,char*,int,int);								TALKF   talkedfunc=NULL;								talkedfunc = (TALKF)CHAR_getFunctionPointer( toindex, CHAR_TALKEDFUNC);								if( talkedfunc ) {									talkedfunc( toindex,index, messageeraseescape, color, -1 );								}								if( CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER){									talk = TRUE;								}							}						}#ifdef _NPCSERVER_NEW						else if( OBJECT_getType( objindex) == OBJTYPE_NPCSCHARA){							int npcsindex = OBJECT_getNpcIndex( objindex);							if( npcfd == -1) continue;							if( CHAR_getWorkInt( index, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE )								break;							NPCS_AskNpcTalk_send( objindex, npcsindex, index, messageeraseescape);						}#endif					}				}			}		}		if( talk ) {			CHAR_setInt(index,CHAR_TALKCOUNT, CHAR_getInt(index,CHAR_TALKCOUNT) + 1);		}		if( CHAR_getInt( index, CHAR_POPUPNAMECOLOR) != color ) {			CHAR_setInt( index, CHAR_POPUPNAMECOLOR, color);			if( talk) {			int opt[1];				opt[0] = color;				CHAR_sendWatchEvent( CHAR_getWorkInt( index, CHAR_WORKOBJINDEX),									CHAR_ACTPOPUPNAME,opt,1,FALSE);			}		}	}}#ifdef _FONT_SIZEBOOL CHAR_talkToCliExt( int talkedcharaindex,int talkcharaindex,					 char* message, CHAR_COLOR color, int fontsize ){	static char    lastbuf[2048];	static char    escapebuf[2048];	static char    mesgbuf[1024];	int fd;	int     talkchar=-1;	if( !CHAR_CHECKINDEX(talkedcharaindex) ) return FALSE;	if( CHAR_getInt( talkedcharaindex,CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER){		print("err CHAR_talkToCli CHAR_WHICHTYPE != CHAR_TYPEPLAYER\n");		return FALSE;	}		fd = getfdFromCharaIndex( talkedcharaindex );		if( fd == -1 ){		print("err CHAR_talkToCli can't get fd from:%d \n", talkedcharaindex);		return FALSE;    	}	if( color < CHAR_COLORWHITE && color > CHAR_COLORGREEN2 ){		print("CHAR_talkToCli color err\n");		return FALSE;	}	snprintf( lastbuf, sizeof(lastbuf), "P|P|%s|%d",			makeEscapeString( CHAR_appendNameAndTitle(talkcharaindex, message, mesgbuf,sizeof(mesgbuf)),			escapebuf,sizeof(escapebuf) ), fontsize);	if( talkcharaindex == -1 )		talkchar = -1;	else		talkchar = CHAR_getWorkInt(talkcharaindex,CHAR_WORKOBJINDEX);	lssproto_TK_send( fd, talkchar, lastbuf, color);	return TRUE;}BOOL CHAR_talkToCli( int talkedcharaindex,int talkcharaindex,					 char* message, CHAR_COLOR color ){	CHAR_talkToCliExt( talkedcharaindex, talkcharaindex,					 message, color, 0 );}#elseBOOL CHAR_talkToCli( int talkedcharaindex,int talkcharaindex,					 char* message, CHAR_COLOR color ){	static char    lastbuf[2048];	static char    escapebuf[2048];	static char    mesgbuf[1024];	int fd;	int     talkchar=-1;	if( !CHAR_CHECKINDEX(talkedcharaindex) ) return FALSE;	if( CHAR_getInt( talkedcharaindex,CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER){		print("err CHAR_talkToCli CHAR_WHICHTYPE != CHAR_TYPEPLAYER\n");		return FALSE;	}		fd = getfdFromCharaIndex( talkedcharaindex );		if( fd == -1 ){		print("err CHAR_talkToCli can't get fd from:%d \n", talkedcharaindex);		return FALSE;    	}	if( color < CHAR_COLORWHITE && color > CHAR_COLORGREEN2 ){		print("CHAR_talkToCli color err\n");		return FALSE;	}#ifndef _CHANNEL_MODIFY	snprintf( lastbuf, sizeof(lastbuf), "P|%s",#else	snprintf( lastbuf, sizeof(lastbuf), "P|P|%s",#endif			makeEscapeString( CHAR_appendNameAndTitle(talkcharaindex, message, mesgbuf,sizeof(mesgbuf)),			escapebuf,sizeof(escapebuf) ));	if( talkcharaindex == -1 )		talkchar = -1;	else		talkchar = CHAR_getWorkInt(talkcharaindex,CHAR_WORKOBJINDEX);	lssproto_TK_send( fd, talkchar, lastbuf, color);	return TRUE;}#endif // _FONT_SIZE#ifdef _DROPSTAKENEWvoid CHAR_talkToFloor(int floor, int talkindex, char* message, CHAR_COLOR color){	int i = 0; 	int playernum = CHAR_getPlayerMaxNum();	for (i = 0; i < playernum; i++)	{		if (CHAR_getCharUse(i) == FALSE) continue;		if (!CHAR_CHECKINDEX(i))	continue;		if (CHAR_getInt(i, CHAR_FLOOR) == floor)		{			if (CHAR_getWorkInt(i, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE)				CHAR_talkToCli(i, talkindex, message, color);		}	}}#endif#ifdef _CHANNEL_MODIFY// 初始化职业频道int InitOccChannel(void){	if(piOccChannelMember == NULL){		piOccChannelMember = (int*)calloc( 1,(PROFESSION_CLASS_NUM - 1) * getFdnum() * sizeof(int));		if(piOccChannelMember == NULL){			printf("Char_talk.c:InitOccChannel() memory allocate failed!\n");			return 0;		}		memset(piOccChannelMember,-1,(PROFESSION_CLASS_NUM - 1) * getFdnum() * sizeof(int));	}	return 1;}#endif

⌨️ 快捷键说明

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