diff --git a/.travis.yml b/.travis.yml index a833f721a..ec76dcd1f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,3 @@ -os: - - linux -# - osx -osx_image: xcode8.3 language: cpp sudo: required dist: trusty @@ -10,6 +6,7 @@ branches: - master - coverity_scan - /openmw-.*$/ + - /^[0-9]+\.[0-9]+\.[0-9]+.*$/ env: global: # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created @@ -20,22 +17,25 @@ addons: apt: sources: - sourceline: 'ppa:openmw/openmw' + - sourceline: 'ppa:rakhimov/boost' - ubuntu-toolchain-r-test - - llvm-toolchain-precise-3.6 + - llvm-toolchain-precise-3.8 packages: [ # Dev - cmake, clang-3.6, libunshield-dev, libtinyxml-dev, + cmake, clang-3.8, libunshield-dev, libtinyxml-dev, g++-6, # Tests libgtest-dev, google-mock, # Boost - libboost-filesystem-dev, libboost-program-options-dev, libboost-system-dev, + libboost-filesystem1.61-dev, libboost-program-options1.61-dev, libboost-system1.61-dev, # FFmpeg libavcodec-dev, libavformat-dev, libavutil-dev, libswscale-dev, # Audio & Video libsdl2-dev, qtbase5-dev, libopenal-dev, # The other ones from OpenMW ppa - libbullet-dev, libswresample-dev, libopenscenegraph-3.4-dev, libmygui-dev + libbullet-dev, libswresample-dev, libopenscenegraph-3.4-dev, libmygui-dev, + # tes3mp stuff + libboost1.61-dev, libqt5opengl5-dev ] coverity_scan: @@ -50,12 +50,23 @@ matrix: include: - os: linux env: - ANALYZE="scan-build-3.6 --use-cc clang-3.6 --use-c++ clang++-3.6 " + - ANALYZE="scan-build-3.8 --use-cc clang-3.8 --use-c++ clang++-3.8 " + - MATRIX_CC="CC=clang-3.8 && CXX=clang++-3.8" compiler: clang + - os: linux + env: + - MATRIX_CC="CC=gcc-6 && CXX=g++-6" + - os: linux + env: + - MATRIX_CC="CC=clang-3.8 && CXX=clang++-3.8" allow_failures: - - env: ANALYZE="scan-build-3.6 --use-cc clang-3.6 --use-c++ clang++-3.6 " + - env: + - MATRIX_CC="CC=clang-3.8 && CXX=clang++-3.8" + - env: + - ANALYZE="scan-build-3.8 --use-cc clang-3.8 --use-c++ clang++-3.8 " + - MATRIX_CC="CC=clang-3.8 && CXX=clang++-3.8" -before_install: +before_install: - ./CI/before_install.${TRAVIS_OS_NAME}.sh before_script: ./CI/before_script.${TRAVIS_OS_NAME}.sh script: diff --git a/CI/before_install.linux.sh b/CI/before_install.linux.sh index f4b448900..e2313b443 100755 --- a/CI/before_install.linux.sh +++ b/CI/before_install.linux.sh @@ -1,7 +1,10 @@ #!/bin/sh echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca- -sudo ln -s /usr/bin/clang-3.6 /usr/local/bin/clang -sudo ln -s /usr/bin/clang++-3.6 /usr/local/bin/clang++ + +# Set up compilers +if [ ! -z "${MATRIX_CC}" ]; then + eval "${MATRIX_CC}" +fi # build libgtest & libgtest_main sudo mkdir /usr/src/gtest/build @@ -15,10 +18,16 @@ cd ~/ git clone https://github.com/TES3MP/RakNet cd RakNet cmake . -DRAKNET_ENABLE_DLL=OFF -DRAKNET_ENABLE_SAMPLES=OFF -DCMAKE_BUILD_TYPE=Release -mkdir ./lib -make -j3 install -cp ./Lib/RakNetLibStatic/libRakNetLibStatic.a ./lib -cd .. +make -j3 + +cd ~/ +git clone https://github.com/Koncord/CallFF +cd CallFF +mkdir build +cd build +cmake ../ +make -j3 +cd ~/ wget https://github.com/zdevito/terra/releases/download/release-2016-03-25/terra-Linux-x86_64-332a506.zip unzip terra-Linux-x86_64-332a506.zip diff --git a/CI/before_script.linux.sh b/CI/before_script.linux.sh index efdf28c6c..f1ba38415 100755 --- a/CI/before_script.linux.sh +++ b/CI/before_script.linux.sh @@ -3,15 +3,40 @@ free -m mkdir build cd build -export CODE_COVERAGE=1 + +# Set up compilers +if [ ! -z "${MATRIX_CC}" ]; then + eval "${MATRIX_CC}" +fi + export RAKNET_ROOT=~/RakNet export Terra_ROOT=~/terra-Linux-x86_64-332a506 -export BUILD_SERVER=OFF -if [ "${CC}" = "clang" ]; then export CODE_COVERAGE=0; -else - export COMPILER_NAME=gcc - export CXX=g++-6 - export CC=gcc-6 - export BUILD_SERVER=ON + +export CODE_COVERAGE=0 +if [ ! -z "${ANALYZE}" ]; then + CODE_COVERAGE=1 fi -${ANALYZE}cmake .. -DBUILD_OPENMW_MP=${BUILD_SERVER} -DBUILD_WITH_CODE_COVERAGE=${CODE_COVERAGE} -DBUILD_BSATOOL=OFF -DBUILD_ESMTOOL=OFF -DBUILD_ESSIMPORTER=OFF -DBUILD_LAUNCHER=OFF -DBUILD_MWINIIMPORTER=OFF -DBUILD_MYGUI_PLUGIN=OFF -DBUILD_OPENCS=OFF -DBUILD_WIZARD=OFF -DBUILD_BROWSER=OFF -DBUILD_UNITTESTS=1 -DCMAKE_INSTALL_PREFIX=/usr -DBINDIR=/usr/games -DCMAKE_BUILD_TYPE="None" -DUSE_SYSTEM_TINYXML=TRUE -DRakNet_LIBRARY_RELEASE=~/RakNet/lib/libRakNetLibStatic.a -DRakNet_LIBRARY_DEBUG=~/RakNet/lib/libRakNetLibStatic.a + +${ANALYZE}cmake .. \ + -DDESIRED_QT_VERSION=5 \ + -DBUILD_OPENMW_MP=ON \ + -DBUILD_BROWSER=ON \ + -DBUILD_MASTER=ON \ + -DBUILD_WITH_CODE_COVERAGE=${CODE_COVERAGE} \ + -DBUILD_BSATOOL=OFF \ + -DBUILD_ESMTOOL=OFF \ + -DBUILD_ESSIMPORTER=OFF \ + -DBUILD_LAUNCHER=OFF \ + -DBUILD_MWINIIMPORTER=OFF \ + -DBUILD_MYGUI_PLUGIN=OFF \ + -DBUILD_OPENCS=OFF \ + -DBUILD_WIZARD=OFF \ + -DBUILD_UNITTESTS=1 \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBINDIR=/usr/games \ + -DCMAKE_BUILD_TYPE="None" \ + -DUSE_SYSTEM_TINYXML=TRUE \ + -DRakNet_LIBRARY_RELEASE=~/RakNet/lib/libRakNetLibStatic.a \ + -DRakNet_LIBRARY_DEBUG=~/RakNet/lib/libRakNetLibStatic.a \ + -DCallFF_INCLUDES=~/CallFF/include \ + -DCallFF_LIBRARY=~/CallFF/build/src/libcallff.a diff --git a/CMakeLists.txt b/CMakeLists.txt index c3391edc4..c19a5d734 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -372,9 +372,9 @@ if (NOT WIN32 AND NOT APPLE) endif() # CXX Compiler settings -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 14) if (CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wundef -Wno-unused-parameter -std=c++11 -pedantic -Wno-long-long") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wundef -Wno-unused-parameter -pedantic -Wno-long-long") add_definitions( -DBOOST_NO_CXX11_SCOPED_ENUMS=ON ) if (APPLE) @@ -518,7 +518,7 @@ if(WIN32) INSTALL(DIRECTORY "${OpenMW_BINARY_DIR}/Debug/resources" DESTINATION "." CONFIGURATIONS Debug) INSTALL(DIRECTORY "${OpenMW_BINARY_DIR}/Release/resources" DESTINATION "." CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel) - + FILE(GLOB plugin_dir_debug "${OpenMW_BINARY_DIR}/Debug/osgPlugins-*") FILE(GLOB plugin_dir_release "${OpenMW_BINARY_DIR}/Release/osgPlugins-*") INSTALL(DIRECTORY ${plugin_dir_debug} DESTINATION "." CONFIGURATIONS Debug) @@ -904,4 +904,3 @@ if (DOXYGEN_FOUND) WORKING_DIRECTORY ${OpenMW_BINARY_DIR} COMMENT "Generating documentation for the github-pages at ${DOXYGEN_PAGES_OUTPUT_DIR}" VERBATIM) endif () - diff --git a/apps/opencs/model/world/refidadapterimp.cpp b/apps/opencs/model/world/refidadapterimp.cpp index 352384c73..5ac9ecb18 100644 --- a/apps/opencs/model/world/refidadapterimp.cpp +++ b/apps/opencs/model/world/refidadapterimp.cpp @@ -1368,13 +1368,15 @@ QVariant CSMWorld::CreatureAttackRefIdAdapter::getNestedData (const RefIdColumn const ESM::Creature& creature = record.get(); - if (subRowIndex < 0 || subRowIndex > 2 || subColIndex < 0 || subColIndex > 2) + if (subRowIndex < 0 || subRowIndex > 2) throw std::runtime_error ("index out of range"); if (subColIndex == 0) return subRowIndex + 1; - else if (subColIndex < 3) // 1 or 2 + else if (subColIndex == 1 || subColIndex == 2) return creature.mData.mAttack[(subRowIndex * 2) + (subColIndex - 1)]; + else + throw std::runtime_error ("index out of range"); } void CSMWorld::CreatureAttackRefIdAdapter::setNestedData (const RefIdColumn *column, diff --git a/apps/openmw-mp/CMakeLists.txt b/apps/openmw-mp/CMakeLists.txt index a42462657..59dd2dab2 100644 --- a/apps/openmw-mp/CMakeLists.txt +++ b/apps/openmw-mp/CMakeLists.txt @@ -94,7 +94,7 @@ set(PROCESSORS_PLAYER source_group(tes3mp-server\\processors\\player FILES ${PROCESSORS_PLAYER}) -set(PROCESSORS_WORLD +set(PROCESSORS_OBJECT processors/object/ProcessorContainer.hpp processors/object/ProcessorDoorState.hpp processors/object/ProcessorMusicPlay.hpp processors/object/ProcessorObjectAnimPlay.hpp processors/object/ProcessorObjectDelete.hpp processors/object/ProcessorObjectLock.hpp @@ -107,13 +107,14 @@ set(PROCESSORS_WORLD processors/object/ProcessorScriptGlobalFloat.hpp processors/object/ProcessorVideoPlay.hpp ) -source_group(tes3mp-server\\processors\\world FILES ${PROCESSORS_WORLD}) +source_group(tes3mp-server\\processors\\object FILES ${PROCESSORS_OBJECT}) set(PROCESSORS processors/ProcessorInitializer.cpp processors/PlayerProcessor.cpp processors/ActorProcessor.cpp processors/ObjectProcessor.cpp + processors/WorldstateProcessor.cpp ) source_group(tes3mp-server\\processors FILES ${PROCESSORS}) @@ -124,7 +125,7 @@ include_directories("./") add_executable(tes3mp-server ${SERVER} ${SERVER_HEADER} - ${PROCESSORS_ACTOR} ${PROCESSORS_PLAYER} ${PROCESSORS_WORLD} ${PROCESSORS} + ${PROCESSORS_ACTOR} ${PROCESSORS_PLAYER} ${PROCESSORS_OBJECT} ${PROCESSORS} ${APPLE_BUNDLE_RESOURCES} ) diff --git a/apps/openmw-mp/Networking.cpp b/apps/openmw-mp/Networking.cpp index 2a2aaf687..d202e2b10 100644 --- a/apps/openmw-mp/Networking.cpp +++ b/apps/openmw-mp/Networking.cpp @@ -20,6 +20,7 @@ #include "processors/PlayerProcessor.hpp" #include "processors/ActorProcessor.hpp" #include "processors/ObjectProcessor.hpp" +#include "processors/WorldstateProcessor.hpp" #include "Networking.hpp" #include "MasterClient.hpp" @@ -44,6 +45,7 @@ Networking::Networking(RakNet::RakPeerInterface *peer) : mclient(nullptr) playerPacketController = make_unique(peer); actorPacketController = make_unique(peer); objectPacketController = make_unique(peer); + worldstatePacketController = make_unique(peer); // Set send stream playerPacketController->SetStream(nullptr, &bsOut); @@ -183,6 +185,18 @@ void Networking::processObjectPacket(RakNet::Packet *packet) } +void Networking::processWorldstatePacket(RakNet::Packet *packet) +{ + auto player = Players::getPlayerByGUID(packet->guid); + + if (!player->isHandshaked() || player->getLoadState() != Player::POSTLOADED) + return; + + if (!WorldstateProcessor::Process(*packet, baseWorldstate)) + LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Unhandled WorldstatePacket with identifier %i has arrived", packet->data[0]); + +} + bool Networking::update(RakNet::Packet *packet) { auto player = Players::getPlayerByGUID(packet->guid); @@ -269,6 +283,11 @@ bool Networking::update(RakNet::Packet *packet) objectPacketController->SetStream(&bsIn, nullptr); processObjectPacket(packet); } + else if (worldstatePacketController->ContainsPacket(packet->data[0])) + { + worldstatePacketController->SetStream(&bsIn, nullptr); + processWorldstatePacket(packet); + } else { LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Unhandled RakNet packet with identifier %i has arrived", (int) packet->data[0]); @@ -348,6 +367,11 @@ ObjectPacketController *Networking::getObjectPacketController() const return objectPacketController.get(); } +WorldstatePacketController *Networking::getWorldstatePacketController() const +{ + return worldstatePacketController.get(); +} + BaseActorList *Networking::getLastActorList() { return &baseActorList; @@ -358,6 +382,11 @@ BaseObjectList *Networking::getLastObjectList() return &baseObjectList; } +BaseWorldstate *Networking::getLastWorldstate() +{ + return &baseWorldstate; +} + int Networking::getCurrentMpNum() { return currentMpNum; diff --git a/apps/openmw-mp/Networking.hpp b/apps/openmw-mp/Networking.hpp index a6e1623e9..89bc7f8a0 100644 --- a/apps/openmw-mp/Networking.hpp +++ b/apps/openmw-mp/Networking.hpp @@ -1,13 +1,10 @@ -// -// Created by koncord on 12.01.16. -// - #ifndef OPENMW_NETWORKING_HPP #define OPENMW_NETWORKING_HPP #include #include #include +#include #include #include @@ -39,6 +36,7 @@ namespace mwmp void processPlayerPacket(RakNet::Packet *packet); void processActorPacket(RakNet::Packet *packet); void processObjectPacket(RakNet::Packet *packet); + void processWorldstatePacket(RakNet::Packet *packet); bool update(RakNet::Packet *packet); unsigned short numberOfConnections() const; @@ -52,11 +50,13 @@ namespace mwmp PlayerPacketController *getPlayerPacketController() const; ActorPacketController *getActorPacketController() const; ObjectPacketController *getObjectPacketController() const; + WorldstatePacketController *getWorldstatePacketController() const; LuaState &getState() {return luaState;} BaseActorList *getLastActorList(); BaseObjectList *getLastObjectList(); + BaseWorldstate *getLastWorldstate(); int getCurrentMpNum(); void setCurrentMpNum(int value); @@ -91,10 +91,12 @@ namespace mwmp BaseActorList baseActorList; BaseObjectList baseObjectList; + BaseWorldstate baseWorldstate; std::unique_ptr playerPacketController; std::unique_ptr actorPacketController; std::unique_ptr objectPacketController; + std::unique_ptr worldstatePacketController; bool running; int exitCode; diff --git a/apps/openmw-mp/processors/ObjectProcessor.hpp b/apps/openmw-mp/processors/ObjectProcessor.hpp index 2f02436b3..c3554305f 100644 --- a/apps/openmw-mp/processors/ObjectProcessor.hpp +++ b/apps/openmw-mp/processors/ObjectProcessor.hpp @@ -2,8 +2,8 @@ // Created by koncord on 03.04.17. // -#ifndef OPENMW_WORLDPROCESSOR_HPP -#define OPENMW_WORLDPROCESSOR_HPP +#ifndef OPENMW_OBJECTPROCESSOR_HPP +#define OPENMW_OBJECTPROCESSOR_HPP #include @@ -24,4 +24,4 @@ namespace mwmp }; } -#endif //OPENMW_WORLDPROCESSOR_HPP +#endif //OPENMW_OBJECTPROCESSOR_HPP diff --git a/apps/openmw-mp/processors/WorldstateProcessor.cpp b/apps/openmw-mp/processors/WorldstateProcessor.cpp new file mode 100644 index 000000000..a8b06ccb3 --- /dev/null +++ b/apps/openmw-mp/processors/WorldstateProcessor.cpp @@ -0,0 +1,40 @@ +#include "WorldstateProcessor.hpp" +#include "Networking.hpp" + +using namespace mwmp; + +template +typename BasePacketProcessor::processors_t BasePacketProcessor::processors; + +void WorldstateProcessor::Do(WorldstatePacket &packet, Player &player, BaseWorldstate &worldstate) +{ + packet.Send(true); +} + +bool WorldstateProcessor::Process(RakNet::Packet &packet, BaseWorldstate &worldstate) noexcept +{ + worldstate.guid = packet.guid; + + for (auto &processor : processors) + { + if (processor.first == packet.data[0]) + { + auto player = Players::getPlayerByGUID(packet.guid); + WorldstatePacket *myPacket = Networking::get().getWorldstatePacketController()->GetPacket(packet.data[0]); + + myPacket->setWorldstate(&worldstate); + worldstate.isValid = true; + + if (!processor.second->avoidReading) + myPacket->Read(); + + if (worldstate.isValid) + processor.second->Do(*myPacket, *player, worldstate); + else + LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Received %s that failed integrity check and was ignored!", processor.second->strPacketID.c_str()); + + return true; + } + } + return false; +} diff --git a/apps/openmw-mp/processors/WorldstateProcessor.hpp b/apps/openmw-mp/processors/WorldstateProcessor.hpp new file mode 100644 index 000000000..3a6b3b88b --- /dev/null +++ b/apps/openmw-mp/processors/WorldstateProcessor.hpp @@ -0,0 +1,22 @@ +#ifndef OPENMW_BASEWORLDSTATEPROCESSOR_HPP +#define OPENMW_BASEWORLDSTATEPROCESSOR_HPP + +#include +#include +#include +#include +#include "Players.hpp" + +namespace mwmp +{ + class WorldstateProcessor : public BasePacketProcessor + { + public: + + virtual void Do(WorldstatePacket &packet, Player &player, BaseWorldstate &worldstate); + + static bool Process(RakNet::Packet &packet, BaseWorldstate &worldstate) noexcept; + }; +} + +#endif //OPENMW_BASEWORLDSTATEPROCESSOR_HPP diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index c55e38546..b0d0be615 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -104,7 +104,8 @@ add_openmw_dir (mwmp Main Networking LocalPlayer DedicatedPlayer PlayerList Loca add_openmw_dir (mwmp/GUI GUIChat GUILogin PlayerMarkerCollection GUIDialogList TextInputDialog GUICustomWindow ) -add_openmw_dir(mwmp/processors BaseClientPacketProcessor PlayerProcessor ObjectProcessor ActorProcessor ProcessorInitializer +add_openmw_dir(mwmp/processors BaseClientPacketProcessor PlayerProcessor ObjectProcessor ActorProcessor WorldstateProcessor + ProcessorInitializer ) add_openmw_dir (mwmp/processors/actor ProcessorActorAI ProcessorActorAnimFlags ProcessorActorAnimPlay ProcessorActorAttack diff --git a/apps/openmw/mwclass/weapon.cpp b/apps/openmw/mwclass/weapon.cpp index 9fb4a9767..e59567aac 100644 --- a/apps/openmw/mwclass/weapon.cpp +++ b/apps/openmw/mwclass/weapon.cpp @@ -325,7 +325,10 @@ namespace MWClass // add reach and attack speed for melee weapon if (ref->mBase->mData.mType < 9 && Settings::Manager::getBool("show melee info", "Game")) { - text += MWGui::ToolTips::getPercentString(ref->mBase->mData.mReach, "#{sRange}"); + // 64 game units = 1 yard = 3 ft, display value in feet + const float combatDistance = store.get().find("fCombatDistance")->getFloat() * ref->mBase->mData.mReach; + text += MWGui::ToolTips::getWeightString(combatDistance*3/64, "#{sRange}"); + text += " #{sFeet}"; text += MWGui::ToolTips::getPercentString(ref->mBase->mData.mSpeed, "#{sAttributeSpeed}"); } diff --git a/apps/openmw/mwmp/Networking.cpp b/apps/openmw/mwmp/Networking.cpp index f48d5bd07..12392f837 100644 --- a/apps/openmw/mwmp/Networking.cpp +++ b/apps/openmw/mwmp/Networking.cpp @@ -40,6 +40,7 @@ #include "processors/PlayerProcessor.hpp" #include "processors/ObjectProcessor.hpp" #include "processors/ActorProcessor.hpp" +#include "processors/WorldstateProcessor.hpp" #include "GUIController.hpp" #include "CellController.hpp" @@ -198,7 +199,7 @@ string listComparison(PacketPreInit::PluginContainer checksums, PacketPreInit::P } Networking::Networking(): peer(RakNet::RakPeerInterface::GetInstance()), playerPacketController(peer), - actorPacketController(peer), objectPacketController(peer) + actorPacketController(peer), objectPacketController(peer), worldstatePacketController(peer) { RakNet::SocketDescriptor sd; @@ -209,6 +210,7 @@ Networking::Networking(): peer(RakNet::RakPeerInterface::GetInstance()), playerP playerPacketController.SetStream(0, &bsOut); actorPacketController.SetStream(0, &bsOut); objectPacketController.SetStream(0, &bsOut); + worldstatePacketController.SetStream(0, &bsOut); connected = 0; ProcessorInitializer(); @@ -435,6 +437,11 @@ void Networking::receiveMessage(RakNet::Packet *packet) if (!ObjectProcessor::Process(*packet, objectList)) LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Unhandled ObjectPacket with identifier %i has arrived", (int) packet->data[0]); } + else if (worldstatePacketController.ContainsPacket(packet->data[0])) + { + if (!WorldstateProcessor::Process(*packet, worldstate)) + LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Unhandled WorldstatePacket with identifier %i has arrived", packet->data[0]); + } } PlayerPacket *Networking::getPlayerPacket(RakNet::MessageID id) @@ -452,6 +459,11 @@ ObjectPacket *Networking::getObjectPacket(RakNet::MessageID id) return objectPacketController.GetPacket(id); } +WorldstatePacket *Networking::getWorldstatePacket(RakNet::MessageID id) +{ + return worldstatePacketController.GetPacket(id); +} + LocalPlayer *Networking::getLocalPlayer() { return mwmp::Main::get().getLocalPlayer(); @@ -467,6 +479,11 @@ ObjectList *Networking::getObjectList() return &objectList; } +BaseWorldstate *Networking::getWorldstate() +{ + return &worldstate; +} + bool Networking::isConnected() { return connected; diff --git a/apps/openmw/mwmp/Networking.hpp b/apps/openmw/mwmp/Networking.hpp index b59bc555d..3254ded5b 100644 --- a/apps/openmw/mwmp/Networking.hpp +++ b/apps/openmw/mwmp/Networking.hpp @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -34,6 +35,7 @@ namespace mwmp PlayerPacket *getPlayerPacket(RakNet::MessageID id); ActorPacket *getActorPacket(RakNet::MessageID id); ObjectPacket *getObjectPacket(RakNet::MessageID id); + WorldstatePacket *getWorldstatePacket(RakNet::MessageID id); RakNet::SystemAddress serverAddress() { @@ -45,6 +47,7 @@ namespace mwmp LocalPlayer *getLocalPlayer(); ActorList *getActorList(); ObjectList *getObjectList(); + BaseWorldstate *getWorldstate(); std::string getNetworkStatistics(); @@ -57,9 +60,11 @@ namespace mwmp PlayerPacketController playerPacketController; ActorPacketController actorPacketController; ObjectPacketController objectPacketController; + WorldstatePacketController worldstatePacketController; ActorList actorList; ObjectList objectList; + BaseWorldstate worldstate; void receiveMessage(RakNet::Packet *packet); diff --git a/apps/openmw/mwmp/ObjectList.hpp b/apps/openmw/mwmp/ObjectList.hpp index f77cccb16..9451cd876 100644 --- a/apps/openmw/mwmp/ObjectList.hpp +++ b/apps/openmw/mwmp/ObjectList.hpp @@ -1,5 +1,5 @@ -#ifndef OPENMW_WORLDEVENT_HPP -#define OPENMW_WORLDEVENT_HPP +#ifndef OPENMW_OBJECTLIST_HPP +#define OPENMW_OBJECTLIST_HPP #include #include "../mwworld/cellstore.hpp" @@ -89,4 +89,4 @@ namespace mwmp }; } -#endif //OPENMW_WORLDEVENT_HPP +#endif //OPENMW_OBJECTLIST_HPP diff --git a/apps/openmw/mwmp/processors/ObjectProcessor.hpp b/apps/openmw/mwmp/processors/ObjectProcessor.hpp index 8179a9271..56dbf46c3 100644 --- a/apps/openmw/mwmp/processors/ObjectProcessor.hpp +++ b/apps/openmw/mwmp/processors/ObjectProcessor.hpp @@ -1,9 +1,5 @@ -// -// Created by koncord on 16.04.17. -// - -#ifndef OPENMW_WORLDPROCESSSOR_HPP -#define OPENMW_WORLDPROCESSSOR_HPP +#ifndef OPENMW_OBJECTPROCESSSOR_HPP +#define OPENMW_OBJECTPROCESSSOR_HPP #include #include @@ -25,4 +21,4 @@ namespace mwmp } -#endif //OPENMW_WORLDPROCESSSOR_HPP +#endif //OPENMW_OBJECTPROCESSSOR_HPP diff --git a/apps/openmw/mwmp/processors/ProcessorInitializer.cpp b/apps/openmw/mwmp/processors/ProcessorInitializer.cpp index fdf5aa919..2e5401fdf 100644 --- a/apps/openmw/mwmp/processors/ProcessorInitializer.cpp +++ b/apps/openmw/mwmp/processors/ProcessorInitializer.cpp @@ -1,11 +1,6 @@ -// -// Created by koncord on 31.03.17. -// - #include "ProcessorInitializer.hpp" #include "PlayerProcessor.hpp" - #include "player/ProcessorChatMessage.hpp" #include "player/ProcessorGUIMessageBox.hpp" #include "player/ProcessorGUIWindow.hpp" @@ -81,6 +76,7 @@ #include "object/ProcessorScriptGlobalFloat.hpp" #include "object/ProcessorVideoPlay.hpp" +#include "ActorProcessor.hpp" #include "actor/ProcessorActorAI.hpp" #include "actor/ProcessorActorAnimFlags.hpp" #include "actor/ProcessorActorAnimPlay.hpp" @@ -96,6 +92,8 @@ #include "actor/ProcessorActorStatsDynamic.hpp" #include "actor/ProcessorActorTest.hpp" +#include "WorldstateProcessor.hpp" + using namespace mwmp; void ProcessorInitializer() diff --git a/apps/openmw/mwmp/processors/WorldstateProcessor.cpp b/apps/openmw/mwmp/processors/WorldstateProcessor.cpp new file mode 100644 index 000000000..684e7d355 --- /dev/null +++ b/apps/openmw/mwmp/processors/WorldstateProcessor.cpp @@ -0,0 +1,40 @@ +#include "../Networking.hpp" +#include "WorldstateProcessor.hpp" +#include "../Main.hpp" + +using namespace mwmp; + +template +typename BasePacketProcessor::processors_t BasePacketProcessor::processors; + +bool WorldstateProcessor::Process(RakNet::Packet &packet, BaseWorldstate &worldstate) +{ + RakNet::BitStream bsIn(&packet.data[1], packet.length, false); + bsIn.Read(guid); + worldstate.guid = guid; + + WorldstatePacket *myPacket = Main::get().getNetworking()->getWorldstatePacket(packet.data[0]); + myPacket->SetReadStream(&bsIn); + + for (auto &processor : processors) + { + if (processor.first == packet.data[0]) + { + myGuid = Main::get().getLocalPlayer()->guid; + request = packet.length == myPacket->headerSize(); + + worldstate.isValid = true; + + if (!request && !processor.second->avoidReading) + myPacket->Read(); + + if (worldstate.isValid) + processor.second->Do(*myPacket, worldstate); + else + LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Received %s that failed integrity check and was ignored!", processor.second->strPacketID.c_str()); + + return true; + } + } + return false; +} diff --git a/apps/openmw/mwmp/processors/WorldstateProcessor.hpp b/apps/openmw/mwmp/processors/WorldstateProcessor.hpp new file mode 100644 index 000000000..77a888e0d --- /dev/null +++ b/apps/openmw/mwmp/processors/WorldstateProcessor.hpp @@ -0,0 +1,22 @@ +#ifndef OPENMW_WORLDSTATEPROCESSOR_HPP +#define OPENMW_WORLDSTATEPROCESSOR_HPP + +#include +#include +#include +#include "BaseClientPacketProcessor.hpp" + +namespace mwmp +{ + class WorldstateProcessor : public BasePacketProcessor, public BaseClientPacketProcessor + { + public: + virtual void Do(WorldstatePacket &packet, BaseWorldstate &worldstate) = 0; + + static bool Process(RakNet::Packet &packet, BaseWorldstate &worldstate); + }; +} + + + +#endif //OPENMW_WORLDSTATEPROCESSOR_HPP diff --git a/apps/openmw/mwrender/globalmap.cpp b/apps/openmw/mwrender/globalmap.cpp index 52a878eb0..2ce6517ba 100644 --- a/apps/openmw/mwrender/globalmap.cpp +++ b/apps/openmw/mwrender/globalmap.cpp @@ -148,7 +148,7 @@ namespace MWRender { for (int cellX=0; cellX(float(cellX)/float(mCellSize) * 9); + int vertexX = static_cast(float(cellX) / float(mCellSize) * 9); int vertexY = static_cast(float(cellY) / float(mCellSize) * 9); int texelX = (x-mMinX) * mCellSize + cellX; @@ -158,9 +158,9 @@ namespace MWRender float y2 = 0; if (land && (land->mDataTypes & ESM::Land::DATA_WNAM)) - y2 = (land->mWnam[vertexY * 9 + vertexX] << 4) / 2048.f; + y2 = land->mWnam[vertexY * 9 + vertexX] / 128.f; else - y2 = (SCHAR_MIN << 4) / 2048.f; + y2 = SCHAR_MIN / 128.f; if (y2 < 0) { r = static_cast(14 * y2 + 38); diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index 829c001e5..31d46ce31 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -951,10 +951,11 @@ std::pair OpenAL_Output::loadSound(const std::string &fname getALError(); std::vector data; - ALenum format; - int srate; + ALenum format = AL_NONE; + int srate = 0; - try { + try + { DecoderPtr decoder = mManager.getDecoder(); // Workaround: Bethesda at some point converted some of the files to mp3, but the references were kept as .wav. if(decoder->mResourceMgr->exists(fname)) @@ -974,7 +975,8 @@ std::pair OpenAL_Output::loadSound(const std::string &fname format = getALFormat(chans, type); if(format) decoder->readAll(data); } - catch(std::exception &e) { + catch(std::exception &e) + { std::cerr<< "Failed to load audio from "< +#include #include diff --git a/components/openmw-mp/Base/BaseWorldstate.hpp b/components/openmw-mp/Base/BaseWorldstate.hpp new file mode 100644 index 000000000..a823066f0 --- /dev/null +++ b/components/openmw-mp/Base/BaseWorldstate.hpp @@ -0,0 +1,26 @@ +#ifndef OPENMW_BASEWORLDSTATE_HPP +#define OPENMW_BASEWORLDSTATE_HPP + +#include + +#include + +namespace mwmp +{ + + class BaseWorldstate + { + public: + + BaseWorldstate() + { + + } + + RakNet::RakNetGUID guid; + + bool isValid; + }; +} + +#endif //OPENMW_BASEWORLDSTATE_HPP diff --git a/components/openmw-mp/Controllers/ObjectPacketController.hpp b/components/openmw-mp/Controllers/ObjectPacketController.hpp index 6c75277b2..b87cb35c5 100644 --- a/components/openmw-mp/Controllers/ObjectPacketController.hpp +++ b/components/openmw-mp/Controllers/ObjectPacketController.hpp @@ -1,5 +1,5 @@ -#ifndef OPENMW_WORLDPACKETCONTROLLER_HPP -#define OPENMW_WORLDPACKETCONTROLLER_HPP +#ifndef OPENMW_OBJECTPACKETCONTROLLER_HPP +#define OPENMW_OBJECTPACKETCONTROLLER_HPP #include "../Packets/Object/ObjectPacket.hpp" @@ -14,4 +14,4 @@ namespace mwmp }; } -#endif //OPENMW_WORLDPACKETCONTROLLER_HPP +#endif //OPENMW_OBJECTPACKETCONTROLLER_HPP diff --git a/components/openmw-mp/Controllers/WorldstatePacketController.cpp b/components/openmw-mp/Controllers/WorldstatePacketController.cpp new file mode 100644 index 000000000..81806afb1 --- /dev/null +++ b/components/openmw-mp/Controllers/WorldstatePacketController.cpp @@ -0,0 +1,6 @@ +#include "WorldstatePacketController.hpp" + +mwmp::WorldstatePacketController::WorldstatePacketController(RakNet::RakPeerInterface *peer) +{ + +} diff --git a/components/openmw-mp/Controllers/WorldstatePacketController.hpp b/components/openmw-mp/Controllers/WorldstatePacketController.hpp new file mode 100644 index 000000000..49aacecb0 --- /dev/null +++ b/components/openmw-mp/Controllers/WorldstatePacketController.hpp @@ -0,0 +1,17 @@ +#ifndef OPENMW_WORLDSTATEPACKETCONTROLLER_HPP +#define OPENMW_WORLDSTATEPACKETCONTROLLER_HPP + + +#include "../Packets/Worldstate/WorldstatePacket.hpp" +#include "BasePacketController.hpp" + +namespace mwmp +{ + class WorldstatePacketController: public BasePacketController + { + public: + WorldstatePacketController(RakNet::RakPeerInterface *peer); + }; +} + +#endif //OPENMW_WORLDSTATEPACKETCONTROLLER_HPP diff --git a/components/openmw-mp/NetworkMessages.hpp b/components/openmw-mp/NetworkMessages.hpp index f1f41e8df..a51d3cb5c 100644 --- a/components/openmw-mp/NetworkMessages.hpp +++ b/components/openmw-mp/NetworkMessages.hpp @@ -116,8 +116,9 @@ enum OrderingChannel CHANNEL_SYSTEM = 0, CHANNEL_ACTOR, CHANNEL_PLAYER, - CHANNEL_WORLDEVENT, - CHANNEL_MASTER + CHANNEL_OBJECT, + CHANNEL_MASTER, + CHANNEL_WORLDSTATE }; diff --git a/components/openmw-mp/Packets/Object/ObjectPacket.cpp b/components/openmw-mp/Packets/Object/ObjectPacket.cpp index a5bdaf9a6..ec6cc013f 100644 --- a/components/openmw-mp/Packets/Object/ObjectPacket.cpp +++ b/components/openmw-mp/Packets/Object/ObjectPacket.cpp @@ -11,7 +11,7 @@ ObjectPacket::ObjectPacket(RakNet::RakPeerInterface *peer) : BasePacket(peer) packetID = 0; priority = HIGH_PRIORITY; reliability = RELIABLE_ORDERED; - orderChannel = CHANNEL_WORLDEVENT; + orderChannel = CHANNEL_OBJECT; this->peer = peer; } diff --git a/components/openmw-mp/Packets/Object/ObjectPacket.hpp b/components/openmw-mp/Packets/Object/ObjectPacket.hpp index 5481739e8..b35336447 100644 --- a/components/openmw-mp/Packets/Object/ObjectPacket.hpp +++ b/components/openmw-mp/Packets/Object/ObjectPacket.hpp @@ -1,5 +1,5 @@ -#ifndef OPENMW_WORLDPACKET_HPP -#define OPENMW_WORLDPACKET_HPP +#ifndef OPENMW_OBJECTPACKET_HPP +#define OPENMW_OBJECTPACKET_HPP #include #include @@ -32,4 +32,4 @@ namespace mwmp }; } -#endif //OPENMW_WORLDPACKET_HPP +#endif //OPENMW_OBJECTPACKET_HPP diff --git a/components/openmw-mp/Packets/Worldstate/WorldstatePacket.cpp b/components/openmw-mp/Packets/Worldstate/WorldstatePacket.cpp new file mode 100644 index 000000000..32feeb893 --- /dev/null +++ b/components/openmw-mp/Packets/Worldstate/WorldstatePacket.cpp @@ -0,0 +1,26 @@ +#include +#include +#include +#include "WorldstatePacket.hpp" + +using namespace mwmp; + +WorldstatePacket::WorldstatePacket(RakNet::RakPeerInterface *peer) : BasePacket(peer) +{ + packetID = 0; + priority = HIGH_PRIORITY; + reliability = RELIABLE_ORDERED; + orderChannel = CHANNEL_WORLDSTATE; + this->peer = peer; +} + +void WorldstatePacket::setWorldstate(BaseWorldstate *worldstate) +{ + this->worldstate = worldstate; + guid = worldstate->guid; +} + +BaseWorldstate *WorldstatePacket::getWorldstate() +{ + return worldstate; +} diff --git a/components/openmw-mp/Packets/Worldstate/WorldstatePacket.hpp b/components/openmw-mp/Packets/Worldstate/WorldstatePacket.hpp new file mode 100644 index 000000000..205c0d2e2 --- /dev/null +++ b/components/openmw-mp/Packets/Worldstate/WorldstatePacket.hpp @@ -0,0 +1,30 @@ +#ifndef OPENMW_WORLDSTATEPACKET_HPP +#define OPENMW_WORLDSTATEPACKET_HPP + +#include +#include +#include +#include +#include + +#include + +namespace mwmp +{ + class WorldstatePacket : public BasePacket + { + public: + WorldstatePacket(RakNet::RakPeerInterface *peer); + + ~WorldstatePacket() override = default; + + void setWorldstate(BaseWorldstate *worldstate); + BaseWorldstate *getWorldstate(); + + protected: + BaseWorldstate *worldstate; + + }; +} + +#endif //OPENMW_WORLDSTATEPACKET_HPP