From 01521d2c981e3387444ba795259e978398e8fb69 Mon Sep 17 00:00:00 2001 From: Minho Kang Date: Fri, 22 Sep 2017 22:03:57 +0900 Subject: [PATCH] Implement offseting eorzean time Usage: @set eorzeatime time --- src/servers/Server_Common/Network/PacketDef/Ipcs.h | 1 + .../Network/PacketDef/Zone/ServerZoneDef.h | 5 +++++ src/servers/Server_Zone/Actor/Player.cpp | 13 ++++++++++++- src/servers/Server_Zone/Actor/Player.h | 4 ++++ .../DebugCommand/DebugCommandHandler.cpp | 11 +++++++++-- 5 files changed, 31 insertions(+), 3 deletions(-) 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 e9eb2aa7..f8a66d7a 100644 --- a/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp @@ -254,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 ) ); + } }