~gpcf/advtrains-devel

Implement staticdata for trains v1 PROPOSED

Y. Wang: 1
 Implement staticdata for trains

 3 files changed, 23 insertions(+), 0 deletions(-)
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~gpcf/advtrains-devel/patches/55116/mbox | git am -3
Learn more about email & git

[PATCH] Implement staticdata for trains Export this patch

This patch exposes train.staticdata that can be used by other modders to
save data in trains across restarts. It additionally exposes two new
APIs for modders where this is relevant:

* advtrains.te_register_on_couple(function(init_train, stat_train)):
  registers a callback for train coupling, where stat_train is couple
  into init_train and is subsequently removed. This callback is run
  before the actual coupling takes place; in particular, it is run
  before stat_train is removed.
* advtrains.te_register_on_decouple(function(train, newtrain, index)):
  registers a callback for train decoupling, where newtrain is created
  by splitting the train at the given index (the wagon at the index is
  part of the new train). This callback is run after decoupling takes
  place.

advtrains.te_register_on_decouple(function

---
 advtrains/couple.lua     | 16 ++++++++++++++++
 advtrains/init.lua       |  1 +
 advtrains/trainlogic.lua |  6 ++++++
 3 files changed, 23 insertions(+)

diff --git a/advtrains/couple.lua b/advtrains/couple.lua
index b6a445e..3bc4040 100644
--- a/advtrains/couple.lua
+++ b/advtrains/couple.lua
@@ -28,6 +28,20 @@ end
advtrains.register_coupler_type("chain", attrans("Buffer and Chain Coupler"))
advtrains.register_coupler_type("scharfenberg", attrans("Scharfenberg Coupler"))

for _, name in pairs {"couple", "decouple"} do
	local t = {}
	local function reg(f)
		table.insert(t, f)
	end
	local function cb(...)
		for _, f in ipairs(t) do
			f(...)
		end
	end
	advtrains["te_registered_on_" .. name] = t
	advtrains["te_register_on_" .. name] = reg
	advtrains["te_run_callbacks_on_" .. name] = cb
end

local function create_couple_entity(pos, train1, t1_is_front, train2, t2_is_front)
	local id1 = train1.id
@@ -235,6 +249,8 @@ function advtrains.couple_trains(init_train, invert_init_train, stat_train, stat
		return
	end

	advtrains.te_run_callbacks_on_couple(init_train, stat_train)

	if stat_train_opposite then
		-- insert wagons in inverse order and set their wagon_flipped state
		for i=1,stat_wagoncnt do
diff --git a/advtrains/init.lua b/advtrains/init.lua
index 06e456f..1486f8b 100644
--- a/advtrains/init.lua
+++ b/advtrains/init.lua
@@ -476,6 +476,7 @@ advtrains.avt_save = function(remove_players_from_wagons)
				"text_outside", "text_inside", "line", "routingcode",
				"il_sections", "speed_restriction", "speed_restrictions_t", "is_shunt",
				"points_split", "autocouple", "atc_wait_autocouple", "ars_disable",
				"staticdata",
			})
			--then save it
			tmp_trains[id]=v
diff --git a/advtrains/trainlogic.lua b/advtrains/trainlogic.lua
index f136577..cbf1064 100644
--- a/advtrains/trainlogic.lua
+++ b/advtrains/trainlogic.lua
@@ -270,6 +270,10 @@ function advtrains.train_ensure_init(id, train)
		atwarn(debug.traceback())
		return nil
	end

	if not train.staticdata then
		train.staticdata = {}
	end
	
	train.dirty = true
	if train.no_step then
@@ -1185,6 +1189,8 @@ function advtrains.split_train_at_index(train, index)
	newtrain.points_split = advtrains.merge_tables(train.points_split)
	newtrain.autocouple = train.autocouple

	advtrains.te_run_callbacks_on_decouple(train, newtrain, index)

	return newtrain_id -- return new train ID, so new train can be manipulated

end
-- 
2.46.0