diff --git a/apps/openmw-mp/CMakeLists.txt b/apps/openmw-mp/CMakeLists.txt index 5dfb2a98f..2d06394e8 100644 --- a/apps/openmw-mp/CMakeLists.txt +++ b/apps/openmw-mp/CMakeLists.txt @@ -51,7 +51,7 @@ set(SERVER Script/Script.cpp Script/ScriptFunction.cpp Script/ScriptFunctions.cpp Script/Functions/Translocations.cpp Script/Functions/Stats.cpp Script/Functions/Items.cpp - Script/Functions/Timer.cpp Script/Functions/Chat.cpp Script/Functions/GUI.cpp + Script/Functions/Timer.cpp Script/Functions/Chat.cpp Script/Functions/GUI.cpp Script/Functions/CharClass.cpp Script/Functions/CharClass.hpp Script/API/TimerAPI.cpp Script/API/PublicFnAPI.cpp ${PawnScript_Sources} ${LuaScript_Sources} diff --git a/apps/openmw-mp/Networking.cpp b/apps/openmw-mp/Networking.cpp index 5cf1ffeba..d28c8ce79 100644 --- a/apps/openmw-mp/Networking.cpp +++ b/apps/openmw-mp/Networking.cpp @@ -316,6 +316,13 @@ void Networking::Update(RakNet::Packet *packet) break; } + case ID_GAME_CHARCLASS: + { + DEBUG_PRINTF("ID_GAME_CHARCLASS\n"); + myPacket->Read(player); + break; + } + default: printf("Message with identifier %i has arrived.\n", packet->data[0]); break; diff --git a/apps/openmw-mp/Script/Functions/CharClass.cpp b/apps/openmw-mp/Script/Functions/CharClass.cpp new file mode 100644 index 000000000..b98ca623c --- /dev/null +++ b/apps/openmw-mp/Script/Functions/CharClass.cpp @@ -0,0 +1,134 @@ +// +// Created by koncord on 29.08.16. +// + +#include "CharClass.hpp" +#include +#include +#include + +using namespace std; +using namespace ESM; + +void CharClassFunctions::SendClass(unsigned short pid) noexcept +{ + Player *player; + GET_PLAYER(pid, player,); + + mwmp::Networking::Get().GetController()->GetPacket(ID_GAME_CHARCLASS)->Send(player, false); +} + +void CharClassFunctions::SetDefaultClass(unsigned short pid, const char *id) noexcept +{ + Player *player; + GET_PLAYER(pid, player,); + player->klass.mId = id; +} +void CharClassFunctions::SetClassName(unsigned short pid, const char *name) noexcept +{ + Player *player; + GET_PLAYER(pid, player,); + player->klass.mName = name; + player->klass.mId = ""; +} +void CharClassFunctions::SetClassDesc(unsigned short pid, const char *desc) noexcept +{ + Player *player; + GET_PLAYER(pid, player,); + player->klass.mDescription = desc; +} +void CharClassFunctions::SetClassMajorAttribute(unsigned short pid, unsigned char slot, int attrId) noexcept +{ + Player *player; + GET_PLAYER(pid, player,); + + if(slot > 1) + throw invalid_argument("Incorrect attribute slot id"); + + player->klass.mData.mAttribute[slot] = attrId; + +} +void CharClassFunctions::SetClassSpecialization(unsigned short pid, int spec) noexcept +{ + Player *player; + GET_PLAYER(pid, player,); + player->klass.mData.mSpecialization = spec; +} +void CharClassFunctions::SetClassMajorSkill(unsigned short pid, unsigned char slot, int skillId) noexcept +{ + Player *player; + GET_PLAYER(pid, player,); + if(slot > 4) + throw invalid_argument("Incorrect skill slot id"); + player->klass.mData.mSkills[slot][1] = skillId; +} +void CharClassFunctions::SetClassMinorSkill(unsigned short pid, unsigned char slot, int skillId) noexcept +{ + Player *player; + GET_PLAYER(pid, player,); + if(slot > 4) + throw invalid_argument("Incorrect skill slot id"); + player->klass.mData.mSkills[slot][0] = skillId; +} + +int CharClassFunctions::IsClassDefault(unsigned short pid) noexcept +{ + Player *player; + GET_PLAYER(pid, player,0); + return !player->klass.mId.empty(); // true if default +} + +const char *CharClassFunctions::GetDefaultClass(unsigned short pid) noexcept +{ + Player *player; + GET_PLAYER(pid, player,""); + return player->klass.mId.c_str(); +} + +const char *CharClassFunctions::GetClassName(unsigned short pid) noexcept +{ + Player *player; + GET_PLAYER(pid, player,""); + return player->klass.mName.c_str(); +} + +const char *CharClassFunctions::GetClassDesc(unsigned short pid) noexcept +{ + Player *player; + GET_PLAYER(pid, player,""); + return player->klass.mDescription.c_str(); +} + +int CharClassFunctions::GetClassMajorAttribute(unsigned short pid, unsigned char slot) noexcept +{ + Player *player; + GET_PLAYER(pid, player,0); + if(slot > 1) + throw invalid_argument("Incorrect attribute slot id"); + return player->klass.mData.mAttribute[slot]; +} + +int CharClassFunctions::GetClassSpecialization(unsigned short pid) noexcept +{ + Player *player; + GET_PLAYER(pid, player,0); + return player->klass.mData.mSpecialization; +} + +int CharClassFunctions::GetClassMajorSkill(unsigned short pid, unsigned char slot) noexcept +{ + Player *player; + GET_PLAYER(pid, player,0); + if(slot > 4) + throw invalid_argument("Incorrect skill slot id"); + return player->klass.mData.mSkills[slot][1]; +} + +int CharClassFunctions::GetClassMinorSkill(unsigned short pid, unsigned char slot) noexcept +{ + Player *player; + GET_PLAYER(pid, player,0); + if(slot > 4) + throw invalid_argument("Incorrect skill slot id"); + return player->klass.mData.mSkills[slot][0]; +} diff --git a/apps/openmw-mp/Script/Functions/CharClass.hpp b/apps/openmw-mp/Script/Functions/CharClass.hpp new file mode 100644 index 000000000..bfa54852e --- /dev/null +++ b/apps/openmw-mp/Script/Functions/CharClass.hpp @@ -0,0 +1,82 @@ +// +// Created by koncord on 29.08.16. +// + +#ifndef OPENMW_CHARCLASS_HPP +#define OPENMW_CHARCLASS_HPP + +#include "../Types.hpp" + +#define CHARCLASSFUNCTIONS \ +{"SetDefaultClass", CharClassFunctions::SetDefaultClass},\ +{"SetClassName", CharClassFunctions::SetClassName},\ +{"SetClassDesc", CharClassFunctions::SetClassDesc},\ +{"SetClassMajorAttribute", CharClassFunctions::SetClassMajorAttribute},\ +{"SetClassSpecialization", CharClassFunctions::SetClassSpecialization},\ +{"SetClassMajorSkill", CharClassFunctions::SetClassMajorSkill},\ +{"SetClassMinorSkill", CharClassFunctions::SetClassMinorSkill},\ +{"GetDefaultClass", CharClassFunctions::GetDefaultClass},\ +{"GetClassName", CharClassFunctions::GetClassName},\ +{"GetClassDesc", CharClassFunctions::GetClassDesc},\ +{"GetClassMajorAttribute", CharClassFunctions::GetClassMajorAttribute},\ +{"GetClassSpecialization", CharClassFunctions::GetClassSpecialization},\ +{"GetClassMajorSkill", CharClassFunctions::GetClassMajorSkill},\ +{"GetClassMinorSkill", CharClassFunctions::GetClassMinorSkill},\ +{"IsClassDefault", CharClassFunctions::IsClassDefault},\ +{"SendClass", CharClassFunctions::SendClass} + + +class CharClassFunctions +{ +public: + CharClassFunctions() {} + static void SetDefaultClass(unsigned short pid, const char *id) noexcept; + static void SetClassName(unsigned short pid, const char *name) noexcept; + static void SetClassDesc(unsigned short pid, const char *desc) noexcept; + /** + * \param pid + * \param slot 0 = first, 1 = second + * \param attrId + */ + static void SetClassMajorAttribute(unsigned short pid, unsigned char slot, int attrId) noexcept; + /** + * \param pid + * \param spec 0 = Combat, 1 = Magic, 2 = Stealth + */ + static void SetClassSpecialization(unsigned short pid, int spec) noexcept; + /** + * \param pid + * \param slot 0 to 4 + * \param skillId + */ + static void SetClassMajorSkill(unsigned short pid, unsigned char slot, int skillId) noexcept; + static void SetClassMinorSkill(unsigned short pid, unsigned char slot, int skillId) noexcept; + + static const char *GetDefaultClass(unsigned short pid) noexcept; + static const char *GetClassName(unsigned short pid) noexcept; + static const char *GetClassDesc(unsigned short pid) noexcept; + /** + * \param pid + * \param slot 0 = first, 1 = second + * \return attrId + */ + static int GetClassMajorAttribute(unsigned short pid, unsigned char slot) noexcept; + /** + * \param pid + * \return spec 0 = Combat, 1 = Magic, 2 = Stealth + */ + static int GetClassSpecialization(unsigned short pid) noexcept; + /** + * \param pid + * \param slot 0 to 4 + * \return skillId + */ + static int GetClassMajorSkill(unsigned short pid, unsigned char slot) noexcept; + static int GetClassMinorSkill(unsigned short pid, unsigned char slot) noexcept; + + static int IsClassDefault(unsigned short pid) noexcept; + + static void SendClass(unsigned short pid) noexcept; +}; + +#endif //OPENMW_CHARCLASS_HPP diff --git a/apps/openmw-mp/Script/ScriptFunctions.hpp b/apps/openmw-mp/Script/ScriptFunctions.hpp index 033ef6738..0be7bf9e6 100644 --- a/apps/openmw-mp/Script/ScriptFunctions.hpp +++ b/apps/openmw-mp/Script/ScriptFunctions.hpp @@ -5,6 +5,7 @@ #ifndef SOURCEPAWN_SCRIPTFUNCTIONS_HPP #define SOURCEPAWN_SCRIPTFUNCTIONS_HPP +#include