1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-02 08:57:44 +00:00

Fallback to entranceRect if no entrance circle is found in instance

This commit is contained in:
Mordred 2022-01-30 22:32:03 +01:00
parent cf69e1876a
commit 895d1eb7b1
6 changed files with 93 additions and 28 deletions

View file

@ -137,7 +137,7 @@ struct EObjData : public InstanceObject
uint8_t unknown1[0xC]; uint8_t unknown1[0xC];
}; };
enum TriggerBoxShape : uint32_t enum TriggerBoxShape : int32_t
{ {
TriggerBoxShapeBox = 0x1, TriggerBoxShapeBox = 0x1,
TriggerBoxShapeSphere = 0x2, TriggerBoxShapeSphere = 0x2,
@ -156,6 +156,11 @@ struct TriggerBoxInstanceObject
uint32_t reserved; uint32_t reserved;
}; };
struct EventRangeData : public InstanceObject
{
TriggerBoxInstanceObject triggerBox;
};
struct ExitRangeData : public InstanceObject struct ExitRangeData : public InstanceObject
{ {
TriggerBoxInstanceObject triggerBoxType; TriggerBoxInstanceObject triggerBoxType;

View file

@ -150,6 +150,17 @@ public:
}; };
}; };
struct LGB_EVENT_RANGE_ENTRY : public LgbEntry
{
public:
EventRangeData data;
LGB_EVENT_RANGE_ENTRY( char* buf, size_t offset ) : LgbEntry( buf, offset )
{
data = *reinterpret_cast< EventRangeData* >( buf + offset );
};
};
struct LGB_GROUP_HEADER struct LGB_GROUP_HEADER
{ {
uint32_t id; uint32_t id;

View file

@ -6,12 +6,15 @@
#include <Exd/ExdData.h> #include <Exd/ExdData.h>
#include <Network/CommonActorControl.h> #include <Network/CommonActorControl.h>
#include <Service.h> #include <Service.h>
#include <datReader/DatCategories/bg/pcb.h>
#include <datReader/DatCategories/bg/lgb.h>
#include <datReader/DatCategories/bg/sgb.h>
#include "Event/Director.h" #include "Event/Director.h"
#include "Event/EventDefs.h" #include "Event/EventDefs.h"
#include "Script/ScriptMgr.h" #include "Script/ScriptMgr.h"
#include "WorldServer.h" #include "WorldServer.h"
#include "Manager/PlayerMgr.h" #include "Manager/PlayerMgr.h"
#include "Manager/TerritoryMgr.h"
#include "Manager/EventMgr.h" #include "Manager/EventMgr.h"
#include "Actor/Player.h" #include "Actor/Player.h"
@ -23,6 +26,8 @@
#include "Event/EventHandler.h" #include "Event/EventHandler.h"
#include "InstanceContent.h" #include "InstanceContent.h"
#include "InstanceObjectCache.h"
using namespace Sapphire::Common; using namespace Sapphire::Common;
using namespace Sapphire::Network::Packets; using namespace Sapphire::Network::Packets;
@ -453,11 +458,22 @@ void Sapphire::InstanceContent::onBeforePlayerZoneIn( Sapphire::Entity::Player&
// if a player has already spawned once inside this instance, don't move them if they happen to zone in again // if a player has already spawned once inside this instance, don't move them if they happen to zone in again
if( !hasPlayerPreviouslySpawned( player ) ) if( !hasPlayerPreviouslySpawned( player ) )
{ {
auto& exdData = Common::Service< Data::ExdData >::ref();
auto& instanceObjectCache = Common::Service< InstanceObjectCache >::ref();
auto contentInfo = exdData.getRow< Excel::InstanceContent >( m_instanceContentId );
auto rect = instanceObjectCache.getEventRange( contentInfo->data().EntranceRect );
if( m_pEntranceEObj != nullptr ) if( m_pEntranceEObj != nullptr )
{ {
player.setRot( PI ); player.setRot( PI );
player.setPos( m_pEntranceEObj->getPos() ); player.setPos( m_pEntranceEObj->getPos() );
} }
else if( rect )
{
player.setRot( PI );
player.setPos( { rect->header.transform.translation.x, rect->header.transform.translation.y, rect->header.transform.translation.z } );
}
else else
{ {
player.setRot( PI ); player.setRot( PI );

View file

@ -20,41 +20,55 @@ namespace Sapphire
Terminate Terminate
}; };
/*0x40000001 - INSTANCE_CONTENT_ORDER_SYSTEM_START
0x40000002 - INSTANCE_CONTENT_ORDER_SYSTEM_CLEAR_NORMAL
0x40000003 - INSTANCE_CONTENT_ORDER_SYSTEM_RESET_???? ( not really sure about that, seems like reset, arg1 must be 1 )
0x40000004 - INSTANCE_CONTENT_ORDER_PVP_READY ( unsure )
0x40000005 - INSTANCE_CONTENT_ORDER_SYSTEM_RESET
0x40000006 - INSTANCE_CONTENT_ORDER_SYSTEM_RESTART
0x40000007 - INSTANCE_CONTENT_ORDER_SYSTEM_VOTE_ENABLE
0x40000008 - INSTANCE_CONTENT_ORDER_SYSTEM_VOTE_START
0x40000009 - INSTANCE_CONTENT_ORDER_SYSTEM_VOTE_RESULT
0x4000000A - INSTANCE_CONTENT_ORDER_SYSTEM_VOTE_CANCEL
0x4000000B - INSTANCE_CONTENT_ORDER_SYSTEM_UPDATE_CLEAR_MEMBER
0x4000000C - INSTANCE_CONTENT_ORDER_SYSTEM_PLAY_SHARED_GROUP
0x4000000D - INSTANCE_CONTENT_ORDER_SYSTEM_SyncTime?
0x4000000E - INSTANCE_CONTENT_ORDER_SYSTEM_Unknown - no args - some timer set */
enum DirectorEventId : uint32_t enum DirectorEventId : uint32_t
{ {
DEBUG_TimeSync = 0xC0000001, DEBUG_TimeSync = 0xC0000001,
DutyCommence = 0x80000001, DutyCommence = 0x40000001,
BattleGroundMusic = 0x80000002, BattleGroundMusic = 0x40000002,
SetStringendoMode = 0x80000003, SetStringendoMode = 0x40000003,
DutyComplete = 0x80000004, DutyComplete = 0x40000004,
InvalidateTodoList = 0x80000005, InvalidateTodoList = 0x40000005,
LoadingScreen = 0x80000007, LoadingScreen = 0x40000007,
Forward = 0x80000008, Forward = 0x40000008,
VoteState = 0x80000009, VoteState = 0x40000009,
VoteStart = 0x8000000A, VoteStart = 0x4000000A,
VoteResult = 0x8000000B, VoteResult = 0x4000000B,
VoteFinish = 0x8000000C, VoteFinish = 0x4000000C,
TreasureVoteRefresh = 0x8000000D, TreasureVoteRefresh = 0x4000000D,
SetSharedGroupId = 0x8000000E, SetSharedGroupId = 0x4000000E,
FirstTimeNotify = 0x8000000F FirstTimeNotify = 0x4000000F
}; };
enum EventHandlerOrderId : uint32_t enum EventHandlerOrderId : uint32_t
{ {
SheetDataReady = 0x80000000, SheetDataReady = 0x80000000,
AbortContent = 0x80000001, //forceFlag AbortContent = 0x40000001, //forceFlag
LuaOnStartCutscene = 0x80000002, //returnCode LuaOnStartCutscene = 0x40000002, //returnCode
VoteRequest = 0x80000003, //voteType VoteRequest = 0x40000003, //voteType
VoteReplay = 0x80000004 //voteType, accept VoteReplay = 0x40000004 //voteType, accept
}; };
enum DirectorSceneId enum DirectorSceneId
{ {
None = 0, None = 0,
SetupEventArgsOnStart = 1, SetupEventArgsOnStart = 1,
SetupEventArgsInProgress = 2, SetupEventArgsInProgress = 2,
DutyFailed = 5 DutyFailed = 5
}; };
enum TerminateReason : uint8_t enum TerminateReason : uint8_t

View file

@ -83,6 +83,7 @@ Sapphire::InstanceObjectCache::InstanceObjectCache()
{ {
for( const auto& pEntry : group.entries ) for( const auto& pEntry : group.entries )
{ {
if( pEntry->getType() == LgbEntryType::MapRange ) if( pEntry->getType() == LgbEntryType::MapRange )
{ {
auto pMapRange = std::reinterpret_pointer_cast< LGB_MAP_RANGE_ENTRY >( pEntry ); auto pMapRange = std::reinterpret_pointer_cast< LGB_MAP_RANGE_ENTRY >( pEntry );
@ -112,6 +113,11 @@ Sapphire::InstanceObjectCache::InstanceObjectCache()
auto pENpc = std::reinterpret_pointer_cast< LGB_ENPC_ENTRY >( pEntry ); auto pENpc = std::reinterpret_pointer_cast< LGB_ENPC_ENTRY >( pEntry );
m_enpcCache.insert( 0, pENpc ); m_enpcCache.insert( 0, pENpc );
} }
else if( pEntry->getType() == LgbEntryType::EventRange )
{
auto pEventRange = std::reinterpret_pointer_cast< LGB_EVENT_RANGE_ENTRY >( pEntry );
m_eventRangeCache.insert( 0, pEventRange );
}
} }
} }
} }
@ -119,8 +125,8 @@ Sapphire::InstanceObjectCache::InstanceObjectCache()
std::cout << "\n"; std::cout << "\n";
Logger::debug( Logger::debug(
"InstanceObjectCache Cached: MapRange: {} ExitRange: {} PopRange: {}", "InstanceObjectCache Cached: MapRange: {} ExitRange: {} PopRange: {} EventNpc: {} EventRange: {}",
m_mapRangeCache.size(), m_exitRangeCache.size(), m_popRangeCache.size() m_mapRangeCache.size(), m_exitRangeCache.size(), m_popRangeCache.size(), m_enpcCache.size(), m_eventRangeCache.size()
); );
} }
@ -153,4 +159,9 @@ Sapphire::InstanceObjectCache::ENpcPtr
Sapphire::InstanceObjectCache::getENpc( uint32_t eNpcId ) Sapphire::InstanceObjectCache::getENpc( uint32_t eNpcId )
{ {
return m_enpcCache.get( 0, eNpcId ); return m_enpcCache.get( 0, eNpcId );
} }
Sapphire::InstanceObjectCache::EventRangePtr Sapphire::InstanceObjectCache::getEventRange( uint32_t eventRangeId )
{
return m_eventRangeCache.get( 0, eventRangeId );
}

View file

@ -9,6 +9,7 @@ struct LGB_EXIT_RANGE_ENTRY;
struct LGB_POP_RANGE_ENTRY; struct LGB_POP_RANGE_ENTRY;
struct LGB_EOBJ_ENTRY; struct LGB_EOBJ_ENTRY;
struct LGB_ENPC_ENTRY; struct LGB_ENPC_ENTRY;
struct LGB_EVENT_RANGE_ENTRY;
namespace Sapphire namespace Sapphire
@ -57,7 +58,11 @@ namespace Sapphire
size_t size() const size_t size() const
{ {
return m_objectCache.size(); size_t size = 0;
for( auto& it = m_objectCache.begin(); it != m_objectCache.end(); ++it )
size += it->second.size();
return size;
} }
}; };
@ -69,6 +74,7 @@ namespace Sapphire
using PopRangePtr = std::shared_ptr< LGB_POP_RANGE_ENTRY >; using PopRangePtr = std::shared_ptr< LGB_POP_RANGE_ENTRY >;
using EObjPtr = std::shared_ptr< LGB_EOBJ_ENTRY >; using EObjPtr = std::shared_ptr< LGB_EOBJ_ENTRY >;
using ENpcPtr = std::shared_ptr< LGB_ENPC_ENTRY >; using ENpcPtr = std::shared_ptr< LGB_ENPC_ENTRY >;
using EventRangePtr = std::shared_ptr< LGB_EVENT_RANGE_ENTRY >;
InstanceObjectCache(); InstanceObjectCache();
~InstanceObjectCache() = default; ~InstanceObjectCache() = default;
@ -78,6 +84,7 @@ namespace Sapphire
PopRangePtr getPopRange( uint16_t zoneId, uint32_t popRangeId ); PopRangePtr getPopRange( uint16_t zoneId, uint32_t popRangeId );
EObjPtr getEObj( uint32_t eObjId ); EObjPtr getEObj( uint32_t eObjId );
ENpcPtr getENpc( uint32_t eNpcId ); ENpcPtr getENpc( uint32_t eNpcId );
EventRangePtr getEventRange( uint32_t eventRangeId );
private: private:
ObjectCache< LGB_MAP_RANGE_ENTRY > m_mapRangeCache; ObjectCache< LGB_MAP_RANGE_ENTRY > m_mapRangeCache;
@ -85,6 +92,7 @@ namespace Sapphire
ObjectCache< LGB_POP_RANGE_ENTRY > m_popRangeCache; ObjectCache< LGB_POP_RANGE_ENTRY > m_popRangeCache;
ObjectCache< LGB_EOBJ_ENTRY > m_eobjCache; ObjectCache< LGB_EOBJ_ENTRY > m_eobjCache;
ObjectCache< LGB_ENPC_ENTRY > m_enpcCache; ObjectCache< LGB_ENPC_ENTRY > m_enpcCache;
ObjectCache< LGB_EVENT_RANGE_ENTRY > m_eventRangeCache;
std::shared_ptr< Framework > m_pFramework; std::shared_ptr< Framework > m_pFramework;
}; };