// 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 R2_AI_WRAPPER_H
#define R2_AI_WRAPPER_H
#include
#include "nel/misc/types_nl.h"
#include "nel/misc/debug.h"
#include "nel/misc/singleton.h"
#include "nel/misc/entity_id.h"
#include "game_share/r2_share_itf.h"
#include "game_share/misc_const.h"
class CPersistentDataRecord;
namespace NLLIGO
{
class CLigoConfig;
class CPrimitives;
}
namespace NLMISC
{
class IStream;
}
namespace R2
{
// This is a virtual that is referenced in both client and server apps
// - in the client the default empty implementations of the methods are used
// - in the server the CAiWrapperServer specialization is used
class IAiWrapper
{
public:
virtual ~IAiWrapper()
{
}
virtual void init(NLLIGO::CLigoConfig * ligoConfig)
{
}
virtual void streamToPdr(NLMISC::IStream& stream, const std::string& primName, CPersistentDataRecord& pdr)
{
}
virtual void primsToPdr(NLLIGO::CPrimitives *prims, const std::string& primName, CPersistentDataRecord& pdr)
{
}
virtual void pdrToFile(CPersistentDataRecord& pdr, const std::string& pdrName)
{
}
virtual void fileToPdr(const std::string& pdrName, CPersistentDataRecord& pdr)
{
}
virtual void displayPdr( CPersistentDataRecord& pdr)
{
}
virtual void clearPdr( CPersistentDataRecord& pdr)
{
}
virtual void primitiveFileToPdr(const std::string& primitiveName, CPersistentDataRecord& pdr)
{
}
virtual void stopTest(TSessionId sessionId, uint32 aiInstance)
{
}
virtual void startTest(TSessionId sessionId, uint32 aiInstance, CPersistentDataRecord& pdr)
{
}
virtual void stopAct(TSessionId sessionId, uint32 aiInstance)
{
}
virtual void startAct(TSessionId sessionId, uint32 aiInstance, CPersistentDataRecord& pdr)
{
}
virtual void despawnEntity(NLMISC::CEntityId entityId, TAIAlias alias)
{
}
virtual void setAggroRange(NLMISC::CEntityId entityId, float range)
{
}
virtual void setHPLevel(NLMISC::CEntityId entityId, uint32 alias, float value)
{
}
virtual void setGrpHPLevel(NLMISC::CEntityId entityId, uint32 alias, float value)
{
}
virtual void startInstance(TSessionId sessionId, uint32 aiInstance)
{
}
virtual void triggerGrpEvent(NLMISC::CEntityId entityId, float eventId)
{
}
virtual void setPioneerRight(NLMISC::CEntityId clientId, const R2::TPioneerRight& right)
{
}
virtual void controlNpc(NLMISC::CEntityId clientId, NLMISC::CEntityId npc)
{
}
virtual void stopControlNpc(NLMISC::CEntityId clientId, NLMISC::CEntityId npc)
{
}
virtual void triggerUserTrigger(const std::string& groupName, uint32 triggerId)
{
}
virtual void askBotDespawnNotification(NLMISC::CEntityId creatureId, TAIAlias alias)
{
}
};
// This specialization of IAiWrapper is the true implementation of CAiWrapper for use by server apps
class CAiWrapperServer: public IAiWrapper
{
public:
void init(NLLIGO::CLigoConfig * ligoConfig);
virtual void streamToPdr(NLMISC::IStream& stream, const std::string& primName, CPersistentDataRecord& pdr);
virtual void primsToPdr(NLLIGO::CPrimitives *prims, const std::string& primName, CPersistentDataRecord& pdr);
virtual void pdrToFile(CPersistentDataRecord& pdr, const std::string& pdrName);
virtual void fileToPdr(const std::string& pdrName, CPersistentDataRecord& pdr);
virtual void displayPdr( CPersistentDataRecord& pdr);
virtual void clearPdr( CPersistentDataRecord& pdr);
virtual void primitiveFileToPdr(const std::string& primitiveName, CPersistentDataRecord& pdr);
virtual void stopTest(TSessionId sessionId, uint32 aiInstance);
virtual void startTest(TSessionId sessionId, uint32 aiInstance, CPersistentDataRecord& pdr);
virtual void stopAct(TSessionId sessionId, uint32 aiInstance);
virtual void startAct(TSessionId sessionId, uint32 aiInstance, CPersistentDataRecord& pdr);
virtual void despawnEntity(NLMISC::CEntityId entityId, TAIAlias alias);
virtual void setAggroRange(NLMISC::CEntityId entityId, float range);
virtual void setHPLevel(NLMISC::CEntityId entityId, uint32 alias, float value);
virtual void setGrpHPLevel(NLMISC::CEntityId entityId, uint32 alias, float value);
virtual void triggerGrpEvent(NLMISC::CEntityId entityId, float eventId);
virtual void startInstance(TSessionId sessionId, uint32 aiInstance);
virtual void setPioneerRight(NLMISC::CEntityId clientId, const R2::TPioneerRight& right);
virtual void controlNpc(NLMISC::CEntityId clientId, NLMISC::CEntityId npc);
virtual void stopControlNpc(NLMISC::CEntityId clientId, NLMISC::CEntityId npc);
virtual void triggerUserTrigger(const std::string& groupName, uint32 triggerId);
virtual void askBotDespawnNotification(NLMISC::CEntityId creatureId, TAIAlias alias);
};
class CAiWrapper
{
public:
static IAiWrapper& getInstance()
{
return *_instance();
}
static void setInstance(IAiWrapper* theInstance)
{
IAiWrapper*& inst= _instance();
delete inst;
inst= theInstance;
}
private:
// implementation of a singleton variable
static IAiWrapper*& _instance()
{
static IAiWrapper* inst= NULL;
if (inst==NULL)
inst= new IAiWrapper;
return inst;
}
};
} // namespace R2
#endif