khanat-opennel-code/code/ryzom/server/src/frontend_service/vision_provider.h
2011-08-02 08:18:50 -05:00

208 lines
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_VISION_PROVIDER_H
#define NL_VISION_PROVIDER_H
#include "nel/misc/types_nl.h"
#include "fe_types.h"
#include "game_share/ryzom_entity_id.h"
#include "processing_spreader.h"
#include "client_entity_id_translator.h"
#include "vision_receiver.h"
/*
* Forward declarations
*/
class CVisionArray;
class CHistory;
class CClientHost;
class CPropertyIdTranslator;
class CClientIdLookup;
/*
* Container for pending new pairs
*/
/*struct TPairClientEntity
{
TPairClientEntity() : ClientId(INVALID_CLIENT), SeenEntity() {}
TPairClientEntity( TClientId clientid, TEntityIndex entityindex )
{
ClientId = clientid;
SeenEntity = entityindex;
}
friend bool operator==( const TPairClientEntity& e1, const TPairClientEntity& e2 )
{
return (e1.ClientId == e2.ClientId) && (e1.SeenEntity == e2.SeenEntity );
}
TClientId ClientId;
TEntityIndex SeenEntity;
};*/
/*
* Container for items of observer set
* <ClientId, observer entity slot>
*/
/*struct TPairClientSlot
{
// Default constructor
TPairClientSlot() : ClientId(INVALID_CLIENT), Slot(0) {}
TPairClientSlot( TClientId clientid, CLFECOMMON::TCLEntityId slot )
{
ClientId = clientid;
Slot = slot;
}
// Comparison operator
friend bool operator==( const TPairClientSlot& e1, const TPairClientSlot& e2 )
{
return (e1.ClientId == e2.ClientId) && (e1.Slot == e2.Slot );
}
// Hash function: ClientId * 256 + CeId
struct CHash
{
size_t operator() ( TPairClientSlot pair ) const { return (pair.ClientId << 8) + pair.Slot; }
};
TClientId ClientId;
CLFECOMMON::TCLEntityId Slot;
};*/
//typedef std::hash_set<TPairClientSlot, TPairClientSlot::CHash > TObserverList;
/*struct TPairClientSlotWithReplace : public TPairClientSlot
{
TPairClientSlotWithReplace( bool replace=false ) :
TPairClientSlot(), Replace(replace) {}
TPairClientSlotWithReplace( TClientId clientid, CLFECOMMON::TCLEntityId slot, bool replace=false ) :
TPairClientSlot( clientid, slot ), Replace(replace) {}
bool Replace;
};*/
/**
* Vision Provider.
* It checks the differences in the vision (coming from the back-end)
* and decides if a new declared entity will be seen by a client.
*
* \author Olivier Cado
* \author Nevrax France
* \date 2002
*/
class CVisionProvider
{
public:
/// Constructor
CVisionProvider();
/// Destructor
~CVisionProvider();
// _______________________________
// For the priority subsystem root
/// Initialization
void init( CVisionArray *va, CHistory *h, CClientIdLookup *cl );
/// Process the vision differences
void processVision();
// Return the observer list for displaying
//const TObserverList& observerList( const TEntityIndex& entityindex ) const { return _ObserverList[entityindex]; }
// _________________________
// For the receive subsystem
// Remove item from observer list of entityindex
//void removeFromObserverList( TEntityIndex entityindex, TClientId clientid, CLFECOMMON::TCLEntityId ceid );
/// Reset all slots of all clients (e.g. when GPMS falls down)
void resetVision();
/// Reset all slots of one client (e.g. when a client is unspawned)
void resetVision( CClientHost *clienthost );
/// Display the properties of an entity in the vision
void displayEntityInfo( const CEntity& e, const TEntityIndex& entityIndex, NLMISC::CLog *log = NLMISC::InfoLog ) const;
/// Reset assoc/disas counters
void resetAssocCounter();
/// Display assoc/disas freqs
void displayAssocFreqs(NLMISC::CLog *log = NLMISC::InfoLog);
///
void postRemovePair( TClientId clientid, CLFECOMMON::TCLEntityId slot );
uint32 AssocCounter;
uint32 DisasCounter;
NLMISC::TTime AssocStartTime;
CProcessingSpreader DistanceSpreader;
protected:
/// Remove a pair. The client id cannot be INVALID_CLIENT
void removePair( TClientId clientid, CLFECOMMON::TCLEntityId slot );
/// Add a pair. The argument 'furthestceid' is used when removing an item is required.
bool addPair( TClientId clientid, const TEntityIndex& entityindex, CLFECOMMON::TCLEntityId slot );
/// Replace the entity in a slot (e.g. when transforming a dead character to a sack)
void replacePair( TClientId clientid, const TEntityIndex& newEntityIndex, CLFECOMMON::TCLEntityId slot );
/// Easy access to the client host object. Return NULL and makes warning if not found.
static CClientHost *clientHost( TClientId clientid );
/// Calculate the absolute distance between a client and an entity
CLFECOMMON::TCoord calcDistance( CClientHost *client, CLFECOMMON::TCLEntityId slot, const TEntityIndex& seenIndex );
private:
/// Entities seen by the clients and the priorities of their properties
CVisionArray *_VisionArray;
/// History
CHistory *_History;
/// Entity to client
CClientIdLookup *_EntityToClient;
// Lists of clients who can see the entities, indexed by TEntityIndex (corresponding to the frontend property receiver)
// NOT NEEDED in the new prioritization method
//TObserverList _ObserverList[MAX_NB_ENTITIES];
CVisionReceiver _VisionReceiver;
};
#endif // NL_VISION_PROVIDER_H
/* End of vision_provider.h */