because of the less critical timing of MMORPGs you may be able to handle this kind of thing without alot of the thread overhead when discrete timers are being used..
Possible way - a sliding (window) 'time' bucket chain (with time increments of 1/5th 1/10th second, or possibly even cruder intervals) to which activator tickets are added to the 'buckets' (link list) by the objects for event timings (debuff, start buff after warmup, etc...)
When the time becomes "current" the tickets get processed and the FSM logic executes whatever (including putting new tickets further down the timeline). If you have LONG delay times, they can be bucketted in a seperate Long Time Chain with bigger time increments (like of 15 seconds) which when they get closer to the current time then move the ticket into the Short Time Chain.
- Fixed length bucket chain (a ring array of pointers with the 'current' moving) - insertion using an offset.
- Possibly Some space allowed for 'past due' in case of server slowdown issues.
- The server now runs the time clock advance allowing constant flexible timing controls (instead of multitude of real timers which now have to be 'patched')
If there are special DEBUF events effecting this whole game mechanic you have complications anyway --- the object would track its own list of "In Effect" Buff data, and so removal from the master timer bucket chain again is an offset and only has an extra link list search to pull the now defunct ticket.
- This detailed mechaism can be used as a general 'wakeup' system though it may be advantageous NOT to generalize it, and instead split into many seperate Timer chains for different flavors of uses.
Also If you can avoid Threads and their overhead, do so - use fibers/microfibers (a software threading mechanism versus system resource hard threads)
Again : MMORPG timings can be pretty loose (imprecise) giving you leeway to do less costly processing
As Always -- Free Pools for constantly used data structures/objects (like the 'tickets' mentioned above) to greatly reduce alloc/dealloc overhead