Character getCharacterBySQL(ISL.Server.Account.Account owner) { Character character=null; string sql=String.Format("SELECT * FROM {0} WHERE user_id = {1}", CHARACTERS_TBL_NAME, owner.getID()); DataTable charInfo=mDb.ExecuteQuery(sql); // If the character is not even in the database then // we have no choice but to return nothing. if(charInfo.Rows.Count==0) return null; character=new Character(charInfo.Rows[0]["name"].ToString(), Convert.ToInt32(charInfo.Rows[0]["id"])); character.setGender(Convert.ToInt32(charInfo.Rows[0]["gender"])); character.setHairStyle(Convert.ToInt32(charInfo.Rows[0]["hair_style"])); character.setHairColor(Convert.ToInt32(charInfo.Rows[0]["hair_color"])); character.setLevel(Convert.ToInt32(charInfo.Rows[0]["level"])); character.setCharacterPoints(Convert.ToInt32(charInfo.Rows[0]["char_pts"])); character.setCorrectionPoints(Convert.ToInt32(charInfo.Rows[0]["correct_pts"])); Point pos=new Point(Convert.ToInt32(charInfo.Rows[0]["x"]), Convert.ToInt32(charInfo.Rows[0]["y"])); character.setPosition(pos); int mapId=Convert.ToInt32(charInfo.Rows[0]["map_id"]); if(mapId>0) { character.setMapId(mapId); } else { // Set character to default map and one of the default location // Default map is to be 1, as not found return value will be 0. character.setMapId(Configuration.getValue("char_defaultMap", 1)); } character.setCharacterSlot(Convert.ToUInt32(charInfo.Rows[0]["slot"])); // Fill the account-related fields. Last step, as it may require a new // SQL query. if(owner!=null) { character.setAccount(owner); } else { int id=Convert.ToInt32(charInfo.Rows[0]["user_id"]); character.setAccountID(id); string s=String.Format("SELECT level FROM {0} WHERE id = '{1}';", ACCOUNTS_TBL_NAME, id); DataTable levelInfo=mDb.ExecuteQuery(s); character.setAccountLevel(Convert.ToInt32(levelInfo.Rows[0]["level"]), true); } // Load attributes." string s2=String.Format("SELECT attr_id, attr_base, attr_mod FROM {0} WHERE char_id = {1};", CHAR_ATTR_TBL_NAME, character.getDatabaseID()); DataTable attrInfo=mDb.ExecuteQuery(s2); if(attrInfo.Rows.Count>0) { uint nRows=(uint)attrInfo.Rows.Count; for(uint row = 0;row < nRows;++row) { uint id=Convert.ToUInt32(charInfo.Rows[0]["attr_id"]); character.setAttribute(id, Convert.ToDouble(charInfo.Rows[0]["attr_base"])); character.setModAttribute(id, Convert.ToDouble(charInfo.Rows[0]["attr_mod"])); } } // Load the skills of the char from CHAR_SKILLS_TBL_NAME string s3=String.Format("SELECT status_id, status_time FROM {0} WHERE char_id = {1};", CHAR_STATUS_EFFECTS_TBL_NAME, character.getDatabaseID()); DataTable skillInfo=mDb.ExecuteQuery(s3); if(skillInfo.Rows.Count>0) { uint nRows=(uint)skillInfo.Rows.Count; for(uint row = 0;row < nRows;row++) { character.setExperience( Convert.ToInt32(skillInfo.Rows[0]["status_id"]), // Skill Id Convert.ToInt32(skillInfo.Rows[0]["status_time"])); // Experience } } // Load the status effect string s4=String.Format("SELECT status_id, status_time FROM {0} WHERE char_id = {1};", CHAR_STATUS_EFFECTS_TBL_NAME, character.getDatabaseID()); DataTable statusInfo=mDb.ExecuteQuery(s4); if(statusInfo.Rows.Count>0) { uint nRows=(uint)statusInfo.Rows.Count; for(uint row = 0;row < nRows;row++) { character.applyStatusEffect( Convert.ToInt32(statusInfo.Rows[0]["status_id"]), // Status Id Convert.ToInt32(statusInfo.Rows[0]["status_time"])); // Time } } // Load the kill stats string s5=String.Format("SELECT monster_id, kills FROM {0} WHERE char_id = {1};", CHAR_KILL_COUNT_TBL_NAME, character.getDatabaseID()); DataTable killsInfo=mDb.ExecuteQuery(s5); if(killsInfo.Rows.Count>0) { uint nRows=(uint)killsInfo.Rows.Count; for(uint row = 0;row < nRows;row++) { character.setKillCount( Convert.ToInt32(killsInfo.Rows[0]["monster_id"]), // MonsterID Convert.ToInt32(killsInfo.Rows[0]["kills"])); // Kills } } // Load the special status string s6=String.Format("SELECT special_id FROM {0} WHERE char_id = {1};", CHAR_SPECIALS_TBL_NAME, character.getDatabaseID()); DataTable specialsInfo=mDb.ExecuteQuery(s6); if(specialsInfo.Rows.Count>0) { uint nRows=(uint)specialsInfo.Rows.Count; for(uint row = 0;row < nRows;row++) { character.giveSpecial(Convert.ToInt32(specialsInfo.Rows[0]["special_id"])); } } Possessions poss=character.getPossessions(); string s7=String.Format("SELECT slot_type, item_id, item_instance FROM {0} WHERE owner_id = '{1}' ORDER BY slot_type desc;", CHAR_EQUIPS_TBL_NAME, character.getDatabaseID()); DataTable equipInfo=mDb.ExecuteQuery(s7); Dictionary< uint, EquipmentItem > equipData=new Dictionary<uint, EquipmentItem>(); if(equipInfo.Rows.Count>0) { EquipmentItem equipItem=new EquipmentItem(); for(int k = 0, size = equipInfo.Rows.Count;k < size;++k) { equipItem.itemId=Convert.ToUInt32(equipInfo.Rows[0]["item_id"]); equipItem.itemInstance=Convert.ToUInt32(equipInfo.Rows[0]["item_instance"]); equipData.Add(Convert.ToUInt32(equipInfo.Rows[0]["slot_type"]), equipItem); } } poss.setEquipment(equipData); string s8=String.Format("SELECT * FROM {0} WHERE owner_id = '{1}' ORDER by slot ASC", INVENTORIES_TBL_NAME, character.getDatabaseID()); DataTable itemInfo=mDb.ExecuteQuery(s8); Dictionary<uint, InventoryItem > inventoryData=new Dictionary<uint, InventoryItem>(); if(itemInfo.Rows.Count>0) { for(int k = 0, size = itemInfo.Rows.Count;k < size;++k) { InventoryItem item=new InventoryItem(); ushort slot=Convert.ToUInt16(itemInfo.Rows[0]["slot"]); item.itemId=Convert.ToUInt32(itemInfo.Rows[0]["class_id"]); item.amount=Convert.ToUInt32(itemInfo.Rows[0]["amount"]); inventoryData[slot]=item; } } poss.setInventory(inventoryData); return character; }
void handleCharacterCreateMessage(AccountClient client, MessageIn msg) { string name=msg.readString(); int hairStyle=msg.readInt8(); int hairColor=msg.readInt8(); int gender=msg.readInt8(); // Avoid creation of character from old clients. // int slot=-1; // if(msg.getUnreadLength()>7) // { int slot=msg.readInt8(); // } MessageOut reply=new MessageOut(Protocol.APMSG_CHAR_CREATE_RESPONSE); ISL.Server.Account.Account acc=client.getAccount(); if(acc==null) { reply.writeInt8((byte)ErrorMessage.ERRMSG_NO_LOGIN); } else if(!Program.stringFilter.filterContent(name)) { reply.writeInt8((byte)ErrorMessage.ERRMSG_INVALID_ARGUMENT); } else if(Program.stringFilter.findDoubleQuotes(name)) { reply.writeInt8((byte)ErrorMessage.ERRMSG_INVALID_ARGUMENT); } else if(hairStyle>mNumHairStyles) { reply.writeInt8((byte)Create.CREATE_INVALID_HAIRSTYLE); } else if(hairColor>mNumHairColors) { reply.writeInt8((byte)Create.CREATE_INVALID_HAIRCOLOR); } else if(gender>mNumGenders) { reply.writeInt8((byte)Create.CREATE_INVALID_GENDER); } else if((name.Length<mMinNameLength)|| (name.Length>mMaxNameLength)) { reply.writeInt8((byte)ErrorMessage.ERRMSG_INVALID_ARGUMENT); } else { if(Program.storage.doesCharacterNameExist(name)) { reply.writeInt8((byte)Create.CREATE_EXISTS_NAME); client.send(reply); return; } // An account shouldn't have more // than <account_maxCharacters> characters. Dictionary<uint, ISL.Server.Account.Character> chars=acc.getCharacters(); if(slot<1||slot>mMaxCharacters||!acc.isSlotEmpty((uint)slot)) { reply.writeInt8((byte)Create.CREATE_INVALID_SLOT); client.send(reply); return; } if((int)chars.Count>=mMaxCharacters) { reply.writeInt8((byte)Create.CREATE_TOO_MUCH_CHARACTERS); client.send(reply); return; } // TODO: Add race, face and maybe special attributes. // Customization of character's attributes... List<int> attributes=new List<int>(); //std::vector<int>(mModifiableAttributes.size(), 0); for(uint i = 0;i < mModifiableAttributes.Count;++i) { attributes.Add(msg.readInt16()); } int totalAttributes=0; for(uint i = 0;i < mModifiableAttributes.Count;++i) { // For good total attributes check. totalAttributes+=attributes[(int)i]; // For checking if all stats are >= min and <= max. if(attributes[(int)i]<mAttributeMinimum ||attributes[(int)i]>mAttributeMaximum) { reply.writeInt8((byte)Create.CREATE_ATTRIBUTES_OUT_OF_RANGE); client.send(reply); return; } } if(totalAttributes>mStartingPoints) { reply.writeInt8((byte)Create.CREATE_ATTRIBUTES_TOO_HIGH); } else if(totalAttributes<mStartingPoints) { reply.writeInt8((byte)Create.CREATE_ATTRIBUTES_TOO_LOW); } else { Character newCharacter=new Character(name); // Set the initial attributes provided by the client for(uint i = 0;i < mModifiableAttributes.Count;++i) { //TODO schauen was hier genau passieren muss //newCharacter.mAttributes.Add((uint)(mModifiableAttributes[(int)i]), mModifiableAttributes[i]); //newCharacter.mAttributes.Add((uint)mModifiableAttributes[(int)i], attributes[(int)i]); } foreach(KeyValuePair<uint, Attribute> defaultAttributePair in mDefaultAttributes) { //TODO schauen was hier genau passieren muss // newCharacter.mAttributes.Add(defaultAttributePair.Key, defaultAttributePair.Value); } newCharacter.setAccount(acc); newCharacter.setCharacterSlot((uint)slot); newCharacter.setGender(gender); newCharacter.setHairStyle(hairStyle); newCharacter.setHairColor(hairColor); newCharacter.setMapId(Configuration.getValue("char_startMap", 1)); Point startingPos=new Point(Configuration.getValue("char_startX", 1024), Configuration.getValue("char_startY", 1024)); newCharacter.setPosition(startingPos); acc.addCharacter(newCharacter); Logger.Write(LogLevel.Information, "Character {0} was created for {1}'s account.", name, acc.getName()); Program.storage.flush(acc); // flush changes // log transaction Transaction trans=new Transaction(); trans.mCharacterId=(uint)newCharacter.getDatabaseID(); trans.mAction=(uint)TransactionMembers.TRANS_CHAR_CREATE; trans.mMessage=acc.getName()+" created character "; trans.mMessage+="called "+name; Program.storage.addTransaction(trans); reply.writeInt8((byte)ErrorMessage.ERRMSG_OK); client.send(reply); // Send new characters infos back to client sendCharacterData(client, chars[(uint)slot]); return; } } client.send(reply); }