From 4be6b362c5fc045b54d7e140e120379fa813a77a Mon Sep 17 00:00:00 2001 From: Koncord Date: Mon, 4 Jan 2016 20:15:55 +0800 Subject: [PATCH 01/28] Add OpenMW-mp target --- CMakeLists.txt | 9 +++++++++ apps/opencs/{main.cpp => Networking.cpp} | 0 apps/openmw/mwmp/Player.cpp | 5 +++++ apps/openmw/mwmp/Player.hpp | 15 +++++++++++++++ 4 files changed, 29 insertions(+) rename apps/opencs/{main.cpp => Networking.cpp} (100%) create mode 100644 apps/openmw/mwmp/Player.cpp create mode 100644 apps/openmw/mwmp/Player.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index afe3ce4b7..8486666c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,6 +60,7 @@ option(OPENMW_UNITY_BUILD "Use fewer compilation units to speed up compile time" # Apps and tools option(BUILD_OPENMW "build OpenMW" ON) +option(BUILD_OPENMW_MP "build OpenMW-MP" ON) option(BUILD_BSATOOL "build BSA extractor" ON) option(BUILD_ESMTOOL "build ESM inspector" ON) option(BUILD_LAUNCHER "build Launcher" ON) @@ -114,6 +115,10 @@ endif() # We probably support older versions than this. cmake_minimum_required(VERSION 2.6) + +find_package(RakNet REQUIRED) +include_directories(${RakNet_INCLUDES}) + # Sound setup unset(FFMPEG_LIBRARIES CACHE) @@ -568,6 +573,10 @@ add_subdirectory (components) #endif() # Apps and tools +if (BUILD_OPENMW_MP) + add_subdirectory( apps/openmw-mp ) +endif() + if (BUILD_OPENMW) add_subdirectory( apps/openmw ) endif() diff --git a/apps/opencs/main.cpp b/apps/opencs/Networking.cpp similarity index 100% rename from apps/opencs/main.cpp rename to apps/opencs/Networking.cpp diff --git a/apps/openmw/mwmp/Player.cpp b/apps/openmw/mwmp/Player.cpp new file mode 100644 index 000000000..59734df38 --- /dev/null +++ b/apps/openmw/mwmp/Player.cpp @@ -0,0 +1,5 @@ +// +// Created by koncord on 02.01.16. +// + +#include "Player.hpp" diff --git a/apps/openmw/mwmp/Player.hpp b/apps/openmw/mwmp/Player.hpp new file mode 100644 index 000000000..d702ac3e2 --- /dev/null +++ b/apps/openmw/mwmp/Player.hpp @@ -0,0 +1,15 @@ +// +// Created by koncord on 02.01.16. +// + +#ifndef OPENMW_PLAYER_HPP +#define OPENMW_PLAYER_HPP + + +class Player +{ + +}; + + +#endif //OPENMW_PLAYER_HPP From 1e29409dd5509f9f4c7f51a24f2bffb8dbd92b06 Mon Sep 17 00:00:00 2001 From: Koncord Date: Mon, 4 Jan 2016 20:17:30 +0800 Subject: [PATCH 02/28] Add OpenMW-mp target --- apps/openmw/CMakeLists.txt | 2 + apps/openmw/engine.cpp | 8 ++ apps/openmw/mwmp/Networking.cpp | 117 +++++++++++++++++++++++++ apps/openmw/mwmp/Networking.hpp | 17 ++++ apps/openmw/mwmp/Player.cpp | 147 ++++++++++++++++++++++++++++++++ apps/openmw/mwmp/Player.hpp | 29 ++++++- cmake/FindRakNet.cmake | 74 ++++++++++++++++ 7 files changed, 392 insertions(+), 2 deletions(-) create mode 100644 apps/openmw/mwmp/Networking.cpp create mode 100644 apps/openmw/mwmp/Networking.hpp create mode 100644 cmake/FindRakNet.cmake diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 0113fed02..260e7f302 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -95,6 +95,8 @@ add_openmw_dir (mwbase inputmanager windowmanager statemanager ) +add_openmw_dir (mwmp Networking Player) + # Main executable if (NOT ANDROID) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index 3fcd46f7c..01d370efc 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -55,6 +55,8 @@ #include "mwstate/statemanagerimp.hpp" +#include "mwmp/Networking.hpp" + namespace { void checkSDLError(int ret) @@ -102,6 +104,8 @@ void OMW::Engine::frame(float frametime) if (mUseSound) mEnvironment.getSoundManager()->update(frametime); + mwmp::Main::Frame(frametime); + // Main menu opened? Then scripts are also paused. bool paused = mEnvironment.getWindowManager()->containsMode(MWGui::GM_MainMenu); @@ -645,7 +649,10 @@ void OMW::Engine::go() ToUTF8::Utf8Encoder encoder (mEncoding); mEncoder = &encoder; + prepareEngine (settings); + mwmp::Main::Create(); + mSkipMenu = true; if (!mSaveGameFile.empty()) { @@ -715,6 +722,7 @@ void OMW::Engine::go() // Save user settings settings.saveUser(settingspath); + mwmp::Main::Destroy(); std::cout << "Quitting peacefully." << std::endl; } diff --git a/apps/openmw/mwmp/Networking.cpp b/apps/openmw/mwmp/Networking.cpp new file mode 100644 index 000000000..43c5979e0 --- /dev/null +++ b/apps/openmw/mwmp/Networking.cpp @@ -0,0 +1,117 @@ +// +// Created by koncord on 01.01.16. +// + +#include "Networking.hpp" +#include +#include +#include +#include "../mwbase/environment.hpp" +#include "../mwstate/statemanagerimp.hpp" +#include "../mwinput/inputmanagerimp.hpp" +#include "../mwscript/scriptmanagerimp.hpp" +#include "../mwgui/windowmanagerimp.hpp" +#include "../mwworld/worldimp.hpp" +#include "../mwworld/ptr.hpp" +#include "../mwworld/player.hpp" +#include "../mwworld/customdata.hpp" +#include "../mwmechanics/creaturestats.hpp" +#include "../mwmechanics/npcstats.hpp" +#include "../mwclass/npc.hpp" +#include "../mwclass/creature.hpp" +#include "../mwmechanics/mechanicsmanagerimp.hpp" + +#include "../mwmechanics/aistate.hpp" +#include "Player.hpp" + +using namespace mwmp; +using namespace std; + +Main *Main::pMain = 0; + +Main::Main() +{ + std::cout << "Main::Main" << std::endl; +} + +Main::~Main() +{ + std::cout << "Main::~Main" << std::endl; +} + +void Main::Create() +{ + assert(!pMain); + pMain = new Main(); + const MWBase::Environment &environment = MWBase::Environment::get(); + environment.getStateManager()->newGame(true); + +} + +void Main::Destroy() +{ + Player::CleanUp(); + delete pMain; +} + +void Main::Frame(float dt) +{ + const MWBase::Environment &environment = MWBase::Environment::get(); + if (environment.getWindowManager()->containsMode(MWGui::GM_MainMenu)) + { + //environment.getWindowManager()->exitCurrentGuiMode(); + } + MWBase::World *world = MWBase::Environment::get().getWorld(); + MWBase::ScriptManager *script = MWBase::Environment::get().getScriptManager(); + MWWorld::Ptr player = world->getPlayerPtr(); + + float x = player.getRefData().getPosition().pos[0]; + float y = player.getRefData().getPosition().pos[1]; + float z = player.getRefData().getPosition().pos[2]; + float rot_x = player.getRefData().getPosition().rot[0]; + float rot_y = player.getRefData().getPosition().rot[1]; + float rot_z = player.getRefData().getPosition().rot[2]; + + static bool connected = true; + if (connected) + { + connected = false; + world->toggleGodMode(); + // create item + MWWorld::CellStore* store = player.getCell(); + + Player::CreatePlayer(1, "Ashot the Orc", "Orc", "b_n_orc_m_head_01", "b_n_orc_m_hair_01"); + Player *ref = Player::GetPlayer(1); + + ref->getPtr().getCellRef().setPosition(player.getRefData().getPosition()); + world->moveObject(ref->getPtr(),player.getCell(), x, y, z); // move to player + } + Player *ref = Player::GetPlayer(1); + + ref->Move(player.getRefData().getPosition(), player.getCell()); + + //cout << "x:\t" << x << "\ty:\t" << y << "\tz:\t" << z<< endl; + + //ref->getPtr().getRefData(). + //loc.getRefData().setPosition(player.getRefData().getPosition()); + MWMechanics::NpcStats *npcStats = &ref->getPtr().getClass().getNpcStats(ref->getPtr()); + npcStats->setHealth(1000); + npcStats->setMagicka(1000); + npcStats->setFatigue(1000); + if(npcStats->isDead()) + npcStats->resurrect(); + npcStats->setAttacked(false); + + npcStats->setBaseDisposition(255); + + if(player.getClass().getNpcStats(ref->getPtr()).getHealth().getCurrent() <= 0) + { + + } + +} + +void Main::UpdateWorld(float dt) +{ + +} diff --git a/apps/openmw/mwmp/Networking.hpp b/apps/openmw/mwmp/Networking.hpp new file mode 100644 index 000000000..c79bf1b75 --- /dev/null +++ b/apps/openmw/mwmp/Networking.hpp @@ -0,0 +1,17 @@ + +namespace mwmp +{ + class Main + { + public: + Main(); + ~Main(); + + static void Create(); + static void Destroy(); + static void Frame(float dt); + static void UpdateWorld(float dt); + private: + static Main *pMain; + }; +} diff --git a/apps/openmw/mwmp/Player.cpp b/apps/openmw/mwmp/Player.cpp index 59734df38..8f9b912e9 100644 --- a/apps/openmw/mwmp/Player.cpp +++ b/apps/openmw/mwmp/Player.cpp @@ -2,4 +2,151 @@ // Created by koncord on 02.01.16. // +#include +#include +#include "../mwbase/environment.hpp" +#include "../mwstate/statemanagerimp.hpp" +#include "../mwinput/inputmanagerimp.hpp" +#include "../mwgui/windowmanagerimp.hpp" +#include "../mwworld/worldimp.hpp" +#include "../mwworld/ptr.hpp" +#include "../mwworld/player.hpp" +#include "../mwworld/customdata.hpp" +#include "../mwclass/npc.hpp" +#include "../mwmechanics/creaturestats.hpp" #include "Player.hpp" + +using namespace mwmp; + +std::map Player::players; + +Player::~Player() +{ + delete reference; +} + +MWWorld::Ptr Player::getPtr() +{ + MWBase::World *world = MWBase::Environment::get().getWorld(); + return world->getPtr(reference->getPtr().get()->mBase->mId, false); +} + +Player::Player() +{ + +} + +void Player::CreatePlayer(int id, const std::string &name, const std::string &race, const std::string &head, + const std::string &hair) +{ + MWBase::World *world = MWBase::Environment::get().getWorld(); + MWWorld::Ptr player = world->getPlayerPtr(); + + ESM::NPC dedic_pl = *player.get()->mBase; + dedic_pl.mRace = race; + dedic_pl.mHead = head; + dedic_pl.mHair = hair; + dedic_pl.mName = name; + + + if (players[id] == 0) + { + dedic_pl.mId = "Dedicated Player"; + + std::string recid = world->createRecord(dedic_pl)->mId; + + players[id] = new Player(); + Player *_player = players[id]; + + _player->reference = new MWWorld::ManualRef(world->getStore(), recid, 1); + + // temporary spawn character in ToddTest cell + ESM::Position pos; + world->findInteriorPosition("ToddTest", pos); + MWWorld::CellStore *store = world->getInterior("ToddTest"); + + MWWorld::Ptr tmp = world->safePlaceObject(_player->reference->getPtr(), store, pos); + _player->ptr = world->getPtr(tmp.get()->mBase->mId, false); + + } + else + { + dedic_pl.mId = players[id]->reference->getPtr().get()->mBase->mId; + + MWWorld::ESMStore *store = const_cast(&world->getStore()); + MWWorld::Store *esm_store = const_cast *> (&store->get()); + + esm_store->insert(dedic_pl); + + } + + players[id]->active = true; + + world->enable(players[id]->reference->getPtr()); +} + + +void Player::CleanUp() +{ + for(std::map ::iterator it = players.begin(); it != players.end(); it++) + delete it->second; +} + +void Player::DestroyPlayer(int id) +{ + if (players[id]->active) + { + players[id]->active = false; + MWBase::World *world = MWBase::Environment::get().getWorld(); + world->disable(players[id]->getPtr()); + + //move player to toddTest + ESM::Position pos; + world->findInteriorPosition("ToddTest", pos); + MWWorld::CellStore *store = world->getInterior("ToddTest"); + + players[id]->ptr = world->moveObject(players[id]->getPtr(), store, pos.pos[0], pos.pos[1], pos.pos[2]); + } +} + +Player *Player::GetPlayer(int id) +{ + return players[id]; +} + +MWWorld::Ptr Player::getLiveCellPtr() +{ + return reference->getPtr(); +} + +MWWorld::ManualRef *Player::getRef() +{ + return reference; +} + +void Player::Move(ESM::Position pos, MWWorld::CellStore *cell) +{ + if (!active) return; + MWWorld::Ptr myPtr = getPtr(); + ESM::Position ref_pos = myPtr.getRefData().getPosition(); + MWBase::World *world = MWBase::Environment::get().getWorld(); + + float xx = pos.pos[0] - ref_pos.pos[0]; + float yy = pos.pos[1] - ref_pos.pos[1]; + double d = sqrt((xx * xx) + (yy * yy)); + + MWMechanics::AiSequence *aiSequence = &myPtr.getClass().getCreatureStats(myPtr).getAiSequence(); + + if (d > 10.0 && d < 150.0) + { + MWMechanics::AiTravel travelPackage(pos.pos[0], pos.pos[1], pos.pos[2]); + aiSequence->clear(); + aiSequence->stack(travelPackage, myPtr); + } + else if (d == 0.0) + aiSequence->clear(); + else if (d >= 150.0) + world->moveObject(myPtr, cell, pos.pos[0], pos.pos[1], pos.pos[2]); + + world->rotateObject(myPtr, pos.rot[0], pos.rot[1], pos.rot[2]); +} diff --git a/apps/openmw/mwmp/Player.hpp b/apps/openmw/mwmp/Player.hpp index d702ac3e2..6709df1d4 100644 --- a/apps/openmw/mwmp/Player.hpp +++ b/apps/openmw/mwmp/Player.hpp @@ -5,11 +5,36 @@ #ifndef OPENMW_PLAYER_HPP #define OPENMW_PLAYER_HPP +#include +#include +#include +#include -class Player +namespace mwmp { + class Player + { + public: + MWWorld::Ptr getPtr(); + MWWorld::Ptr getLiveCellPtr(); + MWWorld::ManualRef* getRef(); + void Move(ESM::Position pos, MWWorld::CellStore* cell); -}; + static void CreatePlayer(int id, const std::string& name, const std::string &race, const std::string &head, const std::string &hair); + static void DestroyPlayer(int id); + static void CleanUp(); + static Player *GetPlayer(int id); + private: + Player(); + ~Player(); + int id; + bool active; + MWWorld::ManualRef* reference; + MWWorld::Ptr ptr; + private: + static std::map players; + }; +} #endif //OPENMW_PLAYER_HPP diff --git a/cmake/FindRakNet.cmake b/cmake/FindRakNet.cmake new file mode 100644 index 000000000..9ce071cd1 --- /dev/null +++ b/cmake/FindRakNet.cmake @@ -0,0 +1,74 @@ +# Comes form project edunetgames +# - Try to find RakNet +# Once done this will define +# +# RakNet_FOUND - system has RakNet +# RakNet_INCLUDES - the RakNet include directory +# RakNet_LIBRARY - Link these to use RakNet + +if(Win32) +SET(RakNet_LIBRARY_Name RakNetLibStatic) +SET(RakNet_LIBRARY_Name_Debug RakNetLibStaticDebug) +else(Win32) +SET(RakNet_LIBRARY_Name RakNetStatic) +SET(RakNet_LIBRARY_Name_Debug RakNetStatic_Debug) +endif(Win32) + +FIND_LIBRARY (RakNet_LIBRARY_RELEASE NAMES ${RakNet_LIBRARY_Name} + PATHS + ENV LD_LIBRARY_PATH + ENV LIBRARY_PATH + /usr/lib64 + /usr/lib + /usr/local/lib64 + /usr/local/lib + /opt/local/lib + ${RAKNET_ROOT}/lib + ) + +FIND_LIBRARY (RakNet_LIBRARY_DEBUG NAMES ${RakNet_LIBRARY_Name_Debug} + PATHS + ENV LD_LIBRARY_PATH + ENV LIBRARY_PATH + /usr/lib64 + /usr/lib + /usr/local/lib64 + /usr/local/lib + /opt/local/lib + ${RAKNET_ROOT}/lib + ) + + + +FIND_PATH (RakNet_INCLUDES raknet/RakPeer.h + ENV CPATH + /usr/include + /usr/local/include + /opt/local/include + ${RAKNET_ROOT}/include + ) + +IF(RakNet_INCLUDES AND RakNet_LIBRARY_RELEASE) + SET(RakNet_FOUND TRUE) +ENDIF(RakNet_INCLUDES AND RakNet_LIBRARY_RELEASE) + +IF(RakNet_FOUND) + SET(RakNet_INCLUDES ${RakNet_INCLUDES}) + + + IF (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE) + SET(RakNet_LIBRARY optimized ${RakNet_LIBRARY_RELEASE} debug ${RakNet_LIBRARY_DEBUG}) + ELSE() + # if there are no configuration types and CMAKE_BUILD_TYPE has no value + # then just use the release libraries + SET(RakNet_LIBRARY ${RakNet_LIBRARY_RELEASE} ) + ENDIF() + IF(NOT RakNet_FIND_QUIETLY) + MESSAGE(STATUS "Found RakNet: ${RakNet_LIBRARIES}") + ENDIF(NOT RakNet_FIND_QUIETLY) +ELSE(RakNet_FOUND) + IF(RakNet_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find RakNet") + ENDIF(RakNet_FIND_REQUIRED) +ENDIF(RakNet_FOUND) + From 5d4063d8c782c27110e36971a5e4be17c88d30b0 Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 29 Dec 2015 15:22:19 +0100 Subject: [PATCH 03/28] LocalScripts: initialize mIter --- apps/openmw/mwworld/localscripts.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwworld/localscripts.cpp b/apps/openmw/mwworld/localscripts.cpp index 46d0b3cc2..2004a2ff3 100644 --- a/apps/openmw/mwworld/localscripts.cpp +++ b/apps/openmw/mwworld/localscripts.cpp @@ -61,7 +61,10 @@ namespace } -MWWorld::LocalScripts::LocalScripts (const MWWorld::ESMStore& store) : mStore (store) {} +MWWorld::LocalScripts::LocalScripts (const MWWorld::ESMStore& store) : mStore (store) +{ + mIter = mScripts.end(); +} void MWWorld::LocalScripts::setIgnore (const ConstPtr& ptr) { From cd8c84dc6c2f16b596c516ca78bc743ebaafd679 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 1 Jan 2016 02:59:14 +0100 Subject: [PATCH 04/28] Fix typo in SameRace dialogue function (function was inverted, Fixes #3116) --- apps/openmw/mwdialogue/filter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwdialogue/filter.cpp b/apps/openmw/mwdialogue/filter.cpp index 43d979ea2..ce07593e6 100644 --- a/apps/openmw/mwdialogue/filter.cpp +++ b/apps/openmw/mwdialogue/filter.cpp @@ -478,7 +478,7 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co case SelectWrapper::Function_SameRace: - return !Misc::StringUtils::ciEqual(mActor.get()->mBase->mRace, player.get()->mBase->mRace); + return Misc::StringUtils::ciEqual(mActor.get()->mBase->mRace, player.get()->mBase->mRace); case SelectWrapper::Function_SameFaction: From 994ad3e00435f071d6f22be40f186c8e2af14651 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 1 Jan 2016 23:55:17 +0100 Subject: [PATCH 05/28] Reject conditions testing agaist Choice when not currently in a choice (Fixes #3117) --- apps/openmw/mwdialogue/filter.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwdialogue/filter.cpp b/apps/openmw/mwdialogue/filter.cpp index ce07593e6..69df38ccf 100644 --- a/apps/openmw/mwdialogue/filter.cpp +++ b/apps/openmw/mwdialogue/filter.cpp @@ -155,10 +155,13 @@ bool MWDialogue::Filter::testDisposition (const ESM::DialInfo& info, bool invert bool MWDialogue::Filter::testSelectStruct (const SelectWrapper& select) const { if (select.isNpcOnly() && (mActor.getTypeName() != typeid (ESM::NPC).name())) - // If the actor is a creature, we do not test the conditions applicable - // only to NPCs. + // If the actor is a creature, we pass all conditions only applicable to NPCs. return true; + if (select.getFunction() == SelectWrapper::Function_Choice && mChoice == -1) + // If not currently in a choice, we reject all conditions that test against choices. + return false; + switch (select.getType()) { case SelectWrapper::Type_None: return true; From 0720a19fc0721dfc2a8a451b149a9cb710148a4a Mon Sep 17 00:00:00 2001 From: scrawl Date: Sat, 2 Jan 2016 00:49:53 +0100 Subject: [PATCH 06/28] Add support for placing BodyParts in a cell (Bug #3118) --- apps/openmw/CMakeLists.txt | 2 +- apps/openmw/mwclass/bodypart.cpp | 52 +++++++++++++++++++++++++++++++ apps/openmw/mwclass/bodypart.hpp | 31 ++++++++++++++++++ apps/openmw/mwclass/classes.cpp | 2 ++ apps/openmw/mwworld/cellstore.cpp | 7 +++++ apps/openmw/mwworld/cellstore.hpp | 10 ++++++ apps/openmw/mwworld/esmstore.cpp | 3 +- apps/openmw/mwworld/manualref.cpp | 1 + 8 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 apps/openmw/mwclass/bodypart.cpp create mode 100644 apps/openmw/mwclass/bodypart.hpp diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 260e7f302..dc460bac4 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -75,7 +75,7 @@ add_openmw_dir (mwphysics add_openmw_dir (mwclass classes activator creature npc weapon armor potion apparatus book clothing container door - ingredient creaturelevlist itemlevlist light lockpick misc probe repair static actor + ingredient creaturelevlist itemlevlist light lockpick misc probe repair static actor bodypart ) add_openmw_dir (mwmechanics diff --git a/apps/openmw/mwclass/bodypart.cpp b/apps/openmw/mwclass/bodypart.cpp new file mode 100644 index 000000000..be2b927cc --- /dev/null +++ b/apps/openmw/mwclass/bodypart.cpp @@ -0,0 +1,52 @@ +#include "bodypart.hpp" + +#include "../mwrender/renderinginterface.hpp" +#include "../mwrender/objects.hpp" + +#include "../mwworld/cellstore.hpp" + +namespace MWClass +{ + + MWWorld::Ptr BodyPart::copyToCellImpl(const MWWorld::ConstPtr &ptr, MWWorld::CellStore &cell) const + { + const MWWorld::LiveCellRef *ref = ptr.get(); + + return MWWorld::Ptr(cell.insert(ref), &cell); + } + + void BodyPart::insertObjectRendering(const MWWorld::Ptr &ptr, const std::string &model, MWRender::RenderingInterface &renderingInterface) const + { + if (!model.empty()) { + renderingInterface.getObjects().insertModel(ptr, model); + } + } + + void BodyPart::insertObject(const MWWorld::Ptr &ptr, const std::string &model, MWPhysics::PhysicsSystem &physics) const + { + } + + std::string BodyPart::getName(const MWWorld::ConstPtr &ptr) const + { + return std::string(); + } + + void BodyPart::registerSelf() + { + boost::shared_ptr instance (new BodyPart); + + registerClass (typeid (ESM::BodyPart).name(), instance); + } + + std::string BodyPart::getModel(const MWWorld::ConstPtr &ptr) const + { + const MWWorld::LiveCellRef *ref = ptr.get(); + + const std::string &model = ref->mBase->mModel; + if (!model.empty()) { + return "meshes\\" + model; + } + return ""; + } + +} diff --git a/apps/openmw/mwclass/bodypart.hpp b/apps/openmw/mwclass/bodypart.hpp new file mode 100644 index 000000000..79c7c860d --- /dev/null +++ b/apps/openmw/mwclass/bodypart.hpp @@ -0,0 +1,31 @@ +#ifndef GAME_MWCLASS_BODYPART_H +#define GAME_MWCLASS_BODYPART_H + +#include "../mwworld/class.hpp" + +namespace MWClass +{ + + class BodyPart : public MWWorld::Class + { + virtual MWWorld::Ptr copyToCellImpl(const MWWorld::ConstPtr &ptr, MWWorld::CellStore &cell) const; + + public: + + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, const std::string& model, MWRender::RenderingInterface& renderingInterface) const; + ///< Add reference into a cell for rendering + + virtual void insertObject(const MWWorld::Ptr& ptr, const std::string& model, MWPhysics::PhysicsSystem& physics) const; + + virtual std::string getName (const MWWorld::ConstPtr& ptr) const; + ///< \return name (the one that is to be presented to the user; not the internal one); + /// can return an empty string. + + static void registerSelf(); + + virtual std::string getModel(const MWWorld::ConstPtr &ptr) const; + }; + +} + +#endif diff --git a/apps/openmw/mwclass/classes.cpp b/apps/openmw/mwclass/classes.cpp index c303b23af..a552dfebf 100644 --- a/apps/openmw/mwclass/classes.cpp +++ b/apps/openmw/mwclass/classes.cpp @@ -20,6 +20,7 @@ #include "probe.hpp" #include "repair.hpp" #include "static.hpp" +#include "bodypart.hpp" namespace MWClass { @@ -45,5 +46,6 @@ namespace MWClass Probe::registerSelf(); Repair::registerSelf(); Static::registerSelf(); + BodyPart::registerSelf(); } } diff --git a/apps/openmw/mwworld/cellstore.cpp b/apps/openmw/mwworld/cellstore.cpp index 08f272ea2..5b53643e8 100644 --- a/apps/openmw/mwworld/cellstore.cpp +++ b/apps/openmw/mwworld/cellstore.cpp @@ -591,6 +591,7 @@ namespace MWWorld case ESM::REC_REPA: mRepairs.load(ref, deleted, store); break; case ESM::REC_STAT: mStatics.load(ref, deleted, store); break; case ESM::REC_WEAP: mWeapons.load(ref, deleted, store); break; + case ESM::REC_BODY: mBodyParts.load(ref, deleted, store); break; case 0: std::cerr << "Cell reference " + ref.mRefID + " not found!\n"; break; @@ -659,6 +660,7 @@ namespace MWWorld writeReferenceCollection (writer, mRepairs); writeReferenceCollection (writer, mStatics); writeReferenceCollection (writer, mWeapons); + writeReferenceCollection (writer, mBodyParts); for (MovedRefTracker::const_iterator it = mMovedToAnotherCell.begin(); it != mMovedToAnotherCell.end(); ++it) { @@ -794,6 +796,11 @@ namespace MWWorld readReferenceCollection (reader, mWeapons, cref, contentFileMap); break; + case ESM::REC_BODY: + + readReferenceCollection (reader, mBodyParts, cref, contentFileMap); + break; + default: throw std::runtime_error ("unknown type in cell reference section"); diff --git a/apps/openmw/mwworld/cellstore.hpp b/apps/openmw/mwworld/cellstore.hpp index 27fe9ec03..faba76262 100644 --- a/apps/openmw/mwworld/cellstore.hpp +++ b/apps/openmw/mwworld/cellstore.hpp @@ -31,6 +31,7 @@ #include #include #include +#include #include "../mwmechanics/pathgrid.hpp" // TODO: maybe belongs in mwworld @@ -97,6 +98,7 @@ namespace MWWorld CellRefList mRepairs; CellRefList mStatics; CellRefList mWeapons; + CellRefList mBodyParts; typedef std::map MovedRefTracker; // References owned by a different cell that have been moved here. @@ -152,6 +154,7 @@ namespace MWWorld forEachImp (visitor, mRepairs) && forEachImp (visitor, mStatics) && forEachImp (visitor, mWeapons) && + forEachImp (visitor, mBodyParts) && forEachImp (visitor, mCreatures) && forEachImp (visitor, mNpcs) && forEachImp (visitor, mCreatureLists); @@ -518,6 +521,13 @@ namespace MWWorld return mWeapons; } + template<> + inline CellRefList& CellStore::get() + { + mHasState = true; + return mBodyParts; + } + bool operator== (const CellStore& left, const CellStore& right); bool operator!= (const CellStore& left, const CellStore& right); } diff --git a/apps/openmw/mwworld/esmstore.cpp b/apps/openmw/mwworld/esmstore.cpp index 1882c6e1a..7a1f222c7 100644 --- a/apps/openmw/mwworld/esmstore.cpp +++ b/apps/openmw/mwworld/esmstore.cpp @@ -19,7 +19,8 @@ static bool isCacheableRecord(int id) id == ESM::REC_BOOK || id == ESM::REC_CLOT || id == ESM::REC_CONT || id == ESM::REC_CREA || id == ESM::REC_DOOR || id == ESM::REC_INGR || id == ESM::REC_LEVC || id == ESM::REC_LEVI || id == ESM::REC_LIGH || id == ESM::REC_LOCK || id == ESM::REC_MISC || id == ESM::REC_NPC_ || - id == ESM::REC_PROB || id == ESM::REC_REPA || id == ESM::REC_STAT || id == ESM::REC_WEAP) + id == ESM::REC_PROB || id == ESM::REC_REPA || id == ESM::REC_STAT || id == ESM::REC_WEAP || + id == ESM::REC_BODY) { return true; } diff --git a/apps/openmw/mwworld/manualref.cpp b/apps/openmw/mwworld/manualref.cpp index d6e40ad09..c683f7e03 100644 --- a/apps/openmw/mwworld/manualref.cpp +++ b/apps/openmw/mwworld/manualref.cpp @@ -54,6 +54,7 @@ MWWorld::ManualRef::ManualRef(const MWWorld::ESMStore& store, const std::string& case ESM::REC_REPA: create(store.get(), lowerName, mRef, mPtr); break; case ESM::REC_STAT: create(store.get(), lowerName, mRef, mPtr); break; case ESM::REC_WEAP: create(store.get(), lowerName, mRef, mPtr); break; + case ESM::REC_BODY: create(store.get(), lowerName, mRef, mPtr); break; case 0: throw std::logic_error("failed to create manual cell ref for " + lowerName + " (unknown ID)"); From 84a9df97932739b80031a47f3150172d46932578 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sat, 2 Jan 2016 01:12:44 +0100 Subject: [PATCH 07/28] Do not discard root node transformations if the root node is named 'bip01' (Bug #3118) --- components/nif/node.hpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/nif/node.hpp b/components/nif/node.hpp index 326e9802f..17b58bd46 100644 --- a/components/nif/node.hpp +++ b/components/nif/node.hpp @@ -9,6 +9,8 @@ #include "controller.hpp" #include "base.hpp" +#include + namespace Nif { @@ -118,10 +120,10 @@ struct NiNode : Node children.read(nif); effects.read(nif); - // Discard tranformations for the root node, otherwise some meshes + // Discard transformations for the root node, otherwise some meshes // occasionally get wrong orientation. Only for NiNode-s for now, but // can be expanded if needed. - if (0 == recIndex) + if (0 == recIndex && !Misc::StringUtils::ciEqual(name, "bip01")) { static_cast(this)->trafo = Nif::Transformation::getIdentity(); } From f375d07c16a53d820a047e2180f9d9da9b8e5234 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 3 Jan 2016 00:02:58 +0100 Subject: [PATCH 08/28] ExprParser: Warn about ignored arguments --- components/compiler/exprparser.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/components/compiler/exprparser.cpp b/components/compiler/exprparser.cpp index c0375b436..d35b08167 100644 --- a/components/compiler/exprparser.cpp +++ b/components/compiler/exprparser.cpp @@ -804,6 +804,8 @@ namespace Compiler if (optional) ++optionalCount; } + else + getErrorHandler().warning("Ignoring extra argument", mTokenLoc); } else if (*iter=='X') { @@ -815,6 +817,8 @@ namespace Compiler if (parser.isEmpty()) break; + else + getErrorHandler().warning("Ignoring extra argument", mTokenLoc); } else if (*iter=='z') { @@ -825,6 +829,8 @@ namespace Compiler if (discardParser.isEmpty()) break; + else + getErrorHandler().warning("Ignoring extra argument", mTokenLoc); } else if (*iter=='j') { From e9b02a13c308632371568cd930e3947f46fa94d5 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 3 Jan 2016 00:03:41 +0100 Subject: [PATCH 09/28] Ignore extra arguments in playSound and playSound3D. A common mistake in mods is to use playSound with volume/pitch arguments, which only playSoundVP supports. Previously these extra arguments raised a parser error, making the respective mod unusable. --- components/compiler/extensions0.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/compiler/extensions0.cpp b/components/compiler/extensions0.cpp index 8f7650191..8c76cdbb8 100644 --- a/components/compiler/extensions0.cpp +++ b/components/compiler/extensions0.cpp @@ -341,9 +341,9 @@ namespace Compiler extensions.registerInstruction ("say", "SS", opcodeSay, opcodeSayExplicit); extensions.registerFunction ("saydone", 'l', "", opcodeSayDone, opcodeSayDoneExplicit); extensions.registerInstruction ("streammusic", "S", opcodeStreamMusic); - extensions.registerInstruction ("playsound", "c", opcodePlaySound); + extensions.registerInstruction ("playsound", "cXX", opcodePlaySound); extensions.registerInstruction ("playsoundvp", "cff", opcodePlaySoundVP); - extensions.registerInstruction ("playsound3d", "c", opcodePlaySound3D, + extensions.registerInstruction ("playsound3d", "cXX", opcodePlaySound3D, opcodePlaySound3DExplicit); extensions.registerInstruction ("playsound3dvp", "cff", opcodePlaySound3DVP, opcodePlaySound3DVPExplicit); From 215567c9c31b32e63b048971a5f676e2875f718a Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 3 Jan 2016 00:08:05 +0100 Subject: [PATCH 10/28] Update ScriptArgs documentation --- components/compiler/extensions.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/compiler/extensions.hpp b/components/compiler/extensions.hpp index 9fb9bdb95..2adf25a57 100644 --- a/components/compiler/extensions.hpp +++ b/components/compiler/extensions.hpp @@ -20,9 +20,9 @@ namespace Compiler l - Integer
s - Short
S - String, case preserved
- x - Optional, ignored string argument - X - Optional, ignored numeric expression - z - Optional, ignored string or numeric argument + x - Optional, ignored string argument. Emits a parser warning when this argument is supplied.
+ X - Optional, ignored numeric expression. Emits a parser warning when this argument is supplied.
+ z - Optional, ignored string or numeric argument. Emits a parser warning when this argument is supplied.
j - A piece of junk (either . or a specific keyword) **/ typedef std::string ScriptArgs; From 5b3ac5ff2777c87f1dd362972b6c9f4fb1828bd9 Mon Sep 17 00:00:00 2001 From: Poncho Date: Sat, 2 Jan 2016 12:24:39 -0600 Subject: [PATCH 11/28] Use correct direction multipliers during awareness check --- apps/openmw/mwmechanics/mechanicsmanagerimp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index b98e5daa3..b8dc90cf7 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -1435,7 +1435,7 @@ namespace MWMechanics osg::Vec3f observerDir = (observer.getRefData().getBaseNode()->getAttitude() * osg::Vec3f(0,1,0)); float angleRadians = std::acos(observerDir * vec / (observerDir.length() * vec.length())); - if (angleRadians < osg::DegreesToRadians(90.f)) + if (angleRadians > osg::DegreesToRadians(90.f)) y = obsTerm * observerStats.getFatigueTerm() * fSneakNoViewMult; else y = obsTerm * observerStats.getFatigueTerm() * fSneakViewMult; From 4038f49d81c34dd7c2045f25bb59b1441e2fb417 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sat, 2 Jan 2016 20:52:22 +0100 Subject: [PATCH 12/28] Update AUTHORS.md --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index 292c1e9e3..d4927ea92 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -56,6 +56,7 @@ Programmers Jeffrey Haines (Jyby) Jengerer Jiří Kuneš (kunesj) + Joe Wilkerson (neuralroberts) Joel Graff (graffy) John Blomberg (fstp) Jordan Ayers From dca0e2f582ea3996248039e636ff0ba28e373128 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 3 Jan 2016 16:43:20 +0100 Subject: [PATCH 13/28] Pass a Vec4f by reference --- components/sceneutil/lightcontroller.cpp | 2 +- components/sceneutil/lightcontroller.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/sceneutil/lightcontroller.cpp b/components/sceneutil/lightcontroller.cpp index 511937a28..e3ea93843 100644 --- a/components/sceneutil/lightcontroller.cpp +++ b/components/sceneutil/lightcontroller.cpp @@ -125,7 +125,7 @@ namespace SceneUtil traverse(node, nv); } - void LightController::setDiffuse(osg::Vec4f color) + void LightController::setDiffuse(const osg::Vec4f& color) { mDiffuseColor = color; } diff --git a/components/sceneutil/lightcontroller.hpp b/components/sceneutil/lightcontroller.hpp index f6e2fa9fa..8f70af343 100644 --- a/components/sceneutil/lightcontroller.hpp +++ b/components/sceneutil/lightcontroller.hpp @@ -24,7 +24,7 @@ namespace SceneUtil void setType(LightType type); - void setDiffuse(osg::Vec4f color); + void setDiffuse(const osg::Vec4f& color); virtual void operator()(osg::Node* node, osg::NodeVisitor* nv); From e362e3e6a5fa8a4868fe8dc7991812aeb6acff68 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 3 Jan 2016 18:20:34 +0100 Subject: [PATCH 14/28] Fix cppcheck warnings --- apps/essimporter/importer.cpp | 2 +- apps/mwiniimporter/importer.cpp | 10 ++++++++-- apps/opencs/model/doc/loader.cpp | 3 +-- apps/opencs/model/tools/magiceffectcheck.cpp | 2 +- apps/opencs/model/tools/search.cpp | 9 +++++---- apps/opencs/model/tools/soundgencheck.cpp | 2 +- apps/opencs/model/world/nestedcoladapterimp.cpp | 6 +++--- apps/opencs/model/world/refidadapterimp.cpp | 6 +++--- apps/opencs/view/world/datadisplaydelegate.cpp | 2 +- apps/opencs/view/world/datadisplaydelegate.hpp | 2 +- apps/opencs/view/world/dialoguesubview.cpp | 2 -- apps/openmw/mwmechanics/aicombat.cpp | 1 - apps/openmw/mwmechanics/aifollow.cpp | 4 +++- apps/openmw/mwphysics/physicssystem.cpp | 3 +++ apps/openmw/mwrender/sky.cpp | 2 +- components/contentselector/model/contentmodel.cpp | 3 +-- components/contentselector/model/loadordererror.hpp | 7 ++----- components/myguiplatform/myguiplatform.hpp | 3 +++ components/nifosg/controller.cpp | 2 +- components/sceneutil/riggeometry.cpp | 2 +- components/sceneutil/workqueue.cpp | 4 ++-- 21 files changed, 42 insertions(+), 35 deletions(-) diff --git a/apps/essimporter/importer.cpp b/apps/essimporter/importer.cpp index 4fbf06217..3d94f2b90 100644 --- a/apps/essimporter/importer.cpp +++ b/apps/essimporter/importer.cpp @@ -54,7 +54,7 @@ namespace *(image->data(x,y)+2) = *it++; *(image->data(x,y)+1) = *it++; *image->data(x,y) = *it++; - it++; // skip alpha + ++it; // skip alpha } } diff --git a/apps/mwiniimporter/importer.cpp b/apps/mwiniimporter/importer.cpp index f90ba4184..f2fcdb711 100644 --- a/apps/mwiniimporter/importer.cpp +++ b/apps/mwiniimporter/importer.cpp @@ -1,5 +1,6 @@ #include "importer.hpp" +#include #include #include #include @@ -897,8 +898,13 @@ std::time_t MwIniImporter::lastWriteTime(const boost::filesystem::path& filename boost::filesystem::path resolved = filename; #endif writeTime = boost::filesystem::last_write_time(resolved); - std::cout << "content file: " << resolved << " timestamp = (" << writeTime << - ") " << asctime(localtime(&writeTime)) << std::endl; + + // print timestamp + const int size=1024; + char timeStrBuffer[size]; + if (std::strftime(timeStrBuffer, size, "%x %X", localtime(&writeTime)) > 0) + std::cout << "content file: " << resolved << " timestamp = (" << writeTime << + ") " << timeStrBuffer << std::endl; } else { diff --git a/apps/opencs/model/doc/loader.cpp b/apps/opencs/model/doc/loader.cpp index cb3ff2cd0..166e6f3db 100644 --- a/apps/opencs/model/doc/loader.cpp +++ b/apps/opencs/model/doc/loader.cpp @@ -45,13 +45,12 @@ void CSMDoc::Loader::load() bool done = false; - const int batchingSize = 50; - try { if (iter->second.mRecordsLeft) { Messages messages (Message::Severity_Error); + const int batchingSize = 50; for (int i=0; igetData().continueLoading (messages)) { diff --git a/apps/opencs/model/tools/magiceffectcheck.cpp b/apps/opencs/model/tools/magiceffectcheck.cpp index 5435881b3..ab8b3b68b 100644 --- a/apps/opencs/model/tools/magiceffectcheck.cpp +++ b/apps/opencs/model/tools/magiceffectcheck.cpp @@ -7,7 +7,7 @@ namespace { - void addMessageIfNotEmpty(CSMDoc::Messages &messages, const CSMWorld::UniversalId &id, const std::string text) + void addMessageIfNotEmpty(CSMDoc::Messages &messages, const CSMWorld::UniversalId &id, const std::string& text) { if (!text.empty()) { diff --git a/apps/opencs/model/tools/search.cpp b/apps/opencs/model/tools/search.cpp index 0409199af..0c068ba11 100644 --- a/apps/opencs/model/tools/search.cpp +++ b/apps/opencs/model/tools/search.cpp @@ -120,24 +120,25 @@ QString CSMTools::Search::flatten (const QString& text) const return flat; } -CSMTools::Search::Search() : mType (Type_None), mPaddingBefore (10), mPaddingAfter (10) {} +CSMTools::Search::Search() : mType (Type_None), mValue (0), mIdColumn (0), mTypeColumn (0), + mPaddingBefore (10), mPaddingAfter (10) {} CSMTools::Search::Search (Type type, const std::string& value) -: mType (type), mText (value), mPaddingBefore (10), mPaddingAfter (10) +: mType (type), mText (value), mValue (0), mIdColumn (0), mTypeColumn (0), mPaddingBefore (10), mPaddingAfter (10) { if (type!=Type_Text && type!=Type_Id) throw std::logic_error ("Invalid search parameter (string)"); } CSMTools::Search::Search (Type type, const QRegExp& value) -: mType (type), mRegExp (value), mPaddingBefore (10), mPaddingAfter (10) +: mType (type), mRegExp (value), mValue (0), mIdColumn (0), mTypeColumn (0), mPaddingBefore (10), mPaddingAfter (10) { if (type!=Type_TextRegEx && type!=Type_IdRegEx) throw std::logic_error ("Invalid search parameter (RegExp)"); } CSMTools::Search::Search (Type type, int value) -: mType (type), mValue (value), mPaddingBefore (10), mPaddingAfter (10) +: mType (type), mValue (value), mIdColumn (0), mTypeColumn (0), mPaddingBefore (10), mPaddingAfter (10) { if (type!=Type_RecordState) throw std::logic_error ("invalid search parameter (int)"); diff --git a/apps/opencs/model/tools/soundgencheck.cpp b/apps/opencs/model/tools/soundgencheck.cpp index bdf89f19d..a36c494a1 100644 --- a/apps/opencs/model/tools/soundgencheck.cpp +++ b/apps/opencs/model/tools/soundgencheck.cpp @@ -26,7 +26,7 @@ void CSMTools::SoundGenCheckStage::perform(int stage, CSMDoc::Messages &messages return; } - const ESM::SoundGenerator soundGen = record.get(); + const ESM::SoundGenerator& soundGen = record.get(); CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_SoundGen, soundGen.mId); if (!soundGen.mCreature.empty()) diff --git a/apps/opencs/model/world/nestedcoladapterimp.cpp b/apps/opencs/model/world/nestedcoladapterimp.cpp index bfacc15dc..92b4b9e62 100644 --- a/apps/opencs/model/world/nestedcoladapterimp.cpp +++ b/apps/opencs/model/world/nestedcoladapterimp.cpp @@ -277,7 +277,7 @@ namespace CSMWorld // WARNING: Assumed that the table view has the same order as std::map std::map::iterator iter = reactions.begin(); for(int i = 0; i < rowToRemove; ++i) - iter++; + ++iter; reactions.erase(iter); record.setModified (faction); @@ -314,7 +314,7 @@ namespace CSMWorld // WARNING: Assumed that the table view has the same order as std::map std::map::const_iterator iter = reactions.begin(); for(int i = 0; i < subRowIndex; ++i) - iter++; + ++iter; switch (subColIndex) { case 0: return QString((*iter).first.c_str()); @@ -337,7 +337,7 @@ namespace CSMWorld // WARNING: Assumed that the table view has the same order as std::map std::map::iterator iter = reactions.begin(); for(int i = 0; i < subRowIndex; ++i) - iter++; + ++iter; std::string factionId = (*iter).first; int reaction = (*iter).second; diff --git a/apps/opencs/model/world/refidadapterimp.cpp b/apps/opencs/model/world/refidadapterimp.cpp index 90a710fc8..039624c84 100644 --- a/apps/opencs/model/world/refidadapterimp.cpp +++ b/apps/opencs/model/world/refidadapterimp.cpp @@ -1153,7 +1153,7 @@ QVariant CSMWorld::CreatureAttributesRefIdAdapter::getNestedData (const RefIdCol const Record& record = static_cast&> (data.getRecord (RefIdData::LocalIndex (index, UniversalId::Type_Creature))); - const ESM::Creature creature = record.get(); + const ESM::Creature& creature = record.get(); if (subColIndex == 0) return subRowIndex; @@ -1259,7 +1259,7 @@ QVariant CSMWorld::CreatureAttackRefIdAdapter::getNestedData (const RefIdColumn const Record& record = static_cast&> (data.getRecord (RefIdData::LocalIndex (index, UniversalId::Type_Creature))); - const ESM::Creature creature = record.get(); + const ESM::Creature& creature = record.get(); if (subRowIndex < 0 || subRowIndex > 2 || subColIndex < 0 || subColIndex > 2) throw std::runtime_error ("index out of range"); @@ -1337,7 +1337,7 @@ QVariant CSMWorld::CreatureMiscRefIdAdapter::getNestedData (const RefIdColumn *c const Record& record = static_cast&> (data.getRecord (RefIdData::LocalIndex (index, UniversalId::Type_Creature))); - const ESM::Creature creature = record.get(); + const ESM::Creature& creature = record.get(); switch (subColIndex) { diff --git a/apps/opencs/view/world/datadisplaydelegate.cpp b/apps/opencs/view/world/datadisplaydelegate.cpp index 51d7137ec..9db16d593 100644 --- a/apps/opencs/view/world/datadisplaydelegate.cpp +++ b/apps/opencs/view/world/datadisplaydelegate.cpp @@ -140,7 +140,7 @@ void CSVWorld::DataDisplayDelegate::settingChanged (const CSMPrefs::Setting *set } -void CSVWorld::DataDisplayDelegateFactory::add (int enumValue, QString enumName, QString iconFilename) +void CSVWorld::DataDisplayDelegateFactory::add (int enumValue, const QString& enumName, const QString& iconFilename) { mIcons.push_back (std::make_pair(enumValue, QIcon(iconFilename))); EnumDelegateFactory::add(enumValue, enumName); diff --git a/apps/opencs/view/world/datadisplaydelegate.hpp b/apps/opencs/view/world/datadisplaydelegate.hpp index cde109fd4..540216d78 100755 --- a/apps/opencs/view/world/datadisplaydelegate.hpp +++ b/apps/opencs/view/world/datadisplaydelegate.hpp @@ -83,7 +83,7 @@ namespace CSVWorld protected: - void add (int enumValue,const QString enumName, const QString iconFilename); + void add (int enumValue, const QString& enumName, const QString& iconFilename); }; diff --git a/apps/opencs/view/world/dialoguesubview.cpp b/apps/opencs/view/world/dialoguesubview.cpp index 25bd8e8ee..0a79aac2b 100644 --- a/apps/opencs/view/world/dialoguesubview.cpp +++ b/apps/opencs/view/world/dialoguesubview.cpp @@ -674,8 +674,6 @@ void CSVWorld::EditWidget::remake(int row) { mNestedTableMapper->addMapping (editor, col); - std::string disString = tree->nestedHeaderData (i, col, - Qt::Horizontal, Qt::DisplayRole).toString().toStdString(); // Need to use Qt::DisplayRole in order to get the correct string // from CSMWorld::Columns QLabel* label = new QLabel (tree->nestedHeaderData (i, col, diff --git a/apps/openmw/mwmechanics/aicombat.cpp b/apps/openmw/mwmechanics/aicombat.cpp index 3cea00e45..3aeeedad1 100644 --- a/apps/openmw/mwmechanics/aicombat.cpp +++ b/apps/openmw/mwmechanics/aicombat.cpp @@ -305,7 +305,6 @@ namespace MWMechanics else { distantCombat = (rangeAttack > 500); - weapRange = 150.f; } diff --git a/apps/openmw/mwmechanics/aifollow.cpp b/apps/openmw/mwmechanics/aifollow.cpp index d9356da93..1430d42f2 100644 --- a/apps/openmw/mwmechanics/aifollow.cpp +++ b/apps/openmw/mwmechanics/aifollow.cpp @@ -129,12 +129,14 @@ bool AiFollow::execute (const MWWorld::Ptr& actor, CharacterController& characte ESM::Pathgrid::Point dest = target.getRefData().getPosition().pos; float dist = distance(dest, pos.pos[0], pos.pos[1], pos.pos[2]); - const float threshold = 10; if (storage.mMoving) //Stop when you get close storage.mMoving = (dist > followDistance); else + { + const float threshold = 10; storage.mMoving = (dist > followDistance + threshold); + } if(!storage.mMoving) { diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp index f6883ae35..57bf7919a 100644 --- a/apps/openmw/mwphysics/physicssystem.cpp +++ b/apps/openmw/mwphysics/physicssystem.cpp @@ -506,6 +506,9 @@ namespace MWPhysics private: btHeightfieldTerrainShape* mShape; btCollisionObject* mCollisionObject; + + void operator=(const HeightField&); + HeightField(const HeightField&); }; // -------------------------------------------------------------- diff --git a/apps/openmw/mwrender/sky.cpp b/apps/openmw/mwrender/sky.cpp index 20e3dc07c..635116db0 100644 --- a/apps/openmw/mwrender/sky.cpp +++ b/apps/openmw/mwrender/sky.cpp @@ -366,7 +366,7 @@ public: for (unsigned int i=0; isize(); ++i) { float alpha = 1.f; - if (mMeshType == 0) alpha = i%2 ? 0.f : 1.f; // this is a cylinder, so every second vertex belongs to the bottom-most row + if (mMeshType == 0) alpha = (i%2) ? 0.f : 1.f; // this is a cylinder, so every second vertex belongs to the bottom-most row else if (mMeshType == 1) { if (i>= 49 && i <= 64) alpha = 0.f; // bottom-most row diff --git a/components/contentselector/model/contentmodel.cpp b/components/contentselector/model/contentmodel.cpp index 8dc4351f6..26f0a4806 100644 --- a/components/contentselector/model/contentmodel.cpp +++ b/components/contentselector/model/contentmodel.cpp @@ -110,12 +110,11 @@ Qt::ItemFlags ContentSelectorModel::ContentModel::flags(const QModelIndex &index bool gamefileChecked = (file->gameFiles().count() == 0); foreach (const QString &fileName, file->gameFiles()) { - bool depFound = false; foreach (EsmFile *dependency, mFiles) { //compare filenames only. Multiple instances //of the filename (with different paths) is not relevant here. - depFound = (dependency->fileName().compare(fileName, Qt::CaseInsensitive) == 0); + bool depFound = (dependency->fileName().compare(fileName, Qt::CaseInsensitive) == 0); if (!depFound) continue; diff --git a/components/contentselector/model/loadordererror.hpp b/components/contentselector/model/loadordererror.hpp index 2b840cf69..7067f1f22 100644 --- a/components/contentselector/model/loadordererror.hpp +++ b/components/contentselector/model/loadordererror.hpp @@ -17,12 +17,9 @@ namespace ContentSelectorModel ErrorCode_LoadOrder = 3 }; - inline LoadOrderError() : mErrorCode(ErrorCode_None) {}; + inline LoadOrderError() : mErrorCode(ErrorCode_None) {} inline LoadOrderError(ErrorCode errorCode, QString fileName) - { - mErrorCode = errorCode; - mFileName = fileName; - } + : mErrorCode(errorCode), mFileName(fileName) {} inline ErrorCode errorCode() const { return mErrorCode; } inline QString fileName() const { return mFileName; } QString toolTip() const; diff --git a/components/myguiplatform/myguiplatform.hpp b/components/myguiplatform/myguiplatform.hpp index 56562e12a..90d45ce20 100644 --- a/components/myguiplatform/myguiplatform.hpp +++ b/components/myguiplatform/myguiplatform.hpp @@ -47,6 +47,9 @@ namespace osgMyGUI DataManager* mDataManager; MyGUI::LogManager* mLogManager; LogFacility* mLogFacility; + + void operator=(const Platform&); + Platform(const Platform&); }; } diff --git a/components/nifosg/controller.cpp b/components/nifosg/controller.cpp index 28f61e4b6..d0abc9ead 100644 --- a/components/nifosg/controller.cpp +++ b/components/nifosg/controller.cpp @@ -258,7 +258,7 @@ void UVController::apply(osg::StateSet* stateset, osg::NodeVisitor* nv) mat.setTrans(uTrans, vTrans, 0); // setting once is enough because all other texture units share the same TexMat (see setDefaults). - if (mTextureUnits.size()) + if (!mTextureUnits.empty()) { osg::TexMat* texMat = static_cast(stateset->getTextureAttribute(*mTextureUnits.begin(), osg::StateAttribute::TEXMAT)); texMat->setMatrix(mat); diff --git a/components/sceneutil/riggeometry.cpp b/components/sceneutil/riggeometry.cpp index 88b907faf..be8d97a4c 100644 --- a/components/sceneutil/riggeometry.cpp +++ b/components/sceneutil/riggeometry.cpp @@ -177,7 +177,7 @@ bool RigGeometry::initFromParentSkeleton(osg::NodeVisitor* nv) } } - for (Vertex2BoneMap::iterator it = vertex2BoneMap.begin(); it != vertex2BoneMap.end(); it++) + for (Vertex2BoneMap::iterator it = vertex2BoneMap.begin(); it != vertex2BoneMap.end(); ++it) { mBone2VertexMap[it->second].push_back(it->first); } diff --git a/components/sceneutil/workqueue.cpp b/components/sceneutil/workqueue.cpp index b642687f0..26a392be4 100644 --- a/components/sceneutil/workqueue.cpp +++ b/components/sceneutil/workqueue.cpp @@ -59,7 +59,7 @@ WorkQueue::~WorkQueue() { { OpenThreads::ScopedLock lock(mMutex); - while (mQueue.size()) + while (!mQueue.empty()) { WorkItem* item = mQueue.front(); delete item; @@ -88,7 +88,7 @@ osg::ref_ptr WorkQueue::addWorkItem(WorkItem *item) WorkItem *WorkQueue::removeWorkItem() { OpenThreads::ScopedLock lock(mMutex); - while (!mQueue.size() && !mIsReleased) + while (mQueue.empty() && !mIsReleased) { mCondition.wait(&mMutex); } From 1b259e2d3309cc3868f97b3bb5ca685e2d17ba50 Mon Sep 17 00:00:00 2001 From: Koncord Date: Tue, 12 Jan 2016 11:41:44 +0800 Subject: [PATCH 15/28] Syncing inventory, animations, position, 8 key attributes Created Package system --- .gitignore | 1 + CMakeLists.txt | 12 + OpenMW-mp changelog | 47 + TES3MPTeam.md | 25 + apps/opencs/main.cpp | 90 + apps/openmw-mp/CMakeLists.txt | 124 + apps/openmw-mp/Networking.cpp | 395 ++ apps/openmw-mp/Networking.hpp | 45 + apps/openmw-mp/Player.cpp | 80 + apps/openmw-mp/Player.hpp | 56 + apps/openmw-mp/Script/API/PublicFnAPI.cpp | 93 + apps/openmw-mp/Script/API/PublicFnAPI.hpp | 42 + apps/openmw-mp/Script/API/TimerAPI.cpp | 238 ++ apps/openmw-mp/Script/API/TimerAPI.hpp | 70 + apps/openmw-mp/Script/Functions/Chat.cpp | 31 + apps/openmw-mp/Script/Functions/Items.cpp | 56 + apps/openmw-mp/Script/Functions/Stats.cpp | 408 ++ apps/openmw-mp/Script/Functions/Timer.cpp | 49 + .../Script/Functions/Translocations.cpp | 106 + apps/openmw-mp/Script/LangLua/LangLua.cpp | 235 + apps/openmw-mp/Script/LangLua/LangLua.hpp | 56 + apps/openmw-mp/Script/LangLua/LuaFunc.cpp | 182 + .../Script/LangNative/LangNative.cpp | 99 + .../Script/LangNative/LangNative.hpp | 28 + apps/openmw-mp/Script/LangPawn/LangPAWN.cpp | 458 ++ apps/openmw-mp/Script/LangPawn/LangPAWN.hpp | 46 + apps/openmw-mp/Script/LangPawn/PawnFunc.cpp | 154 + apps/openmw-mp/Script/Language.hpp | 27 + apps/openmw-mp/Script/Platform.hpp | 20 + apps/openmw-mp/Script/Script.cpp | 109 + apps/openmw-mp/Script/Script.hpp | 155 + apps/openmw-mp/Script/ScriptFunction.cpp | 225 + apps/openmw-mp/Script/ScriptFunction.hpp | 72 + apps/openmw-mp/Script/ScriptFunctions.cpp | 120 + apps/openmw-mp/Script/ScriptFunctions.hpp | 227 + apps/openmw-mp/Script/SystemInterface.hpp | 44 + apps/openmw-mp/Script/Types.hpp | 101 + apps/openmw-mp/Utils.cpp | 201 + apps/openmw-mp/Utils.hpp | 69 + apps/openmw-mp/amx/CMakeLists.txt | 23 + apps/openmw-mp/amx/amx.c | 3798 +++++++++++++++++ apps/openmw-mp/amx/amx.h | 545 +++ apps/openmw-mp/amx/amxaux.c | 164 + apps/openmw-mp/amx/amxaux.h | 50 + apps/openmw-mp/amx/amxcons.c | 1448 +++++++ apps/openmw-mp/amx/amxcons.h | 17 + apps/openmw-mp/amx/amxcore.c | 500 +++ apps/openmw-mp/amx/amxexec_gcc.c | 1361 ++++++ apps/openmw-mp/amx/amxfile.c | 1274 ++++++ apps/openmw-mp/amx/amxfloat.c | 379 ++ apps/openmw-mp/amx/amxstring.c | 1012 +++++ apps/openmw-mp/amx/amxtime.c | 480 +++ apps/openmw-mp/amx/fpattern.c | 1334 ++++++ apps/openmw-mp/amx/fpattern.h | 184 + apps/openmw-mp/amx/linux/binreloc.c | 766 ++++ apps/openmw-mp/amx/linux/binreloc.h | 80 + apps/openmw-mp/amx/linux/getch.c | 104 + apps/openmw-mp/amx/linux/getch.h | 15 + apps/openmw-mp/amx/linux/sclinux.h | 49 + apps/openmw-mp/amx/minGlue.h | 31 + apps/openmw-mp/amx/minIni.c | 877 ++++ apps/openmw-mp/amx/minIni.h | 152 + apps/openmw-mp/amx/osdefs.h | 159 + apps/openmw-mp/main.cpp | 136 + apps/openmw/CMakeLists.txt | 3 +- apps/openmw/engine.cpp | 10 +- apps/openmw/mwclass/npc.cpp | 64 +- apps/openmw/mwinput/inputmanagerimp.cpp | 2 + apps/openmw/mwmechanics/actors.cpp | 13 +- apps/openmw/mwmechanics/character.cpp | 4 +- apps/openmw/mwmechanics/combat.cpp | 21 +- apps/openmw/mwmechanics/spellcasting.cpp | 29 +- apps/openmw/mwmp/DedicatedPlayer.cpp | 404 ++ apps/openmw/mwmp/DedicatedPlayer.hpp | 60 + apps/openmw/mwmp/GUIChat.cpp | 237 + apps/openmw/mwmp/GUIChat.hpp | 101 + apps/openmw/mwmp/GUILogin.cpp | 22 + apps/openmw/mwmp/GUILogin.hpp | 23 + apps/openmw/mwmp/LocalPlayer.cpp | 453 ++ apps/openmw/mwmp/LocalPlayer.hpp | 48 + apps/openmw/mwmp/Main.cpp | 203 + apps/openmw/mwmp/Main.hpp | 46 + apps/openmw/mwmp/Networking.cpp | 624 ++- apps/openmw/mwmp/Networking.hpp | 62 +- apps/openmw/mwmp/Player.cpp | 152 - apps/openmw/mwmp/Player.hpp | 40 - cmake/FindTerra.cmake | 79 + components/CMakeLists.txt | 6 + components/openmw-mp/Base/BasePlayer.hpp | 148 + components/openmw-mp/NetworkMessages.hpp | 43 + components/openmw-mp/Packets/BasePacket.cpp | 82 + components/openmw-mp/Packets/BasePacket.hpp | 101 + components/openmw-mp/Packets/PacketAttack.cpp | 29 + components/openmw-mp/Packets/PacketAttack.hpp | 22 + .../openmw-mp/Packets/PacketAttribute.cpp | 21 + .../openmw-mp/Packets/PacketAttribute.hpp | 22 + .../Packets/PacketAttributesAndStats.cpp | 25 + .../Packets/PacketAttributesAndStats.hpp | 23 + .../openmw-mp/Packets/PacketBaseInfo.cpp | 29 + .../openmw-mp/Packets/PacketBaseInfo.hpp | 21 + components/openmw-mp/Packets/PacketCell.cpp | 29 + components/openmw-mp/Packets/PacketCell.hpp | 24 + .../openmw-mp/Packets/PacketCharGen.cpp | 19 + .../openmw-mp/Packets/PacketCharGen.hpp | 24 + .../openmw-mp/Packets/PacketChatMessage.cpp | 18 + .../openmw-mp/Packets/PacketChatMessage.hpp | 21 + .../Packets/PacketCreateProjectile.cpp | 18 + .../Packets/PacketCreateProjectile.hpp | 23 + components/openmw-mp/Packets/PacketDie.hpp | 29 + .../openmw-mp/Packets/PacketDisconnect.hpp | 24 + .../openmw-mp/Packets/PacketDrawState.cpp | 20 + .../openmw-mp/Packets/PacketDrawState.hpp | 23 + .../openmw-mp/Packets/PacketEquiped.cpp | 24 + .../openmw-mp/Packets/PacketEquiped.hpp | 21 + .../openmw-mp/Packets/PacketHandshake.cpp | 20 + .../openmw-mp/Packets/PacketHandshake.hpp | 21 + .../openmw-mp/Packets/PacketMainStats.cpp | 21 + .../openmw-mp/Packets/PacketMainStats.hpp | 22 + .../openmw-mp/Packets/PacketPosition.cpp | 24 + .../openmw-mp/Packets/PacketPosition.hpp | 21 + .../openmw-mp/Packets/PacketResurrect.hpp | 30 + .../openmw-mp/Packets/PacketRotation.cpp | 5 + .../openmw-mp/Packets/PacketRotation.hpp | 15 + .../openmw-mp/Packets/PacketSendMyID.hpp | 24 + components/openmw-mp/Packets/PacketSkill.cpp | 24 + components/openmw-mp/Packets/PacketSkill.hpp | 25 + components/openmw-mp/PacketsController.cpp | 137 + components/openmw-mp/PacketsController.hpp | 67 + extern/LuaBridge/LuaBridge.h | 142 + extern/LuaBridge/Manual.html | 1794 ++++++++ extern/LuaBridge/RefCountedObject.h | 363 ++ extern/LuaBridge/RefCountedPtr.h | 251 ++ extern/LuaBridge/detail/CFunctions.h | 442 ++ extern/LuaBridge/detail/ClassInfo.h | 73 + extern/LuaBridge/detail/Constructor.h | 204 + extern/LuaBridge/detail/FuncTraits.h | 852 ++++ extern/LuaBridge/detail/Iterator.h | 114 + extern/LuaBridge/detail/LuaException.h | 113 + extern/LuaBridge/detail/LuaHelpers.h | 143 + extern/LuaBridge/detail/LuaRef.h | 1215 ++++++ extern/LuaBridge/detail/Namespace.h | 1136 +++++ extern/LuaBridge/detail/Stack.h | 469 ++ extern/LuaBridge/detail/TypeList.h | 174 + extern/LuaBridge/detail/TypeTraits.h | 125 + extern/LuaBridge/detail/Userdata.h | 817 ++++ extern/LuaBridge/detail/dump.h | 28 + files/mygui/CMakeLists.txt | 3 + files/mygui/tes3mp_login.layout | 23 + files/mygui/tes3mp_login.skin.xml | 4 + .../scripts/include/tes3mp.callbacks.inc | 23 + .../scripts/include/tes3mp.functions.inc | 30 + files/tes3mp/files/scripts/include/tes3mp.inc | 0 .../files/scripts/include/tes3mp.transloc.inc | 10 + .../files/scripts/include/tes3mp.world.inc | 15 + files/tes3mp/files/scripts/script.pwn | 96 + files/tes3mp/tes3mp-client-default.cfg | 16 + files/tes3mp/tes3mp-server-default.cfg | 12 + 157 files changed, 31954 insertions(+), 312 deletions(-) create mode 100644 OpenMW-mp changelog create mode 100644 TES3MPTeam.md create mode 100644 apps/opencs/main.cpp create mode 100644 apps/openmw-mp/CMakeLists.txt create mode 100644 apps/openmw-mp/Networking.cpp create mode 100644 apps/openmw-mp/Networking.hpp create mode 100644 apps/openmw-mp/Player.cpp create mode 100644 apps/openmw-mp/Player.hpp create mode 100644 apps/openmw-mp/Script/API/PublicFnAPI.cpp create mode 100644 apps/openmw-mp/Script/API/PublicFnAPI.hpp create mode 100644 apps/openmw-mp/Script/API/TimerAPI.cpp create mode 100644 apps/openmw-mp/Script/API/TimerAPI.hpp create mode 100644 apps/openmw-mp/Script/Functions/Chat.cpp create mode 100644 apps/openmw-mp/Script/Functions/Items.cpp create mode 100644 apps/openmw-mp/Script/Functions/Stats.cpp create mode 100644 apps/openmw-mp/Script/Functions/Timer.cpp create mode 100644 apps/openmw-mp/Script/Functions/Translocations.cpp create mode 100644 apps/openmw-mp/Script/LangLua/LangLua.cpp create mode 100644 apps/openmw-mp/Script/LangLua/LangLua.hpp create mode 100644 apps/openmw-mp/Script/LangLua/LuaFunc.cpp create mode 100644 apps/openmw-mp/Script/LangNative/LangNative.cpp create mode 100644 apps/openmw-mp/Script/LangNative/LangNative.hpp create mode 100644 apps/openmw-mp/Script/LangPawn/LangPAWN.cpp create mode 100644 apps/openmw-mp/Script/LangPawn/LangPAWN.hpp create mode 100644 apps/openmw-mp/Script/LangPawn/PawnFunc.cpp create mode 100644 apps/openmw-mp/Script/Language.hpp create mode 100644 apps/openmw-mp/Script/Platform.hpp create mode 100644 apps/openmw-mp/Script/Script.cpp create mode 100644 apps/openmw-mp/Script/Script.hpp create mode 100644 apps/openmw-mp/Script/ScriptFunction.cpp create mode 100644 apps/openmw-mp/Script/ScriptFunction.hpp create mode 100644 apps/openmw-mp/Script/ScriptFunctions.cpp create mode 100644 apps/openmw-mp/Script/ScriptFunctions.hpp create mode 100644 apps/openmw-mp/Script/SystemInterface.hpp create mode 100644 apps/openmw-mp/Script/Types.hpp create mode 100644 apps/openmw-mp/Utils.cpp create mode 100644 apps/openmw-mp/Utils.hpp create mode 100644 apps/openmw-mp/amx/CMakeLists.txt create mode 100644 apps/openmw-mp/amx/amx.c create mode 100644 apps/openmw-mp/amx/amx.h create mode 100644 apps/openmw-mp/amx/amxaux.c create mode 100644 apps/openmw-mp/amx/amxaux.h create mode 100644 apps/openmw-mp/amx/amxcons.c create mode 100644 apps/openmw-mp/amx/amxcons.h create mode 100644 apps/openmw-mp/amx/amxcore.c create mode 100644 apps/openmw-mp/amx/amxexec_gcc.c create mode 100644 apps/openmw-mp/amx/amxfile.c create mode 100644 apps/openmw-mp/amx/amxfloat.c create mode 100644 apps/openmw-mp/amx/amxstring.c create mode 100644 apps/openmw-mp/amx/amxtime.c create mode 100644 apps/openmw-mp/amx/fpattern.c create mode 100644 apps/openmw-mp/amx/fpattern.h create mode 100644 apps/openmw-mp/amx/linux/binreloc.c create mode 100644 apps/openmw-mp/amx/linux/binreloc.h create mode 100644 apps/openmw-mp/amx/linux/getch.c create mode 100644 apps/openmw-mp/amx/linux/getch.h create mode 100644 apps/openmw-mp/amx/linux/sclinux.h create mode 100644 apps/openmw-mp/amx/minGlue.h create mode 100644 apps/openmw-mp/amx/minIni.c create mode 100644 apps/openmw-mp/amx/minIni.h create mode 100644 apps/openmw-mp/amx/osdefs.h create mode 100644 apps/openmw-mp/main.cpp create mode 100644 apps/openmw/mwmp/DedicatedPlayer.cpp create mode 100644 apps/openmw/mwmp/DedicatedPlayer.hpp create mode 100644 apps/openmw/mwmp/GUIChat.cpp create mode 100644 apps/openmw/mwmp/GUIChat.hpp create mode 100644 apps/openmw/mwmp/GUILogin.cpp create mode 100644 apps/openmw/mwmp/GUILogin.hpp create mode 100644 apps/openmw/mwmp/LocalPlayer.cpp create mode 100644 apps/openmw/mwmp/LocalPlayer.hpp create mode 100644 apps/openmw/mwmp/Main.cpp create mode 100644 apps/openmw/mwmp/Main.hpp delete mode 100644 apps/openmw/mwmp/Player.cpp delete mode 100644 apps/openmw/mwmp/Player.hpp create mode 100644 cmake/FindTerra.cmake create mode 100644 components/openmw-mp/Base/BasePlayer.hpp create mode 100644 components/openmw-mp/NetworkMessages.hpp create mode 100644 components/openmw-mp/Packets/BasePacket.cpp create mode 100644 components/openmw-mp/Packets/BasePacket.hpp create mode 100644 components/openmw-mp/Packets/PacketAttack.cpp create mode 100644 components/openmw-mp/Packets/PacketAttack.hpp create mode 100644 components/openmw-mp/Packets/PacketAttribute.cpp create mode 100644 components/openmw-mp/Packets/PacketAttribute.hpp create mode 100644 components/openmw-mp/Packets/PacketAttributesAndStats.cpp create mode 100644 components/openmw-mp/Packets/PacketAttributesAndStats.hpp create mode 100644 components/openmw-mp/Packets/PacketBaseInfo.cpp create mode 100644 components/openmw-mp/Packets/PacketBaseInfo.hpp create mode 100644 components/openmw-mp/Packets/PacketCell.cpp create mode 100644 components/openmw-mp/Packets/PacketCell.hpp create mode 100644 components/openmw-mp/Packets/PacketCharGen.cpp create mode 100644 components/openmw-mp/Packets/PacketCharGen.hpp create mode 100644 components/openmw-mp/Packets/PacketChatMessage.cpp create mode 100644 components/openmw-mp/Packets/PacketChatMessage.hpp create mode 100644 components/openmw-mp/Packets/PacketCreateProjectile.cpp create mode 100644 components/openmw-mp/Packets/PacketCreateProjectile.hpp create mode 100644 components/openmw-mp/Packets/PacketDie.hpp create mode 100644 components/openmw-mp/Packets/PacketDisconnect.hpp create mode 100644 components/openmw-mp/Packets/PacketDrawState.cpp create mode 100644 components/openmw-mp/Packets/PacketDrawState.hpp create mode 100644 components/openmw-mp/Packets/PacketEquiped.cpp create mode 100644 components/openmw-mp/Packets/PacketEquiped.hpp create mode 100644 components/openmw-mp/Packets/PacketHandshake.cpp create mode 100644 components/openmw-mp/Packets/PacketHandshake.hpp create mode 100644 components/openmw-mp/Packets/PacketMainStats.cpp create mode 100644 components/openmw-mp/Packets/PacketMainStats.hpp create mode 100644 components/openmw-mp/Packets/PacketPosition.cpp create mode 100644 components/openmw-mp/Packets/PacketPosition.hpp create mode 100644 components/openmw-mp/Packets/PacketResurrect.hpp create mode 100644 components/openmw-mp/Packets/PacketRotation.cpp create mode 100644 components/openmw-mp/Packets/PacketRotation.hpp create mode 100644 components/openmw-mp/Packets/PacketSendMyID.hpp create mode 100644 components/openmw-mp/Packets/PacketSkill.cpp create mode 100644 components/openmw-mp/Packets/PacketSkill.hpp create mode 100644 components/openmw-mp/PacketsController.cpp create mode 100644 components/openmw-mp/PacketsController.hpp create mode 100644 extern/LuaBridge/LuaBridge.h create mode 100644 extern/LuaBridge/Manual.html create mode 100644 extern/LuaBridge/RefCountedObject.h create mode 100644 extern/LuaBridge/RefCountedPtr.h create mode 100644 extern/LuaBridge/detail/CFunctions.h create mode 100644 extern/LuaBridge/detail/ClassInfo.h create mode 100644 extern/LuaBridge/detail/Constructor.h create mode 100644 extern/LuaBridge/detail/FuncTraits.h create mode 100644 extern/LuaBridge/detail/Iterator.h create mode 100644 extern/LuaBridge/detail/LuaException.h create mode 100644 extern/LuaBridge/detail/LuaHelpers.h create mode 100644 extern/LuaBridge/detail/LuaRef.h create mode 100644 extern/LuaBridge/detail/Namespace.h create mode 100644 extern/LuaBridge/detail/Stack.h create mode 100644 extern/LuaBridge/detail/TypeList.h create mode 100644 extern/LuaBridge/detail/TypeTraits.h create mode 100644 extern/LuaBridge/detail/Userdata.h create mode 100644 extern/LuaBridge/detail/dump.h create mode 100644 files/mygui/tes3mp_login.layout create mode 100644 files/mygui/tes3mp_login.skin.xml create mode 100644 files/tes3mp/files/scripts/include/tes3mp.callbacks.inc create mode 100644 files/tes3mp/files/scripts/include/tes3mp.functions.inc create mode 100644 files/tes3mp/files/scripts/include/tes3mp.inc create mode 100644 files/tes3mp/files/scripts/include/tes3mp.transloc.inc create mode 100644 files/tes3mp/files/scripts/include/tes3mp.world.inc create mode 100644 files/tes3mp/files/scripts/script.pwn create mode 100644 files/tes3mp/tes3mp-client-default.cfg create mode 100644 files/tes3mp/tes3mp-server-default.cfg diff --git a/.gitignore b/.gitignore index e1abcaa63..ce3c91227 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ Doxygen .project .settings .directory +.idea ## qt-creator CMakeLists.txt.user* diff --git a/CMakeLists.txt b/CMakeLists.txt index 8486666c0..143e03b90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -345,6 +345,12 @@ endif (APPLE) # Other files +configure_file(${OpenMW_SOURCE_DIR}/files/tes3mp/tes3mp-client-default.cfg + "${OpenMW_BINARY_DIR}/tes3mp-client-default.cfg") + +configure_file(${OpenMW_SOURCE_DIR}/files/tes3mp/tes3mp-server-default.cfg + "${OpenMW_BINARY_DIR}/tes3mp-server-default.cfg") + configure_file(${OpenMW_SOURCE_DIR}/files/settings-default.cfg "${OpenMW_BINARY_DIR}/settings-default.cfg") @@ -454,6 +460,11 @@ IF(NOT WIN32 AND NOT APPLE) INSTALL(FILES "${OpenMW_BINARY_DIR}/resources/version" DESTINATION "${SYSCONFDIR}" COMPONENT "openmw") INSTALL(FILES "${OpenMW_BINARY_DIR}/gamecontrollerdb.txt" DESTINATION "${SYSCONFDIR}" COMPONENT "openmw") + INSTALL(FILES "${OpenMW_BINARY_DIR}/tes3mp-client-default" DESTINATION "${SYSCONFDIR}" COMPONENT "openmw") + INSTALL(FILES "${OpenMW_BINARY_DIR}/tes3mp-client.install" DESTINATION "${SYSCONFDIR}" RENAME "tes3mp-client.cfg" COMPONENT "openmw") + INSTALL(FILES "${OpenMW_BINARY_DIR}/tes3mp-server-default" DESTINATION "${SYSCONFDIR}" COMPONENT "openmw-mp") + INSTALL(FILES "${OpenMW_BINARY_DIR}/tes3mp-server.install" DESTINATION "${SYSCONFDIR}" RENAME "tes3mp-server.cfg" COMPONENT "openmw-mp") + IF(BUILD_OPENCS) INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw-cs.cfg" DESTINATION "${SYSCONFDIR}" COMPONENT "opencs") ENDIF(BUILD_OPENCS) @@ -473,6 +484,7 @@ if(WIN32) "${OpenMW_SOURCE_DIR}/Docs/license/GPL3.txt" "${OpenMW_SOURCE_DIR}/Docs/license/DejaVu Font License.txt" "${OpenMW_BINARY_DIR}/settings-default.cfg" + "${OpenMW_BINARY_DIR}/tes3mp-client-default.cfg" "${OpenMW_BINARY_DIR}/gamecontrollerdb.txt" "${OpenMW_BINARY_DIR}/Release/openmw.exe" DESTINATION ".") diff --git a/OpenMW-mp changelog b/OpenMW-mp changelog new file mode 100644 index 000000000..a7ba0ec1b --- /dev/null +++ b/OpenMW-mp changelog @@ -0,0 +1,47 @@ +Сделано: +0.0.1b +Пофикшен сегфолт при атаке НПЦ +Интерполляция движения +Lua скриптинг +Чат +0.0.1a +Анимация атаки. +Синхронизация атаки melee/throw/bow/crossbow +Синхронизация здоровья/маны/стамины/смерти +Синхронизация характеристик и навыков +0.0.1 +Синхронизация рассовых признаков +Синхронизация положения в мире +Синхронизация состояния (оружие/заклинание/ничего) +Синхронизация анимации перемещния и прыжков + + +Сделать: +0.0.1b +Закончить пакет атаки (нокаут, нокдаун, заклинания и зачарования) +Улучшить синхронизацию координат при нокауте/нокдауне/смерти +Частичная синхронизация состояния предметов (не ломаемые) +Синхронизация заклинаний +0.0.2 +Вампиризм +Оборотни +Синхронизация состояния предметов +Синхронизация замков +Открывание дверей +Отпирание дверей +Взаимодействие с активаторами (хук?) +0.0.2b +Чистка кода +0.0.3 +Синхронизция контейнеров +Лут +Воровство у др. игроков. +Выбрасывание/подбор вещей. + +Future +Отключаемая консоль (~) +клиентские скриптовые функции для синхронизации +Синхронизация погоды +Синхронизация времени +Синхронизация НПЦ +Трейд diff --git a/TES3MPTeam.md b/TES3MPTeam.md new file mode 100644 index 000000000..2e06e3870 --- /dev/null +++ b/TES3MPTeam.md @@ -0,0 +1,25 @@ +Tes3mp Team +============ + +Programmers +----------- + + Stanislav (Koncord) Zhukov - The main loafer and part-time Project Leader + + +Testers: +-------- + + Volk Milit aka Ja'Virr-Dar - Team Manager, Debian Linux + Shnatsel - Debian Linux + Goodevil - Mint and Xubuntu Linux + + +Public Relations and Translations +--------------------------------- + + Volk Milit aka Ja'Virr-Dar - Public relations & News Writer + Shnatsel - Translator & News Writer + + +Thanks to developers of OpenMW. They do amazing things. diff --git a/apps/opencs/main.cpp b/apps/opencs/main.cpp new file mode 100644 index 000000000..c6fe34835 --- /dev/null +++ b/apps/opencs/main.cpp @@ -0,0 +1,90 @@ +#include "editor.hpp" + +#include +#include +#include + +#include +#include +#include + +#include "model/doc/messages.hpp" + +#include "model/world/universalid.hpp" + +#ifdef Q_OS_MAC +#include +#endif + +Q_DECLARE_METATYPE (std::string) + +class Application : public QApplication +{ + private: + + bool notify (QObject *receiver, QEvent *event) + { + try + { + return QApplication::notify (receiver, event); + } + catch (const std::exception& exception) + { + std::cerr << "An exception has been caught: " << exception.what() << std::endl; + } + + return false; + } + + public: + + Application (int& argc, char *argv[]) : QApplication (argc, argv) {} +}; + +int main(int argc, char *argv[]) +{ + #ifdef Q_OS_MAC + setenv("OSG_GL_TEXTURE_STORAGE", "OFF", 0); + #endif + + try + { + // To allow background thread drawing in OSG + QApplication::setAttribute(Qt::AA_X11InitThreads, true); + + Q_INIT_RESOURCE (resources); + + qRegisterMetaType ("std::string"); + qRegisterMetaType ("CSMWorld::UniversalId"); + qRegisterMetaType ("CSMDoc::Message"); + + Application application (argc, argv); + + #ifdef Q_OS_MAC + QDir dir(QCoreApplication::applicationDirPath()); + if (dir.dirName() == "MacOS") { + dir.cdUp(); + dir.cdUp(); + dir.cdUp(); + } + QDir::setCurrent(dir.absolutePath()); + #endif + + application.setWindowIcon (QIcon (":./openmw-cs.png")); + + CS::Editor editor; + + if(!editor.makeIPCServer()) + { + editor.connectToIPCServer(); + return 0; + } + return editor.run(); + } + catch (std::exception& e) + { + std::cerr << "ERROR: " << e.what() << std::endl; + return 0; + } + +} diff --git a/apps/openmw-mp/CMakeLists.txt b/apps/openmw-mp/CMakeLists.txt new file mode 100644 index 000000000..2219de99b --- /dev/null +++ b/apps/openmw-mp/CMakeLists.txt @@ -0,0 +1,124 @@ +project(openmw-mp) + +add_subdirectory(amx) + +option(BUILD_WITH_PAWN "Enable Pawn language" OFF) +if(BUILD_WITH_PAWN) + #set(Pawn_ROOT ${CMAKE_SOURCE_DIR}/external/pawn/) + set(Pawn_INCLUDES ${Pawn_ROOT}/include) + set(Pawn_LIBRARY ${Pawn_ROOT}/lib/libamx.a) + set(PawnScript_Sources + Script/LangPawn/LangPAWN.cpp + Script/LangPawn/PawnFunc.cpp) + set(PawnScript_Headers ${Pawn_INCLUDES} + Script/LangPawn/LangPAWN.hpp + ) + + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DENABLE_PAWN -DPAWN_CELL_SIZE=64") + #include_directories(${Pawn_INCLUDES}) + include_directories("./amx/linux") +endif(BUILD_WITH_PAWN) + +option(BUILD_WITH_LUA "Enable Terra/Lua language" ON) +if(BUILD_WITH_LUA) + #set(Terra_ROOT ${CMAKE_SOURCE_DIR}/external/terra/) + find_package(Terra REQUIRED) + set(LuaScript_Sources + Script/LangLua/LangLua.cpp + Script/LangLua/LuaFunc.cpp) + set(LuaScript_Headers ${Terra_INCLUDES} ${CMAKE_SOURCE_DIR}/extern/LuaBridge ${CMAKE_SOURCE_DIR}/extern/LuaBridge/detail + Script/LangLua/LangLua.hpp) + + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DENABLE_LUA") + include_directories(${Terra_INCLUDES} ${CMAKE_SOURCE_DIR}/extern/LuaBridge) +endif(BUILD_WITH_LUA) + +set(NativeScript_Sources + Script/LangNative/LangNative.cpp + ) +set(NativeScript_Headers + Script/LangNative/LangNative.hpp + ) + +# local files +set(SERVER + main.cpp + Player.cpp + Networking.cpp + Utils.cpp + Script/Script.cpp Script/ScriptFunction.cpp + Script/ScriptFunctions.cpp + Script/Functions/Translocations.cpp Script/Functions/Stats.cpp Script/Functions/Items.cpp + Script/Functions/Timer.cpp Script/Functions/Chat.cpp + Script/API/TimerAPI.cpp Script/API/PublicFnAPI.cpp + ${PawnScript_Sources} + ${LuaScript_Sources} + ${NativeScript_Sources} + +) + +set(SERVER_HEADER + Script/Types.hpp Script/Script.hpp Script/SystemInterface.hpp + Script/ScriptFunction.hpp Script/Platform.hpp + Script/ScriptFunctions.hpp Script/API/TimerAPI.hpp Script/API/PublicFnAPI.hpp + ${PawnScript_Headers} + ${LuaScript_Headers} + ${NativeScript_Headers} +) +source_group(openmw-mp FILES ${SERVER} ${SERVER_HEADER}) + +include_directories("./") + +# Main executable + +add_executable(openmw-mp +${SERVER_FILES} +${SERVER} ${SERVER_HEADER} +${APPLE_BUNDLE_RESOURCES} +) +add_definitions(-std=gnu++11) + +target_link_libraries(openmw-mp + ${OSG_LIBRARIES} + ${OPENTHREADS_LIBRARIES} + ${OSGPARTICLE_LIBRARIES} + ${OSGUTIL_LIBRARIES} + ${OSGDB_LIBRARIES} + ${OSGVIEWER_LIBRARIES} + ${OSGGA_LIBRARIES} + ${Boost_SYSTEM_LIBRARY} + ${Boost_THREAD_LIBRARY} + ${Boost_FILESYSTEM_LIBRARY} + ${Boost_PROGRAM_OPTIONS_LIBRARY} + ${BULLET_LIBRARIES} + ${RakNet_LIBRARY} + components + amx + ${Terra_LIBRARY} + ${Pawn_LIBRARY} +) + +if (USE_SYSTEM_TINYXML) + target_link_libraries(openmw-mp ${TINYXML_LIBRARIES}) +endif() + +if (UNIX) + target_link_libraries(openmw-mp dl) + # Fix for not visible pthreads functions for linker with glibc 2.15 + if(NOT APPLE) + target_link_libraries(openmw-mp ${CMAKE_THREAD_LIBS_INIT}) + endif(NOT APPLE) +endif(UNIX) + +if (BUILD_WITH_CODE_COVERAGE) + add_definitions (--coverage) + target_link_libraries(openmw-mp gcov) +endif() + +if (MSVC) + # Debug version needs increased number of sections beyond 2^16 + if (CMAKE_CL_64) + set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj") + endif (CMAKE_CL_64) + add_definitions("-D_USE_MATH_DEFINES") +endif (MSVC) diff --git a/apps/openmw-mp/Networking.cpp b/apps/openmw-mp/Networking.cpp new file mode 100644 index 000000000..90ba16c88 --- /dev/null +++ b/apps/openmw-mp/Networking.cpp @@ -0,0 +1,395 @@ +// +// Created by koncord on 12.01.16. +// + +#include "Player.hpp" +#include +#include +#include +#include +#include