📄 clan.cpp.svn-base
字号:
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 + -