diff --git a/apps/openmw/mwmp/ActorList.cpp b/apps/openmw/mwmp/ActorList.cpp index 3e38f5e4f..0df6bc334 100644 --- a/apps/openmw/mwmp/ActorList.cpp +++ b/apps/openmw/mwmp/ActorList.cpp @@ -27,6 +27,7 @@ void ActorList::reset() { cell.blank(); baseActors.clear(); + positionActors.clear(); guid = mwmp::Main::get().getNetworking()->getLocalPlayer()->guid; } @@ -40,8 +41,20 @@ void ActorList::addActor(LocalActor localActor) baseActors.push_back(localActor); } +void ActorList::addPositionActor(LocalActor localActor) +{ + positionActors.push_back(localActor); +} + +void ActorList::sendPositionActors() +{ + baseActors = positionActors; + Main::get().getNetworking()->getActorPacket(ID_ACTOR_POSITION)->setActorList(this); + Main::get().getNetworking()->getActorPacket(ID_ACTOR_POSITION)->Send(); +} + // TODO: Finish this -void ActorList::editActors(MWWorld::CellStore* cellStore) +void ActorList::editActorsInCell(MWWorld::CellStore* cellStore) { BaseActor actor; @@ -68,7 +81,7 @@ void ActorList::editActors(MWWorld::CellStore* cellStore) } } -void ActorList::sendActors(MWWorld::CellStore* cellStore) +void ActorList::sendActorsInCell(MWWorld::CellStore* cellStore) { reset(); cell = *cellStore->getCell(); diff --git a/apps/openmw/mwmp/ActorList.hpp b/apps/openmw/mwmp/ActorList.hpp index 85bc419fd..42981c0db 100644 --- a/apps/openmw/mwmp/ActorList.hpp +++ b/apps/openmw/mwmp/ActorList.hpp @@ -21,13 +21,18 @@ namespace mwmp void addActor(BaseActor baseActor); void addActor(LocalActor localActor); - void editActors(MWWorld::CellStore* cellStore); + void addPositionActor(LocalActor localActor); - void sendActors(MWWorld::CellStore* cellStore); + void sendPositionActors(); + + void editActorsInCell(MWWorld::CellStore* cellStore); + + void sendActorsInCell(MWWorld::CellStore* cellStore); private: Networking *getNetworking(); + std::vector positionActors; }; } diff --git a/apps/openmw/mwmp/Cell.cpp b/apps/openmw/mwmp/Cell.cpp index 8a9324d31..4b6d7d99a 100644 --- a/apps/openmw/mwmp/Cell.cpp +++ b/apps/openmw/mwmp/Cell.cpp @@ -23,7 +23,7 @@ mwmp::Cell::~Cell() } -void Cell::updateLocal() +void Cell::updateLocal(bool forceUpdate) { if (localActors.empty()) return; @@ -45,20 +45,12 @@ void Cell::updateLocal() } else { - //LOG_APPEND(Log::LOG_VERBOSE, "- Updating LocalActor %s", it->first.c_str()); - actor->update(); - - actorList->addActor(*actor); - actor->hasAnimation = false; - actor->hasAnimStates = false; - actor->hasMovement = false; - + actor->update(forceUpdate); ++it; } } - Main::get().getNetworking()->getActorPacket(ID_ACTOR_TEST)->setActorList(actorList); - Main::get().getNetworking()->getActorPacket(ID_ACTOR_TEST)->Send(); + actorList->sendPositionActors(); } void Cell::updateDedicated(float dt) @@ -73,8 +65,10 @@ void Cell::updateDedicated(float dt) } } -void Cell::readCellFrame(ActorList& actorList) +void Cell::readPositions(ActorList& actorList) { + initializeDedicatedActors(actorList); + BaseActor baseActor; for (unsigned int i = 0; i < actorList.count; i++) @@ -82,51 +76,11 @@ void Cell::readCellFrame(ActorList& actorList) baseActor = actorList.baseActors.at(i); std::string mapIndex = Main::get().getCellController()->generateMapIndex(baseActor); - // If this key doesn't exist, create it - if (dedicatedActors.count(mapIndex) == 0) - { - MWWorld::Ptr ptrFound = store->searchExact(baseActor.refId, baseActor.refNumIndex, baseActor.mpNum); - - if (!ptrFound) return; - - DedicatedActor *actor = new DedicatedActor(); - actor->cell = actorList.cell; - actor->setPtr(ptrFound); - dedicatedActors[mapIndex] = actor; - - Main::get().getCellController()->setDedicatedActorRecord(mapIndex, getDescription()); - - LOG_APPEND(Log::LOG_INFO, "- Initialized DedicatedActor %s", mapIndex.c_str()); - } - - // If this now exists, set its details if (dedicatedActors.count(mapIndex) > 0) { DedicatedActor *actor = dedicatedActors[mapIndex]; actor->position = baseActor.position; - actor->drawState = baseActor.drawState; - - actor->headPitch = baseActor.headPitch; - actor->headYaw = baseActor.headYaw; - - actor->hasAnimation = baseActor.hasAnimation; - actor->hasAnimStates = baseActor.hasAnimStates; - actor->hasMovement = baseActor.hasMovement; - - if (actor->hasAnimation) - { - actor->animation = baseActor.animation; - } - - if (actor->hasAnimStates) - { - actor->animStates = baseActor.animStates; - } - - if (actor->hasMovement) - { - actor->movement = baseActor.movement; - } + actor->direction = baseActor.direction; } } } @@ -155,6 +109,34 @@ void Cell::initializeLocalActors() } } +void Cell::initializeDedicatedActors(ActorList& 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 this key doesn't exist, create it + if (dedicatedActors.count(mapIndex) == 0) + { + MWWorld::Ptr ptrFound = store->searchExact(baseActor.refId, baseActor.refNumIndex, baseActor.mpNum); + + if (!ptrFound) return; + + DedicatedActor *actor = new DedicatedActor(); + actor->cell = actorList.cell; + actor->setPtr(ptrFound); + dedicatedActors[mapIndex] = actor; + + Main::get().getCellController()->setDedicatedActorRecord(mapIndex, getDescription()); + + LOG_APPEND(Log::LOG_INFO, "- Initialized DedicatedActor %s", mapIndex.c_str()); + } + } +} + void Cell::uninitializeLocalActors() { for (std::map::iterator it = localActors.begin(); it != localActors.end(); ++it) diff --git a/apps/openmw/mwmp/Cell.hpp b/apps/openmw/mwmp/Cell.hpp index 5203cca65..438636b94 100644 --- a/apps/openmw/mwmp/Cell.hpp +++ b/apps/openmw/mwmp/Cell.hpp @@ -15,12 +15,14 @@ namespace mwmp Cell(MWWorld::CellStore* cellStore); ~Cell(); - void updateLocal(); + void updateLocal(bool forceUpdate); void updateDedicated(float dt); - void readCellFrame(mwmp::ActorList& actorList); + void readPositions(ActorList& actorList); void initializeLocalActors(); + void initializeDedicatedActors(ActorList& actorList); + void uninitializeLocalActors(); void uninitializeDedicatedActors(); @@ -32,8 +34,8 @@ namespace mwmp private: MWWorld::CellStore* store; - std::map localActors; - std::map dedicatedActors; + std::map localActors; + std::map dedicatedActors; }; } diff --git a/apps/openmw/mwmp/CellController.cpp b/apps/openmw/mwmp/CellController.cpp index 988207227..501626321 100644 --- a/apps/openmw/mwmp/CellController.cpp +++ b/apps/openmw/mwmp/CellController.cpp @@ -28,7 +28,7 @@ mwmp::CellController::~CellController() } -void CellController::updateLocal() +void CellController::updateLocal(bool forceUpdate) { for (std::map::iterator it = cellsActive.begin(); it != cellsActive.end();) { @@ -43,7 +43,7 @@ void CellController::updateLocal() else { //LOG_MESSAGE_SIMPLE(Log::LOG_VERBOSE, "Updating mwmp::Cell %s", mpCell->getDescription().c_str()); - mpCell->updateLocal(); + mpCell->updateLocal(forceUpdate); ++it; } } @@ -89,7 +89,7 @@ void CellController::initializeLocalActors(const ESM::Cell& cell) } } -void CellController::readCellFrame(ActorList& actorList) +void CellController::readPositions(ActorList& actorList) { std::string mapIndex = actorList.cell.getDescription(); @@ -98,7 +98,7 @@ void CellController::readCellFrame(ActorList& actorList) // If this now exists, send it the data if (cellsActive.count(mapIndex) > 0) { - cellsActive[mapIndex]->readCellFrame(actorList); + cellsActive[mapIndex]->readPositions(actorList); } } diff --git a/apps/openmw/mwmp/CellController.hpp b/apps/openmw/mwmp/CellController.hpp index 33ca7346a..ca15937ba 100644 --- a/apps/openmw/mwmp/CellController.hpp +++ b/apps/openmw/mwmp/CellController.hpp @@ -16,12 +16,12 @@ namespace mwmp CellController(); ~CellController(); - void updateLocal(); + void updateLocal(bool forceUpdate); void updateDedicated(float dt); void initializeCell(const ESM::Cell& cell); void initializeLocalActors(const ESM::Cell& cell); - void readCellFrame(mwmp::ActorList& actorList); + void readPositions(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 96982b1ff..3b7024495 100644 --- a/apps/openmw/mwmp/DedicatedActor.cpp +++ b/apps/openmw/mwmp/DedicatedActor.cpp @@ -26,8 +26,8 @@ DedicatedActor::~DedicatedActor() void DedicatedActor::update(float dt) { move(dt); - setDrawState(); - setAnimation(); + //setDrawState(); + //setAnimation(); } void DedicatedActor::move(float dt) @@ -36,6 +36,11 @@ void DedicatedActor::move(float dt) world->moveObject(ptr, position.pos[0], position.pos[1], position.pos[2]); + MWMechanics::Movement *move = &ptr.getClass().getMovementSettings(ptr); + move->mPosition[0] = direction.pos[0]; + move->mPosition[1] = direction.pos[1]; + move->mPosition[2] = direction.pos[2]; + world->rotateObject(ptr, position.rot[0], position.rot[1], position.rot[2]); } diff --git a/apps/openmw/mwmp/LocalActor.cpp b/apps/openmw/mwmp/LocalActor.cpp index 09fe98e93..3506ba51b 100644 --- a/apps/openmw/mwmp/LocalActor.cpp +++ b/apps/openmw/mwmp/LocalActor.cpp @@ -8,17 +8,16 @@ #include "../mwworld/worldimp.hpp" #include "LocalActor.hpp" +#include "Main.hpp" +#include "Networking.hpp" +#include "ActorList.hpp" using namespace mwmp; using namespace std; LocalActor::LocalActor() { - headPitch = -1; - headYaw = -1; - hasAnimation = false; - hasAnimStates = false; - hasMovement = false; + posWasChanged = false; } LocalActor::~LocalActor() @@ -26,15 +25,26 @@ LocalActor::~LocalActor() } -void LocalActor::update() +void LocalActor::update(bool forceUpdate) { - updatePosition(); + updatePosition(forceUpdate); updateDrawState(); } -void LocalActor::updatePosition() +void LocalActor::updatePosition(bool forceUpdate) { - position = ptr.getRefData().getPosition(); + bool posIsChanging = (direction.pos[0] != 0 || direction.pos[1] != 0 || direction.pos[2] != 0 || + direction.rot[0] != 0 || direction.rot[1] != 0 || direction.rot[2] != 0); + + if (posIsChanging || posWasChanged) + { + posWasChanged = posIsChanging; + + position = ptr.getRefData().getPosition(); + + ActorList *actorList = mwmp::Main::get().getNetworking()->getActorList(); + actorList->addPositionActor(*this); + } } void LocalActor::updateDrawState() diff --git a/apps/openmw/mwmp/LocalActor.hpp b/apps/openmw/mwmp/LocalActor.hpp index 01f5f9957..06ef190ff 100644 --- a/apps/openmw/mwmp/LocalActor.hpp +++ b/apps/openmw/mwmp/LocalActor.hpp @@ -13,9 +13,9 @@ namespace mwmp LocalActor(); virtual ~LocalActor(); - void update(); + void update(bool forceUpdate); - void updatePosition(); + void updatePosition(bool forceUpdate); void updateDrawState(); MWWorld::Ptr getPtr(); @@ -23,6 +23,8 @@ namespace mwmp private: MWWorld::Ptr ptr; + + bool posWasChanged; }; } diff --git a/apps/openmw/mwmp/Main.cpp b/apps/openmw/mwmp/Main.cpp index ac15b339d..2e6613107 100644 --- a/apps/openmw/mwmp/Main.cpp +++ b/apps/openmw/mwmp/Main.cpp @@ -211,7 +211,7 @@ void Main::updateWorld(float dt) const else { mLocalPlayer->update(); - mCellController->updateLocal(); + mCellController->updateLocal(false); } } diff --git a/apps/openmw/mwmp/Networking.cpp b/apps/openmw/mwmp/Networking.cpp index 2e6c2a164..d413f7602 100644 --- a/apps/openmw/mwmp/Networking.cpp +++ b/apps/openmw/mwmp/Networking.cpp @@ -853,7 +853,7 @@ void Networking::processActorPacket(RakNet::Packet *packet) // If we've received a request for information, comply with it if (actorList.action == mwmp::BaseActorList::REQUEST) - actorList.sendActors(ptrCellStore); + actorList.sendActorsInCell(ptrCellStore); break; } @@ -865,6 +865,12 @@ void Networking::processActorPacket(RakNet::Packet *packet) break; } + case ID_ACTOR_POSITION: + { + //Main::get().getCellController()->readPositions(actorList); + + break; + } case ID_ACTOR_TEST: { //Main::get().getCellController()->readCellFrame(actorList);