diff --git a/src/servers/Server_Common/Network/PacketDef/Ipcs.h b/src/servers/Server_Common/Network/PacketDef/Ipcs.h index d18c36f6..b4ade11c 100644 --- a/src/servers/Server_Common/Network/PacketDef/Ipcs.h +++ b/src/servers/Server_Common/Network/PacketDef/Ipcs.h @@ -116,6 +116,7 @@ namespace Packets { WeatherChange = 0x01AF, // updated for sb Discovery = 0x01B2, // updated for sb + EorzeaTimeOffset = 0x01B4, CFAvailableContents = 0x01CF, diff --git a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h index c1c2388f..10a34cd0 100644 --- a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1281,6 +1281,11 @@ struct FFXIVIpcCFMemberStatus : FFXIVIpcBasePacket uint32_t unknown3; }; +struct FFXIVIpcEorzeaTimeOffset : FFXIVIpcBasePacket +{ + uint64_t timestamp; +}; + } /* Server */ diff --git a/src/servers/Server_Zone/Actor/Player.cpp b/src/servers/Server_Zone/Actor/Player.cpp index ed6af547..49bc2ad3 100644 --- a/src/servers/Server_Zone/Actor/Player.cpp +++ b/src/servers/Server_Zone/Actor/Player.cpp @@ -1667,4 +1667,15 @@ void Core::Entity::Player::setOpeningSequence( uint8_t seq ) { setSyncFlag( OpeningSeq ); m_openingSequence = seq; -} \ No newline at end of file +} + +/// Tells client to offset their eorzean time by given timestamp. +void Core::Entity::Player::setEorzeaTimeOffset( uint64_t timestamp ) +{ + // TODO: maybe change to persistent? + GamePacketNew< FFXIVIpcEorzeaTimeOffset, ServerZoneIpcType > packet ( getId() ); + packet.data().timestamp = timestamp; + + // Send to single player + queuePacket( packet ); +} diff --git a/src/servers/Server_Zone/Actor/Player.h b/src/servers/Server_Zone/Actor/Player.h index a34d8a46..907a5916 100644 --- a/src/servers/Server_Zone/Actor/Player.h +++ b/src/servers/Server_Zone/Actor/Player.h @@ -499,6 +499,10 @@ public: uint32_t getCFPenaltyMinutes() const; void setCFPenaltyMinutes( uint32_t minutes ); + + void setEorzeaTimeOffset( uint64_t timestamp ); + + private: uint32_t m_lastWrite; uint32_t m_lastPing; diff --git a/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp index 9e509dab..6a4f6e84 100644 --- a/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp @@ -40,7 +40,6 @@ extern Core::ServerZone g_serverZone; // instanciate and initialize commands Core::DebugCommandHandler::DebugCommandHandler() { - // Push all commands onto the register map ( command name - function - description - required GM level ) registerCommand( "set", &DebugCommandHandler::set, "Loads and injects a premade Packet.", 1 ); registerCommand( "get", &DebugCommandHandler::get, "Loads and injects a premade Packet.", 1 ); @@ -186,8 +185,8 @@ void Core::DebugCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlaye else if( ( subCommand == "unlockaetheryte" ) && ( params != "" ) ) { - for( uint8_t i = 0; i < 255; i++ ) - pPlayer->registerAetheryte( i ); + for( uint8_t i = 0; i < 255; i++ ) + pPlayer->registerAetheryte( i ); } else if( ( subCommand == "discovery" ) && ( params != "" ) ) @@ -255,18 +254,25 @@ void Core::DebugCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlaye else if( subCommand == "aaah" ) { int32_t id; - sscanf( params.c_str(), "%d", &id ); + pPlayer->sendDebug( std::to_string( pPlayer->actionHasCastTime( id ) ) ); } else if ( subCommand == "cfpenalty" ) { int32_t minutes; - sscanf( params.c_str(), "%d", &minutes ); pPlayer->setCFPenaltyMinutes( minutes ); } + else if ( subCommand == "eorzeatime" ) + { + uint64_t timestamp; + sscanf( params.c_str(), "%llu", ×tamp ); + + pPlayer->setEorzeaTimeOffset( timestamp ); + pPlayer->sendNotice( "Eorzea time offset: " + std::to_string( timestamp ) ); + } }