From: Keith F. <ven...@us...> - 2002-06-30 11:38:33
|
Update of /cvsroot/planeshift/planeshift/src/server In directory usw-pr-cvs1:/tmp/cvs-serv32602 Added Files: eventmanager.cpp eventmanager.h Log Message: Added EventManager class to server. This class maintains a queue of timed events (to the nearest msec) and uses a thread to clear that queue at the time required so that events can be scheduled by other parts of the game to happen in the future. This feature is required by combat, npc dialog, AI, pathfinding and probably others. --- NEW FILE: eventmanager.cpp --- /* * eventmanager.cpp * * Copyright (C) 2001 PlaneShift Team (in...@pl..., * http://www.planeshift.it) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation (version 2 of the License) * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include <config.h> #include <cssys/sysfunc.h> #include "util/gameevent.h" #include "eventmanager.h" /*---------------------------------------------------------------------------*/ EventManager::EventManager() { tptr = NULL; StartThread(); } EventManager::~EventManager() { if (tptr) tptr->stop(); } void EventManager::Push(psGameEvent *event) { lock.enter(); // This inserts the event into the tree, sorted by timestamp eventqueue.Add(event,true); lock.leave(); } void EventManager::ProcessEventQueue() { csTicks now = csGetTicks(); while (true) { BinaryTreeIterator<psGameEvent> loop(&eventqueue); psGameEvent *event = loop.First(); if (!event) // empty event queue break; if (event->triggerticks <= now) { event->Trigger(); lock.enter(); eventqueue.Delete(event); lock.leave(); } else break; } } bool EventManager::StartThread() { CS_ASSERT(tptr == NULL); tptr = task::create (thread_main, (void*) this); if (!tptr) return false; return true; } void task_proc EventManager::thread_main(void *arg) { EventManager *This=(EventManager *) arg; while (true) { This->ProcessEventQueue(); task::sleep(250); } } --- NEW FILE: eventmanager.h --- /* * eventmanager.h * * Copyright (C) 2001 PlaneShift Team (in...@pl..., * http://www.planeshift.it) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation (version 2 of the License) * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __EVENTMANAGER_H__ #define __EVENTMANAGER_H__ #include <util/binarytree.h> #include <sal/task.h> #include "util/gameevent.h" /** * This class handles all queueing and invoking of timed events, such as * combat, spells, NPC dialog responses, range weapons, or NPC respawning. * It maintains a queue ordered by trigger time and is polled by the engine * periodically to clear any queued events with trigger times less than the * current ticks time. */ class EventManager { protected: task *tptr; mutex lock; BinaryTree<psGameEvent> eventqueue; /** thread main loop */ static void task_proc thread_main(void *); /** Start the handler thread */ bool StartThread(); public: EventManager(); virtual ~EventManager(); /// Add new event to scheduler queue. void Push(psGameEvent *event); /// Check Event Queue for scheduled events which are due void ProcessEventQueue(); }; #endif |