?? char_talk.c
字號:
* 婁醒 * 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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -