示例#1
0
 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));
        }
示例#3
0
 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;
     }
 }
示例#4
0
        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!");
            }
        }
示例#6
0
        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);
        }
示例#7
0
 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;
         }
     }
 }
示例#8
0
 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);
 }
示例#9
0
        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);
        }
示例#12
0
        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);
                      }
            }
        }
示例#13
0
        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.");
            }
        }
示例#14
0
        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);
                      }
            }
        }
示例#15
0
 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);
     }
 }