87 lines
2.6 KiB
Lua
87 lines
2.6 KiB
Lua
--[[
|
|
|
|
TechAge
|
|
=======
|
|
|
|
Copyright (C) 2019-2023 Joachim Stolberg
|
|
|
|
AGPL v3
|
|
See LICENSE.txt for more information
|
|
|
|
Wind turbine helper function
|
|
|
|
]]--
|
|
|
|
local S = techage.S
|
|
local P = minetest.string_to_pos
|
|
local M = minetest.get_meta
|
|
|
|
local OCEAN = "ocean"
|
|
|
|
if minetest.global_exists("asuna") then
|
|
OCEAN = "below"
|
|
end
|
|
|
|
local function chat_message(player_name, msg)
|
|
if player_name then
|
|
minetest.chat_send_player(player_name, S("[TA4 Wind Turbine]").." "..msg)
|
|
end
|
|
return false, msg
|
|
end
|
|
|
|
-- num_turbines is the mx number of valid wind turbines. In the case of a tool
|
|
-- it should be 0, in case of the rotor: 1
|
|
function techage.valid_place_for_windturbine(pos, player_name, num_turbines)
|
|
local pos1, pos2, num
|
|
|
|
-- Check if occean (only for tool)
|
|
if num_turbines == 0 and pos.y ~= 1 then
|
|
return chat_message(player_name, S("This is not the surface of the ocean!"))
|
|
end
|
|
local node = minetest.get_node(pos)
|
|
if num_turbines == 0 and node.name ~= "default:water_source" then
|
|
return chat_message(player_name, S("This is no ocean water!"))
|
|
end
|
|
local data = minetest.get_biome_data({x=pos.x, y=-2, z=pos.z})
|
|
if data then
|
|
local name = minetest.get_biome_name(data.biome)
|
|
if not string.find(name, OCEAN) then
|
|
return chat_message(player_name, S("This is a").." "..name.." "..S("biome and no ocean!"))
|
|
end
|
|
end
|
|
-- check the space over ocean
|
|
pos1 = {x=pos.x-20, y=2, z=pos.z-20}
|
|
pos2 = {x=pos.x+20, y=22, z=pos.z+20}
|
|
num = #minetest.find_nodes_in_area(pos1, pos2, {"air", "ignore"})
|
|
if num < (41 * 41 * 21 * 0.9) then
|
|
techage.mark_region(player_name, pos1, pos2, "")
|
|
return chat_message(player_name,
|
|
S("Here is not enough wind\n(A free air space of 41x41x21 m is necessary)!"))
|
|
end
|
|
-- Check for water surface (occean)
|
|
pos1 = {x=pos.x-20, y=1, z=pos.z-20}
|
|
pos2 = {x=pos.x+20, y=1, z=pos.z+20}
|
|
num = #minetest.find_nodes_in_area(pos1, pos2,
|
|
{"default:water_source", "default:water_flowing", "ignore"})
|
|
|
|
if num < (41*41 * 0.8) then
|
|
techage.mark_region(player_name, pos1, pos2, "")
|
|
return chat_message(player_name, S("Here is not enough water (41x41 m)!"))
|
|
end
|
|
-- Check for next wind turbine
|
|
pos1 = {x=pos.x-13, y=2, z=pos.z-13}
|
|
pos2 = {x=pos.x+13, y=22, z=pos.z+13}
|
|
|
|
num = #minetest.find_nodes_in_area(pos1, pos2, {"techage:ta4_wind_turbine"})
|
|
if num > num_turbines then
|
|
techage.mark_region(player_name, pos1, pos2, "")
|
|
return chat_message(player_name, S("The next wind turbines is too close!"))
|
|
end
|
|
|
|
if num_turbines == 0 then
|
|
chat_message(player_name, minetest.pos_to_string(pos).." "..
|
|
S("is a suitable place for a wind turbine!"))
|
|
end
|
|
return true, "ok"
|
|
end
|