?? chatroom.c
字號:
fd = getfdFromCharaIndex( charaindex);
saacproto_ACUniChatroom_send( acfd, charaindex, CONNECT_getFdid(fd),
CHAR_getChar( charaindex, CHAR_CDKEY), token);
}
void saac_ChatRoom_recvall ( int fd , char *result, char *data, int charaindex, int clifdid)
{
char Head[4], buf[256];
int chat;
charaindex = getCharindexFromFdid(clifdid);
//andy_log
print( "saac CR:%s.\n", data);
if( getStringFromIndexWithDelim( data , "|", 1, Head, sizeof(Head)) == FALSE ) return;
if( strcmp( Head, "C") == 0 ) { // 成立頻道
// int fd = getfdFromCharaIndex( charaindex);
// if( getStringFromIndexWithDelim( data , "|", 2, result, sizeof(result)) == FALSE ) return;
if( !strcmp( result, SUCCESSFUL) ){
if( getStringFromIndexWithDelim( data , "|", 3, buf, sizeof(buf)) == FALSE ) return;
chat = atoi( buf);
if( chat < 0 || chat >= MAX_CHATROOM ) return;
if( getStringFromIndexWithDelim( data , "|", 4, ChatRoom[chat].chatname,
sizeof(ChatRoom[chat].chatname)) == FALSE ) return;
if( getStringFromIndexWithDelim( data , "|", 5, buf, sizeof(buf)) == FALSE ) return;
ChatRoom[chat].masindex = atoi( buf);
if( getStringFromIndexWithDelim( data , "|", 6,
ChatRoom[chat].charalist[0].cdkey, sizeof(ChatRoom[chat].charalist[0].cdkey)) == FALSE ) return;
if( getStringFromIndexWithDelim( data , "|", 7,
ChatRoom[chat].charalist[0].name, sizeof(ChatRoom[chat].charalist[0].name)) == FALSE ) return;
if( getStringFromIndexWithDelim( data , "|", 8,
ChatRoom[chat].charalist[0].own, sizeof(ChatRoom[chat].charalist[0].own)) == FALSE ) return;
ChatRoom[chat].charalist[0].use=1;
if( CHAR_DelGold( charaindex, 200) == 0 ) return;
ChatRoom[chat].use = 1;
CHAR_setWorkInt ( charaindex , CHAR_WORKCHATROOMTYPE , 1 ) ;
CHAR_setWorkInt ( charaindex , CHAR_WORKCHATROOMNUM , chat ) ;
CHAR_talkToCli ( charaindex , -1 , "成立聊天室扣除200石幣。" , CHAR_COLORYELLOW );
ChatRoom_Refresh( chat);
}else{
CHAR_talkToCli ( charaindex , -1 , "無法成立聊天室,聊天頻道已滿或條件不足!" , CHAR_COLORYELLOW );
}
}else if( strcmp( Head, "U") == 0 ) {
int k=2, ti;
char bufarg[512];
if( getStringFromIndexWithDelim( data , ",", 1, bufarg, sizeof(bufarg)) == FALSE ) return;
if( getStringFromIndexWithDelim( bufarg , "|", 2, buf, sizeof(buf)) == FALSE ) return;
chat = atoi( buf);
if( chat < 0 || chat >= MAX_CHATROOM ) return;
if( getStringFromIndexWithDelim( bufarg , "|", 3, buf, sizeof(buf)) == FALSE ) return;
ChatRoom[chat].use = atoi( buf);
if( getStringFromIndexWithDelim( bufarg , "|", 4,
ChatRoom[chat].chatname, sizeof(ChatRoom[chat].chatname)) == FALSE ) return;
if( getStringFromIndexWithDelim( bufarg , "|", 5, buf, sizeof(buf)) == FALSE ) return;
ChatRoom[chat].masindex = atoi( buf);
if( getStringFromIndexWithDelim( bufarg , "|", 6, buf, sizeof(buf)) == FALSE ) return;
ChatRoom[chat].charanum = atoi( buf);
while( getStringFromIndexWithDelim( data , ",", k, bufarg, sizeof( bufarg) ) ){
k++;
if( bufarg[0] == 0 || strlen( bufarg) <= 0 ) continue;
if( getStringFromIndexWithDelim( bufarg , "|", 1, buf, sizeof(buf)) == FALSE ) return;
ti = atoi( buf);
if( getStringFromIndexWithDelim( bufarg , "|", 2,
ChatRoom[chat].charalist[ti].cdkey, sizeof(ChatRoom[chat].charalist[ti].cdkey)) == FALSE ) return;
if( getStringFromIndexWithDelim( bufarg , "|", 3,
ChatRoom[chat].charalist[ti].name, sizeof(ChatRoom[chat].charalist[ti].name)) == FALSE ) return;
if( getStringFromIndexWithDelim( bufarg , "|", 4,
ChatRoom[chat].charalist[ti].own, sizeof(ChatRoom[chat].charalist[ti].own)) == FALSE ) return;
ChatRoom[chat].charalist[ti].use = 1;
}
ChatRoom_Refresh( chat);
}else if( strcmp( Head, "D") == 0 ) {
ChatRoom_Destroy ( data);
}else if( strcmp( Head, "L") == 0 ) {
int chat, ti;
if( getStringFromIndexWithDelim( data , "|", 2, buf, sizeof( buf)) == FALSE ) return;
chat = atoi(buf);
if( chat < 0 || chat >= MAX_CHATROOM ) return;
if( getStringFromIndexWithDelim( data , "|", 3, buf, sizeof( buf)) == FALSE ) return;
ti = atoi(buf);
if( ti<0||ti>=MAX_PPLINROOM)return;
ChatRoom[chat].charalist[ti].use = 0;
ChatRoom_Refresh( chat);
}else if( strcmp( Head, "M") == 0 ) {
int ti, chat, j;
int playernum = CHAR_getPlayerMaxNum();
if( getStringFromIndexWithDelim( data , "|", 2, buf, sizeof( buf)) == FALSE ) return;
chat = atoi( buf);
if( chat < 0 || chat >= MAX_CHATROOM ) return;
if( getStringFromIndexWithDelim( data , "|", 3, buf, sizeof( buf)) == FALSE ) return;
ti = atoi( buf);
if( ti<0 || ti>=MAX_PPLINROOM )return;
if( ChatRoom[chat].charalist[ti].use == 0 ) return;
for ( j=0; j<playernum; j++) {
if( !CHAR_getCharUse( j) ||
CHAR_getInt( j, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ) continue;
if( CHAR_getWorkInt ( j, CHAR_WORKCHATROOMNUM) != chat ) continue;
if( !strcmp( CHAR_getChar( j, CHAR_CDKEY), ChatRoom[chat].charalist[ti].cdkey) &&
!strcmp( CHAR_getChar( j, CHAR_NAME), ChatRoom[chat].charalist[ti].name) ){
CHAR_setWorkInt( j, CHAR_WORKCHATROOMTYPE, 1);
CHAR_talkToCli( j, -1 , "你現在是聊天室的室長!", CHAR_COLORRED);
}
if( !strcmp( CHAR_getChar( j, CHAR_CDKEY), ChatRoom[chat].charalist[ChatRoom[chat].masindex].cdkey) &&
!strcmp( CHAR_getChar( j, CHAR_NAME), ChatRoom[chat].charalist[ChatRoom[chat].masindex].name) ){
CHAR_setWorkInt( j, CHAR_WORKCHATROOMTYPE, 2);
CHAR_talkToCli( j, -1 , "你現在已經不是聊天室的室長!", CHAR_COLORRED);
}
}
ChatRoom[ chat].masindex = ti;
ChatRoom_Refresh( chat);
}else if( strcmp( Head, "K") == 0 ) {
int ti, j, chat, fd;
int playernum = CHAR_getPlayerMaxNum();
if( getStringFromIndexWithDelim( data , "|", 2, buf, sizeof( buf)) == FALSE ) return;
chat = atoi( buf);
if( chat < 0 || chat >= MAX_CHATROOM ) return;
if( getStringFromIndexWithDelim( data , "|", 3, buf, sizeof( buf)) == FALSE ) return;
ti = atoi( buf);
if( ti<0 || ti>=MAX_PPLINROOM ) return;
//andy_log
print( "\nK|%d|%d|\n", chat, ti);
for ( j=0; j<playernum; j++) {
if( !CHAR_getCharUse( j) ||
CHAR_getInt( j, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ) continue;
if( CHAR_getWorkInt ( j, CHAR_WORKCHATROOMNUM) != chat ) continue;
if( CHAR_getWorkInt ( j, CHAR_WORKCHATROOMTYPE) != 2 ) continue;
if( !strcmp( CHAR_getChar( j, CHAR_CDKEY), ChatRoom[chat].charalist[ti].cdkey) &&
!strcmp( CHAR_getChar( j, CHAR_NAME), ChatRoom[chat].charalist[ti].name) ){
fd = getfdFromCharaIndex( j );
CHAR_setWorkInt ( j, CHAR_WORKCHATROOMNUM, -1);
CHAR_setWorkInt ( j, CHAR_WORKCHATROOMTYPE, 0);
//andy_log
print( "_CHATROOM_send( %d, K|) \n", fd );
lssproto_CHATROOM_send ( fd , "K|" );
break;
}
}
//andy_log
print( "ChatRoom_Refresh( %d) \n", chat);
ChatRoom[chat].charalist[ti].use = 0;
ChatRoom_Refresh( chat);
}else if ( strcmp ( Head , "J" ) == 0 ) {//加入頻道
}else if ( strcmp ( Head , "A" ) == 0 ) {
if ( !CHAR_CHECKINDEX ( charaindex ) ) return;
if( getStringFromIndexWithDelim( data , "|", 2, buf, sizeof( buf)) == FALSE ) return;
chat = atoi( buf);
if( chat < 0 || chat >= MAX_CHATROOM ) return;
if( getStringFromIndexWithDelim( data , "|", 3, result, sizeof( result)) == FALSE ) return;
if( !strcmp( result, "FULL") ){
CHAR_talkToCli( charaindex, -1, "該頻道已滿!", CHAR_COLORYELLOW);
}else if( !strcmp( result, "OK") ){
CHAR_talkToCli( charaindex, -1, "加入聊天頻道!", CHAR_COLORYELLOW);
CHAR_setWorkInt( charaindex, CHAR_WORKCHATROOMNUM, chat);
CHAR_setWorkInt( charaindex, CHAR_WORKCHATROOMTYPE, 2);
}
ChatRoom_Refresh( chat);
}else if( !strcmp( Head, "T") ) {//頻道訊息
int j;
char message[256];
int playernum = CHAR_getPlayerMaxNum();
if( getStringFromIndexWithDelim( data , "|", 2, buf, sizeof( buf)) == FALSE ) return;
chat = atoi( buf);
if( chat < 0 || chat >= MAX_CHATROOM ) return;
if( getStringFromIndexWithDelim( data , "|", 3, buf, sizeof( buf)) == FALSE ) return;
snprintf ( message, sizeof ( message ) , "T|%s" , buf );
for ( j=0; j<playernum; j++) {
if( !CHAR_getCharUse( j) ||
CHAR_getInt( j, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ) continue;
if( CHAR_getWorkInt ( j, CHAR_WORKCHATROOMNUM) != chat ) continue;
if( CHAR_getWorkInt( j, CHAR_WORKCHATROOMTYPE) == 0 ) continue;
snprintf ( message, sizeof ( message ) , "T|%s" , buf );
fd = getfdFromCharaIndex ( j);
lssproto_CHATROOM_send ( fd , message) ;
}
}else{
}
}
void CHATROOM_getChatRoomList( void)
{
char token[512];
snprintf( token, sizeof( token),"U|-1|" );
saacproto_ACUniChatroom_send( acfd, -1, -1, "SYS", token);
}
#else
/*
CHAR_WORKCHATROOMTYPE :
0 : 無
1 : 聊天室室長
2 : 聊天室成員
*/
typedef struct {
BOOL useFlag ;
int NowPeople;
int Maker;
int MemberList[MAX_PPLINROOM];
char RoomName[32];
} CHATROOM_CLASS ;
CHATROOM_CLASS ChatRoom[MAX_CHATROOM];
BOOL ChatCheck_BeMaster( int myindex, int chatnum)
{
if( !CHAR_CHECKINDEX ( myindex ) )
return FALSE;
if( CHAR_getWorkInt ( myindex , CHAR_WORKCHATROOMNUM ) == 0 ) return FALSE;
if( chatnum != -1 ){
if( CHAR_getWorkInt ( myindex , CHAR_WORKCHATROOMNUM ) != chatnum )
return FALSE;
}
if( CHAR_getWorkInt ( myindex , CHAR_WORKCHATROOMTYPE ) == 1 ) return TRUE;
return FALSE;
}
BOOL ChatCheck_Free( int myindex)
{
int old_gold;
if ( !CHAR_CHECKINDEX ( myindex ) )
return FALSE;
old_gold = CHAR_getInt( myindex, CHAR_GOLD );
if( old_gold < 200 ){
CHAR_talkToCli ( myindex , -1 , "成立聊天室需花費200石幣" , CHAR_COLORYELLOW );
return FALSE;
}
if ( CHAR_getInt ( myindex , CHAR_LV ) < 30 &&
CHAR_getInt ( myindex , CHAR_TRANSMIGRATION ) < 1 ) {
CHAR_talkToCli ( myindex , -1 , "成立聊天室需0轉30級以上!" , CHAR_COLORYELLOW );
return FALSE;
}
if ( CHAR_getWorkInt ( myindex , CHAR_WORKCHATROOMTYPE ) != 0 ) {
CHAR_talkToCli ( myindex , -1 , "你已經在其他聊天室中!" , CHAR_COLORYELLOW );
return FALSE;
}
return TRUE;
}
void InitChatRoom ( void ) {
int i , j ;
for ( i = 0 ; i < MAX_CHATROOM ; i ++ ) {
ChatRoom[ i ].useFlag = FALSE ;
ChatRoom[ i ].Maker = -1 ;
ChatRoom[ i ].NowPeople = -1 ;
sprintf ( ChatRoom[ i ].RoomName , " " ) ;
for ( j = 0 ; j < MAX_PPLINROOM ; j ++ )
ChatRoom[ i ].MemberList[ j ] = -1 ;
}
}
BOOL ChatRoom_Create ( int myindex , char *message )
{
int i ;
if( ChatCheck_Free( myindex) == FALSE ) return FALSE;
for ( i = 0 ; i < MAX_CHATROOM ; i ++ ) {
if ( !ChatRoom[ i ].useFlag ) {
ChatRoom[ i ].useFlag = TRUE ;
ChatRoom[ i ].Maker = myindex ;
ChatRoom[ i ].NowPeople = 1 ;
ChatRoom[ i ].MemberList[ 0 ] = myindex ;
sprintf ( ChatRoom[ i ].RoomName , "%s" , message ) ;
CHAR_setWorkInt ( myindex , CHAR_WORKCHATROOMTYPE , 1 ) ;
CHAR_setWorkInt ( myindex , CHAR_WORKCHATROOMNUM , i ) ;
ChatRoom_Refresh ( i ) ;
CHAR_DelGold( myindex, 200);
CHAR_talkToCli ( myindex , -1 , "成立聊天室扣除200石幣" , CHAR_COLORYELLOW );
return TRUE;
}
}
CHAR_talkToCli ( myindex , -1 , "聊天室已滿無法建立新的聊天頻道!" , CHAR_COLORYELLOW );
return FALSE;
}
BOOL ChatRoom_Destroy ( int myindex )
{
int i , j ;
int fd ;/*= getfdFromCharaIndex(myindex);*/
char buf[16];
if ( !CHAR_CHECKINDEX ( myindex ) )
return FALSE;
if ( CHAR_getWorkInt ( myindex , CHAR_WORKCHATROOMTYPE ) == 1 ) {
i = CHAR_getWorkInt ( myindex , CHAR_WORKCHATROOMNUM ) ;
ChatRoom[ i ].useFlag = FALSE ;
ChatRoom[ i ].Maker = -1 ;
ChatRoom[ i ].NowPeople = -1 ;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -