From a2ecc51fbc75dd0411c6bbe096f8c39b3a6abc6c Mon Sep 17 00:00:00 2001
From: Rui914 <rui914t@gmail.com>
Date: Fri, 18 Mar 2016 16:33:14 +0900
Subject: [PATCH] Create API for registration of fence gate.

---
 game_api.txt        |  14 +++++
 mods/doors/init.lua | 138 +++++++++++++++++++++++++++++---------------
 2 files changed, 104 insertions(+), 48 deletions(-)

diff --git a/game_api.txt b/game_api.txt
index a32f8d5..d3330e5 100644
--- a/game_api.txt
+++ b/game_api.txt
@@ -78,6 +78,12 @@ The doors mod allows modders to register custom doors and trapdoors.
  * `name` Name for trapdoor
  * `def`  See [#Trapdoor definition]
 
+`doors.register_fencegate(name, def)`
+
+ * Registers new fence gate
+ * `name` Name for fence gate
+ * `def`  See [#Fence gate definition]
+
 `doors.get(pos)`
  
  * `pos` A position as a table, e.g `{x = 1, y = 1, z = 1}`
@@ -119,6 +125,14 @@ The doors mod allows modders to register custom doors and trapdoors.
 	sound_close = sound play for close door, -- optional
 	protected = false, -- If true, only placer can open the door (locked for others)
 
+###Fence gate definition
+
+	description = "Wooden Fence Gate",
+	texture = "default_wood.png",
+	material = "default:wood",
+	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
+	sounds = default.node_sound_wood_defaults(), -- optional
+
 Fence API
 ---------
 Allows creation of new fences with "fencelike" drawtype.
diff --git a/mods/doors/init.lua b/mods/doors/init.lua
index dd7ab72..6e624e9 100644
--- a/mods/doors/init.lua
+++ b/mods/doors/init.lua
@@ -658,59 +658,101 @@ minetest.register_craft({
 
 ----fence gate----
 
-local fence = {
-	description = "Fence Gate",
-	drawtype = "mesh",
-	tiles = {"default_wood.png"},
-	paramtype = "light",
-	paramtype2 = "facedir",
-	sunlight_propagates = true,
-	is_ground_content = false,
-	drop = "doors:gate_closed",
-	connect_sides = { "left", "right" },
-	groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2,
-		flammable = 2, fence = 1},
-	on_rightclick = function(pos, clicker)
-		local node = minetest.get_node(pos)
-		local def = minetest.registered_nodes[node.name]
-		minetest.swap_node(pos, {name = def.gate, param2 = node.param2})
-		minetest.sound_play(def.sound, {pos = pos, gain = 0.3,
-			max_hear_distance = 8})
-	end,
-	selection_box = {
+function doors.register_fencegate(name, def)
+	local fence = {
+		description = def.description,
+		drawtype = "mesh",
+		tiles = { def.texture },
+		paramtype = "light",
+		paramtype2 = "facedir",
+		sunlight_propagates = true,
+		is_ground_content = false,
+		drop = name .. "_closed",
+		connect_sides = { "left", "right" },
+		groups = def.groups,
+		sounds = def.sounds,
+		on_rightclick = function(pos, clicker)
+			local node = minetest.get_node(pos)
+			local node_def = minetest.registered_nodes[node.name]
+			minetest.swap_node(pos, {name = node_def.gate, param2 = node.param2})
+			minetest.sound_play(node_def.sound, {pos = pos, gain = 0.3,
+				max_hear_distance = 8})
+		end,
+		selection_box = {
+			type = "fixed",
+			fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4},
+		},
+	}
+
+	if not fence.sounds then
+		fence.sounds = default.node_sound_wood_defaults()
+	end
+
+	fence.groups.fence = 1
+
+	local fence_closed = table.copy(fence)
+	fence_closed.mesh = "doors_fencegate_closed.obj"
+	fence_closed.gate = name .. "_open"
+	fence_closed.sound = "doors_fencegate_open"
+	fence_closed.collision_box = {
 		type = "fixed",
 		fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4},
-	},
-}
+	}
 
-local fence_closed = table.copy(fence)
-fence_closed.mesh = "doors_fencegate_closed.obj"
-fence_closed.gate = "doors:gate_open"
-fence_closed.sound = "doors_fencegate_open"
-fence_closed.collision_box = {
-	type = "fixed",
-	fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4},
-}
+	local fence_open = table.copy(fence)
+	fence_open.mesh = "doors_fencegate_open.obj"
+	fence_open.gate = name .. "_closed"
+	fence_open.sound = "doors_fencegate_close"
+	fence_open.groups.not_in_creative_inventory = 1
+	fence_open.collision_box = {
+		type = "fixed",
+		fixed = {{-1/2, -1/2, -1/4, -3/8, 1/2, 1/4},
+			{-5/8, -3/8, -14/16, -3/8, 3/8, 0}},
+	}
 
-local fence_open = table.copy(fence)
-fence_open.mesh = "doors_fencegate_open.obj"
-fence_open.gate = "doors:gate_closed"
-fence_open.sound = "doors_fencegate_close"
-fence_open.groups.not_in_creative_inventory = 1
-fence_open.collision_box = {
-	type = "fixed",
-	fixed = {{-1/2, -1/2, -1/4, -3/8, 1/2, 1/4},
-		{-5/8, -3/8, -14/16, -3/8, 3/8, 0}},
-}
+	minetest.register_node(":" .. name .. "_closed", fence_closed)
+	minetest.register_node(":" .. name .. "_open", fence_open)
 
-minetest.register_node("doors:gate_closed", fence_closed)
-minetest.register_node("doors:gate_open", fence_open)
+	minetest.register_craft({
+		output = name .. "_closed",
+		recipe = {
+			{"default:stick", def.material, "default:stick"},
+			{"default:stick", def.material, "default:stick"}
+		}
+	})
+end
 
-minetest.register_craft({
-	output = "doors:gate_closed",
-	recipe = {
-		{"default:stick", "group:wood", "default:stick"},
-		{"default:stick", "group:wood", "default:stick"},
-	},
+doors.register_fencegate("doors:gate_wood", {
+	description = "Wooden Fence Gate",
+	texture = "default_wood.png",
+	material = "default:wood",
+	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}
 })
 
+doors.register_fencegate("doors:gate_acacia_wood", {
+	description = "Acacia Fence Gate",
+	texture = "default_acacia_wood.png",
+	material = "default:acacia_wood",
+	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}
+})
+
+doors.register_fencegate("doors:gate_junglewood", {
+	description = "Junglewood Fence Gate",
+	texture = "default_junglewood.png",
+	material = "default:junglewood",
+	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}
+})
+
+doors.register_fencegate("doors:gate_pine_wood", {
+	description = "Pine Fence Gate",
+	texture = "default_pine_wood.png",
+	material = "default:pine_wood",
+	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}
+})
+
+doors.register_fencegate("doors:gate_aspen_wood", {
+	description = "Aspen Fence Gate",
+	texture = "default_aspen_wood.png",
+	material = "default:aspen_wood",
+	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}
+})