mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-28 15:17:46 +00:00
fix 0 duration timepoints
- fix BNpcSpawn timepoint - temp workaround for actions - fix selectors not working as intended - todo: rewrite this shit to not abuse copy ctors
This commit is contained in:
parent
8c952540d5
commit
9445bc0260
13 changed files with 182 additions and 60 deletions
|
@ -107,7 +107,7 @@
|
||||||
"data": {
|
"data": {
|
||||||
"battleTalkId": 2939,
|
"battleTalkId": 2939,
|
||||||
"handlerActorName": "Ifrit",
|
"handlerActorName": "Ifrit",
|
||||||
"kind": 0,
|
"kind": 1,
|
||||||
"nameId": 2961,
|
"nameId": 2961,
|
||||||
"params": [
|
"params": [
|
||||||
0
|
0
|
||||||
|
@ -211,7 +211,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
"actionId": 733,
|
"actionId": 455,
|
||||||
"selectorIndex": 0,
|
"selectorIndex": 0,
|
||||||
"selectorName": "Eruption",
|
"selectorName": "Eruption",
|
||||||
"snapshot": false,
|
"snapshot": false,
|
||||||
|
@ -234,7 +234,7 @@
|
||||||
"data": {
|
"data": {
|
||||||
"battleTalkId": 2939,
|
"battleTalkId": 2939,
|
||||||
"handlerActorName": "Ifrit",
|
"handlerActorName": "Ifrit",
|
||||||
"kind": 0,
|
"kind": 1,
|
||||||
"nameId": 2961,
|
"nameId": 2961,
|
||||||
"params": [
|
"params": [
|
||||||
0
|
0
|
||||||
|
@ -256,7 +256,7 @@
|
||||||
},
|
},
|
||||||
"description": "",
|
"description": "",
|
||||||
"duration": 1500,
|
"duration": 1500,
|
||||||
"type": "spawnBNpc"
|
"type": "bNpcSpawn"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -291,6 +291,16 @@
|
||||||
"id": 7,
|
"id": 7,
|
||||||
"name": "Hellfire",
|
"name": "Hellfire",
|
||||||
"timepoints": [
|
"timepoints": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"conditionId": 7,
|
||||||
|
"conditionStr": "If Ifrit Nail 1 state is Dead, push Ifrit->Hellfire",
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"description": "",
|
||||||
|
"duration": 0,
|
||||||
|
"type": "setCondition"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
"conditionId": 6,
|
"conditionId": 6,
|
||||||
|
@ -354,7 +364,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
"flags": 1,
|
"flags": 16,
|
||||||
"targetActor": ""
|
"targetActor": ""
|
||||||
},
|
},
|
||||||
"description": "",
|
"description": "",
|
||||||
|
@ -367,7 +377,7 @@
|
||||||
"conditionStr": "If Ifrit state is Combat, loop Ifrit->Final Phase",
|
"conditionStr": "If Ifrit state is Combat, loop Ifrit->Final Phase",
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
"description": "",
|
"description": "Enable final phase",
|
||||||
"duration": 0,
|
"duration": 0,
|
||||||
"type": "setCondition"
|
"type": "setCondition"
|
||||||
}
|
}
|
||||||
|
@ -388,7 +398,7 @@
|
||||||
"sourceActor": "Ifrit",
|
"sourceActor": "Ifrit",
|
||||||
"targetType": "target"
|
"targetType": "target"
|
||||||
},
|
},
|
||||||
"description": "Radiant plume begin",
|
"description": "Incinerate Final Phase",
|
||||||
"duration": 8000,
|
"duration": 8000,
|
||||||
"type": "castAction"
|
"type": "castAction"
|
||||||
},
|
},
|
||||||
|
@ -412,7 +422,7 @@
|
||||||
"targetType": "selector"
|
"targetType": "selector"
|
||||||
},
|
},
|
||||||
"description": "Subactor 1 Eruption",
|
"description": "Subactor 1 Eruption",
|
||||||
"duration": 5000,
|
"duration": 8000,
|
||||||
"type": "castAction"
|
"type": "castAction"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -524,16 +534,16 @@
|
||||||
"targetType": "self"
|
"targetType": "self"
|
||||||
},
|
},
|
||||||
"description": "",
|
"description": "",
|
||||||
"duration": 0,
|
"duration": 5000,
|
||||||
"type": "castAction"
|
"type": "castAction"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
"actorName": "Ifrit <subactor 1>",
|
"actorName": "Ifrit <subactor 1>",
|
||||||
"pos": [
|
"pos": [
|
||||||
-10,
|
|
||||||
0,
|
0,
|
||||||
10
|
0,
|
||||||
|
-20
|
||||||
],
|
],
|
||||||
"rot": 0
|
"rot": 0
|
||||||
},
|
},
|
||||||
|
@ -545,9 +555,9 @@
|
||||||
"data": {
|
"data": {
|
||||||
"actorName": "Ifrit <subactor 2>",
|
"actorName": "Ifrit <subactor 2>",
|
||||||
"pos": [
|
"pos": [
|
||||||
-10,
|
|
||||||
0,
|
0,
|
||||||
-10
|
0,
|
||||||
|
20
|
||||||
],
|
],
|
||||||
"rot": 0
|
"rot": 0
|
||||||
},
|
},
|
||||||
|
@ -559,9 +569,9 @@
|
||||||
"data": {
|
"data": {
|
||||||
"actorName": "Ifrit <subactor 3>",
|
"actorName": "Ifrit <subactor 3>",
|
||||||
"pos": [
|
"pos": [
|
||||||
10,
|
-20,
|
||||||
0,
|
0,
|
||||||
10
|
0
|
||||||
],
|
],
|
||||||
"rot": 0
|
"rot": 0
|
||||||
},
|
},
|
||||||
|
@ -573,9 +583,65 @@
|
||||||
"data": {
|
"data": {
|
||||||
"actorName": "Ifrit <subactor 4>",
|
"actorName": "Ifrit <subactor 4>",
|
||||||
"pos": [
|
"pos": [
|
||||||
10,
|
-20,
|
||||||
0,
|
0,
|
||||||
-10
|
20
|
||||||
|
],
|
||||||
|
"rot": 0
|
||||||
|
},
|
||||||
|
"description": "",
|
||||||
|
"duration": 0,
|
||||||
|
"type": "setPos"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"actorName": "Ifrit <subactor 5>",
|
||||||
|
"pos": [
|
||||||
|
-15,
|
||||||
|
0,
|
||||||
|
15
|
||||||
|
],
|
||||||
|
"rot": 0
|
||||||
|
},
|
||||||
|
"description": "",
|
||||||
|
"duration": 0,
|
||||||
|
"type": "setPos"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"actorName": "Ifrit <subactor 6>",
|
||||||
|
"pos": [
|
||||||
|
-15,
|
||||||
|
0,
|
||||||
|
-15
|
||||||
|
],
|
||||||
|
"rot": 0
|
||||||
|
},
|
||||||
|
"description": "",
|
||||||
|
"duration": 0,
|
||||||
|
"type": "setPos"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"actorName": "Ifrit <subactor 7>",
|
||||||
|
"pos": [
|
||||||
|
15,
|
||||||
|
0,
|
||||||
|
-15
|
||||||
|
],
|
||||||
|
"rot": 0
|
||||||
|
},
|
||||||
|
"description": "",
|
||||||
|
"duration": 0,
|
||||||
|
"type": "setPos"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"actorName": "Ifrit <subactor 8>",
|
||||||
|
"pos": [
|
||||||
|
15,
|
||||||
|
0,
|
||||||
|
15
|
||||||
],
|
],
|
||||||
"rot": 0
|
"rot": 0
|
||||||
},
|
},
|
||||||
|
|
|
@ -260,4 +260,10 @@ namespace Sapphire::World::AI
|
||||||
return m_targetIds;
|
return m_targetIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Snapshot::clearResults()
|
||||||
|
{
|
||||||
|
m_results.clear();
|
||||||
|
m_targetIds.clear();
|
||||||
|
}
|
||||||
|
|
||||||
};// namespace Sapphire::World::AI
|
};// namespace Sapphire::World::AI
|
|
@ -236,12 +236,14 @@ namespace Sapphire::World::AI
|
||||||
m_filters( filters )
|
m_filters( filters )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void createSnapshot( Entity::CharaPtr pSrc, const std::set< Entity::GameObjectPtr >& inRange,
|
void createSnapshot( Entity::CharaPtr pSrc, const std::set< Entity::GameObjectPtr >& inRange,
|
||||||
int count, bool fillWithRandom, const std::vector< uint32_t >& exclude = {} );
|
int count, bool fillWithRandom, const std::vector< uint32_t >& exclude = {} );
|
||||||
|
|
||||||
// returns actors sorted by distance
|
// returns actors sorted by distance
|
||||||
const std::vector< CharaEntry >& getResults() const;
|
const std::vector< CharaEntry >& getResults() const;
|
||||||
const std::vector< uint32_t >& getTargetIds() const;
|
const std::vector< uint32_t >& getTargetIds() const;
|
||||||
|
void clearResults();
|
||||||
};
|
};
|
||||||
using SnapshotPtr = std::shared_ptr< Snapshot >;
|
using SnapshotPtr = std::shared_ptr< Snapshot >;
|
||||||
}// namespace Sapphire::World::AI
|
}// namespace Sapphire::World::AI
|
||||||
|
|
|
@ -36,7 +36,7 @@ namespace Sapphire::Entity
|
||||||
Immobile = 0x01,
|
Immobile = 0x01,
|
||||||
TurningDisabled = 0x02,
|
TurningDisabled = 0x02,
|
||||||
Invincible = 0x04,
|
Invincible = 0x04,
|
||||||
InvincibleRefill = 0x08,
|
StayAlive = 0x08,
|
||||||
NoDeaggro = 0x10,
|
NoDeaggro = 0x10,
|
||||||
Untargetable = 0x20,
|
Untargetable = 0x20,
|
||||||
AutoAttackDisabled = 0x40,
|
AutoAttackDisabled = 0x40,
|
||||||
|
|
|
@ -399,7 +399,7 @@ void Chara::takeDamage( uint32_t damage )
|
||||||
resetHp();
|
resetHp();
|
||||||
break;
|
break;
|
||||||
case InvincibilityStayAlive:
|
case InvincibilityStayAlive:
|
||||||
setHp( 0 );
|
setHp( 1 );
|
||||||
break;
|
break;
|
||||||
case InvincibilityIgnoreDamage:
|
case InvincibilityIgnoreDamage:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
#include <Util/UtilMath.h>
|
#include <Util/UtilMath.h>
|
||||||
#include <Util/Util.h>
|
#include <Util/Util.h>
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
namespace Sapphire::Encounter
|
namespace Sapphire::Encounter
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -134,8 +136,8 @@ namespace Sapphire::Encounter
|
||||||
|
|
||||||
for( const auto& selectorJ : json.at( "selectors" ).items() )
|
for( const auto& selectorJ : json.at( "selectors" ).items() )
|
||||||
{
|
{
|
||||||
auto selectorV = selectorJ.value();
|
auto& selectorV = selectorJ.value();
|
||||||
auto name = selectorV.at( "name" );
|
auto name = selectorV.at( "name" ).get< std::string >();
|
||||||
Selector selector;
|
Selector selector;
|
||||||
selector.from_json( selectorV );
|
selector.from_json( selectorV );
|
||||||
|
|
||||||
|
@ -151,6 +153,12 @@ namespace Sapphire::Encounter
|
||||||
actor.m_layoutId = actorV.at( "layoutId" ).get< uint32_t >();
|
actor.m_layoutId = actorV.at( "layoutId" ).get< uint32_t >();
|
||||||
actor.m_name = actorV.at( "name" ).get< std::string >();
|
actor.m_name = actorV.at( "name" ).get< std::string >();
|
||||||
|
|
||||||
|
auto& subActorsJ = actorV.at( "subactors" );
|
||||||
|
|
||||||
|
if( !subActorsJ.is_null() )
|
||||||
|
for( const auto& subActorV : subActorsJ.items() )
|
||||||
|
actor.addPlaceholderSubactor( subActorV.value().get< std::string >() );
|
||||||
|
|
||||||
actorNameMap.emplace( std::make_pair( actor.m_name, actor ) );
|
actorNameMap.emplace( std::make_pair( actor.m_name, actor ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -317,14 +325,13 @@ namespace Sapphire::Encounter
|
||||||
m_actors.emplace_back( actor );
|
m_actors.emplace_back( actor );
|
||||||
}
|
}
|
||||||
|
|
||||||
Entity::BNpcPtr TimelinePack::getBNpcByActorRef( const std::string& name, TerritoryPtr pTeri, const std::string& subActorName )
|
Entity::BNpcPtr TimelinePack::getBNpcByRef( const std::string& name, TerritoryPtr pTeri )
|
||||||
{
|
{
|
||||||
for( const auto& actor : m_actors )
|
for( const auto& actor : m_actors )
|
||||||
{
|
{
|
||||||
if( actor.m_name == name )
|
auto pBNpc = actor.getBNpcByRef( name, pTeri );
|
||||||
{
|
if( pBNpc )
|
||||||
return actor.getBNpcByRef( name, pTeri );
|
return pBNpc;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -355,6 +362,12 @@ namespace Sapphire::Encounter
|
||||||
actor.update( pTeri, *this, now );
|
actor.update( pTeri, *this, now );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TimelinePack::spawnSubActors( TerritoryPtr pTeri )
|
||||||
|
{
|
||||||
|
for( auto& actor : m_actors )
|
||||||
|
actor.spawnAllSubActors( pTeri );
|
||||||
|
}
|
||||||
|
|
||||||
bool TimelinePack::valid()
|
bool TimelinePack::valid()
|
||||||
{
|
{
|
||||||
return !m_actors.empty();
|
return !m_actors.empty();
|
||||||
|
|
|
@ -46,8 +46,11 @@ namespace Sapphire::Encounter
|
||||||
m_type( rhs.m_type ),
|
m_type( rhs.m_type ),
|
||||||
m_name( rhs.m_name ),
|
m_name( rhs.m_name ),
|
||||||
m_actors( rhs.m_actors ),
|
m_actors( rhs.m_actors ),
|
||||||
|
m_selectors( rhs.m_selectors ),
|
||||||
m_startTime( 0 )
|
m_startTime( 0 )
|
||||||
{
|
{
|
||||||
|
for( auto& selector : m_selectors )
|
||||||
|
selector.second.clearResults();
|
||||||
}
|
}
|
||||||
|
|
||||||
TimelinePack( TimelinePackType type ) : m_type( type ) {}
|
TimelinePack( TimelinePackType type ) : m_type( type ) {}
|
||||||
|
@ -65,7 +68,8 @@ namespace Sapphire::Encounter
|
||||||
|
|
||||||
void addTimelineActor( const TimelineActor& actor );
|
void addTimelineActor( const TimelineActor& actor );
|
||||||
|
|
||||||
Entity::BNpcPtr getBNpcByActorRef( const std::string& name, TerritoryPtr pTeri, const std::string& subActorName = {} );
|
// get bnpc by internal timeline name
|
||||||
|
Entity::BNpcPtr getBNpcByRef( const std::string& name, TerritoryPtr pTeri );
|
||||||
|
|
||||||
void reset( TerritoryPtr pTeri );
|
void reset( TerritoryPtr pTeri );
|
||||||
|
|
||||||
|
@ -75,6 +79,9 @@ namespace Sapphire::Encounter
|
||||||
|
|
||||||
void update( TerritoryPtr pTeri, uint64_t time );
|
void update( TerritoryPtr pTeri, uint64_t time );
|
||||||
|
|
||||||
|
// todo: probably just make this a Timepoint in an InitPhase
|
||||||
|
void spawnSubActors( TerritoryPtr pTeri );
|
||||||
|
|
||||||
bool valid();
|
bool valid();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -45,8 +45,8 @@ namespace Sapphire
|
||||||
{
|
{
|
||||||
removeBNpc( NPC_IFRIT );
|
removeBNpc( NPC_IFRIT );
|
||||||
m_pInstance->removeActor( boss );
|
m_pInstance->removeActor( boss );
|
||||||
m_pInstance->getEncounterTimeline().reset( getInstance() );
|
|
||||||
}
|
}
|
||||||
|
m_pInstance->getEncounterTimeline().reset( getInstance() );
|
||||||
|
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,4 +134,9 @@ namespace Sapphire::Encounter
|
||||||
{
|
{
|
||||||
return m_snapshot.getTargetIds();
|
return m_snapshot.getTargetIds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Selector::clearResults()
|
||||||
|
{
|
||||||
|
m_snapshot.clearResults();
|
||||||
|
}
|
||||||
}// namespace Sapphire::Encounter
|
}// namespace Sapphire::Encounter
|
|
@ -12,7 +12,7 @@ namespace Sapphire::Encounter
|
||||||
private:
|
private:
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
bool m_fillWithRandom{ true };
|
bool m_fillWithRandom{ true };
|
||||||
uint32_t m_count;
|
uint32_t m_count{ 0 };
|
||||||
World::AI::Snapshot m_snapshot;
|
World::AI::Snapshot m_snapshot;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -20,6 +20,7 @@ namespace Sapphire::Encounter
|
||||||
void createSnapshot( Entity::CharaPtr pSrc, const std::vector< uint32_t >& exclude = {} );
|
void createSnapshot( Entity::CharaPtr pSrc, const std::vector< uint32_t >& exclude = {} );
|
||||||
const World::AI::Snapshot::Results& getResults();
|
const World::AI::Snapshot::Results& getResults();
|
||||||
const World::AI::Snapshot::TargetIds& getTargetIds();
|
const World::AI::Snapshot::TargetIds& getTargetIds();
|
||||||
|
void clearResults();
|
||||||
void from_json( const nlohmann::json& json );
|
void from_json( const nlohmann::json& json );
|
||||||
};
|
};
|
||||||
};// namespace Sapphire::Encounter
|
};// namespace Sapphire::Encounter
|
|
@ -5,6 +5,9 @@
|
||||||
#include <Actor/BNpc.h>
|
#include <Actor/BNpc.h>
|
||||||
#include <Action/Action.h>
|
#include <Action/Action.h>
|
||||||
|
|
||||||
|
#include <Manager/PlayerMgr.h>
|
||||||
|
#include <Service.h>
|
||||||
|
|
||||||
#include <Territory/Territory.h>
|
#include <Territory/Territory.h>
|
||||||
|
|
||||||
namespace Sapphire::Encounter
|
namespace Sapphire::Encounter
|
||||||
|
@ -140,7 +143,7 @@ namespace Sapphire::Encounter
|
||||||
// todo: retail straight up respawns sub actors, even bnpc parts (qarn adjudicator body parts respawn each time with new ids)
|
// todo: retail straight up respawns sub actors, even bnpc parts (qarn adjudicator body parts respawn each time with new ids)
|
||||||
auto flags = Entity::BNpcFlag::Invincible | Entity::BNpcFlag::Untargetable |
|
auto flags = Entity::BNpcFlag::Invincible | Entity::BNpcFlag::Untargetable |
|
||||||
Entity::BNpcFlag::Immobile | Entity::BNpcFlag::AutoAttackDisabled |
|
Entity::BNpcFlag::Immobile | Entity::BNpcFlag::AutoAttackDisabled |
|
||||||
Entity::BNpcFlag::TurningDisabled;
|
Entity::BNpcFlag::TurningDisabled | Entity::BNpcFlag::NoDeaggro;
|
||||||
|
|
||||||
auto pActor = getSubActor( name );
|
auto pActor = getSubActor( name );
|
||||||
if( pActor == nullptr )
|
if( pActor == nullptr )
|
||||||
|
@ -155,8 +158,12 @@ namespace Sapphire::Encounter
|
||||||
|
|
||||||
pTeri->pushActor( pActor );
|
pTeri->pushActor( pActor );
|
||||||
|
|
||||||
|
auto& playerMgr = Common::Service< World::Manager::PlayerMgr >::ref();
|
||||||
for( const auto& player : pTeri->getPlayers() )
|
for( const auto& player : pTeri->getPlayers() )
|
||||||
|
{
|
||||||
pActor->spawn( player.second );
|
pActor->spawn( player.second );
|
||||||
|
playerMgr.sendDebug( *player.second, fmt::format( "Spawned subactor {}", name ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return pActor;
|
return pActor;
|
||||||
|
|
|
@ -28,12 +28,12 @@ namespace Sapphire::Encounter
|
||||||
|
|
||||||
bool Timepoint::canExecute( const TimepointState& state, uint64_t elapsed ) const
|
bool Timepoint::canExecute( const TimepointState& state, uint64_t elapsed ) const
|
||||||
{
|
{
|
||||||
return state.m_startTime == 0;// & &m_duration <= elapsed;
|
return state.m_startTime == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Timepoint::durationElapsed( uint64_t elapsed ) const
|
bool Timepoint::durationElapsed( uint64_t elapsed ) const
|
||||||
{
|
{
|
||||||
return m_duration < elapsed;
|
return m_duration <= elapsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Timepoint::finished( const TimepointState& state, uint64_t elapsed ) const
|
bool Timepoint::finished( const TimepointState& state, uint64_t elapsed ) const
|
||||||
|
@ -63,8 +63,8 @@ namespace Sapphire::Encounter
|
||||||
{ "directorSeq", TimepointDataType::DirectorSeq },
|
{ "directorSeq", TimepointDataType::DirectorSeq },
|
||||||
{ "directorFlags", TimepointDataType::DirectorFlags },
|
{ "directorFlags", TimepointDataType::DirectorFlags },
|
||||||
|
|
||||||
{ "spawnBNpc", TimepointDataType::SpawnBNpc },
|
{ "bNpcSpawn", TimepointDataType::BNpcSpawn },
|
||||||
{ "bNpcFlags", TimepointDataType::SetBNpcFlags },
|
{ "bNpcFlags", TimepointDataType::BNpcFlags },
|
||||||
{ "setEObjState", TimepointDataType::SetEObjState },
|
{ "setEObjState", TimepointDataType::SetEObjState },
|
||||||
{ "setBGM", TimepointDataType::SetBgm },
|
{ "setBGM", TimepointDataType::SetBgm },
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ namespace Sapphire::Encounter
|
||||||
auto selectorIndex = dataJ.at( "selectorIndex" ).get< uint32_t >();
|
auto selectorIndex = dataJ.at( "selectorIndex" ).get< uint32_t >();
|
||||||
|
|
||||||
m_pData = std::make_shared< TimepointDataAction >( sourceRef, actionId, targetType,
|
m_pData = std::make_shared< TimepointDataAction >( sourceRef, actionId, targetType,
|
||||||
selectorRef, selectorIndex );
|
selectorRef, selectorIndex - 1 );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TimepointDataType::SetPos:
|
case TimepointDataType::SetPos:
|
||||||
|
@ -247,7 +247,7 @@ namespace Sapphire::Encounter
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
case TimepointDataType::SpawnBNpc:
|
case TimepointDataType::BNpcSpawn:
|
||||||
{
|
{
|
||||||
auto& dataJ = json.at( "data" );
|
auto& dataJ = json.at( "data" );
|
||||||
// auto hateSrcJ = dataJ.at( "hateSrc" );
|
// auto hateSrcJ = dataJ.at( "hateSrc" );
|
||||||
|
@ -268,7 +268,7 @@ namespace Sapphire::Encounter
|
||||||
m_pData = std::make_shared< TimepointDataSpawnBNpc >( layoutId, flags, bnpcType );
|
m_pData = std::make_shared< TimepointDataSpawnBNpc >( layoutId, flags, bnpcType );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TimepointDataType::SetBNpcFlags:
|
case TimepointDataType::BNpcFlags:
|
||||||
{
|
{
|
||||||
auto& dataJ = json.at( "data" );
|
auto& dataJ = json.at( "data" );
|
||||||
auto actorRef = dataJ.at( "targetActor" ).get< std::string >();
|
auto actorRef = dataJ.at( "targetActor" ).get< std::string >();
|
||||||
|
@ -330,20 +330,21 @@ namespace Sapphire::Encounter
|
||||||
|
|
||||||
bool Timepoint::execute( TimepointState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const
|
bool Timepoint::execute( TimepointState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const
|
||||||
{
|
{
|
||||||
const auto& players = pTeri->getPlayers();
|
|
||||||
// send debug msg
|
|
||||||
if( !m_description.empty() )
|
|
||||||
{
|
|
||||||
auto& playerMgr = Common::Service< Sapphire::World::Manager::PlayerMgr >::ref();
|
|
||||||
|
|
||||||
for( const auto& player : players )
|
|
||||||
playerMgr.sendDebug( *player.second, m_description );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( update( state, self, pack, pTeri, time ) )
|
if( update( state, self, pack, pTeri, time ) )
|
||||||
{
|
{
|
||||||
state.m_startTime = time;
|
state.m_startTime = time;
|
||||||
state.m_finished = true;
|
state.m_finished = true;
|
||||||
|
|
||||||
|
const auto& players = pTeri->getPlayers();
|
||||||
|
// send debug msg
|
||||||
|
if( !m_description.empty() )
|
||||||
|
{
|
||||||
|
auto& playerMgr = Common::Service< Sapphire::World::Manager::PlayerMgr >::ref();
|
||||||
|
|
||||||
|
for( const auto& player : players )
|
||||||
|
playerMgr.sendDebug( *player.second, m_description );
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -367,7 +368,7 @@ namespace Sapphire::Encounter
|
||||||
case TimepointDataType::CastAction:
|
case TimepointDataType::CastAction:
|
||||||
{
|
{
|
||||||
auto pActionData = std::dynamic_pointer_cast< TimepointDataAction, TimepointData >( m_pData );
|
auto pActionData = std::dynamic_pointer_cast< TimepointDataAction, TimepointData >( m_pData );
|
||||||
auto pBNpc = self.getBNpcByRef( pActionData->m_sourceRef, pTeri );
|
auto pBNpc = pack.getBNpcByRef( pActionData->m_sourceRef, pTeri );
|
||||||
// todo: filter the correct target
|
// todo: filter the correct target
|
||||||
// todo: tie to mechanic script?
|
// todo: tie to mechanic script?
|
||||||
// todo: mechanic should probably just be an Action::onTick, with instance/director passed to it
|
// todo: mechanic should probably just be an Action::onTick, with instance/director passed to it
|
||||||
|
@ -376,9 +377,15 @@ namespace Sapphire::Encounter
|
||||||
uint32_t targetId = pBNpc->getId();
|
uint32_t targetId = pBNpc->getId();
|
||||||
switch( pActionData->m_targetType )
|
switch( pActionData->m_targetType )
|
||||||
{
|
{
|
||||||
|
case ActionTargetType::None:
|
||||||
|
targetId = 0xE0000000;
|
||||||
|
break;
|
||||||
case ActionTargetType::Target:
|
case ActionTargetType::Target:
|
||||||
targetId = static_cast< uint32_t >( pBNpc->getTargetId() );
|
targetId = static_cast< uint32_t >( pBNpc->getTargetId() );
|
||||||
break;
|
break;
|
||||||
|
case ActionTargetType::Self:
|
||||||
|
targetId = pBNpc->getId();
|
||||||
|
break;
|
||||||
case ActionTargetType::Selector:
|
case ActionTargetType::Selector:
|
||||||
{
|
{
|
||||||
const auto& results = pack.getSnapshotTargetIds( pActionData->m_selectorRef );
|
const auto& results = pack.getSnapshotTargetIds( pActionData->m_selectorRef );
|
||||||
|
@ -390,12 +397,19 @@ namespace Sapphire::Encounter
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
auto& actionMgr = Common::Service< Sapphire::World::Manager::ActionMgr >::ref();
|
auto& actionMgr = Common::Service< Sapphire::World::Manager::ActionMgr >::ref();
|
||||||
|
auto pAction = pBNpc->getCurrentAction();
|
||||||
|
|
||||||
// todo: this is probably wrong
|
// todo: this is probably wrong
|
||||||
if( !pBNpc->getCurrentAction() )
|
if( !pAction )
|
||||||
{
|
{
|
||||||
actionMgr.handleTargetedAction( *pBNpc, pActionData->m_actionId, targetId, 0 );
|
actionMgr.handleTargetedAction( *pBNpc, pActionData->m_actionId, targetId, 0 );
|
||||||
}
|
}
|
||||||
|
// todo: this really shouldnt exist, but need to figure out why actions interrupt
|
||||||
|
else if( pAction->getId() == pActionData->m_actionId )
|
||||||
|
{
|
||||||
|
pAction->setInterrupted( Common::ActionInterruptType::RegularInterrupt );
|
||||||
|
pAction->interrupt();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -406,12 +420,13 @@ namespace Sapphire::Encounter
|
||||||
case TimepointDataType::SetPos:
|
case TimepointDataType::SetPos:
|
||||||
{
|
{
|
||||||
auto pSetPosData = std::dynamic_pointer_cast< TimepointDataSetPos, TimepointData >( m_pData );
|
auto pSetPosData = std::dynamic_pointer_cast< TimepointDataSetPos, TimepointData >( m_pData );
|
||||||
auto pBNpc = self.getBNpcByRef( pSetPosData->m_actorRef, pTeri );
|
auto pBNpc = pack.getBNpcByRef( pSetPosData->m_actorRef, pTeri );
|
||||||
|
|
||||||
if( pBNpc )
|
if( pBNpc )
|
||||||
{
|
{
|
||||||
pBNpc->setRot( pSetPosData->m_rot );
|
pBNpc->setRot( pSetPosData->m_rot );
|
||||||
pBNpc->setPos( pSetPosData->m_x, pSetPosData->m_y, pSetPosData->m_z, true );
|
pBNpc->setPos( pSetPosData->m_x, pSetPosData->m_y, pSetPosData->m_z, true );
|
||||||
|
pBNpc->sendPositionUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -419,7 +434,7 @@ namespace Sapphire::Encounter
|
||||||
case TimepointDataType::MoveTo:
|
case TimepointDataType::MoveTo:
|
||||||
{
|
{
|
||||||
auto pMoveToData = std::dynamic_pointer_cast< TimepointDataMoveTo, TimepointData >( m_pData );
|
auto pMoveToData = std::dynamic_pointer_cast< TimepointDataMoveTo, TimepointData >( m_pData );
|
||||||
auto pBNpc = self.getBNpcByRef( pMoveToData->m_actorRef, pTeri );
|
auto pBNpc = pack.getBNpcByRef( pMoveToData->m_actorRef, pTeri );
|
||||||
|
|
||||||
if( pBNpc )
|
if( pBNpc )
|
||||||
{
|
{
|
||||||
|
@ -469,8 +484,8 @@ 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 pHandler = pack.getBNpcByRef( pBtData->m_handlerRef , pTeri );
|
||||||
auto pTalker = pack.getBNpcByActorRef( pBtData->m_talkerRef, pTeri );
|
auto pTalker = pack.getBNpcByRef( pBtData->m_talkerRef, pTeri );
|
||||||
|
|
||||||
auto handlerId = pHandler ? pHandler->getId() : 0xE0000000;
|
auto handlerId = pHandler ? pHandler->getId() : 0xE0000000;
|
||||||
auto talkerId = pTalker ? pTalker->getId() : 0xE0000000;
|
auto talkerId = pTalker ? pTalker->getId() : 0xE0000000;
|
||||||
|
@ -595,7 +610,7 @@ namespace Sapphire::Encounter
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TimepointDataType::SpawnBNpc:
|
case TimepointDataType::BNpcSpawn:
|
||||||
{
|
{
|
||||||
auto pSpawnData = std::dynamic_pointer_cast< TimepointDataSpawnBNpc, TimepointData >( m_pData );
|
auto pSpawnData = std::dynamic_pointer_cast< TimepointDataSpawnBNpc, TimepointData >( m_pData );
|
||||||
auto pBNpc = pTeri->getActiveBNpcByLayoutId( pSpawnData->m_layoutId );
|
auto pBNpc = pTeri->getActiveBNpcByLayoutId( pSpawnData->m_layoutId );
|
||||||
|
@ -615,7 +630,7 @@ namespace Sapphire::Encounter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TimepointDataType::SetBNpcFlags:
|
case TimepointDataType::BNpcFlags:
|
||||||
{
|
{
|
||||||
auto pBNpcFlagData = std::dynamic_pointer_cast< TimepointDataBNpcFlags, TimepointData >( m_pData );
|
auto pBNpcFlagData = std::dynamic_pointer_cast< TimepointDataBNpcFlags, TimepointData >( m_pData );
|
||||||
auto pBNpc = pTeri->getActiveBNpcByLayoutId( pBNpcFlagData->m_layoutId );
|
auto pBNpc = pTeri->getActiveBNpcByLayoutId( pBNpcFlagData->m_layoutId );
|
||||||
|
@ -674,7 +689,7 @@ namespace Sapphire::Encounter
|
||||||
case TimepointDataType::Snapshot:
|
case TimepointDataType::Snapshot:
|
||||||
{
|
{
|
||||||
auto pSnapshotData = std::dynamic_pointer_cast< TimepointDataSnapshot, TimepointData >( m_pData );
|
auto pSnapshotData = std::dynamic_pointer_cast< TimepointDataSnapshot, TimepointData >( m_pData );
|
||||||
auto pBNpc = self.getBNpcByRef( pSnapshotData->m_actorRef, pTeri );
|
auto pBNpc = pack.getBNpcByRef( pSnapshotData->m_actorRef, pTeri );
|
||||||
|
|
||||||
if( pBNpc )
|
if( pBNpc )
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,8 +30,8 @@ namespace Sapphire::Encounter
|
||||||
AddStatusEffect,
|
AddStatusEffect,
|
||||||
RemoveStatusEffect,
|
RemoveStatusEffect,
|
||||||
|
|
||||||
SpawnBNpc,
|
BNpcSpawn,
|
||||||
SetBNpcFlags,
|
BNpcFlags,
|
||||||
SetEObjState,
|
SetEObjState,
|
||||||
SetBgm,
|
SetBgm,
|
||||||
|
|
||||||
|
@ -195,7 +195,7 @@ namespace Sapphire::Encounter
|
||||||
// todo: hate type, source
|
// todo: hate type, source
|
||||||
|
|
||||||
TimepointDataSpawnBNpc( uint32_t layoutId, uint32_t flags, uint32_t type ) :
|
TimepointDataSpawnBNpc( uint32_t layoutId, uint32_t flags, uint32_t type ) :
|
||||||
TimepointData( TimepointDataType::SpawnBNpc ),
|
TimepointData( TimepointDataType::BNpcSpawn ),
|
||||||
m_layoutId( layoutId ),
|
m_layoutId( layoutId ),
|
||||||
m_flags( flags ),
|
m_flags( flags ),
|
||||||
m_type( type )
|
m_type( type )
|
||||||
|
@ -209,7 +209,7 @@ namespace Sapphire::Encounter
|
||||||
uint32_t m_flags{ 0 };
|
uint32_t m_flags{ 0 };
|
||||||
|
|
||||||
TimepointDataBNpcFlags( uint32_t layoutId, uint32_t flags ) :
|
TimepointDataBNpcFlags( uint32_t layoutId, uint32_t flags ) :
|
||||||
TimepointData( TimepointDataType::SetBNpcFlags ),
|
TimepointData( TimepointDataType::BNpcFlags ),
|
||||||
m_layoutId( layoutId ),
|
m_layoutId( layoutId ),
|
||||||
m_flags( flags )
|
m_flags( flags )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue