aboutsummaryrefslogtreecommitdiff
path: root/advtrains_interlocking/tool.lua
blob: 5ceae0475a2bb8ed55b3d473e6cdb74605531cbd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
-- tool.lua
-- Interlocking tool

local ilrs = advtrains.interlocking.route

local function node_right_click(pos, pname, player)
	if advtrains.is_passive(pos) then
		local form = "size[7,5]label[0.5,0.5;Route lock inspector]"
		local pts = advtrains.encode_pos(pos)
		
		local rtl = ilrs.has_route_lock(pts)
		
		if rtl then
			form = form.."label[0.5,1;Route locks currently put:\n"..rtl.."]"
			form = form.."button_exit[0.5,3.5;  5,1;clear;Clear]"
		else
			form = form.."label[0.5,1;No route locks set]"
			form = form.."button_exit[0.5,3.5;  5,1;emplace;Emplace manual lock]"
		end
		
		minetest.show_formspec(pname, "at_il_rtool_"..pts, form)
		return
	end

	-- If not a turnout, check the track section and show a form
	local node_ok, conns, rail_y=advtrains.get_rail_info_at(pos)
	if not node_ok then
		minetest.chat_send_player(pname, "Node is not a track!")
		return
	end
	if advtrains.interlocking.db.get_tcb(pos) then
		advtrains.interlocking.show_tcb_form(pos, pname)
		return
	end

	local ts_id = advtrains.interlocking.db.check_and_repair_ts_at_pos(pos, nil, pname)
	if ts_id then
		advtrains.interlocking.show_ts_form(ts_id, pname)
	else
		minetest.chat_send_player(pname, "No track section at this location!")
	end
end

local function node_left_click(pos, pname, player)
	local node_ok, conns, rail_y=advtrains.get_rail_info_at(pos)
	if not node_ok then
		minetest.chat_send_player(pname, "Node is not a track!")
		return
	end

	if advtrains.interlocking.db.get_tcb(pos) then
		advtrains.interlocking.show_tcb_marker(pos)
		return
	end
	
	-- create track section if aux1 button down
	local pc = player:get_player_control()
	local force_create = pc.aux1

	local ts_id = advtrains.interlocking.db.check_and_repair_ts_at_pos(pos, nil, pname, force_create)
	if ts_id then
		advtrains.interlocking.db.update_rs_cache(ts_id)
		advtrains.interlocking.highlight_track_section(pos)
	else
		minetest.chat_send_player(pname, "No track section at this location!")
	end
end


minetest.register_craftitem("advtrains_interlocking:tool",{
	description = "Interlocking tool\nPunch: Highlight track section\nPlace: check route locks/show track section info",
	groups = {cracky=1}, -- key=name, value=rating; rating=1..3.
	inventory_image = "at_il_tool.png",
	wield_image = "at_il_tool.png",
	stack_max = 1,
	on_place = function(itemstack, player, pointed_thing)
		local pname = player:get_player_name()
		if not pname then
			return
		end
		if not minetest.check_player_privs(pname, {interlocking=true}) then
			minetest.chat_send_player(pname, "Insufficient privileges to use this!")
			return
		end
		if pointed_thing.type=="node" then
			local pos=pointed_thing.under
			node_right_click(pos, pname, player)
		end
	end,
	on_use = function(itemstack, player, pointed_thing)
		local pname = player:get_player_name()
		if not pname then
			return
		end
		if not minetest.check_player_privs(pname, {interlocking=true}) then
			minetest.chat_send_player(pname, "Insufficient privileges to use this!")
			return
		end
		if pointed_thing.type=="node" then
			local pos=pointed_thing.under
			node_left_click(pos, pname, player)
		end
	end
})

minetest.register_on_player_receive_fields(function(player, formname, fields)
	local pname = player:get_player_name()
	if not minetest.check_player_privs(pname, "interlocking") then
		return
	end
	local pos
	local pts = string.match(formname, "^at_il_rtool_(.+)$")
	if pts then
		pos = advtrains.decode_pos(pts)
	end
	if pos then
		if advtrains.is_passive(pos) then
			if fields.clear then
				ilrs.remove_route_locks(pts)
			end
			if fields.emplace then
				ilrs.add_manual_route_lock(pts, "Manual lock ("..pname..")")
			end
		end
	end
end)

minetest.register_craft({
	output = "advtrains_interlocking:tool",
	type = "shapeless",
	recipe = {"dye:green","advtrains:trackworker", "advtrains_interlocking:tcb_node"}
})