⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clan.cpp.svn-base

📁 ROSE的源代码。了解的自己研究,编译通过
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
        	    send( thischannel->sock, (char*)&pak, pak.Size, 0 );	                                            
            thisclient->clanid = 0;
            thisclient->clan_rank = 1; 	        
 	        //send( wct
        }
        break;
        case 0x0c://invitation accepted
        {
            char* nick = new (nothrow) char[P->Size-7];
            if(nick==NULL)
            {
                Log(MSG_ERROR, "Error allocing memory" );
                return false;
            }
            memcpy( nick, &P->Buffer[1], P->Size-7 );                  
            CCharClient* otherclient = (CCharClient*) GetClientByName(nick );            
            if(otherclient!=NULL)
            {
                thisclient->clanid = otherclient->clanid;
                thisclient->clan_rank=1;
                if(!DB->QExecute("UPDATE characters SET clanid=%i AND clan_rank=1 WHERE char_name='%s'",thisclient->clanid,thisclient->charname))
                {
                    delete []nick;
                    return false;
                }
                CClans* thisclan = GetClanByID(thisclient->clanid);
                if(thisclan==NULL)
                {
                    delete []nick;
                    return true;                
                }
                CClanMembers* newmember = new (nothrow) CClanMembers;
                if(newmember==NULL)
                {
                    Log( MSG_WARNING, "Error allocing memory" ); 
                    delete []nick;                   
                    return false;
                }
                newmember->id = thisclient->charid;
                strcpy(newmember->name,thisclient->charname);  
                newmember->clan_rank = 1;                         
                thisclan->ClanMembers.push_back( newmember );
           }
           else
           {
                delete []nick;
                return true;
           }    
           SendClanInfo(thisclient);
           pakClanMembers(thisclient);
           BEGINPACKET( pak, 0x7e0 );//xxx have invited to xxx
	       ADDBYTE( pak, 0x61 );
	       ADDSTRING( pak, thisclient->charname );
	       ADDBYTE( pak, 0x00);
	       ADDSTRING( pak, otherclient->charname );
	       ADDBYTE( pak, 0x00);
           SendToClanMembers(thisclient->clanid,&pak);    
           
           RESETPACKET( pak, 0x7e0 );
           ADDBYTE    ( pak, 0x84 );
           ADDWORD    ( pak, thisclient->level );
           ADDWORD    ( pak, thisclient->job );
           ADDSTRING  ( pak, thisclient->charname );
           ADDBYTE    ( pak, 0x00 );
           SendToClanMembers(thisclient->clanid,&pak);           
                                                        
	       RESETPACKET( pak, 0x7e1 );//update clan info in world
	       ADDBYTE( pak, 0xfa );
	       ADDWORD( pak, thisclient->charid );
	       ADDWORD( pak, thisclient->clanid );
	       cryptPacket( (char*)&pak, NULL );
 	       CChanels* thischannel = GetChannelByID( thisclient->channel );
 	       if(thischannel!=NULL)
        	    send( thischannel->sock, (char*)&pak, pak.Size, 0 );    
 	       CChanels* otherchannel = GetChannelByID( otherclient->channel );
 	       if(otherchannel!=NULL && thischannel!=otherchannel)
                send( thischannel->sock, (char*)&pak, pak.Size, 0 );          
           delete []nick;	            	    
        }                    
        break;
        case 0x0d://invitation no accepted
        {
            char* nick = new (nothrow) char[P->Size-7];
            if(nick==NULL)
            {
                Log(MSG_ERROR, "Error allocing memory" );
                return false;
            }
            memcpy( nick, &P->Buffer[1], P->Size-7 );                 
            CCharClient* otherclient = (CCharClient*) GetClientByName(nick );
            if(otherclient!=NULL)
            {
                BEGINPACKET( pak, 0x7e0 );
                ADDBYTE    ( pak, 0x0d );
                ADDSTRING  ( pak, thisclient->charname );
                ADDBYTE    ( pak, 0x00 );
                otherclient->SendPacket(&pak);
            }             
            delete []nick;           
        }            
        break;
        case 0x0f:// Update Clan window with Level and Job
        {
            BEGINPACKET( pak, 0x7e0 );
            ADDBYTE    ( pak, 0x84 );
            ADDWORD    ( pak, GETWORD ((*P),1) );
            ADDWORD    ( pak, GETWORD ((*P),3) );
            ADDSTRING  ( pak, thisclient->charname );
            ADDBYTE    ( pak, thisclient->channel );
            SendToClanMembers(thisclient->clanid,&pak);
        }
        break;        
        case 0xfa://message from worldserver to load the new clan information
        {
           int id = GETWORD((*P),1); // clanid
           int charid = GETWORD((*P),3);  // charid
           int clientid = GETWORD((*P),5); // clientid
           CCharClient* otherclient = (CCharClient*) GetClientByID ( charid );
           if(otherclient==NULL)
               return true;                        
        	// Load all our clan information
        	            //     0    1  2    3    4   5   6       7
        	result = DB->QStore("SELECT id,logo,back,name,cp,grade,slogan,news FROM list_clan where id=%i",id);
            if(result == NULL) return false;        	
            if(mysql_num_rows(result)!=1)
            {
                DB->QFree( );
                Log(MSG_WARNING, "Invalid clan: %i" , id );
                return false;
            }             	
        	row = mysql_fetch_row(result);
        	//clan info
        	CClans* newclan = new CClans;
            assert(newclan);          
        	newclan->id = atoi(row[0]);
        	newclan->logo = atoi(row[1]);
        	newclan->back = atoi(row[2]);
        	strncpy(newclan->name,row[3],16);
        	newclan->cp = atoi(row[4]);
        	newclan->grade = atoi(row[5]);	
            strncpy(newclan->slogan,row[6],29);	
            strcpy(newclan->news,row[7]);
            DB->QFree( );
            //member info
            CClanMembers* newmember = new CClanMembers;
            newmember->id = otherclient->charid;
            strcpy(newmember->name,otherclient->charname);   
            newclan->ClanMembers.push_back( newmember );            	
        	ClanList.push_back( newclan );				
        	DB->QFree( );
            otherclient->clanid = id;
            otherclient->clan_rank = 6;                    
            //Send new clan information    
            BEGINPACKET( pak, 0x7e0);
            ADDBYTE    ( pak, 0x30);
            ADDWORD    ( pak, clientid);
            ADDWORD    ( pak, 0x0100);//
            ADDWORD    ( pak, newclan->back );//clan background
            ADDWORD    ( pak, newclan->logo );//clanlogo            
            ADDBYTE    ( pak, 0x01);//clan grade
            ADDBYTE    ( pak, otherclient->clan_rank);// clan rank
            for(int i=0;i<146;i++)//clan skills
                ADDBYTE ( pak, 0x00);
            ADDSTRING  ( pak, newclan->name);//clan name
            ADDBYTE    ( pak, 0x00);
            ADDWORD    ( pak, 0x0000 );
            ADDWORD    ( pak, 0x0000 );
            ADDWORD    ( pak, 0x0000 );
            ADDWORD    ( pak, 0x0000 );                                                
            ADDSTRING  ( pak, newclan->slogan);//clan slogan
            ADDBYTE    ( pak, 0x00);
            otherclient->SendPacket(&pak);                      
        }
        break;
        default:
            Log( MSG_INFO, "Clan action unknow %i ", action);
        break;
    }
    return true;
}

// Send clan members
bool CCharServer::pakClanMembers ( CCharClient* thisclient )
{    
	CClans* thisclan = (CClans*) GetClanByID( thisclient->clanid );
	if(thisclan!=NULL)
	{
        BEGINPACKET( pak, 0x7e0 );
        ADDBYTE    ( pak, 0x72 );//Send clan members
        for(UINT i=0;i<thisclan->ClanMembers.size( );i++)
    	{
            CClanMembers* thismember = thisclan->ClanMembers.at( i );
            if(thismember==NULL)
                continue;                                                                 
            CCharClient* otherclient = (CCharClient*) GetClientByID (thismember->id);
            if(otherclient!=NULL)
            {
                ADDBYTE    ( pak, thismember->clan_rank ); //clan rank
                ADDBYTE    ( pak, otherclient->channel ); //channel (0x01 = channel 1)
                ADDWORD    ( pak, 0x0000 );       
                ADDWORD    ( pak, 0x0000 );                   
                ADDWORD    ( pak, otherclient->level );// Level
                ADDWORD    ( pak, otherclient->job );// Job
            }
            else
            {          
                ADDBYTE    ( pak, thismember->clan_rank); //clan rank
                ADDBYTE    ( pak, 0xff ); //channel (0xff = offline)
                ADDWORD    ( pak, 0x0000 );       
                ADDWORD    ( pak, 0x0000 );                   
                ADDWORD    ( pak, 0x0000 );// Level     
                ADDWORD    ( pak, 0x0000 );// Job                 
            }                
            ADDSTRING  ( pak, thismember->name );
            ADDBYTE    ( pak, 0x00 );  
        }        
        thisclient->SendPacket( &pak );            
    }
    else
    {
        BEGINPACKET( pak, 0x7e0 );
        ADDBYTE    ( pak, 0x0f );
        ADDDWORD   ( pak, 0x00000001 );
        thisclient->SendPacket( &pak );
    }
    return true;
}

// Logout from clan
bool CCharServer::ClanLogout ( CCharClient* thisclient )
{    
    CClans* thisclan = (CClans*) GetClanByID(thisclient->clanid);             
    if(thisclan!=NULL)
    {       
        for(UINT i=0;i<thisclan->ClanMembers.size();i++)
        {
            CClanMembers* thismember = thisclan->ClanMembers.at( i );
            CCharClient* otherclient = (CCharClient*) GetClientByID ( thismember->id );
            if(otherclient!=NULL)
            {
                ChangeClanStatus (thisclient, otherclient, 0xff);//send channel here
            }
        }        	
    }     
    return true;
}

// upload clanmark
bool CCharServer::pakUploadCM ( CCharClient* thisclient, CPacket* P )
{
    CClans* thisclan = GetClanByID( thisclient->clanid );
    if(thisclan==NULL) return true;    
    FILE* fh = fopen( "clanmark/clanmark.cnt", "r+" );
    if(fh==NULL)
    {
        Log( MSG_WARNING, "Error opening clanmark counter file" );
        return true;
    }
    rewind(fh);
    unsigned int cmid = 0;// this will be our clanmark id
    unsigned int tcmid = 0;// this will be to update the id
    fread( &cmid, 1, 4, fh );  
    tcmid = cmid+1;
    rewind(fh);    
    fwrite( &tcmid, 1, 4, fh );
    fclose(fh);   
    thisclan->logo = cmid;
    thisclan->back = 0;
    char filename[30];
    sprintf( filename, "clanmark/%u.cm", cmid );
    fh = fopen( filename, "w+" );
    if(fh==NULL)
    {
        Log( MSG_WARNING, "Error creating clanmark file" );
        return true;
    }
    rewind(fh);
    for(unsigned int i=0;i<P->Size-6;i++)
        fwrite( &P->Buffer[i], 1, 1, fh );
    fclose(fh);        
    DB->QExecute("UPDATE list_clan SET logo=%i,back=0 WHERE id=%i",cmid, thisclient->clanid );      
	BEGINPACKET( pak, 0x7e1 );//update clan info in world
	ADDBYTE    ( pak, 0xff );
	ADDWORD    ( pak, thisclient->clanid );
	ADDDWORD   ( pak, cmid );
	cryptPacket( (char*)&pak, NULL );
	for(int i=0;i<ChannelList.size();i++)
        send( ChannelList.at(i)->sock, (char*)&pak, pak.Size, 0 );    
    return true;
}

bool CCharServer::pakDownloadCM ( CCharClient* thisclient, CPacket* P )
{
    unsigned int clanid = GETDWORD((*P), 0 );
    MYSQL_RES* result = DB->QStore("SELECT logo FROM list_clan WHERE id=%i",clanid );
    if(result==NULL) return true;
    if(mysql_num_rows(result)!=1) return true;
    MYSQL_ROW row = mysql_fetch_row(result);
    unsigned int cmid = atoi(row[0]);
    DB->QFree( );          
    char filename[30];
    sprintf( filename, "clanmark/%u.cm", cmid ); 
    FILE* fh = fopen( filename, "r" );
    if(fh==NULL)
    {
        Log( MSG_WARNING, "Invalid clanmark ID %i", cmid );
        return true;
    }  
    BEGINPACKET( pak, 0x7e7 );
    ADDDWORD   ( pak, clanid );
    while(!feof(fh))
    {
        unsigned char charvalue = '\0';
        fread( &charvalue, 1 , 1, fh );
        ADDBYTE( pak, charvalue );         
    }
    thisclient->SendPacket( &pak );
    fclose(fh);
    return true;
}

bool CCharServer::pakClanIconTime ( CCharClient* thisclient, CPacket* P ) //FORMAT UNKNOWN
{
    return true;
}

⌨️ 快捷键说明

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