diff --git a/apps/openmw-mp/Script/Functions/Factions.cpp b/apps/openmw-mp/Script/Functions/Factions.cpp index d5dbc1ed5..04736a3f1 100644 --- a/apps/openmw-mp/Script/Functions/Factions.cpp +++ b/apps/openmw-mp/Script/Functions/Factions.cpp @@ -6,6 +6,9 @@ using namespace mwmp; +Faction tempFaction; +const Faction emptyFaction = {}; + void FactionFunctions::InitializeFactionChanges(unsigned short pid) noexcept { Player *player; @@ -57,6 +60,14 @@ bool FactionFunctions::GetFactionExpelledState(unsigned short pid, unsigned int return player->factionChanges.factions.at(i).isExpelled; } +int FactionFunctions::GetFactionReputation(unsigned short pid, unsigned int i) noexcept +{ + Player *player; + GET_PLAYER(pid, player, 0); + + return player->factionChanges.factions.at(i).reputation; +} + void FactionFunctions::SetFactionChangesAction(unsigned short pid, unsigned char action) noexcept { Player *player; @@ -65,17 +76,34 @@ void FactionFunctions::SetFactionChangesAction(unsigned short pid, unsigned char player->factionChanges.action = action; } -void FactionFunctions::AddFaction(unsigned short pid, const char* factionId, unsigned int rank, bool isExpelled) noexcept +void FactionFunctions::SetFactionId(const char* factionId) noexcept +{ + tempFaction.factionId = factionId; +} + +void FactionFunctions::SetFactionRank(unsigned int rank) noexcept +{ + tempFaction.rank = rank; +} + +void FactionFunctions::SetFactionExpulsionState(bool isExpelled) noexcept +{ + tempFaction.isExpelled = isExpelled; +} + +void FactionFunctions::SetFactionReputation(int reputation) noexcept +{ + tempFaction.reputation = reputation; +} + +void FactionFunctions::AddFaction(unsigned short pid) noexcept { Player *player; GET_PLAYER(pid, player, ); - mwmp::Faction faction; - faction.factionId = factionId; - faction.rank = rank; - faction.isExpelled = isExpelled; + player->factionChanges.factions.push_back(tempFaction); - player->factionChanges.factions.push_back(faction); + tempFaction = emptyFaction; } void FactionFunctions::SendFactionChanges(unsigned short pid, bool toOthers) noexcept diff --git a/apps/openmw-mp/Script/Functions/Factions.hpp b/apps/openmw-mp/Script/Functions/Factions.hpp index 8b957ce29..321e73dd8 100644 --- a/apps/openmw-mp/Script/Functions/Factions.hpp +++ b/apps/openmw-mp/Script/Functions/Factions.hpp @@ -10,8 +10,14 @@ {"GetFactionId", FactionFunctions::GetFactionId},\ {"GetFactionRank", FactionFunctions::GetFactionRank},\ {"GetFactionExpelledState", FactionFunctions::GetFactionExpelledState},\ + {"GetFactionReputation", FactionFunctions::GetFactionReputation},\ \ {"SetFactionChangesAction", FactionFunctions::SetFactionChangesAction},\ + {"SetFactionId", FactionFunctions::SetFactionId},\ + {"SetFactionRank", FactionFunctions::SetFactionRank},\ + {"SetFactionExpulsionState", FactionFunctions::SetFactionExpulsionState},\ + {"SetFactionReputation", FactionFunctions::SetFactionReputation},\ + \ {"AddFaction", FactionFunctions::AddFaction},\ \ {"SendFactionChanges", FactionFunctions::SendFactionChanges} @@ -28,9 +34,15 @@ public: static const char *GetFactionId(unsigned short pid, unsigned int i) noexcept; static int GetFactionRank(unsigned short pid, unsigned int i) noexcept; static bool GetFactionExpelledState(unsigned short pid, unsigned int i) noexcept; + static int GetFactionReputation(unsigned short pid, unsigned int i) noexcept; static void SetFactionChangesAction(unsigned short pid, unsigned char action) noexcept; - static void AddFaction(unsigned short pid, const char* factionId, unsigned int rank, bool isExpelled) noexcept; + static void SetFactionId(const char* factionId) noexcept; + static void SetFactionRank(unsigned int rank) noexcept; + static void SetFactionExpulsionState(bool isExpelled) noexcept; + static void SetFactionReputation(int reputation) noexcept; + + static void AddFaction(unsigned short pid) noexcept; static void SendFactionChanges(unsigned short pid, bool toOthers = false) noexcept; private: diff --git a/apps/openmw/mwmp/LocalPlayer.cpp b/apps/openmw/mwmp/LocalPlayer.cpp index 67ef8fdbb..c7418c72b 100644 --- a/apps/openmw/mwmp/LocalPlayer.cpp +++ b/apps/openmw/mwmp/LocalPlayer.cpp @@ -982,6 +982,9 @@ void LocalPlayer::setFactions() ptrNpcStats.clearExpelled(faction.factionId); } } + + else if (factionChanges.action == mwmp::FactionChanges::REPUTATION) + ptrNpcStats.setFactionReputation(faction.factionId, faction.reputation); } } @@ -1189,6 +1192,21 @@ void LocalPlayer::sendFactionExpulsionState(const std::string& factionId, bool i getNetworking()->getPlayerPacket(ID_PLAYER_FACTION)->Send(); } +void LocalPlayer::sendFactionReputation(const std::string& factionId, int reputation) +{ + factionChanges.factions.clear(); + factionChanges.action = FactionChanges::REPUTATION; + + mwmp::Faction faction; + faction.factionId = factionId; + faction.reputation = reputation; + + factionChanges.factions.push_back(faction); + + getNetworking()->getPlayerPacket(ID_PLAYER_FACTION)->setPlayer(this); + getNetworking()->getPlayerPacket(ID_PLAYER_FACTION)->Send(); +} + void LocalPlayer::sendTopic(const std::string& topicId) { topicChanges.topics.clear(); diff --git a/apps/openmw/mwmp/LocalPlayer.hpp b/apps/openmw/mwmp/LocalPlayer.hpp index c67723b75..65722f90e 100644 --- a/apps/openmw/mwmp/LocalPlayer.hpp +++ b/apps/openmw/mwmp/LocalPlayer.hpp @@ -75,6 +75,7 @@ namespace mwmp void sendJournalIndex(const std::string& quest, int index); void sendFactionRank(const std::string& factionId, int rank); void sendFactionExpulsionState(const std::string& factionId, bool isExpelled); + void sendFactionReputation(const std::string& factionId, int reputation); void sendTopic(const std::string& topic); void sendKill(const std::string& refId, int number); void sendBook(const std::string& bookId); diff --git a/apps/openmw/mwscript/statsextensions.cpp b/apps/openmw/mwscript/statsextensions.cpp index e782fd091..af6fe5f97 100644 --- a/apps/openmw/mwscript/statsextensions.cpp +++ b/apps/openmw/mwscript/statsextensions.cpp @@ -609,7 +609,8 @@ namespace MWScript Send an ID_PLAYER_FACTION packet every time a player joins a faction */ - mwmp::Main::get().getLocalPlayer()->sendFactionRank(factionID, player.getClass().getNpcStats(player).getFactionRanks().at(factionID)); + int newRank = player.getClass().getNpcStats(player).getFactionRanks().at(factionID); + mwmp::Main::get().getLocalPlayer()->sendFactionRank(factionID, newRank); /* End of tes3mp addition */ @@ -658,7 +659,8 @@ namespace MWScript Send an ID_PLAYER_FACTION packet every time a player rises in a faction */ - mwmp::Main::get().getLocalPlayer()->sendFactionRank(factionID, player.getClass().getNpcStats(player).getFactionRanks().at(factionID)); + int newRank = player.getClass().getNpcStats(player).getFactionRanks().at(factionID); + mwmp::Main::get().getLocalPlayer()->sendFactionRank(factionID, newRank); /* End of tes3mp addition */ @@ -700,7 +702,8 @@ namespace MWScript Send an ID_PLAYER_FACTION packet every time a player falls in a faction */ - mwmp::Main::get().getLocalPlayer()->sendFactionRank(factionID, player.getClass().getNpcStats(player).getFactionRanks().at(factionID)); + int newRank = player.getClass().getNpcStats(player).getFactionRanks().at(factionID); + mwmp::Main::get().getLocalPlayer()->sendFactionRank(factionID, newRank); /* End of tes3mp addition */ @@ -877,6 +880,16 @@ namespace MWScript MWWorld::Ptr player = MWMechanics::getPlayer(); player.getClass().getNpcStats (player).setFactionReputation (factionId, value); + + /* + Start of tes3mp addition + + Send an ID_PLAYER_FACTION packet every time a player's faction reputation changes + */ + mwmp::Main::get().getLocalPlayer()->sendFactionReputation(Misc::StringUtils::lowerCase(factionId), value); + /* + End of tes3mp addition + */ } }; @@ -913,6 +926,17 @@ namespace MWScript player.getClass().getNpcStats (player).setFactionReputation (factionId, player.getClass().getNpcStats (player).getFactionReputation (factionId)+ value); + + /* + Start of tes3mp addition + + Send an ID_PLAYER_FACTION packet every time a player's faction reputation changes + */ + int newReputation = player.getClass().getNpcStats(player).getFactionReputation(factionId); + mwmp::Main::get().getLocalPlayer()->sendFactionReputation(Misc::StringUtils::lowerCase(factionId), newReputation); + /* + End of tes3mp addition + */ } }; diff --git a/components/openmw-mp/Base/BasePlayer.hpp b/components/openmw-mp/Base/BasePlayer.hpp index 387ee292a..15862de98 100644 --- a/components/openmw-mp/Base/BasePlayer.hpp +++ b/components/openmw-mp/Base/BasePlayer.hpp @@ -45,6 +45,7 @@ namespace mwmp { std::string factionId; int rank; + int reputation; bool isExpelled; }; @@ -91,7 +92,8 @@ namespace mwmp enum FACTION_ACTION { RANK = 0, - EXPULSION = 1 + EXPULSION = 1, + REPUTATION = 2 }; int action; // 0 - Rank, 1 - Expulsion state, 2 - Both diff --git a/components/openmw-mp/Packets/Player/PacketPlayerFaction.cpp b/components/openmw-mp/Packets/Player/PacketPlayerFaction.cpp index e107d4994..e81750b42 100644 --- a/components/openmw-mp/Packets/Player/PacketPlayerFaction.cpp +++ b/components/openmw-mp/Packets/Player/PacketPlayerFaction.cpp @@ -37,6 +37,9 @@ void PacketPlayerFaction::Packet(RakNet::BitStream *bs, bool send) if (player->factionChanges.action == FactionChanges::EXPULSION) RW(faction.isExpelled, send); + if (player->factionChanges.action == FactionChanges::REPUTATION) + RW(faction.reputation, send); + if (!send) player->factionChanges.factions.push_back(faction); }