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 + -
显示快捷键?