Compare commits
9 Commits
master
...
beacon-"fo
Author | SHA1 | Date |
---|---|---|
chmodsayshello | c695776105 | |
chmodsayshello | 10a607be7e | |
chmodsayshello | 121bbb6910 | |
chmodsayshello | 614c4a41e2 | |
chmodsayshello | 6cca4ca805 | |
chmodsayshello | d4324bb1a9 | |
chmodsayshello | 143def257e | |
chmodsayshello | c7225a1715 | |
chmodsayshello | a6a4c675d1 |
|
@ -0,0 +1,223 @@
|
|||
--[[
|
||||
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: beacons should only work when there are no blocks (few exceptions) above them!
|
||||
--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 _,obj2 in ipairs(all_objects) do
|
||||
if obj2:is_player() then
|
||||
if effect == "swiftness" then
|
||||
mcl_potions.swiftness_func(obj2,effect_level,16)
|
||||
return
|
||||
elseif effect == "leaping" then
|
||||
mcl_potions.leaping_func(obj2, effect_level, 16)
|
||||
return
|
||||
elseif effect == "strenght" then
|
||||
mcl_potions.strength_func(obj2, effect_level, 16)
|
||||
return
|
||||
elseif effect == "regeneration" then
|
||||
mcl_potions.regeneration_func(obj2, effect_level, 16)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function globalstep_function(pos, forceexecute)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if(meta:get_int("last-effect-cycle")+10 < os.time() or forceexecute) then
|
||||
meta:set_int("last-effect-cycle", os.time())
|
||||
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
|
||||
effect_player(effect_string,pos,power_level,meta:get_int("effect_level"))
|
||||
end
|
||||
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)
|
||||
|
||||
meta:set_int("last-effect-cycle", os.time()-10)
|
||||
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 valid_item ~= true 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,true)--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 time_since_last_beacon_interval = os.time()
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
if time_since_last_beacon_interval + 10 < os.time() then
|
||||
time_since_last_beacon_interval = os.time()
|
||||
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, false)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
|
@ -0,0 +1,2 @@
|
|||
author=chmodsayshello
|
||||
depends=mcl_formspec, mcl_init, mcl_wip, mesecons_mvps, mcl_core, mcl_sounds
|
After Width: | Height: | Size: 338 B |
After Width: | Height: | Size: 339 B |
After Width: | Height: | Size: 337 B |
After Width: | Height: | Size: 340 B |
After Width: | Height: | Size: 338 B |
After Width: | Height: | Size: 340 B |
After Width: | Height: | Size: 635 B |
After Width: | Height: | Size: 635 B |
After Width: | Height: | Size: 641 B |
After Width: | Height: | Size: 635 B |