forked from mirror/openmw-tes3mp
[General] Rework PlayerStatsDynamic packets so they are of minimal size
This commit is contained in:
parent
993cc3dfd6
commit
fc5e883160
5 changed files with 48 additions and 7 deletions
|
@ -61,6 +61,10 @@ void NetActor::setHealth(float base, float current)
|
||||||
{
|
{
|
||||||
netCreature->creatureStats.mDynamic[0].mBase = base;
|
netCreature->creatureStats.mDynamic[0].mBase = base;
|
||||||
netCreature->creatureStats.mDynamic[0].mCurrent = current;
|
netCreature->creatureStats.mDynamic[0].mCurrent = current;
|
||||||
|
|
||||||
|
if (!Utils::vectorContains(&netCreature->statsDynamicIndexChanges, 0))
|
||||||
|
netCreature->statsDynamicIndexChanges.push_back(0);
|
||||||
|
|
||||||
statsChanged = true;
|
statsChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +77,10 @@ void NetActor::setMagicka(float base, float current)
|
||||||
{
|
{
|
||||||
netCreature->creatureStats.mDynamic[1].mBase = base;
|
netCreature->creatureStats.mDynamic[1].mBase = base;
|
||||||
netCreature->creatureStats.mDynamic[1].mCurrent = current;
|
netCreature->creatureStats.mDynamic[1].mCurrent = current;
|
||||||
|
|
||||||
|
if (!Utils::vectorContains(&netCreature->statsDynamicIndexChanges, 1))
|
||||||
|
netCreature->statsDynamicIndexChanges.push_back(1);
|
||||||
|
|
||||||
statsChanged = true;
|
statsChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,6 +93,10 @@ void NetActor::setFatigue(float base, float current)
|
||||||
{
|
{
|
||||||
netCreature->creatureStats.mDynamic[2].mBase = base;
|
netCreature->creatureStats.mDynamic[2].mBase = base;
|
||||||
netCreature->creatureStats.mDynamic[2].mCurrent = current;
|
netCreature->creatureStats.mDynamic[2].mCurrent = current;
|
||||||
|
|
||||||
|
if (!Utils::vectorContains(&netCreature->statsDynamicIndexChanges, 2))
|
||||||
|
netCreature->statsDynamicIndexChanges.push_back(2);
|
||||||
|
|
||||||
statsChanged = true;
|
statsChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -156,6 +156,8 @@ void Player::update()
|
||||||
packet->setPlayer(basePlayer);
|
packet->setPlayer(basePlayer);
|
||||||
packet->Send(false);
|
packet->Send(false);
|
||||||
packet->Send(true);
|
packet->Send(true);
|
||||||
|
|
||||||
|
statsDynamicIndexChanges.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attributesChanged)
|
if (attributesChanged)
|
||||||
|
|
|
@ -204,8 +204,16 @@ void LocalPlayer::updateStatsDynamic(bool forceUpdate)
|
||||||
|| abs(oldVal.getCurrent() - newVal.getCurrent()) >= limit);
|
|| abs(oldVal.getCurrent() - newVal.getCurrent()) >= limit);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (forceUpdate || needUpdate(oldHealth, health, 3) || needUpdate(oldMagicka, magicka, 7) ||
|
if (needUpdate(oldHealth, health, 2))
|
||||||
needUpdate(oldFatigue, fatigue, 7))
|
statsDynamicIndexChanges.push_back(0);
|
||||||
|
|
||||||
|
if (needUpdate(oldMagicka, magicka, 4))
|
||||||
|
statsDynamicIndexChanges.push_back(1);
|
||||||
|
|
||||||
|
if (needUpdate(oldFatigue, fatigue, 4))
|
||||||
|
statsDynamicIndexChanges.push_back(2);
|
||||||
|
|
||||||
|
if (statsDynamicIndexChanges.size() > 0 || forceUpdate)
|
||||||
{
|
{
|
||||||
oldHealth = health;
|
oldHealth = health;
|
||||||
oldMagicka = magicka;
|
oldMagicka = magicka;
|
||||||
|
@ -217,6 +225,7 @@ void LocalPlayer::updateStatsDynamic(bool forceUpdate)
|
||||||
|
|
||||||
getNetworking()->getPlayerPacket(ID_PLAYER_STATS_DYNAMIC)->setPlayer(this);
|
getNetworking()->getPlayerPacket(ID_PLAYER_STATS_DYNAMIC)->setPlayer(this);
|
||||||
getNetworking()->getPlayerPacket(ID_PLAYER_STATS_DYNAMIC)->Send();
|
getNetworking()->getPlayerPacket(ID_PLAYER_STATS_DYNAMIC)->Send();
|
||||||
|
statsDynamicIndexChanges.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,10 @@ namespace mwmp
|
||||||
|
|
||||||
Attack attack;
|
Attack attack;
|
||||||
|
|
||||||
|
// Track only the indexes of the dynamic states that have been changed,
|
||||||
|
// with the dynamicStats themselves being stored in creatureStats.mDynamic
|
||||||
|
std::vector<int> statsDynamicIndexChanges;
|
||||||
|
|
||||||
// Track only the indexes of the equipment items that have been changed,
|
// Track only the indexes of the equipment items that have been changed,
|
||||||
// with the items themselves being stored in equipmentItems
|
// with the items themselves being stored in equipmentItems
|
||||||
std::vector<int> equipmentIndexChanges;
|
std::vector<int> equipmentIndexChanges;
|
||||||
|
|
|
@ -1,7 +1,3 @@
|
||||||
//
|
|
||||||
// Created by koncord on 13.01.16.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "PacketPlayerStatsDynamic.hpp"
|
#include "PacketPlayerStatsDynamic.hpp"
|
||||||
#include <components/openmw-mp/NetworkMessages.hpp>
|
#include <components/openmw-mp/NetworkMessages.hpp>
|
||||||
|
|
||||||
|
@ -15,5 +11,23 @@ PacketPlayerStatsDynamic::PacketPlayerStatsDynamic(RakNet::RakPeerInterface *pee
|
||||||
void PacketPlayerStatsDynamic::Packet(RakNet::BitStream *bs, bool send)
|
void PacketPlayerStatsDynamic::Packet(RakNet::BitStream *bs, bool send)
|
||||||
{
|
{
|
||||||
PlayerPacket::Packet(bs, send);
|
PlayerPacket::Packet(bs, send);
|
||||||
RW(player->creatureStats.mDynamic, send);
|
|
||||||
|
uint32_t count;
|
||||||
|
if (send)
|
||||||
|
count = static_cast<uint32_t>(player->statsDynamicIndexChanges.size());
|
||||||
|
|
||||||
|
RW(count, send);
|
||||||
|
|
||||||
|
if (!send)
|
||||||
|
{
|
||||||
|
player->statsDynamicIndexChanges.clear();
|
||||||
|
player->statsDynamicIndexChanges.resize(count);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto &&statsDynamicIndex : player->statsDynamicIndexChanges)
|
||||||
|
{
|
||||||
|
RW(statsDynamicIndex, send);
|
||||||
|
|
||||||
|
RW(player->creatureStats.mDynamic[statsDynamicIndex], send);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue