From 57257d057f194f137726aad818054f8b7cd5a45e Mon Sep 17 00:00:00 2001 From: scrawl <720642+scrawl@users.noreply.github.com> Date: Sun, 31 Dec 2017 23:48:51 +0000 Subject: [PATCH 01/10] Remove unintended jump cooldown (Fixes #4250) --- apps/openmw/mwmechanics/character.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index d9e2cc292..fa261bbc3 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -1797,7 +1797,7 @@ void CharacterController::update(float duration) vec.y() *= factor; vec.z() = 0.0f; } - else if(vec.z() > 0.0f && mJumpState == JumpState_None) + else if(vec.z() > 0.0f && mJumpState != JumpState_InAir) { // Started a jump. float z = cls.getJump(mPtr); From c920f95d1ec24806ed1547d85ce304bc4f7c876d Mon Sep 17 00:00:00 2001 From: scrawl <720642+scrawl@users.noreply.github.com> Date: Sun, 31 Dec 2017 23:49:43 +0000 Subject: [PATCH 02/10] Don't incorrectly discard root node transformation (Fixes #4272) --- components/nifosg/nifloader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/nifosg/nifloader.cpp b/components/nifosg/nifloader.cpp index a3b81338e..6e04c6405 100644 --- a/components/nifosg/nifloader.cpp +++ b/components/nifosg/nifloader.cpp @@ -268,7 +268,7 @@ namespace NifOsg osg::ref_ptr skel = new SceneUtil::Skeleton; osg::Group* root = created->asGroup(); - if (root && root->getDataVariance() == osg::Object::STATIC) + if (root && root->getDataVariance() == osg::Object::STATIC && !root->asTransform()) { skel->setStateSet(root->getStateSet()); skel->setName(root->getName()); @@ -440,7 +440,7 @@ namespace NifOsg // The Root node can be created as a Group if no transformation is required. // This takes advantage of the fact root nodes can't have additional controllers // loaded from an external .kf file (original engine just throws "can't find node" errors if you try). - if (!nifNode->parent && nifNode->controller.empty()) + if (!nifNode->parent && nifNode->controller.empty() && nifNode->trafo.isIdentity()) { node = new osg::Group; dataVariance = osg::Object::STATIC; From 7a7b040216c212f1149ecbf770443b2f4fc4a132 Mon Sep 17 00:00:00 2001 From: Bret Curtis Date: Mon, 1 Jan 2018 14:10:23 +0100 Subject: [PATCH 03/10] fix building on mips machines --- components/nif/data.cpp | 4 ++-- components/nif/data.hpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/nif/data.cpp b/components/nif/data.cpp index a6721fde1..b2ba63053 100644 --- a/components/nif/data.cpp +++ b/components/nif/data.cpp @@ -153,12 +153,12 @@ void NiPixelData::read(NIFStream *nif) // Unknown nif->skip(12); - mips = nif->getInt(); + number_of_mipmaps = nif->getInt(); // Bytes per pixel, should be bpp * 8 /* int bytes = */ nif->getInt(); - for(int i=0; i Date: Mon, 1 Jan 2018 16:32:20 +0100 Subject: [PATCH 04/10] camelCase --- components/nif/data.cpp | 4 ++-- components/nif/data.hpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/nif/data.cpp b/components/nif/data.cpp index b2ba63053..d19c8321e 100644 --- a/components/nif/data.cpp +++ b/components/nif/data.cpp @@ -153,12 +153,12 @@ void NiPixelData::read(NIFStream *nif) // Unknown nif->skip(12); - number_of_mipmaps = nif->getInt(); + numberOfMipmaps = nif->getInt(); // Bytes per pixel, should be bpp * 8 /* int bytes = */ nif->getInt(); - for(int i=0; i Date: Mon, 1 Jan 2018 19:47:36 +0100 Subject: [PATCH 05/10] update openmw.appdata.xml to fix https://lintian.debian.org/tags/appstream-metadata-legacy-format.html --- files/openmw.appdata.xml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/files/openmw.appdata.xml b/files/openmw.appdata.xml index 1c16cb9a4..932c82ad7 100644 --- a/files/openmw.appdata.xml +++ b/files/openmw.appdata.xml @@ -1,9 +1,12 @@ - - - openmw.desktop + + + org.openmw.desktop CC0-1.0 - GPL-3.0 and MIT and zlib + GPL-3.0 and MIT OpenMW Unofficial open source engine re-implementation of the game Morrowind @@ -32,8 +35,7 @@ Vivec seen from Ebonheart on OpenMW -nobrakal@gmail.com https://openmw.org https://bugs.openmw.org/ https://openmw.org/faq/ - + From bca9c550467282417b1d49c36078e311c02724b6 Mon Sep 17 00:00:00 2001 From: David Cernat Date: Tue, 2 Jan 2018 07:47:27 +0200 Subject: [PATCH 06/10] [Client] Reinstate "Merge pull request #1529 from drummyfish/animfix" This reverts commit 2f4cd6b713fbb5abfd701110ba5dd247c3bb347a and adds back the changes made by 45993d3da21105879507772f53a9a25baaf54795 because the OpenMW issue at https://bugs.openmw.org/issues/4250 has been fixed by 57257d057f194f137726aad818054f8b7cd5a45e --- apps/openmw/mwmechanics/character.cpp | 34 +++++++++++++++++++-------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index fbcb7371a..6e6570b00 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -390,21 +390,29 @@ void CharacterController::refreshJumpAnims(const WeaponInfo* weap, JumpingState } } - if(mJumpState == JumpState_InAir) + if (!mCurrentJump.empty()) { mAnimation->disable(mCurrentJump); - mCurrentJump = jumpAnimName; - if (mAnimation->hasAnimation("jump")) - mAnimation->play(mCurrentJump, Priority_Jump, jumpmask, false, + mCurrentJump.clear(); + } + + if(mJumpState == JumpState_InAir) + { + if (mAnimation->hasAnimation(jumpAnimName)) + { + mAnimation->play(jumpAnimName, Priority_Jump, jumpmask, false, 1.0f, (startAtLoop?"loop start":"start"), "stop", 0.0f, ~0ul); + mCurrentJump = jumpAnimName; + } } - else + else if (mJumpState == JumpState_Landing) { - mAnimation->disable(mCurrentJump); - mCurrentJump.clear(); - if (mAnimation->hasAnimation("jump")) + if (mAnimation->hasAnimation(jumpAnimName)) + { mAnimation->play(jumpAnimName, Priority_Jump, jumpmask, true, 1.0f, "loop stop", "stop", 0.0f, 0); + mCurrentJump = jumpAnimName; + } } } } @@ -1825,7 +1833,6 @@ void CharacterController::update(float duration) mHasMovedInXY = std::abs(vec.x())+std::abs(vec.y()) > 0.0f; isrunning = isrunning && mHasMovedInXY; - // advance athletics if(mHasMovedInXY && mPtr == getPlayer()) { @@ -1980,7 +1987,8 @@ void CharacterController::update(float duration) } else { - jumpstate = JumpState_None; + jumpstate = mAnimation->isPlaying(mCurrentJump) ? JumpState_Landing : JumpState_None; + vec.z() = 0.0f; inJump = false; @@ -2010,9 +2018,15 @@ void CharacterController::update(float duration) else if(rot.z() != 0.0f && !sneak && !(mPtr == getPlayer() && MWBase::Environment::get().getWorld()->isFirstPerson())) { if(rot.z() > 0.0f) + { movestate = inwater ? CharState_SwimTurnRight : CharState_TurnRight; + mAnimation->disable(mCurrentJump); + } else if(rot.z() < 0.0f) + { movestate = inwater ? CharState_SwimTurnLeft : CharState_TurnLeft; + mAnimation->disable(mCurrentJump); + } } } From c3c3fbc68e5aaed84eb40d1d0de705320dfd1a7a Mon Sep 17 00:00:00 2001 From: Bret Curtis Date: Tue, 2 Jan 2018 11:42:08 +0100 Subject: [PATCH 07/10] overriden -> overridden --- apps/openmw/mwphysics/physicssystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp index 36041a85e..174560e6b 100644 --- a/apps/openmw/mwphysics/physicssystem.cpp +++ b/apps/openmw/mwphysics/physicssystem.cpp @@ -705,7 +705,7 @@ namespace MWPhysics if (physFramerate > 0) { mPhysicsDt = 1.f / physFramerate; - std::cerr << "Warning: physics framerate was overriden (a new value is " << physFramerate << ")." << std::endl; + std::cerr << "Warning: physics framerate was overridden (a new value is " << physFramerate << ")." << std::endl; } } } From 1cf2f35a28f6f7e7162752ad1366d07cbaef47c0 Mon Sep 17 00:00:00 2001 From: David Cernat Date: Tue, 2 Jan 2018 16:32:38 +0200 Subject: [PATCH 08/10] [Server] Add script functions to set & get plugin enforcement state --- apps/openmw-mp/Networking.cpp | 15 ++++++++++++- apps/openmw-mp/Networking.hpp | 3 +++ .../Script/Functions/Miscellaneous.cpp | 10 +++++++++ .../Script/Functions/Miscellaneous.hpp | 22 +++++++++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/apps/openmw-mp/Networking.cpp b/apps/openmw-mp/Networking.cpp index 47091c0f4..7a0339c81 100644 --- a/apps/openmw-mp/Networking.cpp +++ b/apps/openmw-mp/Networking.cpp @@ -33,6 +33,7 @@ using namespace std; Networking *Networking::sThis = 0; static int currentMpNum = 0; +static bool pluginEnforcementState = true; Networking::Networking(RakNet::RakPeerInterface *peer) : mclient(nullptr) { @@ -232,14 +233,16 @@ void Networking::update(RakNet::Packet *packet) packetPreInit.SetSendStream(&bs); // If the loop above was broken, then the client's plugins do not match the server's - if (plugin != plugins.end()) + if (pluginEnforcementState && plugin != plugins.end()) { + LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "%s was not allowed to connect due to incompatible plugins", packet->systemAddress.ToString()); packetPreInit.setChecksums(&samples); packetPreInit.Send(packet->systemAddress); peer->CloseConnection(packet->systemAddress, true); } else { + LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "%s was allowed to connect", packet->systemAddress.ToString()); PacketPreInit::PluginContainer tmp; packetPreInit.setChecksums(&tmp); packetPreInit.Send(packet->systemAddress); @@ -373,6 +376,16 @@ int Networking::incrementMpNum() return currentMpNum; } +bool Networking::getPluginEnforcementState() +{ + return pluginEnforcementState; +} + +void Networking::setPluginEnforcementState(bool state) +{ + pluginEnforcementState = state; +} + const Networking &Networking::get() { return *sThis; diff --git a/apps/openmw-mp/Networking.hpp b/apps/openmw-mp/Networking.hpp index 7deadd537..913377b0b 100644 --- a/apps/openmw-mp/Networking.hpp +++ b/apps/openmw-mp/Networking.hpp @@ -52,6 +52,9 @@ namespace mwmp void setCurrentMpNum(int value); int incrementMpNum(); + bool getPluginEnforcementState(); + void setPluginEnforcementState(bool state); + MasterClient *getMasterClient(); void InitQuery(std::string queryAddr, unsigned short queryPort); void setServerPassword(std::string passw) noexcept; diff --git a/apps/openmw-mp/Script/Functions/Miscellaneous.cpp b/apps/openmw-mp/Script/Functions/Miscellaneous.cpp index 7270fe3e0..3127a14c9 100644 --- a/apps/openmw-mp/Script/Functions/Miscellaneous.cpp +++ b/apps/openmw-mp/Script/Functions/Miscellaneous.cpp @@ -43,6 +43,16 @@ void MiscellaneousFunctions::SetCurrentMpNum(int mpNum) noexcept mwmp::Networking::getPtr()->setCurrentMpNum(mpNum); } +int MiscellaneousFunctions::GetPluginEnforcementState() noexcept +{ + return mwmp::Networking::getPtr()->getPluginEnforcementState(); +} + +void MiscellaneousFunctions::SetPluginEnforcementState(bool state) noexcept +{ + mwmp::Networking::getPtr()->setPluginEnforcementState(state); +} + void MiscellaneousFunctions::LogMessage(unsigned short level, const char *message) noexcept { LOG_MESSAGE_SIMPLE(level, "[Script]: %s", message); diff --git a/apps/openmw-mp/Script/Functions/Miscellaneous.hpp b/apps/openmw-mp/Script/Functions/Miscellaneous.hpp index 487b924ec..d5193fa24 100644 --- a/apps/openmw-mp/Script/Functions/Miscellaneous.hpp +++ b/apps/openmw-mp/Script/Functions/Miscellaneous.hpp @@ -11,6 +11,9 @@ {"GetCurrentMpNum", MiscellaneousFunctions::GetCurrentMpNum},\ {"SetCurrentMpNum", MiscellaneousFunctions::SetCurrentMpNum},\ \ + {"GetPluginEnforcementState", MiscellaneousFunctions::GetPluginEnforcementState},\ + {"SetPluginEnforcementState", MiscellaneousFunctions::SetPluginEnforcementState},\ + \ {"LogMessage", MiscellaneousFunctions::LogMessage},\ {"LogAppend", MiscellaneousFunctions::LogAppend} @@ -64,6 +67,25 @@ public: */ static void SetCurrentMpNum(int mpNum) noexcept; + /** + * \brief Get the plugin enforcement state of the server. + * + * If true, clients are required to use the same plugins as set for the server. + * + * \return The enforcement state. + */ + static int GetPluginEnforcementState() noexcept; + + /** + * \brief Set the plugin enforcement state of the server. + * + * If true, clients are required to use the same plugins as set for the server. + * + * \param state The new enforcement state. + * \return void + */ + static void SetPluginEnforcementState(bool state) noexcept; + /** * \brief Write a log message with its own timestamp. * From 502df7d9c1156ed81222bd1dd2cd8fba95240b4f Mon Sep 17 00:00:00 2001 From: David Cernat Date: Fri, 5 Jan 2018 00:03:05 +0200 Subject: [PATCH 09/10] [Client] Clean up GUIChat slightly --- apps/openmw/mwmp/GUI/GUIChat.cpp | 28 ++++++++++++++-------------- apps/openmw/mwmp/GUI/GUIChat.hpp | 4 ++-- apps/openmw/mwmp/GUIController.cpp | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/apps/openmw/mwmp/GUI/GUIChat.cpp b/apps/openmw/mwmp/GUI/GUIChat.cpp index aae62e020..c02350883 100644 --- a/apps/openmw/mwmp/GUI/GUIChat.cpp +++ b/apps/openmw/mwmp/GUI/GUIChat.cpp @@ -52,7 +52,7 @@ namespace mwmp { // Give keyboard focus to the combo box whenever the console is // turned on - SetEditState(0); + setEditState(0); windowState = CHAT_ENABLED; } @@ -61,7 +61,7 @@ namespace mwmp // Apparently, hidden widgets can retain key focus // Remove for MyGUI 3.2.2 windowState = CHAT_DISABLED; - SetEditState(0); + setEditState(0); } bool GUIChat::exit() @@ -79,7 +79,7 @@ namespace mwmp if (cm.empty()) { mCommandLine->setCaption(""); - SetEditState(0); + setEditState(0); return; } @@ -96,7 +96,7 @@ namespace mwmp // It prevents the re-triggering of the acceptCommand() event for the same command // during the actual command execution mCommandLine->setCaption(""); - SetEditState(0); + setEditState(0); send (cm); } @@ -173,7 +173,7 @@ namespace mwmp { case CHAT_DISABLED: this->mMainWidget->setVisible(false); - SetEditState(0); + setEditState(0); break; case CHAT_ENABLED: this->mMainWidget->setVisible(true); @@ -184,7 +184,7 @@ namespace mwmp } } - void GUIChat::SetEditState(bool state) + void GUIChat::setEditState(bool state) { editState = state; mCommandLine->setVisible(editState); @@ -195,17 +195,17 @@ namespace mwmp { if (windowState == CHAT_DISABLED) return; - else if (windowState == CHAT_HIDDENMODE) + + if (!mCommandLine->getVisible()) + LOG_MESSAGE_SIMPLE(Log::LOG_VERBOSE, "Opening chat."); + + if (windowState == CHAT_HIDDENMODE) { setVisible(true); curTime = 0; - editState = true; } - else // CHAT_ENABLED - editState = true; - LOG_MESSAGE_SIMPLE(Log::LOG_VERBOSE, "Opening chat."); - SetEditState(editState); + setEditState(true); } void GUIChat::keyPress(MyGUI::Widget *_sender, MyGUI::KeyCode key, MyGUI::Char _char) @@ -241,14 +241,14 @@ namespace mwmp } - void GUIChat::Update(float dt) + void GUIChat::update(float dt) { if (windowState == CHAT_HIDDENMODE && !editState && isVisible()) { curTime += dt; if (curTime >= delay) { - SetEditState(false); + setEditState(false); this->mMainWidget->setVisible(false); } } diff --git a/apps/openmw/mwmp/GUI/GUIChat.hpp b/apps/openmw/mwmp/GUI/GUIChat.hpp index 059882561..cc2a1491d 100644 --- a/apps/openmw/mwmp/GUI/GUIChat.hpp +++ b/apps/openmw/mwmp/GUI/GUIChat.hpp @@ -41,7 +41,7 @@ namespace mwmp void pressedSay(); // switch chat focus (if chat mode != CHAT_DISABLED) void setDelay(float delay); - void Update(float dt); + void update(float dt); virtual void onOpen(); virtual void onClose(); @@ -78,7 +78,7 @@ namespace mwmp void acceptCommand(MyGUI::EditBox* _sender); - void SetEditState(bool state); + void setEditState(bool state); int windowState; bool editState; diff --git a/apps/openmw/mwmp/GUIController.cpp b/apps/openmw/mwmp/GUIController.cpp index cff86664a..c601221ec 100644 --- a/apps/openmw/mwmp/GUIController.cpp +++ b/apps/openmw/mwmp/GUIController.cpp @@ -198,7 +198,7 @@ bool mwmp::GUIController::hasFocusedElement() void mwmp::GUIController::update(float dt) { if (mChat != nullptr) - mChat->Update(dt); + mChat->update(dt); // Make sure we read the pressed button without resetting it, because it may also get // checked somewhere else From a639d3494a4befaa97a473b875a3d5ef4e8c20c4 Mon Sep 17 00:00:00 2001 From: David Cernat Date: Fri, 5 Jan 2018 01:24:15 +0200 Subject: [PATCH 10/10] [Client] Fix use of DedicatedPlayers as targets for ConsoleCommand --- apps/openmw/mwmp/WorldEvent.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwmp/WorldEvent.cpp b/apps/openmw/mwmp/WorldEvent.cpp index 6e4e0b2eb..07e3f4534 100644 --- a/apps/openmw/mwmp/WorldEvent.cpp +++ b/apps/openmw/mwmp/WorldEvent.cpp @@ -470,13 +470,16 @@ void WorldEvent::runConsoleCommands(MWWorld::CellStore* cellStore) windowManager->setConsolePtr(static_cast(player)->getPlayerPtr()); windowManager->executeCommandInConsole(consoleCommand); } - else if (player != 0) + else { - player = PlayerList::getPlayer(guid); + player = PlayerList::getPlayer(worldObject.guid); - LOG_APPEND(Log::LOG_VERBOSE, "-- running on player %s", player->npc.mName.c_str()); - windowManager->setConsolePtr(static_cast(player)->getPtr()); - windowManager->executeCommandInConsole(consoleCommand); + if (player != 0) + { + LOG_APPEND(Log::LOG_VERBOSE, "-- running on player %s", player->npc.mName.c_str()); + windowManager->setConsolePtr(static_cast(player)->getPtr()); + windowManager->executeCommandInConsole(consoleCommand); + } } } else