forked from teamnwah/openmw-tes3coop
[Client] Prevent ObjectState spam by not resending an already sent state
This commit is contained in:
parent
6e47b65205
commit
fd40e8c971
2 changed files with 43 additions and 7 deletions
|
@ -613,13 +613,17 @@ namespace MWScript
|
||||||
Start of tes3mp addition
|
Start of tes3mp addition
|
||||||
|
|
||||||
Send an ID_OBJECT_STATE packet whenever an object is enabled, as long as
|
Send an ID_OBJECT_STATE packet whenever an object is enabled, as long as
|
||||||
the player is logged in on the server and the object wasn't already
|
the player is logged in on the server, the object is still disabled, and our last
|
||||||
enabled previously
|
packet regarding its state did not already attempt to enable it (to prevent
|
||||||
|
packet spam)
|
||||||
*/
|
*/
|
||||||
if (mwmp::Main::get().getLocalPlayer()->isLoggedIn())
|
if (mwmp::Main::get().getLocalPlayer()->isLoggedIn())
|
||||||
{
|
{
|
||||||
if (ref.isInCell() && !ref.getRefData().isEnabled())
|
if (ref.isInCell() && !ref.getRefData().isEnabled() &&
|
||||||
|
ref.getRefData().getLastCommunicatedState() != MWWorld::RefData::StateCommunication::Enabled)
|
||||||
{
|
{
|
||||||
|
ref.getRefData().setLastCommunicatedState(MWWorld::RefData::StateCommunication::Enabled);
|
||||||
|
|
||||||
mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList();
|
mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList();
|
||||||
objectList->reset();
|
objectList->reset();
|
||||||
objectList->packetOrigin = ScriptController::getPacketOriginFromContextType(getContextType());
|
objectList->packetOrigin = ScriptController::getPacketOriginFromContextType(getContextType());
|
||||||
|
@ -650,14 +654,18 @@ namespace MWScript
|
||||||
/*
|
/*
|
||||||
Start of tes3mp addition
|
Start of tes3mp addition
|
||||||
|
|
||||||
Send an ID_OBJECT_STATE packet whenever an object is disabled, as long as
|
Send an ID_OBJECT_STATE packet whenever an object should be disabled, as long as
|
||||||
the player is logged in on the server and the object wasn't already
|
the player is logged in on the server, the object is still enabled, and our last
|
||||||
disabled previously
|
packet regarding its state did not already attempt to disable it (to prevent
|
||||||
|
packet spam)
|
||||||
*/
|
*/
|
||||||
if (mwmp::Main::get().getLocalPlayer()->isLoggedIn())
|
if (mwmp::Main::get().getLocalPlayer()->isLoggedIn())
|
||||||
{
|
{
|
||||||
if (ref.isInCell() && ref.getRefData().isEnabled())
|
if (ref.isInCell() && ref.getRefData().isEnabled() &&
|
||||||
|
ref.getRefData().getLastCommunicatedState() != MWWorld::RefData::StateCommunication::Disabled)
|
||||||
{
|
{
|
||||||
|
ref.getRefData().setLastCommunicatedState(MWWorld::RefData::StateCommunication::Disabled);
|
||||||
|
|
||||||
mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList();
|
mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList();
|
||||||
objectList->reset();
|
objectList->reset();
|
||||||
objectList->packetOrigin = ScriptController::getPacketOriginFromContextType(getContextType());
|
objectList->packetOrigin = ScriptController::getPacketOriginFromContextType(getContextType());
|
||||||
|
|
|
@ -138,6 +138,34 @@ namespace MWWorld
|
||||||
|
|
||||||
const ESM::AnimationState& getAnimationState() const;
|
const ESM::AnimationState& getAnimationState() const;
|
||||||
ESM::AnimationState& getAnimationState();
|
ESM::AnimationState& getAnimationState();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Start of tes3mp addition
|
||||||
|
|
||||||
|
Track the last state communicated to the server for this reference,
|
||||||
|
to avoid packet spam when the server denies our state change request or
|
||||||
|
is slow to reply
|
||||||
|
*/
|
||||||
|
enum StateCommunication
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Enabled = 1,
|
||||||
|
Disabled = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
short mLastCommunicatedState = StateCommunication::None;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
short getLastCommunicatedState() { return mLastCommunicatedState; };
|
||||||
|
|
||||||
|
void setLastCommunicatedState(short communicationState) { mLastCommunicatedState = communicationState; };
|
||||||
|
/*
|
||||||
|
End of tes3mp addition
|
||||||
|
*/
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue