[General] Synchronize origin and orientation for non-magical projectiles

pull/619/head
David Cernat 3 years ago
parent f0a22495a2
commit a7eeba03a1

@ -17,8 +17,15 @@ namespace mwmp
virtual void Do(PlayerPacket &packet, BasePlayer *player) virtual void Do(PlayerPacket &packet, BasePlayer *player)
{ {
if (player != 0) if (!isLocal() && player != 0)
MechanicsHelper::processAttack(player->attack, static_cast<DedicatedPlayer*>(player)->getPtr()); {
DedicatedPlayer& dedicatedPlayer = static_cast<DedicatedPlayer&>(*player);
MWWorld::Ptr playerPtr = dedicatedPlayer.getPtr();
MWBase::World* world = MWBase::Environment::get().getWorld();
world->moveObject(playerPtr, dedicatedPlayer.position.pos[0], dedicatedPlayer.position.pos[1], dedicatedPlayer.position.pos[2]);
world->rotateObject(playerPtr, dedicatedPlayer.position.rot[0], 0, dedicatedPlayer.position.rot[2]);
MechanicsHelper::processAttack(player->attack, playerPtr);
}
} }
}; };
} }

@ -184,6 +184,39 @@ void WeaponAnimation::releaseArrow(MWWorld::Ptr actor, float attackStrength)
return; return;
osg::Vec3f launchPos = osg::computeLocalToWorld(nodepaths[0]).getTrans(); osg::Vec3f launchPos = osg::computeLocalToWorld(nodepaths[0]).getTrans();
/*
Start of tes3mp addition
If the actor shooting this is a LocalPlayer or LocalActor, track their projectile origin so it can be sent
in the next PlayerAttack or ActorAttack packet
Otherwise, set the projectileOrigin for a DedicatedPlayer or DedicatedActor
*/
if (localAttack)
{
localAttack->projectileOrigin.origin[0] = launchPos.x();
localAttack->projectileOrigin.origin[1] = launchPos.y();
localAttack->projectileOrigin.origin[2] = launchPos.z();
localAttack->projectileOrigin.orientation[0] = orient.x();
localAttack->projectileOrigin.orientation[1] = orient.y();
localAttack->projectileOrigin.orientation[2] = orient.z();
localAttack->projectileOrigin.orientation[3] = orient.w();
}
else
{
mwmp::Attack* dedicatedAttack = MechanicsHelper::getDedicatedAttack(actor);
if (dedicatedAttack)
{
launchPos = osg::Vec3f(dedicatedAttack->projectileOrigin.origin[0], dedicatedAttack->projectileOrigin.origin[1], dedicatedAttack->projectileOrigin.origin[2]);
orient = osg::Quat(dedicatedAttack->projectileOrigin.orientation[0], dedicatedAttack->projectileOrigin.orientation[1], dedicatedAttack->projectileOrigin.orientation[2],
dedicatedAttack->projectileOrigin.orientation[3]);
}
}
/*
End of tes3mp addition
*/
float fThrownWeaponMinSpeed = gmst.find("fThrownWeaponMinSpeed")->mValue.getFloat(); float fThrownWeaponMinSpeed = gmst.find("fThrownWeaponMinSpeed")->mValue.getFloat();
float fThrownWeaponMaxSpeed = gmst.find("fThrownWeaponMaxSpeed")->mValue.getFloat(); float fThrownWeaponMaxSpeed = gmst.find("fThrownWeaponMaxSpeed")->mValue.getFloat();
float speed = fThrownWeaponMinSpeed + (fThrownWeaponMaxSpeed - fThrownWeaponMinSpeed) * attackStrength; float speed = fThrownWeaponMinSpeed + (fThrownWeaponMaxSpeed - fThrownWeaponMinSpeed) * attackStrength;
@ -222,6 +255,39 @@ void WeaponAnimation::releaseArrow(MWWorld::Ptr actor, float attackStrength)
return; return;
osg::Vec3f launchPos = osg::computeLocalToWorld(nodepaths[0]).getTrans(); osg::Vec3f launchPos = osg::computeLocalToWorld(nodepaths[0]).getTrans();
/*
Start of tes3mp addition
If the actor shooting this is a LocalPlayer or LocalActor, track their projectile origin so it can be sent
in the next PlayerAttack or ActorAttack packet
Otherwise, set the projectileOrigin for a DedicatedPlayer or DedicatedActor
*/
if (localAttack)
{
localAttack->projectileOrigin.origin[0] = launchPos.x();
localAttack->projectileOrigin.origin[1] = launchPos.y();
localAttack->projectileOrigin.origin[2] = launchPos.z();
localAttack->projectileOrigin.orientation[0] = orient.x();
localAttack->projectileOrigin.orientation[1] = orient.y();
localAttack->projectileOrigin.orientation[2] = orient.z();
localAttack->projectileOrigin.orientation[3] = orient.w();
}
else
{
mwmp::Attack* dedicatedAttack = MechanicsHelper::getDedicatedAttack(actor);
if (dedicatedAttack)
{
launchPos = osg::Vec3f(dedicatedAttack->projectileOrigin.origin[0], dedicatedAttack->projectileOrigin.origin[1], dedicatedAttack->projectileOrigin.origin[2]);
orient = osg::Quat(dedicatedAttack->projectileOrigin.orientation[0], dedicatedAttack->projectileOrigin.orientation[1], dedicatedAttack->projectileOrigin.orientation[2],
dedicatedAttack->projectileOrigin.orientation[3]);
}
}
/*
End of tes3mp addition
*/
float fProjectileMinSpeed = gmst.find("fProjectileMinSpeed")->mValue.getFloat(); float fProjectileMinSpeed = gmst.find("fProjectileMinSpeed")->mValue.getFloat();
float fProjectileMaxSpeed = gmst.find("fProjectileMaxSpeed")->mValue.getFloat(); float fProjectileMaxSpeed = gmst.find("fProjectileMaxSpeed")->mValue.getFloat();
float speed = fProjectileMinSpeed + (fProjectileMaxSpeed - fProjectileMinSpeed) * attackStrength; float speed = fProjectileMinSpeed + (fProjectileMaxSpeed - fProjectileMinSpeed) * attackStrength;

@ -123,6 +123,7 @@ namespace mwmp
std::string rangedAmmoId; std::string rangedAmmoId;
ESM::Position hitPosition; ESM::Position hitPosition;
ProjectileOrigin projectileOrigin;
float damage = 0; float damage = 0;
float attackStrength = 0; float attackStrength = 0;

@ -40,6 +40,14 @@ void PacketActorAttack::Actor(BaseActor &actor, bool send)
RW(actor.attack.attackStrength, send); RW(actor.attack.attackStrength, send);
RW(actor.attack.rangedWeaponId, send, true); RW(actor.attack.rangedWeaponId, send, true);
RW(actor.attack.rangedAmmoId, send, true); RW(actor.attack.rangedAmmoId, send, true);
RW(actor.attack.projectileOrigin.origin[0], send);
RW(actor.attack.projectileOrigin.origin[1], send);
RW(actor.attack.projectileOrigin.origin[2], send);
RW(actor.attack.projectileOrigin.orientation[0], send);
RW(actor.attack.projectileOrigin.orientation[1], send);
RW(actor.attack.projectileOrigin.orientation[2], send);
RW(actor.attack.projectileOrigin.orientation[3], send);
} }
if (actor.attack.isHit) if (actor.attack.isHit)

@ -41,6 +41,14 @@ void PacketPlayerAttack::Packet(RakNet::BitStream *newBitstream, bool send)
RW(player->attack.attackStrength, send); RW(player->attack.attackStrength, send);
RW(player->attack.rangedWeaponId, send, true); RW(player->attack.rangedWeaponId, send, true);
RW(player->attack.rangedAmmoId, send, true); RW(player->attack.rangedAmmoId, send, true);
RW(player->attack.projectileOrigin.origin[0], send);
RW(player->attack.projectileOrigin.origin[1], send);
RW(player->attack.projectileOrigin.origin[2], send);
RW(player->attack.projectileOrigin.orientation[0], send);
RW(player->attack.projectileOrigin.orientation[1], send);
RW(player->attack.projectileOrigin.orientation[2], send);
RW(player->attack.projectileOrigin.orientation[3], send);
} }
if (player->attack.isHit) if (player->attack.isHit)

Loading…
Cancel
Save