diff --git a/src/common/Common.h b/src/common/Common.h index 94736d9b..507f8727 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -635,6 +635,8 @@ namespace Common { GearSetEquipMsg = 0x321, + DisableCurrentFestival = 0x386, + ToggleOrchestrionUnlock = 0x396, Dismount = 0x3a0 }; diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 0cb6b8b3..77b127a5 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -600,7 +600,7 @@ struct FFXIVIpcInitZone : FFXIVIpcBasePacket uint8_t weatherId; uint8_t bitmask; uint16_t unknown5; - uint16_t unknown6; + uint16_t festivalId; uint16_t unknown7; uint32_t unknown8; Common::FFXIVARR_POSITION3 pos; diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 7cc33dd9..abdc12b7 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -1623,6 +1623,7 @@ void Player::sendZonePackets() initZonePacket.data().weatherId = static_cast< uint8_t >( getCurrentZone()->getCurrentWeather() ); initZonePacket.data().bitmask = 0x1; initZonePacket.data().unknown5 = 0x2A; + initZonePacket.data().festivalId = getCurrentZone()->getCurrentFestival(); initZonePacket.data().pos.x = getPos().x; initZonePacket.data().pos.y = getPos().y; initZonePacket.data().pos.z = getPos().z; diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index ee20b4a5..96ac74c9 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -762,4 +762,19 @@ void Core::DebugCommandHandler::instance( char* data, Entity::Player &player, bo { player.exitInstance(); } + else if( subCommand == "festival" ) + { + uint32_t festivalId; + sscanf( params.c_str(), "%d", &festivalId ); + + player.getCurrentZone()->setCurrentFestival( static_cast< uint16_t >( festivalId ) ); + } + else if( subCommand == "disablefestival" ) + { + Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcActorControl143 > actorControl( player.getId() ); + actorControl.data().category = Core::Common::ActorControlType::DisableCurrentFestival; + player.queuePacket( actorControl ); + + player.getCurrentZone()->setCurrentFestival( 0 ); + } } diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index a102e2e7..4a4c8642 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -48,6 +48,7 @@ Zone::Zone() , m_currentWeather( static_cast< uint8_t >( Common::Weather::FairSkies ) ) , m_weatherOverride( 0 ) , m_lastMobUpdate( 0 ) + , m_currentFestivalId( 0 ) { } @@ -118,6 +119,16 @@ uint8_t Zone::getCurrentWeather() const return m_currentWeather; } +uint16_t Zone::getCurrentFestival() const +{ + return m_currentFestivalId; +} + +void Zone::setCurrentFestival( uint16_t festivalId ) +{ + m_currentFestivalId = festivalId; +} + CellCache* Zone::getCellCacheList( uint32_t cellx, uint32_t celly ) { assert( cellx < _sizeX ); diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index 500251f3..e9dd22ca 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -51,6 +51,7 @@ protected: uint64_t m_lastMobUpdate; + uint16_t m_currentFestivalId; boost::shared_ptr< Data::TerritoryType > m_territoryTypeInfo; std::map< uint8_t, int32_t> m_weatherRateMap; @@ -70,6 +71,9 @@ public: uint8_t getCurrentWeather() const; + uint16_t getCurrentFestival() const; + void setCurrentFestival( uint16_t festivalId ); + CellCache* getCellCacheList( uint32_t cellx, uint32_t celly ); CellCache* getCellCacheAndCreate( uint32_t cellx, uint32_t celly );