/// <summary> /// Creates a loader that loads the <paramref name="storedProjectile"/> into the <paramref name="level"/>. /// </summary> /// <param name="level">The level the projectile is being loaded into.</param> /// <param name="storedProjectile">The stored data of the projectile.</param> public Loader(LevelManager level, StProjectile storedProjectile) { this.level = level; this.storedProjectile = storedProjectile; this.componentLoaders = new List <DefaultComponentLoader>(); type = level.Package.GetProjectileType(storedProjectile.TypeID); if (type == null) { throw new ArgumentException($"Projectile type {storedProjectile.TypeID} was not loaded"); } }
/// <summary> /// Stores the projectile into an instance of <see cref="StProjectile"/> for serialization. /// </summary> /// <param name="projectile">The projectile to store.</param> /// <returns>Stored projectile in an instance of <see cref="StProjectile"/> for serialization</returns> public static StProjectile Save(Projectile projectile) { var stProjectile = new StProjectile { Id = projectile.ID, Position = projectile.Node.Position.ToStVector3(), Rotation = projectile.Node.Rotation.ToStQuaternion(), PlayerID = projectile.Player.ID, TypeID = projectile.ProjectileType.ID, FaceDir = projectile.FaceInTheDirectionOfMovement, Trigger = projectile.TriggerCollisions, UserPlugin = new PluginData() }; try { projectile.ProjectilePlugin.SaveState(new PluginDataWrapper(stProjectile.UserPlugin, projectile.Level)); } catch (Exception e) { string message = $"Saving projectile plugin failed with Exception: {e.Message}"; Urho.IO.Log.Write(LogLevel.Error, message); throw new SavingException(message, e); } foreach (var component in projectile.Node.Components) { var defaultComponent = component as DefaultComponent; if (defaultComponent != null) { stProjectile.DefaultComponents.Add(defaultComponent.SaveState()); } } return(stProjectile); }