1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
// Cyphesis Online RPG Server and AI Engine
// Copyright (C) 2000-2004 Alistair Riddoch
//
// 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; either version 2 of the License, or
// (at your option) any later version.
//
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
// $Id: BaseWorld.h,v 1.52 2008-01-13 01:32:54 alriddoch Exp $
#ifndef COMMON_BASE_WORLD_H
#define COMMON_BASE_WORLD_H
#include "globals.h"
#include "physics/Vector3D.h"
#include <Atlas/Message/Element.h>
#include <Atlas/Objects/ObjectsFwd.h>
#include <sigc++/signal.h>
#include <cassert>
class Character;
class Entity;
class LocatedEntity;
class Task;
typedef std::map<long, Entity *> EntityDict;
/// \brief Base class for game world manager object.
///
/// This base class provides the common features required by cyphesis
/// for the object which encapsulates the game world. Other classes
/// inherit from this provide the core game world system.
class BaseWorld {
private:
/// \brief Copy constructor private and un-implemented to prevent slicing
BaseWorld(const BaseWorld &);
/// \brief Assignment operator private and un-implemented to prevent slicing
const BaseWorld & operator=(const BaseWorld &);
/// \brief Singleton instance pointer for the World manager object.
static BaseWorld * m_instance;
protected:
/// \brief The in-game time in seconds.
///
/// Calculated from the out-of-game time by applying an offset stored
/// at startup
double m_realTime;
/// \brief Dictionary of all the objects in the world.
///
/// Pointers to all in-game entities in the world are stored keyed to
/// their integer ID.
EntityDict m_eobjects;
explicit BaseWorld(Entity &);
public:
/// \brief The top level in-game entity in the world.
Entity & m_gameWorld;
virtual ~BaseWorld();
/// \brief Singleton accessor for the World manager object.
static BaseWorld & instance() {
return *m_instance;
}
Entity * getEntity(const std::string & id) const;
/// \brief Get an in-game Entity by its integer ID.
///
/// @param id integer ID of Entity to be retrieved.
/// @return pointer to Entity retrieved, or zero if it was not found.
Entity * getEntity(long id) const {
EntityDict::const_iterator I = m_eobjects.find(id);
if (I != m_eobjects.end()) {
assert(I->second != 0);
return I->second;
} else {
return 0;
}
}
/// \brief Read only accessor for the in-game objects dictionary.
const EntityDict & getEntities() const {
return m_eobjects;
}
/// \brief Read only accessor for the in-game time.
const double & getTime() const {
return m_realTime;
}
/// \brief Get the time the world has been running since the server started.
const double upTime() const {
return m_realTime - timeoffset;
}
/// \brief Main world loop function.
virtual bool idle(int, int) = 0;
/// \brief Add a new entity to the world.
virtual Entity * addEntity(Entity * obj, bool setup = true) = 0;
/// \brief Create a new entity and add to the world.
virtual Entity * addNewEntity(const std::string &,
const Atlas::Objects::Entity::RootEntity &) = 0;
/// \brief Create a new task
virtual Task * newTask(const std::string &, Character &) = 0;
/// \brief Activate a new tast
virtual Task * activateTask(const std::string &, const std::string &,
const std::string &, Character &) = 0;
/// \brief Pass an operation to the world.
virtual void message(const Atlas::Objects::Operation::RootOperation &,
Entity & obj) = 0;
/// \brief Find an entity of the given name.
virtual Entity * findByName(const std::string & name) = 0;
/// \brief Find an entity of the given type.
virtual Entity * findByType(const std::string & type) = 0;
/// \brief Provide an adjusted height for the given entity.
virtual float constrainHeight(LocatedEntity *, const Point3D &,
const std::string &) = 0;
/// \brief Add an entity provided to the list of perceptive entities.
virtual void addPerceptive(Entity *) = 0;
/// \brief Signal that an operation is being dispatched.
sigc::signal<void, Atlas::Objects::Operation::RootOperation> Dispatching;
};
#endif // COMMON_BASE_WORLD_H
|