-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinit.lua
More file actions
207 lines (198 loc) · 7.71 KB
/
init.lua
File metadata and controls
207 lines (198 loc) · 7.71 KB
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
-- Write Sign Mod
-- Written by muhdnurhidayat based on and depends on WorldEdit
-- Released under same license as WorldEdit which is AGPL
-- Load stuffs needed by the mod
local safe_region = dofile(minetest.get_modpath("worldedit_commands") .. "/safe.lua")
-- List of supported signs
local sign_list = {
"default:sign_wall_wood",
"default:sign_wall_steel",
"signs:sign_yard",
"signs:sign_hanging",
"signs:sign_wall_green",
"signs:sign_wall_yellow",
"signs:sign_wall_red",
"signs:sign_wall_white_red",
"signs:sign_wall_white_black",
"signs:sign_wall_orange",
"signs:sign_wall_blue",
"signs:sign_wall_brown",
"locked_sign:sign_wall_locked",
"signs:paper_poster",
"signs:wooden_right_sign",
"signs:wooden_left_sign",
"signs_road:large_street_sign",
"signs_road:blue_street_sign",
"signs_road:green_street_sign",
"signs_road:green_left_sign",
"signs_road:green_right_sign",
"signs_road:white_street_sign",
"signs_road:white_left_sign",
"signs_road:white_right_sign",
"signs_road:red_street_sign",
"signs_road:black_left_sign",
"signs_road:black_right_sign",
"signs_road:yellow_left_sign",
"signs_road:yellow_right_sign",
"signs_road:yellow_street_sign",
"steles:stone_stele",
"steles:sandstone_stele",
"steles:desert_stone_stele",
"boards:black_board",
"boards:green_board"
}
-- Checks if the node is a supported sign
local function is_sign(check_node)
for i,node_name in ipairs(sign_list) do
if node_name == check_node then
return true
end
end
return false
end
--- Sets sign_text of a region.
-- @param pos1
-- @param pos2
-- @param sign_text String of the sign text to be written
-- @return The number of signs edited.
function worldedit.set_sign_text(pos1, pos2, sign_text)
local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
local registered_nodes = minetest.registered_nodes
sign_text = sign_text:gsub("\\n","\n")
worldedit.keep_loaded(pos1, pos2)
local count = 0
local pos = {x=pos1.x, y=0, z=0}
while pos.x <= pos2.x do
pos.y = pos1.y
while pos.y <= pos2.y do
pos.z = pos1.z
while pos.z <= pos2.z do
local node = minetest.get_node(pos)
if is_sign(node.name) then
local def = registered_nodes[node.name]
if def then
local meta = minetest.get_meta(pos)
-- If signs_lib is enabled but not display_api
if minetest.get_modpath("signs_lib") and not minetest.get_modpath("display_api") then
if node.name == "locked_sign:sign_wall_locked" then
local owner = meta:get_string("owner")
meta:set_string("text", sign_text)
meta:set_string("infotext", "Locked sign, owned by " .. owner .. "\n" .. sign_text:gsub("#[0-9a-fA-F]", ""):gsub("##", "#"))
signs_lib.update_sign(pos)
else
meta:set_string("text", sign_text)
meta:set_string("infotext", sign_text:gsub("#[0-9a-fA-F]", ""):gsub("##", "#"))
signs_lib.update_sign(pos)
end
-- If display_api is enabled but not signs_lib
elseif minetest.get_modpath("display_api") and not minetest.get_modpath("signs_lib") then
if node.name == "signs:paper_poster" then
local entr = sign_text:find('\n')
if entr ~= nil then
meta:set_string("text", sign_text)
sign_text = sign_text:sub(1,entr-1)
else
meta:set_string("text", "Press the Edit button.")
sign_text = sign_text
end
meta:set_string("display_text", sign_text)
meta:set_string("infotext", "\""..sign_text.."\"\n".."(right-click to read more text)")
display_api.update_entities(pos)
elseif string.find(node.name,"signs_road:") then
local sign_text = sign_text:gsub("\n", " ")
meta:set_string("display_text", sign_text)
meta:set_string("text", sign_text)
meta:set_string("infotext", '"' .. sign_text .. '"')
display_api.update_entities(pos)
else
meta:set_string("display_text", sign_text)
meta:set_string("text", sign_text)
meta:set_string("infotext", '"' .. sign_text .. '"')
display_api.update_entities(pos)
end
-- If both display api and signs_lib are enabled
elseif minetest.get_modpath("display_api") and minetest.get_modpath("signs_lib") then
if node.name == "signs:paper_poster" then
local entr = sign_text:find('\n')
if entr ~= nil then
meta:set_string("text", sign_text)
sign_text = sign_text:sub(1,entr-1)
else
meta:set_string("text", "Press the Edit button.")
sign_text = sign_text
end
meta:set_string("display_text", sign_text)
meta:set_string("infotext", "\""..sign_text.."\"\n".."(right-click to read more text)")
display_api.update_entities(pos)
elseif node.name == "locked_sign:sign_wall_locked" then
local owner = meta:get_string("owner")
meta:set_string("text", sign_text)
meta:set_string("infotext", "Locked sign, owned by " .. owner .. "\n" .. sign_text:gsub("#[0-9a-fA-F]", ""):gsub("##", "#"))
signs_lib.update_sign(pos)
elseif node.name == "signs:wooden_right_sign" or node.name == "signs:wooden_left_sign" then
local sign_text = sign_text:gsub("\n", " ")
meta:set_string("display_text", sign_text)
meta:set_string("text", sign_text)
meta:set_string("infotext", '"' .. sign_text .. '"')
display_api.update_entities(pos)
elseif string.find(node.name,"signs:") then
meta:set_string("text", sign_text)
meta:set_string("infotext", sign_text:gsub("#[0-9a-fA-F]", ""):gsub("##", "#"))
signs_lib.update_sign(pos)
elseif string.find(node.name,"signs_road:") then
local sign_text = sign_text:gsub("\n", " ")
meta:set_string("display_text", sign_text)
meta:set_string("text", sign_text)
meta:set_string("infotext", '"' .. sign_text .. '"')
display_api.update_entities(pos)
elseif string.find(node.name,"default:") then
meta:set_string("text", sign_text)
meta:set_string("infotext", sign_text:gsub("#[0-9a-fA-F]", ""):gsub("##", "#"))
signs_lib.update_sign(pos)
else
meta:set_string("display_text", sign_text)
meta:set_string("text", sign_text)
meta:set_string("infotext", '"' .. sign_text .. '"')
display_api.update_entities(pos)
end
-- If both display_api and signs_lib are not enabled (ie. only default signs)
else
meta:set_string("text", sign_text)
meta:set_string("infotext", '"' .. sign_text .. '"')
end
count = count + 1
end
else
count = count
end
pos.z = pos.z + 1
end
pos.y = pos.y + 1
end
pos.x = pos.x + 1
end
return count
end
-- Register chat command /writesign
minetest.register_chatcommand("/writesign", {
params = "<sign_text>",
description = "Set texts of supported signs in the current WorldEdit region to <sign_text>",
privs = {worldedit=true},
func = safe_region(function(name, param)
local sign_text = param
if not sign_text then
worldedit.player_notify(name, "Invalid or missing sign_text argument")
return
elseif sign_text == " " then
worldedit.player_notify(name, "Invalid or missing sign_text argument")
return
end
local count = worldedit.set_sign_text(worldedit.pos1[name], worldedit.pos2[name], sign_text)
worldedit.player_notify(name, count .. " signs altered")
end, check_region),
})
-- Register alias for /writesign
if minetest.get_modpath("worldedit_shortcommands") then
local alias_chatcommand = dofile(minetest.get_modpath("worldedit_shortcommands") .. "/init.lua")
worldedit.alias_chatcommand("/ws", "/writesign")
end