forked from mirror/openmw-tes3mp
[Server] Split off Cell and CellController into two different files
This commit is contained in:
parent
8492929738
commit
234510a87f
7 changed files with 238 additions and 216 deletions
|
@ -70,6 +70,7 @@ set(SERVER
|
||||||
Networking.cpp
|
Networking.cpp
|
||||||
MasterClient.cpp
|
MasterClient.cpp
|
||||||
Cell.cpp
|
Cell.cpp
|
||||||
|
CellController.cpp
|
||||||
Utils.cpp
|
Utils.cpp
|
||||||
Script/Script.cpp Script/ScriptFunction.cpp
|
Script/Script.cpp Script/ScriptFunction.cpp
|
||||||
Script/ScriptFunctions.cpp
|
Script/ScriptFunctions.cpp
|
||||||
|
|
|
@ -9,6 +9,21 @@
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
Cell::Cell(ESM::Cell cell) : cell(cell)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Cell::Iterator Cell::begin() const
|
||||||
|
{
|
||||||
|
return players.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
Cell::Iterator Cell::end() const
|
||||||
|
{
|
||||||
|
return players.end();
|
||||||
|
}
|
||||||
|
|
||||||
void Cell::addPlayer(Player *player)
|
void Cell::addPlayer(Player *player)
|
||||||
{
|
{
|
||||||
auto it = find(player->cells.begin(), player->cells.end(), this);
|
auto it = find(player->cells.begin(), player->cells.end(), this);
|
||||||
|
@ -103,183 +118,3 @@ std::string Cell::getDescription() const
|
||||||
{
|
{
|
||||||
return cell.getDescription();
|
return cell.getDescription();
|
||||||
}
|
}
|
||||||
|
|
||||||
CellController::CellController()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
CellController::~CellController()
|
|
||||||
{
|
|
||||||
for (auto cell : cells)
|
|
||||||
delete cell;
|
|
||||||
}
|
|
||||||
|
|
||||||
CellController *CellController::sThis = nullptr;
|
|
||||||
|
|
||||||
void CellController::create()
|
|
||||||
{
|
|
||||||
assert(!sThis);
|
|
||||||
sThis = new CellController;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CellController::destroy()
|
|
||||||
{
|
|
||||||
assert(sThis);
|
|
||||||
delete sThis;
|
|
||||||
sThis = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
CellController *CellController::get()
|
|
||||||
{
|
|
||||||
assert(sThis);
|
|
||||||
return sThis;
|
|
||||||
}
|
|
||||||
|
|
||||||
Cell *CellController::getCell(ESM::Cell *esmCell)
|
|
||||||
{
|
|
||||||
if (esmCell->isExterior())
|
|
||||||
return getCellByXY(esmCell->mData.mX, esmCell->mData.mY);
|
|
||||||
else
|
|
||||||
return getCellByName(esmCell->mName);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Cell *CellController::getCellByXY(int x, int y)
|
|
||||||
{
|
|
||||||
auto it = find_if(cells.begin(), cells.end(), [x, y](const Cell *c)
|
|
||||||
{
|
|
||||||
return c->cell.mData.mX == x && c->cell.mData.mY == y;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (it == cells.end())
|
|
||||||
{
|
|
||||||
LOG_APPEND(Log::LOG_INFO, "- Attempt to get Cell at %i, %i failed!", x, y);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return *it;
|
|
||||||
}
|
|
||||||
|
|
||||||
Cell *CellController::getCellByName(std::string cellName)
|
|
||||||
{
|
|
||||||
auto it = find_if(cells.begin(), cells.end(), [cellName](const Cell *c)
|
|
||||||
{
|
|
||||||
return c->cell.mName == cellName;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (it == cells.end())
|
|
||||||
{
|
|
||||||
LOG_APPEND(Log::LOG_INFO, "- Attempt to get Cell at %s failed!", cellName.c_str());
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return *it;
|
|
||||||
}
|
|
||||||
|
|
||||||
Cell *CellController::addCell(ESM::Cell cellData)
|
|
||||||
{
|
|
||||||
LOG_APPEND(Log::LOG_INFO, "- Loaded cells: %d", cells.size());
|
|
||||||
auto it = find_if(cells.begin(), cells.end(), [cellData](const Cell *c) {
|
|
||||||
// Currently we cannot compare because plugin lists can be loaded in different order
|
|
||||||
//return c->cell.sRecordId == cellData.sRecordId;
|
|
||||||
return c->cell.isExterior() ? (c->cell.mData.mX == cellData.mData.mX && c->cell.mData.mY == cellData.mData.mY) :
|
|
||||||
(c->cell.mName == cellData.mName);
|
|
||||||
});
|
|
||||||
|
|
||||||
Cell *cell;
|
|
||||||
if (it == cells.end())
|
|
||||||
{
|
|
||||||
LOG_APPEND(Log::LOG_INFO, "- Adding %s to CellController", cellData.getDescription().c_str());
|
|
||||||
|
|
||||||
cell = new Cell(cellData);
|
|
||||||
cells.push_back(cell);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_APPEND(Log::LOG_INFO, "- Found %s in CellController", cellData.getDescription().c_str());
|
|
||||||
cell = *it;
|
|
||||||
}
|
|
||||||
|
|
||||||
return cell;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void CellController::removeCell(Cell *cell)
|
|
||||||
{
|
|
||||||
if (cell == nullptr)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (auto it = cells.begin(); it != cells.end();)
|
|
||||||
{
|
|
||||||
if (*it != nullptr && *it == cell)
|
|
||||||
{
|
|
||||||
LOG_APPEND(Log::LOG_INFO, "- Removing %s from CellController", cell->getDescription().c_str());
|
|
||||||
|
|
||||||
delete *it;
|
|
||||||
it = cells.erase(it);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CellController::removePlayer(Cell *cell, Player *player)
|
|
||||||
{
|
|
||||||
cell->removePlayer(player);
|
|
||||||
|
|
||||||
if (cell->players.empty())
|
|
||||||
{
|
|
||||||
LOG_APPEND(Log::LOG_INFO, "- Deleting empty cell from memory: %s", cell->getDescription().c_str());
|
|
||||||
auto it = find(cells.begin(), cells.end(), cell);
|
|
||||||
delete *it;
|
|
||||||
cells.erase(it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CellController::deletePlayer(Player *player)
|
|
||||||
{
|
|
||||||
LOG_APPEND(Log::LOG_INFO, "- Iterating through Cells from Player %s", player->npc.mName.c_str());
|
|
||||||
|
|
||||||
for (auto it = player->getCells()->begin(); player->getCells()->size() != 0; ++it)
|
|
||||||
removePlayer(*it, player);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CellController::update(Player *player)
|
|
||||||
{
|
|
||||||
for (auto cell : player->cellStateChanges.cellStates)
|
|
||||||
{
|
|
||||||
if (cell.type == mwmp::CellState::LOAD)
|
|
||||||
{
|
|
||||||
Cell *c = addCell(cell.cell);
|
|
||||||
c->addPlayer(player);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Cell *c;
|
|
||||||
if (!cell.cell.isExterior())
|
|
||||||
c = getCellByName(cell.cell.mName);
|
|
||||||
else
|
|
||||||
c = getCellByXY(cell.cell.getGridX(), cell.cell.getGridY());
|
|
||||||
|
|
||||||
if (c != nullptr)
|
|
||||||
removePlayer(c, player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Cell::Cell(ESM::Cell cell): cell(cell)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
Cell::Iterator Cell::begin() const
|
|
||||||
{
|
|
||||||
return players.begin();
|
|
||||||
}
|
|
||||||
|
|
||||||
Cell::Iterator Cell::end() const
|
|
||||||
{
|
|
||||||
return players.end();
|
|
||||||
}
|
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
// Created by koncord on 18.02.17.
|
// Created by koncord on 18.02.17.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef OPENMW_CELL_HPP
|
#ifndef OPENMW_SERVERCELL_HPP
|
||||||
#define OPENMW_CELL_HPP
|
#define OPENMW_SERVERCELL_HPP
|
||||||
|
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -15,39 +15,6 @@
|
||||||
class Player;
|
class Player;
|
||||||
class Cell;
|
class Cell;
|
||||||
|
|
||||||
|
|
||||||
class CellController
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
CellController();
|
|
||||||
~CellController();
|
|
||||||
|
|
||||||
CellController(CellController&); // not used
|
|
||||||
public:
|
|
||||||
static void create();
|
|
||||||
static void destroy();
|
|
||||||
static CellController *get();
|
|
||||||
public:
|
|
||||||
typedef std::deque<Cell*> TContainer;
|
|
||||||
typedef TContainer::iterator TIter;
|
|
||||||
|
|
||||||
Cell * addCell(ESM::Cell cell);
|
|
||||||
void removeCell(Cell *);
|
|
||||||
|
|
||||||
void removePlayer(Cell *cell, Player *player);
|
|
||||||
void deletePlayer(Player *player);
|
|
||||||
|
|
||||||
Cell *getCell(ESM::Cell *esmCell);
|
|
||||||
Cell *getCellByXY(int x, int y);
|
|
||||||
Cell *getCellByName(std::string cellName);
|
|
||||||
|
|
||||||
void update(Player *player);
|
|
||||||
|
|
||||||
private:
|
|
||||||
static CellController *sThis;
|
|
||||||
TContainer cells;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Cell
|
class Cell
|
||||||
{
|
{
|
||||||
friend class CellController;
|
friend class CellController;
|
||||||
|
@ -75,4 +42,4 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif //OPENMW_CELL_HPP
|
#endif //OPENMW_SERVERCELL_HPP
|
||||||
|
|
170
apps/openmw-mp/CellController.cpp
Normal file
170
apps/openmw-mp/CellController.cpp
Normal file
|
@ -0,0 +1,170 @@
|
||||||
|
#include "CellController.hpp"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include "Cell.hpp"
|
||||||
|
#include "Player.hpp"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
CellController::CellController()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
CellController::~CellController()
|
||||||
|
{
|
||||||
|
for (auto cell : cells)
|
||||||
|
delete cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
CellController *CellController::sThis = nullptr;
|
||||||
|
|
||||||
|
void CellController::create()
|
||||||
|
{
|
||||||
|
assert(!sThis);
|
||||||
|
sThis = new CellController;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CellController::destroy()
|
||||||
|
{
|
||||||
|
assert(sThis);
|
||||||
|
delete sThis;
|
||||||
|
sThis = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
CellController *CellController::get()
|
||||||
|
{
|
||||||
|
assert(sThis);
|
||||||
|
return sThis;
|
||||||
|
}
|
||||||
|
|
||||||
|
Cell *CellController::getCell(ESM::Cell *esmCell)
|
||||||
|
{
|
||||||
|
if (esmCell->isExterior())
|
||||||
|
return getCellByXY(esmCell->mData.mX, esmCell->mData.mY);
|
||||||
|
else
|
||||||
|
return getCellByName(esmCell->mName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Cell *CellController::getCellByXY(int x, int y)
|
||||||
|
{
|
||||||
|
auto it = find_if(cells.begin(), cells.end(), [x, y](const Cell *c)
|
||||||
|
{
|
||||||
|
return c->cell.mData.mX == x && c->cell.mData.mY == y;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (it == cells.end())
|
||||||
|
{
|
||||||
|
LOG_APPEND(Log::LOG_INFO, "- Attempt to get Cell at %i, %i failed!", x, y);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *it;
|
||||||
|
}
|
||||||
|
|
||||||
|
Cell *CellController::getCellByName(std::string cellName)
|
||||||
|
{
|
||||||
|
auto it = find_if(cells.begin(), cells.end(), [cellName](const Cell *c)
|
||||||
|
{
|
||||||
|
return c->cell.mName == cellName;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (it == cells.end())
|
||||||
|
{
|
||||||
|
LOG_APPEND(Log::LOG_INFO, "- Attempt to get Cell at %s failed!", cellName.c_str());
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *it;
|
||||||
|
}
|
||||||
|
|
||||||
|
Cell *CellController::addCell(ESM::Cell cellData)
|
||||||
|
{
|
||||||
|
LOG_APPEND(Log::LOG_INFO, "- Loaded cells: %d", cells.size());
|
||||||
|
auto it = find_if(cells.begin(), cells.end(), [cellData](const Cell *c) {
|
||||||
|
// Currently we cannot compare because plugin lists can be loaded in different order
|
||||||
|
//return c->cell.sRecordId == cellData.sRecordId;
|
||||||
|
return c->cell.isExterior() ? (c->cell.mData.mX == cellData.mData.mX && c->cell.mData.mY == cellData.mData.mY) :
|
||||||
|
(c->cell.mName == cellData.mName);
|
||||||
|
});
|
||||||
|
|
||||||
|
Cell *cell;
|
||||||
|
if (it == cells.end())
|
||||||
|
{
|
||||||
|
LOG_APPEND(Log::LOG_INFO, "- Adding %s to CellController", cellData.getDescription().c_str());
|
||||||
|
|
||||||
|
cell = new Cell(cellData);
|
||||||
|
cells.push_back(cell);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_APPEND(Log::LOG_INFO, "- Found %s in CellController", cellData.getDescription().c_str());
|
||||||
|
cell = *it;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CellController::removeCell(Cell *cell)
|
||||||
|
{
|
||||||
|
if (cell == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (auto it = cells.begin(); it != cells.end();)
|
||||||
|
{
|
||||||
|
if (*it != nullptr && *it == cell)
|
||||||
|
{
|
||||||
|
LOG_APPEND(Log::LOG_INFO, "- Removing %s from CellController", cell->getDescription().c_str());
|
||||||
|
|
||||||
|
delete *it;
|
||||||
|
it = cells.erase(it);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CellController::removePlayer(Cell *cell, Player *player)
|
||||||
|
{
|
||||||
|
cell->removePlayer(player);
|
||||||
|
|
||||||
|
if (cell->players.empty())
|
||||||
|
{
|
||||||
|
LOG_APPEND(Log::LOG_INFO, "- Deleting empty cell from memory: %s", cell->getDescription().c_str());
|
||||||
|
auto it = find(cells.begin(), cells.end(), cell);
|
||||||
|
delete *it;
|
||||||
|
cells.erase(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CellController::deletePlayer(Player *player)
|
||||||
|
{
|
||||||
|
LOG_APPEND(Log::LOG_INFO, "- Iterating through Cells from Player %s", player->npc.mName.c_str());
|
||||||
|
|
||||||
|
for (auto it = player->getCells()->begin(); player->getCells()->size() != 0; ++it)
|
||||||
|
removePlayer(*it, player);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CellController::update(Player *player)
|
||||||
|
{
|
||||||
|
for (auto cell : player->cellStateChanges.cellStates)
|
||||||
|
{
|
||||||
|
if (cell.type == mwmp::CellState::LOAD)
|
||||||
|
{
|
||||||
|
Cell *c = addCell(cell.cell);
|
||||||
|
c->addPlayer(player);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Cell *c;
|
||||||
|
if (!cell.cell.isExterior())
|
||||||
|
c = getCellByName(cell.cell.mName);
|
||||||
|
else
|
||||||
|
c = getCellByXY(cell.cell.getGridX(), cell.cell.getGridY());
|
||||||
|
|
||||||
|
if (c != nullptr)
|
||||||
|
removePlayer(c, player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
47
apps/openmw-mp/CellController.hpp
Normal file
47
apps/openmw-mp/CellController.hpp
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#ifndef OPENMW_SERVERCELLCONTROLLER_HPP
|
||||||
|
#define OPENMW_SERVERCELLCONTROLLER_HPP
|
||||||
|
|
||||||
|
#include <deque>
|
||||||
|
#include <string>
|
||||||
|
#include <components/esm/records.hpp>
|
||||||
|
#include <components/openmw-mp/Base/BaseEvent.hpp>
|
||||||
|
#include <components/openmw-mp/Packets/Actor/ActorPacket.hpp>
|
||||||
|
#include <components/openmw-mp/Packets/World/WorldPacket.hpp>
|
||||||
|
|
||||||
|
class Player;
|
||||||
|
class Cell;
|
||||||
|
|
||||||
|
|
||||||
|
class CellController
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
CellController();
|
||||||
|
~CellController();
|
||||||
|
|
||||||
|
CellController(CellController&); // not used
|
||||||
|
public:
|
||||||
|
static void create();
|
||||||
|
static void destroy();
|
||||||
|
static CellController *get();
|
||||||
|
public:
|
||||||
|
typedef std::deque<Cell*> TContainer;
|
||||||
|
typedef TContainer::iterator TIter;
|
||||||
|
|
||||||
|
Cell * addCell(ESM::Cell cell);
|
||||||
|
void removeCell(Cell *);
|
||||||
|
|
||||||
|
void removePlayer(Cell *cell, Player *player);
|
||||||
|
void deletePlayer(Player *player);
|
||||||
|
|
||||||
|
Cell *getCell(ESM::Cell *esmCell);
|
||||||
|
Cell *getCellByXY(int x, int y);
|
||||||
|
Cell *getCellByName(std::string cellName);
|
||||||
|
|
||||||
|
void update(Player *player);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static CellController *sThis;
|
||||||
|
TContainer cells;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //OPENMW_SERVERCELLCONTROLLER_HPP
|
|
@ -17,6 +17,7 @@
|
||||||
#include "Networking.hpp"
|
#include "Networking.hpp"
|
||||||
#include "MasterClient.hpp"
|
#include "MasterClient.hpp"
|
||||||
#include "Cell.hpp"
|
#include "Cell.hpp"
|
||||||
|
#include "CellController.hpp"
|
||||||
#include "PlayerProcessor.hpp"
|
#include "PlayerProcessor.hpp"
|
||||||
#include "ActorProcessor.hpp"
|
#include "ActorProcessor.hpp"
|
||||||
#include "WorldProcessor.hpp"
|
#include "WorldProcessor.hpp"
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <components/openmw-mp/Base/BasePlayer.hpp>
|
#include <components/openmw-mp/Base/BasePlayer.hpp>
|
||||||
#include <components/openmw-mp/Packets/Player/PlayerPacket.hpp>
|
#include <components/openmw-mp/Packets/Player/PlayerPacket.hpp>
|
||||||
#include "Cell.hpp"
|
#include "Cell.hpp"
|
||||||
|
#include "CellController.hpp"
|
||||||
|
|
||||||
struct Player;
|
struct Player;
|
||||||
typedef std::map<RakNet::RakNetGUID, Player*> TPlayers;
|
typedef std::map<RakNet::RakNetGUID, Player*> TPlayers;
|
||||||
|
|
Loading…
Reference in a new issue