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:
parent
cf69e1876a
commit
895d1eb7b1
6 changed files with 93 additions and 28 deletions
7
deps/datReader/DatCategories/bg/LgbTypes.h
vendored
7
deps/datReader/DatCategories/bg/LgbTypes.h
vendored
|
@ -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;
|
||||||
|
|
11
deps/datReader/DatCategories/bg/lgb.h
vendored
11
deps/datReader/DatCategories/bg/lgb.h
vendored
|
@ -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;
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 );
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue