diff --git a/apps/openmw-mp/CMakeLists.txt b/apps/openmw-mp/CMakeLists.txt index b23e5eb87..463d99029 100644 --- a/apps/openmw-mp/CMakeLists.txt +++ b/apps/openmw-mp/CMakeLists.txt @@ -77,10 +77,10 @@ set(SERVER Script/Functions/Actors.cpp Script/Functions/World.cpp Script/Functions/Miscellaneous.cpp - Script/Functions/CharClass.cpp Script/Functions/Chat.cpp Script/Functions/GUI.cpp - Script/Functions/Items.cpp Script/Functions/Quests.cpp Script/Functions/Stats.cpp - Script/Functions/Spells.cpp Script/Functions/Timer.cpp Script/Functions/Positions.cpp - Script/Functions/Cells.cpp + Script/Functions/Cells.cpp Script/Functions/CharClass.cpp Script/Functions/Chat.cpp + Script/Functions/Factions.cpp Script/Functions/GUI.cpp Script/Functions/Items.cpp + Script/Functions/Positions.cpp Script/Functions/Quests.cpp Script/Functions/Spells.cpp + Script/Functions/Stats.cpp Script/Functions/Timer.cpp ProcessorInitializer.cpp PlayerProcessor.cpp ActorProcessor.cpp WorldProcessor.cpp diff --git a/apps/openmw-mp/Player.hpp b/apps/openmw-mp/Player.hpp index f5d807102..e6fb95146 100644 --- a/apps/openmw-mp/Player.hpp +++ b/apps/openmw-mp/Player.hpp @@ -74,6 +74,7 @@ public: mwmp::InventoryChanges inventoryChangesBuffer; mwmp::SpellbookChanges spellbookChangesBuffer; mwmp::JournalChanges journalChangesBuffer; + mwmp::FactionChanges factionChangesBuffer; private: CellController::TContainer cells; diff --git a/apps/openmw-mp/Script/Functions/Factions.cpp b/apps/openmw-mp/Script/Functions/Factions.cpp new file mode 100644 index 000000000..807978397 --- /dev/null +++ b/apps/openmw-mp/Script/Functions/Factions.cpp @@ -0,0 +1,67 @@ +#include "Factions.hpp" +#include +#include +#include +#include + +using namespace mwmp; + +unsigned int FactionFunctions::GetFactionChangesSize(unsigned short pid) noexcept +{ + Player *player; + GET_PLAYER(pid, player, 0); + + return player->factionChanges.count; +} + +void FactionFunctions::AddFaction(unsigned short pid, const char* factionId, unsigned int rank, bool isExpelled) noexcept +{ + Player *player; + GET_PLAYER(pid, player, ); + + mwmp::Faction faction; + faction.factionId = factionId; + faction.rank = rank; + faction.isExpelled = isExpelled; + + player->factionChangesBuffer.factions.push_back(faction); +} + +const char *FactionFunctions::GetFactionId(unsigned short pid, unsigned int i) noexcept +{ + Player *player; + GET_PLAYER(pid, player, ""); + + if (i >= player->factionChanges.count) + return "invalid"; + + return player->factionChanges.factions.at(i).factionId.c_str(); +} + +int FactionFunctions::GetFactionRank(unsigned short pid, unsigned int i) noexcept +{ + Player *player; + GET_PLAYER(pid, player, 0); + + return player->factionChanges.factions.at(i).rank; +} + +int FactionFunctions::GetFactionExpelledState(unsigned short pid, unsigned int i) noexcept +{ + Player *player; + GET_PLAYER(pid, player, 0); + + return player->factionChanges.factions.at(i).isExpelled; +} + +void FactionFunctions::SendFactionChanges(unsigned short pid) noexcept +{ + Player *player; + GET_PLAYER(pid, player, ); + + std::swap(player->factionChanges, player->factionChangesBuffer); + mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_FACTION)->setPlayer(player); + mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_FACTION)->Send(false); + player->factionChanges = std::move(player->factionChangesBuffer); + player->factionChangesBuffer.factions.clear(); +} diff --git a/apps/openmw-mp/Script/Functions/Factions.hpp b/apps/openmw-mp/Script/Functions/Factions.hpp new file mode 100644 index 000000000..b18d55213 --- /dev/null +++ b/apps/openmw-mp/Script/Functions/Factions.hpp @@ -0,0 +1,32 @@ +#ifndef OPENMW_FACTIONAPI_HPP +#define OPENMW_FACTIONAPI_HPP + +#define FACTIONAPI \ + {"GetFactionChangesSize", FactionFunctions::GetFactionChangesSize},\ + \ + {"AddFaction", FactionFunctions::AddFaction},\ + \ + {"GetFactionId", FactionFunctions::GetFactionId},\ + {"GetFactionRank", FactionFunctions::GetFactionRank},\ + {"GetFactionExpelledState", FactionFunctions::GetFactionExpelledState},\ + \ + {"SendFactionChanges", FactionFunctions::SendFactionChanges} + +class FactionFunctions +{ +public: + + static unsigned int GetFactionChangesSize(unsigned short pid) noexcept; + + static void AddFaction(unsigned short pid, const char* factionId, unsigned int rank, bool isExpelled) noexcept; + + static const char *GetFactionId(unsigned short pid, unsigned int i) noexcept; + static int GetFactionRank(unsigned short pid, unsigned int i) noexcept; + static int GetFactionExpelledState(unsigned short pid, unsigned int i) noexcept; + + static void SendFactionChanges(unsigned short pid) noexcept; +private: + +}; + +#endif //OPENMW_FACTIONAPI_HPP diff --git a/apps/openmw-mp/Script/ScriptFunctions.hpp b/apps/openmw-mp/Script/ScriptFunctions.hpp index 1596ebaa1..2ce3dd210 100644 --- a/apps/openmw-mp/Script/ScriptFunctions.hpp +++ b/apps/openmw-mp/Script/ScriptFunctions.hpp @@ -12,6 +12,7 @@ #include