 charset=UTF-8
Content-Disposition: inline; filename="ac853fa04d0d8a6489320dfe7dbd60c9371d756b..4ffe2e563e879169d12f66098c6d4d4dea6ddd69.patch"
Last-Modified: Mon, 02 Nov 2026 00:23:25 GMT
Expires: Thu, 30 Oct 2036 00:23:25 GMT

From 4ffe2e563e879169d12f66098c6d4d4dea6ddd69 Mon Sep 17 00:00:00 2001
From: autocommitter <autocommitter@linux-forks.de>
Date: Mon, 22 Apr 2024 14:57:44 +0200
Subject: State at 2022-06-20

---
 auto_yards/init_code.lua     | 25 ++++---------------------
 durt/nodes/(1902,8,9059).lua | 26 ++++++++++++++++++++++++++
 durt/nodes/(1904,8,9057).lua | 18 ++++++++++++++++++
 durt/nodes/(1906,7,9136).lua | 33 +++++++++++++++++++++++++++++++++
 durt/nodes/(1920,7,9187).lua | 26 ++++++++++++++++++++++++++
 durt/nodes/(1949,7,9112).lua | 27 +++++++++++++++++++++++++++
 durt/nodes/(1950,7,9108).lua |  1 +
 7 files changed, 135 insertions(+), 21 deletions(-)
 create mode 100644 durt/nodes/(1902,8,9059).lua
 create mode 100644 durt/nodes/(1904,8,9057).lua
 create mode 100644 durt/nodes/(1906,7,9136).lua
 create mode 100644 durt/nodes/(1920,7,9187).lua
 create mode 100644 durt/nodes/(1949,7,9112).lua
 create mode 100644 durt/nodes/(1950,7,9108).lua

diff --git a/auto_yards/init_code.lua b/auto_yards/init_code.lua
index 6e4551f..689b7e3 100644
--- a/auto_yards/init_code.lua
+++ b/auto_yards/init_code.lua
@@ -8,8 +8,6 @@ if event.init then
 			active_indicator_pos = POS(),
 			dir_indicator_pos = POS(),
 			error_indicator_pos = POS(),
-			ext_notify_pos = POS(),
-			notify = table,
 			headshunt_max = number,
 			
 		},
@@ -24,8 +22,6 @@ if event.init then
 			active_indicator_pos = POS(-2002,3,-1099),
 			dir_indicator_pos = POS(-2009,3,-1101),
 			error_indicator_pos = POS(-1999,3,-1099),
-			ext_notify_pos = POS(-2004,2,-1101),
-			notify = {},
 			headshunt_max = 5,
 		},
 		IP = {
@@ -167,7 +163,7 @@ F.yard_arrival = function(yard_id,this_dir) -- arrow points towards yard
 		end
 		atc_set_ars_disable(false)
 		atc_send("S6")
-		print("Train "..atc_id.." enters yard ".. yard_id.." from the "..tostring(this_dir).." direction and "..((rts and "will") or "won't").." return in the same direction")
+		print("YARD: "..yard_id..": Train "..atc_id.." enters from the "..tostring(this_dir).." direction and "..((rts and "will") or "won't").." return in the same direction")
 		return
 	end
 
@@ -180,7 +176,7 @@ F.yard_arrival = function(yard_id,this_dir) -- arrow points towards yard
 
 	if event.train and atc_arrow then
 		if F.indicator(yard.active_indicator_pos) then
-			print("Train "..atc_id.." has arrived at "..yard_id.." yard and has to wait for the yard to deactivate.")
+			print("YARD: "..yard_id..": Train "..atc_id.." has arrived and has to wait for the yard to deactivate.")
 			schedule_in(";10","recheck")
 			return
 		else
@@ -350,8 +346,8 @@ F.headshunt_exit = function(yard_id,this_dir) -- arrow points out of yard
 	if event.train then
 		if atc_arrow and (F.indicator(yard.dir_indicator_pos) == this_dir) then
 			if F.has_rc(yard_id.."_DEPART") then
-				print("Train "..atc_id.." has a length of "..train_length())
-				print("It will depart in the "..tostring(this_dir).." direction.")
+				print("YARD: "..yard_id..": Train "..atc_id.." has a length of "..train_length())
+				print("YARD: "..yard_id..": It will depart in the "..tostring(this_dir).." direction.")
 				unset_autocouple()
 				F.remove_rc({yard_id.."_FINAL_COLLECT",yard_id.."_DEPART"})
 				F.remove_rc_match(yard_id.."_LOCOS_%d+")
@@ -377,7 +373,6 @@ F.headshunt_exit = function(yard_id,this_dir) -- arrow points out of yard
 		if event.msg == "deactivate_check" then
 			if not atc_id then
 				F.indicator(yard.active_indicator_pos,false)
-				if yard.ext_notify_pos then interrupt_pos(yard.ext_notify_pos,{command="EXIT"}) end
 				print(yard_id.." yard Disabled")
 			else
 				schedule_in(";05","deactivate_check")
@@ -410,18 +405,6 @@ F.lane_EOL = function(yard_id,this_dir) -- arrow points towards headshunt
 		end
 	else
 		if F.indicator(yard.dir_indicator_pos) == this_dir then
-			--train is clasifying wagons, let it pass and couple to the rest of the rake
-			--send a notification to the yard controller to trigger external functions
-			if yard.ext_notify_pos then
-				local fc = F.get_rc_safe():match(yard_id.."_CLASS_(%S+)") or nil
-				if fc then
-					if F.has_rc(yard_id.."_COLLECT_"..fc) then
-						interrupt_pos(yard.ext_notify_pos,{command="COLLECTED",msg=fc})
-					else
-						interrupt_pos(yard.ext_notify_pos,{command="NOTIFY",msg=fc})
-					end
-				end
-			end
 			F.remove_rc_match(yard_id.."_CLASS_%S+")
 		else --this should never come into play as it means the train has entered from the wrong end somehow
 			atc_send("BBOL") --stop the train and open the doors (if available) to signify assistance required
diff --git a/durt/nodes/(1902,8,9059).lua b/durt/nodes/(1902,8,9059).lua
new file mode 100644
index 0000000..88b402f
--- /dev/null
+++ b/durt/nodes/(1902,8,9059).lua
@@ -0,0 +1,26 @@
+__approach_callback_mode = 1
+
+if event.approach and not event.has_entered then
+	atc_set_lzb_tsr(4)
+	return
+end
+
+if event.train and atc_arrow then
+	if not F.has_rc("WOA_rev_south") then return end
+	F.remove_rc({"WOA_rev_south"})
+	schedule_in(";01",atc_id)
+	return
+end
+
+if event.schedule then
+	if not atc_id then --bounce the train that just passed
+		atc_send_to_train(event.msg,"B0WRD1A1S3")
+	else
+		if atc_id == event.msg then --train hasn't fully passed yet, wait a bit longer
+			schedule_in(";01",atc_id)
+		else -- somehow another train crossed the controller before the first one returned. Unlikely but possible
+			atc_send_to_train(event.msg,"BBOL")
+			atc_send("BBOL")
+		end
+	end
+end
\ No newline at end of file
diff --git a/durt/nodes/(1904,8,9057).lua b/durt/nodes/(1904,8,9057).lua
new file mode 100644
index 0000000..4858c34
--- /dev/null
+++ b/durt/nodes/(1904,8,9057).lua
@@ -0,0 +1,18 @@
+__approach_callback_mode = 1
+if event.approach and not event.has_entered then
+	atc_set_ars_disable(true)
+	atc_set_lzb_tsr(4)
+end
+
+if event.train and atc_arrow then
+	atc_send("S4")
+	if F.has_rc("WOA_mine_around") then
+		if train_length() == 1 then
+			F.remove_rc("FREIGHT")
+			F.add_rc("WOA_ttb_s")
+		else
+			F.add_rc("WOA_freight_left")
+		end
+	end
+	atc_set_ars_disable(false)
+end
\ No newline at end of file
diff --git a/durt/nodes/(1906,7,9136).lua b/durt/nodes/(1906,7,9136).lua
new file mode 100644
index 0000000..a80aa6a
--- /dev/null
+++ b/durt/nodes/(1906,7,9136).lua
@@ -0,0 +1,33 @@
+local around_rc_list = {
+	"WOA_around_active",
+	"WOA_rev_north",
+	"WOA_around_station",
+	"WOA_rev_south",
+	"WOA_rejoin_overburden"
+}
+
+__approach_callback_mode = 1
+
+if event.approach and not event.has_entered then
+	atc_set_ars_disable(true)
+	atc_set_lzb_tsr(1)
+	return
+end
+
+if event.train and atc_arrow then
+	if F.has_rc("WOA_mine_around") then
+		if F.has_rc("WOA_around_active") then
+			F.remove_rc(around_rc_list)
+			unset_autocouple()
+			atc_send("B0WRD3SMA1")
+			atc_set_text_outside("Warmonaye Mining Co.")
+			return
+		end
+		atc_set_text_outside("Warmoneaye Mining Co.\nLocomotive Switching Ends")
+		split_off_locomotive("B0A0")
+		set_autocouple()
+		F.add_rc(around_rc_list)
+		atc_send("S4A1")
+		return
+	end
+end
\ No newline at end of file
diff --git a/durt/nodes/(1920,7,9187).lua b/durt/nodes/(1920,7,9187).lua
new file mode 100644
index 0000000..d477345
--- /dev/null
+++ b/durt/nodes/(1920,7,9187).lua
@@ -0,0 +1,26 @@
+__approach_callback_mode = 1
+
+if event.approach and not event.has_entered then
+	atc_set_lzb_tsr(1)
+	return
+end
+
+if event.train and atc_arrow then
+	if not F.has_rc("WOA_rev_north") then return end
+	F.remove_rc({"WOA_rev_north"})
+	schedule_in(";01",atc_id)
+	return
+end
+
+if event.schedule then
+	if not atc_id then --bounce the train that just passed
+		atc_send_to_train(event.msg,"B0WRD1A1S3")
+	else
+		if atc_id == event.msg then --train hasn't fully passed yet, wait a bit longer
+			schedule_in(";01",atc_id)
+		else -- somehow another train crossed the controller before the first one returned. Unlikely but possible
+			atc_send_to_train(event.msg,"BBOL")
+			atc_send("BBOL")
+		end
+	end
+end
\ No newline at end of file
diff --git a/durt/nodes/(1949,7,9112).lua b/durt/nodes/(1949,7,9112).lua
new file mode 100644
index 0000000..f434548
--- /dev/null
+++ b/durt/nodes/(1949,7,9112).lua
@@ -0,0 +1,27 @@
+local ind = POS(1951,7,9111)
+__approach_callback_mode = 1
+if event.approach and not event.has_entered then
+	atc_set_ars_disable(true)
+	atc_set_lzb_tsr(1)
+end
+
+if event.train and atc_arrow then
+	F.remove_rc({"WOA_ttb_s"})
+	if F.indicator(ind) then
+		schedule_in(";02","send")
+	end
+	atc_send("B0WR")
+end
+
+if (event.channel == "train_ctl" and event.msg == "send") or ((event.ext_int or event.schedule) and event.message == "send") then
+	print("RX Notification")
+	if not atc_id then 
+		F.indicator(ind,true)
+		return
+	end
+	F.add_rc("FREIGHT")
+	set_route(POS(1942,8,9102),"Exit South")
+	atc_send("I+S0WRD2;SMA1")
+	F.indicator(ind,false)
+	return
+end
\ No newline at end of file
diff --git a/durt/nodes/(1950,7,9108).lua b/durt/nodes/(1950,7,9108).lua
new file mode 100644
index 0000000..a3a64b6
--- /dev/null
+++ b/durt/nodes/(1950,7,9108).lua
@@ -0,0 +1 @@
+interrupt_pos(POS(1949,7,9112),"send")
\ No newline at end of file
-- 
cgit v1.2.3

d='n187' href='#n187'>187</a>
<a id='n188' href='#n188'>188</a>
<a id='n189' href='#n189'>189</a>
<a id='n190' href='#n190'>190</a>
<a id='n191' href='#n191'>191</a>
<a id='n192' href='#n192'>192</a>
<a id='n193' href='#n193'>193</a>
<a id='n194' href='#n194'>194</a>
<a id='n195' href='#n195'>195</a>
<a id='n196' href='#n196'>196</a>
<a id='n197' href='#n197'>197</a>
<a id='n198' href='#n198'>198</a>
<a id='n199' href='#n199'>199</a>
<a id='n200' href='#n200'>200</a>
<a id='n201' href='#n201'>201</a>
<a id='n202' href='#n202'>202</a>
<a id='n203' href='#n203'>203</a>
<a id='n204' href='#n204'>204</a>
<a id='n205' href='#n205'>205</a>
<a id='n206' href='#n206'>206</a>
<a id='n207' href='#n207'>207</a>
<a id='n208' href='#n208'>208</a>
<a id='n209' href='#n209'>209</a>
<a id='n210' href='#n210'>210</a>
<a id='n211' href='#n211'>211</a>
<a id='n212' href='#n212'>212</a>
<a id='n213' href='#n213'>213</a>
<a id='n214' href='#n214'>214</a>
<a id='n215' href='#n215'>215</a>
<a id='n216' href='#n216'>216</a>
<a id='n217' href='#n217'>217</a>
<a id='n218' href='#n218'>218</a>
<a id='n219' href='#n219'>219</a>
<a id='n220' href='#n220'>220</a>
<a id='n221' href='#n221'>221</a>
<a id='n222' href='#n222'>222</a>
<a id='n223' href='#n223'>223</a>
<a id='n224' href='#n224'>224</a>
<a id='n225' href='#n225'>225</a>
<a id='n226' href='#n226'>226</a>
<a id='n227' href='#n227'>227</a>
<a id='n228' href='#n228'>228</a>
<a id='n229' href='#n229'>229</a>
<a id='n230' href='#n230'>230</a>
<a id='n231' href='#n231'>231</a>
<a id='n232' href='#n232'>232</a>
<a id='n233' href='#n233'>233</a>
<a id='n234' href='#n234'>234</a>
<a id='n235' href='#n235'>235</a>
<a id='n236' href='#n236'>236</a>
<a id='n237' href='#n237'>237</a>
<a id='n238' href='#n238'>238</a>
<a id='n239' href='#n239'>239</a>
<a id='n240' href='#n240'>240</a>
<a id='n241' href='#n241'>241</a>
<a id='n242' href='#n242'>242</a>
<a id='n243' href='#n243'>243</a>
<a id='n244' href='#n244'>244</a>
<a id='n245' href='#n245'>245</a>
<a id='n246' href='#n246'>246</a>
<a id='n247' href='#n247'>247</a>
<a id='n248' href='#n248'>248</a>
<a id='n249' href='#n249'>249</a>
</pre></td>
<td class='lines'><pre><code><span class="hl slc">--advtrains by orwell96, see readme.txt</span>
<span class="hl kwa">local</span> <span class="hl kwb">print</span><span class="hl opt">=</span><span class="hl kwa">function</span><span class="hl opt">(</span>t<span class="hl opt">)</span> minetest<span class="hl opt">.</span><span class="hl kwb">log</span><span class="hl opt">(</span><span class="hl str">&quot;action&quot;</span><span class="hl opt">,</span> t<span class="hl opt">)</span> minetest<span class="hl opt">.</span><span class="hl kwd">chat_send_all</span><span class="hl opt">(</span>t<span class="hl opt">)</span> <span class="hl kwa">end</span>

advtrains<span class="hl opt">.</span>dir_trans_tbl<span class="hl opt">={</span>
	<span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]={</span>x<span class="hl opt">=</span><span class="hl num">0</span><span class="hl opt">,</span> z<span class="hl opt">=</span><span class="hl num">1</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">1</span><span class="hl opt">]={</span>x<span class="hl opt">=</span><span class="hl num">1</span><span class="hl opt">,</span> z<span class="hl opt">=</span><span class="hl num">2</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">2</span><span class="hl opt">]={</span>x<span class="hl opt">=</span><span class="hl num">1</span><span class="hl opt">,</span> z<span class="hl opt">=</span><span class="hl num">1</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">3</span><span class="hl opt">]={</span>x<span class="hl opt">=</span><span class="hl num">2</span><span class="hl opt">,</span> z<span class="hl opt">=</span><span class="hl num">1</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">4</span><span class="hl opt">]={</span>x<span class="hl opt">=</span><span class="hl num">1</span><span class="hl opt">,</span> z<span class="hl opt">=</span><span class="hl num">0</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">5</span><span class="hl opt">]={</span>x<span class="hl opt">=</span><span class="hl num">2</span><span class="hl opt">,</span> z<span class="hl opt">=-</span><span class="hl num">1</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">6</span><span class="hl opt">]={</span>x<span class="hl opt">=</span><span class="hl num">1</span><span class="hl opt">,</span> z<span class="hl opt">=-</span><span class="hl num">1</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">7</span><span class="hl opt">]={</span>x<span class="hl opt">=</span><span class="hl num">1</span><span class="hl opt">,</span> z<span class="hl opt">=-</span><span class="hl num">2</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">8</span><span class="hl opt">]={</span>x<span class="hl opt">=</span><span class="hl num">0</span><span class="hl opt">,</span> z<span class="hl opt">=-</span><span class="hl num">1</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">9</span><span class="hl opt">]={</span>x<span class="hl opt">=-</span><span class="hl num">1</span><span class="hl opt">,</span> z<span class="hl opt">=-</span><span class="hl num">2</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">10</span><span class="hl opt">]={</span>x<span class="hl opt">=-</span><span class="hl num">1</span><span class="hl opt">,</span> z<span class="hl opt">=-</span><span class="hl num">1</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">11</span><span class="hl opt">]={</span>x<span class="hl opt">=-</span><span class="hl num">2</span><span class="hl opt">,</span> z<span class="hl opt">=-</span><span class="hl num">1</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">12</span><span class="hl opt">]={</span>x<span class="hl opt">=-</span><span class="hl num">1</span><span class="hl opt">,</span> z<span class="hl opt">=</span><span class="hl num">0</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">13</span><span class="hl opt">]={</span>x<span class="hl opt">=-</span><span class="hl num">2</span><span class="hl opt">,</span> z<span class="hl opt">=</span><span class="hl num">1</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">14</span><span class="hl opt">]={</span>x<span class="hl opt">=-</span><span class="hl num">1</span><span class="hl opt">,</span> z<span class="hl opt">=</span><span class="hl num">1</span><span class="hl opt">},</span>
	<span class="hl opt">[</span><span class="hl num">15</span><span class="hl opt">]={</span>x<span class="hl opt">=-</span><span class="hl num">1</span><span class="hl opt">,</span> z<span class="hl opt">=</span><span class="hl num">2</span><span class="hl opt">},</span>
<span class="hl opt">}</span>

<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">dirCoordSet</span><span class="hl opt">(</span>coord<span class="hl opt">,</span> dir<span class="hl opt">)</span>
	<span class="hl kwa">local</span> x<span class="hl opt">,</span>z
	<span class="hl kwa">if</span> advtrains<span class="hl opt">.</span>dir_trans_tbl<span class="hl opt">[</span>dir<span class="hl opt">]</span> <span class="hl kwa">then</span>
		x<span class="hl opt">,</span>z<span class="hl opt">=</span>advtrains<span class="hl opt">.</span>dir_trans_tbl<span class="hl opt">[</span>dir<span class="hl opt">].</span>x<span class="hl opt">,</span> advtrains<span class="hl opt">.</span>dir_trans_tbl<span class="hl opt">[</span>dir<span class="hl opt">].</span>z
	<span class="hl kwa">else</span>
		<span class="hl kwb">error</span><span class="hl opt">(</span><span class="hl str">&quot;advtrains: in helpers.lua/dirCoordSet() given dir=&quot;</span><span class="hl opt">..(</span>dir <span class="hl kwa">or</span> <span class="hl str">&quot;nil&quot;</span><span class="hl opt">))</span>
	<span class="hl kwa">end</span>
	<span class="hl kwa">return</span> <span class="hl opt">{</span>x<span class="hl opt">=</span>coord<span class="hl opt">.</span>x<span class="hl opt">+</span>x<span class="hl opt">,</span> y<span class="hl opt">=</span>coord<span class="hl opt">.</span>y<span class="hl opt">,</span> z<span class="hl opt">=</span>coord<span class="hl opt">.</span>z<span class="hl opt">+</span>z<span class="hl opt">}</span>
<span class="hl kwa">end</span>
<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">dirToCoord</span><span class="hl opt">(</span>dir<span class="hl opt">)</span>
	<span class="hl kwa">return</span> advtrains<span class="hl opt">.</span><span class="hl kwd">dirCoordSet</span><span class="hl opt">({</span>x<span class="hl opt">=</span><span class="hl num">0</span><span class="hl opt">,</span> y<span class="hl opt">=</span><span class="hl num">0</span><span class="hl opt">,</span> z<span class="hl opt">=</span><span class="hl num">0</span><span class="hl opt">},</span> dir<span class="hl opt">)</span>
<span class="hl kwa">end</span>

<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">maxN</span><span class="hl opt">(</span>list<span class="hl opt">,</span> expectstart<span class="hl opt">)</span>
	<span class="hl kwa">local</span> n<span class="hl opt">=</span>expectstart <span class="hl kwa">or</span> <span class="hl num">0</span>
	<span class="hl kwa">while</span> list<span class="hl opt">[</span>n<span class="hl opt">]</span> <span class="hl kwa">do</span>
		n<span class="hl opt">=</span>n<span class="hl opt">+</span><span class="hl num">1</span>
	<span class="hl kwa">end</span>
	<span class="hl kwa">return</span> n<span class="hl opt">-</span><span class="hl num">1</span>
<span class="hl kwa">end</span>

<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">minN</span><span class="hl opt">(</span>list<span class="hl opt">,</span> expectstart<span class="hl opt">)</span>
	<span class="hl kwa">local</span> n<span class="hl opt">=</span>expectstart <span class="hl kwa">or</span> <span class="hl num">0</span>
	<span class="hl kwa">while</span> list<span class="hl opt">[</span>n<span class="hl opt">]</span> <span class="hl kwa">do</span>
		n<span class="hl opt">=</span>n<span class="hl opt">-</span><span class="hl num">1</span>
	<span class="hl kwa">end</span>
	<span class="hl kwa">return</span> n<span class="hl opt">+</span><span class="hl num">1</span>
<span class="hl kwa">end</span>

<span class="hl slc">--vertical_transmit:</span>
<span class="hl com">--[[</span>
<span class="hl com">rely1, rely2 tell to which height the connections are pointed to. 1 means it will go up the next node</span>
<span class="hl com"></span>
<span class="hl com">]]</span>

<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">conway</span><span class="hl opt">(</span>midreal<span class="hl opt">,</span> prev<span class="hl opt">,</span> traintype<span class="hl opt">)</span><span class="hl slc">--in order prev,mid,return</span>
	<span class="hl kwa">local</span> mid<span class="hl opt">=</span>advtrains<span class="hl opt">.</span><span class="hl kwd">round_vector_floor_y</span><span class="hl opt">(</span>midreal<span class="hl opt">)</span>
	<span class="hl kwa">local</span> drives_on<span class="hl opt">=</span>advtrains<span class="hl opt">.</span>all_traintypes<span class="hl opt">[</span>traintype<span class="hl opt">].</span>drives_on
	
	<span class="hl kwa">if not</span> advtrains<span class="hl opt">.</span><span class="hl kwd">get_rail_info_at</span><span class="hl opt">(</span>advtrains<span class="hl opt">.</span><span class="hl kwd">round_vector_floor_y</span><span class="hl opt">(</span>prev<span class="hl opt">),</span> traintype<span class="hl opt">)</span> <span class="hl kwa">then</span>
		<span class="hl kwa">return nil</span>
	<span class="hl kwa">end</span>
	
	<span class="hl kwa">local</span> midnode_ok<span class="hl opt">,</span> middir1<span class="hl opt">,</span> middir2<span class="hl opt">,</span> midrely1<span class="hl opt">,</span> midrely2<span class="hl opt">=</span>advtrains<span class="hl opt">.</span><span class="hl kwd">get_rail_info_at</span><span class="hl opt">(</span>advtrains<span class="hl opt">.</span><span class="hl kwd">round_vector_floor_y</span><span class="hl opt">(</span>mid<span class="hl opt">),</span> traintype<span class="hl opt">)</span>
	<span class="hl kwa">if not</span> midnode_ok <span class="hl kwa">then</span>
		<span class="hl kwa">return nil</span> 
	<span class="hl kwa">end</span>
	
	<span class="hl kwa">local</span> <span class="hl kwb">next</span><span class="hl opt">,</span> chkdir<span class="hl opt">,</span> chkrely<span class="hl opt">,</span> y_offset
	y_offset<span class="hl opt">=</span><span class="hl num">0</span>
	<span class="hl slc">--print(&quot;[advtrains] in order mid1,mid2&quot;,middir1,middir2)</span>
	<span class="hl slc">--try if it is dir1</span>
	<span class="hl kwa">local</span> cor1<span class="hl opt">=</span>advtrains<span class="hl opt">.</span><span class="hl kwd">dirCoordSet</span><span class="hl opt">(</span>mid<span class="hl opt">,</span> middir2<span class="hl opt">)</span><span class="hl slc">--&lt;&lt;&lt;&lt;</span>
	<span class="hl kwa">if</span> math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>cor1<span class="hl opt">.</span>x<span class="hl opt">+</span><span class="hl num">0.5</span><span class="hl opt">)==</span>math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>prev<span class="hl opt">.</span>x<span class="hl opt">+</span><span class="hl num">0.5</span><span class="hl opt">)</span> <span class="hl kwa">and</span> math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>cor1<span class="hl opt">.</span>z<span class="hl opt">+</span><span class="hl num">0.5</span><span class="hl opt">)==</span>math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>prev<span class="hl opt">.</span>z<span class="hl opt">+</span><span class="hl num">0.5</span><span class="hl opt">)</span> <span class="hl kwa">then</span><span class="hl slc">--this was previous</span>
		<span class="hl kwb">next</span><span class="hl opt">=</span>advtrains<span class="hl opt">.</span><span class="hl kwd">dirCoordSet</span><span class="hl opt">(</span>mid<span class="hl opt">,</span> middir1<span class="hl opt">)</span>
		<span class="hl kwa">if</span> midrely1<span class="hl opt">&gt;=</span><span class="hl num">1</span> <span class="hl kwa">then</span>
			<span class="hl kwb">next</span><span class="hl opt">.</span>y<span class="hl opt">=</span><span class="hl kwb">next</span><span class="hl opt">.</span>y<span class="hl opt">+</span><span class="hl num">1</span>
			<span class="hl slc">--print(&quot;[advtrains]found midrely1 to be &gt;=1: next is now &quot;..(next and minetest.pos_to_string(next) or &quot;nil&quot;))</span>
			y_offset<span class="hl opt">=</span><span class="hl num">1</span>
		<span class="hl kwa">end</span>
		chkdir<span class="hl opt">=</span>middir1
		chkrely<span class="hl opt">=</span>midrely1
		<span class="hl slc">--print(&quot;[advtrains]dir2 applied next pos:&quot;,minetest.pos_to_string(next),&quot;(chkdir is &quot;,chkdir,&quot;)&quot;)</span>
	<span class="hl kwa">end</span>
	<span class="hl slc">--dir2???</span>
	<span class="hl kwa">local</span> cor2<span class="hl opt">=</span>advtrains<span class="hl opt">.</span><span class="hl kwd">dirCoordSet</span><span class="hl opt">(</span>mid<span class="hl opt">,</span> middir1<span class="hl opt">)</span><span class="hl slc">--&lt;&lt;&lt;&lt;</span>
	<span class="hl kwa">if</span> math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>cor2<span class="hl opt">.</span>x<span class="hl opt">+</span><span class="hl num">0.5</span><span class="hl opt">)==</span>math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>prev<span class="hl opt">.</span>x<span class="hl opt">+</span><span class="hl num">0.5</span><span class="hl opt">)</span> <span class="hl kwa">and</span> math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>cor2<span class="hl opt">.</span>z<span class="hl opt">+</span><span class="hl num">0.5</span><span class="hl opt">)==</span>math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>prev<span class="hl opt">.</span>z<span class="hl opt">+</span><span class="hl num">0.5</span><span class="hl opt">)</span> <span class="hl kwa">then</span>
		<span class="hl kwb">next</span><span class="hl opt">=</span>advtrains<span class="hl opt">.</span><span class="hl kwd">dirCoordSet</span><span class="hl opt">(</span>mid<span class="hl opt">,</span> middir2<span class="hl opt">)</span><span class="hl slc">--dir2 wird überprüft, alles gut.</span>
		<span class="hl kwa">if</span> midrely2<span class="hl opt">&gt;=</span><span class="hl num">1</span> <span class="hl kwa">then</span>
			<span class="hl kwb">next</span><span class="hl opt">.</span>y<span class="hl opt">=</span><span class="hl kwb">next</span><span class="hl opt">.</span>y<span class="hl opt">+</span><span class="hl num">1</span>
			<span class="hl slc">--print(&quot;[advtrains]found midrely2 to be &gt;=1: next is now &quot;..(next and minetest.pos_to_string(next) or &quot;nil&quot;))</span>
			y_offset<span class="hl opt">=</span><span class="hl num">1</span>
		<span class="hl kwa">end</span>
		chkdir<span class="hl opt">=</span>middir2
		chkrely<span class="hl opt">=</span>midrely2
		<span class="hl slc">--print(&quot;[advtrains] dir2 applied next pos:&quot;,minetest.pos_to_string(next),&quot;(chkdir is &quot;,chkdir,&quot;)&quot;)</span>
	<span class="hl kwa">end</span>
	<span class="hl slc">--print(&quot;[advtrains]dir applied next pos: &quot;..(next and minetest.pos_to_string(next) or &quot;nil&quot;)..&quot;(chkdir is &quot;..(chkdir or &quot;nil&quot;)..&quot;, y-offset &quot;..y_offset..&quot;)&quot;)</span>
	<span class="hl slc">--is there a next</span>
	<span class="hl kwa">if not</span> <span class="hl kwb">next</span> <span class="hl kwa">then</span>
		<span class="hl slc">--print(&quot;[advtrains]in conway: no next rail(nil), returning!&quot;)</span>
		<span class="hl kwa">return nil</span>
	<span class="hl kwa">end</span>
	
	<span class="hl kwa">local</span> nextnode_ok<span class="hl opt">,</span> nextdir1<span class="hl opt">,</span> nextdir2<span class="hl opt">,</span> nextrely1<span class="hl opt">,</span> nextrely2<span class="hl opt">,</span> nextrailheight<span class="hl opt">=</span>advtrains<span class="hl opt">.</span><span class="hl kwd">get_rail_info_at</span><span class="hl opt">(</span>advtrains<span class="hl opt">.</span><span class="hl kwd">round_vector_floor_y</span><span class="hl opt">(</span><span class="hl kwb">next</span><span class="hl opt">),</span> traintype<span class="hl opt">)</span>
	
	<span class="hl slc">--is it a rail?</span>
	<span class="hl kwa">if</span><span class="hl opt">(</span><span class="hl kwa">not</span> nextnode_ok<span class="hl opt">)</span> <span class="hl kwa">then</span>
		<span class="hl slc">--print(&quot;[advtrains]in conway: next &quot;..minetest.pos_to_string(next)..&quot; not a rail, trying one node below!&quot;)</span>
		<span class="hl kwb">next</span><span class="hl opt">.</span>y<span class="hl opt">=</span><span class="hl kwb">next</span><span class="hl opt">.</span>y<span class="hl opt">-</span><span class="hl num">1</span>
		y_offset<span class="hl opt">=</span>y_offset<span class="hl opt">-</span><span class="hl num">1</span>
		
		nextnode_ok<span class="hl opt">,</span> nextdir1<span class="hl opt">,</span> nextdir2<span class="hl opt">,</span> nextrely1<span class="hl opt">,</span> nextrely2<span class="hl opt">,</span> nextrailheight<span class="hl opt">=</span>advtrains<span class="hl opt">.</span><span class="hl kwd">get_rail_info_at</span><span class="hl opt">(</span>advtrains<span class="hl opt">.</span><span class="hl kwd">round_vector_floor_y</span><span class="hl opt">(</span><span class="hl kwb">next</span><span class="hl opt">),</span> traintype<span class="hl opt">)</span>
		<span class="hl kwa">if</span><span class="hl opt">(</span><span class="hl kwa">not</span> nextnode_ok<span class="hl opt">)</span> <span class="hl kwa">then</span>
			<span class="hl slc">--print(&quot;[advtrains]in conway: one below &quot;..minetest.pos_to_string(next)..&quot; is not a rail either, returning!&quot;)</span>
			<span class="hl kwa">return nil</span>
		<span class="hl kwa">end</span>
	<span class="hl kwa">end</span>
	
	<span class="hl slc">--is this next rail connecting to the mid?</span>
	<span class="hl kwa">if not</span> <span class="hl opt">( (((</span>nextdir1<span class="hl opt">+</span><span class="hl num">8</span><span class="hl opt">)%</span><span class="hl num">16</span><span class="hl opt">)==</span>chkdir <span class="hl kwa">and</span> nextrely1<span class="hl opt">==</span>chkrely<span class="hl opt">-</span>y_offset<span class="hl opt">)</span> <span class="hl kwa">or</span> <span class="hl opt">(((</span>nextdir2<span class="hl opt">+</span><span class="hl num">8</span><span class="hl opt">)%</span><span class="hl num">16</span><span class="hl opt">)==</span>chkdir <span class="hl kwa">and</span> nextrely2<span class="hl opt">==</span>chkrely<span class="hl opt">-</span>y_offset<span class="hl opt">) )</span> <span class="hl kwa">then</span>
		<span class="hl slc">--print(&quot;[advtrains]in conway: next &quot;..minetest.pos_to_string(next)..&quot; not connecting, trying one node below!&quot;)</span>
		<span class="hl kwb">next</span><span class="hl opt">.</span>y<span class="hl opt">=</span><span class="hl kwb">next</span><span class="hl opt">.</span>y<span class="hl opt">-</span><span class="hl num">1</span>
		y_offset<span class="hl opt">=</span>y_offset<span class="hl opt">-</span><span class="hl num">1</span>
		
		nextnode_ok<span class="hl opt">,</span> nextdir1<span class="hl opt">,</span> nextdir2<span class="hl opt">,</span> nextrely1<span class="hl opt">,</span> nextrely2<span class="hl opt">,</span> nextrailheight<span class="hl opt">=</span>advtrains<span class="hl opt">.</span><span class="hl kwd">get_rail_info_at</span><span class="hl opt">(</span>advtrains<span class="hl opt">.</span><span class="hl kwd">round_vector_floor_y</span><span class="hl opt">(</span><span class="hl kwb">next</span><span class="hl opt">),</span> traintype<span class="hl opt">)</span>
		<span class="hl kwa">if</span><span class="hl opt">(</span><span class="hl kwa">not</span> nextnode_ok<span class="hl opt">)</span> <span class="hl kwa">then</span>
			<span class="hl slc">--print(&quot;[advtrains]in conway: (at connecting if check again) one below &quot;..minetest.pos_to_string(next)..&quot; is not a rail either, returning!&quot;)</span>
			<span class="hl kwa">return nil</span>
		<span class="hl kwa">end</span>
		<span class="hl kwa">if not</span> <span class="hl opt">( (((</span>nextdir1<span class="hl opt">+</span><span class="hl num">8</span><span class="hl opt">)%</span><span class="hl num">16</span><span class="hl opt">)==</span>chkdir <span class="hl kwa">and</span> nextrely1<span class="hl opt">==</span>chkrely<span class="hl opt">)</span> <span class="hl kwa">or</span> <span class="hl opt">(((</span>nextdir2<span class="hl opt">+</span><span class="hl num">8</span><span class="hl opt">)%</span><span class="hl num">16</span><span class="hl opt">)==</span>chkdir <span class="hl kwa">and</span> nextrely2<span class="hl opt">==</span>chkrely<span class="hl opt">) )</span> <span class="hl kwa">then</span>
			<span class="hl slc">--print(&quot;[advtrains]in conway: one below &quot;..minetest.pos_to_string(next)..&quot; rail not connecting, returning!&quot;)</span>
			<span class="hl slc">--print(&quot;[advtrains] in order mid1,2,next1,2,chkdir &quot;..middir1..&quot; &quot;..middir2..&quot; &quot;..nextdir1..&quot; &quot;..nextdir2..&quot; &quot;..chkdir)</span>
			<span class="hl kwa">return nil</span>
		<span class="hl kwa">end</span>
	<span class="hl kwa">end</span>
	
	<span class="hl slc">--print(&quot;[advtrains]conway found rail.&quot;)</span>
	<span class="hl kwa">return</span> vector<span class="hl opt">.</span><span class="hl kwd">add</span><span class="hl opt">(</span>advtrains<span class="hl opt">.</span><span class="hl kwd">round_vector_floor_y</span><span class="hl opt">(</span><span class="hl kwb">next</span><span class="hl opt">), {</span>x<span class="hl opt">=</span><span class="hl num">0</span><span class="hl opt">,</span> y<span class="hl opt">=</span>nextrailheight<span class="hl opt">,</span> z<span class="hl opt">=</span><span class="hl num">0</span><span class="hl opt">}),</span> chkdir
<span class="hl kwa">end</span>
<span class="hl slc">--TODO use this</span>
<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">oppd</span><span class="hl opt">(</span>dir<span class="hl opt">)</span>
	<span class="hl kwa">return</span> <span class="hl opt">((</span>dir<span class="hl opt">+</span><span class="hl num">8</span><span class="hl opt">)%</span><span class="hl num">16</span><span class="hl opt">)</span>
<span class="hl kwa">end</span>

<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">round_vector_floor_y</span><span class="hl opt">(</span>vec<span class="hl opt">)</span>
	<span class="hl kwa">return</span> <span class="hl opt">{</span>x<span class="hl opt">=</span>math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>vec<span class="hl opt">.</span>x<span class="hl opt">+</span><span class="hl num">0.5</span><span class="hl opt">),</span> y<span class="hl opt">=</span>math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>vec<span class="hl opt">.</span>y<span class="hl opt">),</span> z<span class="hl opt">=</span>math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>vec<span class="hl opt">.</span>z<span class="hl opt">+</span><span class="hl num">0.5</span><span class="hl opt">)}</span>
<span class="hl kwa">end</span>

<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">yawToDirection</span><span class="hl opt">(</span>yaw<span class="hl opt">,</span> conn1<span class="hl opt">,</span> conn2<span class="hl opt">)</span>
	<span class="hl kwa">if not</span> conn1 <span class="hl kwa">or not</span> conn2 <span class="hl kwa">then</span>
		<span class="hl kwb">error</span><span class="hl opt">(</span><span class="hl str">&quot;given nil to yawToDirection: conn1=&quot;</span><span class="hl opt">..(</span>conn1 <span class="hl kwa">or</span> <span class="hl str">&quot;nil&quot;</span><span class="hl opt">)..</span><span class="hl str">&quot; conn2=&quot;</span><span class="hl opt">..(</span>conn1 <span class="hl kwa">or</span> <span class="hl str">&quot;nil&quot;</span><span class="hl opt">))</span>
	<span class="hl kwa">end</span>
	<span class="hl kwa">local</span> yaw1<span class="hl opt">=</span>math<span class="hl opt">.</span>pi<span class="hl opt">*(</span>conn1<span class="hl opt">/</span><span class="hl num">4</span><span class="hl opt">)</span>
	<span class="hl kwa">local</span> yaw2<span class="hl opt">=</span>math<span class="hl opt">.</span>pi<span class="hl opt">*(</span>conn2<span class="hl opt">/</span><span class="hl num">4</span><span class="hl opt">)</span>
	<span class="hl kwa">if</span> advtrains<span class="hl opt">.</span><span class="hl kwd">minAngleDiffRad</span><span class="hl opt">(</span>yaw<span class="hl opt">,</span> yaw1<span class="hl opt">)&lt;</span>advtrains<span class="hl opt">.</span><span class="hl kwd">minAngleDiffRad</span><span class="hl opt">(</span>yaw<span class="hl opt">,</span> yaw2<span class="hl opt">)</span> <span class="hl kwa">then</span><span class="hl slc">--change to &gt; if weird behavior</span>
		<span class="hl kwa">return</span> conn2
	<span class="hl kwa">else</span>
		<span class="hl kwa">return</span> conn1
	<span class="hl kwa">end</span>
<span class="hl kwa">end</span>

<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">minAngleDiffRad</span><span class="hl opt">(</span>r1<span class="hl opt">,</span> r2<span class="hl opt">)</span>
	<span class="hl kwa">local</span> try1<span class="hl opt">=</span>r2<span class="hl opt">-</span>r1
	<span class="hl kwa">local</span> try2<span class="hl opt">=(</span>r2<span class="hl opt">+</span><span class="hl num">2</span><span class="hl opt">*</span>math<span class="hl opt">.</span>pi<span class="hl opt">)-</span>r1
	<span class="hl kwa">local</span> try3<span class="hl opt">=</span>r2<span class="hl opt">-(</span>r1<span class="hl opt">+</span><span class="hl num">2</span><span class="hl opt">*</span>math<span class="hl opt">.</span>pi<span class="hl opt">)</span>
	<span class="hl kwa">if</span> math<span class="hl opt">.</span><span class="hl kwb">min</span><span class="hl opt">(</span>math<span class="hl opt">.</span><span class="hl kwb">abs</span><span class="hl opt">(</span>try1<span class="hl opt">),</span> math<span class="hl opt">.</span><span class="hl kwb">abs</span><span class="hl opt">(</span>try2<span class="hl opt">),</span> math<span class="hl opt">.</span><span class="hl kwb">abs</span><span class="hl opt">(</span>try3<span class="hl opt">))==</span>math<span class="hl opt">.</span><span class="hl kwb">abs</span><span class="hl opt">(</span>try1<span class="hl opt">)</span> <span class="hl kwa">then</span>
		<span class="hl kwa">return</span> try1
	<span class="hl kwa">end</span>
	<span class="hl kwa">if</span> math<span class="hl opt">.</span><span class="hl kwb">min</span><span class="hl opt">(</span>math<span class="hl opt">.</span><span class="hl kwb">abs</span><span class="hl opt">(</span>try1<span class="hl opt">),</span> math<span class="hl opt">.</span><span class="hl kwb">abs</span><span class="hl opt">(</span>try2<span class="hl opt">),</span> math<span class="hl opt">.</span><span class="hl kwb">abs</span><span class="hl opt">(</span>try3<span class="hl opt">))==</span>math<span class="hl opt">.</span><span class="hl kwb">abs</span><span class="hl opt">(</span>try2<span class="hl opt">)</span> <span class="hl kwa">then</span>
		<span class="hl kwa">return</span> try2
	<span class="hl kwa">end</span>
	<span class="hl kwa">if</span> math<span class="hl opt">.</span><span class="hl kwb">min</span><span class="hl opt">(</span>math<span class="hl opt">.</span><span class="hl kwb">abs</span><span class="hl opt">(</span>try1<span class="hl opt">),</span> math<span class="hl opt">.</span><span class="hl kwb">abs</span><span class="hl opt">(</span>try2<span class="hl opt">),</span> math<span class="hl opt">.</span><span class="hl kwb">abs</span><span class="hl opt">(</span>try3<span class="hl opt">))==</span>math<span class="hl opt">.</span><span class="hl kwb">abs</span><span class="hl opt">(</span>try3<span class="hl opt">)</span> <span class="hl kwa">then</span>
		<span class="hl kwa">return</span> try3
	<span class="hl kwa">end</span>
<span class="hl kwa">end</span>
<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">dumppath</span><span class="hl opt">(</span>path<span class="hl opt">)</span>
	<span class="hl kwa">if not</span> path <span class="hl kwa">then</span> <span class="hl kwb">print</span><span class="hl opt">(</span><span class="hl str">&quot;dumppath: no path(nil)&quot;</span><span class="hl opt">)</span> <span class="hl kwa">return end</span>
	<span class="hl kwa">local</span> <span class="hl kwb">min</span><span class="hl opt">=</span>advtrains<span class="hl opt">.</span><span class="hl kwd">minN</span><span class="hl opt">(</span>path<span class="hl opt">)</span>
	<span class="hl kwa">local</span> <span class="hl kwb">max</span><span class="hl opt">=</span>advtrains<span class="hl opt">.</span><span class="hl kwd">maxN</span><span class="hl opt">(</span>path<span class="hl opt">)</span>
	<span class="hl kwa">for</span> i<span class="hl opt">=</span><span class="hl kwb">min</span><span class="hl opt">,</span> <span class="hl kwb">max</span> <span class="hl kwa">do</span> <span class="hl kwb">print</span><span class="hl opt">(</span><span class="hl str">&quot;[&quot;</span><span class="hl opt">..</span>i<span class="hl opt">..</span><span class="hl str">&quot;] &quot;</span><span class="hl opt">..(</span>path<span class="hl opt">[</span>i<span class="hl opt">]</span> <span class="hl kwa">and</span> minetest<span class="hl opt">.</span><span class="hl kwd">pos_to_string</span><span class="hl opt">(</span>path<span class="hl opt">[</span>i<span class="hl opt">])</span> <span class="hl kwa">or</span> <span class="hl str">&quot;nil&quot;</span><span class="hl opt">))</span> <span class="hl kwa">end</span>
<span class="hl kwa">end</span>

<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">merge_tables</span><span class="hl opt">(</span>a<span class="hl opt">, ...)</span>
	<span class="hl kwa">local</span> new<span class="hl opt">={}</span>
	<span class="hl kwa">for</span> _<span class="hl opt">,</span>t <span class="hl kwa">in</span> <span class="hl kwd">ipairs</span><span class="hl opt">({</span>a<span class="hl opt">,...})</span> <span class="hl kwa">do</span>
		<span class="hl kwa">for</span> k<span class="hl opt">,</span>v <span class="hl kwa">in</span> <span class="hl kwd">pairs</span><span class="hl opt">(</span>t<span class="hl opt">)</span> <span class="hl kwa">do</span> new<span class="hl opt">[</span>k<span class="hl opt">]=</span>v <span class="hl kwa">end</span>
	<span class="hl kwa">end</span>
	<span class="hl kwa">return</span> new
<span class="hl kwa">end</span>
<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">yaw_from_3_positions</span><span class="hl opt">(</span>prev<span class="hl opt">,</span> curr<span class="hl opt">,</span> <span class="hl kwb">next</span><span class="hl opt">)</span>
	<span class="hl kwa">local</span> pts<span class="hl opt">=</span>minetest<span class="hl opt">.</span>pos_to_string
	<span class="hl slc">--print(&quot;p3 &quot;..pts(prev)..pts(curr)..pts(next))</span>
	<span class="hl kwa">local</span> prev2curr<span class="hl opt">=</span>math<span class="hl opt">.</span><span class="hl kwb">atan2</span><span class="hl opt">((</span>curr<span class="hl opt">.</span>x<span class="hl opt">-</span>prev<span class="hl opt">.</span>x<span class="hl opt">), (</span>prev<span class="hl opt">.</span>z<span class="hl opt">-</span>curr<span class="hl opt">.</span>z<span class="hl opt">))</span>
	<span class="hl kwa">local</span> curr2next<span class="hl opt">=</span>math<span class="hl opt">.</span><span class="hl kwb">atan2</span><span class="hl opt">((</span><span class="hl kwb">next</span><span class="hl opt">.</span>x<span class="hl opt">-</span>curr<span class="hl opt">.</span>x<span class="hl opt">), (</span>curr<span class="hl opt">.</span>z<span class="hl opt">-</span><span class="hl kwb">next</span><span class="hl opt">.</span>z<span class="hl opt">))</span>
	<span class="hl slc">--print(&quot;y3 &quot;..(prev2curr*360/(2*math.pi))..&quot; &quot;..(curr2next*360/(2*math.pi)))</span>
	<span class="hl kwa">return</span> prev2curr<span class="hl opt">+(</span>advtrains<span class="hl opt">.</span><span class="hl kwd">minAngleDiffRad</span><span class="hl opt">(</span>prev2curr<span class="hl opt">,</span> curr2next<span class="hl opt">)/</span><span class="hl num">2</span><span class="hl opt">)</span>
<span class="hl kwa">end</span>
<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">get_wagon_yaw</span><span class="hl opt">(</span>front<span class="hl opt">,</span> first<span class="hl opt">,</span> second<span class="hl opt">,</span> back<span class="hl opt">,</span> pct<span class="hl opt">)</span>
	<span class="hl kwa">local</span> pts<span class="hl opt">=</span>minetest<span class="hl opt">.</span>pos_to_string
	<span class="hl slc">--print(&quot;p &quot;..pts(front)..pts(first)..pts(second)..pts(back))</span>
	<span class="hl kwa">local</span> y2<span class="hl opt">=</span>advtrains<span class="hl opt">.</span><span class="hl kwd">yaw_from_3_positions</span><span class="hl opt">(</span>second<span class="hl opt">,</span> first<span class="hl opt">,</span> front<span class="hl opt">)</span>
	<span class="hl kwa">local</span> y1<span class="hl opt">=</span>advtrains<span class="hl opt">.</span><span class="hl kwd">yaw_from_3_positions</span><span class="hl opt">(</span>back<span class="hl opt">,</span> second<span class="hl opt">,</span> first<span class="hl opt">)</span>
	<span class="hl slc">--print(&quot;y &quot;..(y1*360/(2*math.pi))..&quot; &quot;..(y2*360/(2*math.pi)))</span>
	<span class="hl kwa">return</span> y1<span class="hl opt">+</span>advtrains<span class="hl opt">.</span><span class="hl kwd">minAngleDiffRad</span><span class="hl opt">(</span>y1<span class="hl opt">,</span> y2<span class="hl opt">)*</span>pct
<span class="hl kwa">end</span>
<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">get_real_index_position</span><span class="hl opt">(</span>path<span class="hl opt">,</span> index<span class="hl opt">)</span>
	<span class="hl kwa">if not</span> path <span class="hl kwa">or not</span> index <span class="hl kwa">then return end</span>
	
	<span class="hl kwa">local</span> first_pos<span class="hl opt">=</span>path<span class="hl opt">[</span>math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>index<span class="hl opt">)]</span>
	<span class="hl kwa">local</span> second_pos<span class="hl opt">=</span>path<span class="hl opt">[</span>math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>index<span class="hl opt">)+</span><span class="hl num">1</span><span class="hl opt">]</span>
	
	<span class="hl kwa">if not</span> first_pos <span class="hl kwa">or not</span> second_pos <span class="hl kwa">then return nil end</span>
	
	<span class="hl kwa">local</span> factor<span class="hl opt">=</span>index<span class="hl opt">-</span>math<span class="hl opt">.</span><span class="hl kwb">floor</span><span class="hl opt">(</span>index<span class="hl opt">)</span>
	<span class="hl kwa">local</span> actual_pos<span class="hl opt">={</span>x<span class="hl opt">=</span>first_pos<span class="hl opt">.</span>x<span class="hl opt">-(</span>first_pos<span class="hl opt">.</span>x<span class="hl opt">-</span>second_pos<span class="hl opt">.</span>x<span class="hl opt">)*</span>factor<span class="hl opt">,</span> y<span class="hl opt">=</span>first_pos<span class="hl opt">.</span>y<span class="hl opt">-(</span>first_pos<span class="hl opt">.</span>y<span class="hl opt">-</span>second_pos<span class="hl opt">.</span>y<span class="hl opt">)*</span>factor<span class="hl opt">,</span> z<span class="hl opt">=</span>first_pos<span class="hl opt">.</span>z<span class="hl opt">-(</span>first_pos<span class="hl opt">.</span>z<span class="hl opt">-</span>second_pos<span class="hl opt">.</span>z<span class="hl opt">)*</span>factor<span class="hl opt">,}</span>
	<span class="hl kwa">return</span> actual_pos
<span class="hl kwa">end</span>
<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">pos_median</span><span class="hl opt">(</span>pos1<span class="hl opt">,</span> pos2<span class="hl opt">)</span>
	<span class="hl kwa">return</span> <span class="hl opt">{</span>x<span class="hl opt">=</span>pos1<span class="hl opt">.</span>x<span class="hl opt">-(</span>pos1<span class="hl opt">.</span>x<span class="hl opt">-</span>pos2<span class="hl opt">.</span>x<span class="hl opt">)*</span><span class="hl num">0.5</span><span class="hl opt">,</span> y<span class="hl opt">=</span>pos1<span class="hl opt">.</span>y<span class="hl opt">-(</span>pos1<span class="hl opt">.</span>y<span class="hl opt">-</span>pos2<span class="hl opt">.</span>y<span class="hl opt">)*</span><span class="hl num">0.5</span><span class="hl opt">,</span> z<span class="hl opt">=</span>pos1<span class="hl opt">.</span>z<span class="hl opt">-(</span>pos1<span class="hl opt">.</span>z<span class="hl opt">-</span>pos2<span class="hl opt">.</span>z<span class="hl opt">)*</span><span class="hl num">0.5</span><span class="hl opt">}</span>
<span class="hl kwa">end</span>
<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">abs_ceil</span><span class="hl opt">(</span>i<span class="hl opt">)</span>
	<span class="hl kwa">return</span> math<span class="hl opt">.</span><span class="hl kwb">ceil</span><span class="hl opt">(</span>math<span class="hl opt">.</span><span class="hl kwb">abs</span><span class="hl opt">(</span>i<span class="hl opt">))*</span>math<span class="hl opt">.</span><span class="hl kwd">sign</span><span class="hl opt">(</span>i<span class="hl opt">)</span>
<span class="hl kwa">end</span>

<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">serialize_inventory</span><span class="hl opt">(</span>inv<span class="hl opt">)</span>
	<span class="hl kwa">local</span> ser<span class="hl opt">={}</span>
	<span class="hl kwa">local</span> liszts<span class="hl opt">=</span>inv<span class="hl opt">:</span><span class="hl kwd">get_lists</span><span class="hl opt">()</span>
	<span class="hl kwa">for</span> lisztname<span class="hl opt">,</span> liszt <span class="hl kwa">in</span> <span class="hl kwd">pairs</span><span class="hl opt">(</span>liszts<span class="hl opt">)</span> <span class="hl kwa">do</span>
		ser<span class="hl opt">[</span>lisztname<span class="hl opt">]={}</span>
		<span class="hl kwa">for</span> idx<span class="hl opt">,</span> item <span class="hl kwa">in</span> <span class="hl kwd">ipairs</span><span class="hl opt">(</span>liszt<span class="hl opt">)</span> <span class="hl kwa">do</span>
			<span class="hl kwa">local</span> istring<span class="hl opt">=</span>item<span class="hl opt">:</span><span class="hl kwd">to_string</span><span class="hl opt">()</span>
			<span class="hl kwa">if</span> istring<span class="hl opt">~=</span><span class="hl str">&quot;&quot;</span> <span class="hl kwa">then</span>
				ser<span class="hl opt">[</span>lisztname<span class="hl opt">][</span>idx<span class="hl opt">]=</span>istring
			<span class="hl kwa">end</span>
		<span class="hl kwa">end</span>
	<span class="hl kwa">end</span>
	<span class="hl kwa">return</span> minetest<span class="hl opt">.</span><span class="hl kwd">serialize</span><span class="hl opt">(</span>ser<span class="hl opt">)</span>
<span class="hl kwa">end</span>
<span class="hl kwa">function</span> advtrains<span class="hl opt">.</span><span class="hl kwd">deserialize_inventory</span><span class="hl opt">(</span>sers<span class="hl opt">,</span> inv<span class="hl opt">)</span>
	<span class="hl kwa">local</span> ser<span class="hl opt">=</span>minetest<span class="hl opt">.</span><span class="hl kwd">deserialize</span><span class="hl opt">(</span>sers<span class="hl opt">)</span>
	<span class="hl kwa">if</span> ser <span class="hl kwa">then</span>
		inv<span class="hl opt">:</span><span class="hl kwd">set_lists</span><span class="hl opt">(</span>ser<span class="hl opt">)</span>
		<span class="hl kwa">return true</span>
	<span class="hl kwa">end</span>
	<span class="hl kwa">return false</span>
<span class="hl kwa">end</span>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.39.1</a>) at 2026-11-02 00:23:25 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
