strictest/minetest.lua

216 lines
5.4 KiB
Lua

-- Minetest strictness
local action = ...
-- Helpers
local function deprecated(method_table, prefix, deprecations)
for method_name, recommended in pairs(deprecations) do
local original_method = method_table[method_name]
method_table[method_name] = function(...)
action(("deprecated, use `%s%s` instead"):format(prefix, recommended))
return original_method(...)
end
end
end
local function only_def_expected(method_table, method_name, def_name)
local method = method_table[method_name]
method_table[method_name] = function(...)
if select("#", ...) ~= 1 then
action(("only %s expected"):format(def_name))
end
return method(...)
end
end
-- Enforce deprecation of indexing `minetest` with `env` as key
assert(not getmetatable(minetest))
setmetatable(minetest, {__index = function(_, key)
if key == "env" then
action"`minetest.env.*` is deprecated, use just `minetest.*` instead"
end
return nil
end})
-- Throw when calling player-only methods on entities or calling entity-only methods on players
local ObjRef
local player_only = {
"get_player_name",
"get_player_velocity",
"add_player_velocity",
"get_look_dir",
"get_look_vertical",
"get_look_horizontal",
"set_look_vertical",
"set_look_horizontal",
"get_look_pitch",
"get_look_yaw",
"set_look_pitch",
"set_look_yaw",
"get_breath",
"set_breath",
"set_fov",
"get_fov",
"set_attribute",
"get_attribute",
"get_meta",
"set_inventory_formspec",
"get_inventory_formspec",
"set_formspec_prepend",
"get_formspec_prepend",
"get_player_control",
"get_player_control_bits",
"set_physics_override",
"get_physics_override",
"hud_add",
"hud_remove",
"hud_change",
"hud_get",
"hud_set_flags",
"hud_get_flags",
"hud_set_hotbar_itemcount",
"hud_set_hotbar_image",
"hud_set_hotbar_selected_image",
"set_minimap_modes",
"set_sky",
"set_sky",
"set_sky",
"get_sky",
"set_sky",
"get_sky_color",
"get_sky",
"set_sun",
"get_sun",
"set_moon",
"get_moon",
"set_stars",
"get_stars",
"set_clouds",
"get_clouds",
"override_day_night_ratio",
"get_day_night_ratio",
"set_local_animation",
"get_local_animation",
"set_eye_offset",
"get_eye_offset",
"send_mapblock",
"set_lighting",
"get_lighting",
"respawn",
}
local entity_only = {
"remove",
"set_velocity",
"set_acceleration",
"get_acceleration",
"set_rotation",
"get_rotation",
"set_yaw",
"get_yaw",
"set_texture_mod",
"get_texture_mod",
"set_sprite",
"get_entity_name",
"get_luaentity",
}
minetest.register_on_joinplayer(function(player)
-- TODO implement `textures = {itemname}` deprecation for `wielditem` drawtype
if ObjRef then return end
ObjRef = getmetatable(player)
-- (get|add)_player_velocity are deliberately not included here as their deprecation is still somewhat recent
deprecated(ObjRef, "player:", {
get_look_pitch = "get_look_vertical()",
set_look_pitch = "set_look_vertical(radians)",
get_look_yaw = "get_look_horizontal()",
set_look_yaw = "set_look_horizontal(radians)",
get_attribute = "get_meta()",
set_attribute = "get_meta()",
get_sky_color = "get_sky(as_table)"
})
only_def_expected(ObjRef, "set_sky", "sky params")
local ObjRef_get_sky = ObjRef.get_sky
function ObjRef:get_sky(as_table)
if not as_table then
action"deprecated call `player:get_sky(false or nil)`, use `player:get_sky(true)` instead"
end
return ObjRef_get_sky(self, deprecated)
end
for _, method in pairs(player_only) do
local original_method = ObjRef[method]
ObjRef[method] = function(self, ...)
if self:is_player() then
return original_method(self, ...)
end
action"player-only method called on entity"
end
end
function ObjRef.get_entity_name()
action"`object:get_entity_name()` is deprecated, use `object:get_luaentity().name` instead"
end
for _, method in pairs(entity_only) do
local original_method = ObjRef[method]
ObjRef[method] = function(self, ...)
if self:is_player() then
action"entity-only method called on player"
end
return original_method(self, ...)
end
end
end)
local vector_new = vector.new
function vector.new(...)
local n_args = select("#", ...)
if n_args == 1 then
if type(...) ~= "number" then
action"number expected"
end
elseif n_args == 3 then
for i = 1, 3 do
if type(select(i, ...)) ~= "number" then
action"3 numbers expected"
end
end
else
action"1 or 3 args expected"
end
return vector_new(...)
end
-- Schur product/quotient deprecation is not implemented for good reason
only_def_expected(_G, "PerlinNoise", "noiseparams")
only_def_expected(minetest, "get_perlin", "noiseparams")
only_def_expected(minetest, "add_particle", "particle def")
only_def_expected(minetest, "add_particlespawner", "particle spawner def")
deprecated(minetest, "minetest.", {
register_on_auth_fail = "register_on_authplayer(name, ip, is_success)",
get_mapgen_params = "get_mapgen_setting(name)",
set_mapgen_params = "set_mapgen_setting(name, value, override)",
item_place_object = "add_item",
get_node_group = "get_item_group(name, group)"
})
local ItemStackMT = getmetatable(ItemStack())
deprecated(ItemStackMT, "stack:", {
get_metadata = "get_meta()",
set_metadata = "get_meta()",
})
--[[
TODO: implement the following deprecations:
- Tile def `image` field (replaced by `name`)
- HTTPRequest `post_data` field (replaced by `data`)
- Item filtering by string matching (groups should be used instead)
- The mapgen alias "mapgen_lava_source" (replaced by mapgen liquid params)
]]