Merge branch 'fixes'

feature/prepare-cross-merge
Ulukyn 4 years ago committed by kaetemi
parent 578ae687df
commit 72d29ef8f6
No known key found for this signature in database
GPG Key ID: 9873C4D40BB479BC

@ -42,6 +42,8 @@ using namespace RYAI_MAP_CRUNCH;
static bool VerboseLog = false; static bool VerboseLog = false;
#define LOG if (!VerboseLog) { } else nlinfo #define LOG if (!VerboseLog) { } else nlinfo
extern CAIVector randomPos(double dispersionRadius);
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// CSpawnBotNpc // // CSpawnBotNpc //
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
@ -1151,6 +1153,7 @@ void CBotNpc::init()
{ {
_ChatProfile = NULL; _ChatProfile = NULL;
_MaxHitRangeForPC = -1.0f; _MaxHitRangeForPC = -1.0f;
_DispersionRadius = 0;
// _MissionIconFlags.IsMissionStepIconDisplayable = true; // _MissionIconFlags.IsMissionStepIconDisplayable = true;
// _MissionIconFlags.IsMissionGiverIconDisplayable = true; // _MissionIconFlags.IsMissionGiverIconDisplayable = true;
@ -1169,7 +1172,24 @@ CSpawnBotNpc const* CBotNpc::getSpawn() const
void CBotNpc::getSpawnPos(CAIVector& triedPos, RYAI_MAP_CRUNCH::CWorldPosition& pos, RYAI_MAP_CRUNCH::CWorldMap const& worldMap, CAngle& spawnTheta) void CBotNpc::getSpawnPos(CAIVector& triedPos, RYAI_MAP_CRUNCH::CWorldPosition& pos, RYAI_MAP_CRUNCH::CWorldMap const& worldMap, CAngle& spawnTheta)
{ {
if (_StartPos.isNull()) if (_DispersionRadius > 0)
{
RYAI_MAP_CRUNCH::CWorldPosition wp;
CAIVector rpos = _FirstPosition;
uint32 maxTries = 100;
do
{
rpos = _FirstPosition;
rpos += randomPos(_DispersionRadius);
--maxTries;
}
while (!worldMap.setWorldPosition(AITYPES::vp_auto, wp, rpos) && maxTries>0);
if (maxTries > 0 ) {
nlinfo("set pos %f,%f", rpos.x().asDouble(), rpos.x().asDouble());
_StartPos.setXY(rpos);
}
}
else if (_StartPos.isNull())
calcSpawnPos(worldMap); calcSpawnPos(worldMap);
if (isStuck() || IsRingShard) if (isStuck() || IsRingShard)

@ -255,6 +255,8 @@ public:
void setVisualProperties(std::string input); void setVisualProperties(std::string input);
inline void saveFirstPosition(CAIVector pos, uint8 value) { _FirstPosition = pos, _DispersionRadius = value; }
inline void setMaxHitRangeForPlayer(float maxHitRange) { _MaxHitRangeForPC = maxHitRange; } inline void setMaxHitRangeForPlayer(float maxHitRange) { _MaxHitRangeForPC = maxHitRange; }
// void setMissionStepIconHidden(bool hide) { _MissionIconFlags.IsMissionStepIconDisplayable = !hide; } // void setMissionStepIconHidden(bool hide) { _MissionIconFlags.IsMissionStepIconDisplayable = !hide; }
// void setMissionGiverIconHidden(bool hide) { _MissionIconFlags.IsMissionGiverIconDisplayable = !hide; } // void setMissionGiverIconHidden(bool hide) { _MissionIconFlags.IsMissionGiverIconDisplayable = !hide; }
@ -343,6 +345,8 @@ protected:
// spawn place ------------------------------- // spawn place -------------------------------
CAIPos _StartPos; CAIPos _StartPos;
CAIVector _FirstPosition;
uint8 _DispersionRadius;
std::vector<NLMISC::CSheetId> _LootList; std::vector<NLMISC::CSheetId> _LootList;

@ -218,6 +218,7 @@ void CAIInstance::initInstance(string const& continentName, uint32 instanceNumbe
_LastSpawnAlias = (900 + _InstanceNumber) << LigoConfig.getDynamicAliasSize(); _LastSpawnAlias = (900 + _InstanceNumber) << LigoConfig.getDynamicAliasSize();
_LastStateAlias = 0; _LastStateAlias = 0;
_LastGroupAlias = (900 + _InstanceNumber) << LigoConfig.getDynamicAliasSize();
sendInstanceInfoToEGS(); sendInstanceInfoToEGS();
@ -344,9 +345,10 @@ CGroup* CAIInstance::findGroup(uint32 alias)
void CAIInstance::findGroup(std::vector<CGroup*>& result, std::string const& name) void CAIInstance::findGroup(std::vector<CGroup*>& result, std::string const& name)
{ {
std::map<std::string, std::vector<NLMISC::CDbgPtr<CGroup> > >::iterator it(_GroupFromNames.find(name)); std::map<std::string, std::vector<NLMISC::CDbgPtr<CGroup> > >::iterator it(_GroupFromNames.find(name));
if (it != _GroupFromNames.end()) if (it != _GroupFromNames.end()) {
result.insert(result.end(), it->second.begin(), it->second.end()); result.insert(result.end(), it->second.begin(), it->second.end());
} }
}
void CAIInstance::addMissionInfo(std::string const& missionName, uint32 alias) void CAIInstance::addMissionInfo(std::string const& missionName, uint32 alias)
{ {
@ -647,8 +649,9 @@ std::vector<std::string> CAIInstance::getMultiLineInfoString() const
#include "ai_bot_npc.h" #include "ai_bot_npc.h"
#include "ai_profile_npc.h" #include "ai_profile_npc.h"
inline extern CAIVector randomPos(double dispersionRadius);
static CAIVector randomPos(double dispersionRadius)
CAIVector randomPos(double dispersionRadius)
{ {
if (dispersionRadius<=0.) if (dispersionRadius<=0.)
{ {
@ -684,14 +687,15 @@ CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const&
return NULL; return NULL;
} }
_LastGroupAlias++;
string name = botsName.empty() ? NLMISC::toString("event_group_%u", _LastGroupAlias):botsName;
// Create a group // Create a group
CGroupNpc* grp = new CGroupNpc(_EventNpcManager, NULL, RYAI_MAP_CRUNCH::Nothing); CGroupNpc* grp = new CGroupNpc(_EventNpcManager, _LastGroupAlias, name, RYAI_MAP_CRUNCH::Nothing);
// Register it in the manager // Register it in the manager
_EventNpcManager->groups().addAliasChild(grp); _EventNpcManager->groups().addAliasChild(grp);
// Set the group parameters // Set the group parameters
grp->setAutoSpawn(false); grp->setAutoSpawn(false);
string name = botsName.empty() ? NLMISC::toString("event_group_%u", grp->getChildIndex()):botsName;
grp->setName(name); grp->setName(name);
grp->clearParameters(); grp->clearParameters();
@ -727,9 +731,17 @@ CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const&
nlinfo("Stucked !"); nlinfo("Stucked !");
bot->setStuck(true); bot->setStuck(true);
} }
float angle = 0.f;
if (orientation < (NLMISC::Pi * 2.0) && orientation > (-NLMISC::Pi * 2.0))
angle = (float)orientation;
else
angle = randomAngle();
// Spawn all randomly except if only 1 bot // Spawn all randomly except if only 1 bot
if (nbBots > 1) if (nbBots > 1 || dispersionRadius > 1)
{ {
bot->saveFirstPosition(pos, dispersionRadius);
RYAI_MAP_CRUNCH::CWorldMap const& worldMap = CWorldContainer::getWorldMap(); RYAI_MAP_CRUNCH::CWorldMap const& worldMap = CWorldContainer::getWorldMap();
RYAI_MAP_CRUNCH::CWorldPosition wp; RYAI_MAP_CRUNCH::CWorldPosition wp;
uint32 maxTries = 100; uint32 maxTries = 100;
@ -742,14 +754,10 @@ CGroupNpc* CAIInstance::eventCreateNpcGroup(uint nbBots, NLMISC::CSheetId const&
while (!worldMap.setWorldPosition(AITYPES::vp_auto, wp, rpos) && maxTries>0); while (!worldMap.setWorldPosition(AITYPES::vp_auto, wp, rpos) && maxTries>0);
if (maxTries<=0) if (maxTries<=0)
rpos = pos; rpos = pos;
}
float angle = 0.f; bot->setStartPos(pos.x().asDouble(), pos.y().asDouble(), angle, AITYPES::vp_auto);
if (orientation < (NLMISC::Pi * 2.0) && orientation > (-NLMISC::Pi * 2.0)) }
angle = (float)orientation;
else else
angle = randomAngle();
bot->setStartPos(rpos.x().asDouble(),rpos.y().asDouble(), angle, AITYPES::vp_auto); bot->setStartPos(rpos.x().asDouble(),rpos.y().asDouble(), angle, AITYPES::vp_auto);
} }
} }

@ -246,6 +246,7 @@ private:
/// event npc Manager. /// event npc Manager.
CMgrNpc* _EventNpcManager; CMgrNpc* _EventNpcManager;
uint32 _LastGroupAlias;
uint32 _LastSpawnAlias; uint32 _LastSpawnAlias;
uint32 _LastStateAlias; uint32 _LastStateAlias;

@ -3926,7 +3926,21 @@ void CGrpProfileFaction::checkTargetsAround()
const uint32 playerRadius=assistPlayers||attackPlayers?thisGrpNpc._AggroRange:0; const uint32 playerRadius=assistPlayers||attackPlayers?thisGrpNpc._AggroRange:0;
const uint32 botRadius=assistBots||attackBots?thisGrpNpc._AggroRange:0; const uint32 botRadius=assistBots||attackBots?thisGrpNpc._AggroRange:0;
Vision.updateBotsAndPlayers(thisGrpNpc.getAIInstance(), centerPos, playerRadius, botRadius); CCont<CBot >::iterator itBot=_Grp->bots().begin();
uint32 cellValue = 0;
CBot* bot = *itBot;
if (bot)
{
CSpawnBot* spawnBot = bot->getSpawnObj();
if (spawnBot)
{
CMirrorPropValueRO<uint32> cell( TheDataset, spawnBot->dataSetRow(), DSPropertyCELL );
cellValue = cell();
} else
nlinfo("BOT NOT SPAWN TO GET CELL");
}
Vision.updateBotsAndPlayers(thisGrpNpc.getAIInstance(), centerPos, playerRadius, botRadius, cellValue);
} }
// Assist players // Assist players

@ -54,11 +54,11 @@ public:
virtual ~CAIVision() {} virtual ~CAIVision() {}
template <class VectorClass> template <class VectorClass>
void updateBotsAndPlayers(CAIInstance *aii, const VectorClass &xy,uint32 playerRadiusInMeters,uint32 botRadiusInMeters) void updateBotsAndPlayers(CAIInstance *aii, const VectorClass &xy,uint32 playerRadiusInMeters,uint32 botRadiusInMeters, uint32 cell=0)
{ {
// _lastUpdate=CTimeInterface::gameCycle(); // _lastUpdate=CTimeInterface::gameCycle();
updatePlayers(aii, xy, playerRadiusInMeters); updatePlayers(aii, xy, playerRadiusInMeters, cell);
updateBots(aii, xy, botRadiusInMeters); updateBots(aii, xy, botRadiusInMeters, cell);
} }
void clear () void clear ()
@ -191,7 +191,7 @@ private:
template <class VectorClass> template <class VectorClass>
void updateBots(CAIInstance *aii, const VectorClass &xy,uint32 botRadiusInMeters) void updateBots(CAIInstance *aii, const VectorClass &xy, uint32 botRadiusInMeters, uint32 cell)
{ {
H_AUTO(VisionUpdateBots); H_AUTO(VisionUpdateBots);
@ -211,7 +211,9 @@ private:
for (it = aii->botMatrix().beginEntities(tbl,xy); !it.end(); ++it) for (it = aii->botMatrix().beginEntities(tbl,xy); !it.end(); ++it)
{ {
CAIEntityPhysical const* phys = const_cast<T*>(&*it)->getSpawnObj(); CAIEntityPhysical const* phys = const_cast<T*>(&*it)->getSpawnObj();
if (phys && phys->aipos().quickDistTo(aiVectorXy) < botRadiusInMeters)
CMirrorPropValueRO<uint32> botCell( TheDataset, phys->dataSetRow(), DSPropertyCELL );
if ((cell >= 0 || botCell() == cell) && phys && phys->aipos().quickDistTo(aiVectorXy) < botRadiusInMeters)
{ {
_bots.push_back(const_cast<T*>(&*it)); _bots.push_back(const_cast<T*>(&*it));
} }
@ -219,7 +221,7 @@ private:
} }
template <class VectorClass> template <class VectorClass>
void updatePlayers(CAIInstance *aii, const VectorClass &xy,uint32 playerRadiusInMeters) void updatePlayers(CAIInstance *aii, const VectorClass &xy, uint32 playerRadiusInMeters, uint32 cell = 0)
{ {
H_AUTO(VisionUpdatePlayers); H_AUTO(VisionUpdatePlayers);
@ -238,10 +240,8 @@ private:
for (it = aii->playerMatrix().beginEntities(tbl,xy); !it.end(); ++it) for (it = aii->playerMatrix().beginEntities(tbl,xy); !it.end(); ++it)
{ {
CAIEntityPhysical const* phys = const_cast<T*>(&*it)->getSpawnObj(); CAIEntityPhysical const* phys = const_cast<T*>(&*it)->getSpawnObj();
CMirrorPropValueRO<uint32> botCell( TheDataset, phys->dataSetRow(), DSPropertyCELL );
CMirrorPropValueRO<uint32> cell( TheDataset, phys->dataSetRow(), DSPropertyCELL ); if ((cell >= 0 || botCell() == cell) && phys && phys->aipos().quickDistTo(aiVectorXy) < playerRadiusInMeters)
if (phys && phys->aipos().quickDistTo(aiVectorXy) < playerRadiusInMeters)
{ {
_players.push_back(const_cast<T*>(&*it)); _players.push_back(const_cast<T*>(&*it));
} }

@ -1145,7 +1145,7 @@ void sAggroLost(TDataSetRow playerBot, TDataSetRow targetBot)
void sAggroGain(TDataSetRow playerBot, TDataSetRow targetBot) void sAggroGain(TDataSetRow playerBot, TDataSetRow targetBot)
{ {
CAIEntityPhysical *entity=CAIS::instance().getEntityPhysical(playerBot); // necessary ? CAIEntityPhysical *entity=CAIS::instance().getEntityPhysical(playerBot);
if ( !entity if ( !entity
|| CMirrors::getEntityId(playerBot).getType()!=RYZOMID::player) || CMirrors::getEntityId(playerBot).getType()!=RYZOMID::player)
return; return;
@ -1153,6 +1153,9 @@ void sAggroGain(TDataSetRow playerBot, TDataSetRow targetBot)
CAIGainAggroMsg msg(targetBot, playerBot, false); CAIGainAggroMsg msg(targetBot, playerBot, false);
msg.send("EGS"); msg.send("EGS");
if (entity->getActionFlags() & RYZOMACTIONFLAGS::InWater)
return;
CAIEntityPhysical *botEntity = CAIEntityPhysicalLocator::getInstance()->getEntity(targetBot); CAIEntityPhysical *botEntity = CAIEntityPhysicalLocator::getInstance()->getEntity(targetBot);
CSpawnBotNpc* bot = dynamic_cast<CSpawnBotNpc*>(botEntity); CSpawnBotNpc* bot = dynamic_cast<CSpawnBotNpc*>(botEntity);
if (bot && bot->getPersistent().getOwner()) { if (bot && bot->getPersistent().getOwner()) {

@ -195,7 +195,7 @@ IScriptContext* CStateInstance::findContext(NLMISC::TStringId const strId)
#endif #endif
std::vector<CGroup*> grps; std::vector<CGroup*> grps;
this->getGroup()->getAIInstance()->findGroup(grps, CStringMapper::unmap(strId)); this->getGroup()->getAIInstance()->findGroup(grps, CStringMapper::unmap(strId));
if (grps.size()==1) if (grps.size() >= 1)
return grps.back()->getPersistentStateInstance(); return grps.back()->getPersistentStateInstance();
else else
return NULL; return NULL;

@ -770,7 +770,7 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr )
string usedlang = senderLang; string usedlang = senderLang;
if (EnableDeepL && !senderClient.dontSendTranslation(senderLang)) if (EnableDeepL)
{ {
chatType = "dynamic"; chatType = "dynamic";
if (ucstr[0] == '>') // Sent directly when prefixed by '>', it's the anti-translation code if (ucstr[0] == '>') // Sent directly when prefixed by '>', it's the anti-translation code
@ -790,7 +790,7 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr )
source_lang = mongoText.substr(6, 2); source_lang = mongoText.substr(6, 2);
string sourceText = mongoText.substr(9, endOfOriginal-9); string sourceText = mongoText.substr(9, endOfOriginal-9);
strFindReplace(sourceText, ")", "}"); strFindReplace(sourceText, ")", "}");
mongoText = "["+source_lang+"](http://chat.ryzom.com/channel/pub-universe-"+source_lang+"? "+sourceText+") "+mongoText.substr(endOfOriginal+4, mongoText.size()-endOfOriginal-4); mongoText = "["+source_lang+"](http://chat.ryzom.com/channel/pub-uni-"+source_lang+"? "+sourceText+") "+mongoText.substr(endOfOriginal+4, mongoText.size()-endOfOriginal-4);
} }
else else
{ {
@ -813,6 +813,11 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr )
chatInGroup( grpId, ucstr.substr(1), sender ); chatInGroup( grpId, ucstr.substr(1), sender );
} }
else if (senderClient.dontSendTranslation(senderLang))
{
sendToAllUni = true;
chatInGroup( grpId, ucstr, sender );
}
else else
{ {
_Log.displayNL("%s|%s|*|%s-*|%s", "universe", fullName.c_str(), senderLang.c_str(), ucstr.toUtf8().c_str()); _Log.displayNL("%s|%s|*|%s-*|%s", "universe", fullName.c_str(), senderLang.c_str(), ucstr.toUtf8().c_str());
@ -1034,7 +1039,7 @@ void CChatManager::chat( const TDataSetRow& sender, const ucstring& ucstr )
if (haveOriginMessage) // Only send untranslated message if (haveOriginMessage) // Only send untranslated message
canSendChat = false; canSendChat = false;
} }
else if (!translatedLang.empty() && translatedLang != SM->getLanguageCodeString(co->Language)) else if (!translatedLang.empty() && co && translatedLang != SM->getLanguageCodeString(co->Language))
canSendChat = false; canSendChat = false;
} }
@ -1157,7 +1162,7 @@ void CChatManager::chatInGroup( TGroupId& grpId, const ucstring& ucstr, const TD
if (!areOriginal) if (!areOriginal)
continue; continue;
} }
else if (usedlang != SM->getLanguageCodeString(co->Language)) else if (co == NULL || usedlang != SM->getLanguageCodeString(co->Language))
continue; continue;
} }
@ -1921,6 +1926,7 @@ void CChatManager::sendFarChat(const string &name, const ucstring& ucstr, const
{ {
string usedlang = ""; string usedlang = "";
string source_lang = "";
string mongoText = ucstr.toUtf8(); string mongoText = ucstr.toUtf8();
string::size_type endOfOriginal = mongoText.find("}@{"); string::size_type endOfOriginal = mongoText.find("}@{");
@ -1940,15 +1946,17 @@ void CChatManager::sendFarChat(const string &name, const ucstring& ucstr, const
else if (chan == "universe") else if (chan == "universe")
{ {
chatId = "FACTION_"+toUpper(usedlang); chatId = "FACTION_"+toUpper(usedlang);
rc_channel = "pub-universe-"; rc_channel = "pub-uni-";
} }
string source_lang = usedlang;
if (endOfOriginal != string::npos) if (endOfOriginal != string::npos)
{ {
if (mongoText.size() > 9) if (mongoText.size() > 9)
source_lang = mongoText.substr(6, 2); source_lang = mongoText.substr(6, 2);
else
source_lang = usedlang;
string sourceText = mongoText.substr(9, endOfOriginal-9); string sourceText = mongoText.substr(9, endOfOriginal-9);
strFindReplace(sourceText, ")", "}"); strFindReplace(sourceText, ")", "}");
mongoText = "["+source_lang+"](http://chat.ryzom.com/channel/"+rc_channel+source_lang+"? "+sourceText+") "+mongoText.substr(endOfOriginal+4, mongoText.size()-endOfOriginal-4); mongoText = "["+source_lang+"](http://chat.ryzom.com/channel/"+rc_channel+source_lang+"? "+sourceText+") "+mongoText.substr(endOfOriginal+4, mongoText.size()-endOfOriginal-4);
@ -1985,7 +1993,7 @@ void CChatManager::sendFarChat(const string &name, const ucstring& ucstr, const
NLMISC::CEntityId receiverId = TheDataset.getEntityId(dcc->getClient()->getID()); NLMISC::CEntityId receiverId = TheDataset.getEntityId(dcc->getClient()->getID());
CCharacterInfos* co = IOS->getCharInfos(receiverId); CCharacterInfos* co = IOS->getCharInfos(receiverId);
if (!EnableDeepL || usedlang.empty() || usedlang == SM->getLanguageCodeString(co->Language)) if (!EnableDeepL || usedlang.empty() || (co != NULL && usedlang == SM->getLanguageCodeString(co->Language)))
sendFarChat((CChatGroup::TGroupType)12, dcc->getClient()->getID(), ucstr.substr(startPos), ucstring("~")+ucstring(name), *chanId); sendFarChat((CChatGroup::TGroupType)12, dcc->getClient()->getID(), ucstr.substr(startPos), ucstring("~")+ucstring(name), *chanId);
dcc = dcc->getNextChannelSession(); // next session in this channel dcc = dcc->getNextChannelSession(); // next session in this channel
} }

Loading…
Cancel
Save