// Messenger Chat bool CCharServer::pakMessengerChat ( CCharClient* thisclient, CPacket* P ) { WORD id = GETWORD((*P),0); char* message = new char[P->Size-41]; if(message==NULL) { Log(MSG_ERROR, "Error allocing memory: pakMessengerChat" ); return false; } memcpy( message, &P->Buffer[35], P->Size-41 ); CCharClient* otherclient = (CCharClient*) GetClientByID(id); if(otherclient!=NULL) { BEGINPACKET( pak, 0x7e2 ); ADDWORD ( pak, thisclient->charid ); ADDWORD ( pak, 0x0000 ); ADDSTRING ( pak, thisclient->charname ); UINT namesize = strlen(thisclient->charname); for (int i=0;i<30-namesize;i++) ADDBYTE ( pak, 0x00 ); ADDBYTE ( pak, 0x00 ); ADDSTRING ( pak, message ); ADDBYTE ( pak, 0x00 ); otherclient->SendPacket(&pak); } delete []message; return true; }
// Return to char select bool CCharServer::pakWSCharSelect ( CCharClient* thisclient, CPacket* P ) { if(!thisclient->isLoggedIn) return false; Log( MSG_INFO, "World server requested char select" ); DWORD userid = GETDWORD( (*P), 0 ); CCharClient* otherclient = GetClientByUserID( userid ); if(otherclient==NULL) { Log(MSG_WARNING, "Invalid userid: %i", userid ); return true; } BEGINPACKET( pak, 0x71c ); ADDBYTE ( pak, 0x00 ); otherclient->SendPacket( &pak ); Log( MSG_INFO, "Client returning to char select" ); RESETPACKET( pak, 0x505 ); ADDDWORD( pak, thisclient->userid ); //cryptPacket( (char*)&pak, NULL ); CChanels* thischannel = GetChannelByID( thisclient->channel ); if(thischannel!=NULL) { send( thischannel->sock, (char*)&pak, pak.Size, 0 ); } //LMA: resetting chatroom ID. DisconnectClientFromChat(thisclient); return true; }
// Messenger actions (add/remove/invite) bool CCharServer::pakMessengerManager ( CCharClient* thisclient, CPacket* P ) { BYTE action = GETBYTE((*P),0); switch (action) { case 0x01://wanna be my friend? { char* nick = new (nothrow) char[P->Size-7]; if(nick==NULL) { Log(MSG_ERROR, "Error allocing memory: pakMessengerManager 1" ); return false; } memcpy( nick, &P->Buffer[1], P->Size-7 ); Log(MSG_INFO,"%s Trying to invite %s",nick,thisclient->charname); CCharClient* otherclient = (CCharClient*) GetClientByName (nick); if(otherclient!=NULL) {//Send friend invitation (check this one) BEGINPACKET( pak, 0x7e1 ); ADDBYTE ( pak, 0x01 ); ADDWORD ( pak, 0x0000 ); ADDSTRING ( pak, thisclient->charname ); ADDBYTE ( pak, 0x00 ); otherclient->SendPacket(&pak); Log(MSG_INFO,"%s exists, invite sent to %s",nick,otherclient->charname); } else {//This charname doesnt exist BEGINPACKET( pak, 0x7e1 ); ADDBYTE ( pak, 0x04 ); ADDSTRING ( pak, nick ); ADDBYTE ( pak, 0x00 ); thisclient->SendPacket(&pak); Log(MSG_INFO,"invite: %s doesn't exist",nick); } delete []nick; } break; case 0x02://yes i want { char* nick = new (nothrow) char[P->Size-9]; if(nick==NULL) { Log(MSG_ERROR, "Error allocing memory: pakMessengerManager 2" ); return false; } memcpy( nick, &P->Buffer[3], P->Size-9 ); CCharClient* otherclient = (CCharClient*) GetClientByName (nick); if(otherclient!=NULL) { BEGINPACKET( pak, 0x7e1 ); ADDBYTE ( pak, 0x02 ); ADDWORD ( pak, thisclient->charid ); ADDBYTE ( pak, 0x00 ); ADDWORD ( pak, 0x0000 ); ADDSTRING ( pak, thisclient->charname ); ADDBYTE ( pak, 0x00); otherclient->SendPacket(&pak); //Add friend to my friend list(sql) if(!DB->QExecute("INSERT INTO list_friend (id,idfriend,namefriend) VALUES (%i,%i,'%s')",otherclient->charid,thisclient->charid,thisclient->charname)) { Log(MSG_WARNING,"error addind %s to %s friend list",otherclient->charname,thisclient->charname); return false; } CFriendList * newfriend1 = new (nothrow) CFriendList; if(newfriend1==NULL) return false; newfriend1->id = otherclient->charid; //friendid strcpy(newfriend1->name, otherclient->charname); //friend name thisclient->FriendList.push_back( newfriend1 ); RESETPACKET( pak, 0x7e1 ); ADDBYTE ( pak, 0x02 ); ADDWORD ( pak, otherclient->charid ); ADDBYTE ( pak, 0x00 ); ADDWORD ( pak, 0x0000 ); ADDSTRING ( pak, otherclient->charname ); ADDBYTE ( pak, 0x00); thisclient->SendPacket(&pak); //Add me to his friend list (sql) if(!DB->QExecute("INSERT INTO list_friend (id,idfriend,namefriend) VALUES (%i,%i,'%s')", thisclient->charid,otherclient->charid,otherclient->charname)) return false; CFriendList * newfriend2 = new (nothrow) CFriendList; if(newfriend2==NULL) return false; newfriend2->id = thisclient->charid; //friendid strcpy(newfriend2->name, thisclient->charname); //friend name otherclient->FriendList.push_back( newfriend2 ); Log(MSG_INFO,"accept %s ok",nick); } else//not founded { BEGINPACKET( pak, 0x7e1 ); ADDBYTE ( pak, 0x04 ); ADDSTRING ( pak, nick ); ADDBYTE ( pak, 0x00 ); thisclient->SendPacket(&pak); Log(MSG_INFO,"accept: %s doesn't exist",nick); } delete []nick; } break; case 0x03://no, i dont want { char* nick = new (nothrow) char[P->Size-9]; if(nick==NULL) { Log(MSG_ERROR, "Error allocing memory: pakMessengerManager 3" ); return false; } memcpy( nick, &P->Buffer[3], P->Size-9 ); CCharClient* otherclient = (CCharClient*) GetClientByName (nick); if(otherclient!=NULL) { BEGINPACKET( pak, 0x7e1 ); ADDBYTE ( pak, 0x03 ); ADDSTRING ( pak, thisclient->charname ); ADDBYTE ( pak, 0x00); otherclient->SendPacket(&pak); Log(MSG_INFO,"refuse: %s ok",nick); } else { BEGINPACKET( pak, 0x7e1 ); ADDBYTE ( pak, 0x04 ); ADDWORD ( pak, 0x0000 ); ADDSTRING ( pak, nick ); ADDBYTE ( pak, 0x00 ); thisclient->SendPacket(&pak); Log(MSG_INFO,"refuse: %s doesn't exist",nick); } } break; case 0x05://delete user. { WORD id = GETWORD ((*P),1); if(!DB->QExecute("DELETE FROM list_friend WHERE id=%i and idfriend=%i",thisclient->charid,id)) { Log(MSG_INFO,"user failed to delete friend slot %i",thisclient->charname,id); return false; } Log(MSG_INFO,"user %s deletes friend slot %i",thisclient->charname,id); CCharClient* otherclient = (CCharClient*) GetClientByID(id); if(otherclient!=NULL) { ChangeMessengerStatus ( thisclient, otherclient, 0x08); } } break; case 0xfa://messenger logout { WORD id = GETWORD ((*P),1); CCharClient* ctherclient = (CCharClient*) GetClientByID(id); if(ctherclient==NULL) return true; ctherclient->logout = true; for(UINT i=0;i<ctherclient->FriendList.size();i++) { CFriendList* thisfriend = ctherclient->FriendList.at( i ); CCharClient* otherclient = (CCharClient*) GetClientByID( thisfriend->id ); if(otherclient!=NULL) { ChangeMessengerStatus ( ctherclient, otherclient, 0x08); } } //Logout in clan ClanLogout ( ctherclient ); } break; default: Log( MSG_INFO, "Friend action unknown: %i", action ); break; } return true; }
// Clan manager for all the clan functions bool CCharServer::pakClanManager ( CCharClient* thisclient, CPacket* P ) { if(!thisclient->isLoggedIn) return false; MYSQL_RES *result; MYSQL_ROW row; BYTE action = GETBYTE ((*P),0); switch (action) { case 0x01: break; case 0x02://invite clan { char* nick = new (nothrow) char[P->Size]; if(nick==NULL) { Log(MSG_ERROR, "Error allocing memory" ); return false; } memcpy( nick, &P->Buffer[1], P->Size ); if(strcmp(nick,thisclient->charname)==0) return true; CCharClient* otherclient = (CCharClient*) GetClientByName( nick ); if(otherclient!=NULL) { BEGINPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x0b );//invite action ADDSTRING ( pak, thisclient->charname ); ADDBYTE ( pak, 0x0 ); otherclient->SendPacket( &pak ); } delete []nick; } break; case 0x03://Kick from clan { char* nick = new (nothrow) char[P->Size]; if(nick==NULL) { Log(MSG_ERROR, "Error allocing memory" ); return false; } memcpy( nick, &P->Buffer[1], P->Size ); CClans* thisclan = GetClanByID(thisclient->clanid); if(thisclan==NULL) { delete []nick; return true; } BEGINPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x81 );//xxx have kicket to yyyy ADDSTRING ( pak, nick ); ADDBYTE ( pak, 0x00); ADDSTRING ( pak, thisclient->charname ); ADDBYTE ( pak, 0x00); SendToClanMembers(thisclient->clanid,&pak); for(UINT i=0;i<thisclan->ClanMembers.size( );i++) { CClanMembers* ClanMember = thisclan->ClanMembers.at( i ); if(strcmp(ClanMember->name,nick)==0) { thisclan->ClanMembers.erase( thisclan->ClanMembers.begin() + i ); break; } } CCharClient* otherclient = (CCharClient*) GetClientByName( nick ); if( otherclient!=NULL ) { otherclient->clanid = 0; otherclient->clan_rank=1; RESETPACKET( pak, 0x7e1 );//Update world clan information ADDBYTE ( pak, 0xfb );//action (kick) ADDSTRING ( pak, nick ); ADDBYTE ( pak, 0x00 ); CChanels* thischannel = GetChannelByID( otherclient->channel ); if(thischannel!=NULL) { send( thischannel->sock, (char*)&pak, pak.Size, 0 ); } else { Log(MSG_ERROR, "Check serverid in worldserver.conf it should be the same as ID in channels in the mysql database %i",thisclient->channel);} pakClanMembers( otherclient ); } if(!DB->QExecute("UPDATE characters SET clanid=0 AND clan_rank=1 WHERE char_name='%s'",nick)) { delete []nick; return false; } delete []nick; } break; case 0x04://up rank { bool online = true; 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 ); int clan_rank=0; int level=0; int job=0; int channel=0xff; if(strcmp(nick,thisclient->charname)==0) { delete []nick; return true; } CCharClient* otherclient = GetClientByName ( nick ); if(otherclient!=NULL) { clan_rank = otherclient->clan_rank; if(otherclient->clan_rank<5) { otherclient->clan_rank++; } else { delete []nick; return true; } CClans* thisclan = GetClanByID(otherclient->clanid); for(UINT i=0;i<thisclan->ClanMembers.size();i++) { CClanMembers* thismember = thisclan->ClanMembers.at(i); if(thismember!=0) { if (thismember->id==otherclient->charid) { thismember->clan_rank=otherclient->clan_rank; } } } job = otherclient->job; level = otherclient->level; channel=otherclient->channel; BEGINPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x83 ); ADDSTRING ( pak, nick ); ADDBYTE ( pak, 0x00 ); ADDBYTE ( pak, otherclient->clan_rank ); otherclient->SendPacket(&pak); } else { online=false; result = DB->QStore("SELECT clan_rank,classid,level FROM characters WHERE char_name='%s'",nick); if(result==NULL) { delete []nick; DB->QFree( ); return false; } if(mysql_num_rows(result)!=1) { Log(MSG_WARNING, "Invalid charname: %s" , nick ); delete []nick; DB->QFree( ); return false; } row = mysql_fetch_row( result ); clan_rank=atoi(row[0]); job = atoi(row[1]); level = atoi(row[2]); DB->QFree( ); } if(clan_rank<5) { clan_rank++; } if(!DB->QExecute("UPDATE characters SET clan_rank=%i WHERE char_name='%s'",clan_rank,nick)) { delete []nick; return false; } BEGINPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x75 ); ADDBYTE ( pak, clan_rank ); ADDBYTE ( pak, channel );//channel ADDWORD ( pak, 0x0000 ); ADDWORD ( pak, 0x0000 ); ADDWORD ( pak, level ); // level ADDWORD ( pak, job ); // job ADDSTRING ( pak, nick ); // Nick ADDBYTE ( pak, 0x00 ); SendToClanMembers(thisclient->clanid,&pak); if (online==true) { RESETPACKET( pak, 0x7e1 );//update world information ADDBYTE ( pak, 0xfc ); ADDBYTE ( pak, clan_rank ); ADDSTRING ( pak, nick ); ADDBYTE ( pak, 0x00 ); CChanels* thischannel = GetChannelByID( channel ); if(thischannel!=NULL){ send( thischannel->sock, (char*)&pak, pak.Size, 0 );} else { Log(MSG_ERROR, "Check serverid in worldserver.conf it should be the same as ID in channels in the mysql database %i",thisclient->channel);} } delete []nick; } break; case 0x05://down rank { bool online = true; 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 ); int clan_rank=0; int level=0; int job=0; int channel=0xff; if(strcmp(nick,thisclient->charname)==0) { delete []nick; return true; } CCharClient* otherclient = GetClientByName ( nick ); if(otherclient!=NULL) { clan_rank = otherclient->clan_rank; if(otherclient->clan_rank>1) { otherclient->clan_rank--; } else { delete []nick; return true; } CClans* thisclan = GetClanByID(otherclient->clanid); for(UINT i=0;i<thisclan->ClanMembers.size();i++) { CClanMembers* thismember = thisclan->ClanMembers.at(i); if(thismember!=0) { if (thismember->id==otherclient->charid) { thismember->clan_rank=otherclient->clan_rank; } } } job = otherclient->job; level = otherclient->level; channel=otherclient->channel; BEGINPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x83 ); ADDSTRING ( pak, nick ); ADDBYTE ( pak, 0x00 ); ADDBYTE ( pak, otherclient->clan_rank ); otherclient->SendPacket(&pak); } else { online=false; result = DB->QStore("SELECT clan_rank,classid,level FROM characters WHERE char_name='%s'",nick); if(result==NULL) { delete []nick; DB->QFree( ); return false; } if(mysql_num_rows(result)!=1) { Log(MSG_WARNING, "Invalid charname: %s" , nick ); delete []nick; DB->QFree( ); return false; } row = mysql_fetch_row( result ); clan_rank=atoi(row[0]); job = atoi(row[1]); level = atoi(row[2]); DB->QFree( ); } if(clan_rank>1) { clan_rank--; } if(!DB->QExecute("UPDATE characters SET clan_rank=%i WHERE char_name='%s'",clan_rank,nick)) { delete []nick; return false; } BEGINPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x75 ); ADDBYTE ( pak, clan_rank ); ADDBYTE ( pak, channel );//channel ADDWORD ( pak, 0x0000 ); ADDWORD ( pak, 0x0000 ); ADDWORD ( pak, level ); // level ADDWORD ( pak, job ); // job ADDSTRING ( pak, nick ); // Nick ADDBYTE ( pak, 0x00 ); SendToClanMembers(thisclient->clanid,&pak); if (online==true) { RESETPACKET( pak, 0x7e1 );//update world information ADDBYTE ( pak, 0xfc ); ADDBYTE ( pak, clan_rank ); ADDSTRING ( pak, nick ); ADDBYTE ( pak, 0x00 ); CChanels* thischannel = GetChannelByID( channel ); if(thischannel!=NULL){ send( thischannel->sock, (char*)&pak, pak.Size, 0 );} else { Log(MSG_ERROR, "Check serverid in worldserver.conf it should be the same as ID in channels in the mysql database %i",thisclient->channel);} } delete []nick; } break; case 0x06://Change news { if(thisclient->clan_rank<5) return true; char* news = new (nothrow) char[P->Size-7]; if(news==NULL) { Log(MSG_ERROR, "Error allocing memory" ); return false; } memcpy( news, &P->Buffer[1], P->Size-7 ); CClans* thisclan = GetClanByID(thisclient->clanid); if(thisclan!=NULL) { strcpy(thisclan->news,news); BEGINPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x34 ); ADDSTRING ( pak, thisclan->news ); ADDBYTE ( pak, 0x00 ); SendToClanMembers(thisclan->id,&pak); if(!DB->QExecute("UPDATE list_clan SET news='%s' WHERE id=%i", thisclan->news, thisclan->id)) return false; } delete []news; } break; case 0x07://Leave Clan { if( thisclient->clan_rank == 6 ) return true; CClans* thisclan = GetClanByID( thisclient->clanid ); if(thisclan==NULL) return true; BEGINPACKET( pak, 0x7e0 ); ADDBYTE( pak, 0x82 ); ADDSTRING( pak, thisclient->charname ); ADDBYTE( pak, 0x00); SendToClanMembers(thisclient->clanid,&pak); for(UINT i=0;i<thisclan->ClanMembers.size();i++) { CClanMembers* ClanMember = thisclan->ClanMembers.at( i ); if(strcmp(ClanMember->name,thisclient->charname)==0) { thisclan->ClanMembers.erase( thisclan->ClanMembers.begin()+i ); delete ClanMember; break; } } thisclient->clanid = 0; thisclient->clan_rank=1; if(!DB->QExecute("UPDATE characters SET clanid=0 , clan_rank=0 WHERE char_name='%s'",thisclient->charname)) return false; RESETPACKET( pak, 0x7e1 );//Update world clan information ADDBYTE ( pak, 0xfb );//action (leave) ADDSTRING ( pak, thisclient->charname ); ADDBYTE ( pak, 0x00 ); CChanels* thischannel = GetChannelByID( thisclient->channel ); if(thischannel!=NULL){ send( thischannel->sock, (char*)&pak, pak.Size, 0 );} else { Log(MSG_ERROR, "Check serverid in worldserver.conf it should be the same as ID in channels in the mysql database %i",thisclient->channel);} } break; case 0x08: { pakClanMembers ( thisclient ); } break; case 0x09://Give Master { int clan_rank=0; int level=0; int job=0; int channel=0xff; 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 ); if(strcmp(nick,thisclient->charname)==0) { delete []nick; return true; } //Convert to master CCharClient* otherclient = GetClientByName ( nick ); if(otherclient!=NULL) { clan_rank = 6; otherclient->clan_rank = clan_rank; job = otherclient->job; level = otherclient->level; channel = otherclient->channel; BEGINPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x83 ); ADDSTRING ( pak, nick ); ADDBYTE ( pak, 0x00 ); ADDBYTE ( pak, otherclient->clan_rank ); otherclient->SendPacket(&pak); } else { // 0 1 result = DB->QStore("SELECT classid,level FROM characters where char_name='%s'",nick); if(result==NULL) { delete []nick; return false; } if(mysql_num_rows(result)!=1) { DB->QFree( ); Log(MSG_WARNING, "Invalid charname: %s" , nick ); delete []nick; return false; } row = mysql_fetch_row( result ); job = atoi(row[0]); level = atoi(row[1]); DB->QFree( ); } if(!DB->QExecute("UPDATE characters SET clan_rank=%i WHERE char_name='%s'",clan_rank,nick)) { delete []nick; return false; } BEGINPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x75 ); ADDBYTE ( pak, clan_rank ); ADDBYTE ( pak, channel );//canal ADDWORD ( pak, 0x0000 ); ADDWORD ( pak, 0x0000 ); ADDWORD ( pak, level ); //level? ADDWORD ( pak, job ); // job? ADDSTRING ( pak, nick ); ADDBYTE ( pak, 0x00 ); SendToClanMembers(thisclient->clanid,&pak); RESETPACKET( pak, 0x7e1 );//update world information ADDBYTE ( pak, 0xfc ); ADDBYTE ( pak, clan_rank ); ADDSTRING ( pak, nick ); ADDBYTE ( pak, 0x00 ); CChanels* thischannel = GetChannelByID( channel ); if(thischannel!=NULL){ send( thischannel->sock, (char*)&pak, pak.Size, 0 );} else { Log(MSG_ERROR, "Check serverid in worldserver.conf it should be the same as ID in channels in the mysql database %i",thisclient->channel);} //Convert to commander clan_rank = 4; thisclient->clan_rank=clan_rank; job = thisclient->job; level = thisclient->level; channel = thisclient->channel; RESETPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x83 ); ADDSTRING ( pak, thisclient->charname ); ADDBYTE ( pak, 0x00 ); ADDBYTE ( pak, thisclient->clan_rank ); thisclient->SendPacket(&pak); if(!DB->QExecute("UPDATE characters SET clan_rank=%i WHERE char_name='%s'",clan_rank,thisclient->charname)) { delete []nick; return false; } RESETPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x75 ); ADDBYTE ( pak, clan_rank ); ADDBYTE ( pak, channel );//canal ADDWORD ( pak, 0x0000 ); ADDWORD ( pak, 0x0000 ); ADDWORD ( pak, level ); //level? ADDWORD ( pak, job ); // job? ADDSTRING ( pak, thisclient->charname ); ADDBYTE ( pak, 0x00 ); SendToClanMembers(thisclient->clanid,&pak); RESETPACKET( pak, 0x7e1 );//update world information ADDBYTE ( pak, 0xfc ); ADDBYTE ( pak, clan_rank ); ADDSTRING ( pak, thisclient->charname ); ADDBYTE ( pak, 0x00 ); thischannel = GetChannelByID( channel ); if(thischannel!=NULL){ send( thischannel->sock, (char*)&pak, pak.Size, 0 );} else { Log(MSG_ERROR, "Check serverid in worldserver.conf it should be the same as ID in channels in the mysql database %i",thisclient->channel);} delete []nick; } break; case 0x0a://disorganize clan { if(thisclient->clan_rank<6) return true; unsigned int clanid = thisclient->clanid; CClans* thisclan = GetClanByID(thisclient->clanid); if(thisclan==NULL) return true; if(thisclan->ClanMembers.size()>1)//Can't be deleted if there are members return true; if(!DB->QExecute("UPDATE characters SET clanid=0 AND clan_rank=1 WHERE clanid=%i",thisclient->clanid)) return false; if(!DB->QExecute("DELETE FROM list_clan WHERE id=%i",thisclient->clanid)) return false; BEGINPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x51 ); ADDBYTE ( pak, 0x00 ); SendToClanMembers(thisclient->clanid, &pak); thisclan->ClanMembers.clear( ); //delete from clan list for(UINT i=0;i<ClanList.size( );i++) { CClans* clan = ClanList.at( i ); if(thisclan == clan) { ClanList.erase( ClanList.begin() + i ); delete clan; break; } } RESETPACKET( pak, 0x7e1 );//Update world clan information ADDBYTE ( pak, 0xfd );//action (disorg) ADDWORD ( pak, clanid ); ADDWORD ( pak, thisclient->charid ); CChanels* thischannel = GetChannelByID( thisclient->channel ); if(thischannel!=NULL){ send( thischannel->sock, (char*)&pak, pak.Size, 0 );} else { Log(MSG_ERROR, "Check serverid in worldserver.conf it should be the same as ID in channels in the mysql database %i",thisclient->channel);} 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 , clan_rank=1 WHERE char_name='%s'",thisclient->clanid,thisclient->charname)) { delete []nick; return false; } CClans* thisclan = GetClanByID(thisclient->clanid); if(thisclan==NULL) { Log(MSG_ERROR, "Clan with id %d doesn't exist", thisclient->clanid); 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 { Log(MSG_ERROR, "Char with name %s doesn't exist", nick); 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 ); CChanels* thischannel = GetChannelByID( thisclient->channel ); if(thischannel!=NULL) { send( thischannel->sock, (char*)&pak, pak.Size, 0 ); } else { Log(MSG_ERROR, "Check serverid in worldserver.conf it should be the same as ID in channels in the mysql database %i",thisclient->channel); } 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 { CClans* thisclan = (CClans*) GetClanByID( thisclient->clanid ); if(thisclan!=NULL) { BEGINPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x84 ); ADDWORD ( pak, GETWORD ((*P),1) ); ADDWORD ( pak, GETWORD ((*P),3) ); ADDSTRING ( pak, thisclient->charname ); ADDBYTE ( pak, 0x00 ); SendToClanMembers(thisclient->clanid,&pak); } } break; case 0x5C://message from worldserver to load the new clan information { UINT clanid = GETWORD((*P),1); UINT clientrank = GETWORD((*P),3); CClans* thisclan = (CClans*) GetClanByID( clanid ); if(thisclan==NULL) return true; thisclan->cp=GETDWORD ((*P),5); BEGINPACKET( pak, 0x7e0); ADDBYTE ( pak, 0x71); ADDWORD ( pak, clanid); ADDWORD ( pak, 0x0000);// ADDWORD ( pak, thisclan->back );//clan background ADDWORD ( pak, thisclan->logo );//clanlogo ADDBYTE ( pak, thisclan->grade);//clan grade ADDBYTE ( pak, 0xCC); ADDDWORD ( pak, thisclan->cp ); ADDDWORD ( pak, 0x00000064 ); ADDDWORD ( pak, 0x00000000 ); ADDDWORD ( pak, 0x00000000 ); ADDWORD ( pak, 0xCCCC ); ADDWORD ( pak, 0xCCCC ); ADDWORD ( pak, 0xCCCC ); for(int i=0;i<119;i++) ADDBYTE ( pak, 0x00); SendToClanMembers(clanid,&pak); UpdateClanWindow(clanid); } 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]); ClanList.push_back( newclan ); DB->QFree( ); //member info CClanMembers* newmember = new CClanMembers; newmember->id = otherclient->charid; strcpy(newmember->name,otherclient->charname); newmember->clan_rank = 6; newclan->ClanMembers.push_back( newmember ); 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, newclan->grade);//clan grade ADDBYTE ( pak, otherclient->clan_rank);// clan rank ADDDWORD ( pak, newclan->cp ); ADDDWORD ( pak, 0x00000000 ); // Unk ADDDWORD ( pak, 0x00000000 ); // Clan Funds ADDDWORD ( pak, 0x00000000 ); // Unk ADDWORD ( pak, 0x0000 ); // Unk ADDDWORD ( pak, 0x00000000 ); // Contribution for(int i=0;i<120;i++) ADDBYTE ( pak, 0x00); ADDSTRING ( pak, newclan->name);//clan name ADDBYTE ( pak, 0x00); ADDSTRING ( pak, newclan->slogan);//clan slogan ADDBYTE ( pak, 0x00); otherclient->SendPacket(&pak); } break; case 0xfb: { UINT clanid = GETWORD((*P),1); UINT grade = GETWORD((*P),3); CClans* thisclan = (CClans*) GetClanByID( clanid ); if(thisclan!=NULL) { BEGINPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x84 ); ADDWORD ( pak, GETWORD ((*P),1) ); ADDWORD ( pak, GETWORD ((*P),3) ); ADDSTRING ( pak, thisclient->charname ); ADDBYTE ( pak, 0x00 ); SendToClanMembers(thisclient->clanid,&pak); } } default: Log( MSG_INFO, "Clan action unknow %i ", action); break; } return true; }