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"}
})
|