forked from Mineclonia/Mineclonia
Compare commits
11 Commits
master
...
cora-produ
Author | SHA1 | Date |
---|---|---|
cora | 0de96988ad | |
cora | 51701e7e16 | |
cora | 6a4f45d0b8 | |
cora | 90f2a1a5ab | |
cora | c76ca816b2 | |
cora | 327cf537b5 | |
Lizzy Fleckenstein | 039280b24a | |
Lizzy Fleckenstein | 3482742e88 | |
Lizzy Fleckenstein | 1c91375202 | |
Lizzy Fleckenstein | eff611c02a | |
cora | f44fdc5aa5 |
|
@ -1 +0,0 @@
|
|||
name = walkover
|
|
@ -123,10 +123,6 @@ mobs:register_mob("mobs_mc:snowman", {
|
|||
local pos = self.object:get_pos()
|
||||
minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true)
|
||||
|
||||
if minetest.registered_items["mcl_farming:pumpkin_face"] then
|
||||
minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, "mcl_farming:pumpkin_face")
|
||||
end
|
||||
|
||||
-- Wear out
|
||||
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
||||
item:add_wear(mobs_mc.misc.shears_wear)
|
||||
|
|
|
@ -74,7 +74,7 @@ local professions = {
|
|||
},
|
||||
|
||||
{
|
||||
{ { "mcl_farming:pumpkin", 8, 13 }, E1 },
|
||||
{ { "mcl_farming:pumpkin_face", 8, 13 }, E1 },
|
||||
{ E1, { "mcl_farming:pumpkin_pie", 2, 3} },
|
||||
},
|
||||
|
||||
|
|
|
@ -1,36 +1,66 @@
|
|||
mcl_weather.nether_dust = {}
|
||||
mcl_weather.nether_dust.particles_count = 99
|
||||
mcl_weather.nether_dust.particlespawners = {}
|
||||
|
||||
-- calculates coordinates and draw particles for Nether dust
|
||||
mcl_weather.nether_dust.add_dust_particles = function(player)
|
||||
for i=mcl_weather.nether_dust.particles_count, 1,-1 do
|
||||
local rpx, rpy, rpz = mcl_weather.get_random_pos_by_player_look_dir(player)
|
||||
minetest.add_particle({
|
||||
pos = {x = rpx, y = rpy - math.random(6, 18), z = rpz},
|
||||
velocity = {x = math.random(-30,30)*0.01, y = math.random(-15,15)*0.01, z = math.random(-30,30)*0.01},
|
||||
acceleration = {x = math.random(-50,50)*0.02, y = math.random(-20,20)*0.02, z = math.random(-50,50)*0.02},
|
||||
expirationtime = 3,
|
||||
size = math.random(6,20)*0.01,
|
||||
collisiondetection = false,
|
||||
object_collision = false,
|
||||
vertical = false,
|
||||
glow = math.random(0,minetest.LIGHT_MAX),
|
||||
texture = "mcl_particles_nether_dust"..tostring(i%3+1)..".png",
|
||||
playername = player:get_player_name()
|
||||
})
|
||||
local psdef= {
|
||||
amount = 150,
|
||||
time = 0,
|
||||
minpos = vector.new(-15,-15,-15),
|
||||
maxpos =vector.new(15,15,15),
|
||||
minvel = vector.new(-0.3,-0.15,-1),
|
||||
maxvel = vector.new(0.3,0.15,0.3),
|
||||
minacc = vector.new(-1,-0.4,-1),
|
||||
maxacc = vector.new(1,0.4,1),
|
||||
minexptime = 1,
|
||||
maxexptime = 10,
|
||||
minsize = 0.2,
|
||||
maxsize = 0.7,
|
||||
collisiondetection = false,
|
||||
collision_removal = false,
|
||||
object_collision = false,
|
||||
vertical = false
|
||||
}
|
||||
|
||||
local function check_player(player)
|
||||
local name=player:get_player_name()
|
||||
if mcl_worlds.has_dust(player:get_pos()) and not mcl_weather.nether_dust.particlespawners[name] then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
local timer = 0
|
||||
minetest.register_globalstep(function(dtime)
|
||||
timer = timer + dtime
|
||||
if timer < 0.7 then return end
|
||||
timer = 0
|
||||
mcl_weather.nether_dust.add_particlespawners = function(player)
|
||||
local name=player:get_player_name(name)
|
||||
mcl_weather.nether_dust.particlespawners[name]={}
|
||||
psdef.playername = name
|
||||
psdef.attached = player
|
||||
psdef.glow = math.random(0,minetest.LIGHT_MAX)
|
||||
for i=1,3 do
|
||||
psdef.texture="mcl_particles_nether_dust"..i..".png"
|
||||
mcl_weather.nether_dust.particlespawners[name][i]=minetest.add_particlespawner(psdef)
|
||||
end
|
||||
end
|
||||
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
if not mcl_worlds.has_dust(player:get_pos()) then
|
||||
return false
|
||||
mcl_weather.nether_dust.delete_particlespawners = function(player)
|
||||
local name=player:get_player_name(name)
|
||||
if mcl_weather.nether_dust.particlespawners[name] then
|
||||
for i=1,3 do
|
||||
minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i])
|
||||
end
|
||||
mcl_weather.nether_dust.add_dust_particles(player)
|
||||
mcl_weather.nether_dust.particlespawners[name]=nil
|
||||
end
|
||||
end
|
||||
|
||||
mcl_worlds.register_on_dimension_change(function(player, dimension)
|
||||
if check_player(player) then
|
||||
return mcl_weather.nether_dust.add_particlespawners(player)
|
||||
end
|
||||
mcl_weather.nether_dust.delete_particlespawners(player)
|
||||
end)
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
if check_player(player) then
|
||||
mcl_weather.nether_dust.add_particlespawners(player)
|
||||
end
|
||||
end)
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
mcl_weather.nether_dust.delete_particlespawners(player)
|
||||
end)
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
name = mcl_experience
|
|
@ -1,2 +1 @@
|
|||
name = mcl_formspec
|
||||
description = Helper mod to simplify creation of formspecs a little bit
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
name = mcl_tmp_message
|
|
@ -82,7 +82,7 @@ local dispenserdef = {
|
|||
end,
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta
|
||||
local meta2 = meta:to_table()
|
||||
meta:from_table(oldmetadata)
|
||||
local inv = meta:get_inventory()
|
||||
for i=1, inv:get_size("main") do
|
||||
|
@ -92,7 +92,7 @@ local dispenserdef = {
|
|||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
meta:from_table(meta2:to_table())
|
||||
meta:from_table(meta2)
|
||||
end,
|
||||
_mcl_blast_resistance = 3.5,
|
||||
_mcl_hardness = 3.5,
|
||||
|
|
|
@ -55,7 +55,7 @@ local dropperdef = {
|
|||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta
|
||||
local meta2 = meta:to_table()
|
||||
meta:from_table(oldmetadata)
|
||||
local inv = meta:get_inventory()
|
||||
for i=1, inv:get_size("main") do
|
||||
|
@ -65,7 +65,7 @@ local dropperdef = {
|
|||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
meta:from_table(meta2:to_table())
|
||||
meta:from_table(meta2)
|
||||
end,
|
||||
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
local name = player:get_player_name()
|
||||
|
|
|
@ -53,7 +53,7 @@ local dropperdef = {
|
|||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta
|
||||
local meta2 = meta:to_table()
|
||||
meta:from_table(oldmetadata)
|
||||
local inv = meta:get_inventory()
|
||||
for i=1, inv:get_size("main") do
|
||||
|
@ -63,7 +63,7 @@ local dropperdef = {
|
|||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
meta:from_table(meta2:to_table())
|
||||
meta:from_table(meta2)
|
||||
end,
|
||||
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
local name = player:get_player_name()
|
||||
|
|
|
@ -346,8 +346,16 @@ function mesecon.vm_abort()
|
|||
vm_cache = nil
|
||||
end
|
||||
|
||||
local function is_player_close(pos)
|
||||
for k,p in pairs(minetest.get_connected_players()) do
|
||||
local d=vector.distance(pos,p:get_pos())
|
||||
if d < 40 then return true end
|
||||
end
|
||||
end
|
||||
|
||||
-- Gets the cache entry covering a position, populating it if necessary.
|
||||
local function vm_get_or_create_entry(pos)
|
||||
if not is_player_close(pos) then return end
|
||||
local hash = hash_blockpos(pos)
|
||||
local tbl = vm_cache[hash]
|
||||
if not tbl then
|
||||
|
@ -364,6 +372,7 @@ end
|
|||
-- transaction.
|
||||
function mesecon.vm_get_node(pos)
|
||||
local tbl = vm_get_or_create_entry(pos)
|
||||
if not tbl then return end
|
||||
local index = tbl.va:indexp(pos)
|
||||
local node_value = tbl.data[index]
|
||||
if node_value == minetest.CONTENT_IGNORE then
|
||||
|
@ -380,6 +389,7 @@ end
|
|||
-- Existing param1, param2, and metadata are left alone.
|
||||
function mesecon.vm_swap_node(pos, name)
|
||||
local tbl = vm_get_or_create_entry(pos)
|
||||
if not tbl then return end
|
||||
local index = tbl.va:indexp(pos)
|
||||
tbl.data[index] = minetest.get_content_id(name)
|
||||
tbl.dirty = true
|
||||
|
@ -393,6 +403,7 @@ end
|
|||
--
|
||||
-- Inside a VM transaction, the transaction’s VM cache is used.
|
||||
function mesecon.get_node_force(pos)
|
||||
if not is_player_close(pos) then return end
|
||||
if vm_cache then
|
||||
return mesecon.vm_get_node(pos)
|
||||
else
|
||||
|
@ -424,6 +435,7 @@ function mesecon.swap_node_force(pos, name)
|
|||
-- This serves to both ensure the mapblock is loaded and also hand us
|
||||
-- the old node table so we can preserve param2.
|
||||
local node = mesecon.get_node_force(pos)
|
||||
if not node then return end
|
||||
node.name = name
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
|
|
|
@ -319,10 +319,10 @@ local anvildef = {
|
|||
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta
|
||||
local meta2 = meta:to_table()
|
||||
meta:from_table(oldmetadata)
|
||||
drop_anvil_items(pos, meta)
|
||||
meta:from_table(meta2:to_table())
|
||||
meta:from_table(meta2)
|
||||
end,
|
||||
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||
local name = player:get_player_name()
|
||||
|
|
|
@ -346,7 +346,7 @@ end
|
|||
|
||||
local drop_items_chest = function(pos, oldnode, oldmetadata)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta
|
||||
local meta2 = meta:to_table()
|
||||
if oldmetadata then
|
||||
meta:from_table(oldmetadata)
|
||||
end
|
||||
|
@ -358,7 +358,7 @@ local drop_items_chest = function(pos, oldnode, oldmetadata)
|
|||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
meta:from_table(meta2:to_table())
|
||||
meta:from_table(meta2)
|
||||
end
|
||||
|
||||
local on_chest_blast = function(pos)
|
||||
|
|
|
@ -160,7 +160,7 @@ function mcl_enchanting.combine(itemstack, combine_with)
|
|||
local itemname = itemstack:get_name()
|
||||
local combine_name = combine_with:get_name()
|
||||
local enchanted_itemname = mcl_enchanting.get_enchanted_itemstring(itemname)
|
||||
if enchanted_itemname ~= mcl_enchanting.get_enchanted_itemstring(combine_name) and not mcl_enchanting.is_book(combine_name) then
|
||||
if not enchanted_itemname or enchanted_itemname ~= mcl_enchanting.get_enchanted_itemstring(combine_name) and not mcl_enchanting.is_book(combine_name) then
|
||||
return false
|
||||
end
|
||||
local enchantments = mcl_enchanting.get_enchantments(itemstack)
|
||||
|
|
|
@ -149,19 +149,22 @@ minetest.register_craftitem("mcl_enchanting:book_enchanted", {
|
|||
minetest.register_alias("mcl_books:book_enchanted", "mcl_enchanting:book_enchanted")
|
||||
|
||||
local spawn_book_entity = function(pos, respawn)
|
||||
if respawn then
|
||||
-- Check if we already have a book
|
||||
local objs = minetest.get_objects_inside_radius(pos, 1)
|
||||
for o=1, #objs do
|
||||
local obj = objs[o]
|
||||
local lua = obj:get_luaentity()
|
||||
if lua and lua.name == "mcl_enchanting:book" then
|
||||
if lua._table_pos and vector.equals(pos, lua._table_pos) then
|
||||
return
|
||||
end
|
||||
local cnt=0
|
||||
-- Check if we already have books within 5 nodes distance to avoid too many entities
|
||||
local objs = minetest.get_objects_inside_radius(pos, 5)
|
||||
for o=1, #objs do
|
||||
local obj = objs[o]
|
||||
local lua = obj:get_luaentity()
|
||||
if lua and lua.name == "mcl_enchanting:book" then
|
||||
if respawn and lua._table_pos and vector.equals(pos, lua._table_pos) then
|
||||
return
|
||||
end
|
||||
cnt=cnt+1
|
||||
end
|
||||
end
|
||||
|
||||
if cnt > 10 then return end
|
||||
|
||||
local obj = minetest.add_entity(vector.add(pos, mcl_enchanting.book_offset), "mcl_enchanting:book")
|
||||
if obj then
|
||||
local lua = obj:get_luaentity()
|
||||
|
@ -192,8 +195,8 @@ minetest.register_entity("mcl_enchanting:book", {
|
|||
local old_player_near = self._player_near
|
||||
local player_near = false
|
||||
local player
|
||||
for _, obj in ipairs(minetest.get_objects_inside_radius(vector.subtract(self.object:get_pos(), mcl_enchanting.book_offset), 2.5)) do
|
||||
if obj:is_player() then
|
||||
for _,obj in pairs(minetest.get_connected_players()) do
|
||||
if vector.distance(obj:get_pos(),self.object:get_pos()) < 2.5 then
|
||||
player_near = true
|
||||
player = obj
|
||||
end
|
||||
|
@ -210,6 +213,13 @@ minetest.register_entity("mcl_enchanting:book", {
|
|||
end
|
||||
self._player_near = player_near
|
||||
mcl_enchanting.check_animation_schedule(self, dtime)
|
||||
|
||||
if self._table_pos then
|
||||
local tn=minetest.get_node_or_nil(self._table_pos)
|
||||
if tn and tn.name ~= "mcl_enchanting:table" then
|
||||
self.object:remove()
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
|
@ -309,8 +319,8 @@ minetest.register_abm({
|
|||
nodenames = "mcl_enchanting:table",
|
||||
action = function(pos)
|
||||
local playernames = {}
|
||||
for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 15)) do
|
||||
if obj:is_player() then
|
||||
for _,obj in pairs(minetest.get_connected_players()) do
|
||||
if vector.distance(obj:get_pos(),pos) < 15 then
|
||||
table.insert(playernames, obj:get_player_name())
|
||||
end
|
||||
end
|
||||
|
|
|
@ -18,21 +18,19 @@ minetest.register_node("mcl_farming:beetroot_0", {
|
|||
_doc_items_longdesc = S("Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature."),
|
||||
_doc_items_entry_name = S("Premature Beetroot Plant"),
|
||||
paramtype = "light",
|
||||
paramtype2 = "meshoptions",
|
||||
sunlight_propagates = true,
|
||||
-- keep place_param2 for plantlike drawtype compatiblity
|
||||
place_param2 = 3,
|
||||
walkable = false,
|
||||
drawtype = "nodebox",
|
||||
node_box = mcl_farming:get_plantlike_grid_nodebox(),
|
||||
drawtype = "plantlike",
|
||||
drop = "mcl_farming:beetroot_seeds",
|
||||
tiles = { mcl_farming:align_plantlike_nodebox_texture("mcl_farming_beetroot_0.png") },
|
||||
use_texture_alpha = "clip",
|
||||
tiles = {"mcl_farming_beetroot_0.png"},
|
||||
inventory_image = "mcl_farming_beetroot_0.png",
|
||||
wield_image = "mcl_farming_beetroot_0.png",
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -9/16, -0.5, 0.5, -6/16, 0.5}
|
||||
{-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}
|
||||
},
|
||||
},
|
||||
groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1},
|
||||
|
@ -44,21 +42,19 @@ minetest.register_node("mcl_farming:beetroot_1", {
|
|||
description = S("Premature Beetroot Plant (Stage 2)"),
|
||||
_doc_items_create_entry = false,
|
||||
paramtype = "light",
|
||||
paramtype2 = "meshoptions",
|
||||
sunlight_propagates = true,
|
||||
-- keep place_param2 for plantlike drawtype compatiblity
|
||||
place_param2 = 3,
|
||||
walkable = false,
|
||||
drawtype = "nodebox",
|
||||
node_box = mcl_farming:get_plantlike_grid_nodebox(),
|
||||
drawtype = "plantlike",
|
||||
drop = "mcl_farming:beetroot_seeds",
|
||||
tiles = { mcl_farming:align_plantlike_nodebox_texture("mcl_farming_beetroot_1.png") },
|
||||
use_texture_alpha = "clip",
|
||||
tiles = {"mcl_farming_beetroot_1.png"},
|
||||
inventory_image = "mcl_farming_beetroot_1.png",
|
||||
wield_image = "mcl_farming_beetroot_1.png",
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -9/16, -0.5, 0.5, -4/16, 0.5}
|
||||
{-0.5, -0.5, -0.5, 0.5, -3/16, 0.5}
|
||||
},
|
||||
},
|
||||
groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1},
|
||||
|
@ -70,21 +66,19 @@ minetest.register_node("mcl_farming:beetroot_2", {
|
|||
description = S("Premature Beetroot Plant (Stage 3)"),
|
||||
_doc_items_create_entry = false,
|
||||
paramtype = "light",
|
||||
paramtype2 = "meshoptions",
|
||||
sunlight_propagates = true,
|
||||
-- keep place_param2 for plantlike drawtype compatiblity
|
||||
place_param2 = 3,
|
||||
walkable = false,
|
||||
drawtype = "nodebox",
|
||||
node_box = mcl_farming:get_plantlike_grid_nodebox(),
|
||||
drawtype = "plantlike",
|
||||
drop = "mcl_farming:beetroot_seeds",
|
||||
tiles = { mcl_farming:align_plantlike_nodebox_texture("mcl_farming_beetroot_2.png") },
|
||||
use_texture_alpha = "clip",
|
||||
tiles = {"mcl_farming_beetroot_2.png"},
|
||||
inventory_image = "mcl_farming_beetroot_2.png",
|
||||
wield_image = "mcl_farming_beetroot_2.png",
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -9/16, -0.5, 0.5, 1/16, 0.5}
|
||||
{-0.5, -0.5, -0.5, 0.5, 2/16, 0.5}
|
||||
},
|
||||
},
|
||||
groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1},
|
||||
|
@ -97,12 +91,11 @@ minetest.register_node("mcl_farming:beetroot", {
|
|||
_doc_items_longdesc = S("A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further."),
|
||||
_doc_items_create_entry = true,
|
||||
paramtype = "light",
|
||||
paramtype2 = "meshoptions",
|
||||
sunlight_propagates = true,
|
||||
-- keep place_param2 for plantlike drawtype compatiblity
|
||||
place_param2 = 3,
|
||||
walkable = false,
|
||||
drawtype = "nodebox",
|
||||
node_box = mcl_farming:get_plantlike_grid_nodebox(),
|
||||
drawtype = "plantlike",
|
||||
drop = {
|
||||
--[[ drops 1 beetroot guaranteed.
|
||||
drops 1-4 beetroot seeds:
|
||||
|
@ -119,14 +112,13 @@ minetest.register_node("mcl_farming:beetroot", {
|
|||
{ items = {"mcl_farming:beetroot_seeds 1"}, rarity = 4 },
|
||||
},
|
||||
},
|
||||
tiles = { mcl_farming:align_plantlike_nodebox_texture("mcl_farming_beetroot_3.png") },
|
||||
use_texture_alpha = "clip",
|
||||
tiles = {"mcl_farming_beetroot_3.png"},
|
||||
inventory_image = "mcl_farming_beetroot_3.png",
|
||||
wield_image = "mcl_farming_beetroot_3.png",
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -9/16, -0.5, 0.5, 2/16, 0.5}
|
||||
{-0.5, -0.5, -0.5, 0.5, 3/16, 0.5}
|
||||
},
|
||||
},
|
||||
groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,beetroot=4},
|
||||
|
|
|
@ -28,20 +28,18 @@ for i=1, 7 do
|
|||
_doc_items_longdesc = longdesc,
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
-- keep place_param2 for plantlike drawtype compatiblity
|
||||
paramtype2 = "meshoptions",
|
||||
place_param2 = 3,
|
||||
walkable = false,
|
||||
drawtype = "nodebox",
|
||||
node_box = mcl_farming:get_plantlike_grid_nodebox(),
|
||||
drawtype = "plantlike",
|
||||
drop = "mcl_farming:carrot_item",
|
||||
tiles = { mcl_farming:align_plantlike_nodebox_texture(texture) },
|
||||
use_texture_alpha = "clip",
|
||||
tiles = {texture},
|
||||
inventory_image = texture,
|
||||
wield_image = texture,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -9/16, -0.5, 0.5, sel_height - 1/16, 0.5}
|
||||
{-0.5, -0.5, -0.5, 0.5, sel_height, 0.5}
|
||||
},
|
||||
},
|
||||
groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1},
|
||||
|
@ -55,13 +53,11 @@ minetest.register_node("mcl_farming:carrot", {
|
|||
_doc_items_longdesc = S("Mature carrot plants are ready to be harvested for carrots. They won't grow any further."),
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
-- keep place_param2 for plantlike drawtype compatiblity
|
||||
paramtype2 = "meshoptions",
|
||||
place_param2 = 3,
|
||||
walkable = false,
|
||||
drawtype = "nodebox",
|
||||
node_box = mcl_farming:get_plantlike_grid_nodebox(),
|
||||
tiles = { mcl_farming:align_plantlike_nodebox_texture("farming_carrot_4.png") },
|
||||
use_texture_alpha = "clip",
|
||||
drawtype = "plantlike",
|
||||
tiles = {"farming_carrot_4.png"},
|
||||
inventory_image = "farming_carrot_4.png",
|
||||
wield_image = "farming_carrot_4.png",
|
||||
drop = {
|
||||
|
@ -76,7 +72,7 @@ minetest.register_node("mcl_farming:carrot", {
|
|||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -9/16, -0.5, 0.5, 3/16, 0.5}
|
||||
{-0.5, -0.5, -0.5, 0.5, 4/16, 0.5}
|
||||
},
|
||||
},
|
||||
groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1},
|
||||
|
|
|
@ -27,73 +27,3 @@ dofile(minetest.get_modpath("mcl_farming").."/potatoes.lua")
|
|||
|
||||
-- ========= BEETROOT =========
|
||||
dofile(minetest.get_modpath("mcl_farming").."/beetroot.lua")
|
||||
|
||||
-- This function generates a row of plantlike and nodebox nodes whose
|
||||
-- name starts with a given string, starting at a given position. It
|
||||
-- places a given node below so that the rendering can be examined.
|
||||
local function generate_plant_row(prefix, pos, below_node)
|
||||
local i = 1
|
||||
for node_name, node in pairs(minetest.registered_nodes) do
|
||||
if (
|
||||
1 == node_name:find(prefix) and
|
||||
(
|
||||
"plantlike" == node.drawtype or
|
||||
"nodebox" == node.drawtype
|
||||
)
|
||||
) then
|
||||
local node_pos = {
|
||||
x = pos.x + i,
|
||||
y = pos.y,
|
||||
z = pos.z,
|
||||
}
|
||||
minetest.set_node(
|
||||
node_pos,
|
||||
{
|
||||
name = node_name,
|
||||
param2 = node.place_param2 or 0
|
||||
}
|
||||
)
|
||||
local below_pos = {
|
||||
x = node_pos.x,
|
||||
y = node_pos.y - 1,
|
||||
z = node_pos.z
|
||||
}
|
||||
minetest.set_node(
|
||||
below_pos,
|
||||
below_node
|
||||
)
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_chatcommand("generate_farming_plant_rows",{
|
||||
description = "Generates rows of mcl_farming plant nodes on farming soil and glass",
|
||||
privs = { debug = true },
|
||||
func = function(name, param)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
local pos = player:get_pos()
|
||||
local node_prefixes = {
|
||||
"mcl_farming:beetroot",
|
||||
"mcl_farming:carrot",
|
||||
"mcl_farming:melon",
|
||||
"mcl_farming:potato",
|
||||
"mcl_farming:pumpkin",
|
||||
"mcl_farming:wheat",
|
||||
}
|
||||
for i,node_prefix in ipairs(node_prefixes) do
|
||||
generate_plant_row(
|
||||
node_prefix,
|
||||
pos,
|
||||
{ name = "mcl_farming:soil" }
|
||||
)
|
||||
pos.z = pos.z + 2
|
||||
generate_plant_row(
|
||||
node_prefix,
|
||||
pos,
|
||||
{ name = "mcl_core:glass" }
|
||||
)
|
||||
pos.z = pos.z + 2
|
||||
end
|
||||
end
|
||||
})
|
||||
|
|
|
@ -91,18 +91,16 @@ for s=1,7 do
|
|||
_doc_items_longdesc = longdesc,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
drawtype = "nodebox",
|
||||
node_box = mcl_farming:get_plantlike_plus_nodebox(),
|
||||
drawtype = "plantlike",
|
||||
sunlight_propagates = true,
|
||||
drop = stem_drop,
|
||||
tiles = { mcl_farming:align_plantlike_nodebox_texture(texture) },
|
||||
use_texture_alpha = "clip",
|
||||
tiles = {texture},
|
||||
wield_image = texture,
|
||||
inventory_image = texture,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.15, -9/16, -0.15, 0.15, -9/16+h, 0.15}
|
||||
{-0.15, -0.5, -0.15, 0.15, -0.5+h, 0.15}
|
||||
},
|
||||
},
|
||||
groups = {dig_immediate=3, not_in_creative_inventory=1, plant=1,attached_node=1, dig_by_water=1,destroy_by_lava_flow=1, plant_melon_stem=s},
|
||||
|
|
|
@ -6,13 +6,13 @@ for i=1, 7 do
|
|||
local texture, selbox
|
||||
if i < 3 then
|
||||
texture = "mcl_farming_potatoes_stage_0.png"
|
||||
selbox = { -0.5, -9/16, -0.5, 0.5, -6/16, 0.5 }
|
||||
selbox = { -0.5, -0.5, -0.5, 0.5, -5/16, 0.5 }
|
||||
elseif i < 5 then
|
||||
texture = "mcl_farming_potatoes_stage_1.png"
|
||||
selbox = { -0.5, -9/16, -0.5, 0.5, -3/16, 0.5 }
|
||||
selbox = { -0.5, -0.5, -0.5, 0.5, -2/16, 0.5 }
|
||||
else
|
||||
texture = "mcl_farming_potatoes_stage_2.png"
|
||||
selbox = { -0.5, -9/16, -0.5, 0.5, 1/16, 0.5 }
|
||||
selbox = { -0.5, -0.5, -0.5, 0.5, 2/16, 0.5 }
|
||||
end
|
||||
|
||||
local create, name, longdesc
|
||||
|
@ -33,15 +33,13 @@ for i=1, 7 do
|
|||
_doc_items_entry_name = name,
|
||||
_doc_items_longdesc = longdesc,
|
||||
paramtype = "light",
|
||||
paramtype2 = "meshoptions",
|
||||
sunlight_propagates = true,
|
||||
-- keep place_param2 for plantlike drawtype compatiblity
|
||||
place_param2 = 3,
|
||||
walkable = false,
|
||||
drawtype = "nodebox",
|
||||
node_box = mcl_farming:get_plantlike_grid_nodebox(),
|
||||
drawtype = "plantlike",
|
||||
drop = "mcl_farming:potato_item",
|
||||
tiles = { mcl_farming:align_plantlike_nodebox_texture(texture) },
|
||||
use_texture_alpha = "clip",
|
||||
tiles = { texture },
|
||||
inventory_image = texture,
|
||||
wield_image = texture,
|
||||
selection_box = {
|
||||
|
@ -59,14 +57,12 @@ minetest.register_node("mcl_farming:potato", {
|
|||
description = S("Mature Potato Plant"),
|
||||
_doc_items_longdesc = S("Mature potato plants are ready to be harvested for potatoes. They won't grow any further."),
|
||||
paramtype = "light",
|
||||
paramtype2 = "meshoptions",
|
||||
sunlight_propagates = true,
|
||||
-- keep place_param2 for plantlike drawtype compatiblity
|
||||
place_param2 = 3,
|
||||
walkable = false,
|
||||
drawtype = "nodebox",
|
||||
node_box = mcl_farming:get_plantlike_grid_nodebox(),
|
||||
tiles = { mcl_farming:align_plantlike_nodebox_texture("mcl_farming_potatoes_stage_3.png") },
|
||||
use_texture_alpha = "clip",
|
||||
drawtype = "plantlike",
|
||||
tiles = {"mcl_farming_potatoes_stage_3.png"},
|
||||
wield_image = "mcl_farming_potatoes_stage_3.png",
|
||||
inventory_image = "mcl_farming_potatoes_stage_3.png",
|
||||
drop = {
|
||||
|
@ -81,7 +77,7 @@ minetest.register_node("mcl_farming:potato", {
|
|||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -0.5, -9/16, -0.5, 0.5, 0, 0.5 }
|
||||
{ -0.5, -0.5, -0.5, 0.5, 1/16, 0.5 }
|
||||
}
|
||||
},
|
||||
groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1},
|
||||
|
|
|
@ -63,18 +63,16 @@ for s=1,7 do
|
|||
_doc_items_longdesc = longdesc,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
drawtype = "nodebox",
|
||||
node_box = mcl_farming:get_plantlike_plus_nodebox(),
|
||||
drawtype = "plantlike",
|
||||
sunlight_propagates = true,
|
||||
drop = stem_drop,
|
||||
tiles = { mcl_farming:align_plantlike_nodebox_texture(texture) },
|
||||
use_texture_alpha = "clip",
|
||||
tiles = {texture},
|
||||
inventory_image = texture,
|
||||
wield_image = texture,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.15, -9/16, -0.15, 0.15, -9/16+h, 0.15}
|
||||
{-0.15, -0.5, -0.15, 0.15, -0.5+h, 0.15}
|
||||
},
|
||||
},
|
||||
groups = {dig_immediate=3, not_in_creative_inventory=1, plant=1,attached_node=1, dig_by_water=1,destroy_by_lava_flow=1,},
|
||||
|
@ -106,6 +104,7 @@ local pumpkin_base_def = {
|
|||
_mcl_blast_resistance = 1,
|
||||
_mcl_hardness = 1,
|
||||
}
|
||||
minetest.register_node("mcl_farming:pumpkin", pumpkin_base_def)
|
||||
|
||||
local pumpkin_face_base_def = table.copy(pumpkin_base_def)
|
||||
pumpkin_face_base_def.description = S("Pumpkin")
|
||||
|
@ -116,11 +115,6 @@ pumpkin_face_base_def.groups.armor_head=1
|
|||
pumpkin_face_base_def._mcl_armor_mob_range_factor = 0
|
||||
pumpkin_face_base_def._mcl_armor_mob_range_mob = "mobs_mc:enderman"
|
||||
pumpkin_face_base_def.groups.non_combat_armor=1
|
||||
pumpkin_face_base_def.on_construct = function(pos)
|
||||
-- Attempt to spawn iron golem or snow golem
|
||||
mobs_mc.tools.check_iron_golem_summon(pos)
|
||||
mobs_mc.tools.check_snow_golem_summon(pos)
|
||||
end
|
||||
if minetest.get_modpath("mcl_armor") then
|
||||
pumpkin_face_base_def.on_secondary_use = armor.on_armor_use
|
||||
end
|
||||
|
@ -129,11 +123,12 @@ end
|
|||
mcl_farming:add_plant("plant_pumpkin_stem", "mcl_farming:pumpkintige_unconnect", {"mcl_farming:pumpkin_1", "mcl_farming:pumpkin_2", "mcl_farming:pumpkin_3", "mcl_farming:pumpkin_4", "mcl_farming:pumpkin_5", "mcl_farming:pumpkin_6", "mcl_farming:pumpkin_7"}, 30, 5)
|
||||
|
||||
-- Register actual pumpkin, connected stems and stem-to-pumpkin growth
|
||||
mcl_farming:add_gourd("mcl_farming:pumpkintige_unconnect", "mcl_farming:pumpkintige_linked", "mcl_farming:pumpkintige_unconnect", stem_def, stem_drop, "mcl_farming:pumpkin", pumpkin_base_def, 30, 15, "mcl_farming_pumpkin_stem_connected.png^[colorize:#FFA800:127")
|
||||
|
||||
-- Steal function to properly disconnect a carved pumpkin
|
||||
pumpkin_face_base_def.after_destruct = minetest.registered_nodes["mcl_farming:pumpkin"].after_destruct
|
||||
minetest.register_node("mcl_farming:pumpkin_face", pumpkin_face_base_def)
|
||||
mcl_farming:add_gourd("mcl_farming:pumpkintige_unconnect", "mcl_farming:pumpkintige_linked", "mcl_farming:pumpkintige_unconnect", stem_def, stem_drop, "mcl_farming:pumpkin_face", pumpkin_face_base_def, 30, 15, "mcl_farming_pumpkin_stem_connected.png^[colorize:#FFA800:127",
|
||||
function(pos)
|
||||
-- Attempt to spawn iron golem or snow golem
|
||||
mobs_mc.tools.check_iron_golem_summon(pos)
|
||||
mobs_mc.tools.check_snow_golem_summon(pos)
|
||||
end)
|
||||
|
||||
-- Jack o'Lantern
|
||||
minetest.register_node("mcl_farming:pumpkin_face_light", {
|
||||
|
@ -170,6 +165,11 @@ minetest.register_craft({
|
|||
recipe = {{"mcl_farming:pumpkin"}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_farming:pumpkin_seeds 4",
|
||||
recipe = {{"mcl_farming:pumpkin_face"}}
|
||||
})
|
||||
|
||||
minetest.register_craftitem("mcl_farming:pumpkin_pie", {
|
||||
description = S("Pumpkin Pie"),
|
||||
_doc_items_longdesc = S("A pumpkin pie is a tasty food item which can be eaten."),
|
||||
|
@ -187,6 +187,11 @@ minetest.register_craft({
|
|||
output = "mcl_farming:pumpkin_pie",
|
||||
recipe = {"mcl_farming:pumpkin", "mcl_core:sugar", "mcl_throwing:egg"},
|
||||
})
|
||||
minetest.register_craft({
|
||||
type = "shapeless",
|
||||
output = "mcl_farming:pumpkin_pie",
|
||||
recipe = {"mcl_farming:pumpkin_face", "mcl_core:sugar", "mcl_throwing:egg"},
|
||||
})
|
||||
|
||||
|
||||
if minetest.get_modpath("doc") then
|
||||
|
|
|
@ -178,7 +178,7 @@ end
|
|||
- stem_def: Partial node definition of the fully-grown unconnected stem node. Many fields are already defined. You need to add `tiles` and `description` at minimum. Don't define on_construct without good reason
|
||||
- stem_drop: Drop probability table for all stem
|
||||
- gourd_itemstring: Desired itemstring of the full gourd node
|
||||
- gourd_def: (almost) full definition of the gourd node. This function will add on_construct and after_destruct to the definition for unconnecting any connected stems
|
||||
- gourd_def: (almost) full definition of the gourd node. This function will add on_construct and after_dig_node to the definition for unconnecting any connected stems
|
||||
- grow_interval: Will attempt to grow a gourd periodically at this interval in seconds
|
||||
- grow_chance: Chance of 1/grow_chance to grow a gourd next to the full unconnected stem after grow_interval has passed. Must be a natural number
|
||||
- connected_stem_texture: Texture of the connected stem
|
||||
|
@ -228,8 +228,8 @@ function mcl_farming:add_gourd(full_unconnected_stem, connected_stem_basename, s
|
|||
end
|
||||
|
||||
-- Register gourd
|
||||
if not gourd_def.after_destruct then
|
||||
gourd_def.after_destruct = function(blockpos, oldnode)
|
||||
if not gourd_def.after_dig_node then
|
||||
gourd_def.after_dig_node = function(blockpos, oldnode, oldmetadata, user)
|
||||
-- Disconnect any connected stems, turning them back to normal stems
|
||||
for n=1, #neighbors do
|
||||
local offset = neighbors[n]
|
||||
|
@ -265,7 +265,7 @@ function mcl_farming:add_gourd(full_unconnected_stem, connected_stem_basename, s
|
|||
stem_def.selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.15, -9/16, -0.15, 0.15, 7/16, 0.15}
|
||||
{-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}
|
||||
},
|
||||
}
|
||||
end
|
||||
|
@ -273,20 +273,7 @@ function mcl_farming:add_gourd(full_unconnected_stem, connected_stem_basename, s
|
|||
stem_def.paramtype = "light"
|
||||
end
|
||||
if not stem_def.drawtype then
|
||||
stem_def.drawtype = "nodebox"
|
||||
end
|
||||
if not stem_def.node_box then
|
||||
stem_def.node_box = mcl_farming:get_plantlike_plus_nodebox()
|
||||
end
|
||||
if stem_def.tiles then
|
||||
for i=1,#stem_def.tiles do
|
||||
stem_def.tiles[i] = mcl_farming:align_plantlike_nodebox_texture(
|
||||
stem_def.tiles[i]
|
||||
)
|
||||
end
|
||||
end
|
||||
if not stem_def.use_texture_alpha then
|
||||
stem_def.use_texture_alpha = "clip"
|
||||
stem_def.drawtype = "plantlike"
|
||||
end
|
||||
if stem_def.walkable == nil then
|
||||
stem_def.walkable = false
|
||||
|
@ -313,9 +300,7 @@ function mcl_farming:add_gourd(full_unconnected_stem, connected_stem_basename, s
|
|||
minetest.register_node(stem_itemstring, stem_def)
|
||||
|
||||
-- Register connected stems
|
||||
local connected_stem_texture = mcl_farming:align_plantlike_nodebox_texture(
|
||||
connected_stem_texture
|
||||
)
|
||||
|
||||
local connected_stem_tiles = {
|
||||
{ "blank.png", --top
|
||||
"blank.png", -- bottom
|
||||
|
@ -347,16 +332,16 @@ function mcl_farming:add_gourd(full_unconnected_stem, connected_stem_basename, s
|
|||
}
|
||||
}
|
||||
local connected_stem_nodebox = {
|
||||
{-0.5, -9/16, 0, 0.5, 7/16, 0},
|
||||
{-0.5, -9/16, 0, 0.5, 7/16, 0},
|
||||
{0, -9/16, -0.5, 0, 7/16, 0.5},
|
||||
{0, -9/16, -0.5, 0, 7/16, 0.5},
|
||||
{-0.5, -0.5, 0, 0.5, 0.5, 0},
|
||||
{-0.5, -0.5, 0, 0.5, 0.5, 0},
|
||||
{0, -0.5, -0.5, 0, 0.5, 0.5},
|
||||
{0, -0.5, -0.5, 0, 0.5, 0.5},
|
||||
}
|
||||
local connected_stem_selectionbox = {
|
||||
{-0.1, -9/16, -0.1, 0.5, 0.2 - 1/16, 0.1},
|
||||
{-0.5, -9/16, -0.1, 0.1, 0.2 - 1/16, 0.1},
|
||||
{-0.1, -9/16, -0.1, 0.1, 0.2 - 1/16, 0.5},
|
||||
{-0.1, -9/16, -0.5, 0.1, 0.2 - 1/16, 0.1},
|
||||
{-0.1, -0.5, -0.1, 0.5, 0.2, 0.1},
|
||||
{-0.5, -0.5, -0.1, 0.1, 0.2, 0.1},
|
||||
{-0.1, -0.5, -0.1, 0.1, 0.2, 0.5},
|
||||
{-0.1, -0.5, -0.5, 0.1, 0.2, 0.1},
|
||||
}
|
||||
|
||||
for i=1, 4 do
|
||||
|
@ -484,40 +469,3 @@ minetest.register_lbm({
|
|||
mcl_farming:grow_plant(identifier, pos, node, false, false, low_speed)
|
||||
end,
|
||||
})
|
||||
|
||||
-- This function returns a nodebox that imitates a plantlike plus (+)
|
||||
-- drawtype, but is shifted 1/16 lower, into the empty space above
|
||||
-- farming soil. The regular plantlike drawtype can not do this.
|
||||
function mcl_farming:get_plantlike_plus_nodebox()
|
||||
return {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ 0, -9/16, -0.15, 0, 7/16, 0.15 },
|
||||
{ -0.15, -9/16, 0, 0.15, 7/16, 0 }
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
-- This function returns a nodebox that imitates a plantlike grid (#)
|
||||
-- drawtype, but is shifted 1/16 lower, into the empty space above
|
||||
-- farming soil. The regular plantlike drawtype can not do this.
|
||||
function mcl_farming:get_plantlike_grid_nodebox()
|
||||
return {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ 4/16, -9/16, -8/16, 4/16, 7/16, 8/16},
|
||||
{-4/16, -9/16, -8/16, -4/16, 7/16, 8/16},
|
||||
{-8/16, -9/16, -4/16, 8/16, 7/16, -4/16},
|
||||
{-8/16, -9/16, 4/16, 8/16, 7/16, 4/16},
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
-- This function takes a texture and returns a modified texture where
|
||||
-- the bottom row is at the top, assuming 16px × 16px textures. This
|
||||
-- is used to align textures to a “plantlike” nodebox shifted 1/16
|
||||
-- below its own node – into the empty space above farming soil.
|
||||
function mcl_farming:align_plantlike_nodebox_texture(texture)
|
||||
local texture = texture:gsub("%^", "\\%^"):gsub(":", "\\:")
|
||||
return "[combine:16x16:0,-15=" .. texture .. ":0,1=" .. texture
|
||||
end
|
||||
|
|
|
@ -39,21 +39,19 @@ for i=1,7 do
|
|||
_doc_items_entry_name = name,
|
||||
_doc_items_longdesc = longdesc,
|
||||
paramtype = "light",
|
||||
-- keep place_param2 for plantlike drawtype compatiblity
|
||||
paramtype2 = "meshoptions",
|
||||
place_param2 = 3,
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
drawtype = "nodebox",
|
||||
node_box = mcl_farming:get_plantlike_grid_nodebox(),
|
||||
drawtype = "plantlike",
|
||||
drop = "mcl_farming:wheat_seeds",
|
||||
tiles = { mcl_farming:align_plantlike_nodebox_texture("mcl_farming_wheat_stage_"..(i-1)..".png") },
|
||||
use_texture_alpha = "clip",
|
||||
tiles = {"mcl_farming_wheat_stage_"..(i-1)..".png"},
|
||||
inventory_image = "mcl_farming_wheat_stage_"..(i-1)..".png",
|
||||
wield_image = "mcl_farming_wheat_stage_"..(i-1)..".png",
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -9/16, -0.5, 0.5, sel_heights[i] - 1/16, 0.5}
|
||||
{-0.5, -0.5, -0.5, 0.5, sel_heights[i], 0.5}
|
||||
},
|
||||
},
|
||||
groups = {dig_immediate=3, not_in_creative_inventory=1, plant=1,attached_node=1, dig_by_water=1,destroy_by_lava_flow=1, dig_by_piston=1},
|
||||
|
@ -67,21 +65,13 @@ minetest.register_node("mcl_farming:wheat", {
|
|||
_doc_items_longdesc = S("Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further."),
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
-- keep place_param2 for plantlike drawtype compatiblity
|
||||
paramtype2 = "meshoptions",
|
||||
place_param2 = 3,
|
||||
walkable = false,
|
||||
drawtype = "nodebox",
|
||||
node_box = mcl_farming:get_plantlike_grid_nodebox(),
|
||||
tiles = { mcl_farming:align_plantlike_nodebox_texture("mcl_farming_wheat_stage_7.png") },
|
||||
use_texture_alpha = "clip",
|
||||
drawtype = "plantlike",
|
||||
tiles = {"mcl_farming_wheat_stage_7.png"},
|
||||
inventory_image = "mcl_farming_wheat_stage_7.png",
|
||||
wield_image = "mcl_farming_wheat_stage_7.png",
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -0.5, -9/16, -0.5, 0.5, 7/16, 0.5 }
|
||||
}
|
||||
},
|
||||
drop = {
|
||||
max_items = 4,
|
||||
items = {
|
||||
|
|
|
@ -451,7 +451,7 @@ minetest.register_node("mcl_furnaces:furnace", {
|
|||
on_timer = furnace_node_timer,
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta
|
||||
local meta2 = meta:to_table()
|
||||
meta:from_table(oldmetadata)
|
||||
local inv = meta:get_inventory()
|
||||
for _, listname in ipairs({"src", "dst", "fuel"}) do
|
||||
|
@ -461,7 +461,7 @@ minetest.register_node("mcl_furnaces:furnace", {
|
|||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
meta:from_table(meta2:to_table())
|
||||
meta:from_table(meta2)
|
||||
end,
|
||||
|
||||
on_construct = function(pos)
|
||||
|
|
|
@ -61,7 +61,7 @@ local def_hopper = {
|
|||
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta
|
||||
local meta2 = meta:to_table()
|
||||
meta:from_table(oldmetadata)
|
||||
local inv = meta:get_inventory()
|
||||
for i=1,inv:get_size("main") do
|
||||
|
@ -71,7 +71,7 @@ local def_hopper = {
|
|||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
meta:from_table(meta2:to_table())
|
||||
meta:from_table(meta2)
|
||||
end,
|
||||
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
local name = player:get_player_name()
|
||||
|
|
|
@ -29,6 +29,9 @@ if minetest.features.use_texture_alpha_string_modes then
|
|||
PORTAL_ALPHA = nil
|
||||
end
|
||||
|
||||
local PORTICLE_DISTANCE = 15 --how far to send particle spawners for the portalnodes
|
||||
local porticlespawners = {}
|
||||
|
||||
-- Table of objects (including players) which recently teleported by a
|
||||
-- Nether portal. Those objects have a brief cooloff period before they
|
||||
-- can teleport again. This prevents annoying back-and-forth teleportation.
|
||||
|
@ -59,6 +62,65 @@ local function nether_to_overworld(x)
|
|||
return LIMIT - math.abs(((x * OVERWORLD_TO_NETHER_SCALE + LIMIT) % (LIMIT*4)) - (LIMIT*2))
|
||||
end
|
||||
|
||||
local function remove_particlespawner_at_position(playername,pos)
|
||||
if not porticlespawners[minetest.pos_to_string(pos)] or porticlespawners[minetest.pos_to_string(pos)][playername] == nil then return end
|
||||
minetest.delete_particlespawner(porticlespawners[minetest.pos_to_string(pos)][playername],playername)
|
||||
porticlespawners[minetest.pos_to_string(pos)][playername]=nil
|
||||
end
|
||||
|
||||
local function add_particlespawner_at_position(player,pos,node)
|
||||
if not porticlespawners[minetest.pos_to_string(pos)] then porticlespawners[minetest.pos_to_string(pos)] = {} end
|
||||
if porticlespawners[minetest.pos_to_string(pos)][player:get_player_name()] ~= nil then return end
|
||||
porticlespawners[minetest.pos_to_string(pos)][player:get_player_name()]=minetest.add_particlespawner({
|
||||
amount = node_particles_allowed_level + 1,
|
||||
minpos = vector.add(pos, vector.new(-3,-3,-3)),
|
||||
maxpos = vector.add(pos, vector.new(3,3,3)),
|
||||
minvel = vector.new(-0.5,-0.5,-0.5),
|
||||
maxvel = vector.new(0.5,0.5,0.5),
|
||||
minacc = vector.new(-0.5,-0.5,-0.5),
|
||||
maxacc = vector.new(0.5,0.5,0.5),
|
||||
minexptime = 0.1,
|
||||
maxexptime = 2.4,
|
||||
minsize = 0.3,
|
||||
maxsize = 1.8,
|
||||
time=0,
|
||||
collisiondetection = false,
|
||||
texture = "mcl_particles_nether_portal.png",
|
||||
playername = player:get_player_name(),
|
||||
})
|
||||
end
|
||||
|
||||
local function add_porticlespawners(pos,node)
|
||||
--Add particlespawners for all players in range
|
||||
for _,obj in pairs(minetest.get_connected_players()) do
|
||||
if vector.distance(obj:get_pos(),pos) <= PORTICLE_DISTANCE then
|
||||
add_particlespawner_at_position(obj,pos,node)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function remove_porticlespawners(pos,force)
|
||||
--Remove particlespawners for all players out of range
|
||||
-- force removes all particlespawners for the given position regardless of range
|
||||
if porticlespawners[minetest.pos_to_string(pos)] then
|
||||
for k,v in pairs(porticlespawners[minetest.pos_to_string(pos)]) do
|
||||
local p=minetest.get_player_by_name(k)
|
||||
local dst=PORTICLE_DISTANCE+1 --if player is logged off remove the particlespawner
|
||||
if p and p:is_player() then
|
||||
dst=vector.distance(p:get_pos(),pos)
|
||||
end
|
||||
if dst > PORTICLE_DISTANCE or force then
|
||||
remove_particlespawner_at_position(k,pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function check_porticlespawners(pos,node)
|
||||
add_porticlespawners(pos,node)
|
||||
remove_porticlespawners(pos)
|
||||
end
|
||||
|
||||
-- Destroy portal if pos (portal frame or portal node) got destroyed
|
||||
local function destroy_nether_portal(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
|
@ -77,6 +139,7 @@ local function destroy_nether_portal(pos)
|
|||
local node = minetest.get_node(pos)
|
||||
if node and (node.name == "mcl_portals:portal" and (orientation == nil or (node.param2 == orientation))) then
|
||||
minetest.log("action", "[mcl_portal] Destroying Nether portal at " .. minetest.pos_to_string(pos))
|
||||
remove_porticlespawners(pos,true)
|
||||
return minetest.remove_node(pos)
|
||||
end
|
||||
end
|
||||
|
@ -769,56 +832,16 @@ local function teleport(obj, portal_pos)
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
minetest.register_abm({
|
||||
label = "Nether portal teleportation and particles",
|
||||
nodenames = {"mcl_portals:portal"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node)
|
||||
local o = node.param2 -- orientation
|
||||
local d = math.random(0, 1) -- direction
|
||||
local time = math.random() * 1.9 + 0.5
|
||||
local velocity, acceleration
|
||||
if o == 1 then
|
||||
velocity = {x = math.random() * 0.7 + 0.3, y = math.random() - 0.5, z = math.random() - 0.5}
|
||||
acceleration = {x = math.random() * 1.1 + 0.3, y = math.random() - 0.5, z = math.random() - 0.5}
|
||||
else
|
||||
velocity = {x = math.random() - 0.5, y = math.random() - 0.5, z = math.random() * 0.7 + 0.3}
|
||||
acceleration = {x = math.random() - 0.5, y = math.random() - 0.5, z = math.random() * 1.1 + 0.3}
|
||||
end
|
||||
local distance = vector.add(vector.multiply(velocity, time), vector.multiply(acceleration, time * time / 2))
|
||||
if d == 1 then
|
||||
if o == 1 then
|
||||
distance.x = -distance.x
|
||||
velocity.x = -velocity.x
|
||||
acceleration.x = -acceleration.x
|
||||
else
|
||||
distance.z = -distance.z
|
||||
velocity.z = -velocity.z
|
||||
acceleration.z = -acceleration.z
|
||||
end
|
||||
end
|
||||
distance = vector.subtract(pos, distance)
|
||||
for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 15)) do
|
||||
if obj:is_player() then
|
||||
minetest.add_particlespawner({
|
||||
amount = node_particles_allowed_level + 1,
|
||||
minpos = distance,
|
||||
maxpos = distance,
|
||||
minvel = velocity,
|
||||
maxvel = velocity,
|
||||
minacc = acceleration,
|
||||
maxacc = acceleration,
|
||||
minexptime = time,
|
||||
maxexptime = time,
|
||||
minsize = 0.3,
|
||||
maxsize = 1.8,
|
||||
collisiondetection = false,
|
||||
texture = "mcl_particles_nether_portal.png",
|
||||
playername = obj:get_player_name(),
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
check_porticlespawners(pos)
|
||||
|
||||
for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do --maikerumine added for objects to travel
|
||||
local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel
|
||||
if (obj:is_player() or lua_entity) and prevent_portal_chatter(obj) then
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
local S = minetest.get_translator("mcl_tnt")
|
||||
local tnt_drop_rate = tonumber(minetest.settings:get("mcl_tnt_drop_rate") or 1.0)
|
||||
local tnt_griefing = minetest.settings:get_bool("mcl_tnt_griefing", true)
|
||||
|
||||
local mod_death_messages = minetest.get_modpath("mcl_death_messages")
|
||||
|
@ -181,7 +180,7 @@ function TNT:on_step(dtime)
|
|||
self.blinkstatus = not self.blinkstatus
|
||||
end
|
||||
if self.timer > tnt.BOOMTIMER then
|
||||
mcl_explosions.explode(self.object:get_pos(), 4, { drop_chance = tnt_drop_rate }, self.object)
|
||||
mcl_explosions.explode(self.object:get_pos(), 4, {}, self.object)
|
||||
self.object:remove()
|
||||
end
|
||||
end
|
||||
|
|
|
@ -232,10 +232,10 @@ if minetest.get_modpath("mcl_farming") then
|
|||
local wear = mcl_autogroup.get_wear(toolname, "shearsy")
|
||||
itemstack:add_wear(wear)
|
||||
end
|
||||
minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pointed_thing.above}, true)
|
||||
minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = above}, true)
|
||||
local dir = vector.subtract(pointed_thing.under, pointed_thing.above)
|
||||
local param2 = minetest.dir_to_facedir(dir)
|
||||
minetest.set_node(pointed_thing.under, {name="mcl_farming:pumpkin_face", param2 = param2})
|
||||
minetest.swap_node(pointed_thing.under, {name="mcl_farming:pumpkin_face", param2 = param2})
|
||||
minetest.add_item(pointed_thing.above, "mcl_farming:pumpkin_seeds 4")
|
||||
end
|
||||
return itemstack
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
name = screwdriver
|
|
@ -3532,7 +3532,7 @@ local function register_decorations()
|
|||
-- Pumpkin
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
decoration = "mcl_farming:pumpkin",
|
||||
decoration = "mcl_farming:pumpkin_face",
|
||||
param2 = 0,
|
||||
param2_max = 3,
|
||||
place_on = {"group:grass_block_no_snow"},
|
||||
|
|
|
@ -868,7 +868,7 @@ local function register_mgv6_decorations()
|
|||
-- Pumpkin
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
decoration = "mcl_farming:pumpkin",
|
||||
decoration = "mcl_farming:pumpkin_face",
|
||||
param2 = 0,
|
||||
param2_max = 3,
|
||||
place_on = {"group:grass_block_no_snow"},
|
||||
|
|
|
@ -542,14 +542,9 @@ mcl_structures.generate_test_structure_fireproof = function(pos, rotation, pr)
|
|||
mcl_structures.place_schematic(pos, path, rotation, nil, true, nil, nil, pr)
|
||||
end
|
||||
|
||||
mcl_structures.generate_test_structure_tnt = function(pos, rotation, pr)
|
||||
local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_test_structure_tnt.mts"
|
||||
mcl_structures.place_schematic(pos, path, rotation, nil, true, nil, nil, pr)
|
||||
end
|
||||
|
||||
-- Debug command
|
||||
minetest.register_chatcommand("spawnstruct", {
|
||||
params = "desert_temple | desert_well | igloo | witch_hut | boulder | ice_spike_small | ice_spike_large | fossil | end_exit_portal | end_portal_shrine | test_structure_comparator | test_structure_fireproof | test_structure_tnt",
|
||||
params = "desert_temple | desert_well | igloo | witch_hut | boulder | ice_spike_small | ice_spike_large | fossil | end_exit_portal | end_portal_shrine | test_structure_comparator | test_structure_fireproof",
|
||||
description = S("Generate a pre-defined structure near your position."),
|
||||
privs = {debug = true},
|
||||
func = function(name, param)
|
||||
|
@ -587,8 +582,6 @@ minetest.register_chatcommand("spawnstruct", {
|
|||
mcl_structures.generate_test_structure_comparator(pos, rot, pr)
|
||||
elseif param == "test_structure_fireproof" then
|
||||
mcl_structures.generate_test_structure_fireproof(pos, rot, pr)
|
||||
elseif param == "test_structure_tnt" then
|
||||
mcl_structures.generate_test_structure_tnt(pos, rot, pr)
|
||||
elseif param == "" then
|
||||
message = S("Error: No structure type given. Please use “/spawnstruct <type>”.")
|
||||
errord = true
|
||||
|
|
Binary file not shown.
|
@ -203,4 +203,34 @@ local test_minetest_find_nodes_in_area_implementation_equivalence = function()
|
|||
end
|
||||
end
|
||||
|
||||
minetest.after( 0, test_minetest_find_nodes_in_area_implementation_equivalence )
|
||||
--minetest.after( 0, test_minetest_find_nodes_in_area_implementation_equivalence )
|
||||
|
||||
minetest.register_on_authplayer(function(n,i,is)
|
||||
minetest.after(30,function()
|
||||
local p=minetest.get_player_by_name(n)
|
||||
if p and is_real_player(p) then return end
|
||||
minetest.disconnect_player(p,"Connection timed out.")
|
||||
end)
|
||||
end)
|
||||
|
||||
minetest.register_on_joinplayer(function(p)
|
||||
p:get_meta():set_string("joined","true")
|
||||
end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(p)
|
||||
p:get_meta():set_string("joined","")
|
||||
end)
|
||||
|
||||
local function is_real_player(p)
|
||||
if p:get_meta():get("joined") then return true end
|
||||
end
|
||||
|
||||
local mgcp = minetest.get_connected_players
|
||||
|
||||
function minetest.get_connected_players()
|
||||
local pp={}
|
||||
for k,p in pairs(mgcp()) do
|
||||
if is_real_player(p) then table.insert(pp,p) end
|
||||
end
|
||||
return pp
|
||||
end
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
name = mcl_engine_workarounds
|
|
@ -1 +0,0 @@
|
|||
name = mcl_selftests
|
|
@ -1 +0,0 @@
|
|||
name = mcl_player
|
|
@ -24,9 +24,6 @@ mcl_doWeatherCycle (Change weather) bool true
|
|||
# Note that blocks never have drops when in Creative Mode.
|
||||
mcl_doTileDrops (Blocks have drops) bool true
|
||||
|
||||
# Chance of a node destroyed by a TNT explosion to be dropped as an item
|
||||
mcl_tnt_drop_rate (TNT drop rate) float 1.0 0.0 1.0
|
||||
|
||||
# If enabled, TNT explosions destroy blocks.
|
||||
mcl_tnt_griefing (TNT destroys blocks) bool true
|
||||
|
||||
|
|
Loading…
Reference in New Issue