Prevent downwards teleportation

This commit is contained in:
Lizzy Fleckenstein 2021-12-05 14:18:46 +01:00
parent d70c05e92c
commit 195f2c651e
Signed by: LizzyFleckenstein03
GPG Key ID: 06927A5199D6C9B2
12 changed files with 48 additions and 11 deletions

View File

@ -175,7 +175,7 @@ function mobs.detach(player, offset)
minetest.after(0.1, function(name, pos)
local player = minetest.get_player_by_name(name)
if player then
player:set_pos(pos)
mcl_anticheat.set_pos(player, pos)
end
end, player:get_player_name(), pos)
end

View File

@ -66,7 +66,7 @@ minetest.register_globalstep(function(dtime)
-- If damage is disabled, we can't kill players.
-- So we just teleport the player back to spawn.
local spawn = mcl_spawn.get_player_spawn_pos(player)
player:set_pos(spawn)
mcl_anticheat.set_pos(player, spawn)
mcl_worlds.dimension_change(player, mcl_worlds.pos_to_dimension(spawn))
minetest.chat_send_player(player:get_player_name(), S("The void is off-limits to you!"))
elseif enable_damage and not is_immortal then

View File

@ -349,7 +349,7 @@ function mesecon.mvps_move_objects(pos, dir, nodestack)
local nn = minetest.get_node(np)
if not ((not minetest.registered_nodes[nn.name])
or minetest.registered_nodes[nn.name].walkable) then
obj:set_pos(np)
mcl_anticheat.set_pos(obj, np)
end
end
end

View File

@ -128,7 +128,7 @@ local function lay_down(player, pos, bed_pos, state, skip)
mcl_beds.pos[name] = nil
mcl_beds.bed_pos[name] = nil
if p then
player:set_pos(p)
mcl_anticheat.set_pos(player, p)
end
-- skip here to prevent sending player specific changes (used for leaving players)
@ -183,7 +183,7 @@ local function lay_down(player, pos, bed_pos, state, skip)
player:get_meta():set_string("mcl_beds:sleeping", "true")
playerphysics.add_physics_factor(player, "speed", "mcl_beds:sleeping", 0)
playerphysics.add_physics_factor(player, "jump", "mcl_beds:sleeping", 0)
player:set_pos(bed_center)
mcl_anticheat.set_pos(player, bed_center)
mcl_player.player_attached[name] = true
hud_flags.wielditem = false
mcl_player.player_set_animation(player, "lay" , 0)

View File

@ -515,7 +515,7 @@ local random_teleport = function(player)
if streak >= 2 then
-- JACKPOT! Now we can teleport.
local goal = {x=tpos.x, y=tpos.y-1.5, z=tpos.z}
player:set_pos(goal)
mcl_anticheat.set_pos(player, goal)
minetest.sound_play({name="mcl_end_teleport", gain=0.8}, {pos=goal, max_hear_distance=16}, true)
return true
end

View File

@ -211,7 +211,7 @@ function mcl_portals.end_teleport(obj, pos)
end
-- Teleport
obj:set_pos(target)
mcl_anticheat.set_pos(obj, target)
if obj:is_player() then
-- Look towards the main End island

View File

@ -699,7 +699,7 @@ local function teleport_no_delay(obj, pos)
mcl_portals.nether_portal_cooloff[obj] = true
-- Teleport
obj:set_pos(target)
mcl_anticheat.set_pos(obj, target)
if is_player then
mcl_worlds.dimension_change(obj, mcl_worlds.pos_to_dimension(target))

View File

@ -364,7 +364,7 @@ local pearl_on_step = function(self, dtime)
local oldpos = player:get_pos()
-- Teleport and hurt player
player:set_pos(telepos)
mcl_anticheat.set_pos(player, telepos)
player:set_hp(player:get_hp() - 5, { type = "fall", from = "mod" })
-- 5% chance to spawn endermite at the player's origin

View File

@ -259,7 +259,7 @@ do
if param == "default" then
local biome_pos = find_default_biome()
if biome_pos then
player:set_pos(biome_pos)
mcl_anticheat.set_pos(player, biome_pos)
return true, S("Biome found at @1.", minetest.pos_to_string(biome_pos))
else
return false, S("No biome found!")

View File

@ -0,0 +1,35 @@
local MAX_TP_DOWN = 100
mcl_anticheat = {
positions = {}
}
function mcl_anticheat.set_pos(player, pos)
player:set_pos(pos)
if player:is_player() then
mcl_anticheat.positions[player] = pos
end
end
minetest.register_on_joinplayer(function(player)
mcl_anticheat.positions[player] = player:get_pos()
end)
minetest.register_on_leaveplayer(function(player)
mcl_anticheat.positions[player] = nil
end)
minetest.register_globalstep(function()
for _, player in pairs(minetest.get_connected_players()) do
local pos = player:get_pos()
local old_pos = mcl_anticheat.positions[player]
if old_pos.y - pos.y > MAX_TP_DOWN and not player:get_attach() then
player:set_pos(old_pos)
else
mcl_anticheat.positions[player] = pos
end
end
end)

View File

@ -0,0 +1,2 @@
name = mcl_anticheat
author = Fleckenstein

View File

@ -490,7 +490,7 @@ end
mcl_spawn.spawn = function(player)
local pos, in_bed = mcl_spawn.get_player_spawn_pos(player)
player:set_pos(pos)
mcl_anticheat.set_pos(player, pos)
return in_bed or success
end