private IEnumerator FlushAllImpl(Coroutine coroutine, TimedTasks tasks) { var result = mDbManager.Set(coroutine, mDataCategory, "timedtasks:" + mServerId, tasks); yield return(result); result = mDbManager.Set(coroutine, DataCategory.TimeTask, mServerId.ToString(), mServerTaskData); yield return(result); }
public void FlushAll() { var tasks = new TimedTasks(); foreach (var item in mEvents) { tasks.Items.Add(new DataContract.TimedTaskItem { Id = item.Value.Id, Last = item.Value.Last.ToBinary(), Stamp = item.Value.Stamp }); } CoroutineFactory.NewCoroutine(FlushAllImpl, tasks).MoveNext(); }
private IEnumerator InitImpl(Coroutine coroutine) { var dbData = mDbManager.Get <TimedTasks>(coroutine, mDataCategory, "timedtasks:" + mServerId); yield return(dbData); var tasks = dbData.Data; Table.ForeachEvent(record => { var stamp = (tasks == null || tasks.Items.All(item => item.Id != record.Id)) ? 0 : tasks.Items.Find(item => item.Id == record.Id).Stamp; var last = (tasks == null || tasks.Items.All(item => item.Id != record.Id)) ? DateTime.Parse(record.TriggerTime) : DateTime.FromBinary(tasks.Items.Find(item => item.Id == record.Id).Last); // while (!mDbManager.AtomGetSet("tt:" + record.Id, old => // { // if (string.IsNullOrEmpty(old)) // { // return stamp.ToString(); // } // var s = int.Parse(old); // if (s > stamp) // { // stamp = s; // } // else if (s < stamp) // { // return stamp.ToString(); // } // // return string.Empty; // })) ; mEvents.Add(record.Id, new TimedTaskItem { Id = record.Id, Action = (character, c) => character.ApplyEvent(record.Id, record.Action, c), CacheCount = record.CacheCount, Duration = record.DurationParam, DurationType = record.DurationType, Stamp = stamp, Time = DateTime.Parse(record.TriggerTime), Last = last, Enable = record.Enable != 0 }); return(true); }); var hasUninitialized = true; while (hasUninitialized) { hasUninitialized = false; foreach (var item in mEvents) { if (!item.Value.Enable) { continue; } var next = AddDuration(item.Value.Last, item.Value.DurationType, item.Value.Duration); if (DateTime.Now > next) { hasUninitialized = true; item.Value.Stamp++; // avoid tolerances item.Value.Last = next; var s = item.Value.Last.Second - item.Value.Time.Second; item.Value.Last += TimeSpan.FromSeconds(s); var m = item.Value.Last.Minute - item.Value.Time.Minute; item.Value.Last += TimeSpan.FromMinutes(m); } } } var serverData = mDbManager.Get <TimedTasks>(coroutine, DataCategory.TimeTask, mServerId.ToString()); yield return(serverData); mServerTaskData = serverData.Data ?? new TimedTasks(); ApplyCachedServerTasks(); FlushAll(); mInitFinished = true; }