diff --git a/apps/openmw/mwmp/ObjectList.cpp b/apps/openmw/mwmp/ObjectList.cpp index d1333e771..eb3f3d18f 100644 --- a/apps/openmw/mwmp/ObjectList.cpp +++ b/apps/openmw/mwmp/ObjectList.cpp @@ -869,15 +869,15 @@ void ObjectList::setClientLocals(MWWorld::CellStore* cellStore) std::string valueAsString; std::string variableTypeAsString; - if (baseObject.clientVariable.variableType == mwmp::VARIABLE_TYPE::SHORT) + if (baseObject.clientVariable.variableType == mwmp::VARIABLE_TYPE::SHORT || baseObject.clientVariable.variableType == mwmp::VARIABLE_TYPE::LONG) { + variableTypeAsString = baseObject.clientVariable.variableType == mwmp::VARIABLE_TYPE::SHORT ? "short" : "long"; valueAsString = std::to_string(baseObject.clientVariable.intValue); - variableTypeAsString = "short"; } else if (baseObject.clientVariable.variableType == mwmp::VARIABLE_TYPE::FLOAT) { - valueAsString = std::to_string(baseObject.clientVariable.floatValue); variableTypeAsString = "float"; + valueAsString = std::to_string(baseObject.clientVariable.floatValue); } LOG_APPEND(TimedLog::LOG_VERBOSE, "- cellRef: %s %i-%i, index: %i, type %s, value: %s", baseObject.refId.c_str(), @@ -892,6 +892,8 @@ void ObjectList::setClientLocals(MWWorld::CellStore* cellStore) if (baseObject.clientVariable.variableType == mwmp::VARIABLE_TYPE::SHORT) ptrFound.getRefData().getLocals().mShorts.at(baseObject.index) = baseObject.clientVariable.intValue; + else if (baseObject.clientVariable.variableType == mwmp::VARIABLE_TYPE::LONG) + ptrFound.getRefData().getLocals().mLongs.at(baseObject.index) = baseObject.clientVariable.intValue; else if (baseObject.clientVariable.variableType == mwmp::VARIABLE_TYPE::FLOAT) ptrFound.getRefData().getLocals().mFloats.at(baseObject.index) = baseObject.clientVariable.floatValue; } @@ -1310,21 +1312,21 @@ void ObjectList::sendClientScriptLocal() for (const auto &baseObject : baseObjects) { std::string valueAsString; - std::string variableType; + std::string variableTypeAsString; - if (baseObject.clientVariable.variableType == mwmp::VARIABLE_TYPE::SHORT) + if (baseObject.clientVariable.variableType == mwmp::VARIABLE_TYPE::SHORT || baseObject.clientVariable.variableType == mwmp::VARIABLE_TYPE::LONG) { + variableTypeAsString = baseObject.clientVariable.variableType == mwmp::VARIABLE_TYPE::SHORT ? "short" : "long"; valueAsString = std::to_string(baseObject.clientVariable.intValue); - variableType = "short"; } else if (baseObject.clientVariable.variableType == mwmp::VARIABLE_TYPE::FLOAT) { + variableTypeAsString = "float"; valueAsString = std::to_string(baseObject.clientVariable.floatValue); - variableType = "float"; } LOG_APPEND(TimedLog::LOG_VERBOSE, "- cellRef: %s %i-%i, index: %i, type %s, value: %s", baseObject.refId.c_str(), - baseObject.refNum, baseObject.mpNum, baseObject.clientVariable.index, variableType.c_str(), valueAsString.c_str()); + baseObject.refNum, baseObject.mpNum, baseObject.clientVariable.index, variableTypeAsString.c_str(), valueAsString.c_str()); } mwmp::Main::get().getNetworking()->getObjectPacket(ID_CLIENT_SCRIPT_LOCAL)->setObjectList(this); diff --git a/apps/openmw/mwscript/interpretercontext.cpp b/apps/openmw/mwscript/interpretercontext.cpp index f35ed34ee..cbc54026e 100644 --- a/apps/openmw/mwscript/interpretercontext.cpp +++ b/apps/openmw/mwscript/interpretercontext.cpp @@ -234,7 +234,7 @@ namespace MWScript /* Start of tes3mp addition - Send an ID_CLIENT_SCRIPT_LOCAL packet when a local float changes its value as long as + Send an ID_CLIENT_SCRIPT_LOCAL packet when a local short changes its value if it is being set in a script that has been approved for packet sending */ if (sendPackets) @@ -255,7 +255,35 @@ namespace MWScript if (!mLocals) throw std::runtime_error ("local variables not available in this context"); + /* + Start of tes3mp addition + + Avoid setting a local to a value it already is, preventing packet spam + */ + if (mLocals->mLongs.at(index) == value) return; + /* + End of tes3mp addition + */ + mLocals->mLongs.at (index) = value; + + /* + Start of tes3mp addition + + Send an ID_CLIENT_SCRIPT_LOCAL packet when a local long changes its value if + it is being set in a script that has been approved for packet sending + */ + if (sendPackets) + { + mwmp::ObjectList *objectList = mwmp::Main::get().getNetworking()->getObjectList(); + objectList->reset(); + objectList->packetOrigin = ScriptController::getPacketOriginFromContextType(getContextType()); + objectList->addClientScriptLocal(mReference, index, value, mwmp::VARIABLE_TYPE::LONG); + objectList->sendClientScriptLocal(); + } + /* + End of tes3mp addition + */ } void InterpreterContext::setLocalFloat (int index, float value) @@ -283,9 +311,9 @@ namespace MWScript /* Start of tes3mp addition - Send an ID_CLIENT_SCRIPT_LOCAL packet when a local float changes its value as long as - its value has changed enough and it is being set in a script that has been approved for - packet sending + Send an ID_CLIENT_SCRIPT_LOCAL packet when a local float changes its value if + its value has changed enough and it is being set in a script that has been approved + for packet sending */ if (floor(oldValue) != floor(value) && sendPackets) { @@ -358,9 +386,9 @@ namespace MWScript /* Start of tes3mp addition - Send an ID_CLIENT_SCRIPT_GLOBAL packet when a global short changes its value as long as - it is being set in a script that has been approved for packet sending or the global itself - has been set to always be synchronized + Send an ID_CLIENT_SCRIPT_GLOBAL packet when a global short changes its value if + it is being set in a script that has been approved for packet sending or the global + itself has been set to always be synchronized */ if (sendPackets || mwmp::Main::isValidPacketGlobal(name)) { @@ -388,9 +416,9 @@ namespace MWScript /* Start of tes3mp addition - Send an ID_CLIENT_SCRIPT_GLOBAL packet when a global long changes its value as long as - it is being set in a script that has been approved for packet sending or the global itself - has been set to always be synchronized + Send an ID_CLIENT_SCRIPT_GLOBAL packet when a global long changes its value if + it is being set in a script that has been approved for packet sending or the global + itself has been set to always be synchronized */ if (sendPackets || mwmp::Main::isValidPacketGlobal(name)) { @@ -423,9 +451,9 @@ namespace MWScript /* Start of tes3mp addition - Send an ID_CLIENT_SCRIPT_GLOBAL packet when a global float changes its value as long as - its value has changed enough and it is being set in a script that has been approved for - packet sending or the global itself has been set to always be synchronized + Send an ID_CLIENT_SCRIPT_GLOBAL packet when a global float changes its value if + its value has changed enough and it is being set in a script that has been approved + for packet sending or the global itself has been set to always be synchronized */ if (floor(oldValue) != floor(value) && (sendPackets || mwmp::Main::isValidPacketGlobal(name))) {