cc877e1264
because i escape the loop using return after applying the effect to ONE player, which causes the other ones to not get the effect
222 lines
8.1 KiB
Lua
222 lines
8.1 KiB
Lua
--[[
|
|
there are strings in meta, which are being used to see which effect will be given to the player(s)
|
|
Valid strings:
|
|
swiftness
|
|
leaping
|
|
strenght
|
|
regeneration
|
|
]]--
|
|
--TODO: add beacon beam
|
|
--TODO: add translation
|
|
|
|
|
|
local formspec_string=
|
|
"size[11,14]"..
|
|
|
|
"label[4.5,0.5;Beacon:]"..
|
|
"label[0.5,1;Primary Power:]"..
|
|
"label[0.5,8.25;Inventory:]"..
|
|
|
|
"image[1,1.5;1,1;custom_beacom_symbol_4.png]"..
|
|
"image[1,3;1,1;custom_beacom_symbol_3.png]"..
|
|
"image[1,4.5;1,1;custom_beacom_symbol_2.png]"..
|
|
"image[1,6;1,1;custom_beacom_symbol_1.png]"..
|
|
|
|
"image_button[5.2,1.5;1,1;mcl_potions_effect_swift.png;swiftness;]"..
|
|
"image_button[5.2,3;1,1;mcl_potions_effect_leaping.png;leaping;]"..
|
|
"image_button[5.2,4.5;1,1;mcl_potions_effect_strong.png;strenght;]"..
|
|
"image_button[5.2,6;1,1;mcl_potions_effect_regenerating.png;regeneration;]"..
|
|
|
|
"item_image[1,7;1,1;mcl_core:diamond]"..
|
|
"item_image[2.2,7;1,1;mcl_core:emerald]"..
|
|
"item_image[3.4,7;1,1;mcl_core:iron_ingot]"..
|
|
"item_image[4.6,7;1,1;mcl_core:gold_ingot]"..
|
|
|
|
mcl_formspec.get_itemslot_bg(6,7,1,1)..
|
|
"list[context;input;6,7;1,1;]"..
|
|
mcl_formspec.get_itemslot_bg(1,9,9,3)..
|
|
"list[current_player;main;1,9;9,3;9]"..
|
|
mcl_formspec.get_itemslot_bg(1,12.5,9,1)..
|
|
"list[current_player;main;1,12.5;9,1;]"
|
|
|
|
|
|
|
|
local function beacon_blockcheck(pos)
|
|
for y_offset = 1,4 do
|
|
local block_y = pos.y - y_offset
|
|
for block_x = (pos.x-y_offset),(pos.x+y_offset) do
|
|
for block_z = (pos.z-y_offset),(pos.z+y_offset) do
|
|
local valid_block = false --boolean to which stores if block is valid or not
|
|
for _, beacon_block in pairs(beacon_blocklist) do
|
|
if beacon_block == minetest.get_node({x=block_x,y=block_y,z=block_z}).name and not valid_block then --is the block in the pyramid a valid beacon block
|
|
valid_block =true
|
|
end
|
|
end
|
|
if not valid_block then
|
|
return y_offset -1 --the last layer is complete, this one is missing or incomplete
|
|
end
|
|
end
|
|
end
|
|
if y_offset == 4 then --all checks are done, beacon is maxed
|
|
return y_offset
|
|
end
|
|
end
|
|
end
|
|
|
|
local function effect_player(effect,pos,power_level, effect_level)
|
|
local all_objects = minetest.get_objects_inside_radius(pos, ((power_level+1)*10))
|
|
for _,obj in ipairs(all_objects) do
|
|
if obj:is_player() then
|
|
if effect == "swiftness" then
|
|
mcl_potions.swiftness_func(obj,effect_level,16)
|
|
elseif effect == "leaping" then
|
|
mcl_potions.leaping_func(obj, effect_level, 16)
|
|
elseif effect == "strenght" then
|
|
mcl_potions.strength_func(obj, effect_level, 16)
|
|
elseif effect == "regeneration" then
|
|
mcl_potions.regeneration_func(obj, effect_level, 16)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function globalstep_function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local power_level = beacon_blockcheck(pos)
|
|
local effect_string = meta:get_string("effect")
|
|
if meta:get_int("effect_level") == 2 and power_level < 4 then
|
|
return
|
|
else
|
|
local obstructed = false
|
|
for y=pos.y+1, pos.y+301 do
|
|
if y >= 31000 then return end
|
|
local nodename = minetest.get_node({x=pos.x,y=y, z = pos.z}).name
|
|
if nodename ~= "mcl_core:bedrock" and nodename ~= "air" and nodename ~= "ignore" then --ignore means not loaded, let's just assume that's air
|
|
obstructed = true
|
|
return
|
|
end
|
|
end
|
|
if obstructed then return end
|
|
effect_player(effect_string,pos,power_level,meta:get_int("effect_level"))
|
|
end
|
|
end
|
|
|
|
minetest.register_node("mcl_beacons:beacon", {
|
|
--glasslike drawtype?
|
|
description = "Beacon",
|
|
tiles = {
|
|
"beacon_top.png",
|
|
"beacon_bottom.png",
|
|
"beacon_side_1.png",
|
|
"beacon_side_2.png",
|
|
"beacon_side_3.png",
|
|
"beacon_side_4.png"
|
|
},
|
|
on_construct = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
inv:set_size("input", 1)
|
|
local form = formspec_string
|
|
meta:set_string("formspec", form)
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
if fields.swiftness or fields.regeneration or fields.leaping or fields.strenght then
|
|
local sender_name = sender:get_player_name()
|
|
local power_level = beacon_blockcheck(pos)
|
|
if minetest.is_protected(pos, sender_name) then
|
|
minetest.record_protection_violation(pos, sender_name)
|
|
return
|
|
elseif power_level == 0 then
|
|
return
|
|
end
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
local input = inv:get_stack("input",1)
|
|
|
|
if input:is_empty() then
|
|
return
|
|
end
|
|
|
|
local valid_item = false
|
|
|
|
for _, item in ipairs(beacon_fuellist) do
|
|
if input:get_name() == item then
|
|
valid_item = true
|
|
end
|
|
end
|
|
|
|
if not valid_item then
|
|
return
|
|
end
|
|
|
|
local successful = false
|
|
if fields.swiftness then
|
|
if power_level == 4 then
|
|
minetest.get_meta(pos):set_int("effect_level",2)
|
|
else
|
|
minetest.get_meta(pos):set_int("effect_level",1)
|
|
end
|
|
minetest.get_meta(pos):set_string("effect","swiftness")
|
|
successful = true
|
|
elseif fields.leaping and power_level >= 2 then
|
|
if power_level == 4 then
|
|
minetest.get_meta(pos):set_int("effect_level",2)
|
|
else
|
|
minetest.get_meta(pos):set_int("effect_level",1)
|
|
end
|
|
minetest.get_meta(pos):set_string("effect","leaping")
|
|
successful = true
|
|
elseif fields.strenght and power_level >= 3 then
|
|
if power_level == 4 then
|
|
minetest.get_meta(pos):set_int("effect_level",2)
|
|
else
|
|
minetest.get_meta(pos):set_int("effect_level",1)
|
|
end
|
|
minetest.get_meta(pos):set_string("effect","strenght")
|
|
successful = true
|
|
elseif fields.regeneration and power_level == 4 then
|
|
minetest.get_meta(pos):set_int("effect_level",2)
|
|
minetest.get_meta(pos):set_string("effect","regeneration")
|
|
successful = true
|
|
end
|
|
if successful then
|
|
input:take_item()
|
|
inv:set_stack("input",1,input)
|
|
globalstep_function(pos)--call it once outside the globalstep so the player gets the effect right after selecting it
|
|
end
|
|
end
|
|
end,
|
|
light_source = 15,
|
|
sounds = mcl_sounds.node_sound_glass_defaults(),
|
|
})
|
|
|
|
mesecon.register_mvps_stopper("mcl_beacons:beacon")
|
|
mcl_wip.register_wip_item("mcl_beacons:beacon")
|
|
|
|
beacon_blocklist = {"mcl_core:diamondblock","mcl_core:ironblock","mcl_core:goldblock","mcl_core:emeraldblock"}--this is supposed to be a global, don't change that! || TODO: add netherite blocks once implemented!
|
|
beacon_fuellist ={"mcl_core:diamond","mcl_core:emerald","mcl_core:iron_ingot","mcl_core:gold_ingot"}
|
|
|
|
function register_beaconblock (itemstring)--API function for other mods
|
|
table.insert(beacon_blocklist, itemstring)
|
|
end
|
|
|
|
function register_beaconfuel(itemstring)
|
|
table.insert(beacon_fuellist, itemstring)
|
|
end
|
|
|
|
local timer = 0
|
|
|
|
minetest.register_globalstep(function(dtime)
|
|
timer = timer + dtime
|
|
if timer >= 3 then
|
|
for _, player in ipairs(minetest.get_connected_players()) do
|
|
local player_pos = player.get_pos(player)
|
|
local pos_list = minetest.find_nodes_in_area({x=player_pos.x-50, y=player_pos.y-50, z=player_pos.z-50}, {x=player_pos.x+50, y=player_pos.y+50, z=player_pos.z+50},"mcl_beacons:beacon")
|
|
for _, pos in ipairs(pos_list) do
|
|
globalstep_function(pos)
|
|
end
|
|
end
|
|
timer = 0
|
|
end
|
|
end) |