aboutsummaryrefslogtreecommitdiff
path: root/src/server/player_sao.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/player_sao.cpp')
-rw-r--r--src/server/player_sao.cpp62
1 files changed, 46 insertions, 16 deletions
diff --git a/src/server/player_sao.cpp b/src/server/player_sao.cpp
index 3d9f08bfa..62515d1c9 100644
--- a/src/server/player_sao.cpp
+++ b/src/server/player_sao.cpp
@@ -55,6 +55,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t p
m_prop.backface_culling = false;
m_prop.makes_footstep_sound = true;
m_prop.stepheight = PLAYER_DEFAULT_STEPHEIGHT * BS;
+ m_prop.show_on_minimap = true;
m_hp = m_prop.hp_max;
m_breath = m_prop.breath_max;
// Disable zoom in survival mode using a value of 0
@@ -109,7 +110,7 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
// Protocol >= 15
writeU8(os, 1); // version
- os << serializeString(m_player->getName()); // name
+ os << serializeString16(m_player->getName()); // name
writeU8(os, 1); // is_player
writeS16(os, getId()); // id
writeV3F32(os, m_base_position);
@@ -117,22 +118,22 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
writeU16(os, getHP());
std::ostringstream msg_os(std::ios::binary);
- msg_os << serializeLongString(getPropertyPacket()); // message 1
- msg_os << serializeLongString(generateUpdateArmorGroupsCommand()); // 2
- msg_os << serializeLongString(generateUpdateAnimationCommand()); // 3
+ msg_os << serializeString32(getPropertyPacket()); // message 1
+ msg_os << serializeString32(generateUpdateArmorGroupsCommand()); // 2
+ msg_os << serializeString32(generateUpdateAnimationCommand()); // 3
for (const auto &bone_pos : m_bone_position) {
- msg_os << serializeLongString(generateUpdateBonePositionCommand(
- bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // m_bone_position.size
+ msg_os << serializeString32(generateUpdateBonePositionCommand(
+ bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // 3 + N
}
- msg_os << serializeLongString(generateUpdateAttachmentCommand()); // 4
- msg_os << serializeLongString(generateUpdatePhysicsOverrideCommand()); // 5
+ msg_os << serializeString32(generateUpdateAttachmentCommand()); // 4 + m_bone_position.size
+ msg_os << serializeString32(generateUpdatePhysicsOverrideCommand()); // 5 + m_bone_position.size
int message_count = 5 + m_bone_position.size();
for (const auto &id : getAttachmentChildIds()) {
if (ServerActiveObject *obj = m_env->getActiveObject(id)) {
message_count++;
- msg_os << serializeLongString(obj->generateUpdateInfantCommand(
+ msg_os << serializeString32(obj->generateUpdateInfantCommand(
id, protocol_version));
}
}
@@ -457,20 +458,25 @@ u16 PlayerSAO::punch(v3f dir,
void PlayerSAO::setHP(s32 hp, const PlayerHPChangeReason &reason)
{
- s32 oldhp = m_hp;
+ if (hp == (s32)m_hp)
+ return; // Nothing to do
- //hp = rangelim(hp, 0, m_prop.hp_max);
+ if (m_hp <= 0 && hp < (s32)m_hp)
+ return; // Cannot take more damage
- if (oldhp != hp) {
- s32 hp_change = m_env->getScriptIface()->on_player_hpchange(this, hp - oldhp, reason);
+ {
+ s32 hp_change = m_env->getScriptIface()->on_player_hpchange(this, hp - m_hp, reason);
if (hp_change == 0)
return;
- hp = rangelim(oldhp + hp_change, 0, m_prop.hp_max);
+ hp = m_hp + hp_change;
}
+ s32 oldhp = m_hp;
+ hp = rangelim(hp, 0, m_prop.hp_max);
+
if (hp < oldhp && isImmortal())
- return;
+ return; // Do not allow immortal players to be damaged
m_hp = hp;
@@ -558,11 +564,35 @@ void PlayerSAO::setMaxSpeedOverride(const v3f &vel)
bool PlayerSAO::checkMovementCheat()
{
- if (isAttached() || m_is_singleplayer ||
+ if (m_is_singleplayer ||
g_settings->getBool("disable_anticheat")) {
m_last_good_position = m_base_position;
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;
/*