diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index d94a5f0f3..01c1c55cd 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -443,6 +443,17 @@ namespace MWBase End of tes3mp addition */ + /* + Start of tes3mp addition + + Make it possible to set whether a Ptr is on the ground or not, needed for proper + synchronization in multiplayer + */ + virtual void setOnGround(const MWWorld::Ptr& ptr, bool onGround) = 0; + /* + End of tes3mp addition + */ + /* Start of tes3mp addition diff --git a/apps/openmw/mwmp/DedicatedPlayer.cpp b/apps/openmw/mwmp/DedicatedPlayer.cpp index f30a9c765..897e2c49b 100644 --- a/apps/openmw/mwmp/DedicatedPlayer.cpp +++ b/apps/openmw/mwmp/DedicatedPlayer.cpp @@ -64,6 +64,9 @@ DedicatedPlayer::DedicatedPlayer(RakNet::RakNetGUID guid) : BasePlayer(guid) hasReceivedInitialEquipment = false; hasFinishedInitialTeleportation = false; + + isJumping = false; + wasJumping = false; } DedicatedPlayer::~DedicatedPlayer() @@ -209,6 +212,17 @@ void DedicatedPlayer::setAnimFlags() isLevitationPurged = false; } + if (isJumping && !wasJumping) + { + world->setOnGround(ptr, false); + wasJumping = true; + } + else if (wasJumping && !isJumping) + { + world->setOnGround(ptr, true); + wasJumping = false; + } + MWMechanics::CreatureStats *ptrCreatureStats = &ptr.getClass().getCreatureStats(ptr); ptrCreatureStats->setDrawState(static_cast(drawState)); diff --git a/apps/openmw/mwmp/DedicatedPlayer.hpp b/apps/openmw/mwmp/DedicatedPlayer.hpp index 30ed95830..95e0305a3 100644 --- a/apps/openmw/mwmp/DedicatedPlayer.hpp +++ b/apps/openmw/mwmp/DedicatedPlayer.hpp @@ -85,6 +85,8 @@ namespace mwmp bool hasReceivedInitialEquipment; bool hasFinishedInitialTeleportation; bool isLevitationPurged; + + bool wasJumping; }; } #endif //OPENMW_DEDICATEDPLAYER_HPP diff --git a/apps/openmw/mwmp/LocalPlayer.cpp b/apps/openmw/mwmp/LocalPlayer.cpp index a07bd021f..427b49dd6 100644 --- a/apps/openmw/mwmp/LocalPlayer.cpp +++ b/apps/openmw/mwmp/LocalPlayer.cpp @@ -612,7 +612,7 @@ void LocalPlayer::updateAnimFlags(bool forceUpdate) bool isForceMoveJumping = ptrNpcStats.getMovementFlag(CreatureStats::Flag_ForceMoveJump); isFlying = world->isFlying(ptrPlayer); - bool isJumping = !world->isOnGround(ptrPlayer) && !isFlying; + isJumping = !world->isOnGround(ptrPlayer) && !isFlying; // We need to send a new packet at the end of jumping, flying and TCL-ing too, // so keep track of what we were doing last frame diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 2e0cd1fff..016a39b3e 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -1722,6 +1722,21 @@ namespace MWWorld End of tes3mp addition */ + /* + Start of tes3mp addition + + Make it possible to set whether a Ptr is on the ground or not, needed for proper + synchronization in multiplayer + */ + void World::setOnGround(const Ptr& ptr, bool onGround) + { + MWPhysics::Actor* actor = mPhysics->getActor(ptr); + actor->setOnGround(onGround); + } + /* + End of tes3mp addition + */ + /* Start of tes3mp addition diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index 3827f83eb..ad2e7c603 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -517,6 +517,17 @@ namespace MWWorld End of tes3mp addition */ + /* + Start of tes3mp addition + + Make it possible to set whether a Ptr is on the ground or not, needed for proper + synchronization in multiplayer + */ + void setOnGround(const Ptr& ptr, bool onGround); + /* + End of tes3mp addition + */ + /* Start of tes3mp addition diff --git a/components/openmw-mp/Base/BasePlayer.hpp b/components/openmw-mp/Base/BasePlayer.hpp index 04c06de7c..9ece0e742 100644 --- a/components/openmw-mp/Base/BasePlayer.hpp +++ b/components/openmw-mp/Base/BasePlayer.hpp @@ -232,6 +232,7 @@ namespace mwmp unsigned int movementFlags = 0; char drawState; + bool isJumping = false; bool isFlying = false; bool hasTcl = false; diff --git a/components/openmw-mp/Packets/Player/PacketPlayerAnimFlags.cpp b/components/openmw-mp/Packets/Player/PacketPlayerAnimFlags.cpp index c02cdd3ae..1c5f7c05d 100644 --- a/components/openmw-mp/Packets/Player/PacketPlayerAnimFlags.cpp +++ b/components/openmw-mp/Packets/Player/PacketPlayerAnimFlags.cpp @@ -12,6 +12,7 @@ void mwmp::PacketPlayerAnimFlags::Packet(RakNet::BitStream *newBitstream, bool s RW(player->movementFlags, send); RW(player->drawState, send); + RW(player->isJumping, send); RW(player->isFlying, send); RW(player->hasTcl, send); }