/// <summary> /// Deserialization constructor. /// </summary> /// <param name="character">The character for this training</param> /// <param name="serial">The serialization object for this training</param> /// <param name="isPaused">When true, the training is currently paused.</param> /// <param name="startTimeWhenPaused">Training starttime when the queue is actually paused. /// Indeed, in such case, CCP returns empty start and end time, so we compute a "what if we start now" scenario.</param> internal QueuedSkill(Character character, SerializableQueuedSkill serial, bool isPaused, ref DateTime startTimeWhenPaused) { Owner = character; StartSP = serial.StartSP; EndSP = serial.EndSP; Level = serial.Level; Skill = character.Skills[serial.ID]; if (!isPaused) { // Not paused, we should trust CCP StartTime = serial.StartTime; EndTime = serial.EndTime; } else { // StartTime and EndTime were empty on the serialization object if the skill was paused // So we compute a "what if we start now" scenario StartTime = startTimeWhenPaused; if (Skill != null) { Skill.SkillPoints = StartSP; startTimeWhenPaused += Skill.GetLeftTrainingTimeForLevelOnly(Level); } EndTime = startTimeWhenPaused; } }
/// <summary> /// Generates a deserialization object. /// </summary> /// <returns></returns> internal SerializableQueuedSkill Export() { SerializableQueuedSkill skill = new SerializableQueuedSkill { ID = Skill?.ID ?? 0, Level = Level, StartSP = StartSP, EndSP = EndSP, }; // CCP's API indicates paused training skill with missing start and end times // Mimicing them is ugly but necessary if (!Owner.IsTraining) return skill; skill.StartTime = StartTime; skill.EndTime = EndTime; return skill; }