// Ryzom - MMORPG Framework // 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 . #ifndef CL_STAGE_H #define CL_STAGE_H ///////////// // INCLUDE // ///////////// #include "nel/misc/types_nl.h" #include "nel/misc/time_nl.h" #include "nel/misc/stream.h" /////////// // CLASS // /////////// /** * Class to manage a character. * \author Guillaume PUZIN * \author Nevrax France * \date 2001 */ class CStage : public NLMISC::IStreamable { public: typedef std::map TStage; private: double _Time; TStage _Stage; NLMISC::TGameCycle _PredictedInterval; sint32 _LCTImpact; // 0..256 public: NLMISC_DECLARE_CLASS(CStage); /// Constructor. CStage(); /// Return "true" is the stage is empty. bool empty() const {return _Stage.empty();} /** * Method to know if a property is present in the Stage. * \param prop : the property to check. * \return bool : 'true' if the property is present in the Stage. */ bool isPresent(uint prop) const {return (_Stage.find(prop) != _Stage.end());} /** * Add a property in the stage(and may replace the old one if wanted). * \param property : property to add. * \param value : value of the property. * \param replace : 'true' to replace the old property if there is one. */ void addProperty(uint property, sint64 value, bool replace); /** Remove the selected property from the stage. * \param property : property to remove from this stage. */ void removeProperty(uint property); /** * Return a pair according to the property asked. First element (the bool), indicate if the value (second element) is valid. * \param uint prop : property asked (to get its value). * \return pair : '.first' == 'true' if the property exist so value is valid. '.second' is the value if '.first' == 'true'. */ std::pair property(uint prop) const; const TStage &getStage() const {return _Stage;} TStage &getStage() {return _Stage;} const double &time() const {return _Time;} void time(const double &t) {_Time = t;} /** \name PREDICTED INTERVAL * The next position update should arrive before PredictedInterval. */ //@{ /// Get the Predicted Interval. const NLMISC::TGameCycle &predictedInterval() const {return _PredictedInterval;} /// Set the Predicted Interval. void predictedInterval(const NLMISC::TGameCycle &pI) {if(pI != 0) _PredictedInterval = pI;} //@} /** Get the position in the stage or return false. * \param pos : will be filled with the position or left untouched. * \return bool : true if pos has been filled. */ bool getPos(NLMISC::CVectorD &pos) const; /** LCTImpact (0..256) (used by CCharacterCL::updateStages()) * It is used to remove the LCT for stages without POS (with some restrictions). * To avoid pop or stages skipped, the LCT impact is smoothly reduced * with time (see CCharacterCL::updateStages()) */ void setLCTImpact(sint32 lcti) {_LCTImpact= lcti;} sint32 getLCTImpact() const {return _LCTImpact;} /// Serialize entities. virtual void serial(class NLMISC::IStream &f) throw(NLMISC::EStream); }; /** * Class to manage a character. * \author Guillaume PUZIN * \author Nevrax France * \date 2001 */ class CStageSet : public NLMISC::IStreamable { public: typedef std::map TStageSet; TStageSet _StageSet; public: NLMISC_DECLARE_CLASS(CStageSet); /** * Try to add a new property for the stage corresponding to the Game Cycle. * May also add a new stage if there is no stage for the Game Cycle. * \warning If the property already exist, this method does not change the value. * \warning If the Game Cycle is before the first element, this method do not try to add a stage but will try to add a property to the first one. * \param TGameCycle gameCycle : This is the Key for the stage to search where to add the property. * \param uint property : property to add. * \param uint64 value : value of the property. * \param predictedI : predicted interval in tick before the next position update. * \return CStage * : pointer on the stage or 0. */ CStage *addStage(NLMISC::TGameCycle gameCycle, uint property, sint64 value); CStage *addStage(NLMISC::TGameCycle gameCycle, uint property, sint64 value, NLMISC::TGameCycle predictedI); /// Serialize entities. virtual void serial(class NLMISC::IStream &f) throw(NLMISC::EStream); /// Remove ¨Positions except for those with a mode. void removePosWithNoMode(); }; #endif // CL_STAGE_H /* End of stage.h */