Skip to content

Commit 24dee29

Browse files
Removed all references to ACOVG (recreated repo)
0 parents  commit 24dee29

32 files changed

+4529
-0
lines changed

.luacheckrc

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
read_globals = {
2+
"DIR_DELIM", "INIT",
3+
4+
"minetest", "core",
5+
"dump", "dump2",
6+
7+
"Raycast",
8+
"Settings",
9+
"PseudoRandom",
10+
"PerlinNoise",
11+
"VoxelManip",
12+
"SecureRandom",
13+
"VoxelArea",
14+
"PerlinNoiseMap",
15+
"PcgRandom",
16+
"ItemStack",
17+
"AreaStore",
18+
19+
"vector",
20+
21+
"mcl_util",
22+
23+
table = {
24+
fields = {
25+
"copy",
26+
"indexof",
27+
"insert_all",
28+
"key_value_swap",
29+
"shuffle",
30+
}
31+
},
32+
33+
string = {
34+
fields = {
35+
"split",
36+
"trim",
37+
}
38+
},
39+
40+
math = {
41+
fields = {
42+
"hypot",
43+
"sign",
44+
"factorial"
45+
}
46+
},
47+
}
48+
49+
globals = {
50+
"better_commands",
51+
}

.vscode/settings.json

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"Lua.workspace.library": [
3+
"C:\\portable\\apps\\minetest\\builtin",
4+
"C:/Users/Nolan/AppData/Roaming/Code/User/globalStorage/sumneko.lua/addonManager/addons/minetest/module/library"
5+
],
6+
"Lua.diagnostics.disable": [
7+
"undefined-field",
8+
"cast-local-type"
9+
],
10+
"Lua.diagnostics.globals": [
11+
"mcl_formspec",
12+
"mcl_item_id",
13+
"armor",
14+
"bucket",
15+
"mcl_buckets",
16+
"mcl_armor",
17+
"mcl_enchanting",
18+
"default",
19+
"mcl_sounds",
20+
"mcl_util",
21+
"mcl_potions",
22+
"mcl_vars",
23+
"playerphysics",
24+
"mcl_playerinfo",
25+
"mcl_bamboo",
26+
"mcl_core",
27+
"dump",
28+
"better_commands",
29+
"ItemStack",
30+
"core",
31+
"better_command_blocks"
32+
],
33+
}

API/API.lua

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
---@alias contextTable {executor: minetest.ObjectRef, pos: vector.Vector, rot: vector.Vector, anchor: string, origin: string, [any]: any}
2+
---@alias splitParam {[1]: integer, [2]: integer, [3]: string, type: string, any: string}
3+
---@alias betterCommandFunc fun(name: string, param: string, context: contextTable): success: boolean, message: string?, count: number
4+
---@alias betterCommandDef {description: string, param?: string, privs: table<string, boolean>, func: betterCommandFunc}
5+
6+
--local bc = better_commands
7+
local storage = minetest.get_mod_storage()
8+
9+
10+
local modpath = minetest.get_modpath("better_commands")
11+
function better_commands.run_file(file, subfolder)
12+
dofile(string.format("%s%s%s.lua", modpath, subfolder and "/"..subfolder.."/" or "", file))
13+
end
14+
15+
local api_files = {
16+
"damage",
17+
"entity",
18+
"parsing",
19+
"register",
20+
"scoreboard",
21+
"teams",
22+
}
23+
24+
for _, file in ipairs(api_files) do
25+
better_commands.run_file(file, "API")
26+
end
27+
28+
local scoreboard_string = storage:get_string("scoreboard")
29+
if scoreboard_string and scoreboard_string ~= "" then
30+
better_commands.scoreboard = minetest.deserialize(scoreboard_string)
31+
else
32+
better_commands.scoreboard = {objectives = {}, displays = {colors = {}}}
33+
end
34+
35+
local team_string = storage:get_string("teams")
36+
if team_string and team_string ~= "" then
37+
better_commands.teams = minetest.deserialize(team_string)
38+
else
39+
better_commands.teams = {teams = {}, players = {}}
40+
end
41+
42+
local timer = 0
43+
minetest.register_globalstep(function(dtime)
44+
timer = timer + dtime
45+
if timer > better_commands.save_interval then
46+
timer = 0
47+
storage:set_string("scoreboard", minetest.serialize(better_commands.scoreboard))
48+
storage:set_string("teams", minetest.serialize(better_commands.teams))
49+
better_commands.update_hud()
50+
end
51+
end)
52+
53+
minetest.register_on_shutdown(function()
54+
storage:set_string("scoreboard", minetest.serialize(better_commands.scoreboard))
55+
storage:set_string("teams", minetest.serialize(better_commands.teams))
56+
storage:set_string("successful_shutdown", "true")
57+
end)
58+
59+
minetest.register_on_joinplayer(function(player)
60+
better_commands.sidebars[player:get_player_name()] = {}
61+
end)

API/damage.lua

+123
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
--local bc = better_commands
2+
3+
---Deals damage; copied from Mineclonia's mcl_util.deal_damage
4+
---@param target minetest.ObjectRef
5+
---@param damage integer
6+
---@param reason table?
7+
---@param damage_immortal? boolean
8+
function better_commands.deal_damage(target, damage, reason, damage_immortal)
9+
local luaentity = target:get_luaentity()
10+
11+
if luaentity then
12+
if luaentity.deal_damage then -- Mobs Redo/Mobs MC
13+
luaentity:deal_damage(damage, reason or {type = "generic"})
14+
minetest.log("deal_damage")
15+
return
16+
elseif luaentity.hurt then -- Animalia
17+
luaentity:hurt(damage)
18+
minetest.log("hurt")
19+
luaentity:indicate_damage()
20+
return
21+
elseif luaentity.health then -- Mobs Redo/Mobs MC/NSSM
22+
-- local puncher = mcl_reason and mcl_reason.direct or target
23+
-- target:punch(puncher, 1.0, {full_punch_interval = 1.0, damage_groups = {fleshy = damage}}, vector.direction(puncher:get_pos(), target:get_pos()), damage)
24+
if luaentity.health > 0 then
25+
minetest.log("luaentity.health")
26+
luaentity.health = luaentity.health - damage
27+
end
28+
return
29+
end
30+
end
31+
32+
local hp = target:get_hp()
33+
local armorgroups = target:get_armor_groups()
34+
35+
if hp > 0 and armorgroups and (damage_immortal or not armorgroups.immortal) then
36+
minetest.log("set_hp")
37+
target:set_hp(hp - damage, reason)
38+
end
39+
end
40+
41+
minetest.register_on_dieplayer(function(player, reason)
42+
local player_name = player:get_player_name()
43+
for _, def in pairs(better_commands.scoreboard.objectives) do
44+
if def.criterion == "deathCount" then
45+
if def.scores[player_name] then
46+
def.scores[player_name].score = def.scores[player_name].score + 1
47+
end
48+
end
49+
end
50+
local killer
51+
if reason._mcl_reason then
52+
killer = reason._mcl_reason.source
53+
else
54+
killer = reason.object
55+
end
56+
if killer and killer:is_player() then
57+
local player_name = player:get_player_name()
58+
local killer_name = killer:get_player_name()
59+
local player_team = better_commands.teams.players[player_name]
60+
local killer_team = better_commands.teams.players[killer_name]
61+
for _, def in pairs(better_commands.scoreboard.objectives) do
62+
if def.criterion == "playerKillCount" or (player_team and def.criterion == "teamkill."..player_team) then
63+
if def.scores[killer_name] then
64+
def.scores[killer_name].score = def.scores[killer_name].score + 1
65+
end
66+
elseif killer_team and def.criterion == "killedByTeam."..killer_team then
67+
if def.scores[player_name] then
68+
def.scores[player_name].score = def.scores[player_name].score + 1
69+
end
70+
elseif def.criterion == "killed_by.player" then
71+
if def.scores[player_name] then
72+
def.scores[player_name].score = def.scores[player_name].score + 1
73+
end
74+
end
75+
end
76+
elseif killer then
77+
local killer_type = killer:get_luaentity().name
78+
for _, def in pairs(better_commands.scoreboard.objectives) do
79+
local killed_by = def.criterion:match("^killed_by%.(.*)$")
80+
if killed_by and (killer_type == killed_by or
81+
(better_commands.entity_aliases[killer_type] and better_commands.entity_aliases[killer_type][killed_by])) then
82+
if def.scores[player_name] then
83+
def.scores[player_name].score = def.scores[player_name].score + 1
84+
end
85+
end
86+
end
87+
end
88+
end)
89+
90+
-- Make sure players always die when /killed, also track hp
91+
minetest.register_on_player_hpchange(function(player, hp_change, reason)
92+
if reason.better_commands == "kill" then
93+
return -player:get_properties().hp_max, true
94+
end
95+
local player_name = player:get_player_name()
96+
for _, def in pairs(better_commands.scoreboard.objectives) do
97+
if def.criterion == "health" then
98+
if def.scores[player_name] then
99+
minetest.after(0, function() def.scores[player_name].score = player:get_hp() end)
100+
end
101+
end
102+
end
103+
if hp_change < 0 then
104+
local attacker
105+
if reason._mcl_reason then
106+
attacker = reason._mcl_reason.source
107+
else
108+
attacker = reason.object
109+
end
110+
if attacker and attacker:is_player() then
111+
local player_name = player:get_player_name()
112+
local attacker_name = attacker:get_player_name()
113+
local player_team = better_commands.teams.players[player_name]
114+
local attacker_team = better_commands.teams.players[attacker_name]
115+
if player_team == attacker_team then
116+
if better_commands.teams.teams[player_team].pvp == false then
117+
return 0, true
118+
end
119+
end
120+
end
121+
end
122+
return hp_change
123+
end, true)

0 commit comments

Comments
 (0)