Skip to content

Commit 4ebc92c

Browse files
v1.3
1 parent 5056f0b commit 4ebc92c

File tree

6 files changed

+119
-62
lines changed

6 files changed

+119
-62
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.qodo

.luacheckrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
read_globals = {
22
"DIR_DELIM", "INIT",
33

4-
"minetest", "core",
4+
"core", "core",
55
"dump", "dump2",
66

77
"Raycast",

.vscode/settings.json

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,57 @@
11
{
2-
"Lua.workspace.library": [
3-
"/home/nolan/.config/Code/User/globalStorage/sumneko.lua/addonManager/addons/minetest/module/library"
2+
"editor.inlineSuggest.showToolbar": "always",
3+
"Lua.diagnostics.globals": [
4+
"mcl_formspec",
5+
"mcl_item_id",
6+
"armor",
7+
"bucket",
8+
"mcl_buckets",
9+
"mcl_armor",
10+
"mcl_enchanting",
11+
"default",
12+
"mcl_sounds",
13+
"mcl_util",
14+
"mcl_potions",
15+
"mcl_vars",
16+
"playerphysics",
17+
"mcl_playerinfo",
18+
"mcl_bamboo",
19+
"mcl_core",
20+
"dump",
21+
"ItemStack",
22+
"core",
23+
"better_commands",
24+
"better_command_blocks",
25+
"nether",
26+
"vector",
27+
"pipeworks",
28+
"mcl_burning",
29+
"fire_plus",
30+
"mcl_weather",
31+
"weather_mod",
32+
"mcl_damage",
33+
"weather",
34+
"awards",
35+
"mcl_craftguide",
36+
"mcl_particles",
37+
"screwdriver",
38+
"mcl_autogroup",
39+
"farming",
40+
"hopper",
41+
"stamina",
42+
"mcl_banners",
43+
"mcl_hunger",
44+
"mcl_experience",
45+
"mcl_gamemode"
446
],
547
"Lua.diagnostics.disable": [
6-
"undefined-field",
7-
"cast-local-type"
48+
"undefined-field"
49+
],
50+
"Lua.workspace.userThirdParty": [
51+
"C:\\Portable\\LuaLSAddons"
52+
],
53+
"Lua.workspace.library": [
54+
"C:/Portable/LuaLSAddons/luanti-lls-definitions/library"
855
],
956
"Lua.workspace.checkThirdParty": false
1057
}

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## v1.3
4+
* Fixed a couple random things (commands can now begin with slashes again)
5+
6+
## v1.2
7+
* Command blocks can be dug by hand.
8+
* Repeating command blocks with a missing/invalid command will no longer stop repeating.
9+
310
## v1.1 (May 31, 2024)
411
* Chain command blocks must now be facing the same direction as the previous command block to match ACOVG
512
* Command block success messages are no longer replaced with "success"

init.lua

Lines changed: 58 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
local S = minetest.get_translator(minetest.get_current_modname())
1+
local S = core.get_translator(core.get_current_modname())
22

33
better_command_blocks = {}
44

@@ -22,7 +22,7 @@ local mesecons_rules = {
2222
local already_run = {}
2323

2424
---Gets a metadata string or a fallback falue
25-
---@param meta minetest.MetaDataRef
25+
---@param meta core.MetaDataRef
2626
---@param key string
2727
---@param fallback any
2828
---@return any
@@ -42,13 +42,13 @@ local types = {
4242

4343
---Opens command block formspec
4444
---@param pos vector.Vector
45-
---@param node minetest.Node
46-
---@param player minetest.Player
45+
---@param node core.Node
46+
---@param player core.Player
4747
local function on_rightclick(pos, node, player)
48-
if not minetest.check_player_privs(player, "better_command_blocks") then return end
49-
local meta = minetest.get_meta(pos)
48+
if not core.check_player_privs(player, "better_command_blocks") then return end
49+
local meta = core.get_meta(pos)
5050
local command = meta:get_string("_command")
51-
local group = minetest.get_item_group(node.name, "command_block")
51+
local group = core.get_item_group(node.name, "command_block")
5252
if not types[group] then return end
5353
local power = meta:get_string("_power") == "false" and "Always Active" or "Needs Power"
5454
local message = meta:get_string("_message")
@@ -60,28 +60,28 @@ local function on_rightclick(pos, node, player)
6060
"field[6.5,0.5;2,1;delay;Delay (seconds);",delay,"]",
6161
"field_close_on_enter[delay;false]",
6262
"button[8.5,0.5;1,1;set_delay;Set]",
63-
"field[0.5,2;8,1;command;Command;",minetest.formspec_escape(command),"]",
63+
"field[0.5,2;8,1;command;Command;",core.formspec_escape(command),"]",
6464
"field_close_on_enter[command;false]",
6565
"button[8.5,2;1,1;set_command;Set]",
6666
"button[0.5,3.5;3,1;type;",types[group][1],"]",
6767
"button[3.5,3.5;3,1;conditional;",types[group][2] and "Conditional" or "Unconditional","]",
6868
"button[6.5,3.5;3,1;power;",power,"]",
69-
"textarea[0.5,5;9,1;;Previous output;",minetest.formspec_escape(message),"]",
69+
"textarea[0.5,5;9,1;;Previous output;",core.formspec_escape(message),"]",
7070
})
7171
local player_name = player:get_player_name()
72-
minetest.show_formspec(player_name, "better_command_blocks:"..minetest.pos_to_string(pos), formspec)
72+
core.show_formspec(player_name, "better_command_blocks:"..core.pos_to_string(pos), formspec)
7373
end
7474

7575
local command_block_itemstrings = {}
7676

77-
minetest.register_on_player_receive_fields(function(player, formname, fields)
78-
if not minetest.check_player_privs(player, "better_command_blocks") then return end
77+
core.register_on_player_receive_fields(function(player, formname, fields)
78+
if not core.check_player_privs(player, "better_command_blocks") then return end
7979
-- better_command_blocks:(x,y,z)
80-
local pos = minetest.string_to_pos(formname:match("^better_command_blocks:(%(%-?[%d%.]+,%-?[%d%.]+,%-?[%d%.]+%))$"))
80+
local pos = core.string_to_pos(formname:match("^better_command_blocks:(%(%-?[%d%.]+,%-?[%d%.]+,%-?[%d%.]+%))$"))
8181
if not pos then return end
82-
local meta = minetest.get_meta(pos)
83-
local node = minetest.get_node(pos)
84-
local group = minetest.get_item_group(node.name, "command_block")
82+
local meta = core.get_meta(pos)
83+
local node = core.get_node(pos)
84+
local group = core.get_item_group(node.name, "command_block")
8585
if group < 1 then return end
8686
local show_formspec
8787
if fields.command then
@@ -100,11 +100,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
100100
if new_group == 4 or new_group == 7 then new_group = new_group - 3 end
101101
local new_node = table.copy(node)
102102
new_node.name = command_block_itemstrings[new_group]
103-
minetest.swap_node(pos, new_node)
103+
core.swap_node(pos, new_node)
104104
if new_group == 2 or new_group == 5 then
105-
minetest.get_node_timer(pos):start(1)
105+
core.get_node_timer(pos):start(1)
106106
else
107-
minetest.get_node_timer(pos):stop()
107+
core.get_node_timer(pos):stop()
108108
end
109109
if new_group == 2 or new_group == 5 then -- repeating
110110
if (tonumber(meta:get_string("_delay")) or 1) < 1 then
@@ -121,7 +121,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
121121
if new_group > 6 then new_group = new_group - 6 end
122122
local new_node = table.copy(node)
123123
new_node.name = command_block_itemstrings[new_group]
124-
minetest.swap_node(pos, new_node)
124+
core.swap_node(pos, new_node)
125125
show_formspec = true
126126
elseif fields.power then
127127
local result = fields.power == "Needs Power" and "false" or "true"
@@ -134,21 +134,21 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
134134
show_formspec = true
135135
end
136136
if show_formspec then
137-
on_rightclick(pos, minetest.get_node(pos), player)
137+
on_rightclick(pos, core.get_node(pos), player)
138138
end
139139
end)
140140

141141
---Checks for chain command blocks in front of the current command block
142142
---@param pos vector.Vector
143143
local function check_for_chain(pos)
144-
local dir = minetest.facedir_to_dir(minetest.get_node(pos).param2)
144+
local dir = core.facedir_to_dir(core.get_node(pos).param2)
145145
local next = vector.add(dir, pos)
146-
local next_group = minetest.get_item_group(minetest.get_node(next).name, "command_block")
147-
local next_dir = minetest.facedir_to_dir(minetest.get_node(next).param2)
146+
local next_group = core.get_item_group(core.get_node(next).name, "command_block")
147+
local next_dir = core.facedir_to_dir(core.get_node(next).param2)
148148
if next_group == 0 then return end
149149
if dir ~= next_dir then return end
150150
if next_group == 3 or next_group == 6 then -- chain
151-
local pos_string = minetest.pos_to_string(next)
151+
local pos_string = core.pos_to_string(next)
152152
if not already_run[pos_string] then
153153
better_command_blocks.run(next)
154154
end
@@ -169,14 +169,14 @@ local function run_command(pos, meta, cmd_def, name, param, context)
169169
end]]
170170
meta:set_int("_success", (success == true and 1) or (success or 0))
171171
meta:set_string("_message", message or "")
172-
meta:set_int("_count", count)
172+
meta:set_int("_count", count or -1)
173173
if success == 1 and message and message ~= "" then
174-
if minetest.settings:get_bool("better_command_blocks.command_block_output", true)
175-
and minetest.settings:get_bool("better_commands.send_command_feedback", true) then
176-
minetest.chat_send_all(minetest.colorize("#aaaaaa", S(
174+
if core.settings:get_bool("better_command_blocks.command_block_output", true)
175+
and core.settings:get_bool("better_commands.send_command_feedback", true) then
176+
core.chat_send_all(core.colorize("#aaaaaa", S(
177177
"[@1: @2]",
178178
S("Command Block"),
179-
minetest.strip_colors(message)
179+
core.strip_colors(message)
180180
)))
181181
end
182182
end
@@ -186,18 +186,18 @@ end
186186
---Triggers the command block
187187
---@param pos vector.Vector
188188
function better_command_blocks.run(pos)
189-
local node = minetest.get_node(pos)
190-
local meta = minetest.get_meta(pos)
189+
local node = core.get_node(pos)
190+
local meta = core.get_meta(pos)
191191
if meta:get_string("_power") ~= "false" then
192192
if meta:get_string("_mesecons_active") ~= "true" then
193193
return
194194
end
195195
end
196-
local group = minetest.get_item_group(node.name, "command_block")
196+
local group = core.get_item_group(node.name, "command_block")
197197
if group > 3 then -- conditional
198-
local dir = minetest.facedir_to_dir(node.param2)
198+
local dir = core.facedir_to_dir(node.param2)
199199
local previous = pos - dir
200-
if minetest.get_meta(previous):get_int("_success") < 1 then
200+
if core.get_meta(previous):get_int("_success") < 1 then
201201
if group == 6 then -- chain
202202
check_for_chain(pos)
203203
end
@@ -206,16 +206,16 @@ function better_command_blocks.run(pos)
206206
end
207207

208208
if group == 3 or group == 6 then -- chain
209-
local pos_string = minetest.pos_to_string(pos)
209+
local pos_string = core.pos_to_string(pos)
210210
if already_run[pos_string] then return end
211211
already_run[pos_string] = true
212-
minetest.after(0, function() already_run[pos_string] = nil end)
212+
core.after(0, function() already_run[pos_string] = nil end)
213213
end
214214

215215
local command = meta:get_string("_command")
216216
if command ~= "" then
217-
local command_type, param = command:match("(%S+)%s+(.*)$")
218-
local def = minetest.registered_chatcommands[command_type]
217+
local command_type, param = command:match("%/?(%S+)%s+(.*)$")
218+
local def = core.registered_chatcommands[command_type]
219219
if def then
220220
local name = meta:get_string("_name")
221221
-- Other mods' commands may require <name> to be a valid player name.
@@ -227,16 +227,15 @@ function better_command_blocks.run(pos)
227227
executor = pos,
228228
pos = pos,
229229
command_block = true,
230-
dir = minetest.facedir_to_dir(minetest.get_node(pos).param2),
230+
dir = core.facedir_to_dir(core.get_node(pos).param2),
231231
}
232232
if better_commands then context = better_commands.complete_context(S("Command Block"), context) end
233233
if group == 2 or group == 5 then -- repeating
234234
run_command(pos, meta, def, name, param, context)
235-
minetest.get_node_timer(pos):start(tonumber(meta:get_string("_delay")) or 1)
236235
else
237236
local delay = tonumber(meta:get_string("_delay")) or 0
238237
if delay > 0 then
239-
minetest.after(delay, function()
238+
core.after(delay, function()
240239
run_command(pos, meta, def, name, param, context)
241240
end)
242241
else
@@ -245,15 +244,18 @@ function better_command_blocks.run(pos)
245244
end
246245
end
247246
end
247+
if group == 2 or group == 5 then -- repeating
248+
core.get_node_timer(pos):start(tonumber(meta:get_string("_delay")) or 1)
249+
end
248250
end
249251

250252
---Runs when activated by Mesecons
251253
---@param pos vector.Vector
252254
local function mesecons_activate(pos)
253-
local meta = minetest.get_meta(pos)
255+
local meta = core.get_meta(pos)
254256
meta:set_string("_mesecons_active", "true")
255257
if meta:get_string("_power") ~= "false" then
256-
local group = minetest.get_item_group(minetest.get_node(pos).name, "command_block")
258+
local group = core.get_item_group(core.get_node(pos).name, "command_block")
257259
if group ~= 3 and group ~= 6 then
258260
better_command_blocks.run(pos)
259261
end
@@ -263,18 +265,18 @@ end
263265
---Runs when deactivated by Mesecons
264266
---@param pos vector.Vector
265267
local function mesecons_deactivate(pos)
266-
local meta = minetest.get_meta(pos)
268+
local meta = core.get_meta(pos)
267269
meta:set_string("_mesecons_active", "")
268270
if meta:get_string("_power") ~= "false" then
269-
minetest.get_node_timer(pos):stop()
271+
core.get_node_timer(pos):stop()
270272
end
271273
end
272274

273275
for i, command_block in pairs(command_blocks) do
274276
local name, desc = unpack(command_block)
275277
local def = {
276278
description = desc,
277-
groups = {cracky = 1, command_block = i, creative_breakable=1, mesecon_effector_off=1, mesecon_effector_on=1},
279+
groups = {oddly_breakable_by_hand = 3, cracky = 3, command_block = i, creative_breakable=1, mesecon_effector_off=1, mesecon_effector_on=1},
278280
tiles = {
279281
{name = "better_command_blocks_"..name.."_top.png", animation = anim},
280282
{name = "better_command_blocks_"..name.."_bottom.png", animation = anim},
@@ -296,20 +298,20 @@ for i, command_block in pairs(command_blocks) do
296298
_mcl_blast_resistance = 3600000,
297299
_mcl_hardness = -1,
298300
can_dig = function(pos, player)
299-
return minetest.check_player_privs(player, "better_command_blocks")
301+
return core.check_player_privs(player, "better_command_blocks")
300302
end,
301303
drop = "",
302304
on_place = function(itemstack, player, pointed_thing)
303-
if minetest.check_player_privs(player, "better_command_blocks") then
304-
return minetest.item_place(itemstack, player, pointed_thing)
305+
if core.check_player_privs(player, "better_command_blocks") then
306+
return core.item_place(itemstack, player, pointed_thing)
305307
end
306308
end,
307309
after_place_node = function(pos, placer, itemstack, pointed_thing)
308-
minetest.get_meta(pos):set_string("_player", placer:get_player_name())
310+
core.get_meta(pos):set_string("_player", placer:get_player_name())
309311
end
310312
}
311313
local itemstring = "better_command_blocks:"..name.."_command_block"
312-
minetest.register_node(itemstring, def)
314+
core.register_node(itemstring, def)
313315
command_block_itemstrings[i] = itemstring
314316

315317
local conditional_def = table.copy(def)
@@ -325,15 +327,15 @@ for i, command_block in pairs(command_blocks) do
325327
{name = "better_command_blocks_"..name.."_back.png", animation = anim},
326328
}
327329
itemstring = "better_command_blocks:"..name.."_command_block_conditional"
328-
minetest.register_node(itemstring, conditional_def)
330+
core.register_node(itemstring, conditional_def)
329331
command_block_itemstrings[i+3] = itemstring
330332
end
331333

332-
minetest.register_alias("better_command_blocks:command_block", "better_command_blocks:impulse_command_block")
333-
minetest.register_alias("better_command_blocks:command_block_conditional", "better_command_blocks:impulse_command_block_conditional")
334+
core.register_alias("better_command_blocks:command_block", "better_command_blocks:impulse_command_block")
335+
core.register_alias("better_command_blocks:command_block_conditional", "better_command_blocks:impulse_command_block_conditional")
334336

335337
---@diagnostic disable-next-line: missing-fields
336-
minetest.register_privilege("better_command_blocks", {
338+
core.register_privilege("better_command_blocks", {
337339
description = S("Allows players to use Better Command Blocks"),
338340
give_to_singleplayer = false,
339341
give_to_admin = true

mod.conf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name = better_command_blocks
22
title = Better Command Blocks
33
description = Adds command blocks similar to those of a certain other voxel game
4-
supported_games = minetest_game, mineclone2, mineclonia
4+
supported_games = *
55
optional_depends = mesecons

0 commit comments

Comments
 (0)