forked from Mirrorlandia_minetest/minetest
Server-side authority for attached players (#10952)
The server must have authority about attachments. This commit ignores any player movement packets as long they're attached.
This commit is contained in:
parent
f018737b06
commit
7832b6843e
@ -488,8 +488,12 @@ void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
|
|||||||
pitch = modulo360f(pitch);
|
pitch = modulo360f(pitch);
|
||||||
yaw = wrapDegrees_0_360(yaw);
|
yaw = wrapDegrees_0_360(yaw);
|
||||||
|
|
||||||
playersao->setBasePosition(position);
|
if (!playersao->isAttached()) {
|
||||||
player->setSpeed(speed);
|
// Only update player positions when moving freely
|
||||||
|
// to not interfere with attachment handling
|
||||||
|
playersao->setBasePosition(position);
|
||||||
|
player->setSpeed(speed);
|
||||||
|
}
|
||||||
playersao->setLookPitch(pitch);
|
playersao->setLookPitch(pitch);
|
||||||
playersao->setPlayerYaw(yaw);
|
playersao->setPlayerYaw(yaw);
|
||||||
playersao->setFov(fov);
|
playersao->setFov(fov);
|
||||||
|
@ -146,15 +146,11 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
|
|||||||
|
|
||||||
// Each frame, parent position is copied if the object is attached, otherwise it's calculated normally
|
// Each frame, parent position is copied if the object is attached, otherwise it's calculated normally
|
||||||
// If the object gets detached this comes into effect automatically from the last known origin
|
// If the object gets detached this comes into effect automatically from the last known origin
|
||||||
if(isAttached())
|
if (auto *parent = getParent()) {
|
||||||
{
|
m_base_position = parent->getBasePosition();
|
||||||
v3f pos = m_env->getActiveObject(m_attachment_parent_id)->getBasePosition();
|
|
||||||
m_base_position = pos;
|
|
||||||
m_velocity = v3f(0,0,0);
|
m_velocity = v3f(0,0,0);
|
||||||
m_acceleration = v3f(0,0,0);
|
m_acceleration = v3f(0,0,0);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if(m_prop.physical){
|
if(m_prop.physical){
|
||||||
aabb3f box = m_prop.collisionbox;
|
aabb3f box = m_prop.collisionbox;
|
||||||
box.MinEdge *= BS;
|
box.MinEdge *= BS;
|
||||||
|
@ -260,10 +260,13 @@ void PlayerSAO::step(float dtime, bool send_recommended)
|
|||||||
// otherwise it's calculated normally.
|
// otherwise it's calculated normally.
|
||||||
// If the object gets detached this comes into effect automatically from
|
// If the object gets detached this comes into effect automatically from
|
||||||
// the last known origin.
|
// the last known origin.
|
||||||
if (isAttached()) {
|
if (auto *parent = getParent()) {
|
||||||
v3f pos = m_env->getActiveObject(m_attachment_parent_id)->getBasePosition();
|
v3f pos = parent->getBasePosition();
|
||||||
m_last_good_position = pos;
|
m_last_good_position = pos;
|
||||||
setBasePosition(pos);
|
setBasePosition(pos);
|
||||||
|
|
||||||
|
if (m_player)
|
||||||
|
m_player->setSpeed(v3f());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!send_recommended)
|
if (!send_recommended)
|
||||||
@ -570,34 +573,11 @@ void PlayerSAO::setMaxSpeedOverride(const v3f &vel)
|
|||||||
bool PlayerSAO::checkMovementCheat()
|
bool PlayerSAO::checkMovementCheat()
|
||||||
{
|
{
|
||||||
if (m_is_singleplayer ||
|
if (m_is_singleplayer ||
|
||||||
|
isAttached() ||
|
||||||
g_settings->getBool("disable_anticheat")) {
|
g_settings->getBool("disable_anticheat")) {
|
||||||
m_last_good_position = m_base_position;
|
m_last_good_position = m_base_position;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (UnitSAO *parent = dynamic_cast<UnitSAO *>(getParent())) {
|
|
||||||
v3f attachment_pos;
|
|
||||||
{
|
|
||||||
int parent_id;
|
|
||||||
std::string bone;
|
|
||||||
v3f attachment_rot;
|
|
||||||
bool force_visible;
|
|
||||||
getAttachment(&parent_id, &bone, &attachment_pos, &attachment_rot, &force_visible);
|
|
||||||
}
|
|
||||||
|
|
||||||
v3f parent_pos = parent->getBasePosition();
|
|
||||||
f32 diff = m_base_position.getDistanceFromSQ(parent_pos) - attachment_pos.getLengthSQ();
|
|
||||||
const f32 maxdiff = 4.0f * BS; // fair trade-off value for various latencies
|
|
||||||
|
|
||||||
if (diff > maxdiff * maxdiff) {
|
|
||||||
setBasePosition(parent_pos);
|
|
||||||
actionstream << "Server: " << m_player->getName()
|
|
||||||
<< " moved away from parent; diff=" << sqrtf(diff) / BS
|
|
||||||
<< " resetting position." << std::endl;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// Player movement is locked to the entity. Skip further checks
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cheated = false;
|
bool cheated = false;
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user