Esempio n. 1
0
        public BoxedData ExecuteQuery(string query)
        {
            BoxedData data    = new BoxedData();
            bool      success = false;
            string    msg     = "";

            try
            {
                lock (_connectionLock)
                {
                    using (MySqlCommand command = new MySqlCommand(query, _connection))
                    {
                        command.ExecuteNonQuery();
                        success = true;
                    }
                }
            }
            catch (Exception exception)
            {
                msg = $"Cannot execute query: {exception.Message}";
            }

            data.Data = success;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 2
0
        public BoxedData CloseConnection()
        {
            BoxedData data    = new BoxedData();
            bool      success = false;
            string    msg     = "";

            try
            {
                lock (_connectionLock)
                {
                    if (_connection != null && _connection.State == System.Data.ConnectionState.Open)
                    {
                        _connection.Close();
                    }

                    success = true;
                }
            }
            catch (Exception exception)
            {
                msg = $"An error occured during mySQL connection closing: {exception.Message}";
            }

            data.Data = success;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 3
0
        public BoxedData StartConnection()
        {
            BoxedData data    = new BoxedData();
            bool      success = false;
            string    msg     = "";

            try
            {
                lock (_connectionLock)
                {
                    if (_connection != null && _connection.State == System.Data.ConnectionState.Open)
                    {
                        throw new Exception("connection is open. It should be closed before starting new connection!");
                    }

                    _connection = new MySqlConnection(_connectionSettings.ConnectionString);
                    _connection.Open();
                    success = true;
                }
            }
            catch (Exception exception)
            {
                msg = $"An error occured during mySQL connection starting: {exception.Message}";
            }

            data.Data = success;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 4
0
        public BoxedData GetLocalGeoDataOfExitElements(int wmId, int parentObjectId)
        {
            BoxedData             data       = new BoxedData();
            List <GeoDataElement> resultList = null;
            string msg = "";

            try
            {
                WorldPlaceData worldPlace = GetWorldPlaceByWmId(wmId);
                if (worldPlace == null)
                {
                    throw new Exception("world place not found!");
                }

                PlaceInstance placeInstance = worldPlace.GetPredefinedInstanceByParentObjectId(parentObjectId);
                if (placeInstance == null)
                {
                    throw new Exception("place instance not found!");
                }

                resultList = placeInstance.GetGeoDataOfExitElements();
            }
            catch (Exception exception)
            {
                msg = $"An error occured while getting geo data (exit elements), wm_id [{wmId}] parent obj, ID [{parentObjectId}]: {exception.Message}";
            }

            data.Data = (resultList ?? new List <GeoDataElement>());
            data.Msg  = msg;
            return(data);
        }
Esempio n. 5
0
        public BoxedData CheckConnection()
        {
            BoxedData data     = new BoxedData();
            bool      connOpen = false;
            string    msg      = "";

            try
            {
                lock (_connectionLock)
                {
                    if (_connection == null)
                    {
                        throw new Exception("connector is NULL!");
                    }

                    if (_connection.State == System.Data.ConnectionState.Open)
                    {
                        connOpen = true;
                    }
                }
            }
            catch (Exception exception)
            {
                msg = $"An error occured during mySQL connection checking: {exception.Message}";
            }

            data.Data = connOpen;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 6
0
        public async void Test()
        {
            try
            {
                _logger.UpdateLog("getting geo data...");
                BoxedData bxData = await _gameWorldData.GetLocalGeoDataTaskStart(1, -1, new Point3 <int>(2, 2, 3), new Point3 <int>(10, 10, 10));

                List <GeoDataElement> geoDataList = (List <GeoDataElement>)bxData.Data;
                if (!String.IsNullOrEmpty(bxData.Msg))
                {
                    _logger.UpdateLog(bxData.Msg);
                }

                foreach (GeoDataElement geoElement in geoDataList)
                {
                    _logger.UpdateLog
                    (
                        $"loc [{geoElement.Location.X}, {geoElement.Location.Y}, {geoElement.Location.Z}] " +
                        $"collision [{geoElement.ColliderSize.X}, {geoElement.ColliderSize.Y}, {geoElement.ColliderSize.Z}] " +
                        $"type [{geoElement.ElementType.ToString()}]"
                    );
                }

                _accountData.ShowAccountsInLog();
            }
            catch (Exception exception)
            {
                _logger.UpdateLog($"(TEST) Error: {exception.Message} | {exception.StackTrace}");
            }
        }
Esempio n. 7
0
        private BoxedData InitializeCharacterData(List <DbCharactersData> dbCharDataList)
        {
            BoxedData data    = new BoxedData();
            bool      success = false;
            string    msg     = "";

            try
            {
                ClearData();
                int charCounter = 0;

                lock (_charListLock)
                {
                    foreach (DbCharactersData dbCharData in dbCharDataList)
                    {
                        CharacterData charData = new CharacterData(dbCharData);
                        _characterList.Add(charData);
                        charCounter++;
                    }
                }

                msg     = $"Character data container - added [{charCounter}] chars.";
                success = true;
            }
            catch (Exception exception)
            {
                msg = $"Character data init. failed: {exception.Message} | {exception.StackTrace}";
            }

            data.Data = success;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 8
0
        /// <summary>
        /// Gets data from table 'world_map_settings'
        /// </summary>
        public BoxedData GetWorldMapSettingsData(string sqlFilter = "")
        {
            BoxedData data = new BoxedData();
            List <DbWorldMapSettingsData> resultList = new List <DbWorldMapSettingsData>();
            string msg = "";

            try
            {
                int    id          = -1;
                int    type        = -1;
                string description = "";
                string value       = "";

                string query = @"
                    SELECT
                        `wms_id`,
                        `wms_type`,
                        `wms_description`,
                        `wms_value`
                    FROM
                        `world_map_settings`
                ";

                if (!String.IsNullOrWhiteSpace(sqlFilter))
                {
                    query += $" {(!sqlFilter.ToUpper().Contains("WHERE") ? "WHERE" : "")} {sqlFilter}";
                }

                lock (_connectionLock)
                {
                    using (MySqlCommand command = new MySqlCommand(query, _connection))
                    {
                        using (MySqlDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                id          = reader.GetInt32("wms_id");
                                type        = reader.GetInt32("wms_type");
                                description = reader["wms_description"].ToString();
                                value       = reader["wms_value"].ToString();

                                DbWorldMapSettingsData result = new DbWorldMapSettingsData(id, type, description, value);
                                resultList.Add(result);
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                msg = $"Cannot get data from 'world_map_settings' table, SQL filter [{sqlFilter}]: {exception.Message}";
            }

            data.Data = resultList;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 9
0
        /// <summary>
        /// Adds new record in table 'accounts'
        /// </summary>
        public BoxedData AddAccountsData(DbAccountsData accountData)
        {
            BoxedData data  = new BoxedData();
            int       accId = -1;
            string    msg   = "";

            try
            {
                string query = @"
                    INSERT INTO `accounts`
                    (
                        `acc_login`,
                        `acc_pass`,
                        `acc_access_level`
                    )
                    VALUES
                    (
                        @login,
                        @pass,
                        @accessLevel
                    );

                    SELECT LAST_INSERT_ID() AS `acc_id`;
                ";

                lock (_connectionLock)
                {
                    using (MySqlCommand command = new MySqlCommand(query, _connection))
                    {
                        command.Parameters.AddWithValue("@login", accountData.Login);
                        command.Parameters.AddWithValue("@pass", accountData.PassEncrypted);
                        command.Parameters.AddWithValue("@accessLevel", accountData.AccessLevel);

                        using (MySqlDataReader reader = command.ExecuteReader())
                        {
                            if (reader.Read())
                            {
                                if (!Int32.TryParse(reader["acc_id"].ToString(), out accId))
                                {
                                    msg = $"Cannot convert acc_id!";
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                msg = $"Cannot insert new record in table 'accounts': {exception.Message}";
            }

            data.Data = accId;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 10
0
        public BoxedData GetLocalGeoData(int wmId, int parentObjectId, Point3 <int> from, Point3 <int> to)
        {
            BoxedData             data       = new BoxedData();
            List <GeoDataElement> resultList = null;
            string msg = "";

            try
            {
                #region Bounds

                int pointFromX = from.X - DbTerrainObjectDefinitions.MaxCollisionXOfAllObjects;
                int pointFromY = from.Y - DbTerrainObjectDefinitions.MaxCollisionYOfAllObjects;
                int pointFromZ = from.Z - DbTerrainObjectDefinitions.MaxCollisionZOfAllObjects;
                //Console.WriteLine($"mod. point from [{pointFromX}, {pointFromY}, {pointFromZ}]");

                Point3 <int> pointFromTemp = new Point3 <int>
                                             (
                    (pointFromX <= to.X ? pointFromX - 1 : to.X - 1), //NOTE: -1 to prevent rounding error
                    (pointFromY <= to.Y ? pointFromY - 1 : to.Y - 1), //NOTE: -1 to prevent rounding error
                    (pointFromZ <= to.Z ? pointFromZ - 1 : to.Z - 1)  //NOTE: -1 to prevent rounding error
                                             );

                Point3 <int> pointToTemp = new Point3 <int>
                                           (
                    (from.X >= to.X ? from.X + 1 : to.X + 1), //NOTE: +1 to prevent rounding error
                    (from.Y >= to.Y ? from.Y + 1 : to.Y + 1), //NOTE: +1 to prevent rounding error
                    (from.Z >= to.Z ? from.Z + 1 : to.Z + 1)  //NOTE: +1 to prevent rounding error
                                           );

                #endregion

                WorldPlaceData worldPlace = GetWorldPlaceByWmId(wmId);
                if (worldPlace == null)
                {
                    throw new Exception("world place not found!");
                }

                PlaceInstance placeInstance = worldPlace.GetPredefinedInstanceByParentObjectId(parentObjectId);
                if (placeInstance == null)
                {
                    throw new Exception("place instance not found!");
                }

                resultList = placeInstance.GetGeoData(pointFromTemp, pointToTemp);
            }
            catch (Exception exception)
            {
                msg = $"An error occured while getting geo data, wm_id [{wmId}] parent obj, ID [{parentObjectId}]: {exception.Message}";
            }

            data.Data = (resultList ?? new List <GeoDataElement>());
            data.Msg  = msg;
            return(data);
        }
Esempio n. 11
0
        public async void AddPredefinedInstanceAsync(List <DbTerrainObjectsData> terrainDataList, int parentTerrainObjectId)
        {
            WorldPlaceData.InstanceCreationInProgress = true;

            try
            {
                DeletePredefinedInstanceIfExists(parentTerrainObjectId);

                PlaceInstance instance = new PlaceInstance
                                         (
                    _terrainObjectDefinitionList,
                    _parent.LocalBoundX,
                    _parent.LocalBoundY,
                    _parent.LocalBoundZ,
                    this.WorldPosX,
                    this.WorldPosY,
                    parentTerrainObjectId
                                         );

                bool terrainFillingSuccess = false;
                using (BoxedData terrainFillingPacket = await instance.FillTerrainDetailsTaskStart(terrainDataList))
                {
                    terrainFillingSuccess = (bool)terrainFillingPacket.Data;
                    if (!String.IsNullOrEmpty(terrainFillingPacket.Msg))
                    {
                        _logger.UpdateLog(terrainFillingPacket.Msg);
                    }
                }

                if (terrainFillingSuccess)
                {
                    lock (_instanceLock)
                    {
                        _predefinedPlacesList.Add(instance);
                    }

                    _logger.UpdateLog($"Added predefined instance, ID [{instance.PlaceInstanceId}] world pos. [{this.WorldPosX}, {this.WorldPosY}] parent object ID [{parentTerrainObjectId}]");
                }
                else
                {
                    _logger.UpdateLog("Predefined instance creation failed!");
                }
            }
            catch (Exception exception)
            {
                _logger.UpdateLog($"An error occured during predefined instance creation: {exception.Message}");
            }

            WorldPlaceData.InstanceCreationInProgress = false;
        }
Esempio n. 12
0
        public async void LoadAccountsAsync(MySqlDbManager dbManager)
        {
            this.IsLoaded     = false;
            this.LoadingError = false;

            _accountList.Clear();
            _logger.UpdateLog("Loading accounts data...");

            try
            {
                if (dbManager.GetConnectionState() != System.Data.ConnectionState.Open)
                {
                    throw new Exception("connection not open!");
                }

                using (BoxedData accBoxedData = await dbManager.GetAccountsDataTaskStart())
                {
                    _accountList = (List <DbAccountsData>)accBoxedData.Data;
                    if (!String.IsNullOrEmpty(accBoxedData.Msg))
                    {
                        _logger.UpdateLog(accBoxedData.Msg);
                    }
                }

                this.IsLoaded = true;
            }
            catch (Exception exception)
            {
                this.LoadingError = true;
                _logger.UpdateLog($"An error occured during account data loading: {exception.Message}");
            }

            if (this.IsLoaded)
            {
                _logger.UpdateLog($"Loaded [{_accountList.Count}] accounts");
            }

            _logger.UpdateLog($"Loading account data ended with {(this.IsLoaded ? "success" : "failure")}.");
        }
Esempio n. 13
0
        /// <summary>
        /// Gets all parent IDs from terrain objects in specific location (by world map loc. ID)
        /// </summary>
        public BoxedData GetParentObjectIds(int wmId)
        {
            BoxedData  data          = new BoxedData();
            List <int> parentIdsList = new List <int>();
            string     msg           = "";

            try
            {
                string query = @"
                    SELECT DISTINCT `to_parent_id`
                    FROM `terrain_objects`
                    WHERE `to_wm_id` = @wmId
                ";

                lock (_connectionLock)
                {
                    using (MySqlCommand command = new MySqlCommand(query, _connection))
                    {
                        command.Parameters.AddWithValue("@wmId", wmId);
                        using (MySqlDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                parentIdsList.Add(reader.GetInt32("to_parent_id"));
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                msg = $"Cannot get parent IDs from 'terrain_objects' table, wm_id [{wmId}]: {exception.Message}";
            }

            data.Data = parentIdsList;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 14
0
        private async void CheckMySqlConnectionAsync()
        {
            _uiHandler.ShowTab("overviewTabPage");
            _uiHandler.UpdateLog("Checking mySQL connection...");
            MySqlConnectionSettings myConnSettings = _uiHandler.GetMySqlSettings();

            using (MySqlDbManager dbManager = new MySqlDbManager(myConnSettings))
            {
                _uiHandler.UpdateLog("Estabilishing mySQL connection...");
                BoxedData startConnData = await dbManager.StartConnectionTaskStart();

                bool startConnSuccess = (bool)startConnData.Data;
                _uiHandler.UpdateLog(startConnSuccess ? "Connection started!" : "Connection starting failed!");
                if (!String.IsNullOrEmpty(startConnData.Msg))
                {
                    _uiHandler.UpdateLog(startConnData.Msg);
                }

                BoxedData checkConnData = await dbManager.CheckConnectionTaskStart();

                bool checkConnSuccess = (bool)checkConnData.Data;
                _uiHandler.UpdateLog(checkConnSuccess ? "Connection successfully estabilished!" : "Connection not estabilished!");
                if (!String.IsNullOrEmpty(checkConnData.Msg))
                {
                    _uiHandler.UpdateLog(checkConnData.Msg);
                }

                BoxedData closeConnData = await dbManager.CloseConnectionTaskStart();

                bool closeConnSuccess = (bool)closeConnData.Data;
                _uiHandler.UpdateLog(closeConnSuccess ? "Connection closed!" : "Cannot close current connection!");
                if (!String.IsNullOrEmpty(closeConnData.Msg))
                {
                    _uiHandler.UpdateLog(closeConnData.Msg);
                }
            }
        }
Esempio n. 15
0
        public static BoxedData ValidateMovement(List <GeoDataElement> geoDataList, CharacterMovementDetails movementDetails)
        {
            BoxedData data = new BoxedData();
            GeoDataValidationDetails details = new GeoDataValidationDetails();
            string msg = "";

            try
            {
                #region Sub arrays
                //SUB ARRAYS
                GeoDataElement[] terrainSubArray  = new GeoDataElement[geoDataList.Count];
                GeoDataElement[] obstacleSubArray = new GeoDataElement[geoDataList.Count];
                int terrainFilledSize             = 0;
                int obstacleFilledSize            = 0;

                for (int i = 0; i < geoDataList.Count; i++)
                {
                    switch (geoDataList[i].ElementType)
                    {
                    case GeoDataElement.Type.Terrain:
                        terrainSubArray[terrainFilledSize] = geoDataList[i];
                        terrainFilledSize++;
                        break;

                    case GeoDataElement.Type.Obstacle:
                        obstacleSubArray[obstacleFilledSize] = geoDataList[i];
                        obstacleFilledSize++;
                        break;

                    case GeoDataElement.Type.Platform:
                        terrainSubArray[terrainFilledSize]   = geoDataList[i];
                        obstacleSubArray[obstacleFilledSize] = geoDataList[i];
                        terrainFilledSize++;
                        obstacleFilledSize++;
                        break;
                    }
                }

                #endregion

                //PARAMETERS

                bool            valid = true;
                Point3 <double> lastValidMovementPoint = movementDetails.OldLocationLocal.Copy();
                double          tStep = Measure.GetTParamStep(movementDetails.OldLocationLocal, movementDetails.NewLocationLocal)
                                        / 2;

                double tParam        = 0;
                double tParamClamped = 0;
                bool   tParamReached = false;

                //VALIDATION

                if (tStep > 0 && tStep < 1)
                {
                    double currentXDbl, currentYDbl, currentZDbl;
                    int    currentX, currentY, currentZ;
                    int    collisionMinX, collisionMaxX, collisionMinY, collisionMaxY, collisionMinZ, collisionMaxZ;

                    GeoDataElement geoDataElement;
                    bool           obstacleDetected = false;
                    bool           hasGroundUnderFeet;

                    while (!tParamReached)
                    {
                        tParamClamped = Measure.Clamp(0.0000, 1.0000, tParam);
                        currentXDbl   = Measure.Lerp(movementDetails.OldLocationLocal.X, movementDetails.NewLocationLocal.X, tParamClamped);
                        currentYDbl   = Measure.Lerp(movementDetails.OldLocationLocal.Y, movementDetails.NewLocationLocal.Y, tParamClamped);
                        currentZDbl   = Measure.Lerp(movementDetails.OldLocationLocal.Z, movementDetails.NewLocationLocal.Z, tParamClamped)
                                        + _marginZ;

                        currentX = Convert.ToInt32(Math.Floor(currentXDbl));
                        currentY = Convert.ToInt32(Math.Floor(currentYDbl));
                        currentZ = Convert.ToInt32(Math.Floor(currentZDbl));

                        #region Obstacle check
                        //OBSTACLE CHECK
                        for (int i = 0; i < obstacleFilledSize; i++)
                        {
                            geoDataElement = obstacleSubArray[i];
                            GetColliderPosition(geoDataElement, out collisionMinX, out collisionMaxX, out collisionMinY, out collisionMaxY, out collisionMinZ, out collisionMaxZ);

                            if
                            (
                                currentX >= collisionMinX && currentX <= collisionMaxX &&
                                currentY >= collisionMinY && currentY <= collisionMaxY &&
                                currentZ >= collisionMinZ && currentZ <= collisionMaxZ
                            )
                            {
                                obstacleDetected = true;
                                break;
                            }
                        }

                        #endregion

                        #region Ground check
                        //GROUND CHECK
                        hasGroundUnderFeet = false;

                        if (!obstacleDetected) //NOTE: ground check is not necessary if player collides with obstacle (performance)
                        {
                            for (int i = 0; i < terrainFilledSize; i++)
                            {
                                geoDataElement = terrainSubArray[i];
                                GetColliderPosition(geoDataElement, out collisionMinX, out collisionMaxX, out collisionMinY, out collisionMaxY, out collisionMinZ, out collisionMaxZ);

                                if
                                (
                                    currentX >= collisionMinX && currentX <= collisionMaxX &&
                                    currentY >= collisionMinY && currentY <= collisionMaxY &&
                                    currentZ >= collisionMinZ - 1 && currentZ <= collisionMaxZ + 2
                                )
                                {
                                    hasGroundUnderFeet = true;
                                    break;
                                }
                            }
                        }

                        #endregion

                        if (obstacleDetected || !hasGroundUnderFeet)
                        {
                            valid = false;
                            break;
                        }
                        else
                        {
                            lastValidMovementPoint.X = currentXDbl;
                            lastValidMovementPoint.Y = currentYDbl;
                            lastValidMovementPoint.Z = currentZDbl - _marginZ;
                        }

                        //Console.WriteLine($"tClamped [{tParamClamped}] pos [{currentX}; {currentY}; {currentZ}] obstacle [{obstacleDetected}]");

                        if (tParam >= 1)
                        {
                            tParamReached = true;
                        }

                        tParam += tStep;
                    }
                }


                details.Valid = valid;
                details.LastValidMovementPoint = lastValidMovementPoint;
                details.LastTParamValue        = tParamClamped;
            }
            catch (Exception exception)
            {
                msg = $"Error occured while geo data movement validation for character's ID [{movementDetails.CharId}]: {exception.Message}";
            }

            data.Data = details;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 16
0
        /// <summary>
        /// Starts the game and its management/handlers etc.
        /// </summary>
        public async void StartAsync(MySqlConnectionSettings mySqlConnSettings)
        {
            if (_loadingInProgress)
            {
                _logger.UpdateLog("Game loading in progress!");
                return;
            }

            _loadingInProgress = true;

            try
            {
                if (this.State == GameState.Active)
                {
                    _logger.UpdateLog("The game is already active!");
                    return;
                }

                _mySqlConnSettings = mySqlConnSettings;
                int counter;

                try
                {
                    //GAME DATA
                    using (MySqlDbManager gwdDbManager = new MySqlDbManager(_mySqlConnSettings))
                    {
                        #region Connection starting
                        //CONNECTION STARTING
                        _logger.UpdateLog("Starting connection for data loading...");
                        bool connectionSuccess = false;
                        using (BoxedData connStartData = await gwdDbManager.StartConnectionTaskStart())
                        {
                            if (!String.IsNullOrEmpty(connStartData.Msg))
                            {
                                _logger.UpdateLog(connStartData.Msg);
                            }
                            connectionSuccess = (bool)connStartData.Data;
                        }

                        if (!connectionSuccess)
                        {
                            throw new Exception("connection not estabilished!");
                        }

                        #endregion

                        #region Account data
                        //ACCOUNT DATA
                        _accountData = new AccountData(_logger);
                        _accountData.LoadAccountsAsync(gwdDbManager);

                        while (!_accountData.IsLoaded)
                        {
                            await Task.Factory.StartNew(() => Thread.Sleep(1000));

                            if (_accountData.LoadingError)
                            {
                                throw new Exception("account data loading failure!");
                            }
                        }
                        //_accountData.ShowAccountsInLog(); //NOTE: only for testing (shows secret account details)!

                        #endregion

                        #region Game world data
                        //GAME DATA LOADING
                        _gameWorldData = new GameWorldData(_logger);
                        _gameWorldData.LoadWorldDataAsync(gwdDbManager);
                        counter = 0;
                        while (!_gameWorldData.IsLoaded)
                        {
                            await Task.Factory.StartNew(() => Thread.Sleep(1000));

                            counter++;

                            if (_gameWorldData.LoadingError)
                            {
                                throw new Exception("game world data loading failure!");
                            }
                        }

                        _logger.UpdateLog($"Game data loading ended in {counter} seconds.");

                        #endregion
                    }

                    //PLAYER HANDLER
                    _playerHandler = new PlayerHandler(_logger);

                    //GAME STATE HANDLER
                    _gameStateHandler = new GameStateHandler(_logger, _gameWorldData, _gameWorldData, _playerHandler);

                    //CHAT HANDLER
                    _chatHandler = new ChatHandler(_logger, _gameWorldData, _playerHandler);

                    //COMMAND HANDLER
                    _commandHandler = new CommandHandler(_logger);
                    _commandHandler.RegisterCommandHandlingStrategy(new CmdPingStrategy());
                    _commandHandler.RegisterCommandHandlingStrategy(new MoveCharRequestStrategy(_logger, _gameStateHandler, _gameWorldData, _playerHandler));
                    _commandHandler.RegisterCommandHandlingStrategy(new CmdChatStrategy(_logger, _chatHandler));
                    _commandHandler.RegisterCommandHandlingStrategy(new SwitchPlaceRequestStrategy(_logger, _gameStateHandler, _gameWorldData, _gameWorldData, _playerHandler));
                    _commandHandler.RegisterCommandHandlingStrategy(new CmdGetLocationCharsStrategy(_logger, _gameWorldData));
                    _commandHandler.RegisterCommandHandlingStrategy(new CmdGetWorldDetailsStrategy(_logger, _gameWorldData));
                    _commandHandler.RegisterCommandHandlingStrategy(new CmdLoginStrategy(_logger, _accountData, _playerHandler));
                    _commandHandler.RegisterCommandHandlingStrategy(new CmdLogoutStrategy(_playerHandler));
                    _commandHandler.RegisterCommandHandlingStrategy(new CmdGetAccountCharsStrategy(_logger, _accountData, _gameWorldData));
                    _commandHandler.RegisterCommandHandlingStrategy(new CmdChooseCharacterStrategy(_logger, _accountData, _gameWorldData, _playerHandler));

                    //CONNECTION HANDLER
                    _tcpConnectionHandler = TcpConnectionHandler.GetInstance(_tcpLogger, _commandHandler, _playerHandler);
                    _tcpConnectionHandler.StartConnection(_uiHandler.GetTcpConnectionSettings());

                    //REGULAR OPERATION HANDLER
                    _regularOperationHandler = new RegularOperationHandler(_logger);

                    //ETC
                    this.State = GameState.Active;
                }
                catch (Exception exception)
                {
                    this.State = GameState.Error;
                    _logger.UpdateLog($"An error occured during game starting: {exception.Message}");
                }
            }
            finally
            {
                _logger.UpdateLog($"*** ENDED WITH GAME STATE [{this.State.ToString()}]");
                _loadingInProgress = false;
            }
        }
        private async void ExecuteAsync(PlayerDetails playerDetails)
        {
            try
            {
                int charId = playerDetails.CharId;
                if (charId < 0)
                {
                    throw new Exception("char. ID not set!");
                }

                CharacterData charData = await _charInfo.GetCharacterByIdTaskStart(charId);

                if (charData.IsOnWorldMap)
                {
                    _charActionManager.SwitchCharacterMovementType(charId);
                }
                else
                {
                    int wmId           = charData.WmId;
                    int parentObjectId = charData.ParentObjectId;

                    Point3 <int> pointFrom = new Point3 <int>
                                             (
                        Convert.ToInt32(charData.CurrentLoc.X),
                        Convert.ToInt32(charData.CurrentLoc.Y),
                        Convert.ToInt32(charData.CurrentLoc.Z) - 1
                                             );

                    Point3 <int> pointTo = new Point3 <int>
                                           (
                        Convert.ToInt32(charData.CurrentLoc.X),
                        Convert.ToInt32(charData.CurrentLoc.Y),
                        Convert.ToInt32(charData.CurrentLoc.Z) + 1
                                           );

                    using (BoxedData boxedGeoData = await _geoDataInfo.GetLocalGeoDataTaskStart(wmId, parentObjectId, pointFrom, pointTo))
                    {
                        List <GeoDataElement> geoDataElementList = (List <GeoDataElement>)boxedGeoData.Data;
                        if (!String.IsNullOrEmpty(boxedGeoData.Msg))
                        {
                            _logger.UpdateLog(boxedGeoData.Msg);
                        }

                        bool exitFound = false;
                        int  collisionMinX, collisionMaxX, collisionMinY, collisionMaxY, collisionMinZ, collisionMaxZ;

                        foreach (GeoDataElement geoElement in geoDataElementList)
                        {
                            if (!geoElement.IsExit)
                            {
                                continue;
                            }

                            GeoDataValidator.GetColliderPosition(geoElement, out collisionMinX, out collisionMaxX, out collisionMinY, out collisionMaxY, out collisionMinZ, out collisionMaxZ);

                            //_logger.UpdateLog($"exit col. x [{collisionMinX}-{collisionMaxX}] y [{collisionMinY}-{collisionMaxY}] z [{collisionMinZ}-{collisionMaxZ}]");
                            //_logger.UpdateLog($"current [{charData.CurrentLoc.X}; {charData.CurrentLoc.Y}; {charData.CurrentLoc.Z}]");

                            if
                            (
                                charData.CurrentLoc.X >= collisionMinX && charData.CurrentLoc.X <= collisionMaxX + 1 &&
                                charData.CurrentLoc.Y >= collisionMinY && charData.CurrentLoc.Y <= collisionMaxY + 1 &&
                                charData.CurrentLoc.Z >= collisionMinZ && charData.CurrentLoc.Z <= collisionMaxZ + 2
                            )
                            {
                                exitFound = true;
                                break;
                            }
                        }

                        if (exitFound)
                        {
                            _charActionManager.SwitchCharacterMovementType(charId);
                        }
                        else
                        {
                            CommandHandler.Send(new InfoCmdBuilder("You're not at exit point!"), playerDetails);
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                _logger.UpdateLog($"Switch place command execution error: {exception.Message}");
            }
        }
Esempio n. 18
0
        public async void CreateNewAccountAsync(DbAccountsData dbAccData, MySqlConnectionSettings connSettings)
        {
            try
            {
                if (String.IsNullOrWhiteSpace(dbAccData.Login))
                {
                    _logger.UpdateLog("Login cannot be empty!");
                    return;
                }

                bool success = false;

                using (MySqlDbManager dbManager = new MySqlDbManager(connSettings))
                {
                    BoxedData connStartData = await dbManager.StartConnectionTaskStart();

                    bool connStartSuccess = (bool)connStartData.Data;
                    if (!String.IsNullOrEmpty(connStartData.Msg))
                    {
                        _logger.UpdateLog(connStartData.Msg);
                    }

                    if (connStartSuccess)
                    {
                        BoxedData accCreationData = await dbManager.AddAccountsDataTaskStart(dbAccData);

                        int accId = (int)accCreationData.Data;

                        if (!String.IsNullOrEmpty(accCreationData.Msg))
                        {
                            _logger.UpdateLog(accCreationData.Msg);
                        }

                        if (accId > -1)
                        {
                            _logger.UpdateLog($"Created new account, acc_id [{accId}]!");

                            if (_accountData != null)
                            {
                                _accountData.AddAccountData
                                (
                                    new DbAccountsData
                                    (
                                        accId,
                                        dbAccData.Login,
                                        dbAccData.PassEncrypted,
                                        DbAccountsData.PasswordType.Encrypted,
                                        dbAccData.AccessLevel
                                    )
                                );
                            }

                            success = true;
                        }
                    }
                    else
                    {
                        _logger.UpdateLog("Cannot connect to database!");
                    }
                }

                if (success)
                {
                    _logger.UpdateLog("Account created successfully!");
                }
            }
            catch (Exception exception)
            {
                _logger.UpdateLog($"Account creation failure: {exception.Message}");
            }
        }
Esempio n. 19
0
        public async void CreateMySqlDataAsync(bool createTables, bool createData)
        {
            _logger.UpdateLog("Running mySQL data creation tool...");

            int successCounter = 0;
            int faultCounter   = 0;

            try
            {
                _logger.UpdateLog("Starting connection...");

                using (MySqlDbManager dbManager = new MySqlDbManager(_connectionSettings))
                {
                    BoxedData startConnData = await dbManager.StartConnectionTaskStart();

                    bool startConnSuccess = (bool)startConnData.Data;

                    if (!String.IsNullOrEmpty(startConnData.Msg))
                    {
                        _logger.UpdateLog(startConnData.Msg);
                    }

                    if (!startConnSuccess)
                    {
                        throw new Exception("cannot connect to database!");
                    }

                    _logger.UpdateLog("Getting data creation queries...");
                    SqlCreationQueriesData queriesData = new SqlCreationQueriesData();
                    List <string>          queryList   = queriesData.GetMySqlDataCreationQueries(createTables, createData);
                    bool queryExecSuccess = false;

                    for (int i = 0; i < queryList.Count; i++)
                    {
                        _logger.UpdateLog($"Executing query {(i + 1)} of {queryList.Count}...");

                        using (BoxedData queryExecData = await dbManager.ExecuteQueryTaskStart(queryList[i]))
                        {
                            queryExecSuccess = (bool)queryExecData.Data;
                            if (!String.IsNullOrEmpty(queryExecData.Msg))
                            {
                                _logger.UpdateLog(queryExecData.Msg);
                            }
                        }

                        _logger.UpdateLog(queryExecSuccess ? "Query executed successfully!" : "An error occured!");

                        if (queryExecSuccess)
                        {
                            successCounter++;
                        }
                        else
                        {
                            faultCounter++;
                        }
                    }
                }

                _logger.UpdateLog($"MySql data creation ended! Successes [{successCounter}] faults [{faultCounter}].");
            }
            catch (Exception exception)
            {
                _logger.UpdateLog($"MySQL data creation failed: {exception.Message}");
            }
        }
Esempio n. 20
0
        public async void LoadWorldDataAsync(MySqlDbManager dbManager)
        {
            this.IsLoaded     = false;
            this.LoadingError = false;
            _logger.UpdateLog("Loading game world data...");

            try
            {
                if (dbManager.GetConnectionState() != System.Data.ConnectionState.Open)
                {
                    throw new Exception("connection not open!");
                }

                #region World map settings
                //WORLD MAP SETTINGS
                _logger.UpdateLog("Getting world map settings...");
                using (BoxedData wmsBoxedData = await dbManager.GetWorldMapSettingsDataTaskStart())
                {
                    List <DbWorldMapSettingsData> wmsDataList = (List <DbWorldMapSettingsData>)wmsBoxedData.Data;
                    if (!String.IsNullOrEmpty(wmsBoxedData.Msg))
                    {
                        _logger.UpdateLog(wmsBoxedData.Msg);
                    }

                    ExtractWorldMapSettingsData(wmsDataList);
                }

                #endregion

                #region Terrain object definitions
                //TERRAIN OBJECT DEFINITIONS

                lock (_terrainDefLock)
                {
                    _terrainObjectDefinitionList.Clear();
                }

                _logger.UpdateLog("Getting terrain object definitions...");

                using (BoxedData todBoxedData = await dbManager.GetTerrainObjectDefinitionsDataTaskStart())
                {
                    lock (_terrainDefLock)
                    {
                        _terrainObjectDefinitionList = (List <DbTerrainObjectDefinitions>)todBoxedData.Data;
                    }

                    if (!String.IsNullOrEmpty(todBoxedData.Msg))
                    {
                        _logger.UpdateLog(todBoxedData.Msg);
                    }
                }

                #endregion

                #region World place data
                //WORLD PLACE DATA INITIALIZATION
                if (this.MapWidth <= 0 || this.MapHeight <= 0)
                {
                    throw new Exception($"wrong map dimensions [{this.MapWidth}, {this.MapHeight}]!");
                }

                _logger.UpdateLog("World place data initialization...");
                _worldPlaces = new WorldPlaceData[this.MapWidth, this.MapHeight];

                await Task.Factory.StartNew
                (
                    () =>
                {
                    for (int y = 0; y < this.MapHeight; y++)
                    {
                        for (int x = 0; x < this.MapWidth; x++)
                        {
                            _worldPlaces[x, y] = new WorldPlaceData(_logger, this, _terrainObjectDefinitionList, x, y);
                        }
                    }
                }
                );

                //WORLD PLACE DATA FILLING
                _logger.UpdateLog("Filling world place data...");

                using (BoxedData wmBoxedData = await dbManager.GetWorldMapDataTaskStart())
                {
                    List <DbWorldMapData> wmDataList = (List <DbWorldMapData>)wmBoxedData.Data;
                    if (!String.IsNullOrEmpty(wmBoxedData.Msg))
                    {
                        _logger.UpdateLog(wmBoxedData.Msg);
                    }

                    await Task.Factory.StartNew(() => FillWorldPlaceData(wmDataList));
                }

                #endregion

                #region Place instance creation
                //PLACE INSTANCE CREATION

                {
                    int wmId = -1;
                    List <DbTerrainObjectsData> terrainObjectsList = new List <DbTerrainObjectsData>();
                    List <int> parentIdList = new List <int>();

                    for (int y = 0; y < this.MapHeight; y++)
                    {
                        for (int x = 0; x < this.MapWidth; x++)
                        {
                            parentIdList.Clear();
                            terrainObjectsList.Clear();

                            wmId = _worldPlaces[x, y].WmId;

                            using (BoxedData parentIdsData = await dbManager.GetParentObjectIdsTaskStart(wmId))
                            {
                                parentIdList = (List <int>)parentIdsData.Data;
                                if (!String.IsNullOrEmpty(parentIdsData.Msg))
                                {
                                    _logger.UpdateLog(parentIdsData.Msg);
                                }

                                LogParentIds(x, y, parentIdList);
                            }

                            foreach (int parentId in parentIdList)
                            {
                                using (BoxedData terrainObjectsData = await dbManager.GetTerrainObjectsDataTaskStart($"`to_wm_id` = {wmId} AND `to_parent_id` = {parentId}"))
                                {
                                    terrainObjectsList = (List <DbTerrainObjectsData>)terrainObjectsData.Data;
                                    if (!String.IsNullOrEmpty(terrainObjectsData.Msg))
                                    {
                                        _logger.UpdateLog(terrainObjectsData.Msg);
                                    }

                                    _worldPlaces[x, y].AddPredefinedInstanceAsync(terrainObjectsList, parentId);

                                    while (WorldPlaceData.InstanceCreationInProgress)
                                    {
                                        await Task.Factory.StartNew(() => Thread.Sleep(50));
                                    }
                                }
                            }
                        }
                    }
                }

                #endregion

                #region Characters
                //CHARACTER DATA INITIALIZATION
                _logger.UpdateLog("Getting characters data...");
                _characterContainer = new CharacterDataContainer();
                bool charInitSuccess = false;

                using (BoxedData dbCharsData = await dbManager.GetCharactersDataTaskStart())
                {
                    List <DbCharactersData> charDataList = (List <DbCharactersData>)dbCharsData.Data;
                    if (!String.IsNullOrEmpty(dbCharsData.Msg))
                    {
                        _logger.UpdateLog(dbCharsData.Msg);
                    }

                    using (BoxedData charContainerInitData = await _characterContainer.InitializeCharacterDataTaskStart(charDataList))
                    {
                        charInitSuccess = (bool)charContainerInitData.Data;
                        _logger.UpdateLog(charContainerInitData.Msg);
                    }
                }

                if (!charInitSuccess)
                {
                    throw new Exception("character initialization failed!");
                }

                #endregion

                this.IsLoaded = true;
            }
            catch (Exception exception)
            {
                this.LoadingError = true;
                _logger.UpdateLog($"An error occured during world data loading: {exception.Message}");
            }

            _logger.UpdateLog($"Loading world data ended with {(this.IsLoaded ? "success" : "failure")}.");
        }
Esempio n. 21
0
        private async void HandleCharactersMovementAsync()
        {
            if (_movementHandlingInProgress)
            {
                _logger.UpdateLog("Character movement handling already started!");
                return;
            }

            _movementHandlingInProgress = true;
            _logger.UpdateLog("Game state handler - character movement handling started!");

            try
            {
                List <CharacterMovementDetails> movementDetailsListTemp = new List <CharacterMovementDetails>();
                CharacterData                  characterData;
                List <GeoDataElement>          geoDataList           = new List <GeoDataElement>();
                CharacterPositionUpdateDetails positionDetailsToSend = null;
                int count = 0;

                int  wmId;
                int  parentObjectId;
                bool isOnWorldMap;

                GeoDataValidationDetails geoDataValidationDetails = null;
                bool            geoMovementValid        = false;
                Point3 <double> lastValidMovementPoint  = new Point3 <double>(0, 0, 0);
                bool            exitPointFound          = false;
                Point3 <double> exitPosition            = null;
                double          lastTParamValue         = 0;
                int             timeArrivalMsIncomplete = 0;
                bool            worldMovingValid        = false;

                do
                {
                    #region Main list item removal
                    //MAIN LIST ITEM REMOVAL
                    lock (_movementDetailsLock)
                    {
                        count = _movementDetailsList.Count;

                        if (count > 0)
                        {
                            movementDetailsListTemp = _movementDetailsList.Clone();
                            foreach (CharacterMovementDetails item in _movementDetailsList)
                            {
                                item.Dispose();
                            }

                            _movementDetailsList.Clear();
                        }
                    }

                    #endregion

                    #region Interval handling
                    //INTERVAL HANDLING
                    if (count == 0)
                    {
                        await Task.Factory.StartNew(() => Thread.Sleep(GameStateHandler._movementHandlingTickMs));

                        continue;
                    }

                    #endregion

                    #region Movement details handling
                    //MOV. DETAILS HANDLING
                    foreach (CharacterMovementDetails movementDetails in movementDetailsListTemp)
                    {
                        if (geoDataList.Count > 0)
                        {
                            geoDataList.Clear();
                        }

                        if (movementDetails.CharId < 0)
                        {
                            _logger.UpdateLog("Movement details handling warning - character's ID less than 0!");
                            continue;
                        }

                        //characterData = await _characterInfo.GetCharacterByNameTaskStart(movementDetails.CharName);
                        characterData = await _characterInfo.GetCharacterByIdTaskStart(movementDetails.CharId);

                        if (characterData == null)
                        {
                            _logger.UpdateLog($"Movement details handling warning - character's ID [{movementDetails.CharId}] not found!");
                            continue;
                        }

                        wmId           = characterData.WmId;
                        parentObjectId = characterData.ParentObjectId;
                        isOnWorldMap   = characterData.IsOnWorldMap;

                        switch (movementDetails.Type)
                        {
                        case CharacterMovementDetails.MovementType.SwitchMovementType:
                        {
                            #region Local enter/exit point veryfication
                            //LOCAL ENTER/EXIT POINT VERYFICATION
                            exitPointFound = false;

                            if (characterData.IsOnWorldMap)
                            {
                                using (BoxedData geoBoxedData = await _geoDataInfo.GetLocalGeoDataOfExitElementsTaskStart(wmId, parentObjectId))
                                {
                                    geoDataList = (List <GeoDataElement>)geoBoxedData.Data;
                                    if (!String.IsNullOrEmpty(geoBoxedData.Msg))
                                    {
                                        _logger.UpdateLog(geoBoxedData.Msg);
                                    }
                                }

                                exitPosition = GeoDataValidator.GetRandomExitPosition(geoDataList);

                                if (exitPosition != null)
                                {
                                    exitPointFound = true;

                                    //PLACING CHARACTER ON ENTRY POINT
                                    characterData.MoveCharacterLocal
                                    (
                                        exitPosition.Copy(),
                                        exitPosition.Copy(),
                                        0
                                    );
                                }
                            }

                            #endregion

                            #region State change section
                            //STATE CHANGE SECTION

                            if (!exitPointFound && characterData.IsOnWorldMap)
                            {
                                _logger.UpdateLog($"Cannot find location exit point for character's ID [{movementDetails.CharId}] wm_id [{wmId}] parent object ID [{parentObjectId}]");
                                SendMessageToPlayer(movementDetails.CharId, "Error: cannot find entry point!");
                            }
                            else
                            {
                                characterData.IsOnWorldMap = !isOnWorldMap;
                                _logger.UpdateLog($"Movement type switched for character's ID [{movementDetails.CharId}] to {(characterData.IsOnWorldMap ? "world" : "local")} state");

                                positionDetailsToSend = new CharacterPositionUpdateDetails()
                                {
                                    MovementType       = (characterData.IsOnWorldMap ? "switchmap" : "switchlocal"),
                                    CharId             = movementDetails.CharId,
                                    OldLocationLocal   = characterData.CurrentLoc.Copy(),
                                    NewLocationLocal   = characterData.CurrentLoc.Copy(),
                                    TimeArrivalMsLocal = 0,
                                    OldLocationWorld   = characterData.CurrentWorldLoc.Copy(),
                                    NewLocationWorld   = characterData.CurrentWorldLoc.Copy()
                                };

                                if (characterData.IsOnWorldMap)
                                {
                                    SendMovementDetailsToCurrentPlayerAsync(positionDetailsToSend, movementDetails.CharId);
                                }

                                SendMovementDetailsToPlayersInLocationAsync(positionDetailsToSend, wmId, false, parentObjectId);
                            }

                            #endregion
                        }
                        break;

                        case CharacterMovementDetails.MovementType.Local:
                        {
                            #region Local movement handling
                            //LOCAL MOVEMENT HANDLING
                            if (isOnWorldMap)
                            {
                                _logger.UpdateLog($"Movement details handling warning - local movement cancelled for character's ID [{movementDetails.CharId}], reason: world map state");
                            }
                            else
                            {
                                #region Geo data validation
                                //GEO DATA VALIDATION
                                using
                                (
                                    BoxedData geoBoxedData = await _geoDataInfo.GetLocalGeoDataTaskStart
                                                             (
                                        wmId,
                                        parentObjectId,
                                        PointConverter.Point3DoubleToInt(movementDetails.OldLocationLocal),
                                        PointConverter.Point3DoubleToInt(movementDetails.NewLocationLocal)
                                                             )
                                )
                                {
                                    geoDataList = (List <GeoDataElement>)geoBoxedData.Data;
                                    if (!String.IsNullOrEmpty(geoBoxedData.Msg))
                                    {
                                        _logger.UpdateLog(geoBoxedData.Msg);
                                    }
                                }

                                using (BoxedData geoValidationBoxedData = await GeoDataValidator.ValidateMovementTaskStart(geoDataList, movementDetails))
                                {
                                    geoDataValidationDetails = (GeoDataValidationDetails)geoValidationBoxedData.Data;
                                    if (!String.IsNullOrEmpty(geoValidationBoxedData.Msg))
                                    {
                                        _logger.UpdateLog(geoValidationBoxedData.Msg);
                                    }

                                    geoMovementValid       = geoDataValidationDetails.Valid;
                                    lastValidMovementPoint = geoDataValidationDetails.LastValidMovementPoint;
                                    lastTParamValue        = geoDataValidationDetails.LastTParamValue;

                                    geoDataValidationDetails.Dispose();
                                    geoDataValidationDetails = null;
                                }
                                #endregion

                                //_logger.UpdateLog($"GEO VALID [{geoMovementValid}]");
                                //geoMovementValid = true; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                                //CHARACTER MOVING
                                if (geoMovementValid)
                                {
                                    characterData.MoveCharacterLocal
                                    (
                                        movementDetails.OldLocationLocal.Copy(),
                                        movementDetails.NewLocationLocal.Copy(),
                                        movementDetails.TimeArrivalMsLocal
                                    );

                                    positionDetailsToSend = new CharacterPositionUpdateDetails()
                                    {
                                        MovementType       = "movelocal",
                                        CharId             = movementDetails.CharId,
                                        OldLocationLocal   = movementDetails.OldLocationLocal.Copy(),
                                        NewLocationLocal   = movementDetails.NewLocationLocal.Copy(),
                                        TimeArrivalMsLocal = movementDetails.TimeArrivalMsLocal,
                                        OldLocationWorld   = new Point2 <int>(0, 0),
                                        NewLocationWorld   = new Point2 <int>(0, 0)
                                    };

                                    SendMovementDetailsToPlayersInLocationAsync(positionDetailsToSend, wmId, isOnWorldMap, parentObjectId);
                                }
                                else
                                {
                                    timeArrivalMsIncomplete = Convert.ToInt32(Convert.ToDouble(movementDetails.TimeArrivalMsLocal) * lastTParamValue);

                                    characterData.MoveCharacterLocal
                                    (
                                        movementDetails.OldLocationLocal.Copy(),
                                        lastValidMovementPoint.Copy(),
                                        timeArrivalMsIncomplete
                                    );

                                    positionDetailsToSend = new CharacterPositionUpdateDetails()
                                    {
                                        MovementType       = "movelocal",
                                        CharId             = movementDetails.CharId,
                                        OldLocationLocal   = movementDetails.OldLocationLocal.Copy(),
                                        NewLocationLocal   = lastValidMovementPoint.Copy(),
                                        TimeArrivalMsLocal = timeArrivalMsIncomplete,
                                        OldLocationWorld   = new Point2 <int>(0, 0),
                                        NewLocationWorld   = new Point2 <int>(0, 0)
                                    };

                                    SendMovementDetailsToPlayersInLocationAsync(positionDetailsToSend, wmId, isOnWorldMap, parentObjectId);
                                }
                            }

                            #endregion
                        }
                        break;

                        case CharacterMovementDetails.MovementType.World:
                        {
                            #region World map movement handling
                            //WORLD MAP MOVEMENT HANDLING
                            if (!isOnWorldMap)
                            {
                                _logger.UpdateLog($"Movement details handling warning - world map movement cancelled for character's ID [{movementDetails.CharId}], reason: local movement state");
                            }
                            else
                            {
                                Point2 <int> oldLocWorld = movementDetails.OldLocationWorld.Copy();
                                Point2 <int> newLocWorld = movementDetails.NewLocationWorld.Copy();

                                //WORLD MOVEMENT VALIDATION
                                worldMovingValid = true;

                                int distanceX = Math.Abs(oldLocWorld.X - newLocWorld.X);
                                int distanceY = Math.Abs(oldLocWorld.Y - newLocWorld.Y);

                                if
                                (
                                    oldLocWorld.X != characterData.CurrentWorldLoc.X || oldLocWorld.Y != characterData.CurrentWorldLoc.Y ||
                                    distanceX > 2 || distanceY > 2
                                )
                                {
                                    worldMovingValid = false;
                                    //_logger.UpdateLog($"Movement details handling warning - world map movement cancelled for character's ID [{movementDetails.CharId}]");
                                }

                                //CHARACTER MOVING
                                if (worldMovingValid)
                                {
                                    WorldPlaceDataDetails worldPlaceDetails = _geoDataInfo.GetWorldPlaceDataDetails(newLocWorld.X, newLocWorld.Y);
                                    int newWmId = (worldPlaceDetails != null ? worldPlaceDetails.WmId : -1);

                                    characterData.MoveCharacterWorld(newLocWorld);

                                    positionDetailsToSend = new CharacterPositionUpdateDetails()
                                    {
                                        MovementType       = "moveworld",
                                        CharId             = movementDetails.CharId,
                                        OldLocationLocal   = new Point3 <double>(0, 0, 0),
                                        NewLocationLocal   = new Point3 <double>(0, 0, 0),
                                        TimeArrivalMsLocal = 0,
                                        OldLocationWorld   = oldLocWorld,
                                        NewLocationWorld   = newLocWorld
                                    };

                                    SendMovementDetailsToPlayersInLocationAsync(positionDetailsToSend, wmId, isOnWorldMap, parentObjectId);
                                    ChangeWmIdAsync(characterData, newWmId);
                                }
                                else
                                {
                                    SendMessageToPlayer(movementDetails.CharId, "You're moving too far");
                                }
                            }

                            #endregion
                        }
                        break;

                        default:
                            throw new Exception($"unknown movement type [{movementDetails.Type.ToString()}]!");
                        }
                    }

                    #endregion

                    #region Temp. list disposal
                    //TEMP. LIST DISPOSAL
                    foreach (CharacterMovementDetails item in movementDetailsListTemp)
                    {
                        item.Dispose();
                    }

                    movementDetailsListTemp.Clear();

                    #endregion
                }while (_movementHandlingInProgress);
            }
            catch (Exception exception)
            {
                _logger.UpdateLog($"Character movement handling error: {exception.Message}");
            }
            finally
            {
                _movementHandlingInProgress = false;
                _logger.UpdateLog("Game state handler - character movement handling stopped!");
            }
        }
Esempio n. 22
0
        /// <summary>
        /// Gets data from table 'characters'
        /// </summary>
        public BoxedData GetCharactersData(string sqlFilter = "")
        {
            BoxedData data = new BoxedData();
            List <DbCharactersData> resultList = new List <DbCharactersData>();
            string msg = "";

            try
            {
                int     charId          = -1;
                string  name            = "";
                int     accId           = -1;
                bool    isNpc           = false;
                string  npcAltName      = "";
                bool    isOnWorldMap    = false;
                int     wmId            = -1;
                int     terrainParentId = -1;
                decimal localPosX       = 0.0000M;
                decimal localPosY       = 0.0000M;
                decimal localPosZ       = 0.0000M;
                decimal localAngle      = 0.0000M;
                string  modelCode       = "";
                int     hairstyleId     = 0;

                string query = @"
                    SELECT
                        `char_id`,
                        `char_name`,
                        `char_acc_id`,
                        `char_is_npc`,
                        `char_npc_alt_name`,
                        `char_is_on_world_map`,
                        `char_wm_id`,
                        `char_terrain_parent_id`,
                        `char_local_pos_x`,
                        `char_local_pos_y`,
                        `char_local_pos_z`,
                        `char_local_angle`,
                        `char_model_code`,
                        `char_hairstyle_id`
                    FROM
                        `characters`
                ";

                if (!String.IsNullOrWhiteSpace(sqlFilter))
                {
                    query += $" {(!sqlFilter.ToUpper().Contains("WHERE") ? "WHERE" : "")} {sqlFilter}";
                }

                lock (_connectionLock)
                {
                    using (MySqlCommand command = new MySqlCommand(query, _connection))
                    {
                        using (MySqlDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                charId          = reader.GetInt32("char_id");
                                name            = reader["char_name"].ToString();
                                accId           = reader.GetInt32("char_acc_id");
                                isNpc           = (reader.GetInt32("char_is_npc") == 1);
                                npcAltName      = reader["char_npc_alt_name"].ToString();
                                isOnWorldMap    = (reader.GetInt32("char_is_on_world_map") == 1);
                                wmId            = reader.GetInt32("char_wm_id");
                                terrainParentId = reader.GetInt32("char_terrain_parent_id");
                                localPosX       = reader.GetDecimal("char_local_pos_x");
                                localPosY       = reader.GetDecimal("char_local_pos_y");
                                localPosZ       = reader.GetDecimal("char_local_pos_z");
                                localAngle      = reader.GetDecimal("char_local_angle");
                                modelCode       = reader["char_model_code"].ToString();
                                hairstyleId     = reader.GetInt32("char_hairstyle_id");

                                DbCharactersData result = new DbCharactersData
                                                          (
                                    charId,
                                    name,
                                    accId,
                                    isNpc,
                                    npcAltName,
                                    isOnWorldMap,
                                    wmId,
                                    terrainParentId,
                                    localPosX,
                                    localPosY,
                                    localPosZ,
                                    localAngle,
                                    modelCode,
                                    hairstyleId
                                                          );
                                resultList.Add(result);
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                msg = $"Cannot get data from 'characters' table, SQL filter [{sqlFilter}]: {exception.Message}";
            }

            data.Data = resultList;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 23
0
        /// <summary>
        /// Gets data from table 'terrain_objects'
        /// </summary>
        public BoxedData GetTerrainObjectsData(string sqlFilter = "")
        {
            BoxedData data = new BoxedData();
            List <DbTerrainObjectsData> resultList = new List <DbTerrainObjectsData>();
            string msg = "";

            try
            {
                int  toId               = -1;
                int  wmId               = -1;
                int  localPosX          = -1;
                int  localPosY          = -1;
                int  localPosZ          = -1;
                int  todId              = -1;
                int  parentId           = -1;
                bool isParentalTeleport = false;
                bool isExit             = false;

                string query = @"
                    SELECT
                        `to_id`,
                        `to_wm_id`,
                        `to_local_pos_x`,
                        `to_local_pos_y`,
                        `to_local_pos_z`,
                        `to_tod_id`,
                        `to_parent_id`,
                        `to_is_parental_teleport`,
                        `to_is_exit`
                    FROM
                        `terrain_objects`
                ";

                if (!String.IsNullOrWhiteSpace(sqlFilter))
                {
                    query += $" {(!sqlFilter.ToUpper().Contains("WHERE") ? "WHERE" : "")} {sqlFilter}";
                }

                lock (_connectionLock)
                {
                    using (MySqlCommand command = new MySqlCommand(query, _connection))
                    {
                        using (MySqlDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                toId               = reader.GetInt32("to_id");
                                wmId               = reader.GetInt32("to_wm_id");
                                localPosX          = reader.GetInt32("to_local_pos_x");
                                localPosY          = reader.GetInt32("to_local_pos_y");
                                localPosZ          = reader.GetInt32("to_local_pos_z");
                                todId              = reader.GetInt32("to_tod_id");
                                parentId           = reader.GetInt32("to_parent_id");
                                isParentalTeleport = (reader.GetInt32("to_is_parental_teleport") == 1);
                                isExit             = (reader.GetInt32("to_is_exit") == 1);

                                DbTerrainObjectsData result = new DbTerrainObjectsData
                                                              (
                                    toId,
                                    wmId,
                                    localPosX,
                                    localPosY,
                                    localPosZ,
                                    todId,
                                    parentId,
                                    isParentalTeleport,
                                    isExit
                                                              );
                                resultList.Add(result);
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                msg = $"Cannot get data from 'terrain_objects' table, SQL filter [{sqlFilter}]: {exception.Message}";
            }

            data.Data = resultList;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 24
0
        /// <summary>
        /// Gets data from table 'accounts'
        /// </summary>
        public BoxedData GetAccountsData(string sqlFilter = "")
        {
            BoxedData             data       = new BoxedData();
            List <DbAccountsData> resultList = new List <DbAccountsData>();
            string msg = "";

            try
            {
                int    id            = -1;
                string login         = "";
                string passEncrypted = "";
                int    accessLevel   = 0;

                string query = @"
                    SELECT
                        `acc_id`,
                        `acc_login`,
                        `acc_pass`,
                        `acc_access_level`
                    FROM
                        `accounts`
                ";

                if (!String.IsNullOrWhiteSpace(sqlFilter))
                {
                    query += $" {(!sqlFilter.ToUpper().Contains("WHERE") ? "WHERE" : "")} {sqlFilter}";
                }

                lock (_connectionLock)
                {
                    using (MySqlCommand command = new MySqlCommand(query, _connection))
                    {
                        using (MySqlDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                id            = reader.GetInt32("acc_id");
                                login         = reader["acc_login"].ToString();
                                passEncrypted = reader["acc_pass"].ToString();
                                accessLevel   = reader.GetInt32("acc_access_level");

                                DbAccountsData result = new DbAccountsData
                                                        (
                                    id,
                                    login,
                                    passEncrypted,
                                    DbAccountsData.PasswordType.Encrypted,
                                    accessLevel
                                                        );

                                resultList.Add(result);
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                msg = $"Cannot get data from 'accounts' table, SQL filter [{sqlFilter}]: {exception.Message}";
            }

            data.Data = resultList;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 25
0
        private BoxedData FillTerrainDetails(List <DbTerrainObjectsData> terrainDataList)
        {
            BoxedData data    = new BoxedData();
            bool      success = false;
            string    msg     = "";

            try
            {
                int  toId;
                int  wmId;
                int  localPosX;
                int  localPosY;
                int  localPosZ;
                int  todId;
                int  parentId;
                bool isParentalTeleport;
                bool isExit;
                DbTerrainObjectDefinitions terrainDefinition;

                lock (_terrainDetailsLock)
                {
                    foreach (DbTerrainObjectsData terrainData in terrainDataList)
                    {
                        toId               = terrainData.ToId;
                        wmId               = terrainData.WmId;
                        localPosX          = terrainData.LocalPosX;
                        localPosY          = terrainData.LocalPosY;
                        localPosZ          = terrainData.LocalPosZ;
                        todId              = terrainData.TodId;
                        parentId           = terrainData.ParentId;
                        isParentalTeleport = terrainData.IsParentalTeleport;
                        isExit             = terrainData.IsExit;
                        terrainDefinition  = (todId > -1 ? GetTerrainDefinition(todId) : null);

                        if
                        (
                            localPosX < 0 || localPosX >= _terrainDetails.GetLength(0) ||
                            localPosY < 0 || localPosY >= _terrainDetails.GetLength(1) ||
                            localPosZ < 0 || localPosZ >= _terrainDetails.GetLength(2)
                        )
                        {
                            continue;
                        }

                        //Console.WriteLine($"Terrain details - wm_id [{wmId}] local pos [{localPosX}, {localPosY}, {localPosZ}] parent [{parentId}] is TP [{isParentalTeleport}] exit [{isExit}]");
                        _terrainDetails[localPosX, localPosY, localPosZ] = new PlaceInstanceTerrainDetails
                                                                           (
                            toId,
                            wmId,
                            localPosX,
                            localPosY,
                            localPosZ,
                            parentId,
                            isParentalTeleport,
                            isExit,
                            terrainDefinition
                                                                           );

                        if (isExit)
                        {
                            _exitElementsIndexList.Add(Tuple.Create(localPosX, localPosY, localPosZ));
                        }
                    }
                }

                success = true;
            }
            catch (Exception exception)
            {
                msg = $"Error - terrain details filling - place instance ID [{this.PlaceInstanceId}]: {exception.Message}";
            }

            data.Data = success;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 26
0
        /// <summary>
        /// Gets data from table 'world_map'
        /// </summary>
        public BoxedData GetWorldMapData(string sqlFilter = "")
        {
            BoxedData             data       = new BoxedData();
            List <DbWorldMapData> resultList = new List <DbWorldMapData>();
            string msg = "";

            try
            {
                int    wmId          = -1;
                int    worldPosX     = -1;
                int    worldPosY     = -1;
                int    placeType     = -1;
                int    isRandomPlace = 0;
                string placeName     = "";

                string query = @"
                    SELECT
                        `wm_id`,
                        `wm_world_pos_x`,
                        `wm_world_pos_y`,
                        `wm_place_type`,
                        `wm_is_random_place`,
                        `wm_place_name`
                    FROM
                        `world_map`
                ";

                if (!String.IsNullOrWhiteSpace(sqlFilter))
                {
                    query += $" {(!sqlFilter.ToUpper().Contains("WHERE") ? "WHERE" : "")} {sqlFilter}";
                }

                lock (_connectionLock)
                {
                    using (MySqlCommand command = new MySqlCommand(query, _connection))
                    {
                        using (MySqlDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                wmId          = reader.GetInt32("wm_id");
                                worldPosX     = reader.GetInt32("wm_world_pos_x");
                                worldPosY     = reader.GetInt32("wm_world_pos_y");
                                placeType     = reader.GetInt32("wm_place_type");
                                isRandomPlace = reader.GetInt32("wm_is_random_place");
                                placeName     = reader["wm_place_name"].ToString();

                                DbWorldMapData result = new DbWorldMapData
                                                        (
                                    wmId,
                                    worldPosX,
                                    worldPosY,
                                    placeType,
                                    (isRandomPlace == 1),
                                    placeName
                                                        );
                                resultList.Add(result);
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                msg = $"Cannot get data from 'world_map' table, SQL filter [{sqlFilter}]: {exception.Message}";
            }

            data.Data = resultList;
            data.Msg  = msg;
            return(data);
        }
Esempio n. 27
0
        /// <summary>
        /// Gets data from table 'terrain_object_definitions'
        /// </summary>
        public BoxedData GetTerrainObjectDefinitionsData(string sqlFilter = "")
        {
            BoxedData data = new BoxedData();
            List <DbTerrainObjectDefinitions> resultList = new List <DbTerrainObjectDefinitions>();
            string msg = "";

            try
            {
                int    todId      = -1;
                string code       = "";
                int    collisionX = 0;
                int    collisionY = 0;
                int    collisionZ = 0;
                bool   isTerrain  = false;
                bool   isPlatform = false;
                bool   isObstacle = false;

                string query = @"
                    SELECT
                        `tod_id`,
                        `tod_code`,
                        `tod_collision_x`,
                        `tod_collision_y`,
                        `tod_collision_z`,
                        `tod_is_terrain`,
                        `tod_is_platform`,
                        `tod_is_obstacle`
                    FROM
                        `terrain_object_definitions`
                ";

                if (!String.IsNullOrWhiteSpace(sqlFilter))
                {
                    query += $" {(!sqlFilter.ToUpper().Contains("WHERE") ? "WHERE" : "")} {sqlFilter}";
                }

                lock (_connectionLock)
                {
                    using (MySqlCommand command = new MySqlCommand(query, _connection))
                    {
                        using (MySqlDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                todId      = reader.GetInt32("tod_id");
                                code       = reader["tod_code"].ToString();
                                collisionX = reader.GetInt32("tod_collision_x");
                                collisionY = reader.GetInt32("tod_collision_y");
                                collisionZ = reader.GetInt32("tod_collision_z");
                                isTerrain  = (reader.GetInt32("tod_is_terrain") == 1);
                                isPlatform = (reader.GetInt32("tod_is_platform") == 1);
                                isObstacle = (reader.GetInt32("tod_is_obstacle") == 1);

                                DbTerrainObjectDefinitions result = new DbTerrainObjectDefinitions
                                                                    (
                                    todId,
                                    code,
                                    collisionX,
                                    collisionY,
                                    collisionZ,
                                    isTerrain,
                                    isPlatform,
                                    isObstacle
                                                                    );
                                resultList.Add(result);
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                msg = $"Cannot get data from 'terrain_object_definitions' table, SQL filter [{sqlFilter}]: {exception.Message}";
            }

            data.Data = resultList;
            data.Msg  = msg;
            return(data);
        }