351 lines
8.6 KiB
C++
351 lines
8.6 KiB
C++
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
|
// Copyright (C) 2010 Winch Gate Property Limited
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as
|
|
// published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
#ifndef NL_REYNOLDS_MANAGER_H
|
|
#define NL_REYNOLDS_MANAGER_H
|
|
|
|
// NeL
|
|
#include "nel/misc/types_nl.h"
|
|
#include "nel/misc/smart_ptr.h"
|
|
|
|
#include "nel/georges/u_form.h"
|
|
#include "nel/georges/u_form_elm.h"
|
|
|
|
// Game share
|
|
#include "game_share/continent_container.h"
|
|
|
|
// ReynoldsLib
|
|
#include "track.h"
|
|
|
|
// Stl
|
|
#include <map>
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Track manager
|
|
* \author Benjamin Legros
|
|
* \author Nevrax France
|
|
* \date 2002
|
|
*/
|
|
class CReynoldsManager
|
|
{
|
|
friend CTrack::~CTrack();
|
|
|
|
public:
|
|
|
|
/**
|
|
* User Motion controlled Callback type
|
|
* \param track is the base track
|
|
*/
|
|
typedef void (*TUserCallback) (CTrackBase *track);
|
|
|
|
/**
|
|
* User Motion Callback type
|
|
* Called each time a controlled track is updated
|
|
* \param track is the base track
|
|
* \param motion is the current motion to be applied -- WARNING do not crash this value, only add or substract value to it
|
|
*/
|
|
typedef void (*TUserMotionCallback) (CTrackBase *track, NLMISC::CVectorD &motion);
|
|
|
|
|
|
/// The command interface
|
|
class ICommandInterface
|
|
{
|
|
public:
|
|
/**
|
|
* Called when manager needs a sheet for an entity.
|
|
* Reply using setSheet(CEntityId)
|
|
*/
|
|
virtual void requestSheet(const NLMISC::CEntityId &id) = 0;
|
|
|
|
/**
|
|
* Called when manager needs a position for an entity.
|
|
* Reply using setPosition(CEntityId)
|
|
*/
|
|
virtual void requestPosition(const NLMISC::CEntityId &id) = 0;
|
|
|
|
/**
|
|
* Called when manager needs a position to be updated evently
|
|
* Reply using setPosition(CEntityId) evently
|
|
*/
|
|
virtual void requestPositionUpdates(const NLMISC::CEntityId &id) = 0;
|
|
|
|
/**
|
|
* Called when manager doesn't need more position updates
|
|
*/
|
|
virtual void unrequestPositionUpdates(const NLMISC::CEntityId &id) = 0;
|
|
|
|
/**
|
|
* Called when manager needs an entity vision to be updated evently
|
|
* Reply using setVision() evently
|
|
*/
|
|
virtual void requestVision(const NLMISC::CEntityId &id) = 0;
|
|
|
|
/**
|
|
* Called when manager doesn't need more entity vision updates
|
|
*/
|
|
virtual void unrequestVision(const NLMISC::CEntityId &id) = 0;
|
|
|
|
/**
|
|
* Called when a track position is updated
|
|
*/
|
|
virtual void updatePosition(const NLMISC::CEntityId &id, const NLMISC::CVectorD &position, float &heading) = 0;
|
|
|
|
/**
|
|
* Called when track state changed
|
|
*/
|
|
virtual void stateChanged(const NLMISC::CEntityId &id, CTrackBase::TTrackState state) = 0;
|
|
|
|
/**
|
|
* Called when manager leave control of an entity
|
|
*/
|
|
virtual void stopTrack(const NLMISC::CEntityId &id) = 0;
|
|
};
|
|
|
|
public:
|
|
|
|
/// @name Reynolds Manager inits/update/release
|
|
//@{
|
|
|
|
/// Init
|
|
static void init(const std::string &packSheetFile = "reynolds.packed_sheets");
|
|
|
|
|
|
/// Load continent
|
|
static void loadContinent(const std::string &name, const std::string &file, sint index);
|
|
|
|
/// Set Sheet request callback
|
|
static void setCommandInterface(ICommandInterface *commandInterface) { _CommandInterface = commandInterface; }
|
|
|
|
/// Set User init callback
|
|
static void setUserInitCallback(TUserCallback cb) { _UserInitCallback = cb; }
|
|
|
|
/// Set User motion callback
|
|
static void setUserMotionCallback(TUserMotionCallback cb) { _UserMotionCallback = cb; }
|
|
|
|
/// Set User release callback
|
|
static void setUserReleaseCallback(TUserCallback cb) { _UserReleaseCallback = cb; }
|
|
|
|
/// Update
|
|
static void update(double dt = 0.1);
|
|
|
|
|
|
/// Release
|
|
static void release();
|
|
|
|
//@}
|
|
|
|
|
|
|
|
|
|
/// @name Control methods over tracks
|
|
//@{
|
|
|
|
/// Follow
|
|
static void follow(const NLMISC::CEntityId &entity, const NLMISC::CEntityId &target);
|
|
|
|
/// Go to
|
|
static void goTo(const NLMISC::CEntityId &entity, const NLMISC::CVectorD &position);
|
|
|
|
/// Stop
|
|
static void leaveMove(const NLMISC::CEntityId &entity);
|
|
|
|
/// Destroy a track
|
|
static void destroy(const NLMISC::CEntityId &entity);
|
|
|
|
//@}
|
|
|
|
|
|
|
|
|
|
/// @name Tracks requests and state towards interface
|
|
//@{
|
|
|
|
/// Request Sheet
|
|
static void requestSheet(const NLMISC::CEntityId &entity);
|
|
|
|
/// Request Position
|
|
static void requestPosition(const NLMISC::CEntityId &entity);
|
|
|
|
/// Request Position Updates
|
|
static void requestPositionUpdates(const NLMISC::CEntityId &entity);
|
|
|
|
/// Unrequest Position Updates
|
|
static void unrequestPositionUpdates(const NLMISC::CEntityId &entity);
|
|
|
|
/// Request Vision
|
|
static void requestVision(const NLMISC::CEntityId &entity);
|
|
|
|
/// Unrequest Vision
|
|
static void unrequestVision(const NLMISC::CEntityId &entity);
|
|
|
|
/// Track stopped following
|
|
static void trackStop(CTrack *track);
|
|
|
|
/// Updated position
|
|
static void updatedPosition(const NLMISC::CEntityId &entity, const NLMISC::CVectorD &position, float heading);
|
|
|
|
/// Updated state
|
|
static void stateChanged(const NLMISC::CEntityId &entity, CTrackBase::TTrackState state);
|
|
|
|
|
|
|
|
/// User init
|
|
static void initUserMotion(CTrack *track)
|
|
{
|
|
if (_UserInitCallback != NULL)
|
|
_UserInitCallback((CTrackBase*)track);
|
|
}
|
|
|
|
/// User move
|
|
static void applyUserMotion(CTrack *track, NLMISC::CVectorD &motion)
|
|
{
|
|
if (_UserMotionCallback != NULL)
|
|
_UserMotionCallback((CTrackBase*)track, motion);
|
|
}
|
|
|
|
/// User release
|
|
static void releaseUserMotion(CTrack *track)
|
|
{
|
|
if (_UserReleaseCallback != NULL)
|
|
_UserReleaseCallback((CTrackBase*)track);
|
|
}
|
|
|
|
|
|
|
|
/// Create Move primitive
|
|
static void createMovePrimitive(const NLMISC::CVectorD &pos, NLPACS::UMovePrimitive *&primitive, NLPACS::UMoveContainer *&container);
|
|
|
|
/// Lookup a sheet
|
|
static const CTrack::CSheet *lookup(const NLMISC::CSheetId &sheet);
|
|
|
|
//@}
|
|
|
|
|
|
|
|
|
|
/// @name Answers to tracks requests
|
|
//@{
|
|
|
|
/// Set Sheet
|
|
static void setSheet(const NLMISC::CEntityId &id, const NLMISC::CSheetId &sheet);
|
|
|
|
/// Set Position
|
|
static void setPosition(const NLMISC::CEntityId &id, const NLMISC::CVectorD &position, float heading);
|
|
|
|
/// Update Vision
|
|
static void setVision(const NLMISC::CEntityId &id, const std::vector<NLMISC::CEntityId> &in, const std::vector<NLMISC::CEntityId> &out);
|
|
|
|
/// Update Vision
|
|
static void setVision(const NLMISC::CEntityId &id, const std::vector<NLMISC::CEntityId> &vision);
|
|
|
|
/// Get a track
|
|
static CTrack *getTrack(const NLMISC::CEntityId &entity)
|
|
{
|
|
TTrackMap::iterator it = _TrackMap.find(entity);
|
|
return (it == _TrackMap.end()) ? NULL : (*it).second;
|
|
}
|
|
|
|
/// Get cycle
|
|
static uint32 getCycle() { return _Cycle; }
|
|
|
|
//@}
|
|
|
|
|
|
|
|
|
|
/// Create a non controlled track, referenced in _TrackMap
|
|
static CTrack *createTrack(const NLMISC::CEntityId &entity);
|
|
|
|
|
|
protected:
|
|
|
|
/// Constructor. Not to be used.
|
|
CReynoldsManager();
|
|
|
|
/// Remove a track from the whole map -- only called by the CTrack destructor
|
|
static void removeTrackFromMap(const NLMISC::CEntityId &entity);
|
|
|
|
/// Checks interface is ok
|
|
static bool checkInterface()
|
|
{
|
|
if (_CommandInterface == NULL)
|
|
{
|
|
nlwarning("CReynoldsLib:checkInterface(): CommandInterface not set");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/// Init sheets
|
|
static void initSheets(const std::string &packSheetFilnamePrefix);
|
|
|
|
|
|
protected:
|
|
|
|
/// Whole track container
|
|
typedef std::map<NLMISC::CEntityId, CTrack* > TTrackMap;
|
|
|
|
/// Only controlled track container
|
|
typedef std::map<NLMISC::CEntityId, NLMISC::CSmartPtr<CTrack> > TControlledTrackMap;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
/// Continents
|
|
static CContinentContainer _Continents;
|
|
|
|
/// Track Map, all tracks referenced, held by a simple pointer so when no one references a track, it is deleted
|
|
static TTrackMap _TrackMap;
|
|
|
|
/// Controlled Track Map, only controlled tracks, held by a smart pointer
|
|
static TControlledTrackMap _ControlledTrackMap;
|
|
|
|
|
|
/// Georges sheets
|
|
static std::map<NLMISC::CSheetId, CTrack::CSheet> _Sheets;
|
|
|
|
/// Sheets initialised ?
|
|
static bool _Initialised;
|
|
|
|
|
|
/// Command interface
|
|
static ICommandInterface *_CommandInterface;
|
|
|
|
/// User init callback
|
|
static TUserCallback _UserInitCallback;
|
|
|
|
/// User motion callback
|
|
static TUserMotionCallback _UserMotionCallback;
|
|
|
|
/// User release callback
|
|
static TUserCallback _UserReleaseCallback;
|
|
|
|
|
|
/// Current internal cycle
|
|
static uint32 _Cycle;
|
|
};
|
|
|
|
|
|
#endif // NL_REYNOLDS_MANAGER_H
|
|
|
|
/* End of reynolds_manager.h */
|