[General] Sketch out most of functionality for journal saving/loading

coverity_scan^2
David Cernat 8 years ago
parent c3c3c57a98
commit 35e453dec3

@ -73,8 +73,9 @@ set(SERVER
Script/ScriptFunctions.cpp
Script/Functions/CharClass.cpp Script/Functions/Chat.cpp Script/Functions/GUI.cpp
Script/Functions/Items.cpp Script/Functions/Stats.cpp Script/Functions/Spells.cpp
Script/Functions/Timer.cpp Script/Functions/Translocations.cpp Script/Functions/World.cpp
Script/Functions/Items.cpp Script/Functions/Quests.cpp Script/Functions/Stats.cpp
Script/Functions/Spells.cpp Script/Functions/Timer.cpp Script/Functions/Translocations.cpp
Script/Functions/World.cpp
Script/API/TimerAPI.cpp Script/API/PublicFnAPI.cpp
${PawnScript_Sources}

@ -70,6 +70,7 @@ public:
public:
mwmp::InventoryChanges inventoryChangesBuffer;
mwmp::SpellbookChanges spellbookChangesBuffer;
mwmp::JournalChanges journalChangesBuffer;
private:
bool handshakeState;

@ -0,0 +1,79 @@
#include "Quests.hpp"
#include <apps/openmw-mp/Script/ScriptFunctions.hpp>
#include <components/openmw-mp/NetworkMessages.hpp>
#include <apps/openmw-mp/Networking.hpp>
#include <components/misc/stringops.hpp>
using namespace mwmp;
unsigned int QuestFunctions::GetJournalChangesSize(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
return player->journalChanges.count;
}
void QuestFunctions::AddJournalEntry(unsigned short pid, const char* quest, unsigned int index) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
mwmp::JournalItem journalItem;
journalItem.type = JournalItem::ENTRY;
journalItem.quest = quest;
journalItem.index = index;
player->journalChangesBuffer.journalItems.push_back(journalItem);
}
void QuestFunctions::AddJournalIndex(unsigned short pid, const char* quest, unsigned int index) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
mwmp::JournalItem journalItem;
journalItem.type = JournalItem::INDEX;
journalItem.quest = quest;
journalItem.index = index;
player->journalChangesBuffer.journalItems.push_back(journalItem);
}
const char *QuestFunctions::GetJournalItemQuest(unsigned short pid, unsigned int i) noexcept
{
Player *player;
GET_PLAYER(pid, player, "");
if (i >= player->journalChanges.count)
return "invalid";
return player->journalChanges.journalItems.at(i).quest.c_str();
}
int QuestFunctions::GetJournalItemIndex(unsigned short pid, unsigned int i) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
return player->journalChanges.journalItems.at(i).index;
}
int QuestFunctions::GetJournalItemType(unsigned short pid, unsigned int i) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
return player->journalChanges.journalItems.at(i).type;
}
void QuestFunctions::SendJournalChanges(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
std::swap(player->journalChanges, player->journalChangesBuffer);
mwmp::Networking::get().getPlayerController()->GetPacket(ID_GAME_JOURNAL)->Send(player, false);
player->journalChanges = std::move(player->journalChangesBuffer);
player->journalChangesBuffer.journalItems.clear();
}

@ -0,0 +1,33 @@
#ifndef OPENMW_QUESTS_HPP
#define OPENMW_QUESTS_HPP
#define QUESTAPI \
{"GetJournalChangesSize", QuestFunctions::GetJournalChangesSize},\
\
{"AddJournalIndex", QuestFunctions::AddJournalIndex},\
\
{"GetJournalItemQuest", QuestFunctions::GetJournalItemQuest},\
{"GetJournalItemIndex", QuestFunctions::GetJournalItemIndex},\
{"GetJournalItemType", QuestFunctions::GetJournalItemType},\
\
{"SendJournalChanges", QuestFunctions::SendJournalChanges}
class QuestFunctions
{
public:
static unsigned int GetJournalChangesSize(unsigned short pid) noexcept;
static void AddJournalEntry(unsigned short pid, const char* quest, unsigned int index) noexcept;
static void AddJournalIndex(unsigned short pid, const char* quest, unsigned int index) noexcept;
static const char *GetJournalItemQuest(unsigned short pid, unsigned int i) noexcept;
static int GetJournalItemIndex(unsigned short pid, unsigned int i) noexcept;
static int GetJournalItemType(unsigned short pid, unsigned int i) noexcept;
static void SendJournalChanges(unsigned short pid) noexcept;
private:
};
#endif //OPENMW_QUESTS_HPP

@ -10,6 +10,7 @@
#include <Script/Functions/GUI.hpp>
#include <Script/Functions/Stats.hpp>
#include <Script/Functions/Items.hpp>
#include <Script/Functions/Quests.hpp>
#include <Script/Functions/Spells.hpp>
#include <Script/Functions/World.hpp>
#include <RakNetTypes.h>
@ -90,6 +91,7 @@ public:
TRANSLOCATIONFUNCTIONS,
STATSFUNCTIONS,
ITEMAPI,
QUESTAPI,
SPELLAPI,
GUIFUNCTIONS,
CHARCLASSFUNCTIONS,

@ -6,6 +6,7 @@
#include "../mwmechanics/aitravel.hpp"
#include <components/esm/esmwriter.hpp>
#include "../mwbase/environment.hpp"
#include "../mwbase/journal.hpp"
#include "../mwstate/statemanagerimp.hpp"
#include "../mwinput/inputmanagerimp.hpp"
#include "../mwscript/scriptmanagerimp.hpp"
@ -27,6 +28,7 @@
#include "LocalPlayer.hpp"
#include "Networking.hpp"
#include "WorldController.hpp"
#include "Main.hpp"
using namespace mwmp;
@ -643,6 +645,34 @@ void LocalPlayer::addSpells()
}
void LocalPlayer::addJournalItems()
{
for (unsigned int i = 0; i < journalChanges.count; i++)
{
mwmp::JournalItem journalItem = journalChanges.journalItems[i];
if (journalItem.type == JournalItem::ENTRY)
{
MWWorld::CellStore *ptrCellStore = Main::get().getWorldController()->getCell(journalItem.actorCell);
if (!ptrCellStore) continue;
MWWorld::Ptr ptrFound = ptrCellStore->searchExact(journalItem.actorCellRef.mRefID, journalItem.actorCellRef.mRefNum.mIndex);
if (!ptrFound)
{
ptrFound = getPlayerPtr();
}
MWBase::Environment::get().getJournal()->addEntry(journalItem.quest, journalItem.index, ptrFound);
}
else
{
MWBase::Environment::get().getJournal()->setJournalIndex(journalItem.quest, journalItem.index);
}
}
}
void LocalPlayer::removeItems()
{
MWWorld::Ptr ptrPlayer = getPlayerPtr();
@ -998,13 +1028,35 @@ void LocalPlayer::sendSpellRemoval(const ESM::Spell &spell)
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Not implemented.");
}
void LocalPlayer::sendJournalEntry(const std::string& id, int index, const MWWorld::Ptr& actor)
void LocalPlayer::sendJournalEntry(const std::string& quest, int index, const MWWorld::Ptr& actor)
{
journalChanges.journalItems.clear();
mwmp::JournalItem journalItem;
journalItem.type = JournalItem::ENTRY;
journalItem.quest = quest;
journalItem.index = index;
journalItem.actorCell = *actor.getCell()->getCell();
journalItem.actorCellRef.mRefID = actor.getCellRef().getRefId();
journalItem.actorCellRef.mRefNum = actor.getCellRef().getRefNum();
journalChanges.journalItems.push_back(journalItem);
Main::get().getNetworking()->getPlayerPacket(ID_GAME_JOURNAL)->Send(this);
}
void LocalPlayer::sendJournalIndex(const std::string& id, int index)
void LocalPlayer::sendJournalIndex(const std::string& quest, int index)
{
journalChanges.journalItems.clear();
mwmp::JournalItem journalItem;
journalItem.type = JournalItem::INDEX;
journalItem.quest = quest;
journalItem.index = index;
journalChanges.journalItems.push_back(journalItem);
Main::get().getNetworking()->getPlayerPacket(ID_GAME_JOURNAL)->Send(this);
}

@ -38,6 +38,7 @@ namespace mwmp
void addItems();
void addSpells();
void addJournalItems();
void removeItems();
void removeSpells();

@ -348,6 +348,18 @@ void Networking::processPlayerPacket(RakNet::Packet *packet)
}
case ID_GAME_JOURNAL:
{
if (guid == myGuid)
{
if (packet->length == myPacket->headerSize())
{
// Entire journal cannot currently be requested from players
}
else
{
myPacket->Packet(&bsIn, getLocalPlayer(), false);
getLocalPlayer()->addJournalItems();
}
}
break;
}
case ID_GAME_ATTACK:

@ -55,6 +55,10 @@ namespace mwmp
ENTRY = 0,
INDEX = 1
};
ESM::Cell actorCell;
ESM::CellRef actorCellRef;
int type; // 0 - An entire entry, 1 - An index
};
@ -209,6 +213,7 @@ namespace mwmp
double hour;
InventoryChanges inventoryChanges;
SpellbookChanges spellbookChanges;
JournalChanges journalChanges;
bool consoleAllowed;
bool ignorePosPacket;
ESM::ActiveSpells activeSpells;

@ -12,4 +12,36 @@ PacketJournal::PacketJournal(RakNet::RakPeerInterface *peer) : PlayerPacket(peer
void PacketJournal::Packet(RakNet::BitStream *bs, BasePlayer *player, bool send)
{
PlayerPacket::Packet(bs, player, send);
if (!send)
player->journalChanges.journalItems.clear();
else
player->journalChanges.count = (unsigned int)(player->journalChanges.journalItems.size());
RW(player->journalChanges.count, send);
for (unsigned int i = 0; i < player->journalChanges.count; i++)
{
JournalItem journalItem;
if (send)
journalItem = player->journalChanges.journalItems[i];
RW(journalItem.type, send);
RW(journalItem.quest, send);
RW(journalItem.index, send);
if (journalItem.type == JournalItem::ENTRY)
{
RW(journalItem.actorCellRef.mRefID, send);
RW(journalItem.actorCellRef.mRefNum.mIndex, send);
RW(journalItem.actorCell.mData.mFlags, send);
RW(journalItem.actorCell.mData.mX, send);
RW(journalItem.actorCell.mData.mY, send);
RW(journalItem.actorCell.mName, send);
}
if (!send)
player->journalChanges.journalItems.push_back(journalItem);
}
}

Loading…
Cancel
Save