// we need to save in players somehow current state to check if its not inside anymore for this player to call exit
        private void Loop()
        {
            while (running)
            {
                foreach (var player in GetAllPlayers())
                {
                    ComputeWorldObject(player.Value);
                }

                foreach (var vehicle in GetAllVehicles())
                {
                    ComputeWorldObject(vehicle.Value);
                }

                // col shape exit is calculated via bool that gets set to false before each iteration and will set back to true when the entity is inside
                // when its still false after iteration entity isn't inside anymore
                lock (colShapes)
                {
                    for (int i = 0, length = colShapes.Length; i < length; i++)
                    {
                        var colShape = colShapes[i];
                        if (colShape.LastChecked.Count == 0)
                        {
                            continue;
                        }
                        if (worldObjectsToRemove.Count != 0)
                        {
                            worldObjectsToRemove.Clear();
                        }

                        if (worldObjectsToReset.Count != 0)
                        {
                            worldObjectsToReset.Clear();
                        }
                        using (var colShapeWorldObjects = colShape.LastChecked.GetEnumerator())
                        {
                            while (colShapeWorldObjects.MoveNext())
                            {
                                if (!colShapeWorldObjects.Current.Value)
                                {
                                    shape.RemoveWorldObject(colShapeWorldObjects.Current.Key);
                                    OnEntityExitColShape?.Invoke(colShapeWorldObjects.Current.Key, shape);
                                    worldObjectsToRemove.Add(colShapeWorldObjects.Current.Key);
                                }
                                else
                                {
                                    worldObjectsToReset.Add(colShapeWorldObjects.Current.Key);
                                }
                            }
                        }

                        if (worldObjectsToReset.Count != 0)
                        {
                            using (var worldObjectsToResetEnumerator = worldObjectsToReset.GetEnumerator())
                            {
                                while (worldObjectsToResetEnumerator.MoveNext())
                                {
                                    colShape.ResetCheck(worldObjectsToResetEnumerator.Current);
                                }
                            }

                            worldObjectsToReset.Clear();
                        }

                        if (worldObjectsToRemove.Count != 0)
                        {
                            using (var worldObjectsToRemoveEnumerator = worldObjectsToRemove.GetEnumerator())
                            {
                                while (worldObjectsToRemoveEnumerator.MoveNext())
                                {
                                    colShape.RemoveCheck(worldObjectsToRemoveEnumerator.Current);
                                }
                            }

                            worldObjectsToRemove.Clear();
                        }
                    }
                }

                Thread.Sleep(100);
            }
        }