1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-02-03 12:15:33 +00:00
openmw-tes3mp/components/openmw-mp/Packets/Player/PacketPlayerAttack.cpp
David Cernat 995d20348f [General] Always use correct ranged weapon & ammo for ranged attack sync
Previously, the player's currently selected weapon was being used in ranged attacks as in the original melee-oriented attack sync, which meant that shooting one type of projectile and then equipping another while the old projectile was still in the air turned the old projectile into the new projectile upon impact.

Additionally, avoid running most of the code in MechanicsHelper::assignAttackTarget() for non-hitting melee and ranged attacks.
2018-09-23 02:30:31 +03:00

69 lines
2 KiB
C++

#include <components/openmw-mp/NetworkMessages.hpp>
#include "PacketPlayerAttack.hpp"
using namespace mwmp;
PacketPlayerAttack::PacketPlayerAttack(RakNet::RakPeerInterface *peer) : PlayerPacket(peer)
{
packetID = ID_PLAYER_ATTACK;
}
void PacketPlayerAttack::Packet(RakNet::BitStream *bs, bool send)
{
PlayerPacket::Packet(bs, send);
RW(player->attack.target.isPlayer, send);
if (player->attack.target.isPlayer)
{
RW(player->attack.target.guid, send);
}
else
{
RW(player->attack.target.refId, send, true);
RW(player->attack.target.refNum, send);
RW(player->attack.target.mpNum, send);
}
RW(player->attack.type, send);
if (player->attack.type == mwmp::Attack::ITEM_MAGIC)
RW(player->attack.itemId, send, true);
else
{
RW(player->attack.pressed, send);
RW(player->attack.success, send);
if (player->attack.type == mwmp::Attack::MAGIC)
{
RW(player->attack.instant, send);
RW(player->attack.spellId, send, true);
}
else
{
RW(player->attack.isHit, send);
if (player->attack.type == mwmp::Attack::RANGED)
RW(player->attack.attackStrength, send);
if (player->attack.isHit)
{
RW(player->attack.damage, send);
RW(player->attack.block, send);
RW(player->attack.knockdown, send);
RW(player->attack.applyWeaponEnchantment, send);
if (player->attack.type == mwmp::Attack::RANGED)
{
RW(player->attack.applyAmmoEnchantment, send);
RW(player->attack.rangedWeaponId, send);
RW(player->attack.rangedAmmoId, send);
}
RW(player->attack.hitPosition.pos[0], send);
RW(player->attack.hitPosition.pos[1], send);
RW(player->attack.hitPosition.pos[2], send);
}
}
}
}