Move nyancats into a separate mod
Nyancats are independent in the default mod. Nothing else uses them or their code. Separating it into a separate mod makes it easier for subgames to remove them. It also makes it easier for a mod to depend on nyancats, as lots of subgames don't have them. Default/mapgen.lua: Register biomes, ores and decorations in singlenode mapgen. These were never disabled anyway because singlenode was removed from the world creation menu.
							
								
								
									
										12
									
								
								game_api.txt
									
									
									
									
									
								
							
							
						
						| @@ -250,6 +250,18 @@ Give Initial Stuff API | |||||||
| ^ str is a comma separated list of initial stuff | ^ str is a comma separated list of initial stuff | ||||||
| ^ Adds items to the list of items to be given | ^ Adds items to the list of items to be given | ||||||
|  |  | ||||||
|  | Nyancat API | ||||||
|  | ----------- | ||||||
|  |  | ||||||
|  | `nyancat.place(pos, facedir, length)` | ||||||
|  |  | ||||||
|  | ^ Place a cat at `pos` facing `facedir` with tail length `length` | ||||||
|  |   Only accepts facedir 0-3, if facedir > 3 then it will be interpreted as facedir = 0 | ||||||
|  |  | ||||||
|  | `nyancat.generate(minp, maxp, seed)` | ||||||
|  |  | ||||||
|  | ^ Called by `minetest.register_on_generated`. To disable nyancat generation, | ||||||
|  |   you can redefine nyancat.generate() to be an empty function | ||||||
|  |  | ||||||
| TNT API | TNT API | ||||||
| ---------- | ---------- | ||||||
|   | |||||||
| @@ -51,10 +51,6 @@ RealBadAngel's animated water (WTFPL): | |||||||
|   default_water_flowing_animated.png |   default_water_flowing_animated.png | ||||||
|  |  | ||||||
| VanessaE (WTFPL): | VanessaE (WTFPL): | ||||||
|   default_nc_back.png |  | ||||||
|   default_nc_front.png |  | ||||||
|   default_nc_rb.png |  | ||||||
|   default_nc_side.png |  | ||||||
|   default_desert_sand.png |   default_desert_sand.png | ||||||
|   default_desert_stone.png |   default_desert_stone.png | ||||||
|   default_sand.png |   default_sand.png | ||||||
|   | |||||||
| @@ -39,8 +39,6 @@ minetest.register_alias("locked_chest", "default:chest_locked") | |||||||
| minetest.register_alias("cobble", "default:cobble") | minetest.register_alias("cobble", "default:cobble") | ||||||
| minetest.register_alias("mossycobble", "default:mossycobble") | minetest.register_alias("mossycobble", "default:mossycobble") | ||||||
| minetest.register_alias("steelblock", "default:steelblock") | minetest.register_alias("steelblock", "default:steelblock") | ||||||
| minetest.register_alias("nyancat", "default:nyancat") |  | ||||||
| minetest.register_alias("nyancat_rainbow", "default:nyancat_rainbow") |  | ||||||
| minetest.register_alias("sapling", "default:sapling") | minetest.register_alias("sapling", "default:sapling") | ||||||
| minetest.register_alias("apple", "default:apple") | minetest.register_alias("apple", "default:apple") | ||||||
|  |  | ||||||
| @@ -77,4 +75,3 @@ minetest.register_alias("default:pinewood", "default:pine_wood") | |||||||
|  |  | ||||||
| minetest.register_alias("default:ladder", "default:ladder_wood") | minetest.register_alias("default:ladder", "default:ladder_wood") | ||||||
| minetest.register_alias("default:sign_wall", "default:sign_wall_wood") | minetest.register_alias("default:sign_wall", "default:sign_wall_wood") | ||||||
|  |  | ||||||
|   | |||||||
| @@ -888,18 +888,6 @@ minetest.register_craft({ | |||||||
| 	burntime = 30, | 	burntime = 30, | ||||||
| }) | }) | ||||||
|  |  | ||||||
| minetest.register_craft({ |  | ||||||
| 	type = "fuel", |  | ||||||
| 	recipe = "default:nyancat", |  | ||||||
| 	burntime = 1, |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.register_craft({ |  | ||||||
| 	type = "fuel", |  | ||||||
| 	recipe = "default:nyancat_rainbow", |  | ||||||
| 	burntime = 1, |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.register_craft({ | minetest.register_craft({ | ||||||
| 	type = "fuel", | 	type = "fuel", | ||||||
| 	recipe = "group:sapling", | 	recipe = "group:sapling", | ||||||
| @@ -935,4 +923,3 @@ minetest.register_craft({ | |||||||
| 	recipe = "default:dry_grass_1", | 	recipe = "default:dry_grass_1", | ||||||
| 	burntime = 2, | 	burntime = 2, | ||||||
| }) | }) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1464,73 +1464,16 @@ function default.register_decorations() | |||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
| -- |  | ||||||
| -- Generate nyan cats |  | ||||||
| -- |  | ||||||
|  |  | ||||||
| -- All mapgens except singlenode |  | ||||||
|  |  | ||||||
| function default.make_nyancat(pos, facedir, length) |  | ||||||
| 	local tailvec = {x = 0, y = 0, z = 0} |  | ||||||
| 	if facedir == 0 then |  | ||||||
| 		tailvec.z = 1 |  | ||||||
| 	elseif facedir == 1 then |  | ||||||
| 		tailvec.x = 1 |  | ||||||
| 	elseif facedir == 2 then |  | ||||||
| 		tailvec.z = -1 |  | ||||||
| 	elseif facedir == 3 then |  | ||||||
| 		tailvec.x = -1 |  | ||||||
| 	else |  | ||||||
| 		facedir = 0 |  | ||||||
| 		tailvec.z = 1 |  | ||||||
| 	end |  | ||||||
| 	local p = {x = pos.x, y = pos.y, z = pos.z} |  | ||||||
| 	minetest.set_node(p, {name = "default:nyancat", param2 = facedir}) |  | ||||||
| 	for i = 1, length do |  | ||||||
| 		p.x = p.x + tailvec.x |  | ||||||
| 		p.z = p.z + tailvec.z |  | ||||||
| 		minetest.set_node(p, {name = "default:nyancat_rainbow", param2 = facedir}) |  | ||||||
| 	end |  | ||||||
| end |  | ||||||
|  |  | ||||||
| function default.generate_nyancats(minp, maxp, seed) |  | ||||||
| 	local height_min = -31000 |  | ||||||
| 	local height_max = -32 |  | ||||||
| 	if maxp.y < height_min or minp.y > height_max then |  | ||||||
| 		return |  | ||||||
| 	end |  | ||||||
| 	local y_min = math.max(minp.y, height_min) |  | ||||||
| 	local y_max = math.min(maxp.y, height_max) |  | ||||||
| 	local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1) |  | ||||||
| 	local pr = PseudoRandom(seed + 9324342) |  | ||||||
| 	local max_num_nyancats = math.floor(volume / (16 * 16 * 16)) |  | ||||||
| 	for i = 1, max_num_nyancats do |  | ||||||
| 		if pr:next(0, 1000) == 0 then |  | ||||||
| 			local x0 = pr:next(minp.x, maxp.x) |  | ||||||
| 			local y0 = pr:next(minp.y, maxp.y) |  | ||||||
| 			local z0 = pr:next(minp.z, maxp.z) |  | ||||||
| 			local p0 = {x = x0, y = y0, z = z0} |  | ||||||
| 			default.make_nyancat(p0, pr:next(0, 3), pr:next(3, 15)) |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| end |  | ||||||
|  |  | ||||||
|  |  | ||||||
| -- | -- | ||||||
| -- Detect mapgen to select functions | -- Detect mapgen to select functions | ||||||
| -- | -- | ||||||
|  |  | ||||||
| -- Mods using singlenode mapgen can call these functions to enable |  | ||||||
| -- the use of minetest.generate_ores or minetest.generate_decorations |  | ||||||
|  |  | ||||||
| local mg_name = minetest.get_mapgen_setting("mg_name") | local mg_name = minetest.get_mapgen_setting("mg_name") | ||||||
| if mg_name == "v6" then | if mg_name == "v6" then | ||||||
| 	default.register_ores() | 	default.register_ores() | ||||||
| 	default.register_mgv6_decorations() | 	default.register_mgv6_decorations() | ||||||
| 	minetest.register_on_generated(default.generate_nyancats) | else | ||||||
| elseif mg_name ~= "singlenode" then |  | ||||||
| 	default.register_biomes() | 	default.register_biomes() | ||||||
| 	default.register_ores() | 	default.register_ores() | ||||||
| 	default.register_decorations() | 	default.register_decorations() | ||||||
| 	minetest.register_on_generated(default.generate_nyancats) |  | ||||||
| end | end | ||||||
|   | |||||||
| @@ -178,8 +178,6 @@ Misc | |||||||
| ---- | ---- | ||||||
|  |  | ||||||
| default:cloud | default:cloud | ||||||
| default:nyancat |  | ||||||
| default:nyancat_rainbow |  | ||||||
|  |  | ||||||
| --]] | --]] | ||||||
|  |  | ||||||
| @@ -1902,26 +1900,3 @@ minetest.register_node("default:cloud", { | |||||||
| 	sounds = default.node_sound_defaults(), | 	sounds = default.node_sound_defaults(), | ||||||
| 	groups = {not_in_creative_inventory = 1}, | 	groups = {not_in_creative_inventory = 1}, | ||||||
| }) | }) | ||||||
|  |  | ||||||
| minetest.register_node("default:nyancat", { |  | ||||||
| 	description = "Nyan Cat", |  | ||||||
| 	tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png", |  | ||||||
| 		"default_nc_side.png", "default_nc_back.png", "default_nc_front.png"}, |  | ||||||
| 	paramtype2 = "facedir", |  | ||||||
| 	groups = {cracky = 2}, |  | ||||||
| 	is_ground_content = false, |  | ||||||
| 	legacy_facedir_simple = true, |  | ||||||
| 	sounds = default.node_sound_defaults(), |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.register_node("default:nyancat_rainbow", { |  | ||||||
| 	description = "Nyan Cat Rainbow", |  | ||||||
| 	tiles = { |  | ||||||
| 		"default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90", |  | ||||||
| 		"default_nc_rb.png", "default_nc_rb.png" |  | ||||||
| 	}, |  | ||||||
| 	paramtype2 = "facedir", |  | ||||||
| 	groups = {cracky = 2}, |  | ||||||
| 	is_ground_content = false, |  | ||||||
| 	sounds = default.node_sound_defaults(), |  | ||||||
| }) |  | ||||||
|   | |||||||
							
								
								
									
										29
									
								
								mods/nyancat/README.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,29 @@ | |||||||
|  | Minetest Game mod: nyancat | ||||||
|  | ========================== | ||||||
|  |  | ||||||
|  | License of source code: | ||||||
|  | ----------------------- | ||||||
|  | Copyright (C) 2011-2012 celeron55, Perttu Ahola <celeron55@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU Lesser General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2.1 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | http://www.gnu.org/licenses/lgpl-2.1.html | ||||||
|  |  | ||||||
|  | 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) 2010-2012 celeron55, Perttu Ahola <celeron55@gmail.com> | ||||||
|  |  | ||||||
|  | VanessaE (WTFPL): | ||||||
|  |   default_nc_back.png | ||||||
|  |   default_nc_front.png | ||||||
|  |   default_nc_rb.png | ||||||
|  |   default_nc_side.png | ||||||
							
								
								
									
										1
									
								
								mods/nyancat/depends.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | |||||||
|  | default | ||||||
							
								
								
									
										84
									
								
								mods/nyancat/init.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,84 @@ | |||||||
|  | minetest.register_node("nyancat:nyancat", { | ||||||
|  | 	description = "Nyan Cat", | ||||||
|  | 	tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png", | ||||||
|  | 		"default_nc_side.png", "default_nc_back.png", "default_nc_front.png"}, | ||||||
|  | 	paramtype2 = "facedir", | ||||||
|  | 	groups = {cracky = 2}, | ||||||
|  | 	is_ground_content = false, | ||||||
|  | 	legacy_facedir_simple = true, | ||||||
|  | 	sounds = default.node_sound_defaults(), | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | minetest.register_node("nyancat:nyancat_rainbow", { | ||||||
|  | 	description = "Nyan Cat Rainbow", | ||||||
|  | 	tiles = { | ||||||
|  | 		"default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90", | ||||||
|  | 		"default_nc_rb.png", "default_nc_rb.png" | ||||||
|  | 	}, | ||||||
|  | 	paramtype2 = "facedir", | ||||||
|  | 	groups = {cracky = 2}, | ||||||
|  | 	is_ground_content = false, | ||||||
|  | 	sounds = default.node_sound_defaults(), | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | minetest.register_craft({ | ||||||
|  | 	type = "fuel", | ||||||
|  | 	recipe = "nyancat:nyancat", | ||||||
|  | 	burntime = 1, | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | minetest.register_craft({ | ||||||
|  | 	type = "fuel", | ||||||
|  | 	recipe = "nyancat:nyancat_rainbow", | ||||||
|  | 	burntime = 1, | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | nyancat = {} | ||||||
|  |  | ||||||
|  | function nyancat.place(pos, facedir, length) | ||||||
|  | 	if facedir > 3 then | ||||||
|  | 		facedir = 0 | ||||||
|  | 	end | ||||||
|  | 	local tailvec = minetest.facedir_to_dir(facedir) | ||||||
|  | 	local p = {x = pos.x, y = pos.y, z = pos.z} | ||||||
|  | 	minetest.set_node(p, {name = "nyancat:nyancat", param2 = facedir}) | ||||||
|  | 	for i = 1, length do | ||||||
|  | 		p.x = p.x + tailvec.x | ||||||
|  | 		p.z = p.z + tailvec.z | ||||||
|  | 		minetest.set_node(p, {name = "nyancat:nyancat_rainbow", param2 = facedir}) | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function nyancat.generate(minp, maxp, seed) | ||||||
|  | 	local height_min = -31000 | ||||||
|  | 	local height_max = -32 | ||||||
|  | 	if maxp.y < height_min or minp.y > height_max then | ||||||
|  | 		return | ||||||
|  | 	end | ||||||
|  | 	local y_min = math.max(minp.y, height_min) | ||||||
|  | 	local y_max = math.min(maxp.y, height_max) | ||||||
|  | 	local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1) | ||||||
|  | 	local pr = PseudoRandom(seed + 9324342) | ||||||
|  | 	local max_num_nyancats = math.floor(volume / (16 * 16 * 16)) | ||||||
|  | 	for i = 1, max_num_nyancats do | ||||||
|  | 		if pr:next(0, 1000) == 0 then | ||||||
|  | 			local x0 = pr:next(minp.x, maxp.x) | ||||||
|  | 			local y0 = pr:next(minp.y, maxp.y) | ||||||
|  | 			local z0 = pr:next(minp.z, maxp.z) | ||||||
|  | 			local p0 = {x = x0, y = y0, z = z0} | ||||||
|  | 			nyancat.place(p0, pr:next(0, 3), pr:next(3, 15)) | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | minetest.register_on_generated(function(minp, maxp, seed) | ||||||
|  | 	nyancat.generate(minp, maxp, seed) | ||||||
|  | end) | ||||||
|  |  | ||||||
|  | -- Legacy | ||||||
|  | minetest.register_alias("default:nyancat", "nyancat:nyancat") | ||||||
|  | minetest.register_alias("default:nyancat_rainbow", "nyancat:nyancat_rainbow") | ||||||
|  | minetest.register_alias("nyancat", "nyancat:nyancat") | ||||||
|  | minetest.register_alias("nyancat_rainbow", "nyancat:nyancat_rainbow") | ||||||
|  | default.make_nyancat = nyancat.place | ||||||
|  | default.generate_nyancats = nyancat.generate | ||||||
| Before Width: | Height: | Size: 186 B After Width: | Height: | Size: 186 B | 
| Before Width: | Height: | Size: 204 B After Width: | Height: | Size: 204 B | 
| Before Width: | Height: | Size: 137 B After Width: | Height: | Size: 137 B | 
| Before Width: | Height: | Size: 148 B After Width: | Height: | Size: 148 B |