[minetest-mod-nether.git] 01/04: Imported Upstream version 1

Julien Puydt julien.puydt at laposte.net
Fri Jun 3 12:51:00 UTC 2016


This is an automated email from the git hooks/post-receive script.

jpuydt-guest pushed a commit to branch master
in repository minetest-mod-nether.git.

commit 33f2c24500a3ce3832b43dabf993b665d8f69205
Author: Julien Puydt <julien.puydt at laposte.net>
Date:   Fri Jun 3 13:31:59 2016 +0200

    Imported Upstream version 1
---
 README.md                       |  24 ++
 depends.txt                     |   2 +
 description.txt                 |   1 +
 init.lua                        | 647 ++++++++++++++++++++++++++++++++++++++++
 mod.conf                        |   1 +
 screenshot.png                  | Bin 0 -> 88502 bytes
 textures/nether_brick.png       | Bin 0 -> 509 bytes
 textures/nether_glowstone.png   | Bin 0 -> 876 bytes
 textures/nether_particle.png    | Bin 0 -> 226 bytes
 textures/nether_portal.png      | Bin 0 -> 382 bytes
 textures/nether_rack.png        | Bin 0 -> 556 bytes
 textures/nether_sand.png        | Bin 0 -> 527 bytes
 textures/nether_transparent.png | Bin 0 -> 128 bytes
 13 files changed, 675 insertions(+)

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..db91c32
--- /dev/null
+++ b/README.md
@@ -0,0 +1,24 @@
+Nether Mod for Minetest
+
+##License of source code:
+
+Copyright (C) 2013 PilzAdam
+
+This program is free software. It comes without any warranty, to
+the extent permitted by applicable law. You can redistribute it
+and/or modify it under the terms of the Do What The Fuck You Want
+To Public License, Version 2, as published by Sam Hocevar. See
+http://sam.zoy.org/wtfpl/COPYING for more details.
+
+##License of media (textures and sounds)
+
+Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
+http://creativecommons.org/licenses/by-sa/3.0/
+
+##Authors of media files
+
+Everything not listed in here:
+Copyright (C) 2013 PilzAdam
+
+nether_rack.png: Zeg9
+nether_glowstone.png: BlockMen
diff --git a/depends.txt b/depends.txt
new file mode 100644
index 0000000..cf9c693
--- /dev/null
+++ b/depends.txt
@@ -0,0 +1,2 @@
+stairs
+default
diff --git a/description.txt b/description.txt
new file mode 100644
index 0000000..31859ba
--- /dev/null
+++ b/description.txt
@@ -0,0 +1 @@
+Adds a deep underground realm with different mapgen that you can reach with obsidian portals.
diff --git a/init.lua b/init.lua
new file mode 100644
index 0000000..02c467d
--- /dev/null
+++ b/init.lua
@@ -0,0 +1,647 @@
+-- Parameters
+
+local NETHER_DEPTH = -5000
+local TCAVE = 0.6
+local BLEND = 128
+
+
+-- 3D noise
+
+local np_cave = {
+	offset = 0,
+	scale = 1,
+	spread = {x = 384, y = 128, z = 384}, -- squashed 3:1
+	seed = 59033,
+	octaves = 5,
+	persist = 0.7
+}
+
+
+-- Stuff
+
+local yblmax = NETHER_DEPTH - BLEND * 2
+
+
+-- Functions
+
+local function build_portal(pos, target)
+	local p = {x = pos.x - 1, y = pos.y - 1, z = pos.z}
+	local p1 = {x = pos.x - 1, y = pos.y - 1, z = pos.z}
+	local p2 = {x = p1.x + 3, y = p1.y + 4, z = p1.z}
+
+	for i = 1, 4 do
+		minetest.set_node(p, {name = "default:obsidian"})
+		p.y = p.y + 1
+	end
+	for i = 1, 3 do
+		minetest.set_node(p, {name = "default:obsidian"})
+		p.x = p.x + 1
+	end
+	for i = 1, 4 do
+		minetest.set_node(p, {name = "default:obsidian"})
+		p.y = p.y - 1
+	end
+	for i = 1, 3 do
+		minetest.set_node(p, {name = "default:obsidian"})
+		p.x = p.x - 1
+	end
+
+	for x = p1.x, p2.x do
+	for y = p1.y, p2.y do
+		p = {x = x, y = y, z = p1.z}
+		if not (x == p1.x or x == p2.x or y == p1.y or y == p2.y) then
+			minetest.set_node(p, {name = "nether:portal", param2 = 0})
+		end
+		local meta = minetest.get_meta(p)
+		meta:set_string("p1", minetest.pos_to_string(p1))
+		meta:set_string("p2", minetest.pos_to_string(p2))
+		meta:set_string("target", minetest.pos_to_string(target))
+
+		if y ~= p1.y then
+			for z = -2, 2 do
+				if z ~= 0 then
+					p.z = p.z + z
+					if minetest.registered_nodes[
+							minetest.get_node(p).name].is_ground_content then
+						minetest.remove_node(p)
+					end
+					p.z = p.z - z
+				end
+			end
+		end
+	end
+	end
+end
+
+local function find_nether_target_y(target_x, target_z)
+	local start_y = NETHER_DEPTH - math.random(500, 1500) -- Search start
+	local nobj_cave_point = minetest.get_perlin(np_cave)
+	local air = 0 -- Consecutive air nodes found
+
+	for y = start_y, start_y - 4096, -1 do
+		local nval_cave = nobj_cave_point:get3d({x = target_x, y = y, z = target_z})
+
+		if nval_cave > TCAVE then -- Cavern
+			air = air + 1
+		else -- Not cavern, check if 4 nodes of space above
+			if air >= 4 then
+				return y + 2
+			else -- Not enough space, reset air to zero
+				air = 0
+			end
+		end
+	end
+
+	return y -- Fallback
+end
+
+local function move_check(p1, max, dir)
+	local p = {x = p1.x, y = p1.y, z = p1.z}
+	local d = math.abs(max - p1[dir]) / (max - p1[dir])
+
+	while p[dir] ~= max do
+		p[dir] = p[dir] + d
+		if minetest.get_node(p).name ~= "default:obsidian" then
+			return false
+		end
+	end
+
+	return true
+end
+
+local function check_portal(p1, p2)
+	if p1.x ~= p2.x then
+		if not move_check(p1, p2.x, "x") then
+			return false
+		end
+		if not move_check(p2, p1.x, "x") then
+			return false
+		end
+	elseif p1.z ~= p2.z then
+		if not move_check(p1, p2.z, "z") then
+			return false
+		end
+		if not move_check(p2, p1.z, "z") then
+			return false
+		end
+	else
+		return false
+	end
+
+	if not move_check(p1, p2.y, "y") then
+		return false
+	end
+	if not move_check(p2, p1.y, "y") then
+		return false
+	end
+
+	return true
+end
+
+local function is_portal(pos)
+	for d = -3, 3 do
+		for y = -4, 4 do
+			local px = {x = pos.x + d, y = pos.y + y, z = pos.z}
+			local pz = {x = pos.x, y = pos.y + y, z = pos.z + d}
+
+			if check_portal(px, {x = px.x + 3, y = px.y + 4, z = px.z}) then
+				return px, {x = px.x + 3, y = px.y + 4, z = px.z}
+			end
+			if check_portal(pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3}) then
+				return pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3}
+			end
+		end
+	end
+end
+
+local function make_portal(pos)
+	local p1, p2 = is_portal(pos)
+	if not p1 or not p2 then
+		return false
+	end
+
+	for d = 1, 2 do
+	for y = p1.y + 1, p2.y - 1 do
+		local p
+		if p1.z == p2.z then
+			p = {x = p1.x + d, y = y, z = p1.z}
+		else
+			p = {x = p1.x, y = y, z = p1.z + d}
+		end
+		if minetest.get_node(p).name ~= "air" then
+			return false
+		end
+	end
+	end
+
+	local param2
+	if p1.z == p2.z then
+		param2 = 0
+	else
+		param2 = 1
+	end
+
+	local target = {x = p1.x, y = p1.y, z = p1.z}
+	target.x = target.x + 1
+	if target.y < NETHER_DEPTH then
+		target.y = math.random(-32, 1)
+	else
+		target.y = find_nether_target_y(target.x, target.z)
+	end
+
+	for d = 0, 3 do
+	for y = p1.y, p2.y do
+		local p = {}
+		if param2 == 0 then
+			p = {x = p1.x + d, y = y, z = p1.z}
+		else
+			p = {x = p1.x, y = y, z = p1.z + d}
+		end
+		if minetest.get_node(p).name == "air" then
+			minetest.set_node(p, {name = "nether:portal", param2 = param2})
+		end
+		local meta = minetest.get_meta(p)
+		meta:set_string("p1", minetest.pos_to_string(p1))
+		meta:set_string("p2", minetest.pos_to_string(p2))
+		meta:set_string("target", minetest.pos_to_string(target))
+	end
+	end
+
+	return true
+end
+
+
+-- ABMs
+
+minetest.register_abm({
+	nodenames = {"nether:portal"},
+	interval = 1,
+	chance = 2,
+	action = function(pos, node)
+		minetest.add_particlespawner(
+			32, --amount
+			4, --time
+			{x = pos.x - 0.25, y = pos.y - 0.25, z = pos.z - 0.25}, --minpos
+			{x = pos.x + 0.25, y = pos.y + 0.25, z = pos.z + 0.25}, --maxpos
+			{x = -0.8, y = -0.8, z = -0.8}, --minvel
+			{x = 0.8, y = 0.8, z = 0.8}, --maxvel
+			{x = 0, y = 0, z = 0}, --minacc
+			{x = 0, y = 0, z = 0}, --maxacc
+			0.5, --minexptime
+			1, --maxexptime
+			1, --minsize
+			2, --maxsize
+			false, --collisiondetection
+			"nether_particle.png" --texture
+		)
+		for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do
+			if obj:is_player() then
+				local meta = minetest.get_meta(pos)
+				local target = minetest.string_to_pos(meta:get_string("target"))
+				if target then
+					-- force emerge of target area
+					minetest.get_voxel_manip():read_from_map(target, target)
+					if not minetest.get_node_or_nil(target) then
+						minetest.emerge_area(
+							vector.subtract(target, 4), vector.add(target, 4))
+					end
+					-- teleport the player
+					minetest.after(3, function(obj, pos, target)
+						local objpos = obj:getpos()
+						objpos.y = objpos.y + 0.1 -- Fix some glitches at -8000
+						if minetest.get_node(objpos).name ~= "nether:portal" then
+							return
+						end
+
+						obj:setpos(target)
+
+						local function check_and_build_portal(pos, target)
+							local n = minetest.get_node_or_nil(target)
+							if n and n.name ~= "nether:portal" then
+								build_portal(target, pos)
+								minetest.after(2, check_and_build_portal, pos, target)
+								minetest.after(4, check_and_build_portal, pos, target)
+							elseif not n then
+								minetest.after(1, check_and_build_portal, pos, target)
+							end
+						end
+
+						minetest.after(1, check_and_build_portal, pos, target)
+
+					end, obj, pos, target)
+				end
+			end
+		end
+	end,
+})
+
+
+-- Nodes
+
+minetest.register_node("nether:portal", {
+	description = "Nether Portal",
+	tiles = {
+		"nether_transparent.png",
+		"nether_transparent.png",
+		"nether_transparent.png",
+		"nether_transparent.png",
+		{
+			name = "nether_portal.png",
+			animation = {
+				type = "vertical_frames",
+				aspect_w = 16,
+				aspect_h = 16,
+				length = 0.5,
+			},
+		},
+		{
+			name = "nether_portal.png",
+			animation = {
+				type = "vertical_frames",
+				aspect_w = 16,
+				aspect_h = 16,
+				length = 0.5,
+			},
+		},
+	},
+	drawtype = "nodebox",
+	paramtype = "light",
+	paramtype2 = "facedir",
+	sunlight_propagates = true,
+	use_texture_alpha = true,
+	walkable = false,
+	diggable = false,
+	pointable = false,
+	buildable_to = false,
+	is_ground_content = false,
+	drop = "",
+	light_source = 5,
+	post_effect_color = {a = 180, r = 128, g = 0, b = 128},
+	alpha = 192,
+	node_box = {
+		type = "fixed",
+		fixed = {
+			{-0.5, -0.5, -0.1,  0.5, 0.5, 0.1},
+		},
+	},
+	groups = {not_in_creative_inventory = 1}
+})
+
+minetest.register_node(":default:obsidian", {
+	description = "Obsidian",
+	tiles = {"default_obsidian.png"},
+	is_ground_content = false,
+	sounds = default.node_sound_stone_defaults(),
+	groups = {cracky = 1, level = 2},
+
+	on_destruct = function(pos)
+		local meta = minetest.get_meta(pos)
+		local p1 = minetest.string_to_pos(meta:get_string("p1"))
+		local p2 = minetest.string_to_pos(meta:get_string("p2"))
+		local target = minetest.string_to_pos(meta:get_string("target"))
+		if not p1 or not p2 then
+			return
+		end
+
+		for x = p1.x, p2.x do
+		for y = p1.y, p2.y do
+		for z = p1.z, p2.z do
+			local nn = minetest.get_node({x = x, y = y, z = z}).name
+			if nn == "default:obsidian" or nn == "nether:portal" then
+				if nn == "nether:portal" then
+					minetest.remove_node({x = x, y = y, z = z})
+				end
+				local m = minetest.get_meta({x = x, y = y, z = z})
+				m:set_string("p1", "")
+				m:set_string("p2", "")
+				m:set_string("target", "")
+			end
+		end
+		end
+		end
+
+		meta = minetest.get_meta(target)
+		if not meta then
+			return
+		end
+		p1 = minetest.string_to_pos(meta:get_string("p1"))
+		p2 = minetest.string_to_pos(meta:get_string("p2"))
+		if not p1 or not p2 then
+			return
+		end
+
+		for x = p1.x, p2.x do
+		for y = p1.y, p2.y do
+		for z = p1.z, p2.z do
+			local nn = minetest.get_node({x = x, y = y, z = z}).name
+			if nn == "default:obsidian" or nn == "nether:portal" then
+				if nn == "nether:portal" then
+					minetest.remove_node({x = x, y = y, z = z})
+				end
+				local m = minetest.get_meta({x = x, y = y, z = z})
+				m:set_string("p1", "")
+				m:set_string("p2", "")
+				m:set_string("target", "")
+			end
+		end
+		end
+		end
+	end,
+})
+
+minetest.register_node("nether:rack", {
+	description = "Netherrack",
+	tiles = {"nether_rack.png"},
+	is_ground_content = true,
+	groups = {cracky = 3, level = 2},
+	sounds = default.node_sound_stone_defaults(),
+})
+
+minetest.register_node("nether:sand", {
+	description = "Nethersand",
+	tiles = {"nether_sand.png"},
+	is_ground_content = true,
+	groups = {crumbly = 3, level = 2, falling_node = 1},
+	sounds = default.node_sound_gravel_defaults({
+		footstep = {name = "default_gravel_footstep", gain = 0.45},
+	}),
+})
+
+minetest.register_node("nether:glowstone", {
+	description = "Glowstone",
+	tiles = {"nether_glowstone.png"},
+	is_ground_content = true,
+	light_source = 14,
+	paramtype = "light",
+	groups = {cracky = 3, oddly_breakable_by_hand = 3},
+	sounds = default.node_sound_glass_defaults(),
+})
+
+minetest.register_node("nether:brick", {
+	description = "Nether Brick",
+	tiles = {"nether_brick.png"},
+	is_ground_content = false,
+	groups = {cracky = 2, level = 2},
+	sounds = default.node_sound_stone_defaults(),
+})
+
+local fence_texture =
+	"default_fence_overlay.png^nether_brick.png^default_fence_overlay.png^[makealpha:255,126,126"
+
+minetest.register_node("nether:fence_nether_brick", {
+	description = "Nether Brick Fence",
+	drawtype = "fencelike",
+	tiles = {"nether_brick.png"},
+	inventory_image = fence_texture,
+	wield_image = fence_texture,
+	paramtype = "light",
+	sunlight_propagates = true,
+	is_ground_content = false,
+	selection_box = {
+		type = "fixed",
+		fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
+	},
+	groups = {cracky = 2, level = 2},
+	sounds = default.node_sound_stone_defaults(),
+})
+
+
+-- Register stair and slab
+
+stairs.register_stair_and_slab(
+	"nether_brick",
+	"nether:brick",
+	{cracky = 2, level = 2},
+	{"nether_brick.png"},
+	"nether stair",
+	"nether slab",
+	default.node_sound_stone_defaults()
+)
+
+
+-- Craftitems
+
+minetest.register_craftitem(":default:mese_crystal_fragment", {
+	description = "Mese Crystal Fragment",
+	inventory_image = "default_mese_crystal_fragment.png",
+	on_place = function(stack, _, pt)
+		if pt.under and minetest.get_node(pt.under).name == "default:obsidian" then
+			local done = make_portal(pt.under)
+			if done and not minetest.setting_getbool("creative_mode") then
+				stack:take_item()
+			end
+		end
+
+		return stack
+	end,
+})
+
+
+-- Crafting
+
+minetest.register_craft({
+	output = "nether:brick 4",
+	recipe = {
+		{"nether:rack", "nether:rack"},
+		{"nether:rack", "nether:rack"},
+	}
+})
+
+minetest.register_craft({
+	output = "nether:fence_nether_brick 6",
+	recipe = {
+		{"nether:brick", "nether:brick", "nether:brick"},
+		{"nether:brick", "nether:brick", "nether:brick"},
+	},
+})
+
+
+-- Mapgen
+
+-- Initialize noise object and localise noise buffer
+
+local nobj_cave = nil
+local nbuf_cave
+
+
+-- Content ids
+
+local c_air = minetest.get_content_id("air")
+
+local c_stone_with_coal = minetest.get_content_id("default:stone_with_coal")
+local c_stone_with_iron = minetest.get_content_id("default:stone_with_iron")
+local c_stone_with_mese = minetest.get_content_id("default:stone_with_mese")
+local c_stone_with_diamond = minetest.get_content_id("default:stone_with_diamond")
+local c_stone_with_gold = minetest.get_content_id("default:stone_with_gold")
+local c_stone_with_copper = minetest.get_content_id("default:stone_with_copper")
+local c_mese = minetest.get_content_id("default:mese")
+
+local c_gravel = minetest.get_content_id("default:gravel")
+local c_dirt = minetest.get_content_id("default:dirt")
+local c_sand = minetest.get_content_id("default:sand")
+
+local c_cobble = minetest.get_content_id("default:cobble")
+local c_mossycobble = minetest.get_content_id("default:mossycobble")
+local c_stair_cobble = minetest.get_content_id("stairs:stair_cobble")
+
+local c_lava_source = minetest.get_content_id("default:lava_source")
+local c_lava_flowing = minetest.get_content_id("default:lava_flowing")
+local c_water_source = minetest.get_content_id("default:water_source")
+local c_water_flowing = minetest.get_content_id("default:water_flowing")
+
+local c_glowstone = minetest.get_content_id("nether:glowstone")
+local c_nethersand = minetest.get_content_id("nether:sand")
+local c_netherbrick = minetest.get_content_id("nether:brick")
+local c_netherrack = minetest.get_content_id("nether:rack")
+
+
+-- On-generated function
+
+minetest.register_on_generated(function(minp, maxp, seed)
+	if minp.y > NETHER_DEPTH then
+		return
+	end
+
+	local t1 = os.clock()
+
+	local x1 = maxp.x
+	local y1 = maxp.y
+	local z1 = maxp.z
+	local x0 = minp.x
+	local y0 = minp.y
+	local z0 = minp.z
+
+	local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
+	local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax}
+	local data = vm:get_data()
+
+	local x11 = emax.x -- Limits of mapchunk plus mapblock shell
+	local y11 = emax.y
+	local z11 = emax.z
+	local x00 = emin.x
+	local y00 = emin.y
+	local z00 = emin.z
+
+	local ystride = x1 - x0 + 1
+	local zstride = ystride * ystride
+	local chulens = {x = ystride, y = ystride, z = ystride}
+	local minposxyz = {x = x0, y = y0, z = z0}
+
+	nobj_cave = nobj_cave or minetest.get_perlin_map(np_cave, chulens)
+	local nvals_cave = nobj_cave:get3dMap_flat(minposxyz, nbuf_cave)
+
+	for y = y00, y11 do -- Y loop first to minimise tcave calculations
+		local tcave
+		local in_chunk_y = false
+		if y >= y0 and y <= y1 then
+			if y > yblmax then
+				tcave = TCAVE + ((y - yblmax) / BLEND) ^ 2
+			else
+				tcave = TCAVE
+			end
+			in_chunk_y = true
+		end
+
+		for z = z00, z11 do
+			local vi = area:index(x00, y, z) -- Initial voxelmanip index
+			local ni
+			local in_chunk_yz = in_chunk_y and z >= z0 and z <= z1
+
+			for x = x00, x11 do
+				if in_chunk_yz and x == x0 then
+					-- Initial noisemap index
+					ni = (z - z0) * zstride + (y - y0) * ystride + 1
+				end
+				local in_chunk_yzx = in_chunk_yz and x >= x0 and x <= x1 -- In mapchunk
+
+				local id = data[vi] -- Existing node
+				-- Cave air, cave liquids and dungeons are overgenerated,
+				-- convert these throughout mapchunk plus shell
+				if id == c_air or -- Air and liquids to air
+						id == c_lava_source or
+						id == c_lava_flowing or
+						id == c_water_source or
+						id == c_water_flowing then
+					data[vi] = c_air
+				-- Dungeons are preserved so we don't need
+				-- to check for cavern in the shell
+				elseif id == c_cobble or -- Dungeons (preserved) to netherbrick
+						id == c_mossycobble or
+						id == c_stair_cobble then
+					data[vi] = c_netherbrick
+				end
+
+				if in_chunk_yzx then -- In mapchunk
+					if nvals_cave[ni] > tcave then -- Only excavate cavern in mapchunk
+						data[vi] = c_air
+					elseif id == c_mese then -- Mese block to lava
+						data[vi] = c_lava_source
+					elseif id == c_stone_with_gold or -- Precious ores to glowstone
+							id == c_stone_with_mese or
+							id == c_stone_with_diamond then
+						data[vi] = c_glowstone
+					elseif id == c_gravel or -- Blob ore to nethersand
+							id == c_dirt or
+							id == c_sand then
+						data[vi] = c_nethersand
+					else -- All else to netherstone
+						data[vi] = c_netherrack
+					end
+
+					ni = ni + 1 -- Only increment noise index in mapchunk
+				end
+
+				vi = vi + 1
+			end
+		end
+	end
+
+	vm:set_data(data)
+	vm:set_lighting({day = 0, night = 0})
+	vm:calc_lighting()
+	vm:update_liquids()
+	vm:write_to_map()
+
+	local chugent = math.ceil((os.clock() - t1) * 1000)
+	print ("[nether] generate chunk " .. chugent .. " ms")
+end)
diff --git a/mod.conf b/mod.conf
new file mode 100644
index 0000000..d1b252a
--- /dev/null
+++ b/mod.conf
@@ -0,0 +1 @@
+name = nether
diff --git a/screenshot.png b/screenshot.png
new file mode 100644
index 0000000..938a3a7
Binary files /dev/null and b/screenshot.png differ
diff --git a/textures/nether_brick.png b/textures/nether_brick.png
new file mode 100644
index 0000000..3e8c803
Binary files /dev/null and b/textures/nether_brick.png differ
diff --git a/textures/nether_glowstone.png b/textures/nether_glowstone.png
new file mode 100644
index 0000000..9016eac
Binary files /dev/null and b/textures/nether_glowstone.png differ
diff --git a/textures/nether_particle.png b/textures/nether_particle.png
new file mode 100644
index 0000000..56a5b78
Binary files /dev/null and b/textures/nether_particle.png differ
diff --git a/textures/nether_portal.png b/textures/nether_portal.png
new file mode 100644
index 0000000..824d652
Binary files /dev/null and b/textures/nether_portal.png differ
diff --git a/textures/nether_rack.png b/textures/nether_rack.png
new file mode 100644
index 0000000..201a11a
Binary files /dev/null and b/textures/nether_rack.png differ
diff --git a/textures/nether_sand.png b/textures/nether_sand.png
new file mode 100644
index 0000000..8ec343d
Binary files /dev/null and b/textures/nether_sand.png differ
diff --git a/textures/nether_transparent.png b/textures/nether_transparent.png
new file mode 100644
index 0000000..4883728
Binary files /dev/null and b/textures/nether_transparent.png differ

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/minetest-mod-nether.git.git



More information about the Pkg-games-commits mailing list