mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-03-29 19:36:43 +00:00
Add spell script functions to tes3mp server
This commit is contained in:
parent
8aeb3a6cc6
commit
c81b58e1be
7 changed files with 133 additions and 18 deletions
|
@ -66,8 +66,8 @@ set(SERVER
|
||||||
Script/ScriptFunctions.cpp
|
Script/ScriptFunctions.cpp
|
||||||
|
|
||||||
Script/Functions/CharClass.cpp Script/Functions/Chat.cpp Script/Functions/GUI.cpp
|
Script/Functions/CharClass.cpp Script/Functions/Chat.cpp Script/Functions/GUI.cpp
|
||||||
Script/Functions/Items.cpp Script/Functions/Stats.cpp Script/Functions/Timer.cpp
|
Script/Functions/Items.cpp Script/Functions/Stats.cpp Script/Functions/Spells.cpp
|
||||||
Script/Functions/Translocations.cpp Script/Functions/World.cpp
|
Script/Functions/Timer.cpp Script/Functions/Translocations.cpp Script/Functions/World.cpp
|
||||||
|
|
||||||
Script/API/TimerAPI.cpp Script/API/PublicFnAPI.cpp
|
Script/API/TimerAPI.cpp Script/API/PublicFnAPI.cpp
|
||||||
${PawnScript_Sources}
|
${PawnScript_Sources}
|
||||||
|
|
|
@ -66,8 +66,11 @@ public:
|
||||||
std::chrono::steady_clock::time_point getLastAttackerTime();
|
std::chrono::steady_clock::time_point getLastAttackerTime();
|
||||||
|
|
||||||
virtual ~Player();
|
virtual ~Player();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
mwmp::Inventory inventorySendBuffer;
|
mwmp::Inventory inventorySendBuffer;
|
||||||
|
mwmp::Spellbook spellbookSendBuffer;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool handshakeState;
|
bool handshakeState;
|
||||||
int loadState;
|
int loadState;
|
||||||
|
|
|
@ -24,12 +24,12 @@ unsigned int ItemFunctions::GetInventorySize(unsigned short pid) noexcept
|
||||||
return player->inventory.count;
|
return player->inventory.count;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemFunctions::EquipItem(unsigned short pid, unsigned short slot, const char *itemName, unsigned int count, int health) noexcept
|
void ItemFunctions::EquipItem(unsigned short pid, unsigned short slot, const char *itemId, unsigned int count, int health) noexcept
|
||||||
{
|
{
|
||||||
Player *player;
|
Player *player;
|
||||||
GET_PLAYER(pid, player,);
|
GET_PLAYER(pid, player,);
|
||||||
|
|
||||||
player->EquipedItem(slot)->refid = itemName;
|
player->EquipedItem(slot)->refid = itemId;
|
||||||
player->EquipedItem(slot)->count = count;
|
player->EquipedItem(slot)->count = count;
|
||||||
player->EquipedItem(slot)->health = health;
|
player->EquipedItem(slot)->health = health;
|
||||||
}
|
}
|
||||||
|
@ -42,13 +42,13 @@ void ItemFunctions::UnequipItem(unsigned short pid, unsigned short slot) noexcep
|
||||||
ItemFunctions::EquipItem(pid, slot, "", 0, -1);
|
ItemFunctions::EquipItem(pid, slot, "", 0, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemFunctions::AddItem(unsigned short pid, const char* itemName, unsigned int count, int health) noexcept
|
void ItemFunctions::AddItem(unsigned short pid, const char* itemId, unsigned int count, int health) noexcept
|
||||||
{
|
{
|
||||||
Player *player;
|
Player *player;
|
||||||
GET_PLAYER(pid, player, );
|
GET_PLAYER(pid, player, );
|
||||||
|
|
||||||
Item item;
|
Item item;
|
||||||
item.refid = itemName;
|
item.refid = itemId;
|
||||||
item.count = count;
|
item.count = count;
|
||||||
item.health = health;
|
item.health = health;
|
||||||
|
|
||||||
|
@ -56,13 +56,13 @@ void ItemFunctions::AddItem(unsigned short pid, const char* itemName, unsigned i
|
||||||
player->inventorySendBuffer.action = Inventory::ADDITEM;
|
player->inventorySendBuffer.action = Inventory::ADDITEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemFunctions::RemoveItem(unsigned short pid, const char* itemName, unsigned short count) noexcept
|
void ItemFunctions::RemoveItem(unsigned short pid, const char* itemId, unsigned short count) noexcept
|
||||||
{
|
{
|
||||||
Player *player;
|
Player *player;
|
||||||
GET_PLAYER(pid, player, );
|
GET_PLAYER(pid, player, );
|
||||||
|
|
||||||
Item item;
|
Item item;
|
||||||
item.refid = itemName;
|
item.refid = itemId;
|
||||||
item.count = count;
|
item.count = count;
|
||||||
|
|
||||||
player->inventorySendBuffer.items.push_back(item);
|
player->inventorySendBuffer.items.push_back(item);
|
||||||
|
@ -78,13 +78,13 @@ void ItemFunctions::ClearInventory(unsigned short pid) noexcept
|
||||||
player->inventorySendBuffer.action = Inventory::UPDATE;
|
player->inventorySendBuffer.action = Inventory::UPDATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ItemFunctions::HasItemEquipped(unsigned short pid, const char* itemName)
|
bool ItemFunctions::HasItemEquipped(unsigned short pid, const char* itemId)
|
||||||
{
|
{
|
||||||
Player *player;
|
Player *player;
|
||||||
GET_PLAYER(pid, player, false);
|
GET_PLAYER(pid, player, false);
|
||||||
|
|
||||||
for (int slot = 0; slot < MWWorld::InventoryStore::Slots; slot++)
|
for (int slot = 0; slot < MWWorld::InventoryStore::Slots; slot++)
|
||||||
if (Misc::StringUtils::ciEqual(player->EquipedItem(slot)->refid, itemName))
|
if (Misc::StringUtils::ciEqual(player->EquipedItem(slot)->refid, itemId))
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,14 +36,14 @@ public:
|
||||||
static int GetEquipmentSize() noexcept;
|
static int GetEquipmentSize() noexcept;
|
||||||
static unsigned int GetInventorySize(unsigned short pid) noexcept;
|
static unsigned int GetInventorySize(unsigned short pid) noexcept;
|
||||||
|
|
||||||
static void EquipItem(unsigned short pid, unsigned short slot, const char* itemName, unsigned int count, int health) noexcept;
|
static void EquipItem(unsigned short pid, unsigned short slot, const char* itemId, unsigned int count, int health) noexcept;
|
||||||
static void UnequipItem(unsigned short pid, unsigned short slot) noexcept;
|
static void UnequipItem(unsigned short pid, unsigned short slot) noexcept;
|
||||||
|
|
||||||
static void AddItem(unsigned short pid, const char* itemName, unsigned int count, int health) noexcept;
|
static void AddItem(unsigned short pid, const char* itemId, unsigned int count, int health) noexcept;
|
||||||
static void RemoveItem(unsigned short pid, const char* itemName, unsigned short count) noexcept;
|
static void RemoveItem(unsigned short pid, const char* itemId, unsigned short count) noexcept;
|
||||||
static void ClearInventory(unsigned short pid) noexcept;
|
static void ClearInventory(unsigned short pid) noexcept;
|
||||||
|
|
||||||
static bool HasItemEquipped(unsigned short pid, const char* itemName);
|
static bool HasItemEquipped(unsigned short pid, const char* itemId);
|
||||||
|
|
||||||
static const char *GetEquipmentItemId(unsigned short pid, unsigned short slot) noexcept;
|
static const char *GetEquipmentItemId(unsigned short pid, unsigned short slot) noexcept;
|
||||||
static int GetEquipmentItemCount(unsigned short pid, unsigned short slot) noexcept;
|
static int GetEquipmentItemCount(unsigned short pid, unsigned short slot) noexcept;
|
||||||
|
|
80
apps/openmw-mp/Script/Functions/Spells.cpp
Normal file
80
apps/openmw-mp/Script/Functions/Spells.cpp
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
#include "Spells.hpp"
|
||||||
|
#include <apps/openmw-mp/Script/ScriptFunctions.hpp>
|
||||||
|
#include <components/openmw-mp/NetworkMessages.hpp>
|
||||||
|
#include <apps/openmw-mp/Networking.hpp>
|
||||||
|
#include <components/misc/stringops.hpp>
|
||||||
|
|
||||||
|
using namespace mwmp;
|
||||||
|
|
||||||
|
unsigned int SpellFunctions::GetSpellbookSize(unsigned short pid) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, 0);
|
||||||
|
|
||||||
|
return player->spellbook.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpellFunctions::AddSpell(unsigned short pid, const char* spellId) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, );
|
||||||
|
|
||||||
|
Spell spell;
|
||||||
|
spell.id = spellId;
|
||||||
|
|
||||||
|
player->spellbookSendBuffer.spells.push_back(spell);
|
||||||
|
player->spellbookSendBuffer.action = Spellbook::ADD;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpellFunctions::RemoveSpell(unsigned short pid, const char* spellId) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, );
|
||||||
|
|
||||||
|
Spell spell;
|
||||||
|
spell.id = spellId;
|
||||||
|
|
||||||
|
player->spellbookSendBuffer.spells.push_back(spell);
|
||||||
|
player->spellbookSendBuffer.action = Spellbook::REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpellFunctions::ClearSpellbook(unsigned short pid) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, );
|
||||||
|
|
||||||
|
player->spellbookSendBuffer.spells.clear();
|
||||||
|
player->spellbookSendBuffer.action = Spellbook::UPDATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SpellFunctions::HasSpell(unsigned short pid, const char* spellId)
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, false);
|
||||||
|
|
||||||
|
for (int i = 0; i < player->spellbook.count; i++)
|
||||||
|
if (Misc::StringUtils::ciEqual(player->spellbook.spells.at(i).id, spellId))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *SpellFunctions::GetSpellId(unsigned short pid, unsigned int i) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, "");
|
||||||
|
|
||||||
|
if (i >= player->spellbook.count)
|
||||||
|
return "invalid";
|
||||||
|
|
||||||
|
return player->spellbook.spells.at(i).id.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpellFunctions::SendSpellbook(unsigned short pid) noexcept
|
||||||
|
{
|
||||||
|
Player *player;
|
||||||
|
GET_PLAYER(pid, player, );
|
||||||
|
std::swap(player->spellbook, player->spellbookSendBuffer);
|
||||||
|
mwmp::Networking::get().getPlayerController()->GetPacket(ID_GAME_SPELLBOOK)->Send(player, false);
|
||||||
|
player->spellbook = std::move(player->spellbookSendBuffer);
|
||||||
|
player->spellbookSendBuffer.spells.clear();
|
||||||
|
}
|
34
apps/openmw-mp/Script/Functions/Spells.hpp
Normal file
34
apps/openmw-mp/Script/Functions/Spells.hpp
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#ifndef OPENMW_SPELLS_HPP
|
||||||
|
#define OPENMW_SPELLS_HPP
|
||||||
|
|
||||||
|
#define SPELLAPI \
|
||||||
|
{"GetSpellbookSize", SpellFunctions::GetSpellbookSize},\
|
||||||
|
\
|
||||||
|
{"AddSpell", SpellFunctions::AddSpell},\
|
||||||
|
{"RemoveSpell", SpellFunctions::RemoveSpell},\
|
||||||
|
{"ClearSpellbook", SpellFunctions::ClearInventory},\
|
||||||
|
\
|
||||||
|
{"HasSpell", SpellFunctions::HasSpell},\
|
||||||
|
{"GetSpellId", SpellFunctions::GetSpellId},\
|
||||||
|
\
|
||||||
|
{"SendSpellbook", SpellFunctions::SendSpellbook}
|
||||||
|
|
||||||
|
class SpellFunctions
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
static unsigned int GetSpellbookSize(unsigned short pid) noexcept;
|
||||||
|
|
||||||
|
static void AddSpell(unsigned short pid, const char* spellId) noexcept;
|
||||||
|
static void RemoveSpell(unsigned short pid, const char* spellId) noexcept;
|
||||||
|
static void ClearSpellbook(unsigned short pid) noexcept;
|
||||||
|
|
||||||
|
static bool HasSpell(unsigned short pid, const char* itemName);
|
||||||
|
static const char *GetSpellId(unsigned short pid, unsigned int i) noexcept;
|
||||||
|
|
||||||
|
static void SendSpellbook(unsigned short pid) noexcept;
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //OPENMW_SPELLS_HPP
|
|
@ -10,6 +10,7 @@
|
||||||
#include <Script/Functions/GUI.hpp>
|
#include <Script/Functions/GUI.hpp>
|
||||||
#include <Script/Functions/Stats.hpp>
|
#include <Script/Functions/Stats.hpp>
|
||||||
#include <Script/Functions/Items.hpp>
|
#include <Script/Functions/Items.hpp>
|
||||||
|
#include <Script/Functions/Spells.hpp>
|
||||||
#include <Script/Functions/World.hpp>
|
#include <Script/Functions/World.hpp>
|
||||||
#include <RakNetTypes.h>
|
#include <RakNetTypes.h>
|
||||||
//#include <amx/amx.h>
|
//#include <amx/amx.h>
|
||||||
|
@ -68,7 +69,6 @@ public:
|
||||||
{"MakePublic", ScriptFunctions::MakePublic},
|
{"MakePublic", ScriptFunctions::MakePublic},
|
||||||
{"CallPublic", reinterpret_cast<Function<void>>(ScriptFunctions::CallPublic)},
|
{"CallPublic", reinterpret_cast<Function<void>>(ScriptFunctions::CallPublic)},
|
||||||
|
|
||||||
|
|
||||||
{"StartTimer", ScriptFunctions::StartTimer},
|
{"StartTimer", ScriptFunctions::StartTimer},
|
||||||
{"StopTimer", ScriptFunctions::StopTimer},
|
{"StopTimer", ScriptFunctions::StopTimer},
|
||||||
{"RestartTimer", ScriptFunctions::RestartTimer},
|
{"RestartTimer", ScriptFunctions::RestartTimer},
|
||||||
|
@ -77,7 +77,6 @@ public:
|
||||||
|
|
||||||
{"StopServer", ScriptFunctions::StopServer},
|
{"StopServer", ScriptFunctions::StopServer},
|
||||||
|
|
||||||
// {"Cast", ScriptFunctions::Cast},
|
|
||||||
{"SendMessage", ScriptFunctions::SendMessage},
|
{"SendMessage", ScriptFunctions::SendMessage},
|
||||||
{"Kick", ScriptFunctions::Kick},
|
{"Kick", ScriptFunctions::Kick},
|
||||||
{"GetServerVersion", ScriptFunctions::GetServerVersion},
|
{"GetServerVersion", ScriptFunctions::GetServerVersion},
|
||||||
|
@ -87,11 +86,10 @@ public:
|
||||||
TRANSLOCATIONFUNCTIONS,
|
TRANSLOCATIONFUNCTIONS,
|
||||||
STATSFUNCTIONS,
|
STATSFUNCTIONS,
|
||||||
ITEMAPI,
|
ITEMAPI,
|
||||||
|
SPELLAPI,
|
||||||
GUIFUNCTIONS,
|
GUIFUNCTIONS,
|
||||||
CHARCLASSFUNCTIONS,
|
CHARCLASSFUNCTIONS,
|
||||||
WORLDFUNCTIONS,
|
WORLDFUNCTIONS,
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static constexpr ScriptCallbackData callbacks[]{
|
static constexpr ScriptCallbackData callbacks[]{
|
||||||
|
|
Loading…
Reference in a new issue