// Create a character bool CCharServer::pakCreateChar( CCharClient* thisclient, CPacket* P ) { if (!thisclient->isLoggedIn) return false; // Get info from packet BYTE sex = GETBYTE((*P), 0 ) % 2; BYTE hairstyle = GETBYTE((*P), 2 ); BYTE face = GETBYTE((*P), 3 ); string newname = (char*)&P->Buffer[7]; MYSQL_RES *result; result = DB->QStore("SELECT id FROM characters WHERE account_name='%s'", thisclient->username); if(result==NULL) return false; if ( mysql_num_rows( result ) == 5 ) { BEGINPACKET( pak, 0x713 ); ADDWORD ( pak, 4 ); thisclient->SendPacket( &pak ); DB->QFree( ); return true; } DB->QFree( ); //LMA: checking name validity. if(!CheckValidName(thisclient, newname.c_str())) { BEGINPACKET( pak, 0x713); ADDWORD ( pak, 2 ); thisclient->SendPacket( &pak ); return true; } result = DB->QStore("SELECT id FROM characters WHERE char_name='%s'", newname.c_str()); if(result==NULL) return false; if ( mysql_num_rows( result ) > 0 ) { BEGINPACKET( pak, 0x713); ADDWORD ( pak, 2 ); thisclient->SendPacket( &pak ); DB->QFree( ); return true; } DB->QFree( ); if(!DB->QExecute("INSERT INTO characters (account_name, char_name, face, hairStyle, sex) VALUES('%s','%s',%i,%i,%i)", thisclient->username, newname.c_str(), face, hairstyle, sex)) return false; unsigned int mid = (unsigned)mysql_insert_id( DB->Mysql ); MYSQL_ROW row; if(!DB->QExecute("INSERT INTO items VALUES(%i,29,3,0,40,100,3,1,0,0,0,0,0)", mid)) return false; if(!DB->QExecute("INSERT INTO items VALUES(%i,29,5,0,40,100,6,1,0,0,0,0,0)", mid)) return false; if(!DB->QExecute("INSERT INTO items VALUES(%i,1,8,0,40,100,7,1,0,0,0,0,0)", mid)) return false; if(sex==0) { if(!DB->QExecute("INSERT INTO items VALUES(%i,222,2,0,40,100,12,1,0,0,0,0,0)", mid)) return false; } else { if(!DB->QExecute("INSERT INTO items VALUES(%i,221,2,0,40,100,12,1,0,0,0,0,0)", mid)) return false; } BEGINPACKET( pak, 0x713 ); ADDWORD ( pak, 0 ); thisclient->SendPacket( &pak ); return true; }
// Create a new clan bool CWorldServer::pakCreateClan ( CPlayer* thisclient, CPacket* P ) { if(thisclient->CharInfo->Zulies < 1000000) return true; thisclient->CharInfo->Zulies -= 1000000; //MYSQL_ROW row; int background = GETWORD((*P),1); int icon = GETWORD((*P),3); char*name=(char*)&P->Buffer[5]; char*slogan=(char*)&P->Buffer[strlen(name)+6]; //LMA: Check if name already exists and is short enough. if(!CheckValidName(thisclient,name)) { return true; } //LMA: Checking if it needs to be escaped. if(!CheckEscapeMySQL(name,50,true)) { return true; } //LMA: checking if the name is ok. MYSQL_RES *result = DB->QStore("SELECT name FROM list_clan WHERE name='%s'", name); if(result==NULL) return true; if ( mysql_num_rows( result ) > 0 ) { BEGINPACKET( pak, 0x07e0 ); ADDWORD ( pak, 0x42 ); thisclient->client->SendPacket( &pak ); DB->QFree( ); return true; } DB->QFree( ); //Check if user can create a clan if( thisclient->Clan->clanid != 0 ) { BEGINPACKET( pak, 0x7e0 ); ADDWORD ( pak, 0x44 ); thisclient->client->SendPacket( &pak ); return true; } char * lma_slogan = new char[strlen(slogan) + 1]; strcpy(lma_slogan,slogan); char * new_slogan = new char[strlen(lma_slogan)*3 +1]; mysql_real_escape_string(DB->Mysql, new_slogan,lma_slogan,strlen(lma_slogan)); //mysql_real_escape_string(DB->Mysql, new_slogan,"abcdefghijk",11); Log(MSG_INFO,"[WS] New clan %s created, slogan detected=%s, cleaned=%s ",name,slogan,new_slogan); //LMA: checking slogan's size. if(strlen(new_slogan)>=100) { Log(MSG_HACK,"%s tried to create clan %s with too long slogan %s (%i>=100)",thisclient->CharInfo->charname,name,new_slogan,strlen(new_slogan)); return true; } DB->QExecute( "INSERT into list_clan (logo,back,name,cp,grade,slogan,news) values (%i,%i,'%s',0,1,'%s','')",icon,background,name,new_slogan); thisclient->Clan->clanid = mysql_insert_id(DB->Mysql); thisclient->Clan->clanrank = 6; thisclient->Clan->logo = icon; thisclient->Clan->back = background; strncpy(thisclient->Clan->clanname,name,16); thisclient->Clan->grade = 1; //Update user clan information DB->QExecute( "UPDATE characters set clanid=%i,clan_rank=6 where id=%i", thisclient->Clan->clanid,thisclient->CharInfo->charid); //load clan info in char server BEGINPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0xfa ); //action to update clan informacion (charserver) ADDWORD ( pak, thisclient->Clan->clanid ); //ADDWORD ( pak, thisclient->CharInfo->charid ); ADDDWORD ( pak, thisclient->CharInfo->charid ); ADDWORD ( pak, thisclient->clientid ); cryptPacket( (char*)&pak, cct ); send( csock, (char*)&pak, pak.Size, 0 ); //Send to other players RESETPACKET( pak, 0x7e0 ); ADDBYTE ( pak, 0x35 ); ADDWORD ( pak, thisclient->clientid ); ADDDWORD ( pak, thisclient->Clan->clanid );//clanid ADDWORD ( pak, thisclient->Clan->back ); ADDWORD ( pak, thisclient->Clan->logo ); ADDBYTE ( pak, thisclient->Clan->grade );//clan grade ADDBYTE ( pak, thisclient->Clan->clanrank );//clan rank ADDSTRING ( pak, thisclient->Clan->clanname ); ADDBYTE ( pak, 0x00 ); SendToVisible( &pak, thisclient ); delete[] lma_slogan; delete[] new_slogan; return true; }