From c63b569709b566a5512e026340cd2caf8134a2ab Mon Sep 17 00:00:00 2001 From: Joel Leclerc Date: Thu, 19 Apr 2012 13:55:39 -0600 Subject: [PATCH] Added glowstone --- nether/init.lua | 79 ++++++++++++++++++++++--- nether/init.lua~ | 83 +++++++++++++++++++++++---- nether/textures/nether_glowstone.png | Bin 0 -> 6096 bytes 3 files changed, 144 insertions(+), 18 deletions(-) create mode 100644 nether/textures/nether_glowstone.png diff --git a/nether/init.lua b/nether/init.lua index f51fe67..41748db 100644 --- a/nether/init.lua +++ b/nether/init.lua @@ -1,5 +1,15 @@ --- Nether Mod (based on Nyanland, Catapult and Livehouse) --- lkjoel (Nyanland by Jeija, Catapult by XYZ, Livehouse by neko259) +-- Nether Mod (based on Nyanland by Jeija, Catapult by XYZ, and Livehouse by neko259) +-- lkjoel (main developer, code, ideas, textures) +-- == CONTRIBUTERS == +-- jordan4ibanez (code, ideas, textures) +-- Gilli (code, ideas, textures, mainly for the Glowstone) +-- Death Dealer (code, ideas, textures) +-- LolManKuba (ideas, textures) +-- IPushButton2653 (ideas, textures) +-- Menche (textures) +-- sdzen (ideas) +-- godkiller447 (ideas) +-- If I didn't list you, please let me know! --== EDITABLE OPTIONS ==-- @@ -9,8 +19,12 @@ NETHER_DEPTH = -20000 NETHER_HEIGHT = 30 -- Maximum amount of randomness in the map generation NETHER_RANDOM = 2 +-- Frequency of Glowstone on the "roof" of the Nether (higher is less frequent) +GLOWSTONE_FREQ_ROOF = 500 +-- Frequency of Glowstone on lava (higher is less frequent) +GLOWSTONE_FREQ_LAVA = 2 -- Frequency of lava (higher is less frequent) -LAVA_FREQ = 200 +LAVA_FREQ = 100 -- Maximum height of lava LAVA_HEIGHT = 2 -- Frequency of nether trees (higher is less frequent) @@ -277,13 +291,12 @@ NETHER_PORTAL = { {pos={x=2,y=4,z=-1}, block="obsidian:obsidian_block"}, {pos={x=3,y=4,z=-1}, block="obsidian:obsidian_block"}, } --- Time to teleport a player to the nether or teleport the player to the overworld -NETHER_PORTAL_SPEED = 5 --== END OF EDITABLE OPTIONS ==-- -- Generated variables NETHER_BOTTOM = (NETHER_DEPTH - NETHER_HEIGHT) +NETHER_ROOF_ABS = (NETHER_DEPTH - NETHER_RANDOM) HADES_THRONE_STARTPOS_ABS = {x=HADES_THRONE_STARTPOS.x, y=(NETHER_BOTTOM + HADES_THRONE_STARTPOS.y), z=HADES_THRONE_STARTPOS.z} LAVA_Y = (NETHER_BOTTOM + LAVA_HEIGHT) HADES_THRONE_ABS = {} @@ -388,7 +401,7 @@ minetest.register_node("nether:lava_source", { drawtype = "liquid", tile_images = {"default_lava.png"}, paramtype = "light", - light_source = LIGHT_MAX, + light_source = LIGHT_MAX - 1, walkable = false, pointable = false, diggable = false, @@ -509,6 +522,16 @@ minetest.register_craftitem("nether:nether_pearl", { textures = {"nether_pearl.png"}, }) +-- Nether Glowstone (Thanks to Gilli) +minetest.register_node( "nether:glowstone", { + description = "Nether Glowstone", + tile_images = {"nether_glowstone.png"}, + light_source = 15, -- Like in Minecraft + inventory_inventory_image = minetest.inventorycube( "nether_glowstone.png" ), + is_ground_content = true, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand = 1.5}, +}) + -- Create the Nether minetest.register_on_generated(function(minp, maxp) local addpos = {} @@ -523,9 +546,14 @@ minetest.register_on_generated(function(minp, maxp) minetest.env:add_node(addpos, {name="nether:netherrack"}) elseif y == NETHER_BOTTOM then minetest.env:add_node(addpos, {name="nether:netherrack"}) - elseif (y == math.random((NETHER_DEPTH-NETHER_RANDOM), NETHER_DEPTH)) then + elseif (math.floor(math.random(0, GLOWSTONE_FREQ_ROOF)) == 1) and (y >= NETHER_ROOF_ABS-1) and (nether:can_add_sticky_node(addpos) == true) then + minetest.env:add_node(addpos, {name="nether:glowstone"}) + --[[elseif (math.floor(math.random(0, GLOWSTONE_FREQ_LAVA)) == 1) and ((nether:nodebelow(addpos) == "nether:lava_source") or (nether:nodebelow(addpos) == "nether:lava_flowing")) then + minetest.env:add_node(addpos, {name="nether:glowstone"}) + print("GLOWSTONE" .. "X:" .. addpos.x .. "Y:" .. addpos.y .. "Z:" .. addpos.z)]] + elseif (y == math.floor(math.random((NETHER_DEPTH-NETHER_RANDOM), NETHER_DEPTH))) and (nether:can_add_sticky_node(addpos) == true) then minetest.env:add_node(addpos, {name="nether:netherrack"}) - elseif (y == math.random(NETHER_BOTTOM, (NETHER_BOTTOM+NETHER_RANDOM))) then + elseif (y == math.floor(math.random(NETHER_BOTTOM, (NETHER_BOTTOM+NETHER_RANDOM)))) and (nether:can_add_sticky_node(addpos) == true) then minetest.env:add_node(addpos, {name="nether:netherrack"}) elseif y <= NETHER_DEPTH and y >= NETHER_BOTTOM then minetest.env:add_node(addpos, {name="air"}) @@ -570,6 +598,41 @@ minetest.register_on_generated(function(minp, maxp) end end) +-- Return the name of the node below a position +function nether:nodebelow(pos) + return minetest.env:get_node({x=pos.x, y=(pos.y-1), z=pos.z}).name +end + +-- Check if we can add a "sticky" node (i.e. it has to stick to something else, or else it won't be added) +-- This is largely based on Gilli's code +function nether:can_add_sticky_node(pos) + local nodehere = false + local objname + for x = -1, 1 do + for y = -1, 1 do + for z = -1, 1 do + local p = {x=pos.x+x, y=pos.y+y, z=pos.z+z} + local n = minetest.env:get_node(p) + objname = n.name + if objname ~= "air" and minetest.registered_nodes[objname].walkable == true then + nodehere = true + end + end + end + end + return nodehere +end + +-- Add a "sticky" node +function nether:add_sticky_node(pos, opts) + if nether:can_add_sticky_node(pos) == true then + minetest.env:add_node(pos, opts) + return true + else + return false + end +end + -- Create a nether tree function nether:grow_nethertree(pos) --TRUNK diff --git a/nether/init.lua~ b/nether/init.lua~ index 9f38268..b03e7b2 100644 --- a/nether/init.lua~ +++ b/nether/init.lua~ @@ -1,5 +1,15 @@ --- Nether Mod (based on Nyanland, Catapult and Livehouse) --- lkjoel (Nyanland by Jeija, Catapult by XYZ, Livehouse by neko259) +-- Nether Mod (based on Nyanland by Jeija, Catapult by XYZ, and Livehouse by neko259) +-- lkjoel (main developer, code, ideas, textures) +-- == CONTRIBUTERS == +-- jordan4ibanez (code, ideas, textures) +-- Gilli (code, ideas, textures, mainly for the Glowstone) +-- Death Dealer (code, ideas, textures) +-- LolManKuba (ideas, textures) +-- IPushButton2653 (ideas, textures) +-- Menche (textures) +-- sdzen (ideas) +-- godkiller447 (ideas) +-- If I didn't list you, please let me know! --== EDITABLE OPTIONS ==-- @@ -9,8 +19,12 @@ NETHER_DEPTH = -20000 NETHER_HEIGHT = 30 -- Maximum amount of randomness in the map generation NETHER_RANDOM = 2 +-- Frequency of Glowstone on the "roof" of the Nether (higher is less frequent) +GLOWSTONE_FREQ_ROOF = 500 +-- Frequency of Glowstone on lava (higher is less frequent) +GLOWSTONE_FREQ_LAVA = 2 -- Frequency of lava (higher is less frequent) -LAVA_FREQ = 200 +LAVA_FREQ = 100 -- Maximum height of lava LAVA_HEIGHT = 2 -- Frequency of nether trees (higher is less frequent) @@ -277,13 +291,12 @@ NETHER_PORTAL = { {pos={x=2,y=4,z=-1}, block="obsidian:obsidian_block"}, {pos={x=3,y=4,z=-1}, block="obsidian:obsidian_block"}, } --- Time to teleport a player to the nether or teleport the player to the overworld -NETHER_PORTAL_SPEED = 5 --== END OF EDITABLE OPTIONS ==-- -- Generated variables NETHER_BOTTOM = (NETHER_DEPTH - NETHER_HEIGHT) +NETHER_ROOF_ABS = (NETHER_DEPTH - NETHER_RANDOM) HADES_THRONE_STARTPOS_ABS = {x=HADES_THRONE_STARTPOS.x, y=(NETHER_BOTTOM + HADES_THRONE_STARTPOS.y), z=HADES_THRONE_STARTPOS.z} LAVA_Y = (NETHER_BOTTOM + LAVA_HEIGHT) HADES_THRONE_ABS = {} @@ -388,7 +401,7 @@ minetest.register_node("nether:lava_source", { drawtype = "liquid", tile_images = {"default_lava.png"}, paramtype = "light", - light_source = LIGHT_MAX, + light_source = LIGHT_MAX - 1, walkable = false, pointable = false, diggable = false, @@ -509,6 +522,16 @@ minetest.register_craftitem("nether:nether_pearl", { textures = {"nether_pearl.png"}, }) +-- Nether Glowstone (Thanks to Gilli) +minetest.register_node( "nether:glowstone", { + description = "Nether Glowstone", + tile_images = {"nether_glowstone.png"}, + light_source = 15, -- Like in Minecraft + inventory_inventory_image = minetest.inventorycube( "nether_glowstone.png" ), + is_ground_content = true, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand = 1.5}, +}) + -- Create the Nether minetest.register_on_generated(function(minp, maxp) local addpos = {} @@ -523,9 +546,14 @@ minetest.register_on_generated(function(minp, maxp) minetest.env:add_node(addpos, {name="nether:netherrack"}) elseif y == NETHER_BOTTOM then minetest.env:add_node(addpos, {name="nether:netherrack"}) - elseif (y == math.random((NETHER_DEPTH-NETHER_RANDOM), NETHER_DEPTH)) then + elseif (math.floor(math.random(0, GLOWSTONE_FREQ_ROOF)) == 1) and (y >= NETHER_ROOF_ABS-1) and (nether:can_add_sticky_node(addpos) == true) then + minetest.env:add_node(addpos, {name="nether:glowstone"}) + elseif (math.floor(math.random(0, GLOWSTONE_FREQ_LAVA)) == 1) and ((nether:nodebelow(addpos) == "nether:lava_source") or (nether:nodebelow(addpos) == "nether:lava_flowing")) then + minetest.env:add_node(addpos, {name="nether:glowstone"}) + print("GLOWSTONE" .. "X:" .. addpos.x .. "Y:" .. addpos.y .. "Z:" .. addpos.z) + elseif (y == math.floor(math.random((NETHER_DEPTH-NETHER_RANDOM), NETHER_DEPTH))) and (nether:can_add_sticky_node(addpos) == true) then minetest.env:add_node(addpos, {name="nether:netherrack"}) - elseif (y == math.random(NETHER_BOTTOM, (NETHER_BOTTOM+NETHER_RANDOM))) then + elseif (y == math.floor(math.random(NETHER_BOTTOM, (NETHER_BOTTOM+NETHER_RANDOM)))) and (nether:can_add_sticky_node(addpos) == true) then minetest.env:add_node(addpos, {name="nether:netherrack"}) elseif y <= NETHER_DEPTH and y >= NETHER_BOTTOM then minetest.env:add_node(addpos, {name="air"}) @@ -570,6 +598,41 @@ minetest.register_on_generated(function(minp, maxp) end end) +-- Return the name of the node below a position +function nether:nodebelow(pos) + return minetest.env:get_node({x=pos.x, y=(pos.y-1), z=pos.z}).name +end + +-- Check if we can add a "sticky" node (i.e. it has to stick to something else, or else it won't be added) +-- This is largely based on Gilli's code +function nether:can_add_sticky_node(pos) + local nodehere = false + local objname + for x = -1, 1 do + for y = -1, 1 do + for z = -1, 1 do + local p = {x=pos.x+x, y=pos.y+y, z=pos.z+z} + local n = minetest.env:get_node(p) + objname = n.name + if objname ~= "air" and minetest.registered_nodes[objname].walkable == true then + nodehere = true + end + end + end + end + return nodehere +end + +-- Add a "sticky" node +function nether:add_sticky_node(pos, opts) + if nether:can_add_sticky_node(pos) == true then + minetest.env:add_node(pos, opts) + return true + else + return false + end +end + -- Create a nether tree function nether:grow_nethertree(pos) --TRUNK @@ -677,8 +740,8 @@ function nether:save_portals_to_nether() file:write("") file:close() for i,v in ipairs(NETHER_PORTALS_TO_NETHER) do - nether:save_portal_to_nether(v) - end + nether:save_portal_to_nether(v) + end else nether:printerror("Cannot create portal file!") end diff --git a/nether/textures/nether_glowstone.png b/nether/textures/nether_glowstone.png new file mode 100644 index 0000000000000000000000000000000000000000..6a6a7a4bd42eec6b406e6777fc14b29668f3b491 GIT binary patch literal 6096 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 WdoXJ#HPw0m0000