skywars/commands.lua

468 lines
16 KiB
Lua
Raw Normal View History

2020-09-07 16:37:12 -07:00
local mod = "skywars"
2020-07-18 14:18:57 -07:00
2020-09-07 16:37:12 -07:00
ChatCmdBuilder.new("skywars",
function(cmd)
2020-07-18 14:18:57 -07:00
2020-09-07 16:37:12 -07:00
cmd:sub("tutorial",
function(sender)
minetest.chat_send_player(sender, [[
These are the steps to follow in order to create and configure an
arena:
2020-07-18 14:18:57 -07:00
2020-09-07 16:37:12 -07:00
1) Creating the arena using:
/skywars create <arena name> [min players] [max players]
where min players is equal to the minimun amount of players to make
the arena start, and max players to the maximum amount of players that
an arena can have.
2) Editing the arena using:
/skywars edit <arena name>
in this menu you can add spawn points and set up the sign to enter the
arena: the spawn points are where the players will spawn when they
enter the arena, while the sign is just the way to enter it (by
clicking it).
3) Setting the arena treasures (the items that can spawn in the
chests):
item: the item name
rarity: how often it will spawn in chests (the rarity gap between two
treasures should be at least of 2)
preciousness: in which chests it can be put, for example a chest with
a preciousness range 2-4 can spawn just items with a preciousness
between 2 and 4
count: the item amount
/skywars addtreasure <arena name> <item> <rarity (min 2.0, max
1000.0)> <preciousness> <count>
4) Setting the chests in the arena using:
/skywars addchest <arena name> <min_preciousness> <max_preciousness>
<min_treasures_amount (min. 1)> <max_treasures_amount>
to add a chest use this command on the block you want it to spawn, it
will automatically be filled with the right items when the match
starts
5) Saving the map schematic using:
/skywars pos1
/skywars pos2
/skywars createschematic <arena name> <schematic_name>
in order to automatically reset the map on every match, you have to
create a schematic file; to do so, simply specify the corners of the
map by facing NORTH (you can press F5 to know where you're facing),
and by being sure pos1 Z is SMALLER than pos2 Z (/skywars pos1 and
/skywars pos2 to set the two corners).
!If you overwrite a schematic that you've already created before make
sure to reload the server, so that it can be loaded correctly, and
remember that the old schematic won't be deleted!
6) Enabling the arena using
/skywars enable <arena name>
Once you've done this you can click the sign and start playing :)
]])
end)
-- create arena
cmd:sub("create :arena", function(name, arena_name)
arena_lib.create_arena(name, "skywars", arena_name)
end)
cmd:sub("create :arena :minplayers:int :maxplayers:int", function(name, arena_name, min_players, max_players)
arena_lib.create_arena(name, "skywars", arena_name, min_players, max_players)
end)
-- remove arena
cmd:sub("remove :arena", function(name, arena_name)
arena_lib.remove_arena(name, "skywars", arena_name)
end)
-- list of the arenas
cmd:sub("list", function(name)
arena_lib.print_arenas(name, "skywars")
end)
-- info on a specific arena
cmd:sub("info :arena", function(name, arena_name)
arena_lib.print_arena_info(name, "skywars", arena_name)
end)
2020-07-18 14:18:57 -07:00
2020-09-07 16:37:12 -07:00
-- this sets the spawns using the player position
cmd:sub("setspawn :arena", function(name, arena)
arena_lib.set_spawner(name, "skywars", arena)
end)
2020-07-18 14:18:57 -07:00
2020-09-07 16:37:12 -07:00
cmd:sub("setspawn :arena", function(name, arena)
arena_lib.set_spawner(name, "skywars", arena)
2020-07-18 14:18:57 -07:00
end)
2020-09-07 16:37:12 -07:00
-- this sets the arena's sign
2020-07-18 14:18:57 -07:00
cmd:sub("setsign :arena", function(sender, arena)
2020-09-07 16:37:12 -07:00
arena_lib.set_sign(sender, nil, nil, "skywars", arena)
end)
-- enter editor mode
cmd:sub("edit :arena", function(sender, arena)
arena_lib.enter_editor(sender, "skywars", arena)
end)
-- enable and disable arenas
cmd:sub("enable :arena", function(name, arena)
arena_lib.enable_arena(name, "skywars", arena)
end)
cmd:sub("disable :arena", function(name, arena)
arena_lib.disable_arena(name, "skywars", arena)
end)
--------------------
-- ! CHEST CMDS ! --
--------------------
cmd:sub("addtreasure :arena :treasure :rarity:number :preciousness:int :count:int",
function(sender, arena_name, treasure_name, rarity, preciousness, count)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
elseif arena.enabled == true then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 must be disabled!", arena_name))
return
elseif count <= 0 then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Count has to be greater than 0!"))
return
elseif rarity < 2 then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Rarity has to be greater than 2!"))
return
elseif ItemStack(treasure_name):is_known() == false then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 doesn't exist!", treasure_name))
return
end
table.insert(arena.treasures, {name = treasure_name, rarity = rarity, count = count, preciousness = preciousness})
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Treasure added!"))
2020-07-18 14:18:57 -07:00
end)
2020-09-07 16:37:12 -07:00
cmd:sub("removetreasure :arena :treasure", function(sender, arena_name, treasure_name)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local found = false
2020-07-18 14:18:57 -07:00
2020-09-07 16:37:12 -07:00
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
elseif arena.enabled == true then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 must be disabled!", arena_name))
return
end
for i=1, #arena.treasures do
if arena.treasures[i].name == treasure_name then
table.remove(arena.treasures, i)
found = true
break
end
end
arena_lib.change_arena_property(sender, "skywars", arena_name, "treasures", arena.treasures, false)
if found then minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Treasure removed!"))
else minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Treasure not found!")) end
2020-07-18 14:18:57 -07:00
end)
2020-09-07 16:37:12 -07:00
cmd:sub("copytreasures :fromarena :toarena", function(sender, from, to)
local id, from_arena = arena_lib.get_arena_by_name("skywars", from)
local id2, to_arena = arena_lib.get_arena_by_name("skywars", to)
local found = false
if from_arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("First arena not found!"))
return
elseif to_arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Second arena not found!"))
return
elseif from_arena == to_arena then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("The arenas must be different!"))
return
elseif to_arena.enabled == true then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 must be disabled!", to))
return
end
to_arena.treasures = {}
for i=1, #from_arena.treasures do
to_arena.treasures[i] = from_arena.treasures[i]
end
arena_lib.change_arena_property(sender, "skywars", to, "treasures", to_arena.treasures, false)
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 treasures have been copied to @2!", from, to))
2020-07-18 14:18:57 -07:00
end)
2020-09-07 16:37:12 -07:00
cmd:sub("gettreasures :arena", function(sender, arena_name)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local found = false
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
end
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("TREASURES LIST:"))
for i=1, #arena.treasures do
local treasure = arena.treasures[i]
minetest.chat_send_player(sender, tostring(i) .. ".\n" ..
skywars.T(
"name: @1 @nrarity: @2 @npreciousness: @3 @ncount: @4",
treasure.name, treasure.rarity, treasure.preciousness, treasure.count
)
)
end
end)
cmd:sub("addchest :arena :minpreciousness:int :maxpreciousness:int :tmin:int :tmax:int",
function(sender, arena_name, min_preciousness, max_preciousness, t_min, t_max)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local pos = vector.floor(minetest.get_player_by_name(sender):get_pos())
local chest =
{
pos = {x = pos.x, y= pos.y + 1, z = pos.z},
min_preciousness = min_preciousness,
max_preciousness = max_preciousness,
min_treasures = t_min,
max_treasures = t_max,
id = #arena.chests+1
}
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
elseif arena.enabled == true then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 must be disabled!", arena_name))
return
elseif t_min <= 0 or t_max <= 0 then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("The minimum or maximum amount of treasures has to be greater than 0!"))
return
end
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Chest added!"))
table.insert(arena.chests, chest)
arena_lib.change_arena_property(sender, "skywars", arena_name, "chests", arena.chests, false)
end)
cmd:sub("getchests :arena", function(sender, arena_name)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local found = false
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
end
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("CHEST LIST:"))
for i=1, #arena.chests do
local chest_pos = tostring(arena.chests[i].pos.x) .. " " .. tostring(arena.chests[i].pos.y) .. " " .. tostring(arena.chests[i].pos.z)
minetest.chat_send_player(sender, skywars.T("ID: @1 - POSITION: @2", arena.chests[i].id, chest_pos))
end
end)
cmd:sub("removechest :arena :id:int", function(sender, arena_name, chest_id)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local found = false
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
elseif arena.enabled == true then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 must be disabled!", arena_name))
return
end
for i=1, #arena.chests do
if arena.chests[i].id == chest_id then
table.remove(arena.chests, i)
found = true
break
end
end
arena_lib.change_arena_property(sender, "skywars", arena_name, "chests", arena.chests, false)
if found then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Chest removed!"))
else
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Chest not found!"))
end
end)
------------------
-- ! MAP CMDS ! --
------------------
cmd:sub("pos1", function(sender)
local player = minetest.get_player_by_name(sender)
player:get_meta():set_string("pos1", minetest.serialize(player:get_pos()))
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Position saved!"))
end)
cmd:sub("pos2", function(sender)
local player = minetest.get_player_by_name(sender)
player:get_meta():set_string("pos2", minetest.serialize(player:get_pos()))
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Position saved!"))
end)
cmd:sub("createschematic :arena :name",
function(sender, arena_name, name)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local player = minetest.get_player_by_name(sender)
local pos1 = minetest.deserialize(player:get_meta():get_string("pos1"))
local pos2 = minetest.deserialize(player:get_meta():get_string("pos2"))
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
end
if arena.enabled == true then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 must be disabled!", arena_name))
return
end
if pos1 == "" or pos2 == "" then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Pos1 or pos2 are not set!"))
return
end
skywars.create_schematic(sender, {x = pos1.x, y = pos1.y, z = pos1.z}, {x = pos2.x, y = pos2.y, z = pos2.z}, name, arena)
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Schematic @1 created! You can use /skywars info @2 to know its folder (see schematic=PATH)", name, arena_name))
end)
cmd:sub("getpos", function(sender)
function round(num, numDecimalPlaces)
return string.format("%." .. (numDecimalPlaces or 0) .. "f", num)
end
local pos = minetest.get_player_by_name(sender):get_pos()
local readable_pos = "[X Y Z] " .. round(pos.x, 1) .. " " .. round(pos.y, 1) .. " " .. round(pos.z, 1)
minetest.chat_send_player(sender, readable_pos)
end)
end, {
description = [[
Arena_lib:
- tutorial
- create <arena name> [min players] [max players]
- edit <arena name>
- remove <arena name>
- info <arena name>
- list
- enable <arena name>
- disable <arena name>
Skywars commands:
- addtreasure <arena name> <item> <rarity (min 2.0, max 1000.0)>
<preciousness> <count>
- removetreasure <arena name> <treasure name>
- gettreasures <arena name>
- copytreasures <(from) arena name> <(to) arena name>: this will copy
the first arena treasures in to the second one (! the second one will
be overwritten !)
- addchest <arena name> <min_preciousness> <max_preciousness>
<min_treasures_amount (min. 1)> <max_treasures_amount>
- removechest <id>
- getchests <arena name>: shows id and position of each chest
- pos1
- pos2
- createschematic <arena name> <pos1x> <pos1y> <pos1z> <pos2x> <pos2y>
<pos2z> <schematic_name>
- getpos
]],
privs = { skywars_admin = true }
})
minetest.register_privilege("skywars_admin", {
description = "With this you can use /skywars"
})