private static void LevelOnBegin(On.Celeste.Level.orig_Begin orig, Level level)
        {
            orig(level);
            if (!IsLoadStart)
            {
                return;
            }

            var loadedDict = level.FindAllToDict <Entity>();

            var notLoadedEntities = SavedEntitiesDict.Where(pair => !loadedDict.ContainsKey(pair.Key))
                                    .ToDictionary(p => p.Key, p => p.Value);

            if (notLoadedEntities.Count > 0)
            {
                RestoreAction.EntitiesSavedButNotLoaded(level, notLoadedEntities);
            }
        }
        public static void AfterEntityAwake(Level level)
        {
            var loadedEntitiesDict = level.FindAllToDict <Entity>();

            var notSavedEntities = loadedEntitiesDict.Where(pair => !SavedEntitiesDict.ContainsKey(pair.Key))
                                   .ToDictionary(p => p.Key, p => p.Value);

            RestoreAction.EntitiesLoadedButNotSaved(notSavedEntities);

            foreach (var pair in loadedEntitiesDict.Where(loaded => SavedEntitiesDict.ContainsKey(loaded.Key)))
            {
                RestoreAction.All.ForEach(restoreAction => {
                    if (pair.Value.GetType().IsSameOrSubclassOf(restoreAction.EntityType))
                    {
                        restoreAction.AfterEntityAwake(pair.Value, SavedEntitiesDict[pair.Key],
                                                       SavedDuplicateIdList);
                    }
                });
            }
        }