public static async Task <Character> CreateCharacterAsync(int user, PonyData pony, short level = 1) { try { using (var connection = await GetConnectionAsync()) { using (var command = connection.CreateCommand()) { var data = CharsMgr.CreateCharacterData(pony, level); command.CommandText = $"INSERT INTO {tb_02} (user, level, race, gender, name, vdata, gdata) VALUES (@user, {level}, @race, @gender, @name, @vdata, @gdata);"; command.Parameters.AddWithValue("user", user); command.Parameters.AddWithValue("name", pony.Name); command.Parameters.AddWithValue("race", pony.Race); command.Parameters.AddWithValue("gender", pony.Gender); command.Parameters.AddWithValue("vdata", pony.GetBytes()); command.Parameters.AddWithValue("gdata", data.GetBytes()); if (await command.ExecuteNonQueryAsyncEx() == 1) { return(new Character((int)command.LastInsertedId, user, level, 0, pony, data)); } } } return(null); } catch (Exception exp) { ServerLogger.LogException(exp); return(null); } }
public static string ToPonyCode(this PonyData data) { var bits = new BitArray(data.Name.Length * 6 + 276); var index = 0; bits.AddBits(ref index, data.Race, 2); bits.AddBits(ref index, data.HairColor0, 24); bits.AddBits(ref index, data.HairColor1, 24); bits.AddBits(ref index, data.BodyColor, 24); bits.AddBits(ref index, data.EyeColor, 24); bits.AddBits(ref index, data.HoofColor, 24); bits.AddBits(ref index, data.Mane, 8); bits.AddBits(ref index, data.Tail, 8); bits.AddBits(ref index, data.Eye, 8); bits.AddBits(ref index, data.Hoof, 5); bits.AddBits(ref index, data.CutieMark0, 10); bits.AddBits(ref index, data.CutieMark1, 10); bits.AddBits(ref index, data.CutieMark2, 10); bits.AddBits(ref index, data.Gender, 2); bits.AddBits(ref index, BitConverter.ToInt32(BitConverter.GetBytes(data.BodySize), 0), 32); bits.AddBits(ref index, BitConverter.ToInt32(BitConverter.GetBytes(data.HornSize), 0), 32); bits.AddBits(ref index, Math.Min(31, data.Name.Length - 1), 5); string name = data.Name; for (int i = 0; i < name.Length; i++) { char @char = name[i]; bits.AddBits(ref index, @char.EncodeChar(), 6); } bits.AddBits(ref index, data.HairColor2, 24); var buffer = new byte[(bits.Length + 7) >> 3]; bits.CopyTo(buffer, 0); return(Convert.ToBase64String(buffer)); }
public DB_NPC(int id, byte flags, short level, ushort dialog, byte index, ushort movement, PonyData pony) { ID = id; Pony = pony; Level = level; Dialog = dialog; DialogIndex = index; Movement = movement; Flags = (NPCFlags)flags; if ((Flags & NPCFlags.Trader) > 0) { Items = new List <int>(); } else { Items = null; } if ((Flags & NPCFlags.Wears) > 0) { Wears = new List <int>(); } else { Wears = null; } }
public async Task <bool> UpdateCharacter(int index, PonyData pony) { if (m_data == null || index >= m_data.Count) { return(false); } CharsMgr.ValidatePonyData(pony); if (index == -1) { if (m_data.Count >= CharsMgr.MaxChars) { return(false); } var character = await ServerDB.CreateCharacterAsync(_user.ID, pony); if (character == null) { return(false); } m_data.Add(character); } else { var character = m_data[index]; character.Pony = pony; if (!await ServerDB.UpdatePonyAsync(character)) { return(false); } } return(true); }
private async void RPC_001(NetMessage arg1, NetMessageInfo arg2) { var player = m_server[arg2.Sender.Id]; var pony = new PonyData(); var index = arg1.ReadInt32(); pony.OnDeserialize(arg1); if (CharsMgr.CheckName(pony.Name)) { if (await player.UpdateCharacter(index, pony)) { var character = index == -1 ? player.Data.Last() : player.Data[index]; player.User.Char = character.Id; if (character.Map == 0 || !DataMgr.Select(character.Map, out DB_Map map)) { arg2.Sender.ChangeRoom(StartMaps[(byte)pony.Race]); } else { arg2.Sender.ChangeRoom(map.Name); } arg2.Sender.SynchNetData(); } else { arg2.Sender.Error("Error while saving pony, most likely character isn't unique."); } } else { arg2.Sender.Error($"Name \"{pony.Name}\" disapproved!"); } }
public bool UpdateCharacter(int index, PonyData pony) { if (_data == null || index >= _data.Count) { return(false); } Character character; if (index == -1) { if (_data.Count >= CharsMgr.MaxChars) { return(false); } if (!CharsMgr.CreateCharacter(_user.ID, pony, out character)) { return(false); } _data.Add(character); } else { character = _data[index]; character.Pony = pony; if (!ServerDB.UpdatePony(character)) { return(false); } } return(true); }
public static void ValidatePonyData(PonyData pony) { { var value = MathHelper.Clamp(pony.HornSize, MinHornSize, MaxHornSize); if (value != pony.HornSize) { ServerLogger.LogWarning($"Resetting character \"{pony.Name}\" horn size from {pony.HornSize} to {value}"); pony.HornSize = value; } } { var value = MathHelper.Clamp(pony.BodySize, MinBodySize, MaxBodySize); if (value != pony.BodySize) { ServerLogger.LogWarning($"Resetting character \"{pony.Name}\" body size from {pony.BodySize} to {value}"); pony.BodySize = value; } } { var value = (Gender)MathHelper.Clamp((byte)pony.Gender, (byte)Gender.Filly, (byte)Gender.Stallion); if (value != pony.Gender) { ServerLogger.LogWarning($"Resetting character \"{pony.Name}\" gender from {pony.Gender} to {value}"); pony.Gender = value; } } { var value = (CharacterType)MathHelper.Clamp((byte)pony.Race, (byte)CharacterType.EarthPony, (byte)CharacterType.Pegasus); if (value != pony.Race) { ServerLogger.LogWarning($"Resetting character \"{pony.Name}\" race from {pony.Race} to {value}"); pony.Race = value; } } }
public static bool CreateCharacter(int user, PonyData pony, out Character entry) { if (!ServerDB.CreateCharacter(user, pony, out entry)) { return(false); } _chars[entry.ID] = entry; return(true); }
public static CharData CreateCharacterData(PonyData pony, short level) { var data = new CharData() { Bits = 15 * level }; data.Skills[10] = 0; //Ground Pound data.Skills[44] = 0; //Bubble Barrage data.Talents[TalentMarkId.Foal] = new TalentData(level); data.Talents[TalentMarkId.Music] = new TalentData(level); data.Talents[TalentMarkId.Magic] = new TalentData(level); data.Talents[TalentMarkId.Animal] = new TalentData(level); data.Talents[TalentMarkId.Flying] = new TalentData(level); data.Talents[TalentMarkId.Combat] = new TalentData(level); data.Talents[TalentMarkId.Artisan] = new TalentData(level); data.Talents[TalentMarkId.Medical] = new TalentData(level); data.Talents[TalentMarkId.Partying] = new TalentData(level); switch (pony.Race) { case CharacterType.EarthPony: data.Skills[5] = 0; //Seismic Buck data.Skills[16] = 0; //Rough Terrain data.Skills[21] = 0; //Pillow Barrage data.InventorySlots = 38; break; case CharacterType.Unicorn: data.Skills[2] = 0; //Teleport data.Skills[9] = 0; //Rainbow Fields data.Skills[15] = 0; //Magical Arrow data.Skills[31] = 0; //Sphere of Protection data.InventorySlots = 32; break; case CharacterType.Pegasus: data.Skills[11] = 0; //Dual Cyclone data.Skills[14] = 0; //Gale data.InventorySlots = 32; break; } return(data); }
public static PonyData GetPony(this MySqlDataReader reader, int i) { var ret = new PonyData(); ret.Race = reader.GetByte(i); ret.Gender = reader.GetByte(++i); ret.Name = reader.GetString(++i); if (reader.IsDBNull(++i)) { return(ret); } using (var mem = new MemoryStream()) { var data = (byte[])reader.GetValue(i); mem.Write(data, 0, data.Length); mem.Position = 0; using (var zip = new DeflateStream(mem, CompressionMode.Decompress)) return(ProtoBuf.Serializer.Merge(zip, ret)); } }
public unsafe static PonyData ToPonyData(this string ponycode) { var index = 0; var nameIndex = 1; var ret = new PonyData(); var bits = new BitArray(Convert.FromBase64String(ponycode)); ret.Race = (byte)bits.GetBits(ref index, 2); ret.HairColor0 = bits.GetBits(ref index, 24); ret.HairColor1 = bits.GetBits(ref index, 24); ret.BodyColor = bits.GetBits(ref index, 24); ret.EyeColor = bits.GetBits(ref index, 24); ret.HoofColor = bits.GetBits(ref index, 24); ret.Mane = (short)bits.GetBits(ref index, 8); ret.Tail = (short)bits.GetBits(ref index, 8); ret.Eye = (short)bits.GetBits(ref index, 8); ret.Hoof = (short)bits.GetBits(ref index, 5); ret.CutieMark0 = bits.GetBits(ref index, 10); ret.CutieMark1 = bits.GetBits(ref index, 10); ret.CutieMark2 = bits.GetBits(ref index, 10); ret.Gender = (byte)bits.GetBits(ref index, 2); ret.BodySize = MathHelper.Clamp(bits.GetBits(ref index, 32).BitsToFloat(), 0.9f, 1.1f); ret.HornSize = MathHelper.Clamp(bits.GetBits(ref index, 32).BitsToFloat(), 0.8f, 1.25f); ret.Name = new string(new char[nameIndex += bits.GetBits(ref index, 5)]); fixed(char *ptr = ret.Name) { for (char *dest = ptr; nameIndex > 0; nameIndex--, dest++) { *dest = bits.GetBits(ref index, 6).DecodeChar(); } } if ((bits.Length - index) >= 24) { ret.HairColor2 = bits.GetBits(ref index, 24); } return(ret); }
public static bool CreateCharacter(int user, PonyData pony, out Character entry) { entry = null; var locked = false; if (!IsConnected) { return(false); } try { Monitor.Enter(_connection, ref locked); using (MySqlCommand _cmd = _connection.CreateCommand()) { entry = new Character(pony); _cmd.CommandText = $"INSERT INTO {tb_02} (user, level, race, gender, name, vdata, gdata) VALUES (@user, @level, @race, @gender, @name, @vdata, @gdata);"; _cmd.Parameters.AddWithValue("user", user); _cmd.Parameters.AddWithValue("level", entry.Level); _cmd.Parameters.AddWithValue("race", pony.Race); _cmd.Parameters.AddWithValue("gender", pony.Gender); _cmd.Parameters.AddWithValue("name", pony.Name); _cmd.Parameters.AddWithValue("vdata", pony.GetBytes()); _cmd.Parameters.AddWithValue("gdata", entry.Data.GetBytes()); if (_cmd.ExecuteNonQuery() == 1) { entry.ID = (int)_cmd.LastInsertedId; return(true); } } return(false); } catch { return(false); } finally { if (locked) { Monitor.Exit(_connection); } } }
private void RPC_001(NetMessage arg1, NetMessageInfo arg2) { var player = m_server[arg2.Sender.Id]; var pony = new PonyData(); var index = arg1.ReadInt32(); pony.OnDeserialize(arg1); DB_Map map; if (player.UpdateCharacter(index, pony)) { var character = index == -1 ? player.Data.Last() : player.Data[index]; player.User.Char = character.ID; if (character.Map == 0 || !DataMgr.Select(character.Map, out map)) { arg2.Sender.ChangeRoom(StartMaps[pony.Race]); } else { arg2.Sender.ChangeRoom(map.Name); } arg2.Sender.SynchNetData(); } else { arg2.Sender.Error("Error while saving pony, most likely character isn't unique."); } }
public static bool CreateNPC(ushort level, byte flags, ushort dialog, byte index, ushort movement, PonyData pony, out int id) { id = -1; var locked = false; if (!IsConnected) { return(false); } try { Monitor.Enter(_connection, ref locked); using (MySqlCommand _cmd = _connection.CreateCommand()) { _cmd.CommandText = $"INSERT INTO {tb_05} (flags, level, dialog, `index`, movement, name, race, gender, eye, tail, hoof, mane, bodysize, hornsize, eyecolor, " + "hoofcolor, bodycolor, haircolor0, haircolor1, haircolor2, cutiemark0, cutiemark1, cutiemark2) VALUES (@flags, @level, @dialog, @index, @movement, @name, " + "@race, @gender, @eye, @tail, @hoof, @mane, @bodysize, @hornsize, @eyecolor, @hoofcolor, @bodycolor, @haircolor0, @haircolor1, @haircolor2, @cutiemark0, " + "@cutiemark1, @cutiemark2);"; _cmd.Parameters.AddWithValue("level", level); _cmd.Parameters.AddWithValue("flags", flags); _cmd.Parameters.AddWithValue("index", index); _cmd.Parameters.AddWithValue("eye", pony.Eye); _cmd.Parameters.AddWithValue("dialog", dialog); _cmd.Parameters.AddWithValue("mane", pony.Mane); _cmd.Parameters.AddWithValue("tail", pony.Tail); _cmd.Parameters.AddWithValue("hoof", pony.Hoof); _cmd.Parameters.AddWithValue("name", pony.Name); _cmd.Parameters.AddWithValue("race", pony.Race); _cmd.Parameters.AddWithValue("movement", movement); _cmd.Parameters.AddWithValue("gender", pony.Gender); _cmd.Parameters.AddWithValue("bodysize", pony.BodySize); _cmd.Parameters.AddWithValue("hornsize", pony.HornSize); _cmd.Parameters.AddWithValue("cutiemark0", pony.CutieMark0); _cmd.Parameters.AddWithValue("cutiemark1", pony.CutieMark1); _cmd.Parameters.AddWithValue("cutiemark2", pony.CutieMark2); _cmd.Parameters.AddWithValue("eyecolor", pony.EyeColor); _cmd.Parameters.AddWithValue("hoofcolor", pony.HoofColor); _cmd.Parameters.AddWithValue("bodycolor", pony.BodyColor); _cmd.Parameters.AddWithValue("haircolor0", pony.HairColor0); _cmd.Parameters.AddWithValue("haircolor1", pony.HairColor1); _cmd.Parameters.AddWithValue("haircolor2", pony.HairColor2); if (_cmd.ExecuteNonQuery() == 1) { id = (int)_cmd.LastInsertedId; return(true); } } return(false); } catch { return(false); } finally { if (locked) { Monitor.Exit(_connection); } } }
public static async Task <int> CreateNpcAsync(ushort level, byte flags, ushort dialog, byte index, ushort movement, PonyData pony) { try { using (var connection = await GetConnectionAsync()) { using (var command = connection.CreateCommand()) { command.CommandText = $"INSERT INTO {tb_05} (flags, level, dialog, `index`, movement, name, race, gender, eye, tail, hoof, mane, bodysize, hornsize, eyecolor, " + $"hoofcolor, bodycolor, haircolor0, haircolor1, haircolor2, cutiemark0, cutiemark1, cutiemark2) VALUES ({flags}, {level}, {dialog}, {index}, {movement}, " + $"@name, @race, @gender, @eye, @tail, @hoof, @mane, @bodysize, @hornsize, @eyecolor, @hoofcolor, @bodycolor, @haircolor0, @haircolor1, @haircolor2, " + $"@cutiemark0, @cutiemark1, @cutiemark2);"; command.Parameters.AddWithValue("eye", pony.Eye); command.Parameters.AddWithValue("mane", pony.Mane); command.Parameters.AddWithValue("tail", pony.Tail); command.Parameters.AddWithValue("hoof", pony.Hoof); command.Parameters.AddWithValue("name", pony.Name); command.Parameters.AddWithValue("race", pony.Race); command.Parameters.AddWithValue("gender", pony.Gender); command.Parameters.AddWithValue("bodysize", pony.BodySize); command.Parameters.AddWithValue("hornsize", pony.HornSize); command.Parameters.AddWithValue("cutiemark0", pony.CutieMark0); command.Parameters.AddWithValue("cutiemark1", pony.CutieMark1); command.Parameters.AddWithValue("cutiemark2", pony.CutieMark2); command.Parameters.AddWithValue("eyecolor", pony.EyeColor); command.Parameters.AddWithValue("hoofcolor", pony.HoofColor); command.Parameters.AddWithValue("bodycolor", pony.BodyColor); command.Parameters.AddWithValue("haircolor0", pony.HairColor0); command.Parameters.AddWithValue("haircolor1", pony.HairColor1); command.Parameters.AddWithValue("haircolor2", pony.HairColor2); if (await command.ExecuteNonQueryAsyncEx() == 1) { return((int)command.LastInsertedId); } } } return(-1); } catch (Exception exp) { ServerLogger.LogException(exp); return(-1); } }