Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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();
        }
Esempio n. 3
0
        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;
        }