mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-28 15:17:46 +00:00
encounter timeline fix json parsing
This commit is contained in:
parent
29c990311b
commit
7b2ea407e9
8 changed files with 85 additions and 59 deletions
|
@ -94,7 +94,7 @@ namespace Sapphire::Encounter
|
||||||
|
|
||||||
TimelinePack EncounterTimeline::getEncounterPack( const std::string& name, bool reload )
|
TimelinePack EncounterTimeline::getEncounterPack( const std::string& name, bool reload )
|
||||||
{
|
{
|
||||||
static std::map< std::string, TimelinePack > cache = {};
|
static std::unordered_map< std::string, TimelinePack > cache = {};
|
||||||
const static std::unordered_map< std::string, ConditionType > conditionMap =
|
const static std::unordered_map< std::string, ConditionType > conditionMap =
|
||||||
{
|
{
|
||||||
{ "hpPctLessThan", ConditionType::HpPctLessThan },
|
{ "hpPctLessThan", ConditionType::HpPctLessThan },
|
||||||
|
@ -119,7 +119,7 @@ namespace Sapphire::Encounter
|
||||||
if( cache.find( name ) != cache.end() && !reload )
|
if( cache.find( name ) != cache.end() && !reload )
|
||||||
return cache.at( name );
|
return cache.at( name );
|
||||||
|
|
||||||
std::string encounter_name( fmt::format( std::string( "data/EncounterTimelines/%s.json" ), name ) );
|
std::string encounter_name( fmt::format( std::string( "data/EncounterTimelines/{}.json" ), name ) );
|
||||||
|
|
||||||
std::fstream f( encounter_name );
|
std::fstream f( encounter_name );
|
||||||
|
|
||||||
|
@ -164,14 +164,17 @@ namespace Sapphire::Encounter
|
||||||
|
|
||||||
TimelineActor& actor = actorNameMap[ actorName ];
|
TimelineActor& actor = actorNameMap[ actorName ];
|
||||||
// todo: are phases linked by actor, or global in the json
|
// todo: are phases linked by actor, or global in the json
|
||||||
for( const auto& phaseJ : json.at( "phases" ).items() )
|
for( const auto& phaseJ : actorV.at( "phases" ).items() )
|
||||||
{
|
{
|
||||||
auto& phaseV = phaseJ.value();
|
auto& phaseV = phaseJ.value();
|
||||||
const auto id = phaseV.at( "id" ).get< uint32_t >();
|
const auto id = phaseV.at( "id" ).get< uint32_t >();
|
||||||
const auto& phaseName = phaseV.at( "name" ).get< std::string >();
|
const auto& phaseName = phaseV.at( "name" ).get< std::string >();
|
||||||
const auto& timepointsJ = phaseV.at( "timepoints" );
|
const auto& timepointsJ = phaseV.at( "timepoints" );
|
||||||
|
const auto& description = phaseV.at( "description" ).get< std::string >();
|
||||||
|
|
||||||
Phase phase;
|
Phase phase;
|
||||||
|
phase.m_name = phaseName;
|
||||||
|
phase.m_description = description;
|
||||||
for( const auto& timepointJ : timepointsJ.items() )
|
for( const auto& timepointJ : timepointsJ.items() )
|
||||||
{
|
{
|
||||||
auto timepointV = timepointJ.value();
|
auto timepointV = timepointJ.value();
|
||||||
|
@ -182,15 +185,11 @@ namespace Sapphire::Encounter
|
||||||
}
|
}
|
||||||
|
|
||||||
if( phaseNameMap.find( phaseName ) != phaseNameMap.end() )
|
if( phaseNameMap.find( phaseName ) != phaseNameMap.end() )
|
||||||
throw std::runtime_error( fmt::format( std::string( "EncounterTimeline::buildEncounterTimeline - duplicate phase by name: %s" ), phaseName ) );
|
throw std::runtime_error( fmt::format( std::string( "EncounterTimeline::getEncounterPack - duplicate phase by name: {}" ), phaseName ) );
|
||||||
|
|
||||||
phaseNameMap.emplace( std::make_pair( phaseName, phase ) );
|
phaseNameMap.emplace( std::make_pair( phaseName, phase ) );
|
||||||
}
|
}
|
||||||
actorNamePhaseMap[ actorName ] = phaseNameMap;
|
actorNamePhaseMap[ actorName ] = phaseNameMap;
|
||||||
if( actorNameMap.find( actorName ) != actorNameMap.end() )
|
|
||||||
throw std::runtime_error( fmt::format( std::string( "EncounterTimeline::buildEncounterTimeline - duplicate actor by name: %s" ), actorName ) );
|
|
||||||
|
|
||||||
actorNameMap.emplace( std::make_pair( actorName, actor ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// build the condition list
|
// build the condition list
|
||||||
|
@ -207,7 +206,7 @@ namespace Sapphire::Encounter
|
||||||
if( auto it = conditionMap.find( conditionName ); it != conditionMap.end() )
|
if( auto it = conditionMap.find( conditionName ); it != conditionMap.end() )
|
||||||
condition = it->second;
|
condition = it->second;
|
||||||
else
|
else
|
||||||
throw std::runtime_error( fmt::format( std::string( "EncounterTimeline::buildEncounterTimeline - no condition id found by name: %s" ), conditionName ) );
|
throw std::runtime_error( fmt::format( std::string( "EncounterTimeline::getEncounterPack - no condition id found by name: {}" ), conditionName ) );
|
||||||
|
|
||||||
// make sure the actor we're referencing exists
|
// make sure the actor we're referencing exists
|
||||||
if( auto actorIt = actorNameMap.find( actorRef ); actorIt != actorNameMap.end() )
|
if( auto actorIt = actorNameMap.find( actorRef ); actorIt != actorNameMap.end() )
|
||||||
|
@ -222,14 +221,14 @@ namespace Sapphire::Encounter
|
||||||
Phase& phase = phaseIt->second;
|
Phase& phase = phaseIt->second;
|
||||||
|
|
||||||
// build the condition
|
// build the condition
|
||||||
PhaseConditionPtr pCondition;
|
PhaseConditionPtr pCondition = nullptr;
|
||||||
switch( condition )
|
switch( condition )
|
||||||
{
|
{
|
||||||
case ConditionType::HpPctLessThan:
|
case ConditionType::HpPctLessThan:
|
||||||
case ConditionType::HpPctBetween:
|
case ConditionType::HpPctBetween:
|
||||||
{
|
{
|
||||||
auto pHpCondition = std::make_shared< ConditionHp >();
|
pCondition = std::make_shared< ConditionHp >();
|
||||||
pHpCondition->from_json( pcV, phase, condition, actorNameMap );
|
pCondition->from_json( pcV, phase, condition, actorNameMap );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ConditionType::DirectorVarEquals:
|
case ConditionType::DirectorVarEquals:
|
||||||
|
@ -239,20 +238,20 @@ namespace Sapphire::Encounter
|
||||||
case ConditionType::DirectorSeqEquals:
|
case ConditionType::DirectorSeqEquals:
|
||||||
case ConditionType::DirectorSeqGreaterThan:
|
case ConditionType::DirectorSeqGreaterThan:
|
||||||
{
|
{
|
||||||
auto pDirectorCondition = std::make_shared< ConditionDirectorVar >();
|
pCondition = std::make_shared< ConditionDirectorVar >();
|
||||||
pDirectorCondition->from_json( pcV, phase, condition );
|
pCondition->from_json( pcV, phase, condition, actorNameMap );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ConditionType::EncounterTimeElapsed:
|
case ConditionType::EncounterTimeElapsed:
|
||||||
{
|
{
|
||||||
auto pEncounterCondition = std::make_shared< ConditionEncounterTimeElapsed >();
|
pCondition = std::make_shared< ConditionEncounterTimeElapsed >();
|
||||||
pEncounterCondition->from_json( pcV, phase, condition );
|
pCondition->from_json( pcV, phase, condition, actorNameMap );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ConditionType::CombatState:
|
case ConditionType::CombatState:
|
||||||
{
|
{
|
||||||
auto pCombatStateCondition = std::make_shared< ConditionCombatState >();
|
pCondition = std::make_shared< ConditionCombatState >();
|
||||||
pCombatStateCondition->from_json( pcV, phase, condition, actorNameMap );
|
pCondition->from_json( pcV, phase, condition, actorNameMap );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -263,7 +262,7 @@ namespace Sapphire::Encounter
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw std::runtime_error( fmt::format( std::string( "EncounterTimeline::buildEncounterTimeline - no state found by name: %s" ), phaseRef ) );
|
throw std::runtime_error( fmt::format( std::string( "EncounterTimeline::getEncounterPack - no state found by name: {}" ), phaseRef ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,6 +328,14 @@ namespace Sapphire::Encounter
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TimelinePack::reset( TerritoryPtr pTeri )
|
||||||
|
{
|
||||||
|
for( auto& actor : m_actors )
|
||||||
|
{
|
||||||
|
actor.resetAllSubActors( pTeri );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TimelinePack::setStartTime( uint64_t time )
|
void TimelinePack::setStartTime( uint64_t time )
|
||||||
{
|
{
|
||||||
m_startTime = time;
|
m_startTime = time;
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
#include <Common.h>
|
#include <Common.h>
|
||||||
#include <Forwards.h>
|
#include <Forwards.h>
|
||||||
|
|
||||||
|
#include "TimelineActor.h"
|
||||||
|
|
||||||
#include "Selector.h"
|
#include "Selector.h"
|
||||||
#include "Forwards.h"
|
#include "Forwards.h"
|
||||||
|
|
||||||
|
@ -66,6 +68,8 @@ namespace Sapphire::Encounter
|
||||||
|
|
||||||
Entity::BNpcPtr getBNpcByActorRef( const std::string& name, TerritoryPtr pTeri, const std::string& subActorName = {} );
|
Entity::BNpcPtr getBNpcByActorRef( const std::string& name, TerritoryPtr pTeri, const std::string& subActorName = {} );
|
||||||
|
|
||||||
|
void reset( TerritoryPtr pTeri );
|
||||||
|
|
||||||
void setStartTime( uint64_t time );
|
void setStartTime( uint64_t time );
|
||||||
|
|
||||||
uint64_t getStartTime() const;
|
uint64_t getStartTime() const;
|
||||||
|
@ -77,6 +81,6 @@ namespace Sapphire::Encounter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
TimelinePack getEncounterPack( const std::string& name, bool reload = false );
|
static TimelinePack getEncounterPack( const std::string& name, bool reload = false );
|
||||||
};
|
};
|
||||||
}// namespace Sapphire
|
}// namespace Sapphire
|
|
@ -99,9 +99,9 @@ namespace Sapphire::Encounter
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConditionHp::from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
void ConditionHp::from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
||||||
const std::unordered_map< std::string, TimelineActor >& actors )
|
const std::unordered_map< std::string, TimelineActor >& actors )
|
||||||
{
|
{
|
||||||
PhaseCondition::from_json( json, phase, condition );
|
PhaseCondition::from_json( json, phase, condition, actors );
|
||||||
|
|
||||||
auto& paramData = json.at( "paramData" );
|
auto& paramData = json.at( "paramData" );
|
||||||
auto actorRef = paramData.at( "sourceActor" ).get< std::string >();
|
auto actorRef = paramData.at( "sourceActor" ).get< std::string >();
|
||||||
|
@ -126,9 +126,10 @@ namespace Sapphire::Encounter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConditionDirectorVar::from_json( nlohmann::json& json, Phase& phase, ConditionType condition )
|
void ConditionDirectorVar::from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
||||||
|
const std::unordered_map< std::string, TimelineActor >& actors )
|
||||||
{
|
{
|
||||||
PhaseCondition::from_json( json, phase, condition );
|
PhaseCondition::from_json( json, phase, condition, actors );
|
||||||
|
|
||||||
auto& paramData = json.at( "paramData" );
|
auto& paramData = json.at( "paramData" );
|
||||||
|
|
||||||
|
@ -159,9 +160,9 @@ namespace Sapphire::Encounter
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConditionCombatState::from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
void ConditionCombatState::from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
||||||
const std::unordered_map< std::string, TimelineActor >& actors )
|
const std::unordered_map< std::string, TimelineActor >& actors )
|
||||||
{
|
{
|
||||||
PhaseCondition::from_json( json, phase, condition );
|
PhaseCondition::from_json( json, phase, condition, actors );
|
||||||
|
|
||||||
auto& paramData = json.at( "paramData" );
|
auto& paramData = json.at( "paramData" );
|
||||||
auto actorRef = paramData.at( "sourceActor" ).get< std::string >();
|
auto actorRef = paramData.at( "sourceActor" ).get< std::string >();
|
||||||
|
@ -175,9 +176,10 @@ namespace Sapphire::Encounter
|
||||||
this->combatState = paramData.at( "combatState" ).get< CombatStateType >();
|
this->combatState = paramData.at( "combatState" ).get< CombatStateType >();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConditionEncounterTimeElapsed::from_json( nlohmann::json& json, Phase& phase, ConditionType condition )
|
void ConditionEncounterTimeElapsed::from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
||||||
|
const std::unordered_map< std::string, TimelineActor >& actors )
|
||||||
{
|
{
|
||||||
PhaseCondition::from_json( json, phase, condition );
|
PhaseCondition::from_json( json, phase, condition, actors );
|
||||||
|
|
||||||
auto& paramData = json.at( "paramData" );
|
auto& paramData = json.at( "paramData" );
|
||||||
auto duration = paramData.at( "duration" ).get< uint64_t >();
|
auto duration = paramData.at( "duration" ).get< uint64_t >();
|
||||||
|
@ -186,9 +188,9 @@ namespace Sapphire::Encounter
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConditionBNpcFlags::from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
void ConditionBNpcFlags::from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
||||||
const std::unordered_map< std::string, TimelineActor >& actors )
|
const std::unordered_map< std::string, TimelineActor >& actors )
|
||||||
{
|
{
|
||||||
PhaseCondition::from_json( json, phase, condition );
|
PhaseCondition::from_json( json, phase, condition, actors );
|
||||||
auto& paramData = json.at( "paramData" );
|
auto& paramData = json.at( "paramData" );
|
||||||
auto actorRef = paramData.at( "sourceActor" ).get< std::string >();
|
auto actorRef = paramData.at( "sourceActor" ).get< std::string >();
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ namespace Sapphire::Encounter
|
||||||
// todo: getters/setters
|
// todo: getters/setters
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
std::vector< Timepoint > m_timepoints;
|
std::vector< Timepoint > m_timepoints;
|
||||||
|
std::string m_description;
|
||||||
|
|
||||||
void execute( ConditionState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const;
|
void execute( ConditionState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const;
|
||||||
|
|
||||||
|
@ -65,7 +66,7 @@ namespace Sapphire::Encounter
|
||||||
PhaseCondition() {}
|
PhaseCondition() {}
|
||||||
~PhaseCondition() {}
|
~PhaseCondition() {}
|
||||||
|
|
||||||
virtual void from_json( nlohmann::json& json, Phase& phase, ConditionType condition )
|
virtual void from_json( nlohmann::json& json, Phase& phase, ConditionType condition, const std::unordered_map< std::string, TimelineActor >& actors )
|
||||||
{
|
{
|
||||||
this->m_conditionType = condition;
|
this->m_conditionType = condition;
|
||||||
this->m_loop = json.at( "loop" ).get< bool >();
|
this->m_loop = json.at( "loop" ).get< bool >();
|
||||||
|
@ -145,7 +146,7 @@ namespace Sapphire::Encounter
|
||||||
//
|
//
|
||||||
// Conditions
|
// Conditions
|
||||||
//
|
//
|
||||||
class ConditionHp : PhaseCondition
|
class ConditionHp : public PhaseCondition
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
uint32_t layoutId;
|
uint32_t layoutId;
|
||||||
|
@ -158,13 +159,12 @@ namespace Sapphire::Encounter
|
||||||
};
|
};
|
||||||
} hp;
|
} hp;
|
||||||
|
|
||||||
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition, const std::unordered_map< std::string, TimelineActor >& actors ) override;
|
||||||
const std::unordered_map< std::string, TimelineActor >& actors );
|
|
||||||
|
|
||||||
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
|
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ConditionDirectorVar : PhaseCondition
|
class ConditionDirectorVar : public PhaseCondition
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
union
|
union
|
||||||
|
@ -178,36 +178,36 @@ namespace Sapphire::Encounter
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
} param;
|
} param;
|
||||||
|
|
||||||
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition );
|
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition, const std::unordered_map< std::string, TimelineActor >& actors ) override;
|
||||||
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
|
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ConditionEncounterTimeElapsed : PhaseCondition
|
class ConditionEncounterTimeElapsed : public PhaseCondition
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
uint64_t duration;
|
uint64_t duration;
|
||||||
|
|
||||||
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition );
|
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition, const std::unordered_map< std::string, TimelineActor >& actors ) override;
|
||||||
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
|
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ConditionCombatState : PhaseCondition
|
class ConditionCombatState : public PhaseCondition
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
uint32_t layoutId;
|
uint32_t layoutId;
|
||||||
CombatStateType combatState;
|
CombatStateType combatState;
|
||||||
|
|
||||||
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition, const std::unordered_map< std::string, TimelineActor >& actors );
|
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition, const std::unordered_map< std::string, TimelineActor >& actors ) override;
|
||||||
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
|
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ConditionBNpcFlags : PhaseCondition
|
class ConditionBNpcFlags : public PhaseCondition
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
uint32_t layoutId;
|
uint32_t layoutId;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
|
||||||
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition, const std::unordered_map< std::string, TimelineActor >& actors );
|
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition, const std::unordered_map< std::string, TimelineActor >& actors ) override;
|
||||||
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
|
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "EncounterTimeline.h"
|
#include "EncounterTimeline.h"
|
||||||
|
|
||||||
#include <Actor/BNpc.h>
|
#include <Actor/BNpc.h>
|
||||||
|
#include <Action/Action.h>
|
||||||
|
|
||||||
namespace Sapphire::Encounter
|
namespace Sapphire::Encounter
|
||||||
{
|
{
|
||||||
|
@ -117,6 +118,11 @@ namespace Sapphire::Encounter
|
||||||
if( auto pPlayer = pActor->getAsPlayer() )
|
if( auto pPlayer = pActor->getAsPlayer() )
|
||||||
subActor.second->despawn( pPlayer );
|
subActor.second->despawn( pPlayer );
|
||||||
}
|
}
|
||||||
|
// todo: need to reset the ai on interrupt
|
||||||
|
auto pAction = subActor.second->getCurrentAction();
|
||||||
|
if( pAction )
|
||||||
|
pAction->interrupt();
|
||||||
|
|
||||||
pTeri->removeActor( subActor.second );
|
pTeri->removeActor( subActor.second );
|
||||||
subActor.second = nullptr;
|
subActor.second = nullptr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include "PhaseCondition.h"
|
#include "PhaseCondition.h"
|
||||||
|
|
|
@ -107,7 +107,7 @@ namespace Sapphire::Encounter
|
||||||
if( auto it = timepointTypeMap.find( typeStr ); it != timepointTypeMap.end() )
|
if( auto it = timepointTypeMap.find( typeStr ); it != timepointTypeMap.end() )
|
||||||
tpType = it->second;
|
tpType = it->second;
|
||||||
else
|
else
|
||||||
throw std::runtime_error( fmt::format( "Timepoint::from_json unable to find timepoint by type: %s", typeStr ) );
|
throw std::runtime_error( fmt::format( "Timepoint::from_json unable to find timepoint by type: {}", typeStr ) );
|
||||||
|
|
||||||
m_duration = json.at( "duration" ).get< uint64_t >();
|
m_duration = json.at( "duration" ).get< uint64_t >();
|
||||||
//m_overrideFlags = json.at( "overrideFlags" ).get< TimepointOverrideFlags >();
|
//m_overrideFlags = json.at( "overrideFlags" ).get< TimepointOverrideFlags >();
|
||||||
|
@ -163,10 +163,10 @@ namespace Sapphire::Encounter
|
||||||
auto pBattleTalkData = std::make_shared< TimepointDataBattleTalk >( params );
|
auto pBattleTalkData = std::make_shared< TimepointDataBattleTalk >( params );
|
||||||
|
|
||||||
pBattleTalkData->m_battleTalkId = dataJ.at( "battleTalkId" ).get< uint32_t >();
|
pBattleTalkData->m_battleTalkId = dataJ.at( "battleTalkId" ).get< uint32_t >();
|
||||||
pBattleTalkData->m_handlerId = dataJ.at( "handlerId" ).get< uint32_t >();
|
pBattleTalkData->m_handlerRef = dataJ.at( "handlerActorName" ).get< std::string >();
|
||||||
pBattleTalkData->m_kind = dataJ.at( "kind" ).get< uint32_t >();
|
pBattleTalkData->m_kind = dataJ.at( "kind" ).get< uint32_t >();
|
||||||
pBattleTalkData->m_nameId = dataJ.at( "nameId" ).get< uint32_t >();
|
pBattleTalkData->m_nameId = dataJ.at( "nameId" ).get< uint32_t >();
|
||||||
pBattleTalkData->m_talkerId = dataJ.at( "talkerId" ).get< uint32_t >();
|
pBattleTalkData->m_talkerRef = dataJ.at( "talkerActorName" ).get< std::string >();
|
||||||
|
|
||||||
m_pData = pBattleTalkData;
|
m_pData = pBattleTalkData;
|
||||||
}
|
}
|
||||||
|
@ -248,12 +248,12 @@ namespace Sapphire::Encounter
|
||||||
case TimepointDataType::SpawnBNpc:
|
case TimepointDataType::SpawnBNpc:
|
||||||
{
|
{
|
||||||
auto& dataJ = json.at( "data" );
|
auto& dataJ = json.at( "data" );
|
||||||
auto hateSrcJ = dataJ.at( "hateSrc" );
|
// auto hateSrcJ = dataJ.at( "hateSrc" );
|
||||||
auto actorRef = dataJ.at( "spawnActor" ).get< std::string >();
|
auto actorRef = dataJ.at( "spawnActor" ).get< std::string >();
|
||||||
auto flags = dataJ.at( "flags" ).get< uint32_t >();
|
auto flags = dataJ.at( "flags" ).get< uint32_t >();
|
||||||
// todo: batallion
|
// todo: batallion
|
||||||
// auto battalion = dataJ.at( "batallion" ).get< uint32_t >();
|
// auto battalion = dataJ.at( "batallion" ).get< uint32_t >();
|
||||||
auto bnpcType = bnpcTypeMap.at( dataJ.at( "type" ).get< std::string >() );
|
auto bnpcType = Common::BNpcType::Enemy;//bnpcTypeMap.at( dataJ.at( "type" ).get< std::string >() );
|
||||||
|
|
||||||
// todo: hateSrc
|
// todo: hateSrc
|
||||||
|
|
||||||
|
@ -261,7 +261,7 @@ namespace Sapphire::Encounter
|
||||||
if( auto it = actors.find( actorRef ); it != actors.end() )
|
if( auto it = actors.find( actorRef ); it != actors.end() )
|
||||||
layoutId = it->second.m_layoutId;
|
layoutId = it->second.m_layoutId;
|
||||||
else
|
else
|
||||||
throw std::runtime_error( fmt::format( std::string( "Timepoint::from_json: SpawnBNpc invalid actor ref: %s" ), actorRef ) );
|
throw std::runtime_error( fmt::format( std::string( "Timepoint::from_json: SpawnBNpc invalid actor ref: {}" ), actorRef ) );
|
||||||
|
|
||||||
m_pData = std::make_shared< TimepointDataSpawnBNpc >( layoutId, flags, bnpcType );
|
m_pData = std::make_shared< TimepointDataSpawnBNpc >( layoutId, flags, bnpcType );
|
||||||
}
|
}
|
||||||
|
@ -269,16 +269,16 @@ namespace Sapphire::Encounter
|
||||||
case TimepointDataType::SetBNpcFlags:
|
case TimepointDataType::SetBNpcFlags:
|
||||||
{
|
{
|
||||||
auto& dataJ = json.at( "data" );
|
auto& dataJ = json.at( "data" );
|
||||||
auto actorRef = dataJ.at( "spawnActor" ).get< std::string >();
|
auto actorRef = dataJ.at( "targetActor" ).get< std::string >();
|
||||||
auto flags = dataJ.at( "flags" ).get< uint32_t >();
|
auto flags = dataJ.at( "flags" ).get< uint32_t >();
|
||||||
|
|
||||||
// todo: hateSrc
|
// todo: hateSrc
|
||||||
|
|
||||||
uint32_t layoutId = 0xE0000000;
|
uint32_t layoutId = selfLayoutId;
|
||||||
if( auto it = actors.find( actorRef ); it != actors.end() )
|
//if( auto it = actors.find( actorRef ); it != actors.end() )
|
||||||
layoutId = it->second.m_layoutId;
|
// layoutId = it->second.m_layoutId;
|
||||||
else
|
//else
|
||||||
throw std::runtime_error( fmt::format( std::string( "Timepoint::from_json: SetBNpcFlags invalid actor ref: %s" ), actorRef ) );
|
// throw std::runtime_error( fmt::format( std::string( "Timepoint::from_json: SetBNpcFlags invalid actor ref: {}" ), actorRef ) );
|
||||||
|
|
||||||
m_pData = std::make_shared< TimepointDataBNpcFlags >( layoutId, flags );
|
m_pData = std::make_shared< TimepointDataBNpcFlags >( layoutId, flags );
|
||||||
// todo: SetBNpcFlags
|
// todo: SetBNpcFlags
|
||||||
|
@ -308,7 +308,7 @@ namespace Sapphire::Encounter
|
||||||
auto& dataJ = json.at( "data" );
|
auto& dataJ = json.at( "data" );
|
||||||
auto selectorName = dataJ.at( "selectorName" ).get< std::string >();
|
auto selectorName = dataJ.at( "selectorName" ).get< std::string >();
|
||||||
auto actorRef = dataJ.at( "sourceActor" ).get< std::string >();
|
auto actorRef = dataJ.at( "sourceActor" ).get< std::string >();
|
||||||
auto excludeSelector = std::string(); // dataJ.at( "excludeSelector" ).get< std::string >();
|
auto excludeSelector = std::string(); // dataJ.at( "excludeSelectorName" ).get< std::string >();
|
||||||
// todo: use exclude selector when added to ui
|
// todo: use exclude selector when added to ui
|
||||||
|
|
||||||
m_pData = std::make_shared< TimepointDataSnapshot >( selectorName, actorRef, excludeSelector );
|
m_pData = std::make_shared< TimepointDataSnapshot >( selectorName, actorRef, excludeSelector );
|
||||||
|
@ -440,14 +440,19 @@ namespace Sapphire::Encounter
|
||||||
auto pBtData = std::dynamic_pointer_cast< TimepointDataBattleTalk, TimepointData >( m_pData );
|
auto pBtData = std::dynamic_pointer_cast< TimepointDataBattleTalk, TimepointData >( m_pData );
|
||||||
auto params = pBtData->m_params;
|
auto params = pBtData->m_params;
|
||||||
|
|
||||||
|
auto pHandler = pack.getBNpcByActorRef( pBtData->m_handlerRef , pTeri );
|
||||||
|
auto pTalker = pack.getBNpcByActorRef( pBtData->m_talkerRef, pTeri );
|
||||||
|
|
||||||
|
auto handlerId = pHandler ? pHandler->getId() : 0xE0000000;
|
||||||
|
auto talkerId = pTalker ? pTalker->getId() : 0xE0000000;
|
||||||
|
|
||||||
auto& playerMgr = Common::Service< Sapphire::World::Manager::PlayerMgr >::ref();
|
auto& playerMgr = Common::Service< Sapphire::World::Manager::PlayerMgr >::ref();
|
||||||
for( auto& player : pTeri->getPlayers() )
|
for( auto& player : pTeri->getPlayers() )
|
||||||
{
|
{
|
||||||
auto& pPlayer = player.second;
|
auto& pPlayer = player.second;
|
||||||
if( pPlayer )
|
if( pPlayer )
|
||||||
playerMgr.sendBattleTalk( *pPlayer.get(), pBtData->m_battleTalkId, pBtData->m_handlerId,
|
playerMgr.sendBattleTalk( *pPlayer.get(), pBtData->m_battleTalkId, handlerId,
|
||||||
pBtData->m_kind, pBtData->m_nameId, pBtData->m_talkerId,
|
pBtData->m_kind, pBtData->m_nameId, talkerId,
|
||||||
params[ 0 ], params[ 1 ], params[ 2 ], params[ 3 ],
|
params[ 0 ], params[ 1 ], params[ 2 ], params[ 3 ],
|
||||||
params[ 4 ], params[ 5 ], params[ 6 ], params[ 7 ] );
|
params[ 4 ], params[ 5 ], params[ 6 ], params[ 7 ] );
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,10 +143,10 @@ namespace Sapphire::Encounter
|
||||||
|
|
||||||
struct TimepointDataBattleTalk : public TimepointData {
|
struct TimepointDataBattleTalk : public TimepointData {
|
||||||
uint32_t m_battleTalkId;
|
uint32_t m_battleTalkId;
|
||||||
uint32_t m_handlerId;
|
std::string m_handlerRef;
|
||||||
uint32_t m_kind;
|
uint32_t m_kind;
|
||||||
uint32_t m_nameId;
|
uint32_t m_nameId;
|
||||||
uint32_t m_talkerId;
|
std::string m_talkerRef;
|
||||||
|
|
||||||
uint32_t m_params[ 8 ]{ 0 };
|
uint32_t m_params[ 8 ]{ 0 };
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue