[General] Turn PlayerMap into WorldMap, now a Worldstate packet

pull/446/head
David Cernat 7 years ago
parent a28b27f5d9
commit 72862dc255

@ -133,12 +133,12 @@ set(PROCESSORS_PLAYER
processors/player/ProcessorPlayerFaction.hpp processors/player/ProcessorPlayerInteraction.hpp
processors/player/ProcessorPlayerInventory.hpp processors/player/ProcessorPlayerJournal.hpp
processors/player/ProcessorPlayerKillCount.hpp processors/player/ProcessorPlayerLevel.hpp
processors/player/ProcessorPlayerMap.hpp processors/player/ProcessorPlayerMiscellaneous.hpp
processors/player/ProcessorPlayerPosition.hpp processors/player/ProcessorPlayerQuickKeys.hpp
processors/player/ProcessorPlayerRest.hpp processors/player/ProcessorPlayerResurrect.hpp
processors/player/ProcessorPlayerShapeshift.hpp processors/player/ProcessorPlayerSkill.hpp
processors/player/ProcessorPlayerSpeech.hpp processors/player/ProcessorPlayerSpellbook.hpp
processors/player/ProcessorPlayerStatsDynamic.hpp processors/player/ProcessorPlayerTopic.hpp
processors/player/ProcessorPlayerMiscellaneous.hpp processors/player/ProcessorPlayerPosition.hpp
processors/player/ProcessorPlayerQuickKeys.hpp processors/player/ProcessorPlayerRest.hpp
processors/player/ProcessorPlayerResurrect.hpp processors/player/ProcessorPlayerShapeshift.hpp
processors/player/ProcessorPlayerSkill.hpp processors/player/ProcessorPlayerSpeech.hpp
processors/player/ProcessorPlayerSpellbook.hpp processors/player/ProcessorPlayerStatsDynamic.hpp
processors/player/ProcessorPlayerTopic.hpp
)
source_group(tes3mp-server\\processors\\player FILES ${PROCESSORS_PLAYER})
@ -159,7 +159,7 @@ set(PROCESSORS_OBJECT
source_group(tes3mp-server\\processors\\object FILES ${PROCESSORS_OBJECT})
set(PROCESSORS_WORLDSTATE
processors/worldstate/ProcessorRecordDynamic.hpp
processors/worldstate/ProcessorRecordDynamic.hpp processors/worldstate/ProcessorWorldMap.hpp
)
source_group(tes3mp-server\\processors\\worldstate FILES ${PROCESSORS_WORLDSTATE})
@ -180,7 +180,7 @@ include_directories("./")
add_executable(tes3mp-server
${SERVER} ${SERVER_HEADER}
${PROCESSORS_ACTOR} ${PROCESSORS_PLAYER} ${PROCESSORS_OBJECT} ${PROCESSORS}
${PROCESSORS_ACTOR} ${PROCESSORS_PLAYER} ${PROCESSORS_OBJECT} ${PROCESSORS_WORLDSTATE} ${PROCESSORS}
${APPLE_BUNDLE_RESOURCES}
)
add_definitions(-std=gnu++14 -Wno-ignored-qualifiers)

@ -12,14 +12,6 @@ using namespace std;
static std::string tempCellDescription;
void CellFunctions::InitializeMapChanges(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
player->mapChanges.mapTiles.clear();
}
unsigned int CellFunctions::GetCellStateChangesSize(unsigned short pid) noexcept
{
Player *player;
@ -28,14 +20,6 @@ unsigned int CellFunctions::GetCellStateChangesSize(unsigned short pid) noexcept
return player->cellStateChanges.count;
}
unsigned int CellFunctions::GetMapChangesSize(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
return player->mapChanges.mapTiles.size();
}
unsigned int CellFunctions::GetCellStateType(unsigned short pid, unsigned int i) noexcept
{
Player *player;
@ -103,35 +87,6 @@ bool CellFunctions::IsChangingRegion(unsigned short pid) noexcept
return player->isChangingRegion;
}
void CellFunctions::SaveMapTileImageFile(unsigned short pid, unsigned int i, const char *filePath) noexcept
{
Player *player;
GET_PLAYER(pid, player,);
if (i >= player->mapChanges.mapTiles.size())
return;
const std::vector<char>& imageData = player->mapChanges.mapTiles.at(i).imageData;
std::ofstream outputFile(filePath, std::ios::binary);
std::ostream_iterator<char> outputIterator(outputFile);
std::copy(imageData.begin(), imageData.end(), outputIterator);
}
int CellFunctions::GetMapTileCellX(unsigned short pid, unsigned int i) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
return player->mapChanges.mapTiles.at(i).x;
}
int CellFunctions::GetMapTileCellY(unsigned short pid, unsigned int i) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
return player->mapChanges.mapTiles.at(i).y;
}
void CellFunctions::SetCell(unsigned short pid, const char *cellDescription) noexcept
{
Player *player;
@ -160,21 +115,6 @@ void CellFunctions::SetExteriorCell(unsigned short pid, int x, int y) noexcept
player->cell.mData.mY = y;
}
void CellFunctions::LoadMapTileImageFile(unsigned short pid, int cellX, int cellY, const char* filePath) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
mwmp::MapTile mapTile;
mapTile.x = cellX;
mapTile.y = cellY;
std::ifstream inputFile(filePath, std::ios::binary);
mapTile.imageData = std::vector<char>(std::istreambuf_iterator<char>(inputFile), std::istreambuf_iterator<char>());
player->mapChanges.mapTiles.push_back(mapTile);
}
void CellFunctions::SendCell(unsigned short pid) noexcept
{
Player *player;
@ -183,12 +123,3 @@ void CellFunctions::SendCell(unsigned short pid) noexcept
mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_CELL_CHANGE)->setPlayer(player);
mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_CELL_CHANGE)->Send(false);
}
void CellFunctions::SendMapChanges(unsigned short pid, bool toOthers) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_MAP)->setPlayer(player);
mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_MAP)->Send(toOthers);
}

@ -4,10 +4,7 @@
#include "../Types.hpp"
#define CELLAPI \
{"InitializeMapChanges", CellFunctions::InitializeMapChanges},\
\
{"GetCellStateChangesSize", CellFunctions::GetCellStateChangesSize},\
{"GetMapChangesSize", CellFunctions::GetMapChangesSize},\
\
{"GetCellStateType", CellFunctions::GetCellStateType},\
{"GetCellStateDescription", CellFunctions::GetCellStateDescription},\
@ -20,33 +17,16 @@
{"GetRegion", CellFunctions::GetRegion},\
{"IsChangingRegion", CellFunctions::IsChangingRegion},\
\
{"GetMapTileCellX", CellFunctions::GetMapTileCellX},\
{"GetMapTileCellY", CellFunctions::GetMapTileCellY},\
{"SaveMapTileImageFile", CellFunctions::SaveMapTileImageFile},\
\
{"SetCell", CellFunctions::SetCell},\
{"SetExteriorCell", CellFunctions::SetExteriorCell},\
\
{"LoadMapTileImageFile", CellFunctions::LoadMapTileImageFile},\
\
{"SendCell", CellFunctions::SendCell},\
{"SendMapChanges", CellFunctions::SendMapChanges}
{"SendCell", CellFunctions::SendCell}
class CellFunctions
{
public:
/**
* \brief Clear the last recorded map changes for a player.
*
* This is used to initialize the sending of new PlayerMap packets.
*
* \param pid The player ID whose map changes should be used.
* \return void
*/
static void InitializeMapChanges(unsigned short pid) noexcept;
/**
* \brief Get the number of indexes in a player's latest cell state changes.
*
@ -55,14 +35,6 @@ public:
*/
static unsigned int GetCellStateChangesSize(unsigned short pid) noexcept;
/**
* \brief Get the number of indexes in a player's latest map changes.
*
* \param pid The player ID whose map changes should be used.
* \return The number of indexes.
*/
static unsigned int GetMapChangesSize(unsigned short pid) noexcept;
/**
* \brief Get the cell state type at a certain index in a player's latest cell state changes.
*
@ -131,37 +103,6 @@ public:
*/
static bool IsChangingRegion(unsigned short pid) noexcept;
/**
* \brief Get the X coordinate of the cell corresponding to the map tile at a certain index in a
* player's latest map changes.
*
* \param pid The player ID whose map changes should be used.
* \param i The index of the map tile.
* \return The X coordinate of the cell.
*/
static int GetMapTileCellX(unsigned short pid, unsigned int i) noexcept;
/**
* \brief Get the Y coordinate of the cell corresponding to the map tile at a certain index in a
* player's latest map changes.
*
* \param pid The player ID whose map changes should be used.
* \param i The index of the map tile.
* \return The Y coordinate of the cell.
*/
static int GetMapTileCellY(unsigned short pid, unsigned int i) noexcept;
/**
* \brief Save the .png image data of the map tile at a certain index in a player's latest map changes
* to a file.
*
* \param pid The player ID whose map changes should be used.
* \param i The index of the map tile.
* \param filePath The file path of the resulting file.
* \return void
*/
static void SaveMapTileImageFile(unsigned short pid, unsigned int i, const char *filePath) noexcept;
/**
* \brief Set the cell of a player.
*
@ -190,18 +131,6 @@ public:
*/
static void SetExteriorCell(unsigned short pid, int x, int y) noexcept;
/**
* \brief Load a .png file as the image data for a map tile and add it to the map changes for
* a player.
*
* \param pid The player ID whose map changes should be used.
* \param cellX The X coordinate of the cell corresponding to the map tile.
* \param cellY The Y coordinate of the cell corresponding to the map tile.
* \param filePath The file path of the loaded file.
* \return void
*/
static void LoadMapTileImageFile(unsigned short pid, int cellX, int cellY, const char* filePath) noexcept;
/**
* \brief Send a PlayerCellChange packet about a player.
*
@ -212,15 +141,6 @@ public:
*/
static void SendCell(unsigned short pid) noexcept;
/**
* \brief Send a PlayerMap packet with a player's recorded map changes.
*
* \param pid The player ID whose map changes should be used.
* \param toOthers Whether this packet should be sent only to other players or
* only to the player it is about.
* \return void
*/
static void SendMapChanges(unsigned short pid, bool toOthers = false) noexcept;
};
#endif //OPENMW_CELLAPI_HPP

@ -11,6 +11,56 @@ using namespace std;
using namespace mwmp;
BaseWorldstate writeWorldstate;
BaseWorldstate *readWorldstate;
void WorldstateFunctions::ReadLastWorldstate() noexcept
{
readWorldstate = mwmp::Networking::getPtr()->getLastWorldstate();
}
void WorldstateFunctions::ClearMapChanges() noexcept
{
writeWorldstate.mapChanges.mapTiles.clear();
}
unsigned int WorldstateFunctions::GetMapChangesSize() noexcept
{
return readWorldstate->mapChanges.mapTiles.size();
}
int WorldstateFunctions::GetMapTileCellX(unsigned int index) noexcept
{
return readWorldstate->mapChanges.mapTiles.at(index).x;
}
int WorldstateFunctions::GetMapTileCellY(unsigned int index) noexcept
{
return readWorldstate->mapChanges.mapTiles.at(index).y;
}
void WorldstateFunctions::SaveMapTileImageFile(unsigned int index, const char *filePath) noexcept
{
if (index >= readWorldstate->mapChanges.mapTiles.size())
return;
const std::vector<char>& imageData = readWorldstate->mapChanges.mapTiles.at(index).imageData;
std::ofstream outputFile(filePath, std::ios::binary);
std::ostream_iterator<char> outputIterator(outputFile);
std::copy(imageData.begin(), imageData.end(), outputIterator);
}
void WorldstateFunctions::LoadMapTileImageFile(int cellX, int cellY, const char* filePath) noexcept
{
mwmp::MapTile mapTile;
mapTile.x = cellX;
mapTile.y = cellY;
std::ifstream inputFile(filePath, std::ios::binary);
mapTile.imageData = std::vector<char>(std::istreambuf_iterator<char>(inputFile), std::istreambuf_iterator<char>());
writeWorldstate.mapChanges.mapTiles.push_back(mapTile);
}
void WorldstateFunctions::SetHour(double hour) noexcept
{
@ -62,7 +112,21 @@ void WorldstateFunctions::UseActorCollisionForPlacedObjects(bool useActorCollisi
writeWorldstate.useActorCollisionForPlacedObjects = useActorCollision;
}
void WorldstateFunctions::SendWorldTime(unsigned short pid, bool toOthers) noexcept
void WorldstateFunctions::SendWorldMap(unsigned short pid, bool broadcast) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
writeWorldstate.guid = player->guid;
mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_MAP)->setWorldstate(&writeWorldstate);
mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_MAP)->Send(false);
if (broadcast)
mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_MAP)->Send(true);
}
void WorldstateFunctions::SendWorldTime(unsigned short pid, bool broadcast) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -72,11 +136,11 @@ void WorldstateFunctions::SendWorldTime(unsigned short pid, bool toOthers) noexc
mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_TIME)->setWorldstate(&writeWorldstate);
mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_TIME)->Send(false);
if (toOthers)
if (broadcast)
mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_TIME)->Send(true);
}
void WorldstateFunctions::SendWorldCollisionOverride(unsigned short pid, bool toOthers) noexcept
void WorldstateFunctions::SendWorldCollisionOverride(unsigned short pid, bool broadcast) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -86,6 +150,6 @@ void WorldstateFunctions::SendWorldCollisionOverride(unsigned short pid, bool to
mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_COLLISION_OVERRIDE)->setWorldstate(&writeWorldstate);
mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_COLLISION_OVERRIDE)->Send(false);
if (toOthers)
if (broadcast)
mwmp::Networking::get().getWorldstatePacketController()->GetPacket(ID_WORLD_COLLISION_OVERRIDE)->Send(true);
}

@ -4,6 +4,18 @@
#include "../Types.hpp"
#define WORLDSTATEAPI \
{"ReadLastWorldstate", WorldstateFunctions::ReadLastWorldstate},\
\
{"ClearMapChanges", WorldstateFunctions::ClearMapChanges},\
\
{"GetMapChangesSize", WorldstateFunctions::GetMapChangesSize},\
\
{"GetMapTileCellX", WorldstateFunctions::GetMapTileCellX},\
{"GetMapTileCellY", WorldstateFunctions::GetMapTileCellY},\
\
{"SaveMapTileImageFile", WorldstateFunctions::SaveMapTileImageFile},\
{"LoadMapTileImageFile", WorldstateFunctions::LoadMapTileImageFile},\
\
{"SetHour", WorldstateFunctions::SetHour},\
{"SetDay", WorldstateFunctions::SetDay},\
{"SetMonth", WorldstateFunctions::SetMonth},\
@ -16,6 +28,7 @@
{"SetPlacedObjectCollisionState", WorldstateFunctions::SetPlacedObjectCollisionState},\
{"UseActorCollisionForPlacedObjects", WorldstateFunctions::UseActorCollisionForPlacedObjects},\
\
{"SendWorldMap", WorldstateFunctions::SendWorldMap},\
{"SendWorldTime", WorldstateFunctions::SendWorldTime},\
{"SendWorldCollisionOverride", WorldstateFunctions::SendWorldCollisionOverride}
@ -24,7 +37,69 @@ class WorldstateFunctions
public:
/**
* \brief Set the world's hour in the worldstate stored on the server.
* \brief Use the last worldstate received by the server as the one being read.
*
* \return void
*/
static void ReadLastWorldstate() noexcept;
/**
* \brief Clear the map changes for the write-only worldstate.
*
* This is used to initialize the sending of new WorldMap packets.
*
* \return void
*/
static void ClearMapChanges() noexcept;
/**
* \brief Get the number of indexes in the read worldstate's map changes.
*
* \return The number of indexes.
*/
static unsigned int GetMapChangesSize() noexcept;
/**
* \brief Get the X coordinate of the cell corresponding to the map tile at a certain index in
* the read worldstate's map changes.
*
* \param i The index of the map tile.
* \return The X coordinate of the cell.
*/
static int GetMapTileCellX(unsigned int index) noexcept;
/**
* \brief Get the Y coordinate of the cell corresponding to the map tile at a certain index in
* the read worldstate's map changes.
*
* \param i The index of the map tile.
* \return The Y coordinate of the cell.
*/
static int GetMapTileCellY(unsigned int index) noexcept;
/**
* \brief Save the .png image data of the map tile at a certain index in the read worldstate's
* map changes.
*
* \param i The index of the map tile.
* \param filePath The file path of the resulting file.
* \return void
*/
static void SaveMapTileImageFile(unsigned int index, const char *filePath) noexcept;
/**
* \brief Load a .png file as the image data for a map tile and add it to the write-only worldstate
* stored on the server.
*
* \param cellX The X coordinate of the cell corresponding to the map tile.
* \param cellY The Y coordinate of the cell corresponding to the map tile.
* \param filePath The file path of the loaded file.
* \return void
*/
static void LoadMapTileImageFile(int cellX, int cellY, const char* filePath) noexcept;
/**
* \brief Set the world's hour in the write-only worldstate stored on the server.
*
* \param hour The hour.
* \return void
@ -32,7 +107,7 @@ public:
static void SetHour(double hour) noexcept;
/**
* \brief Set the world's day in the worldstate stored on the server.
* \brief Set the world's day in the write-only worldstate stored on the server.
*
* \param day The day.
* \return void
@ -40,7 +115,7 @@ public:
static void SetDay(int day) noexcept;
/**
* \brief Set the world's month in the worldstate stored on the server.
* \brief Set the world's month in the write-only worldstate stored on the server.
*
* \param month The month.
* \return void
@ -48,7 +123,7 @@ public:
static void SetMonth(int month) noexcept;
/**
* \brief Set the world's year in the worldstate stored on the server.
* \brief Set the world's year in the write-only worldstate stored on the server.
*
* \param year The year.
* \return void
@ -56,7 +131,7 @@ public:
static void SetYear(int year) noexcept;
/**
* \brief Set the world's days passed in the worldstate stored on the server.
* \brief Set the world's days passed in the write-only worldstate stored on the server.
*
* \param daysPassed The days passed.
* \return void
@ -64,7 +139,7 @@ public:
static void SetDaysPassed(int daysPassed) noexcept;
/**
* \brief Set the world's time scale in the worldstate stored on the server.
* \brief Set the world's time scale in the write-only worldstate stored on the server.
*
* \param pid The player ID.
* \param timeScale The time scale.
@ -73,7 +148,8 @@ public:
static void SetTimeScale(double timeScale) noexcept;
/**
* \brief Set the collision state for other players.
* \brief Set the collision state for other players in the write-only worldstate stored
* on the server.
*
* \param state The collision state.
* \return void
@ -81,7 +157,8 @@ public:
static void SetPlayerCollisionState(bool state) noexcept;
/**
* \brief Set the collision state for actors.
* \brief Set the collision state for actors in the write-only worldstate stored on the
* server.
*
* \param state The collision state.
* \return void
@ -89,7 +166,8 @@ public:
static void SetActorCollisionState(bool state) noexcept;
/**
* \brief Set the collision state for placed objects.
* \brief Set the collision state for placed objects in the write-only worldstate stored
* on the server.
*
* \param state The collision state.
* \return void
@ -97,9 +175,8 @@ public:
static void SetPlacedObjectCollisionState(bool state) noexcept;
/**
* \brief Whether placed objects with collision turned on should use
* actor collision, i.e. whether they should be slippery
* and prevent players from standing on them.
* \brief Whether placed objects with collision turned on should use actor collision, i.e.
* whether they should be slippery and prevent players from standing on them.
*
* \param useActorCollision Whether to use actor collision.
* \return void
@ -107,22 +184,37 @@ public:
static void UseActorCollisionForPlacedObjects(bool useActorCollision) noexcept;
/**
* \brief Send a WorldTime packet with the current time and time scale
* to a specific player or to all players.
* \brief Send a WorldMap packet with the current set of map changes in the write-only
* worldstate.
*
* \param pid The player ID.
* \param pid The player ID attached to the packet.
* \param broadcast Whether this packet should be sent only to the attached player
* or to all players on the server.
* \return void
*/
static void SendWorldTime(unsigned short pid, bool toOthers = false) noexcept;
static void SendWorldMap(unsigned short pid, bool broadcast = false) noexcept;
/**
* \brief Send a WorldCollisionOverride packet with the current collision overrides
* to a specific player or to all players.
* \brief Send a WorldTime packet with the current time and time scale in the write-only
* worldstate.
*
* \param pid The player ID.
* \param pid The player ID attached to the packet.
* \param broadcast Whether this packet should be sent only to the attached player
* or to all players on the server.
* \return void
*/
static void SendWorldTime(unsigned short pid, bool broadcast = false) noexcept;
/**
* \brief Send a WorldCollisionOverride packet with the current collision overrides in
* the write-only worldstate.
*
* \param pid The player ID attached to the packet.
* \param broadcast Whether this packet should be sent only to the attached player
* or to all players on the server.
* \return void
*/
static void SendWorldCollisionOverride(unsigned short pid, bool toOthers = false) noexcept;
static void SendWorldCollisionOverride(unsigned short pid, bool broadcast = false) noexcept;
};

@ -323,7 +323,6 @@ public:
{"OnPlayerDisposition", Function<void, unsigned short>()},
{"OnPlayerBook", Function<void, unsigned short>()},
{"OnPlayerMiscellaneous", Function<void, unsigned short>()},
{"OnPlayerMap", Function<void, unsigned short>()},
{"OnPlayerInteraction", Function<void, unsigned short>()},
{"OnPlayerRest", Function<void, unsigned short>()},
{"OnRecordDynamic", Function<void, unsigned short>()},
@ -346,6 +345,7 @@ public:
{"OnPlayerSendMessage", Function<bool, unsigned short, const char*>()},
{"OnPlayerEndCharGen", Function<void, unsigned short>()},
{"OnGUIAction", Function<void, unsigned short, int, const char*>()},
{"OnWorldMap", Function<void, unsigned short>()},
{"OnMpNumIncrement", Function<void, int>()},
{"OnRequestPluginList", Function<const char *, unsigned int, unsigned int>()}
};

@ -26,7 +26,6 @@
#include "player/ProcessorPlayerKillCount.hpp"
#include "player/ProcessorPlayerInteraction.hpp"
#include "player/ProcessorPlayerLevel.hpp"
#include "player/ProcessorPlayerMap.hpp"
#include "player/ProcessorPlayerMiscellaneous.hpp"
#include "player/ProcessorPlayerPosition.hpp"
#include "player/ProcessorPlayerQuickKeys.hpp"
@ -76,6 +75,7 @@
#include "object/ProcessorVideoPlay.hpp"
#include "WorldstateProcessor.hpp"
#include "worldstate/ProcessorRecordDynamic.hpp"
#include "worldstate/ProcessorWorldMap.hpp"
using namespace mwmp;
@ -103,7 +103,6 @@ void ProcessorInitializer()
PlayerProcessor::AddProcessor(new ProcessorPlayerKillCount());
PlayerProcessor::AddProcessor(new ProcessorPlayerInteraction());
PlayerProcessor::AddProcessor(new ProcessorPlayerLevel());
PlayerProcessor::AddProcessor(new ProcessorPlayerMap());
PlayerProcessor::AddProcessor(new ProcessorPlayerMiscellaneous());
PlayerProcessor::AddProcessor(new ProcessorPlayerPosition());
PlayerProcessor::AddProcessor(new ProcessorPlayerQuickKeys());
@ -153,4 +152,5 @@ void ProcessorInitializer()
ObjectProcessor::AddProcessor(new ProcessorVideoPlay());
WorldstateProcessor::AddProcessor(new ProcessorRecordDynamic());
WorldstateProcessor::AddProcessor(new ProcessorWorldMap());
}

@ -1,25 +0,0 @@
#ifndef OPENMW_PROCESSORPLAYERMAP_HPP
#define OPENMW_PROCESSORPLAYERMAP_HPP
#include "../PlayerProcessor.hpp"
namespace mwmp
{
class ProcessorPlayerMap : public PlayerProcessor
{
public:
ProcessorPlayerMap()
{
BPP_INIT(ID_PLAYER_MAP)
}
void Do(PlayerPacket &packet, Player &player) override
{
DEBUG_PRINTF(strPacketID.c_str());
Script::Call<Script::CallbackIdentity("OnPlayerMap")>(player.getId());
}
};
}
#endif //OPENMW_PROCESSORPLAYERMAP_HPP

@ -0,0 +1,25 @@
#ifndef OPENMW_PROCESSORWORLDMAP_HPP
#define OPENMW_PROCESSORWORLDMAP_HPP
#include "../WorldstateProcessor.hpp"
namespace mwmp
{
class ProcessorWorldMap : public WorldstateProcessor
{
public:
ProcessorWorldMap()
{
BPP_INIT(ID_WORLD_MAP)
}
void Do(WorldstatePacket &packet, Player &player, BaseWorldstate &worldstate) override
{
DEBUG_PRINTF(strPacketID.c_str());
Script::Call<Script::CallbackIdentity("OnWorldMap")>(player.getId());
}
};
}
#endif //OPENMW_PROCESSORWORLDMAP_HPP

@ -119,9 +119,10 @@ add_openmw_dir (mwmp/processors/player ProcessorChatMessage ProcessorGUIMessageB
ProcessorPlayerBehavior ProcessorPlayerBook ProcessorPlayerBounty ProcessorPlayerCellChange ProcessorPlayerCellState
ProcessorPlayerCharClass ProcessorPlayerCharGen ProcessorPlayerDeath ProcessorPlayerDisposition ProcessorPlayerEquipment
ProcessorPlayerFaction ProcessorPlayerInteraction ProcessorPlayerInventory ProcessorPlayerJail ProcessorPlayerJournal
ProcessorPlayerKillCount ProcessorPlayerLevel ProcessorPlayerMap ProcessorPlayerMiscellaneous ProcessorPlayerMomentum
ProcessorPlayerPosition ProcessorPlayerQuickKeys ProcessorPlayerReputation ProcessorPlayerResurrect ProcessorPlayerShapeshift
ProcessorPlayerSkill ProcessorPlayerSpeech ProcessorPlayerSpellbook ProcessorPlayerStatsDynamic ProcessorPlayerTopic
ProcessorPlayerKillCount ProcessorPlayerLevel ProcessorPlayerMiscellaneous ProcessorPlayerMomentum
ProcessorPlayerPosition ProcessorPlayerQuickKeys ProcessorPlayerReputation ProcessorPlayerResurrect
ProcessorPlayerShapeshift ProcessorPlayerSkill ProcessorPlayerSpeech ProcessorPlayerSpellbook ProcessorPlayerStatsDynamic
ProcessorPlayerTopic
)
add_openmw_dir (mwmp/processors/object BaseObjectProcessor ProcessorConsoleCommand ProcessorContainer
@ -132,7 +133,8 @@ add_openmw_dir (mwmp/processors/object BaseObjectProcessor ProcessorConsoleComma
ProcessorScriptMemberShort ProcessorScriptMemberFloat ProcessorScriptGlobalShort ProcessorScriptGlobalFloat
)
add_openmw_dir (mwmp/processors/worldstate ProcessorRecordDynamic ProcessorWorldCollisionOverride ProcessorWorldTime
add_openmw_dir (mwmp/processors/worldstate ProcessorRecordDynamic ProcessorWorldCollisionOverride ProcessorWorldMap
ProcessorWorldTime
)
# Main executable

@ -1289,22 +1289,6 @@ void LocalPlayer::setBooks()
ptrNpcStats.flagAsUsed(book.bookId);
}
void LocalPlayer::setMapExplored()
{
MWWorld::Ptr ptrPlayer = getPlayerPtr();
MWMechanics::NpcStats &ptrNpcStats = ptrPlayer.getClass().getNpcStats(ptrPlayer);
for (const auto &mapTile : mapChanges.mapTiles)
{
const MWWorld::CellStore *cellStore = MWBase::Environment::get().getWorld()->getExterior(mapTile.x, mapTile.y);
if (!cellStore->getCell()->mName.empty())
MWBase::Environment::get().getWindowManager()->addVisitedLocation(cellStore->getCell()->mName, mapTile.x, mapTile.y);
MWBase::Environment::get().getWindowManager()->setGlobalMapImage(mapTile.x, mapTile.y, mapTile.imageData);
}
}
void LocalPlayer::setShapeshift()
{
MWWorld::Ptr ptrPlayer = getPlayerPtr();
@ -1650,23 +1634,6 @@ void LocalPlayer::sendSelectedSpell(const std::string& newSelectedSpellId)
getNetworking()->getPlayerPacket(ID_PLAYER_MISCELLANEOUS)->Send();
}
void LocalPlayer::sendMapExplored(int x, int y, const std::vector<char>& imageData)
{
mapChanges.mapTiles.clear();
mwmp::MapTile mapTile;
mapTile.x = x;
mapTile.y = y;
mapTile.imageData = imageData;
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Sending ID_PLAYER_MAP with x: %i, y: %i", x, y);
mapChanges.mapTiles.push_back(mapTile);
getNetworking()->getPlayerPacket(ID_PLAYER_MAP)->setPlayer(this);
getNetworking()->getPlayerPacket(ID_PLAYER_MAP)->Send();
}
void LocalPlayer::clearCellStates()
{
cellStateChanges.cellStates.clear();

@ -67,7 +67,6 @@ namespace mwmp
void setShapeshift();
void setMarkLocation();
void setSelectedSpell();
void setMapExplored();
void sendClass();
void sendInventory();
@ -90,7 +89,6 @@ namespace mwmp
void sendWerewolfState(bool isWerewolf);
void sendMarkLocation(const ESM::Cell& newMarkCell, const ESM::Position& newMarkPosition);
void sendSelectedSpell(const std::string& newSelectedSpellId);
void sendMapExplored(int x, int y, const std::vector<char>& imageData);
void clearCellStates();
void clearCurrentContainer();

@ -1,3 +1,11 @@
#include <components/openmw-mp/Log.hpp>
#include "../mwbase/environment.hpp"
#include "../mwgui/windowmanagerimp.hpp"
#include "../mwworld/worldimp.hpp"
#include "Worldstate.hpp"
#include "Main.hpp"
#include "Networking.hpp"
@ -22,3 +30,33 @@ Networking *Worldstate::getNetworking()
{
return mwmp::Main::get().getNetworking();
}
void Worldstate::sendMapExplored(int x, int y, const std::vector<char>& imageData)
{
mapChanges.mapTiles.clear();
mwmp::MapTile mapTile;
mapTile.x = x;
mapTile.y = y;
mapTile.imageData = imageData;
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Sending ID_PLAYER_MAP with x: %i, y: %i", x, y);
mapChanges.mapTiles.push_back(mapTile);
getNetworking()->getWorldstatePacket(ID_WORLD_MAP)->setWorldstate(this);
getNetworking()->getWorldstatePacket(ID_WORLD_MAP)->Send();
}
void Worldstate::setMapExplored()
{
for (const auto &mapTile : mapChanges.mapTiles)
{
const MWWorld::CellStore *cellStore = MWBase::Environment::get().getWorld()->getExterior(mapTile.x, mapTile.y);
if (!cellStore->getCell()->mName.empty())
MWBase::Environment::get().getWindowManager()->addVisitedLocation(cellStore->getCell()->mName, mapTile.x, mapTile.y);
MWBase::Environment::get().getWindowManager()->setGlobalMapImage(mapTile.x, mapTile.y, mapTile.imageData);
}
}

@ -13,6 +13,10 @@ namespace mwmp
Worldstate();
virtual ~Worldstate();
void setMapExplored();
void sendMapExplored(int x, int y, const std::vector<char>& imageData);
private:
Networking *getNetworking();

@ -30,7 +30,6 @@
#include "player/ProcessorPlayerJournal.hpp"
#include "player/ProcessorPlayerKillCount.hpp"
#include "player/ProcessorPlayerLevel.hpp"
#include "player/ProcessorPlayerMap.hpp"
#include "player/ProcessorPlayerMiscellaneous.hpp"
#include "player/ProcessorPlayerMomentum.hpp"
#include "player/ProcessorPlayerPosition.hpp"
@ -92,6 +91,7 @@
#include "WorldstateProcessor.hpp"
#include "worldstate/ProcessorRecordDynamic.hpp"
#include "worldstate/ProcessorWorldCollisionOverride.hpp"
#include "worldstate/ProcessorWorldMap.hpp"
#include "worldstate/ProcessorWorldTime.hpp"
using namespace mwmp;
@ -127,7 +127,6 @@ void ProcessorInitializer()
PlayerProcessor::AddProcessor(new ProcessorPlayerJournal());
PlayerProcessor::AddProcessor(new ProcessorPlayerKillCount());
PlayerProcessor::AddProcessor(new ProcessorPlayerLevel());
PlayerProcessor::AddProcessor(new ProcessorPlayerMap());
PlayerProcessor::AddProcessor(new ProcessorPlayerMiscellaneous());
PlayerProcessor::AddProcessor(new ProcessorPlayerMomentum());
PlayerProcessor::AddProcessor(new ProcessorPlayerPosition());
@ -186,5 +185,6 @@ void ProcessorInitializer()
WorldstateProcessor::AddProcessor(new ProcessorRecordDynamic());
WorldstateProcessor::AddProcessor(new ProcessorWorldCollisionOverride());
WorldstateProcessor::AddProcessor(new ProcessorWorldMap());
WorldstateProcessor::AddProcessor(new ProcessorWorldTime());
}

@ -8,7 +8,7 @@ using namespace mwmp;
template<class T>
typename BasePacketProcessor<T>::processors_t BasePacketProcessor<T>::processors;
bool WorldstateProcessor::Process(RakNet::Packet &packet, BaseWorldstate &worldstate)
bool WorldstateProcessor::Process(RakNet::Packet &packet, Worldstate &worldstate)
{
RakNet::BitStream bsIn(&packet.data[1], packet.length, false);
bsIn.Read(guid);

@ -11,9 +11,9 @@ namespace mwmp
class WorldstateProcessor : public BasePacketProcessor<WorldstateProcessor>, public BaseClientPacketProcessor
{
public:
virtual void Do(WorldstatePacket &packet, BaseWorldstate &worldstate) = 0;
virtual void Do(WorldstatePacket &packet, Worldstate &worldstate) = 0;
static bool Process(RakNet::Packet &packet, BaseWorldstate &worldstate);
static bool Process(RakNet::Packet &packet, Worldstate &worldstate);
};
}

@ -1,26 +0,0 @@
#ifndef OPENMW_PROCESSORPLAYERMAP_HPP
#define OPENMW_PROCESSORPLAYERMAP_HPP
#include "../PlayerProcessor.hpp"
namespace mwmp
{
class ProcessorPlayerMap : public PlayerProcessor
{
public:
ProcessorPlayerMap()
{
BPP_INIT(ID_PLAYER_MAP)
}
virtual void Do(PlayerPacket &packet, BasePlayer *player)
{
if (isLocal())
{
static_cast<LocalPlayer*>(player)->setMapExplored();
}
}
};
}
#endif //OPENMW_PROCESSORPLAYERMAP_HPP

@ -13,7 +13,7 @@ namespace mwmp
BPP_INIT(ID_RECORD_DYNAMIC)
}
virtual void Do(WorldstatePacket &packet, BaseWorldstate &worldstate)
virtual void Do(WorldstatePacket &packet, Worldstate &worldstate)
{
// Placeholder
}

@ -16,7 +16,7 @@ namespace mwmp
BPP_INIT(ID_WORLD_COLLISION_OVERRIDE)
}
virtual void Do(WorldstatePacket &packet, BaseWorldstate &worldstate)
virtual void Do(WorldstatePacket &packet, Worldstate &worldstate)
{
// Placeholder
}

@ -0,0 +1,23 @@
#ifndef OPENMW_PROCESSORWORLDMAP_HPP
#define OPENMW_PROCESSORWORLDMAP_HPP
#include "../WorldstateProcessor.hpp"
namespace mwmp
{
class ProcessorWorldMap : public WorldstateProcessor
{
public:
ProcessorWorldMap()
{
BPP_INIT(ID_WORLD_MAP)
}
virtual void Do(WorldstatePacket &packet, Worldstate &worldstate)
{
worldstate.setMapExplored();
}
};
}
#endif //OPENMW_PROCESSORWORLDMAP_HPP

@ -16,7 +16,7 @@ namespace mwmp
BPP_INIT(ID_WORLD_TIME)
}
virtual void Do(WorldstatePacket &packet, BaseWorldstate &worldstate)
virtual void Do(WorldstatePacket &packet, Worldstate &worldstate)
{
MWBase::World *world = MWBase::Environment::get().getWorld();

@ -26,7 +26,8 @@
*/
#include <components/openmw-mp/Log.hpp>
#include "../mwmp/Main.hpp"
#include "../mwmp/LocalPlayer.hpp"
#include "../mwmp/Networking.hpp"
#include "../mwmp/Worldstate.hpp"
/*
End of tes3mp addition
*/
@ -660,7 +661,7 @@ namespace MWRender
std::string stringData = ostream.str();
std::vector<char> vectorData = std::vector<char>(stringData.begin(), stringData.end());
mwmp::Main::get().getLocalPlayer()->sendMapExplored(originToCellX.at(imageDest.mX), originToCellY.at(imageDest.mY), vectorData);
mwmp::Main::get().getNetworking()->getWorldstate()->sendMapExplored(originToCellX.at(imageDest.mX), originToCellY.at(imageDest.mY), vectorData);
}
/*
End of tes3mp addition

@ -184,9 +184,10 @@ add_component_dir (openmw-mp/Packets/Player
PacketPlayerAttack PacketPlayerAttribute PacketPlayerBehavior PacketPlayerBook PacketPlayerBounty
PacketPlayerCellChange PacketPlayerCellState PacketPlayerClass PacketPlayerDeath PacketPlayerEquipment
PacketPlayerFaction PacketPlayerInteraction PacketPlayerInventory PacketPlayerJail PacketPlayerJournal
PacketPlayerKillCount PacketPlayerLevel PacketPlayerMap PacketPlayerMiscellaneous PacketPlayerMomentum
PacketPlayerPosition PacketPlayerQuickKeys PacketPlayerRegionAuthority PacketPlayerReputation PacketPlayerRest
PacketPlayerResurrect PacketPlayerShapeshift PacketPlayerSkill PacketPlayerSpeech PacketPlayerSpellbook PacketPlayerStatsDynamic PacketPlayerTopic
PacketPlayerKillCount PacketPlayerLevel PacketPlayerMiscellaneous PacketPlayerMomentum PacketPlayerPosition
PacketPlayerQuickKeys PacketPlayerRegionAuthority PacketPlayerReputation PacketPlayerRest PacketPlayerResurrect
PacketPlayerShapeshift PacketPlayerSkill PacketPlayerSpeech PacketPlayerSpellbook PacketPlayerStatsDynamic
PacketPlayerTopic
)
add_component_dir (openmw-mp/Packets/Object
@ -202,7 +203,7 @@ add_component_dir (openmw-mp/Packets/Object
add_component_dir (openmw-mp/Packets/Worldstate
WorldstatePacket
PacketRecordDynamic PacketWorldCollisionOverride PacketWorldTime
PacketRecordDynamic PacketWorldCollisionOverride PacketWorldMap PacketWorldTime
)
add_component_dir (fallback

@ -91,13 +91,6 @@ namespace mwmp
int type; // 0 - Cell load, 1 - Cell unload
};
struct MapTile
{
int x;
int y;
std::vector<char> imageData;
};
struct JournalChanges
{
std::vector<JournalItem> journalItems;
@ -137,11 +130,6 @@ namespace mwmp
unsigned int count;
};
struct MapChanges
{
std::vector<MapTile> mapTiles;
};
struct InventoryChanges
{
std::vector<Item> items;
@ -269,7 +257,6 @@ namespace mwmp
TopicChanges topicChanges;
KillChanges killChanges;
BookChanges bookChanges;
MapChanges mapChanges;
CellStateChanges cellStateChanges;
ESM::ActiveSpells activeSpells;

@ -1,12 +1,25 @@
#ifndef OPENMW_BASEWORLDSTATE_HPP
#define OPENMW_BASEWORLDSTATE_HPP
#include <vector>
#include <components/openmw-mp/Base/BaseStructs.hpp>
#include <RakNetTypes.h>
namespace mwmp
{
struct MapTile
{
int x;
int y;
std::vector<char> imageData;
};
struct MapChanges
{
std::vector<MapTile> mapTiles;
};
class BaseWorldstate
{
@ -37,6 +50,8 @@ namespace mwmp
bool hasPlacedObjectCollision;
bool useActorCollisionForPlacedObjects;
MapChanges mapChanges;
bool isValid;
};
}

@ -28,7 +28,6 @@
#include "../Packets/Player/PacketPlayerJournal.hpp"
#include "../Packets/Player/PacketPlayerKillCount.hpp"
#include "../Packets/Player/PacketPlayerLevel.hpp"
#include "../Packets/Player/PacketPlayerMap.hpp"
#include "../Packets/Player/PacketPlayerMiscellaneous.hpp"
#include "../Packets/Player/PacketPlayerMomentum.hpp"
#include "../Packets/Player/PacketPlayerPosition.hpp"
@ -87,7 +86,6 @@ mwmp::PlayerPacketController::PlayerPacketController(RakNet::RakPeerInterface *p
AddPacket<PacketPlayerJournal>(&packets, peer);
AddPacket<PacketPlayerKillCount>(&packets, peer);
AddPacket<PacketPlayerLevel>(&packets, peer);
AddPacket<PacketPlayerMap>(&packets, peer);
AddPacket<PacketPlayerMiscellaneous>(&packets, peer);
AddPacket<PacketPlayerMomentum>(&packets, peer);
AddPacket<PacketPlayerPosition>(&packets, peer);

@ -1,5 +1,6 @@
#include "../Packets/Worldstate/PacketRecordDynamic.hpp"
#include "../Packets/Worldstate/PacketWorldCollisionOverride.hpp"
#include "../Packets/Worldstate/PacketWorldMap.hpp"
#include "../Packets/Worldstate/PacketWorldTime.hpp"
#include "WorldstatePacketController.hpp"
@ -16,6 +17,7 @@ mwmp::WorldstatePacketController::WorldstatePacketController(RakNet::RakPeerInte
{
AddPacket<PacketRecordDynamic>(&packets, peer);
AddPacket<PacketWorldCollisionOverride>(&packets, peer);
AddPacket<PacketWorldMap>(&packets, peer);
AddPacket<PacketWorldTime>(&packets, peer);
}

@ -43,7 +43,6 @@ enum GameMessages
ID_PLAYER_JOURNAL,
ID_PLAYER_KILL_COUNT,
ID_PLAYER_LEVEL,
ID_PLAYER_MAP,
ID_PLAYER_MISCELLANEOUS,
ID_PLAYER_MOMENTUM,
ID_PLAYER_POSITION,
@ -109,6 +108,7 @@ enum GameMessages
ID_RECORD_DYNAMIC,
ID_WORLD_COLLISION_OVERRIDE,
ID_WORLD_MAP,
ID_WORLD_TIME,
};

@ -1,7 +1,3 @@
//
// Created by koncord on 05.03.17.
//
#include <components/openmw-mp/NetworkMessages.hpp>
#include <boost/foreach.hpp>
#include "PacketPreInit.hpp"

@ -1,7 +1,3 @@
//
// Created by koncord on 05.03.17.
//
#ifndef OPENMW_PACKETPREINIT_HPP
#define OPENMW_PACKETPREINIT_HPP

@ -1,7 +1,3 @@
//
// Created by koncord on 15.01.16.
//
#include <components/openmw-mp/NetworkMessages.hpp>
#include "PacketPlayerAnimFlags.hpp"

@ -1,7 +1,3 @@
//
// Created by koncord on 15.01.16.
//
#ifndef OPENMW_PACKETPLAYERANIMFLAGS_HPP
#define OPENMW_PACKETPLAYERANIMFLAGS_HPP

@ -1,17 +0,0 @@
#ifndef OPENMW_PACKETPLAYERMAP_HPP
#define OPENMW_PACKETPLAYERMAP_HPP
#include <components/openmw-mp/Packets/Player/PlayerPacket.hpp>
namespace mwmp
{
class PacketPlayerMap : public PlayerPacket
{
public:
PacketPlayerMap(RakNet::RakPeerInterface *peer);
virtual void Packet(RakNet::BitStream *bs, bool send);
};
}
#endif //OPENMW_PACKETPLAYERMAP_HPP

@ -1,32 +1,32 @@
#include <components/openmw-mp/NetworkMessages.hpp>
#include "PacketPlayerMap.hpp"
#include "PacketWorldMap.hpp"
using namespace std;
using namespace mwmp;
PacketPlayerMap::PacketPlayerMap(RakNet::RakPeerInterface *peer) : PlayerPacket(peer)
PacketWorldMap::PacketWorldMap(RakNet::RakPeerInterface *peer) : WorldstatePacket(peer)
{
packetID = ID_PLAYER_MAP;
packetID = ID_WORLD_MAP;
}
void PacketPlayerMap::Packet(RakNet::BitStream *bs, bool send)
void PacketWorldMap::Packet(RakNet::BitStream *bs, bool send)
{
PlayerPacket::Packet(bs, send);
WorldstatePacket::Packet(bs, send);
uint32_t changesCount;
if (send)
changesCount = static_cast<uint32_t>(player->mapChanges.mapTiles.size());
changesCount = static_cast<uint32_t>(worldstate->mapChanges.mapTiles.size());
RW(changesCount, send);
if (!send)
{
player->mapChanges.mapTiles.clear();
player->mapChanges.mapTiles.resize(changesCount);
worldstate->mapChanges.mapTiles.clear();
worldstate->mapChanges.mapTiles.resize(changesCount);
}
for (auto &&mapTile : player->mapChanges.mapTiles)
for (auto &&mapTile : worldstate->mapChanges.mapTiles)
{
RW(mapTile.x, send);
RW(mapTile.y, send);

@ -0,0 +1,17 @@
#ifndef OPENMW_PACKETWORLDMAP_HPP
#define OPENMW_PACKETWORLDMAP_HPP
#include <components/openmw-mp/Packets/Worldstate/WorldstatePacket.hpp>
namespace mwmp
{
class PacketWorldMap : public WorldstatePacket
{
public:
PacketWorldMap(RakNet::RakPeerInterface *peer);
virtual void Packet(RakNet::BitStream *bs, bool send);
};
}
#endif //OPENMW_PACKETWORLDMAP_HPP

@ -1,5 +1,5 @@
#include "PacketWorldTime.hpp"
#include <components/openmw-mp/NetworkMessages.hpp>
#include "PacketWorldTime.hpp"
using namespace mwmp;

Loading…
Cancel
Save