From f0f0b2dcc9ecbbb42b49bb0baf2e8c07984e751f Mon Sep 17 00:00:00 2001 From: David Cernat Date: Sun, 16 Apr 2017 18:43:13 +0300 Subject: [PATCH] [General] Send and read ActorSpeech packets --- apps/openmw/mwdialogue/dialoguemanagerimp.cpp | 28 +++++++++++++++++++ apps/openmw/mwmp/ActorList.cpp | 16 +++++++++++ apps/openmw/mwmp/ActorList.hpp | 3 ++ apps/openmw/mwmp/Cell.cpp | 21 ++++++++++++++ apps/openmw/mwmp/Cell.hpp | 1 + apps/openmw/mwmp/CellController.cpp | 13 +++++++++ apps/openmw/mwmp/CellController.hpp | 1 + apps/openmw/mwmp/DedicatedActor.cpp | 21 ++++++++++++++ apps/openmw/mwmp/DedicatedActor.hpp | 1 + apps/openmw/mwmp/LocalActor.cpp | 10 +++++++ apps/openmw/mwmp/LocalActor.hpp | 1 + apps/openmw/mwmp/Networking.cpp | 10 ++++--- components/openmw-mp/Base/BaseActor.hpp | 3 ++ .../Packets/Actor/PacketActorSpeech.cpp | 3 +- 14 files changed, 127 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp index 254bc7d47..5a7fc1df0 100644 --- a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp +++ b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp @@ -21,6 +21,18 @@ #include #include +/* + Start of tes3mp addition + + Include additional headers for multiplayer purposes +*/ +#include "../mwmp/Main.hpp" +#include "../mwmp/CellController.hpp" +#include "../mwmp/LocalActor.hpp" +/* + End of tes3mp addition +*/ + #include "../mwbase/environment.hpp" #include "../mwbase/world.hpp" #include "../mwbase/journal.hpp" @@ -646,6 +658,22 @@ namespace MWDialogue winMgr->messageBox(info->mResponse); if (!info->mSound.empty()) sndMgr->say(actor, info->mSound); + + /* + Start of tes3mp addition + + If we are the cell authority over this actor, we need to record this new + sound for it + */ + if (mwmp::Main::get().getCellController()->isLocalActor(actor)) + { + mwmp::LocalActor *localActor = mwmp::Main::get().getCellController()->getLocalActor(actor); + localActor->response = info->mResponse; + localActor->sound = info->mSound; + } + /* + End of tes3mp addition + */ } } diff --git a/apps/openmw/mwmp/ActorList.cpp b/apps/openmw/mwmp/ActorList.cpp index 3c90d0e91..509f0c237 100644 --- a/apps/openmw/mwmp/ActorList.cpp +++ b/apps/openmw/mwmp/ActorList.cpp @@ -30,6 +30,7 @@ void ActorList::reset() positionActors.clear(); animFlagsActors.clear(); animPlayActors.clear(); + speechActors.clear(); statsDynamicActors.clear(); guid = mwmp::Main::get().getNetworking()->getLocalPlayer()->guid; } @@ -59,6 +60,11 @@ void ActorList::addAnimPlayActor(LocalActor localActor) animPlayActors.push_back(localActor); } +void ActorList::addSpeechActor(LocalActor localActor) +{ + speechActors.push_back(localActor); +} + void ActorList::addStatsDynamicActor(LocalActor localActor) { statsDynamicActors.push_back(localActor); @@ -94,6 +100,16 @@ void ActorList::sendAnimPlayActors() } } +void ActorList::sendSpeechActors() +{ + if (speechActors.size() > 0) + { + baseActors = speechActors; + Main::get().getNetworking()->getActorPacket(ID_ACTOR_SPEECH)->setActorList(this); + Main::get().getNetworking()->getActorPacket(ID_ACTOR_SPEECH)->Send(); + } +} + void ActorList::sendStatsDynamicActors() { if (statsDynamicActors.size() > 0) diff --git a/apps/openmw/mwmp/ActorList.hpp b/apps/openmw/mwmp/ActorList.hpp index 90dbf0a70..5395cb04e 100644 --- a/apps/openmw/mwmp/ActorList.hpp +++ b/apps/openmw/mwmp/ActorList.hpp @@ -24,11 +24,13 @@ namespace mwmp void addPositionActor(LocalActor localActor); void addAnimFlagsActor(LocalActor localActor); void addAnimPlayActor(LocalActor localActor); + void addSpeechActor(LocalActor localActor); void addStatsDynamicActor(LocalActor localActor); void sendPositionActors(); void sendAnimFlagsActors(); void sendAnimPlayActors(); + void sendSpeechActors(); void sendStatsDynamicActors(); void editActorsInCell(MWWorld::CellStore* cellStore); @@ -41,6 +43,7 @@ namespace mwmp std::vector positionActors; std::vector animFlagsActors; std::vector animPlayActors; + std::vector speechActors; std::vector statsDynamicActors; }; } diff --git a/apps/openmw/mwmp/Cell.cpp b/apps/openmw/mwmp/Cell.cpp index 610061f47..8ae9c86f6 100644 --- a/apps/openmw/mwmp/Cell.cpp +++ b/apps/openmw/mwmp/Cell.cpp @@ -56,6 +56,7 @@ void Cell::updateLocal(bool forceUpdate) actorList->sendPositionActors(); actorList->sendAnimFlagsActors(); actorList->sendAnimPlayActors(); + actorList->sendSpeechActors(); actorList->sendStatsDynamicActors(); } @@ -153,6 +154,26 @@ void Cell::readStatsDynamic(ActorList& actorList) } } +void Cell::readSpeech(ActorList& actorList) +{ + initializeDedicatedActors(actorList); + + BaseActor baseActor; + + for (unsigned int i = 0; i < actorList.count; i++) + { + baseActor = actorList.baseActors.at(i); + std::string mapIndex = Main::get().getCellController()->generateMapIndex(baseActor); + + if (dedicatedActors.count(mapIndex) > 0) + { + DedicatedActor *actor = dedicatedActors[mapIndex]; + actor->response = baseActor.response; + actor->sound = baseActor.sound; + } + } +} + void Cell::initializeLocalActors() { ESM::Cell esmCell = *store->getCell(); diff --git a/apps/openmw/mwmp/Cell.hpp b/apps/openmw/mwmp/Cell.hpp index 7b8481834..4f34c31d1 100644 --- a/apps/openmw/mwmp/Cell.hpp +++ b/apps/openmw/mwmp/Cell.hpp @@ -22,6 +22,7 @@ namespace mwmp void readAnimFlags(ActorList& actorList); void readAnimPlay(ActorList& actorList); void readStatsDynamic(ActorList& actorList); + void readSpeech(ActorList& actorList); void initializeLocalActors(); void initializeDedicatedActors(ActorList& actorList); diff --git a/apps/openmw/mwmp/CellController.cpp b/apps/openmw/mwmp/CellController.cpp index 70ab67026..06f309111 100644 --- a/apps/openmw/mwmp/CellController.cpp +++ b/apps/openmw/mwmp/CellController.cpp @@ -141,6 +141,19 @@ void CellController::readStatsDynamic(ActorList& actorList) } } +void CellController::readSpeech(ActorList& actorList) +{ + std::string mapIndex = actorList.cell.getDescription(); + + initializeCell(actorList.cell); + + // If this now exists, send it the data + if (cellsActive.count(mapIndex) > 0) + { + cellsActive[mapIndex]->readSpeech(actorList); + } +} + void CellController::setLocalActorRecord(std::string actorIndex, std::string cellIndex) { localActorsToCells[actorIndex] = cellIndex; diff --git a/apps/openmw/mwmp/CellController.hpp b/apps/openmw/mwmp/CellController.hpp index eb1cb664d..eaffdb8af 100644 --- a/apps/openmw/mwmp/CellController.hpp +++ b/apps/openmw/mwmp/CellController.hpp @@ -26,6 +26,7 @@ namespace mwmp void readAnimFlags(mwmp::ActorList& actorList); void readAnimPlay(mwmp::ActorList& actorList); void readStatsDynamic(mwmp::ActorList& actorList); + void readSpeech(mwmp::ActorList& actorList); void setLocalActorRecord(std::string actorIndex, std::string cellIndex); void removeLocalActorRecord(std::string actorIndex); diff --git a/apps/openmw/mwmp/DedicatedActor.cpp b/apps/openmw/mwmp/DedicatedActor.cpp index aa32be63e..f61735e97 100644 --- a/apps/openmw/mwmp/DedicatedActor.cpp +++ b/apps/openmw/mwmp/DedicatedActor.cpp @@ -1,10 +1,15 @@ #include #include "../mwbase/environment.hpp" +#include "../mwbase/soundmanager.hpp" +#include "../mwbase/windowmanager.hpp" + #include "../mwmechanics/mechanicsmanagerimp.hpp" #include "../mwmechanics/movement.hpp" #include "../mwmechanics/npcstats.hpp" + #include "../mwrender/animation.hpp" + #include "../mwworld/class.hpp" #include "../mwworld/worldimp.hpp" @@ -18,6 +23,7 @@ DedicatedActor::DedicatedActor() drawState = 0; movementFlags = 0; animation.groupname = ""; + sound = ""; creatureStats = new ESM::CreatureStats(); creatureStats->blank(); @@ -34,6 +40,7 @@ void DedicatedActor::update(float dt) move(dt); setAnimFlags(); playAnimation(); + playSound(); setStatsDynamic(); } @@ -80,6 +87,20 @@ void DedicatedActor::playAnimation() } } +void DedicatedActor::playSound() +{ + if (!sound.empty()) + { + MWBase::Environment::get().getSoundManager()->say(ptr, sound); + + MWBase::WindowManager *winMgr = MWBase::Environment::get().getWindowManager(); + if (winMgr->getSubtitlesEnabled()) + winMgr->messageBox(response); + + sound.clear(); + } +} + void DedicatedActor::setStatsDynamic() { // Only set dynamic stats if they have valid values diff --git a/apps/openmw/mwmp/DedicatedActor.hpp b/apps/openmw/mwmp/DedicatedActor.hpp index 15c4cbb62..306a2960a 100644 --- a/apps/openmw/mwmp/DedicatedActor.hpp +++ b/apps/openmw/mwmp/DedicatedActor.hpp @@ -18,6 +18,7 @@ namespace mwmp void move(float dt); void setAnimFlags(); void playAnimation(); + void playSound(); void setStatsDynamic(); MWWorld::Ptr getPtr(); diff --git a/apps/openmw/mwmp/LocalActor.cpp b/apps/openmw/mwmp/LocalActor.cpp index 8a86f9b50..68ee70977 100644 --- a/apps/openmw/mwmp/LocalActor.cpp +++ b/apps/openmw/mwmp/LocalActor.cpp @@ -45,6 +45,7 @@ void LocalActor::update(bool forceUpdate) updatePosition(forceUpdate); updateAnimFlags(forceUpdate); updateAnimPlay(); + updateSpeech(); updateStatsDynamic(forceUpdate); } @@ -130,6 +131,15 @@ void LocalActor::updateAnimPlay() } } +void LocalActor::updateSpeech() +{ + if (!sound.empty()) + { + mwmp::Main::get().getNetworking()->getActorList()->addSpeechActor(*this); + sound.clear(); + } +} + void LocalActor::updateStatsDynamic(bool forceUpdate) { MWMechanics::CreatureStats *ptrCreatureStats = &ptr.getClass().getCreatureStats(ptr); diff --git a/apps/openmw/mwmp/LocalActor.hpp b/apps/openmw/mwmp/LocalActor.hpp index 821150b97..45f23e7a6 100644 --- a/apps/openmw/mwmp/LocalActor.hpp +++ b/apps/openmw/mwmp/LocalActor.hpp @@ -19,6 +19,7 @@ namespace mwmp void updatePosition(bool forceUpdate); void updateAnimFlags(bool forceUpdate); void updateAnimPlay(); + void updateSpeech(); void updateStatsDynamic(bool forceUpdate); MWWorld::Ptr getPtr(); diff --git a/apps/openmw/mwmp/Networking.cpp b/apps/openmw/mwmp/Networking.cpp index 1b451e3fe..67017fb11 100644 --- a/apps/openmw/mwmp/Networking.cpp +++ b/apps/openmw/mwmp/Networking.cpp @@ -890,6 +890,12 @@ void Networking::processActorPacket(RakNet::Packet *packet) break; } + case ID_ACTOR_SPEECH: + { + //Main::get().getCellController()->readSpeech(actorList); + + break; + } case ID_ACTOR_ATTACK: { break; @@ -898,10 +904,6 @@ void Networking::processActorPacket(RakNet::Packet *packet) { break; } - case ID_ACTOR_SPEECH: - { - break; - } case ID_ACTOR_TEST: { break; diff --git a/components/openmw-mp/Base/BaseActor.hpp b/components/openmw-mp/Base/BaseActor.hpp index 404c9a115..eb2f65821 100644 --- a/components/openmw-mp/Base/BaseActor.hpp +++ b/components/openmw-mp/Base/BaseActor.hpp @@ -34,6 +34,9 @@ namespace mwmp char drawState; bool isFlying; + std::string response; + std::string sound; + Animation animation; }; diff --git a/components/openmw-mp/Packets/Actor/PacketActorSpeech.cpp b/components/openmw-mp/Packets/Actor/PacketActorSpeech.cpp index dd788ad4e..e7f5de559 100644 --- a/components/openmw-mp/Packets/Actor/PacketActorSpeech.cpp +++ b/components/openmw-mp/Packets/Actor/PacketActorSpeech.cpp @@ -38,7 +38,8 @@ void PacketActorSpeech::Packet(RakNet::BitStream *bs, bool send) RW(actor.refNumIndex, send); RW(actor.mpNum, send); - // TODO: Fill this in + RW(actor.response, send); + RW(actor.sound, send); if (!send) {