openmw-tes3coop/components/openmw-mp/Base/BasePlayer.hpp
David Cernat 78441c769a [General] Rework PlayerSkill packets so they are of minimal size
Previously, whenever a single skill value changed for a player, that player then sent a PlayerSkill packet with all values for all 27 skills, plus the player's progress towards the next level and the bonuses to each attribute on the next level up as the result of sklll increases thus far.

This commit makes PlayerSkill contain only the values of specific skills, moves the player's progress towards the next level to PlayerLevel packets, and moves the bonuses to each attribute on the next level up to PlayerAttribute packets.

Players now also send a PlayerSkill packet whenever their progress towards a new point in a skill changes. This was previously avoided so as to not have massive packet spam.

(cherry picked from commit ef79a98544)
2018-04-19 15:18:38 +03:00

332 lines
6.8 KiB
C++

//
// Created by koncord on 07.01.16.
//
#ifndef OPENMW_BASEPLAYER_HPP
#define OPENMW_BASEPLAYER_HPP
#include <components/esm/loadcell.hpp>
#include <components/esm/loadcrea.hpp>
#include <components/esm/loadnpc.hpp>
#include <components/esm/npcstats.hpp>
#include <components/esm/creaturestats.hpp>
#include <components/esm/loadclas.hpp>
#include <components/esm/loadspel.hpp>
#include <components/openmw-mp/Base/BaseStructs.hpp>
#include <RakNetTypes.h>
namespace mwmp
{
struct CurrentContainer
{
std::string refId;
int refNumIndex;
int mpNum;
bool loot;
};
struct JournalItem
{
std::string quest;
int index;
enum JOURNAL_ITEM_TYPE
{
ENTRY = 0,
INDEX = 1
};
std::string actorRefId;
int type; // 0 - An entire entry, 1 - An index
};
struct Faction
{
std::string factionId;
int rank;
int reputation;
bool isExpelled;
};
struct Topic
{
std::string topicId;
};
struct Kill
{
std::string refId;
int number;
};
struct Book
{
std::string bookId;
};
struct QuickKey
{
std::string itemId;
enum QUICKKEY_TYPE
{
ITEM = 0,
MAGIC = 1,
ITEM_MAGIC = 2,
UNASSIGNED = 3
};
unsigned short slot;
int type;
};
struct CellState
{
ESM::Cell cell;
enum CELL_STATE_ACTION
{
LOAD = 0,
UNLOAD = 1
};
int type; // 0 - Cell load, 1 - Cell unload
};
// Track only the indexes of the skills that have been changed,
// with the skill values themselves being stored in npcStats.mSkills
struct SkillChanges
{
std::vector<int> skillIndexes;
unsigned int count;
};
struct JournalChanges
{
std::vector<JournalItem> journalItems;
unsigned int count;
};
struct FactionChanges
{
std::vector<Faction> factions;
unsigned int count;
enum FACTION_ACTION
{
RANK = 0,
EXPULSION = 1,
REPUTATION = 2
};
int action; // 0 - Rank, 1 - Expulsion state, 2 - Both
};
struct TopicChanges
{
std::vector<Topic> topics;
unsigned int count;
};
struct KillChanges
{
std::vector<Kill> kills;
unsigned int count;
};
struct BookChanges
{
std::vector<Book> books;
unsigned int count;
};
struct MapChanges
{
std::vector<ESM::Cell> cellsExplored;
unsigned int count;
};
struct InventoryChanges
{
std::vector<Item> items;
unsigned int count;
enum ACTION_TYPE
{
SET = 0,
ADD,
REMOVE
};
int action; // 0 - Clear and set in entirety, 1 - Add item, 2 - Remove item
};
struct SpellbookChanges
{
std::vector<ESM::Spell> spells;
unsigned int count;
enum ACTION_TYPE
{
SET = 0,
ADD,
REMOVE
};
int action; // 0 - Clear and set in entirety, 1 - Add spell, 2 - Remove spell
};
struct QuickKeyChanges
{
std::vector<QuickKey> quickKeys;
unsigned int count;
};
struct CellStateChanges
{
std::vector<CellState> cellStates;
unsigned int count;
};
enum RESURRECT_TYPE
{
REGULAR = 0,
IMPERIAL_SHRINE,
TRIBUNAL_TEMPLE
};
enum MISCELLANEOUS_CHANGE_TYPE
{
MARK_LOCATION = 0,
SELECTED_SPELL
};
class BasePlayer
{
public:
struct CharGenState
{
int currentStage, endStage;
bool isFinished;
};
struct GUIMessageBox
{
int id;
int type;
enum GUI_TYPE
{
MessageBox = 0,
CustomMessageBox,
InputDialog,
PasswordDialog,
ListBox
};
std::string label;
std::string note;
std::string buttons;
std::string data;
};
BasePlayer(RakNet::RakNetGUID guid) : guid(guid)
{
inventoryChanges.action = 0;
inventoryChanges.count = 0;
spellbookChanges.action = 0;
spellbookChanges.count = 0;
displayCreatureName = false;
resetStats = false;
}
BasePlayer()
{
}
RakNet::RakNetGUID guid;
GUIMessageBox guiMessageBox;
int month;
int day;
double hour;
SkillChanges skillChanges;
InventoryChanges inventoryChanges;
SpellbookChanges spellbookChanges;
QuickKeyChanges quickKeyChanges;
JournalChanges journalChanges;
FactionChanges factionChanges;
TopicChanges topicChanges;
KillChanges killChanges;
BookChanges bookChanges;
MapChanges mapChanges;
CellStateChanges cellStateChanges;
ESM::ActiveSpells activeSpells;
CurrentContainer currentContainer;
int difficulty;
int enforcedLogLevel;
float physicsFramerate;
bool consoleAllowed;
bool bedRestAllowed;
bool wildernessRestAllowed;
bool waitAllowed;
bool ignorePosPacket;
unsigned int movementFlags;
char movementAnim;
char drawState;
bool isFlying;
ESM::Position position;
ESM::Position direction;
ESM::Position previousCellPosition;
ESM::Cell cell;
ESM::NPC npc;
ESM::NpcStats npcStats;
ESM::Creature creature;
ESM::CreatureStats creatureStats;
ESM::Class charClass;
Item equipedItems[19];
Attack attack;
std::string birthsign;
std::string chatMessage;
CharGenState charGenState;
std::string passw;
std::string sound;
Animation animation;
bool resetStats;
float scale;
bool isWerewolf;
bool displayCreatureName;
std::string creatureRefId;
bool isChangingRegion;
std::string deathReason;
int jailDays;
bool ignoreJailTeleportation;
bool ignoreJailSkillIncreases;
std::string jailProgressText;
std::string jailEndText;
unsigned int resurrectType;
unsigned int miscellaneousChangeType;
ESM::Cell markCell;
ESM::Position markPosition;
std::string selectedSpellId;
bool isReceivingQuickKeys;
bool isPlayingAnimation;
bool diedSinceArrestAttempt;
};
}
#endif //OPENMW_BASEPLAYER_HPP