diff --git a/apps/openmw/mwmp/Networking.cpp b/apps/openmw/mwmp/Networking.cpp index f9027fef0..502af5ebb 100644 --- a/apps/openmw/mwmp/Networking.cpp +++ b/apps/openmw/mwmp/Networking.cpp @@ -37,6 +37,13 @@ #include "MechanicsHelper.hpp" #include "LocalPlayer.hpp" #include "DedicatedPlayer.hpp" +#include "LocalPlayer.hpp" +#include "GUIController.hpp" +#include "WorldController.hpp" +#include "Main.hpp" +#include "PlayerProcessor.hpp" +#include "ProcessorInitializer.hpp" +#include "WorldProcessor.hpp" using namespace std; using namespace mwmp; @@ -153,6 +160,7 @@ void Networking::connect(const std::string &ip, unsigned short port, std::vector { serverAddr = packet->systemAddress; PlayerProcessor::SetServerAddr(packet->systemAddress); + WorldProcessor::SetServerAddr(packet->systemAddress); connected = true; queue = false; @@ -342,192 +350,8 @@ void Networking::processActorPacket(RakNet::Packet *packet) void Networking::processWorldPacket(RakNet::Packet *packet) { - RakNet::RakNetGUID guid; - RakNet::BitStream bsIn(&packet->data[1], packet->length, false); - bsIn.Read(guid); - - DedicatedPlayer *pl = 0; - static RakNet::RakNetGUID myGuid = getLocalPlayer()->guid; - if (guid != myGuid) - pl = PlayerList::getPlayer(guid); - - WorldPacket *myPacket = worldPacketController.GetPacket(packet->data[0]); - - myPacket->setEvent(&worldEvent); - myPacket->Packet(&bsIn, false); - - switch (packet->data[0]) - { - case ID_CONTAINER: - { - MWWorld::CellStore *ptrCellStore = Main::get().getCellController()->getCellStore(worldEvent.cell); - - if (!ptrCellStore) return; - - LOG_MESSAGE_SIMPLE(Log::LOG_VERBOSE, "Received ID_CONTAINER about %s", worldEvent.cell.getDescription().c_str()); - LOG_APPEND(Log::LOG_VERBOSE, "- action: %i", worldEvent.action); - - // If we've received a request for information, comply with it - if (worldEvent.action == mwmp::BaseEvent::REQUEST) - worldEvent.sendContainers(ptrCellStore); - // Otherwise, edit containers based on the information received - else - worldEvent.editContainers(ptrCellStore); - - break; - } - case ID_OBJECT_PLACE: - { - MWWorld::CellStore *ptrCellStore = Main::get().getCellController()->getCellStore(worldEvent.cell); - - if (!ptrCellStore) return; - - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_OBJECT_PLACE about %s", worldEvent.cell.getDescription().c_str()); - worldEvent.placeObjects(ptrCellStore); - - break; - } - case ID_OBJECT_DELETE: - { - MWWorld::CellStore *ptrCellStore = Main::get().getCellController()->getCellStore(worldEvent.cell); - - if (!ptrCellStore) return; - - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_OBJECT_DELETE about %s", worldEvent.cell.getDescription().c_str()); - worldEvent.deleteObjects(ptrCellStore); - - break; - } - case ID_OBJECT_LOCK: - { - MWWorld::CellStore *ptrCellStore = Main::get().getCellController()->getCellStore(worldEvent.cell); - - if (!ptrCellStore) return; - - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_OBJECT_LOCK about %s", worldEvent.cell.getDescription().c_str()); - worldEvent.lockObjects(ptrCellStore); - - break; - } - case ID_OBJECT_UNLOCK: - { - MWWorld::CellStore *ptrCellStore = Main::get().getCellController()->getCellStore(worldEvent.cell); - - if (!ptrCellStore) return; - - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_OBJECT_UNLOCK about %s", worldEvent.cell.getDescription().c_str()); - worldEvent.unlockObjects(ptrCellStore); - - break; - } - case ID_OBJECT_SCALE: - { - MWWorld::CellStore *ptrCellStore = Main::get().getCellController()->getCellStore(worldEvent.cell); - - if (!ptrCellStore) return; - - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_OBJECT_SCALE about %s", worldEvent.cell.getDescription().c_str()); - worldEvent.scaleObjects(ptrCellStore); - - break; - } - case ID_OBJECT_MOVE: - { - MWWorld::CellStore *ptrCellStore = Main::get().getCellController()->getCellStore(worldEvent.cell); - - if (!ptrCellStore) return; - - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_OBJECT_MOVE about %s", worldEvent.cell.getDescription().c_str()); - worldEvent.moveObjects(ptrCellStore); - - break; - } - case ID_OBJECT_ROTATE: - { - MWWorld::CellStore *ptrCellStore = Main::get().getCellController()->getCellStore(worldEvent.cell); - - if (!ptrCellStore) return; - - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_OBJECT_ROTATE about %s", worldEvent.cell.getDescription().c_str()); - worldEvent.rotateObjects(ptrCellStore); - - break; - } - case ID_OBJECT_ANIM_PLAY: - { - MWWorld::CellStore *ptrCellStore = Main::get().getCellController()->getCellStore(worldEvent.cell); - - if (!ptrCellStore) return; - - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_OBJECT_ANIM_PLAY about %s", worldEvent.cell.getDescription().c_str()); - worldEvent.animateObjects(ptrCellStore); - - break; - } - case ID_DOOR_STATE: - { - MWWorld::CellStore *ptrCellStore = Main::get().getCellController()->getCellStore(worldEvent.cell); - - if (!ptrCellStore) return; - - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_DOOR_STATE about %s", worldEvent.cell.getDescription().c_str()); - worldEvent.activateDoors(ptrCellStore); - - break; - } - case ID_SCRIPT_LOCAL_SHORT: - { - MWWorld::CellStore *ptrCellStore = Main::get().getCellController()->getCellStore(worldEvent.cell); - - if (!ptrCellStore) return; - - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_SCRIPT_LOCAL_SHORT about %s", worldEvent.cell.getDescription().c_str()); - worldEvent.setLocalShorts(ptrCellStore); - - break; - } - case ID_SCRIPT_LOCAL_FLOAT: - { - MWWorld::CellStore *ptrCellStore = Main::get().getCellController()->getCellStore(worldEvent.cell); - - if (!ptrCellStore) return; - - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_SCRIPT_LOCAL_FLOAT about %s", worldEvent.cell.getDescription().c_str()); - worldEvent.setLocalFloats(ptrCellStore); - - break; - } - case ID_SCRIPT_MEMBER_SHORT: - { - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_SCRIPT_MEMBER_SHORT"); - worldEvent.setMemberShorts(); - - break; - } - case ID_SCRIPT_GLOBAL_SHORT: - { - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_SCRIPT_GLOBAL_SHORT"); - worldEvent.setGlobalShorts(); - - break; - } - case ID_MUSIC_PLAY: - { - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_MUSIC_PLAY"); - worldEvent.playMusic(); - - break; - } - case ID_VIDEO_PLAY: - { - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_VIDEO_PLAY"); - worldEvent.playVideo(); - - break; - } - default: - LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Unhandled WorldPacket with identifier %i has arrived", packet->data[0]); - } + if (!WorldProcessor::Process(*packet, worldEvent)) + LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Unhandled WorldPacket with identifier %i has arrived", packet->data[0]); } void Networking::receiveMessage(RakNet::Packet *packet)