Release Notes
3.0.0
Preview
Build 2824 (Jul 28, 2026)
Bug Fixes
- Fixed: An object that became ownerless while ownership requests were still queued left those requesters waiting indefinitely — pending requesters are now denied when the owner goes away, and a direct state-channel claim of an ownerless object is blocked while forwarded requests are still pending
- Fixed: A race where releasing ownership could invalidate an already-approved ownership handoff — grants that were in flight when the object went ownerless are now validated against a snapshot of the requesters taken at release, so the approved requester still receives the object
- Fixed: Releasing an owned Dynamic-mode object fired ObjectOwnerChanged twice, with the first firing incorrectly reporting the releasing client as still the owner — the event now fires once with the actual post-release owner
- Fixed: Sconnecting from inside an RPC could previously have client iterating invalid state post disconnect, client will now immediatly stop iterating channels and boot out of the update loop if this happens
Build 2784 (Jul 17, 2026)
Breaking Changes
- Removed ServerType, all connections are always to the name server now
- Removed WebFlags
- Removed WebRTC
Bug Fixes
- Fixed: Multiple Bugs were fixed
- Fixed: Hardening against buffer overflows was added
Build 2597 (Jul 01, 2026)
Breaking Changes
- Namespace PhotonCommon::detail was renamed to PhotonCommon::Detail
- PhotonCommon::detail::is_result was renamed to PhotonCommon::Detail::IsResult
- PhotonCommon::detail::is_task was renamed to PhotonCommon::Detail::IsTask
- PhotonCommon::detail::unwrap_task was renamed to PhotonCommon::Detail::UnwrapTask
- FusionCore::MasterClientPlayerId was renamed to FusionCore::MASTER_CLIENT_PLAYER_ID
- FusionCore::PluginPlayerId was renamed to FusionCore::PLUGIN_PLAYER_ID
- FusionCore::ObjectOwnerPlayerId was renamed to FusionCore::OBJECT_OWNED_PLAYER_ID
- FusionCore::ObjectId::WordSize was renamed to FusionCore::ObjectId::WORD_SIZE
- FusionCore::RPC_InternalMinId was renamed to FusionCore::RPC_INTERNAL_MIN_ID
- FusionCore::RPC_InternalMaxId was renamed to FusionCore::RPC_INTERNAL_MAX_ID
- FusionCore::RPC_InternalMapChange was renamed to FusionCore::RPC_INTERNAL_MAP_CHANGE
- FusionCore::RPC_InternalObjectPriority was renamed to FusionCore::RPC_INTERNAL_OBJECT_PRIORITY
- FusionCore::RPC_InternalMapAdd was renamed to FusionCore::RPC_INTERNAL_MAP_ADD
- FusionCore::RPC_InternalMapRemove was renamed to FusionCore::RPC_INTERNAL_MAP_REMOVE
- FusionCore::RPC_InternalOwnershipRequest was renamed to FusionCore::RPC_INTERNAL_OWNERSHIP_REQUEST
- FusionCore::RPC_InternalRejectSubObject was renamed to FusionCore::RPC_INTERNAL_REJECT_SUB_OBJECT
- FusionCore::RPC_InternalDestroyedMapActors was renamed to FusionCore::RPC_INTERNAL_DESTROYED_MAP_ACTORS
- FusionCore::RPC_InternalForceDestroyObject was renamed to FusionCore::RPC_INTERNAL_FORCE_DESTROY_OBJECT
- FusionCore::RPC_InternalForceAliveObject was renamed to FusionCore::RPC_INTERNAL_FORCE_ALIVE_OBJECT
- FusionCore::RPC_InternalInput was renamed to FusionCore::RPC_INTERNAL_INPUT
- FusionCore::RPC_InternalPlayerInterest was renamed to FusionCore::RPC_INTERNAL_PLAYER_INTEREST
- FusionCore::RPC_InternalOwnershipResponse was renamed to FusionCore::RPC_INTERNAL_OWNERSHIP_RESPONSE
- FusionCore::Object::ExtraTailWords was renamed to FusionCore::Object::EXTRA_TAIL_WORDS
- FusionCore::WordData::offset was renamed to FusionCore::WordData::Offset
- FusionCore::WordData::value was renamed to FusionCore::WordData::Value
- FusionCore::SdkVersion::_packed was renamed to FusionCore::SdkVersion::Packed
- FusionCore::WriteFlags::buffer was renamed to FusionCore::WriteFlags::Buffer
- FusionCore::WriteFlags::offset was renamed to FusionCore::WriteFlags::Offset
- FusionCore::Notify::FragmentHeader::_reserved_1 was renamed to FusionCore::Notify::FragmentHeader::Reserved1
- FusionCore::FusionRoomProperties::Config was renamed to FusionCore::FusionRoomProperties::CONFIG
- FusionCore::FusionRoomProperties::MapData was renamed to FusionCore::FusionRoomProperties::MAP_DATA
- FusionCore::FusionRoomProperties::SdkVersion was renamed to FusionCore::FusionRoomProperties::SDK_VERSION
- FusionCore::FusionConfigDefaults::Json was renamed to FusionCore::FusionConfigDefaults::JSON
- PhotonCommon::Error::code was renamed to PhotonCommon::Error::Code
- PhotonCommon::Error::message was renamed to PhotonCommon::Error::Message
- PhotonCommon::detail::is_result_v was renamed to PhotonCommon::Detail::IS_RESULT_V
- PhotonCommon::detail::is_task_v was renamed to PhotonCommon::Detail::IS_TASK_V
- PhotonCommon::Task::promise_type::result was renamed to PhotonCommon::Task::promise_type::Result
- PhotonCommon::Task::promise_type::exception was renamed to PhotonCommon::Task::promise_type::Exception
- PhotonCommon::Task::promise_type::continuation was renamed to PhotonCommon::Task::promise_type::Continuation
- PhotonCommon::Task::promise_type::detached was renamed to PhotonCommon::Task::promise_type::Detached
- PhotonMatchmaking::AuthenticationValues::userId was renamed to PhotonMatchmaking::AuthenticationValues::UserId
- PhotonMatchmaking::AuthenticationValues::type was renamed to PhotonMatchmaking::AuthenticationValues::Type
- PhotonMatchmaking::AuthenticationValues::parameters was renamed to PhotonMatchmaking::AuthenticationValues::Parameters
- PhotonMatchmaking::AuthenticationValues::data was renamed to PhotonMatchmaking::AuthenticationValues::Data
- PhotonMatchmaking::ClientConstructOptions::appId was renamed to PhotonMatchmaking::ClientConstructOptions::AppId
- PhotonMatchmaking::ClientConstructOptions::appVersion was renamed to PhotonMatchmaking::ClientConstructOptions::AppVersion
- PhotonMatchmaking::ClientConstructOptions::protocol was renamed to PhotonMatchmaking::ClientConstructOptions::Protocol
- PhotonMatchmaking::ClientConstructOptions::useAlternativePorts was renamed to PhotonMatchmaking::ClientConstructOptions::UseAlternativePorts
- PhotonMatchmaking::ClientConstructOptions::regionSelectionMode was renamed to PhotonMatchmaking::ClientConstructOptions::RegionSelectionMode
- PhotonMatchmaking::ClientConstructOptions::autoLobbyStats was renamed to PhotonMatchmaking::ClientConstructOptions::AutoLobbyStats
- PhotonMatchmaking::ClientConstructOptions::serialization was renamed to PhotonMatchmaking::ClientConstructOptions::Serialization
- PhotonMatchmaking::ClientConstructOptions::disconnectTimeoutMs was renamed to PhotonMatchmaking::ClientConstructOptions::DisconnectTimeoutMs
- PhotonMatchmaking::ClientConstructOptions::pingIntervalMs was renamed to PhotonMatchmaking::ClientConstructOptions::PingIntervalMs
- PhotonMatchmaking::ClientConstructOptions::enableCrc was renamed to PhotonMatchmaking::ClientConstructOptions::EnableCrc
- PhotonMatchmaking::ClientConstructOptions::sentCountAllowance was renamed to PhotonMatchmaking::ClientConstructOptions::SentCountAllowance
- PhotonMatchmaking::ClientConstructOptions::quickResendAttempts was renamed to PhotonMatchmaking::ClientConstructOptions::QuickResendAttempts
- PhotonMatchmaking::ClientConstructOptions::limitOfUnreliableCommands was renamed to PhotonMatchmaking::ClientConstructOptions::LimitOfUnreliableCommands
- PhotonMatchmaking::ConnectOptions::auth was renamed to PhotonMatchmaking::ConnectOptions::Auth
- PhotonMatchmaking::ConnectOptions::username was renamed to PhotonMatchmaking::ConnectOptions::Username
- PhotonMatchmaking::ConnectOptions::serverType was renamed to PhotonMatchmaking::ConnectOptions::ServerType
- PhotonMatchmaking::ConnectOptions::serverAddress was renamed to PhotonMatchmaking::ConnectOptions::ServerAddress
- PhotonMatchmaking::ConnectOptions::tryUseDatagramEncryption was renamed to PhotonMatchmaking::ConnectOptions::TryUseDatagramEncryption
- PhotonMatchmaking::ConnectOptions::useBackgroundSendReceiveThread was renamed to PhotonMatchmaking::ConnectOptions::UseBackgroundSendReceiveThread
- PhotonMatchmaking::CreateRoomOptions::isVisible was renamed to PhotonMatchmaking::CreateRoomOptions::IsVisible
- PhotonMatchmaking::CreateRoomOptions::isOpen was renamed to PhotonMatchmaking::CreateRoomOptions::IsOpen
- PhotonMatchmaking::CreateRoomOptions::maxPlayers was renamed to PhotonMatchmaking::CreateRoomOptions::MaxPlayers
- PhotonMatchmaking::CreateRoomOptions::customProperties was renamed to PhotonMatchmaking::CreateRoomOptions::CustomProperties
- PhotonMatchmaking::CreateRoomOptions::lobbyProperties was renamed to PhotonMatchmaking::CreateRoomOptions::LobbyProperties
- PhotonMatchmaking::CreateRoomOptions::lobbyName was renamed to PhotonMatchmaking::CreateRoomOptions::LobbyName
- PhotonMatchmaking::CreateRoomOptions::lobbyType was renamed to PhotonMatchmaking::CreateRoomOptions::LobbyType
- PhotonMatchmaking::CreateRoomOptions::playerTtlMs was renamed to PhotonMatchmaking::CreateRoomOptions::PlayerTtlMs
- PhotonMatchmaking::CreateRoomOptions::emptyRoomTtlMs was renamed to PhotonMatchmaking::CreateRoomOptions::EmptyRoomTtlMs
- PhotonMatchmaking::CreateRoomOptions::suppressRoomEvents was renamed to PhotonMatchmaking::CreateRoomOptions::SuppressRoomEvents
- PhotonMatchmaking::CreateRoomOptions::publishUserId was renamed to PhotonMatchmaking::CreateRoomOptions::PublishUserId
- PhotonMatchmaking::CreateRoomOptions::directMode was renamed to PhotonMatchmaking::CreateRoomOptions::DirectMode
- PhotonMatchmaking::CreateRoomOptions::plugins was renamed to PhotonMatchmaking::CreateRoomOptions::Plugins
- PhotonMatchmaking::CreateRoomOptions::expectedUsers was renamed to PhotonMatchmaking::CreateRoomOptions::ExpectedUsers
- PhotonMatchmaking::DirectMessageOptions::targetPlayers was renamed to PhotonMatchmaking::DirectMessageOptions::TargetPlayers
- PhotonMatchmaking::DirectMessageOptions::receiverGroup was renamed to PhotonMatchmaking::DirectMessageOptions::ReceiverGroup
- PhotonMatchmaking::DirectMessageOptions::fallbackRelay was renamed to PhotonMatchmaking::DirectMessageOptions::FallbackRelay
- PhotonMatchmaking::EventOptions::reliable was renamed to PhotonMatchmaking::EventOptions::Reliable
- PhotonMatchmaking::EventOptions::channel was renamed to PhotonMatchmaking::EventOptions::Channel
- PhotonMatchmaking::EventOptions::receiverGroup was renamed to PhotonMatchmaking::EventOptions::ReceiverGroup
- PhotonMatchmaking::EventOptions::targetPlayers was renamed to PhotonMatchmaking::EventOptions::TargetPlayers
- PhotonMatchmaking::EventOptions::interestGroup was renamed to PhotonMatchmaking::EventOptions::InterestGroup
- PhotonMatchmaking::EventOptions::caching was renamed to PhotonMatchmaking::EventOptions::Caching
- PhotonMatchmaking::EventOptions::encrypt was renamed to PhotonMatchmaking::EventOptions::Encrypt
- PhotonMatchmaking::EventOptions::cacheSliceIndex was renamed to PhotonMatchmaking::EventOptions::CacheSliceIndex
- PhotonMatchmaking::EventOptions::webFlags was renamed to PhotonMatchmaking::EventOptions::WebFlags
- PhotonMatchmaking::Friend
- PhotonMatchmaking::JoinRoomOptions::rejoin was renamed to PhotonMatchmaking::JoinRoomOptions::Rejoin
- PhotonMatchmaking::JoinRoomOptions::cacheSliceIndex was renamed to PhotonMatchmaking::JoinRoomOptions::CacheSliceIndex
- PhotonMatchmaking::JoinRoomOptions::expectedUsers was renamed to PhotonMatchmaking::JoinRoomOptions::ExpectedUsers
- PhotonMatchmaking::LobbyStats::name was renamed to PhotonMatchmaking::LobbyStats::Name
- PhotonMatchmaking::LobbyStats::type was renamed to PhotonMatchmaking::LobbyStats::Type
- PhotonMatchmaking::LobbyStats::peerCount was renamed to PhotonMatchmaking::LobbyStats::PeerCount
- PhotonMatchmaking::LobbyStats::roomCount was renamed to PhotonMatchmaking::LobbyStats::RoomCount
- PhotonMatchmaking::MatchmakingOptions::filter was renamed to PhotonMatchmaking::MatchmakingOptions::Filter
- PhotonMatchmaking::MatchmakingOptions::maxPlayers was renamed to PhotonMatchmaking::MatchmakingOptions::MaxPlayers
- PhotonMatchmaking::MatchmakingOptions::mode was renamed to PhotonMatchmaking::MatchmakingOptions::Mode
- PhotonMatchmaking::MatchmakingOptions::lobbyName was renamed to PhotonMatchmaking::MatchmakingOptions::LobbyName
- PhotonMatchmaking::MatchmakingOptions::lobbyType was renamed to PhotonMatchmaking::MatchmakingOptions::LobbyType
- PhotonMatchmaking::MatchmakingOptions::sqlFilter was renamed to PhotonMatchmaking::MatchmakingOptions::SqlFilter
- PhotonMatchmaking::MatchmakingOptions::expectedUsers was renamed to PhotonMatchmaking::MatchmakingOptions::ExpectedUsers
- PhotonMatchmaking::NetworkStats::roundTripTimeMs was renamed to PhotonMatchmaking::NetworkStats::RoundTripTimeMs
- PhotonMatchmaking::NetworkStats::rttVarianceMs was renamed to PhotonMatchmaking::NetworkStats::RttVarianceMs
- PhotonMatchmaking::NetworkStats::bytesIn was renamed to PhotonMatchmaking::NetworkStats::BytesIn
- PhotonMatchmaking::NetworkStats::bytesOut was renamed to PhotonMatchmaking::NetworkStats::BytesOut
- PhotonMatchmaking::NetworkStats::bytesCurrentDispatch was renamed to PhotonMatchmaking::NetworkStats::BytesCurrentDispatch
- PhotonMatchmaking::NetworkStats::bytesLastOperation was renamed to PhotonMatchmaking::NetworkStats::BytesLastOperation
- PhotonMatchmaking::NetworkStats::queuedIncomingCommands was renamed to PhotonMatchmaking::NetworkStats::QueuedIncomingCommands
- PhotonMatchmaking::NetworkStats::queuedOutgoingCommands was renamed to PhotonMatchmaking::NetworkStats::QueuedOutgoingCommands
- PhotonMatchmaking::NetworkStats::incomingReliableCommands was renamed to PhotonMatchmaking::NetworkStats::IncomingReliableCommands
- PhotonMatchmaking::NetworkStats::resentReliableCommands was renamed to PhotonMatchmaking::NetworkStats::ResentReliableCommands
- PhotonMatchmaking::NetworkStats::playersInGame was renamed to PhotonMatchmaking::NetworkStats::PlayersInGame
- PhotonMatchmaking::NetworkStats::gamesRunning was renamed to PhotonMatchmaking::NetworkStats::GamesRunning
- PhotonMatchmaking::NetworkStats::playersOnline was renamed to PhotonMatchmaking::NetworkStats::PlayersOnline
- PhotonMatchmaking::NetworkStats::serverTimeOffsetMs was renamed to PhotonMatchmaking::NetworkStats::ServerTimeOffsetMs
- PhotonMatchmaking::NetworkStats::serverTimeMs was renamed to PhotonMatchmaking::NetworkStats::ServerTimeMs
- PhotonMatchmaking::NetworkStats::timestampLastReceive was renamed to PhotonMatchmaking::NetworkStats::TimestampLastReceive
- PhotonMatchmaking::NetworkStats::packetLossByCrc was renamed to PhotonMatchmaking::NetworkStats::PacketLossByCrc
- PhotonMatchmaking::NetworkStats::sentCountAllowance was renamed to PhotonMatchmaking::NetworkStats::SentCountAllowance
- PhotonMatchmaking::NetworkStats::encryptionAvailable was renamed to PhotonMatchmaking::NetworkStats::EncryptionAvailable
- PhotonMatchmaking::NetworkStats::payloadEncryptionAvailable was renamed to PhotonMatchmaking::NetworkStats::PayloadEncryptionAvailable
- PhotonMatchmaking::NetworkStats::peerId was renamed to PhotonMatchmaking::NetworkStats::PeerId
- PhotonMatchmaking::NetworkStats::disconnectTimeoutMs was renamed to PhotonMatchmaking::NetworkStats::DisconnectTimeoutMs
- PhotonMatchmaking::NetworkStats::pingIntervalMs was renamed to PhotonMatchmaking::NetworkStats::PingIntervalMs
- PhotonMatchmaking::NetworkStats::trafficStatsElapsedMs was renamed to PhotonMatchmaking::NetworkStats::TrafficStatsElapsedMs
- PhotonMatchmaking::NetworkStats::masterServerAddress was renamed to PhotonMatchmaking::NetworkStats::MasterServerAddress
- PhotonMatchmaking::NetworkStats::channelCountUserChannels was renamed to PhotonMatchmaking::NetworkStats::ChannelCountUserChannels
- PhotonMatchmaking::NetworkStats::serializationProtocol was renamed to PhotonMatchmaking::NetworkStats::SerializationProtocol
- PhotonMatchmaking::NetworkStats::peerCount was renamed to PhotonMatchmaking::NetworkStats::PeerCount
- PhotonMatchmaking::PlayerView::number was renamed to PhotonMatchmaking::PlayerView::Number
- PhotonMatchmaking::PlayerView::name was renamed to PhotonMatchmaking::PlayerView::Name
- PhotonMatchmaking::PlayerView::userId was renamed to PhotonMatchmaking::PlayerView::UserId
- PhotonMatchmaking::PlayerView::customProperties was renamed to PhotonMatchmaking::PlayerView::CustomProperties
- PhotonMatchmaking::PlayerView::isInactive was renamed to PhotonMatchmaking::PlayerView::IsInactive
- PhotonMatchmaking::PlayerView::isMasterClient was renamed to PhotonMatchmaking::PlayerView::IsMasterClient
- PhotonMatchmaking::Region
- PhotonMatchmaking::RoomListing::name was renamed to PhotonMatchmaking::RoomListing::Name
- PhotonMatchmaking::RoomListing::playerCount was renamed to PhotonMatchmaking::RoomListing::PlayerCount
- PhotonMatchmaking::RoomListing::maxPlayers was renamed to PhotonMatchmaking::RoomListing::MaxPlayers
- PhotonMatchmaking::RoomListing::isOpen was renamed to PhotonMatchmaking::RoomListing::IsOpen
- PhotonMatchmaking::RoomListing::directMode was renamed to PhotonMatchmaking::RoomListing::DirectMode
- PhotonMatchmaking::RoomListing::customProperties was renamed to PhotonMatchmaking::RoomListing::CustomProperties
- PhotonMatchmaking::TrafficStats::packageHeaderSize was renamed to PhotonMatchmaking::TrafficStats::PackageHeaderSize
- PhotonMatchmaking::TrafficStats::reliableCommandCount was renamed to PhotonMatchmaking::TrafficStats::ReliableCommandCount
- PhotonMatchmaking::TrafficStats::unreliableCommandCount was renamed to PhotonMatchmaking::TrafficStats::UnreliableCommandCount
- PhotonMatchmaking::TrafficStats::fragmentCommandCount was renamed to PhotonMatchmaking::TrafficStats::FragmentCommandCount
- PhotonMatchmaking::TrafficStats::controlCommandCount was renamed to PhotonMatchmaking::TrafficStats::ControlCommandCount
- PhotonMatchmaking::TrafficStats::totalPacketCount was renamed to PhotonMatchmaking::TrafficStats::TotalPacketCount
- PhotonMatchmaking::TrafficStats::totalCommandsInPackets was renamed to PhotonMatchmaking::TrafficStats::TotalCommandsInPackets
- PhotonMatchmaking::TrafficStats::reliableCommandBytes was renamed to PhotonMatchmaking::TrafficStats::ReliableCommandBytes
- PhotonMatchmaking::TrafficStats::unreliableCommandBytes was renamed to PhotonMatchmaking::TrafficStats::UnreliableCommandBytes
- PhotonMatchmaking::TrafficStats::fragmentCommandBytes was renamed to PhotonMatchmaking::TrafficStats::FragmentCommandBytes
- PhotonMatchmaking::TrafficStats::controlCommandBytes was renamed to PhotonMatchmaking::TrafficStats::ControlCommandBytes
- PhotonMatchmaking::TrafficStats::totalCommandCount was renamed to PhotonMatchmaking::TrafficStats::TotalCommandCount
- PhotonMatchmaking::TrafficStats::totalCommandBytes was renamed to PhotonMatchmaking::TrafficStats::TotalCommandBytes
- PhotonMatchmaking::TrafficStats::totalPacketBytes was renamed to PhotonMatchmaking::TrafficStats::TotalPacketBytes
- PhotonMatchmaking::TrafficStats::timestampOfLastAck was renamed to PhotonMatchmaking::TrafficStats::TimestampOfLastAck
- PhotonMatchmaking::TrafficStats::timestampOfLastReliableCommand was renamed to PhotonMatchmaking::TrafficStats::TimestampOfLastReliableCommand
- PhotonMatchmaking::TrafficStatsGameLevel::operationByteCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::OperationByteCount
- PhotonMatchmaking::TrafficStatsGameLevel::operationCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::OperationCount
- PhotonMatchmaking::TrafficStatsGameLevel::resultByteCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::ResultByteCount
- PhotonMatchmaking::TrafficStatsGameLevel::resultCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::ResultCount
- PhotonMatchmaking::TrafficStatsGameLevel::eventByteCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::EventByteCount
- PhotonMatchmaking::TrafficStatsGameLevel::eventCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::EventCount
- PhotonMatchmaking::TrafficStatsGameLevel::longestOpResponseCallbackMs was renamed to PhotonMatchmaking::TrafficStatsGameLevel::LongestOpResponseCallbackMs
- PhotonMatchmaking::TrafficStatsGameLevel::longestOpResponseCallbackOpCode was renamed to PhotonMatchmaking::TrafficStatsGameLevel::LongestOpResponseCallbackOpCode
- PhotonMatchmaking::TrafficStatsGameLevel::longestEventCallbackMs was renamed to PhotonMatchmaking::TrafficStatsGameLevel::LongestEventCallbackMs
- PhotonMatchmaking::TrafficStatsGameLevel::longestEventCallbackCode was renamed to PhotonMatchmaking::TrafficStatsGameLevel::LongestEventCallbackCode
- PhotonMatchmaking::TrafficStatsGameLevel::longestDeltaBetweenDispatchingMs was renamed to PhotonMatchmaking::TrafficStatsGameLevel::LongestDeltaBetweenDispatchingMs
- PhotonMatchmaking::TrafficStatsGameLevel::longestDeltaBetweenSendingMs was renamed to PhotonMatchmaking::TrafficStatsGameLevel::LongestDeltaBetweenSendingMs
- PhotonMatchmaking::TrafficStatsGameLevel::dispatchIncomingCommandsCalls was renamed to PhotonMatchmaking::TrafficStatsGameLevel::DispatchIncomingCommandsCalls
- PhotonMatchmaking::TrafficStatsGameLevel::sendOutgoingCommandsCalls was renamed to PhotonMatchmaking::TrafficStatsGameLevel::SendOutgoingCommandsCalls
- PhotonMatchmaking::TrafficStatsGameLevel::totalByteCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::TotalByteCount
- PhotonMatchmaking::TrafficStatsGameLevel::totalMessageCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::TotalMessageCount
- PhotonMatchmaking::TrafficStatsGameLevel::totalIncomingByteCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::TotalIncomingByteCount
- PhotonMatchmaking::TrafficStatsGameLevel::totalIncomingMessageCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::TotalIncomingMessageCount
- PhotonMatchmaking::TrafficStatsGameLevel::totalOutgoingByteCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::TotalOutgoingByteCount
- PhotonMatchmaking::TrafficStatsGameLevel::totalOutgoingMessageCount was renamed to PhotonMatchmaking::TrafficStatsGameLevel::TotalOutgoingMessageCount
- PhotonMatchmaking::WebFlags::httpForward was renamed to PhotonMatchmaking::WebFlags::HttpForward
- PhotonMatchmaking::WebFlags::sendAuthCookie was renamed to PhotonMatchmaking::WebFlags::SendAuthCookie
- PhotonMatchmaking::WebFlags::sendSync was renamed to PhotonMatchmaking::WebFlags::SendSync
- PhotonMatchmaking::WebFlags::sendState was renamed to PhotonMatchmaking::WebFlags::SendState
- PhotonMatchmaking::WebRpcResponse::resultCode was renamed to PhotonMatchmaking::WebRpcResponse::ResultCode
- PhotonMatchmaking::WebRpcResponse::errorString was renamed to PhotonMatchmaking::WebRpcResponse::ErrorString
- PhotonMatchmaking::WebRpcResponse::uriPath was renamed to PhotonMatchmaking::WebRpcResponse::UriPath
- PhotonMatchmaking::WebRpcResponse::returnData was renamed to PhotonMatchmaking::WebRpcResponse::ReturnData
- Misc.h CRC64() was renamed to Crc64, detail::pow10 was renamed to Detail::Pow10, detail::pow10table was renamed to Detail::POW_10_TABLE
- Methods in StringHeap.h and public members were renamed to PascalCase
- PhotonCommon::to_string_type was renamed to PhotonCommon::ToStringType
Build 2363 (Jun 10, 2026)
Breaking Changes
- The OnForceDisconnect callback now returns a PhotonCommon::StringType instead of a std::string and also returns a reason enum
Build 1969 (May 07, 2026)
Breaking Changes
- OnOwnershipRequest signature: bool(ObjectRoot*, PlayerId) -> void(ObjectRoot*, PlayerId). No longer a vote; owner replies asynchronously via Client::RespondToOwnershipRequest(obj, granted)
- C API: obj_give_away_owner → obj_respond_to_ownership_request(client, obj, granted). C#: Object.GiveAwayOwner -> Object.RespondToOwnershipRequest
- Removed Client::SetGiveAwayOwner and Client::RejectOwnershipRequest
- Removed OnObjectOwnerAssigned — use OnObjectOwnerChanged and compare against LocalPlayerId()
Bug Fixes
- Fixed: OnObjectOwnerChanged now also fires on first owner assignment during create
- Fixed: Request cooldown only bumps when the owner is reachable
- Fixed: Other consistency issues with ownership change behaviour
Build 1923 (May 05, 2026)
What's New
- The former
SharedClientSDK is renamed to Fusion Core. Almost every public surface changed: theSharedModenamespace becomesFusionCore, the singleFusionstatic library is split intoPhotonCommon→PhotonMatchmaking→FusionCore, and a new optionalFusionCAPIMODULE exposes a flat C ABI for engine bindings. The single-scene model is replaced by a multi-map session,PlayerPredictedownership andSimulationMode::Authorityenable server-authoritative prediction with input replay, andRealtimeClientgains a fullTask<Result<T>>async API. C++20 is now required
Changes
- Changed: namespace
SharedMode::*→FusionCore::*.SharedModeCompat.his included from every public header for partial source-compat - Changed: single
Fusionstatic library replaced byPhotonCommon→PhotonMatchmaking→FusionCorechain - Added: optional
FusionCAPIMODULE library exposing a flat C ABI — 235+ functions, opaque handles, polled event queue, blittableFusionEvent(28 B), unifiedFusionEventTypeenum (0–18 client / 100–116 realtime async / 200–220 realtime broadcasters), blittableFusionNetworkStats/FusionTrafficStats/FusionTrafficStatsGameLevel/FusionEMAReport. Header:FusionCore/libs/fusion_c_api/include/FusionCAPI.h - Added: cache flag
FUSION_BUILD_CAPI(ON for standalone, OFF for engine presets, always OFF on WASM, STATIC on iOS withFUSION_CAPI_STATICdefine) - Changed: library output filenames now embed the MSVC runtime suffix
_mt/_md(e.g.fusion_windows_x64_release_mt.lib) - Added: cache var
FUSION_MSVC_RUNTIME_LIBRARY(MultiThreaded/MultiThreadedDLL) drives the suffix and prebuilt PhotonRealtime variant filtering - Changed: CMake presets split across
CommonConfigurePresets.json,CommonBuildPresets.json,PlatformPresets.json,StandalonePresets.json,UnrealPresets.json,GodotPresets.json,TestPresets.json. Configure presets named<platform>-<arch>-<engine>[-<runtime>], build presets<platform>-<engine>[-<runtime>]-{debug,release} - Changed: C++ standard bumped to C++20 (required for
Task<T>coroutines) - Changed: CMake minimum bumped to 3.31
- Changed:
Version.his generated fromVersion.h.inat configure time usingversion.txt - Removed:
Client::ChangeScene(index, sequence, data)(single-scene model) - Added:
Client::MapChange(data)returningMap, plusMapAdd(data),MapRemove(map),MapIsValid(map)andGetMaps()for additive multi-map sessions - Changed:
Client::CreateSceneObjectrenamed toClient::CreateMapObject. TakesMapinstead ofuint32_t sceneanduint32_t engineFlagsinstead ofObjectSpecialFlags - Changed:
DestroyModes::SceneChangerenamed toDestroyModes::MapChange - Changed:
RPC_InternalSceneChangerenamed toRPC_InternalMapChange - Added:
RPC_InternalMapAdd,RPC_InternalMapRemove,RPC_InternalOwnershipRequest,RPC_InternalRejectSubObject,RPC_InternalDestroyedMapActors,RPC_InternalForceDestroyObject,RPC_InternalForceAliveObject,RPC_InternalInput,RPC_InternalPlayerInterest,RPC_InternalOwnershipResponse(12 reserved IDs total in 1..1023) - Removed:
OnSceneChange(index, sequence, Data&)broadcaster - Added:
OnMapChange(unordered_map<Map, Data>&, bool initial)broadcaster - Changed: room property
fusion_scene_datarenamed tofusion_map_data(now base64-encodedFusionMapStateBuilderpayload) - Removed: public
ObjectRoot::Scenefield. UseObjectRoot::GetMap()returningId.Map - Changed:
PlayerIdnarrowed fromuint32_ttouint16_t. Sentinels:MasterClientPlayerId = 0xFFFF,PluginPlayerId = 0xFFFE,ObjectOwnerPlayerId = 0xFFFD - Added:
Maptypedef (uint16_t) - Changed:
ObjectIdis now{Origin, Map, Counter}(still 8 bytes —Origin@016-bit,Map@216-bit,Counter@432-bit) - Changed:
ObjectId(packed)decoding is nowOrigin = packed & UINT16_MAX; Map = (packed >> 16) & UINT16_MAX; Counter = packed >> 32 - Changed:
Client::GetNewObjectId()is nowClient::GetNewObjectId(Map map) - Changed:
ObjectTailgrew from 24 bytes to 72 bytes. AddedReserved[8],PredictingPlayer,RejectedSequence,InputSequence,InputTime. RenamedSendRate→RoomSendRate - Changed:
Object::ExtraTailWordsis now 18 (was 6) - Added:
ObjectOwnerModes::PlayerPredicted = 5 - Added:
enum class SimulationMode { Shared = 0, Authority = 1 } - Changed:
RpcFlagsreworked from a struct (uint32_t _value) into anenum classwith bitwise operators and aHasFlag(flags, flag)helper - Added:
RpcFlags::IncorrectTargetForward,DontReplyWithResult,MapIncorrect,MaxDeliveryAttemptsReached, plusErrorFlagsaggregate - Removed:
Rpc::TargetComponent(uint16_t) field - Removed:
Rpc::DescriptorTypeHash(uint64_t) field. Routing now uses(Id, EventHash)only - Added:
Rpc::Sequence(uint64_t) andRpc::DeliveryAttempts(uint32_t) - Removed:
DescriptorTypeHashparameter fromClient::CreateUserRpc. New signature:(id, targetPlayer, targetObject, EventHash, data, dataLength) - Changed:
Client::SendUserRpcnow takesRpc&(non-const) — the SDK assignsSequencein place - Changed:
Client::SetSendRate(obj, rate)renamed toSetRoomSendRate(obj, rate).ResetSendRate(obj)renamed toResetRoomSendRate(obj) - Added:
Client::ResetLocalSendRate(obj)(counterpart to existingSetLocalSendRate) - Removed:
Client::ClearAllKeys,ClearAreaKeys,ClearUserKeys,SetAreaKeys,AddUserKey,RemoveUserKey,GetAllAreaKeys,GetAllUserKeys,GetInterestKeys. Replaced byInterestKeySet - Added:
Client::GetLocalInterestKeys()/GetPlayerInterestKeys(player)returningInterestKeySet&(withSet,Remove,Clear,ClearAreaKeys,ClearUserKeys,SetAreaKeys,AddUserKey,RemoveUserKey,GetAllAreaKeys,GetAllUserKeys,IsDirty,ClearDirtyand area/user encoding in the low bit) - Changed:
Client::Start()now returnsbool(wasvoid) — validatesfusion_configandfusion_map_dataroom properties and returnsfalseon precondition failure - Added:
Client::RefreshRoomCache() - Added:
Client::SetDynamicOwnerCooldown(seconds)/GetDynamicOwnerCooldown()(default1.0/3seconds, configurable at runtime) - Removed:
Object::DynamicOwnerCooldownTimestatic constant - Added:
Client::SetAuthoritySendRate(rate)/GetAuthoritySendRate()(default 30 Hz) - Added: prediction APIs
Client::GetSimulationMode(),GetPredictingPlayer(obj),SetPredictingPlayer(obj, player),IsPredictingPlayer(obj),HasInputAuthority(obj),GetInputSequence(obj),SetInputSequence(obj, seq),NextInputSequence() - Added:
ObjectRoot::QueueInput(dt, payload),ExecuteInputs(dt),GetInputQueueCount(),GetInputQueueDeltaTime(),GetInputTime() - Added:
Client::SetGiveAwayOwner(obj, player)to initiate explicit ownership transfers - Added:
Client::RejectOwnershipRequest(obj)to deny inboundOnOwnershipRequestrequests - Changed:
OnOwnerWasGivenrenamed toOnObjectOwnerAssigned - Changed:
OnObjectPredictionOverriderenamed toOnPredictionOverride - Added: broadcasters
OnRpcError,OnObjectForceAlive,OnSubObjectForceAlive,OnInput,OnPredictionReset,OnOwnershipRequest(returnsbool, aggregate any-truegrants),OnOwnershipResponse - Changed:
OnDestroyedMapActor(uint32_t, ObjectId)simplified toOnDestroyedMapActor(ObjectId)(first parameter dropped) - Removed: public
Object::Headerfield - Added:
Object::EngineBlob(Data),Object::EngineHash(uint64_t),Object::EngineFlags(uint32_t) replacingHeader - Removed:
enum class ObjectSpecialFlags.engineFlags(uint32_t) is supplied toCreate*calls and stored on the base class - Removed:
Object::Statusfield andOBJECT_STATUS_NEW/OBJECT_STATUS_PENDING/OBJECT_STATUS_CREATEDconstants - Added:
ObjectRoot::IsReady()andGetHasReceivedState()lifecycle queries - Removed:
Object::GetBytesSendLastTick,GetBytesReceivedLastTick,ConsumeBytesSendLastTick,ConsumeBytesReceivedLastTick,ResetReceivedBytes - Added: EMA-based stats
Object::GetSendReport()/GetRecvReport(),ObjectRoot::GetCombinedSendReport()/GetCombinedRecvReport(),Client::GetSendReport / GetRecvReport / GetSendStateReport / GetRecvStateReport / GetSendRpcReport / GetRecvRpcReport. ReturnsEMAReport { TotalAvg, TotalAvgPerSecond, CurrentAvgPerSecond, Min, Max }. New header:EMA.h - Removed: public
ObjectChild::TargetObjectHash(uint32_t) field - Changed:
Client::CreateSubObjectparametertargetObjectHash(uint32_t) renamed toengineHash(uint64_t, widened);ObjectSpecialFlagsparameter replaced byuint32_t engineFlags - Changed:
ObjectChild::Parentis now private. Access via staticObjectChild::GetParent(obj) - Changed: most
ObjectRootstate is private with getters (GetMap,GetOwner,GetOwnerMode,GetTime,IsReady,GetHasReceivedState,GetPluginVersion,GetClientVersion,GetSubObjects) - Changed:
ObjectRoot::RequiredObjects()returnsstd::span<ObjectId>(wasObjectId*) - Changed:
Object::StringHeapis lazy-allocated ({0}); was pre-allocated to 1024 bytes - Changed:
Object::SetHasValidData()no longer takes aboolargument (always sets the flag) - Changed:
LogLevelenum is now a bitmask (Trace = 1 << 0...Error = 1 << 4) - Added:
WriteBuffer::WriteMap(Map)/ReadBuffer::ReadMap()wire codec for the newMaptypedef - Added: public
PhotonCommontypes:Broadcaster<Sig>,Subscription,ScopedSubscription,SubscriptionBag,Result<T, CodeT>,Task<T>(C++20 coroutine),Error<CodeT>,LogOutput,LogUtils,SpanCompat,StringType,StringViewType,CoroutineCompat,PhotonAssert - Changed: every long-running
RealtimeClientoperation now returnsTask<Result<T>>(Connect / Reconnect / Disconnect / CreateRoom / JoinRoom / JoinOrCreateRoom / JoinRandomRoom / JoinRandomOrCreateRoom / LeaveRoom / JoinLobby / LeaveLobby / GetLobbyStats / FindFriends / WebRpc / AvailableRegions / SelectRegion) - Added:
RealtimeClientbroadcastersOnRoomJoined,OnRoomLeft,OnDirectConnectionEstablished,OnDirectConnectionFailed,OnCustomOperationResponse,OnCacheSliceChanged,OnPropertiesChangeFailed,OnAppStatsUpdated,OnWarning - Added:
RealtimeClient::SendCustomOperation,SendCustomAuthData,SetAutoJoinLobby,GetCountPlayersIngame,GetCountGamesRunning,GetCountPlayersOnline - Added: public
PhotonMatchmakingoption/value typesClientConstructOptions,ConnectOptions,CreateRoomOptions,JoinRoomOptions,MatchmakingOptions,EventOptions,DirectMessageOptions,MutableRoomView,PlayerView,RoomListing,LobbyStats,FriendInfo,NetworkStats,TrafficStats,TrafficStatsGameLevel,WebFlags,WebRpcResponse,PropertyValue,AuthenticationValues,RegionInfo,ConnectionState,DisconnectCause,LobbyType,MatchmakingMode,RegionSelectionMode,ServerType,DirectMode,ReceiverGroup,CustomAuthenticationType,EventCache,EventCallback,ConnectionProtocol,SerializationProtocol,ErrorCode - Added:
FusionRoomProperties.hexposing canonical room property keys (Config/MapData/SdkVersion),FusionConfigDefaults::Json,FusionMapStateBuilder::Build/Empty/BuildBase64/EmptyBase64,FusionSdkVersionBuilder::ToBytes/ToBase64,Base64::Encode/Decode - Added: CAPI helpers
fusion_room_property_key_config / _map_data / _sdk_version,fusion_config_defaults_json,fusion_map_state_empty_base64,fusion_sdk_version_current_base64,fusion_base64_encode / _decode - Added: CAPI web-flag bitmask
FUSION_WEB_FLAG_HTTP_FORWARD,FUSION_WEB_FLAG_SEND_AUTH_COOKIE,FUSION_WEB_FLAG_SEND_SYNC,FUSION_WEB_FLAG_SEND_STATE - Added:
Tools/FusionCore/Fusion{Config,Build,Install,ConfigBuildInstallAll,PackagePlugin}.ps1PowerShell wrappers around the preset matrix - Added:
Tools/Common/{Logging,TeamCity}/*.psm1shared PowerShell modules - Added:
Tools/Changelog/generate_changelog.pyPython changelog generator (withmapping.jsoncategorization) - Changed: GoogleTest 1.17.0 fetched via
FetchContentwhenPHOTON_BUILD_TESTS=ON.gtest_force_shared_crtis matched toFUSION_MSVC_RUNTIME_LIBRARY - Migration Notes
-
- Global rename
SharedMode::→FusionCore::(the includedSharedModeCompat.hcovers some callers; plan for a real rename)
- Global rename
-
PlayerIdisuint16_tandObjectId's middle 16 bits are nowMap— re-derive any custom packing or wire serialization. Sentinels moved from the0xFFFFFFFFfamily to the0xFFFFfamily
-
ObjectTailis 72 bytes (ExtraTailWords = 18); recompute any direct word offsets and renameSendRate→RoomSendRate
-
- Replace
ChangeScene(idx, seq, data)withMapChange(data)(orMapAdd); subscribe toOnMapChange(maps, initial)and diff the table; swapDestroyModes::SceneChange→MapChange
- Replace
-
- Replace
CreateSceneObjectwithCreateMapObject. PassMapinstead ofuint32_t sceneanduint32_t engineFlagsinstead ofObjectSpecialFlags. For sub-objects,targetObjectHashbecomesengineHash(uint64_t)
- Replace
-
- Drop
DescriptorTypeHashfromCreateUserRpc;SendUserRpctakesRpc&(non-const). ReplaceRpcFlags{._value=...}with the strong enum andHasFlag()
- Drop
-
- Rename
SetSendRate→SetRoomSendRateandResetSendRate→ResetRoomSendRate. PairSetLocalSendRatewith the newResetLocalSendRate
- Rename
-
- Client-level interest-key methods are gone; use
Client::GetLocalInterestKeys()/GetPlayerInterestKeys(player)and call methods on the returnedInterestKeySet
- Client-level interest-key methods are gone; use
-
- Drop reads of
Object::Status/SpecialFlags/Headerand the per-frame byte counters. UseObjectRoot::IsReady()/GetHasReceivedState(),EngineBlob/EngineFlags/EngineHash, and the EMA reports
- Drop reads of
-
- Subscribe to
OnObjectOwnerAssigned(replacesOnOwnerWasGiven) andOnPredictionOverride(replacesOnObjectPredictionOverride); addOnPredictionResetif you usePlayerPredicted
- Subscribe to
-
- Initiate ownership transfers via
Client::SetGiveAwayOwner(obj, player); grant inbound requests by returningtruefromOnOwnershipRequest; deny viaClient::RejectOwnershipRequest(obj)
- Initiate ownership transfers via
-
- For C ABI integrations, switch to
FusionCAPI.h(the old SDK had no C ABI). For CMake on MSVC, setFUSION_MSVC_RUNTIME_LIBRARYtoMultiThreadedorMultiThreadedDLLand pick the matching preset
- For C ABI integrations, switch to