@ -236,6 +236,8 @@ void Networking::processPlayerPacket(RakNet::Packet *packet)
DEBUG_PRINTF("ID_GAME_SPELLBOOK\n");
myPacket->Read(player);
Script::Call<Script::CallbackIdentity("OnPlayerChangeSpellbook")>(player->getId());
break;
}
@ -108,6 +108,7 @@ public:
{"OnPlayerChangeLevel", Function<void, unsigned short>()},
{"OnPlayerChangeEquipment", Function<void, unsigned short>()},
{"OnPlayerChangeInventory", Function<void, unsigned short>()},
{"OnPlayerChangeSpellbook", Function<void, unsigned short>()},
{"OnPlayerSendMessage", Function<bool, unsigned short, const char*>()},
{"OnPlayerEndCharGen", Function<void, unsigned short>()},
{"OnGUIAction", Function<void, unsigned short, int, const char*>()}
@ -845,6 +845,30 @@ void LocalPlayer::sendInventory()
Main::get().getNetworking()->getPlayerPacket(ID_GAME_INVENTORY)->Send(this);
void LocalPlayer::sendSpellAddition(std::string id)
{
spellbook.spells.clear();
mwmp::Spell spell;
spell.id = id;
spellbook.spells.push_back(spell);
spellbook.action = Spellbook::ADD;
Main::get().getNetworking()->getPlayerPacket(ID_GAME_SPELLBOOK)->Send(this);
void LocalPlayer::sendSpellRemoval(std::string id)
spellbook.action = Spellbook::REMOVE;
void LocalPlayer::sendAttack(Attack::TYPE type)
MWMechanics::DrawState_ state = getPlayerPtr().getClass().getNpcStats(getPlayerPtr()).getDrawState();
@ -47,6 +47,8 @@ namespace mwmp
void sendClass();
void sendInventory();
void sendSpellAddition(std::string id);
void sendSpellRemoval(std::string id);
void sendAttack(Attack::TYPE type);
void prepareAttack(Attack::TYPE type, bool state);
@ -3,6 +3,8 @@
#include <iostream>
#include <cmath>
#include "../mwmp/Main.hpp"
#include <components/esm/loadnpc.hpp>
#include "../mwworld/esmstore.hpp"
@ -442,6 +444,11 @@ namespace MWScript
MWBase::Environment::get().getWorld()->getStore().get<ESM::Spell>().find (id);
ptr.getClass().getCreatureStats (ptr).getSpells().add (id);
// Added by tes3mp
//
// LocalPlayer has gained a spell, so send a packet with it
mwmp::Main::get().getLocalPlayer()->sendSpellAddition(id);
};
@ -466,6 +473,11 @@ namespace MWScript
wm->unsetSelectedSpell();
// LocalPlayer has lost a spell, so send a packet with it
mwmp::Main::get().getLocalPlayer()->sendSpellRemoval(id);
@ -58,6 +58,24 @@ namespace mwmp
int action; //0 - FullUpdate, 1 - AddItem, 2 - RemoveItem
struct Spell
std::string id;
struct Spellbook
std::vector<Spell> spells;
unsigned int count;
enum ACTION_TYPE
UPDATE = 0,
ADD,
REMOVE
int action; //0 - Update, 1 - Add, 2 - Remove
class BasePlayer
public:
@ -89,6 +107,7 @@ namespace mwmp
inventory.action = 0;
inventory.count = 0;
spellbook.action = 0;
BasePlayer()
@ -174,6 +193,7 @@ namespace mwmp
int day;
double hour;
Inventory inventory;
Spellbook spellbook;
bool consoleAllowed;
bool ignorePosPacket;
@ -18,14 +18,18 @@ void PacketInventory::Packet(RakNet::BitStream *bs, BasePlayer *player, bool sen
PlayerPacket::Packet(bs, player, send);
RW(player->inventory.action, send);
if (!send)
player->inventory.items.clear();
else
player->inventory.count = (unsigned int) (player->inventory.items.size());
RW(player->inventory.count, send);
for (int i = 0; i < player->inventory.count; i++)
Item item;
if (send)
item = player->inventory.items[i];
@ -12,4 +12,30 @@ PacketSpellbook::PacketSpellbook(RakNet::RakPeerInterface *peer) : PlayerPacket(
void PacketSpellbook::Packet(RakNet::BitStream *bs, BasePlayer *player, bool send)
RW(player->spellbook.action, send);
player->spellbook.spells.clear();
player->spellbook.count = (unsigned int) (player->spellbook.spells.size());
RW(player->spellbook.count, send);
for (int i = 0; i < player->spellbook.count; i++)
Spell spell;
spell = player->spellbook.spells[i];
RW(spell.id, send);
player->spellbook.spells.push_back(spell);