1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-29 07:37:45 +00:00

correctly register eobjs on startup/build and handle the interaction

This commit is contained in:
NotAdam 2018-11-30 22:52:08 +11:00
parent ebbe861e79
commit 0a5b71a320
13 changed files with 104 additions and 8 deletions

View file

@ -2909,6 +2909,10 @@ Sapphire::Data::HousingFurniture::HousingFurniture( uint32_t row_id, Sapphire::D
Sapphire::Data::HousingMapMarkerInfo::HousingMapMarkerInfo( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) Sapphire::Data::HousingMapMarkerInfo::HousingMapMarkerInfo( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData )
{ {
auto row = exdData->m_HousingMapMarkerInfoDat.get_row( row_id, subRow ); auto row = exdData->m_HousingMapMarkerInfoDat.get_row( row_id, subRow );
x = exdData->getField< float >( row, 0 );
y = exdData->getField< float >( row, 1 );
z = exdData->getField< float >( row, 2 );
plotNumberDistance = exdData->getField< float >( row, 3 );
map = exdData->getField< uint16_t >( row, 4 ); map = exdData->getField< uint16_t >( row, 4 );
} }

View file

@ -3048,6 +3048,10 @@ struct HousingFurniture
struct HousingMapMarkerInfo struct HousingMapMarkerInfo
{ {
uint16_t map; uint16_t map;
float x;
float y;
float z;
float plotNumberDistance;
HousingMapMarkerInfo( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); HousingMapMarkerInfo( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData );
}; };

View file

@ -1794,7 +1794,7 @@ struct FFXIVIpcObjectSpawn :
int16_t unknown24b; int16_t unknown24b;
uint16_t unknown28a; uint16_t unknown28a;
int16_t unknown28c; int16_t unknown28c;
uint32_t unknown2C; uint32_t housingLink;
Common::FFXIVARR_POSITION3 position; Common::FFXIVARR_POSITION3 position;
int16_t unknown3C; int16_t unknown3C;
int16_t unknown3E; int16_t unknown3E;

View file

@ -0,0 +1,38 @@
#include <ScriptObject.h>
#include <Actor/Player.h>
#include "Zone/HousingZone.h"
#include "Actor/EventObject.h"
using namespace Sapphire;
class HousingEstateEntranceWarpTaxi :
public Sapphire::ScriptAPI::EventScript
{
public:
HousingEstateEntranceWarpTaxi() :
Sapphire::ScriptAPI::EventScript( 0x0002004c )
{
}
void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override
{
auto zone = std::dynamic_pointer_cast< HousingZone >( player.getCurrentZone() );
if( !zone )
return;
auto eobj = zone->getEObj( actorId );
if( !eobj )
return;
player.sendDebug( "Found plot entrance for plot: " + std::to_string( eobj->getHousingLink() >> 8 ) );
player.playScene( getId(), 0, 0, []( Entity::Player& player, const Event::SceneResult& result )
{
if( result.param2 != 1 )
return;
// param2 == 1, zone into instance
} );
}
};

View file

@ -29,7 +29,8 @@ Sapphire::Entity::EventObject::EventObject( uint32_t actorId, uint32_t objectId,
m_gimmickId( gimmickId ), m_gimmickId( gimmickId ),
m_state( initialState ), m_state( initialState ),
m_objectId( objectId ), m_objectId( objectId ),
m_name( givenName ) m_name( givenName ),
m_housingLink( 0 )
{ {
m_id = actorId; m_id = actorId;
m_pos.x = pos.x; m_pos.x = pos.x;
@ -96,6 +97,16 @@ void Sapphire::Entity::EventObject::setAnimationFlag( uint32_t flag, uint32_t an
} }
} }
void Sapphire::Entity::EventObject::setHousingLink( uint32_t housingLink )
{
m_housingLink = housingLink;
}
uint32_t Sapphire::Entity::EventObject::getHousingLink() const
{
return m_housingLink;
}
void Sapphire::Entity::EventObject::setParentInstance( Sapphire::InstanceContentPtr instance ) void Sapphire::Entity::EventObject::setParentInstance( Sapphire::InstanceContentPtr instance )
{ {
m_parentInstance = instance; m_parentInstance = instance;
@ -125,6 +136,7 @@ void Sapphire::Entity::EventObject::spawn( Sapphire::Entity::PlayerPtr pTarget )
eobjStatePacket->data().position = getPos(); eobjStatePacket->data().position = getPos();
eobjStatePacket->data().scale = getScale(); eobjStatePacket->data().scale = getScale();
eobjStatePacket->data().actorId = getId(); eobjStatePacket->data().actorId = getId();
eobjStatePacket->data().housingLink = getHousingLink();
eobjStatePacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); eobjStatePacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() );
pTarget->queuePacket( eobjStatePacket ); pTarget->queuePacket( eobjStatePacket );
} }

View file

@ -45,7 +45,12 @@ namespace Sapphire::Entity
void setAnimationFlag( uint32_t flag, uint32_t animationFlag ); void setAnimationFlag( uint32_t flag, uint32_t animationFlag );
void setHousingLink( uint32_t housingLink );
uint32_t getHousingLink() const;
protected: protected:
uint32_t m_housingLink;
uint32_t m_gimmickId; uint32_t m_gimmickId;
uint32_t m_objectId; uint32_t m_objectId;
uint8_t m_state; uint8_t m_state;

View file

@ -12,6 +12,7 @@
#include <cstring> #include <cstring>
#include "Actor/Player.h" #include "Actor/Player.h"
#include "Actor/EventObject.h"
#include "TerritoryMgr.h" #include "TerritoryMgr.h"
#include "Zone.h" #include "Zone.h"
@ -321,6 +322,9 @@ void Sapphire::HousingMgr::buildPresetEstate( Entity::Player& player, uint8_t pl
player.setLandFlags( LandFlagsSlot::Private, EstateBuilt, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() ); player.setLandFlags( LandFlagsSlot::Private, EstateBuilt, pLand->getLandId(), pLand->getWardNum(), pLand->getTerritoryTypeId() );
player.sendLandFlagsSlot( LandFlagsSlot::Private ); player.sendLandFlagsSlot( LandFlagsSlot::Private );
auto eobj = hZone->registerEObj( "entrance", 2002737, 0, 4, pLand->getMapMarkerPosition(), 1.f, 0.f );
eobj->setHousingLink( plotNum << 8 );
} }
void Sapphire::HousingMgr::requestEstateRename( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId ) void Sapphire::HousingMgr::requestEstateRename( Entity::Player& player, uint16_t territoryTypeId, uint16_t worldId, uint8_t wardId, uint8_t plotId )

View file

@ -9,6 +9,7 @@
#include "Actor/Player.h" #include "Actor/Player.h"
#include "Actor/Actor.h" #include "Actor/Actor.h"
#include "Actor/EventObject.h"
#include "Land.h" #include "Land.h"
#include "House.h" #include "House.h"
@ -62,8 +63,14 @@ bool Sapphire::HousingZone::init()
uint32_t landId; uint32_t landId;
for( landId = 0; landId < 60; landId++ ) for( landId = 0; landId < 60; landId++ )
{ {
auto pObject = make_Land( m_territoryTypeId, getWardNum(), landId, m_landSetId, info ); auto pLand = make_Land( m_territoryTypeId, getWardNum(), landId, m_landSetId, info );
m_landPtrMap[ landId ] = pObject; m_landPtrMap[ landId ] = pLand;
if( auto house = pLand->getHouse() )
{
auto eobj = registerEObj( "entrance", 2002737, 0, 4, pLand->getMapMarkerPosition(), 1.f, 0.f );
eobj->setHousingLink( landId << 8 );
}
} }
return true; return true;
@ -134,7 +141,6 @@ void Sapphire::HousingZone::sendLandSet( Entity::Player& player )
landData.plotSize = pLand->getSize(); landData.plotSize = pLand->getSize();
landData.houseState = pLand->getState(); landData.houseState = pLand->getState();
landData.flags = 1;
landData.iconAddIcon = pLand->getSharing(); landData.iconAddIcon = pLand->getSharing();
landData.fcId = pLand->getFcId(); landData.fcId = pLand->getFcId();
landData.fcIcon = pLand->getFcIcon(); landData.fcIcon = pLand->getFcIcon();
@ -142,6 +148,8 @@ void Sapphire::HousingZone::sendLandSet( Entity::Player& player )
if( auto house = pLand->getHouse() ) if( auto house = pLand->getHouse() )
{ {
landData.flags = 1;
auto& parts = house->getHouseParts(); auto& parts = house->getHouseParts();
for( auto i = 0; i != parts.size(); i++ ) for( auto i = 0; i != parts.size(); i++ )
@ -169,7 +177,6 @@ void Sapphire::HousingZone::sendLandUpdate( uint8_t landId )
landData.plotSize = pLand->getSize(); landData.plotSize = pLand->getSize();
landData.houseState = pLand->getState(); landData.houseState = pLand->getState();
landData.flags = 1;
landData.iconAddIcon = pLand->getSharing(); landData.iconAddIcon = pLand->getSharing();
landData.fcId = pLand->getFcId(); landData.fcId = pLand->getFcId();
landData.fcIcon = pLand->getFcIcon(); landData.fcIcon = pLand->getFcIcon();
@ -178,6 +185,8 @@ void Sapphire::HousingZone::sendLandUpdate( uint8_t landId )
if( auto house = pLand->getHouse() ) if( auto house = pLand->getHouse() )
{ {
landData.flags = 1;
auto& parts = house->getHouseParts(); auto& parts = house->getHouseParts();
for( auto i = 0; i != parts.size(); i++ ) for( auto i = 0; i != parts.size(); i++ )
@ -221,4 +230,4 @@ Sapphire::LandPtr Sapphire::HousingZone::getLand( uint8_t id )
return nullptr; return nullptr;
return it->second; return it->second;
} }

View file

@ -42,6 +42,8 @@ namespace Sapphire
void sendLandUpdate( uint8_t landId ); void sendLandUpdate( uint8_t landId );
bool isPlayerSubInstance( Entity::Player& player ); bool isPlayerSubInstance( Entity::Player& player );
bool onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId );
/* returns current ward number for this zone */ /* returns current ward number for this zone */
uint8_t getWardNum() const; uint8_t getWardNum() const;

View file

@ -88,6 +88,16 @@ void Sapphire::Land::load()
m_pHouse = make_House( houseId, m_landSetId, m_landId, m_wardNum, m_territoryTypeId ); m_pHouse = make_House( houseId, m_landSetId, m_landId, m_wardNum, m_territoryTypeId );
} }
auto pExdData = g_fw.get< Data::ExdDataGenerated >();
auto info = pExdData->get< Sapphire::Data::HousingMapMarkerInfo >( getTerritoryTypeId(), getLandId() );
if( info )
{
m_mapMarkerPosition.x = info->x;
m_mapMarkerPosition.y = info->y;
m_mapMarkerPosition.z = info->z;
}
init(); init();
} }
@ -169,6 +179,11 @@ Sapphire::HousePtr Sapphire::Land::getHouse() const
return m_pHouse; return m_pHouse;
} }
FFXIVARR_POSITION3 Sapphire::Land::getMapMarkerPosition()
{
return m_mapMarkerPosition;
}
Sapphire::Common::LandType Sapphire::Land::getLandType() const Sapphire::Common::LandType Sapphire::Land::getLandType() const
{ {
return m_type; return m_type;

View file

@ -36,6 +36,7 @@ namespace Sapphire
uint16_t getTerritoryTypeId() const; uint16_t getTerritoryTypeId() const;
Common::LandType getLandType() const; Common::LandType getLandType() const;
Sapphire::HousePtr getHouse() const; Sapphire::HousePtr getHouse() const;
Common::FFXIVARR_POSITION3 getMapMarkerPosition();
//Free Comapny //Free Comapny
void setFreeCompany( uint32_t id, uint32_t icon, uint32_t color ); void setFreeCompany( uint32_t id, uint32_t icon, uint32_t color );
@ -78,6 +79,8 @@ namespace Sapphire
uint32_t m_fcIcon; uint32_t m_fcIcon;
uint32_t m_fcIconColor; uint32_t m_fcIconColor;
Common::FFXIVARR_POSITION3 m_mapMarkerPosition;
uint32_t m_ownerPlayerId; uint32_t m_ownerPlayerId;
Sapphire::Data::HousingLandSetPtr m_landInfo; Sapphire::Data::HousingLandSetPtr m_landInfo;

View file

@ -727,7 +727,7 @@ void Sapphire::Zone::registerEObj( Entity::EventObjectPtr object )
onRegisterEObj( object ); onRegisterEObj( object );
pLog->debug( "Registered instance eobj: " + std::to_string( object->getId() ) ); //pLog->debug( "Registered instance eobj: " + std::to_string( object->getId() ) );
} }
Sapphire::Entity::EventObjectPtr Sapphire::Zone::getEObj( uint32_t objId ) Sapphire::Entity::EventObjectPtr Sapphire::Zone::getEObj( uint32_t objId )