From b17b45edbbbcb68adebfc8af80ae89e6c7c81ed4 Mon Sep 17 00:00:00 2001 From: Marc Chapman Date: Thu, 27 Jul 2017 00:09:36 +0100 Subject: [PATCH] packet-size-checking -- Methods for querying packet-size settings. Used for detecting when spells or effects overrun the packet buffer from networked dynamic field usage. scope-tracking -- changes related to the tracking of AFX constraint objects as they move in and out of scope. --- Engine/source/T3D/gameBase/gameBase.cpp | 28 +++++++++++++++++++-- Engine/source/T3D/gameBase/gameBase.h | 6 ++++- Engine/source/sim/netConnection.cpp | 5 +++- Engine/source/sim/netConnection.h | 8 ++++++ Engine/source/sim/netObject.cpp | 33 +++++++++++++++++++++++++ Engine/source/sim/netObject.h | 17 +++++++++++++ 6 files changed, 93 insertions(+), 4 deletions(-) diff --git a/Engine/source/T3D/gameBase/gameBase.cpp b/Engine/source/T3D/gameBase/gameBase.cpp index 903187ac3..4a98742c1 100644 --- a/Engine/source/T3D/gameBase/gameBase.cpp +++ b/Engine/source/T3D/gameBase/gameBase.cpp @@ -24,6 +24,7 @@ // Arcane-FX for MIT Licensed Open Source version of Torque 3D from GarageGames // Copyright (C) 2015 Faust Logic, Inc. //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~// + #include "platform/platform.h" #include "T3D/gameBase/gameBase.h" #include "console/consoleTypes.h" @@ -40,6 +41,7 @@ #include "T3D/aiConnection.h" #endif +#include "afx/arcaneFX.h" //---------------------------------------------------------------------------- // Ghost update relative priority values @@ -254,6 +256,8 @@ GameBase::GameBase() GameBase::~GameBase() { + if (scope_registered) + arcaneFX::unregisterScopedObject(this); } @@ -266,8 +270,16 @@ bool GameBase::onAdd() // Datablock must be initialized on the server. // Client datablock are initialized by the initial update. - if ( isServerObject() && mDataBlock && !onNewDataBlock( mDataBlock, false ) ) - return false; + if (isClientObject()) + { + if (scope_id > 0 && !scope_registered) + arcaneFX::registerScopedObject(this); + } + else + { + if ( mDataBlock && !onNewDataBlock( mDataBlock, false ) ) + return false; + } setProcessTick( true ); @@ -276,6 +288,8 @@ bool GameBase::onAdd() void GameBase::onRemove() { + if (scope_registered) + arcaneFX::unregisterScopedObject(this); // EDITOR FEATURE: Remove us from the reload signal of our datablock. if ( mDataBlock ) mDataBlock->mReloadSignal.remove( this, &GameBase::_onDatablockModified ); @@ -556,6 +570,11 @@ U32 GameBase::packUpdate( NetConnection *connection, U32 mask, BitStream *stream stream->writeFlag(mIsAiControlled); #endif + if (stream->writeFlag(mask & ScopeIdMask)) + { + if (stream->writeFlag(scope_refs > 0)) + stream->writeInt(scope_id, SCOPE_ID_BITS); + } return retMask; } @@ -594,6 +613,11 @@ void GameBase::unpackUpdate(NetConnection *con, BitStream *stream) mTicksSinceLastMove = 0; mIsAiControlled = stream->readFlag(); #endif + if (stream->readFlag()) + { + scope_id = (stream->readFlag()) ? (U16) stream->readInt(SCOPE_ID_BITS) : 0; + scope_refs = 0; + } } void GameBase::onMount( SceneObject *obj, S32 node ) diff --git a/Engine/source/T3D/gameBase/gameBase.h b/Engine/source/T3D/gameBase/gameBase.h index be9094e85..e6cf5c973 100644 --- a/Engine/source/T3D/gameBase/gameBase.h +++ b/Engine/source/T3D/gameBase/gameBase.h @@ -24,6 +24,7 @@ // Arcane-FX for MIT Licensed Open Source version of Torque 3D from GarageGames // Copyright (C) 2015 Faust Logic, Inc. //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~// + #ifndef _GAMEBASE_H_ #define _GAMEBASE_H_ @@ -235,7 +236,8 @@ public: enum GameBaseMasks { DataBlockMask = Parent::NextFreeMask << 0, ExtendedInfoMask = Parent::NextFreeMask << 1, - NextFreeMask = Parent::NextFreeMask << 2 + ScopeIdMask = Parent::NextFreeMask << 2, + NextFreeMask = Parent::NextFreeMask << 3, }; // net flags added by game base @@ -459,6 +461,8 @@ private: /// within this callback. /// void _onDatablockModified(); +protected: + void onScopeIdChange() { setMaskBits(ScopeIdMask); } }; diff --git a/Engine/source/sim/netConnection.cpp b/Engine/source/sim/netConnection.cpp index f12c8cde6..c952a0258 100644 --- a/Engine/source/sim/netConnection.cpp +++ b/Engine/source/sim/netConnection.cpp @@ -316,7 +316,10 @@ void NetConnection::checkMaxRate() { packetRateToServer = 128; packetRateToClient = 128; - packetSize = 1024; + // These changes introduced in T3D 1.1 Preview reduce the packet headroom which leads + // to some spells and effects running out of room when dynamic variables are used + // to send launch-time parameters to clients. + packetSize = 512; } gPacketUpdateDelayToServer = 1024 / packetRateToServer; diff --git a/Engine/source/sim/netConnection.h b/Engine/source/sim/netConnection.h index c2e106fa3..55422f9eb 100644 --- a/Engine/source/sim/netConnection.h +++ b/Engine/source/sim/netConnection.h @@ -20,6 +20,11 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~// +// Arcane-FX for MIT Licensed Open Source version of Torque 3D from GarageGames +// Copyright (C) 2015 Faust Logic, Inc. +//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~// + #ifndef _NETCONNECTION_H_ #define _NETCONNECTION_H_ @@ -1050,6 +1055,9 @@ public: virtual bool readDemoStartBlock(BitStream *stream); virtual void demoPlaybackComplete(); /// @} +public: + S32 getCurRatePacketSize() const { return mCurRate.packetSize; } + S32 getMaxRatePacketSize() const { return mMaxRate.packetSize; } }; diff --git a/Engine/source/sim/netObject.cpp b/Engine/source/sim/netObject.cpp index cd432d717..76564fb16 100644 --- a/Engine/source/sim/netObject.cpp +++ b/Engine/source/sim/netObject.cpp @@ -20,6 +20,11 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~// +// Arcane-FX for MIT Licensed Open Source version of Torque 3D from GarageGames +// Copyright (C) 2015 Faust Logic, Inc. +//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~// + #include "platform/platform.h" #include "console/simBase.h" #include "core/dnet.h" @@ -28,6 +33,8 @@ #include "console/consoleTypes.h" #include "console/engineAPI.h" +#include "afx/arcaneFX.h" + IMPLEMENT_CONOBJECT(NetObject); // More information can be found in the Torque Manual (CHM) @@ -46,6 +53,9 @@ NetObject::NetObject() mPrevDirtyList = NULL; mNextDirtyList = NULL; mDirtyMaskBits = 0; + scope_id = 0; + scope_refs = 0; + scope_registered = false; } NetObject::~NetObject() @@ -460,3 +470,26 @@ DefineEngineMethod( NetObject, isServerObject, bool, (),, //{ // return object->isServerObject(); //} +U16 NetObject::addScopeRef() +{ + if (scope_refs == 0) + { + scope_id = arcaneFX::generateScopeId(); + onScopeIdChange(); + } + scope_refs++; + return scope_id; +} + +void NetObject::removeScopeRef() +{ + if (scope_refs == 0) + return; + scope_refs--; + if (scope_refs == 0) + { + scope_id = 0; + onScopeIdChange(); + } +} + diff --git a/Engine/source/sim/netObject.h b/Engine/source/sim/netObject.h index ced8a2cf3..a486936be 100644 --- a/Engine/source/sim/netObject.h +++ b/Engine/source/sim/netObject.h @@ -20,6 +20,11 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~// +// Arcane-FX for MIT Licensed Open Source version of Torque 3D from GarageGames +// Copyright (C) 2015 Faust Logic, Inc. +//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~// + #ifndef _NETOBJECT_H_ #define _NETOBJECT_H_ @@ -405,6 +410,18 @@ public: static T* getClientObject( T *netObj ) { return static_cast( netObj->getClientObject() ); } /// @} +protected: + U16 scope_id; + U16 scope_refs; + bool scope_registered; + virtual void onScopeIdChange() { } +public: + enum { SCOPE_ID_BITS = 14 }; + U16 getScopeId() const { return scope_id; } + U16 addScopeRef(); + void removeScopeRef(); + void setScopeRegistered(bool flag) { scope_registered = flag; } + bool getScopeRegistered() const { return scope_registered; } }; //-----------------------------------------------------------------------------