From a60c7bbcb6378cd0cfed6c7cd17699bfda66d352 Mon Sep 17 00:00:00 2001
From: Wuzzy <almikes@aol.com>
Date: Mon, 6 Mar 2017 00:22:41 +0100
Subject: [PATCH] =?UTF-8?q?Add=20=E2=80=9COn=20A=20Rail=E2=80=9D=20achieve?=
 =?UTF-8?q?ment?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 mods/HUD/mcl_achievements/depends.txt |  1 -
 mods/HUD/mcl_achievements/init.lua    | 23 +++++++++--------------
 mods/ITEMS/mcl_minecarts/depends.txt  |  1 +
 mods/ITEMS/mcl_minecarts/init.lua     |  8 ++++++++
 4 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/mods/HUD/mcl_achievements/depends.txt b/mods/HUD/mcl_achievements/depends.txt
index 8e270b8e..c541f27a 100644
--- a/mods/HUD/mcl_achievements/depends.txt
+++ b/mods/HUD/mcl_achievements/depends.txt
@@ -3,6 +3,5 @@ mcl_tools
 mcl_core
 mcl_cake
 mcl_mobitems
-mcl_minecarts
 mcl_flowerpots
 intllib?
diff --git a/mods/HUD/mcl_achievements/init.lua b/mods/HUD/mcl_achievements/init.lua
index ca807e0b..7dc76053 100644
--- a/mods/HUD/mcl_achievements/init.lua
+++ b/mods/HUD/mcl_achievements/init.lua
@@ -134,6 +134,15 @@ awards.register_achievement("mcl:cookFish", {
 	icon = "mcl_fishing_fish_cooked.png",
 })
 
+-- Other achievements triggered outside of mcl_achievements
+
+-- Triggered in mcl_minecarts
+awards.register_achievement("mcl:onARail", {
+	title = S("On A Rail"),
+	description = S("Travel by minecart for at least 1000 meters from your starting point in a single ride."),
+	icon = "default_rail.png",
+})
+
 -- NON-PC ACHIEVEMENTS (XBox, Pocket Edition, etc.)
 
 awards.register_achievement("mcl:n_placeDispenser", {
@@ -194,20 +203,6 @@ awards.register_achievement("mcl:n_emeralds", {
 	}
 })
 
--- NOT IN MINECRAFT
-
--- Replacement for “On a Rail”
-awards.register_achievement("mcl:f_placeRails", {
-	title = S("Railroad"),
-	icon = "default_rail.png",
-	trigger = {
-		type = "place",
-		node = "mcl_minecarts:rail",
-		target = 1000,
-	}
-})
-
-
 -- Show achievements formspec when the button was pressed
 minetest.register_on_player_receive_fields(function(player, formname, fields)
 	if fields.__mcl_achievements then
diff --git a/mods/ITEMS/mcl_minecarts/depends.txt b/mods/ITEMS/mcl_minecarts/depends.txt
index c77c4d8d..33340b4b 100644
--- a/mods/ITEMS/mcl_minecarts/depends.txt
+++ b/mods/ITEMS/mcl_minecarts/depends.txt
@@ -1,4 +1,5 @@
 mcl_core
 mcl_sounds
 mcl_player
+mcl_achievements
 mesecons?
diff --git a/mods/ITEMS/mcl_minecarts/init.lua b/mods/ITEMS/mcl_minecarts/init.lua
index e2a963f9..8df6413b 100644
--- a/mods/ITEMS/mcl_minecarts/init.lua
+++ b/mods/ITEMS/mcl_minecarts/init.lua
@@ -24,6 +24,7 @@ mcl_minecarts.cart = {
 	_driver = nil,
 	_punched = false, -- used to re-send _velocity and position
 	_velocity = {x=0, y=0, z=0}, -- only used on punch
+	_start_pos = nil, -- Used to calculate distance for “On A Rail” achievement
 	_old_dir = {x=0, y=0, z=0},
 	_old_pos = nil,
 	_old_switch = 0,
@@ -37,9 +38,11 @@ function mcl_minecarts.cart:on_rightclick(clicker)
 	local player_name = clicker:get_player_name()
 	if self._driver and player_name == self._driver then
 		self._driver = nil
+		self._start_pos = nil
 		clicker:set_detach()
 	elseif not self._driver then
 		self._driver = player_name
+		self._start_pos = self.object:getpos()
 		mcl_player.player_attached[player_name] = true
 		clicker:set_attach(self.object, "", {x=0, y=3, z=0}, {x=0, y=0, z=0})
 	end
@@ -227,6 +230,11 @@ function mcl_minecarts.cart:on_step(dtime)
 	if self._punched then
 		self._punched = false
 	end
+
+	-- Give achievement when player reached a distance of 1000 nodes from the start position
+	if self._driver and (vector.distance(self._start_pos, pos) >= 1000) then
+		awards.unlock(self._driver, "mcl:onARail")
+	end
 	
 	if not (update.vel or update.pos) then
 		return