[General] Rework PacketPlayerFaction

sol2-server-rewrite
Koncord 7 years ago
parent 29ba07fe8c
commit 7e5b929ea2

@ -14,7 +14,6 @@ void Factions::Init(LuaState &lua)
{ {
lua.getState()->new_usertype<Factions>("Factions", lua.getState()->new_usertype<Factions>("Factions",
"addFaction", &Factions::addFaction, "addFaction", &Factions::addFaction,
"changesAction", sol::property(&Factions::getFactionChangesAction, &Factions::setFactionChangesAction),
"getFaction", &Factions::getFaction, "getFaction", &Factions::getFaction,
"setFaction", &Factions::setFaction, "setFaction", &Factions::setFaction,
"clear", &Factions::clear, "clear", &Factions::clear,
@ -40,20 +39,9 @@ void Factions::processUpdate()
clear(); clear();
} }
mwmp::FactionChanges::Type Factions::getFactionChangesAction() const void Factions::addFaction(const Faction &faction)
{ {
return player->factionChanges.action; player->factionChanges.factions.emplace_back(faction.faction);
}
void Factions::setFactionChangesAction(mwmp::FactionChanges::Type action)
{
player->factionChanges.action = action;
setChanged();
}
void Factions::addFaction(Faction faction)
{
player->factionChanges.factions.push_back(faction.faction);
setChanged(); setChanged();
} }
@ -63,7 +51,7 @@ Faction Factions::getFaction(int id) const
return Faction(player->factionChanges.factions.at(id)); return Faction(player->factionChanges.factions.at(id));
} }
void Factions::setFaction(int id, Faction faction) void Factions::setFaction(int id, const Faction &faction)
{ {
player->factionChanges.factions.at(id) = faction.faction; player->factionChanges.factions.at(id) = faction.faction;
setChanged(); setChanged();
@ -112,6 +100,7 @@ int Faction::getFactionRank() const
void Faction::setFactionRank(unsigned int rank) void Faction::setFactionRank(unsigned int rank)
{ {
faction.rankChanged();
faction.rank = rank; faction.rank = rank;
} }
@ -122,6 +111,7 @@ bool Faction::getFactionExpulsionState() const
void Faction::setFactionExpulsionState(bool expulsionState) void Faction::setFactionExpulsionState(bool expulsionState)
{ {
faction.expulsionChanged();
faction.isExpelled = expulsionState; faction.isExpelled = expulsionState;
} }
@ -132,5 +122,6 @@ int Faction::getFactionReputation() const
void Faction::setFactionReputation(int reputation) void Faction::setFactionReputation(int reputation)
{ {
faction.reputationChanged();
faction.reputation = reputation; faction.reputation = reputation;
} }

@ -42,13 +42,9 @@ public:
explicit Factions(Player *player); explicit Factions(Player *player);
~Factions(); ~Factions();
void addFaction(const Faction &faction);
mwmp::FactionChanges::Type getFactionChangesAction() const;
void setFactionChangesAction(mwmp::FactionChanges::Type action);
void addFaction(Faction faction);
Faction getFaction(int id) const; Faction getFaction(int id) const;
void setFaction(int id, Faction faction); void setFaction(int id, const Faction &faction);
size_t size() const; size_t size() const;
void clear(); void clear();

@ -1083,7 +1083,7 @@ void LocalPlayer::setFactions()
if (!ptrNpcStats.isInFaction(faction.factionId)) if (!ptrNpcStats.isInFaction(faction.factionId))
ptrNpcStats.joinFaction(faction.factionId); ptrNpcStats.joinFaction(faction.factionId);
if (factionChanges.action == mwmp::FactionChanges::Type::Rank) if (faction.isRankChanged())
{ {
// While the faction rank is different in the packet than in the NpcStats, // While the faction rank is different in the packet than in the NpcStats,
// adjust the NpcStats accordingly // adjust the NpcStats accordingly
@ -1095,7 +1095,8 @@ void LocalPlayer::setFactions()
ptrNpcStats.lowerRank(faction.factionId); ptrNpcStats.lowerRank(faction.factionId);
} }
} }
else if (factionChanges.action == mwmp::FactionChanges::Type::Expulsion)
if (faction.isExpulsionChanged())
{ {
// If the expelled state is different in the packet than in the NpcStats, // If the expelled state is different in the packet than in the NpcStats,
// adjust the NpcStats accordingly // adjust the NpcStats accordingly
@ -1108,7 +1109,7 @@ void LocalPlayer::setFactions()
} }
} }
else if (factionChanges.action == mwmp::FactionChanges::Type::Reputation) if (faction.isReputationChanged())
ptrNpcStats.setFactionReputation(faction.factionId, faction.reputation); ptrNpcStats.setFactionReputation(faction.factionId, faction.reputation);
} }
} }
@ -1326,11 +1327,11 @@ void LocalPlayer::sendJournalIndex(const std::string& quest, int index)
void LocalPlayer::sendFactionRank(const std::string& factionId, int rank) void LocalPlayer::sendFactionRank(const std::string& factionId, int rank)
{ {
factionChanges.factions.clear(); factionChanges.factions.clear();
factionChanges.action = FactionChanges::Type::Rank;
mwmp::Faction faction; mwmp::Faction faction;
faction.factionId = factionId; faction.factionId = factionId;
faction.rank = rank; faction.rank = rank;
faction.rankChanged();
factionChanges.factions.push_back(faction); factionChanges.factions.push_back(faction);
@ -1341,11 +1342,11 @@ void LocalPlayer::sendFactionRank(const std::string& factionId, int rank)
void LocalPlayer::sendFactionExpulsionState(const std::string& factionId, bool isExpelled) void LocalPlayer::sendFactionExpulsionState(const std::string& factionId, bool isExpelled)
{ {
factionChanges.factions.clear(); factionChanges.factions.clear();
factionChanges.action = FactionChanges::Type::Expulsion;
mwmp::Faction faction; mwmp::Faction faction;
faction.factionId = factionId; faction.factionId = factionId;
faction.isExpelled = isExpelled; faction.isExpelled = isExpelled;
faction.expulsionChanged();
factionChanges.factions.push_back(faction); factionChanges.factions.push_back(faction);
@ -1356,11 +1357,11 @@ void LocalPlayer::sendFactionExpulsionState(const std::string& factionId, bool i
void LocalPlayer::sendFactionReputation(const std::string& factionId, int reputation) void LocalPlayer::sendFactionReputation(const std::string& factionId, int reputation)
{ {
factionChanges.factions.clear(); factionChanges.factions.clear();
factionChanges.action = FactionChanges::Type::Reputation;
mwmp::Faction faction; mwmp::Faction faction;
faction.factionId = factionId; faction.factionId = factionId;
faction.reputation = reputation; faction.reputation = reputation;
faction.reputationChanged();
factionChanges.factions.push_back(faction); factionChanges.factions.push_back(faction);

@ -59,10 +59,26 @@ namespace mwmp
struct Faction struct Faction
{ {
enum ChangesMask
{
Rank = 1,
Expulsion = 2,
Reputation = 4
};
inline bool isRankChanged() const { return (changes & ChangesMask::Rank) > 0; }
inline bool isExpulsionChanged() const { return (changes & ChangesMask::Expulsion) > 0; }
inline bool isReputationChanged() const { return (changes & ChangesMask::Reputation) > 0; }
inline void rankChanged() { changes |= ChangesMask::Rank; };
inline void expulsionChanged() { changes |= ChangesMask::Expulsion; };
inline void reputationChanged() { changes |= ChangesMask::Reputation; };
std::string factionId; std::string factionId;
int rank; int rank;
int reputation; int reputation;
bool isExpelled; bool isExpelled;
uint8_t changes = 0;
}; };
struct Topic struct Topic
@ -118,15 +134,6 @@ namespace mwmp
struct FactionChanges struct FactionChanges
{ {
std::vector<Faction> factions; std::vector<Faction> factions;
enum class Type: uint8_t
{
Rank = 0,
Expulsion,
Reputation
};
Type action;
}; };
struct TopicChanges struct TopicChanges

@ -12,9 +12,6 @@ PacketPlayerFaction::PacketPlayerFaction(RakNet::RakPeerInterface *peer) : Playe
void PacketPlayerFaction::Packet(RakNet::BitStream *bs, bool send) void PacketPlayerFaction::Packet(RakNet::BitStream *bs, bool send)
{ {
PlayerPacket::Packet(bs, send); PlayerPacket::Packet(bs, send);
RW(player->factionChanges.action, send);
uint32_t count; uint32_t count;
if (send) if (send)
@ -30,15 +27,17 @@ void PacketPlayerFaction::Packet(RakNet::BitStream *bs, bool send)
for (auto &&faction : player->factionChanges.factions) for (auto &&faction : player->factionChanges.factions)
{ {
RW(faction.changes, send, true);
RW(faction.factionId, send, true); RW(faction.factionId, send, true);
if (player->factionChanges.action == FactionChanges::Type::Rank) if (faction.isRankChanged())
RW(faction.rank, send); RW(faction.rank, send);
if (player->factionChanges.action == FactionChanges::Type::Expulsion) if (faction.isExpulsionChanged())
RW(faction.isExpelled, send); RW(faction.isExpelled, send);
if (player->factionChanges.action == FactionChanges::Type::Reputation) if (faction.isReputationChanged())
RW(faction.reputation, send); RW(faction.reputation, send);
} }
} }

Loading…
Cancel
Save