public void CreateCharacter(ref WS_PlayerData.CharacterObject objCharacter)
    {
        DataTable CreateInfo       = new();
        DataTable CreateInfoBars   = new();
        DataTable CreateInfoSkills = new();
        DataTable LevelStats       = new();
        DataTable ClassLevelStats  = new();

        WorldServiceLocator._WorldServer.WorldDatabase.Query($"SELECT * FROM playercreateinfo WHERE race = {(int)objCharacter.Race} AND class = {(int)objCharacter.Classe};", ref CreateInfo);
        if (CreateInfo.Rows.Count <= 0)
        {
            WorldServiceLocator._WorldServer.Log.WriteLine(LogType.FAILED, "No information found in playercreateinfo table for Race: {0}, Class: {1}", objCharacter.Race, objCharacter.Classe);
        }
        WorldServiceLocator._WorldServer.WorldDatabase.Query($"SELECT * FROM playercreateinfo_action WHERE race = {(int)objCharacter.Race} AND class = {(int)objCharacter.Classe} ORDER BY button;", ref CreateInfoBars);
        if (CreateInfoBars.Rows.Count <= 0)
        {
            WorldServiceLocator._WorldServer.Log.WriteLine(LogType.FAILED, "No information found in playercreateinfo_action table for Race: {0}, Class: {1}", objCharacter.Race, objCharacter.Classe);
        }
        WorldServiceLocator._WorldServer.WorldDatabase.Query($"SELECT * FROM playercreateinfo_skill WHERE race = {(int)objCharacter.Race} AND class = {(int)objCharacter.Classe};", ref CreateInfoSkills);
        if (CreateInfoSkills.Rows.Count <= 0)
        {
            WorldServiceLocator._WorldServer.Log.WriteLine(LogType.FAILED, "No information found in playercreateinfo_skill table for Race: {0}, Class: {1}", objCharacter.Race, objCharacter.Classe);
        }
        WorldServiceLocator._WorldServer.WorldDatabase.Query($"SELECT * FROM player_levelstats WHERE race = {(int)objCharacter.Race} AND class = {(int)objCharacter.Classe} AND level = {objCharacter.Level};", ref LevelStats);
        if (LevelStats.Rows.Count <= 0)
        {
            WorldServiceLocator._WorldServer.Log.WriteLine(LogType.FAILED, "No information found in player_levelstats table for Race: {0}, Class: {1}, Level: {2}", objCharacter.Race, objCharacter.Classe, objCharacter.Level);
        }
        WorldServiceLocator._WorldServer.WorldDatabase.Query($"SELECT * FROM player_classlevelstats WHERE class = {(int)objCharacter.Classe} AND level = {objCharacter.Level};", ref ClassLevelStats);
        if (ClassLevelStats.Rows.Count <= 0)
        {
            WorldServiceLocator._WorldServer.Log.WriteLine(LogType.FAILED, "No information found in player_classlevelstats table for Class: {0}, Level: {1}", objCharacter.Classe, objCharacter.Level);
        }
        objCharacter.Copper         = 0u;
        objCharacter.XP             = 0;
        objCharacter.Size           = 1f;
        objCharacter.Life.Base      = 0;
        objCharacter.Life.Current   = 0;
        objCharacter.Mana.Base      = 0;
        objCharacter.Mana.Current   = 0;
        objCharacter.Rage.Current   = 0;
        objCharacter.Rage.Base      = 0;
        objCharacter.Energy.Current = 0;
        objCharacter.Energy.Base    = 0;
        objCharacter.ManaType       = WorldServiceLocator._WS_Player_Initializator.GetClassManaType(objCharacter.Classe);
        objCharacter.Model          = WorldServiceLocator._Functions.GetRaceModel(objCharacter.Race, (int)objCharacter.Gender);
        objCharacter.Faction        = WorldServiceLocator._WS_DBCDatabase.CharRaces[(int)objCharacter.Race].FactionID;
        objCharacter.MapID          = Conversions.ToUInteger(CreateInfo.Rows[0]["map"]);
        objCharacter.ZoneID         = Conversions.ToInteger(CreateInfo.Rows[0]["zone"]);
        objCharacter.positionX      = Conversions.ToSingle(CreateInfo.Rows[0]["position_x"]);
        objCharacter.positionY      = Conversions.ToSingle(CreateInfo.Rows[0]["position_y"]);
        objCharacter.positionZ      = Conversions.ToSingle(CreateInfo.Rows[0]["position_z"]);
        objCharacter.orientation    = Conversions.ToSingle(CreateInfo.Rows[0]["orientation"]);
        checked
        {
            objCharacter.bindpoint_map_id    = (int)objCharacter.MapID;
            objCharacter.bindpoint_zone_id   = objCharacter.ZoneID;
            objCharacter.bindpoint_positionX = objCharacter.positionX;
            objCharacter.bindpoint_positionY = objCharacter.positionY;
            objCharacter.bindpoint_positionZ = objCharacter.positionZ;
            objCharacter.Strength.Base       = Conversions.ToInteger(LevelStats.Rows[0]["str"]);
            objCharacter.Agility.Base        = Conversions.ToInteger(LevelStats.Rows[0]["agi"]);
            objCharacter.Stamina.Base        = Conversions.ToInteger(LevelStats.Rows[0]["sta"]);
            objCharacter.Intellect.Base      = Conversions.ToInteger(LevelStats.Rows[0]["inte"]);
            objCharacter.Spirit.Base         = Conversions.ToInteger(LevelStats.Rows[0]["spi"]);
            objCharacter.Life.Base           = Conversions.ToInteger(ClassLevelStats.Rows[0]["basehp"]);
            objCharacter.Life.Current        = objCharacter.Life.Maximum;
            switch (objCharacter.ManaType)
            {
            case ManaTypes.TYPE_MANA:
                objCharacter.Mana.Base    = Conversions.ToInteger(ClassLevelStats.Rows[0]["basemana"]);
                objCharacter.Mana.Current = objCharacter.Mana.Maximum;
                break;

            case ManaTypes.TYPE_RAGE:
                objCharacter.Rage.Base    = Conversions.ToInteger(ClassLevelStats.Rows[0]["basemana"]);
                objCharacter.Rage.Current = 0;
                break;

            case ManaTypes.TYPE_ENERGY:
                objCharacter.Energy.Base    = Conversions.ToInteger(ClassLevelStats.Rows[0]["basemana"]);
                objCharacter.Energy.Current = 0;
                break;
            }
            objCharacter.Damage.Minimum = 5f;
            objCharacter.Damage.Maximum = 10f;
            IEnumerator enumerator = default;
            try
            {
                enumerator = CreateInfoSkills.Rows.GetEnumerator();
                while (enumerator.MoveNext())
                {
                    DataRow row = (DataRow)enumerator.Current;
                    objCharacter.LearnSkill(row.As <int>("Skill"), row.As <short>("SkillMin"), row.As <short>("SkillMax"));
                }
            }
            finally
            {
                if (enumerator is IDisposable)
                {
                    (enumerator as IDisposable).Dispose();
                }
            }
            var i = 0;
            do
            {
                if ((WorldServiceLocator._WS_DBCDatabase.CharRaces[(int)objCharacter.Race].TaxiMask & (1 << i)) != 0)
                {
                    objCharacter.TaxiZones.Set(i + 1, value: true);
                }
                i++;
            }while (i <= 31);
            IEnumerator enumerator2 = default;
            try
            {
                enumerator2 = CreateInfoBars.Rows.GetEnumerator();
                while (enumerator2.MoveNext())
                {
                    DataRow row = (DataRow)enumerator2.Current;
                    if (Operators.ConditionalCompareObjectGreater(row["action"], 0, TextCompare: false))
                    {
                        var ButtonPos = row.As <int>("button");
                        objCharacter.ActionButtons[(byte)ButtonPos] = new WS_PlayerHelper.TActionButton(row.As <int>("action"), row.As <byte>("type"), 0);
                    }
                }
            }
            finally
            {
                if (enumerator2 is IDisposable)
                {
                    (enumerator2 as IDisposable).Dispose();
                }
            }
        }
    }