diff --git a/apps/openmw/mwmp/DedicatedPlayer.cpp b/apps/openmw/mwmp/DedicatedPlayer.cpp index a832e0bc2..7aa4efbab 100644 --- a/apps/openmw/mwmp/DedicatedPlayer.cpp +++ b/apps/openmw/mwmp/DedicatedPlayer.cpp @@ -320,7 +320,21 @@ void DedicatedPlayer::setEquipment() if (!Misc::StringUtils::ciEqual(ptrItemId, packetItemId)) // if other item is now equipped { MWWorld::ContainerStore &store = ptr.getClass().getContainerStore(ptr); - store.remove(ptrItemId, store.count(ptrItemId), ptr); + + // Remove the items that are no longer equipped, except for throwing weapons and ranged weapon ammo that + // have just run out but still need to be kept briefly so they can be used in attacks about to be released + bool shouldRemove = true; + + if (attack.type == mwmp::Attack::RANGED && packetItemId.empty() && !attack.pressed) + { + if (slot == MWWorld::InventoryStore::Slot_CarriedRight && Misc::StringUtils::ciEqual(ptrItemId, attack.rangedWeaponId)) + shouldRemove = false; + else if (slot == MWWorld::InventoryStore::Slot_Ammunition && Misc::StringUtils::ciEqual(ptrItemId, attack.rangedAmmoId)) + shouldRemove = false; + } + + if (shouldRemove) + store.remove(ptrItemId, store.count(ptrItemId), ptr); } else equal = true; diff --git a/apps/openmw/mwmp/MechanicsHelper.cpp b/apps/openmw/mwmp/MechanicsHelper.cpp index 17935c329..3b88ddbde 100644 --- a/apps/openmw/mwmp/MechanicsHelper.cpp +++ b/apps/openmw/mwmp/MechanicsHelper.cpp @@ -325,7 +325,6 @@ void MechanicsHelper::processAttack(Attack attack, const MWWorld::Ptr& attacker) { MWMechanics::CastSpell cast(attacker, victim, isRanged); cast.mHitPosition = attack.hitPosition.asVec3(); - cast.cast(weaponPtr, false); } diff --git a/components/openmw-mp/Packets/Actor/PacketActorAttack.cpp b/components/openmw-mp/Packets/Actor/PacketActorAttack.cpp index 3612b843d..5e678eadd 100644 --- a/components/openmw-mp/Packets/Actor/PacketActorAttack.cpp +++ b/components/openmw-mp/Packets/Actor/PacketActorAttack.cpp @@ -43,7 +43,11 @@ void PacketActorAttack::Actor(BaseActor &actor, bool send) RW(actor.attack.isHit, send); if (actor.attack.type == mwmp::Attack::RANGED) + { RW(actor.attack.attackStrength, send); + RW(actor.attack.rangedWeaponId, send); + RW(actor.attack.rangedAmmoId, send); + } if (actor.attack.isHit) { @@ -53,11 +57,7 @@ void PacketActorAttack::Actor(BaseActor &actor, bool send) RW(actor.attack.applyWeaponEnchantment, send); if (actor.attack.type == mwmp::Attack::RANGED) - { RW(actor.attack.applyAmmoEnchantment, send); - RW(actor.attack.rangedWeaponId, send); - RW(actor.attack.rangedAmmoId, send); - } RW(actor.attack.hitPosition.pos[0], send); RW(actor.attack.hitPosition.pos[1], send); diff --git a/components/openmw-mp/Packets/Player/PacketPlayerAttack.cpp b/components/openmw-mp/Packets/Player/PacketPlayerAttack.cpp index 31cc86a94..2e1c8fd98 100644 --- a/components/openmw-mp/Packets/Player/PacketPlayerAttack.cpp +++ b/components/openmw-mp/Packets/Player/PacketPlayerAttack.cpp @@ -44,7 +44,11 @@ void PacketPlayerAttack::Packet(RakNet::BitStream *bs, bool send) RW(player->attack.isHit, send); if (player->attack.type == mwmp::Attack::RANGED) + { RW(player->attack.attackStrength, send); + RW(player->attack.rangedWeaponId, send); + RW(player->attack.rangedAmmoId, send); + } if (player->attack.isHit) { @@ -54,11 +58,7 @@ void PacketPlayerAttack::Packet(RakNet::BitStream *bs, bool 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);