Add box unit selection

Closes #55
master
rubenwardy 2021-02-18 21:45:48 +00:00
parent 3c437b3b9d
commit 0364575ba2
10 changed files with 102 additions and 7 deletions

2
API.md
View File

@ -12,6 +12,8 @@
* `conquer.get_sessions() --> table of Session`
* `conquer.get_selected_units(player) -> table of ObjectRefs`
* `conquer.select_unit(player, object_ref) --> boolean`
* `conquer.select_units(player, list_of_object_refs) --> int`
* Returns number of units selected.
* `conquer.deselect_unit(player, object_ref) --> boolean`
* `conquer.deselect_all_units(player) --> boolean`
* `conquer.get_unit_type(name) --> Unit type def`

View File

@ -2,7 +2,8 @@ conquer = {}
conquer.S = minetest.get_translator("conquer")
assert(minetest.features.pathfinder_works, "This mod requires Minetest 5.2 or later")
assert(minetest.features.pathfinder_works, "This mod requires Minetest 5.4 or later")
assert(minetest.get_objects_in_area, "This mod requires Minetest 5.4 or later")
dofile(minetest.get_modpath("conquer") .. "/src/init.lua")

View File

@ -1,4 +1,4 @@
name = conquer
description = Command your troops to victory in this mini-game
optional_depends = sfinv, default, wool, farming
min_minetest_version = 5.2
min_minetest_version = 5.4

View File

@ -224,6 +224,32 @@ function conquer.select_unit(player, obj)
return true
end
function conquer.select_units(player, objs)
assert(player.get_player_name, "select_unit expects a player")
assert(type(objs) == "table")
local session, country = conquer.get_session_country(player)
if not session then
return 0
end
local context = _selected_units(player)
context.selected_units = context.selected_units or {}
local count = 0
for i=1, #objs do
local entity = objs[i]:get_luaentity()
if entity and entity.select and entity:select(session, country) then
table.insert(context.selected_units, objs[i])
count = count + 1
end
end
conquer.run_on_selected_units_changed(player, session, country, get_selected_units_raw(player))
return count
end
function conquer.deselect_unit(player, unit)
assert(player.get_player_name, "deselect_unit expects a player")
assert(unit.get_luaentity, "deselect_unit expects a unit")

64
src/box_select.lua Normal file
View File

@ -0,0 +1,64 @@
local selections = {}
minetest.register_on_leaveplayer(function(player)
selections[player:get_player_name()] = nil
end)
local function cancel(_, player, _)
local pname = player:get_player_name()
if selections[pname] then
selections[pname] = nil
minetest.chat_send_all(minetest.colorize("#808080",
conquer.S("Cancelled selection.")))
end
end
minetest.register_craftitem("conquer:box_select", {
description = "Box Select",
inventory_image = "conquer_box_select.png",
range = 25,
groups = { not_in_creative_inventory = 1 },
on_place = cancel,
on_secondary_use = cancel,
on_use = function(_, player, pointed_thing)
if not player then
return
end
if pointed_thing.type == "object" then
pointed_thing.ref:punch(player, 1.0, { full_punch_interval=1.0 }, nil)
return player:get_wielded_item()
end
if pointed_thing.type ~= "node" then
return player:get_wielded_item()
end
local pname = player:get_player_name()
local selected = selections[pname]
if selected then
conquer.deselect_all_units(player)
local min, max = vector.sort(pointed_thing.under, selected)
min.y = min.y - 10
max.y = max.y + 10
local objs = minetest.get_objects_in_area(min, max)
local count = conquer.select_units(player, objs)
minetest.chat_send_all(minetest.colorize("#808080",
conquer.S("Selected @1 units.", count)))
selections[pname] = nil
else
selections[pname] = vector.new(pointed_thing.under)
minetest.chat_send_all(minetest.colorize("#808080",
conquer.S("Now select another position, or right-click to cancel.")))
end
return player:get_wielded_item()
end,
})

View File

@ -132,9 +132,9 @@ local modes = {
context.hotbar = player:hud_add({
hud_elem_type = "inventory",
position = conquer.hud_position,
offset = {x = -83, y = -70},
offset = {x = -112, y = -70},
text = "main",
number = 3,
number = 4,
item = player:get_wield_index(),
direction = 0
})
@ -143,11 +143,12 @@ local modes = {
set_inv = function(_, player, inv, _)
inv:set_list("main", {
ItemStack("conquer:box_select"),
ItemStack("conquer:keep"),
ItemStack("conquer:barracks"),
ItemStack("conquer:farm"),
})
player:hud_set_hotbar_itemcount(3)
player:hud_set_hotbar_itemcount(4)
end,
},
}
@ -235,7 +236,7 @@ conquer.register_on_join_session(function(player)
local inv = player:get_inventory()
inv:set_size("mainbackup", inv:get_size("main"))
inv:set_list("mainbackup", inv:get_list("main"))
inv:set_size("main", 3)
inv:set_size("main", 4)
inv:set_list("main", {})
end)

View File

@ -12,6 +12,7 @@ dofile(dir .. "/hudinv.lua")
dofile(dir .. "/gui.lua")
dofile(dir .. "/helpgui.lua")
dofile(dir .. "/chatcmd.lua")
dofile(dir .. "/box_select.lua")
dofile(dir .. "/content/init.lua")
local function chat_send_country(_, country, message, color)

View File

@ -60,7 +60,7 @@ function conquer.register_wand(name, def)
conquer.deselect_all_units(player)
else
local node_def = minetest.registered_nodes[node.name]
if node_def.on_punch then
if node_def and node_def.on_punch then
node_def.on_punch(pointed_thing.under, node, player)
end
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB