Don't enable arenas having a region set with spawners outside the region (closes #219)
This commit is contained in:
parent
601af6d1c4
commit
5a6dfdb95d
6
DOCS.md
6
DOCS.md
@ -453,7 +453,7 @@ Arenas and their settings are stored inside the mod storage. What is *not* store
|
||||
Better said, these kind of parameters are emptied every time the server starts. And not when it ends, because handling situations like crashes is simply not possible.
|
||||
|
||||
### 2.2 Setting up an arena
|
||||
In order for an arena to be playable, four conditions must be satisfied: the arena has to exist, at least one spawner has to be set (it's per team if teams are enabled), an arena entrance must be put (to allow players to enter the minigame), and any potential custom check in the `arena_lib.on_enable` callback must go through.
|
||||
In order for an arena to be playable, four conditions must be satisfied: the arena has to exist, at least one spawner has to be set (it's per team if teams are enabled), an arena entrance must be put (to allow players to enter the minigame), and any potential custom check in the `arena_lib.on_enable` callback must go through. Additionally, arenas having a [region](#25-arena-region) set must also have all the declared spawners inside the region.
|
||||
|
||||
If you love yourself, there is a built-in editor that allows you to easily make these things and many many more. Or, if you don't love yourself, you can connect every setup function to your custom CLI. Either way, run `/arenas create <minigame> <arena>` to create your first arena.
|
||||
|
||||
@ -534,7 +534,9 @@ By default, spectate mode allows to follow players, but it also allows modders t
|
||||
<br>
|
||||
|
||||
### 2.5 Arena region
|
||||
An arena region is an optional cuboid wrapping the arena (there can be only one per arena), that can be used for several purposes. An example is to save and then restore the arena map once the match is over, or eliminate any player that goes outside of it. As for now, a region serves no purpose by default, so it's up to the single minigame to implement the logic behind it. However, with arena_lib 7.0, the map reset is going to be a built-in feature.
|
||||
An arena region is an optional cuboid wrapping the arena (there can be only one per arena), that can be used for several purposes. An example is to save and then restore the arena map once the match is over, or eliminate any player that goes outside it. As for now, a region serves no purpose by default, so it's up to the single minigame to implement the logic behind it. However, with arena_lib 7.0, the map reset is going to be a built-in feature.
|
||||
When a region is declared, be sure that every existing spawn point is placed inside the region, or it won't be possible to enable the arena.
|
||||
|
||||
An util function that comes with it is `arena_lib.is_player_in_region(..)`
|
||||
|
||||
## 3. About the author(s)
|
||||
|
@ -109,6 +109,7 @@ Background music of arena @1 successfully overwritten=Musica di sottofondo dell'
|
||||
Arena @1's timer is now @2 seconds=Il timer dell'arena @1 è ora @2 secondi
|
||||
[!] Insufficient spawners, the arena can't be enabled!=[!] Punti di rinascita insufficienti, l'arena non può essere abilitata!
|
||||
[!] Entrance not set, the arena can't be enabled!=[!] Entrata non dichiarata, l'arena non può essere abilitata!
|
||||
[!] If the arena region is declared, all the existing spawn points must be placed inside it!=[!] Se si dichiara la regione dell'arena, tutti i punti di rinascita presenti devono essere posizionati al suo interno!
|
||||
Arena @1 successfully enabled=Arena @1 abilitata con successo
|
||||
[!] The arena is already disabled=[!] L'arena è già disabilitata
|
||||
[!] You can't disable an arena during an ongoing game!=[!] Non puoi disabilitare un'arena mentre una partita è in corso!
|
||||
|
@ -109,6 +109,7 @@ Background music of arena @1 successfully overwritten=
|
||||
Arena @1's timer is now @2 seconds=
|
||||
[!] Insufficient spawners, the arena can't be enabled!=
|
||||
[!] Entrance not set, the arena can't be enabled!=
|
||||
[!] If the arena region is declared, all the existing spawn points must be placed inside it!=
|
||||
Arena @1 successfully enabled=
|
||||
[!] The arena is already disabled!=
|
||||
[!] You can't disable an arena during an ongoing game!=
|
||||
|
@ -955,7 +955,6 @@ function arena_lib.set_entrance(sender, mod, arena_name, action, ...)
|
||||
local entrance = arena_lib.entrances[arena.entrance_type]
|
||||
|
||||
if action == "add" then
|
||||
|
||||
if arena.entrance then
|
||||
minetest.chat_send_player(sender, minetest.colorize("#e6482e", S("[!] There is already an entrance for this arena!")))
|
||||
return end
|
||||
@ -968,7 +967,6 @@ function arena_lib.set_entrance(sender, mod, arena_name, action, ...)
|
||||
minetest.chat_send_player(sender, arena_lib.mods[mod].prefix .. S("Entrance of arena @1 successfully set", arena_name))
|
||||
|
||||
elseif action == "remove" then
|
||||
|
||||
if not arena.entrance then
|
||||
minetest.chat_send_player(sender, minetest.colorize("#e6482e", S("[!] There is no entrance to remove assigned to @1!", arena_name)))
|
||||
return end
|
||||
@ -1026,6 +1024,7 @@ function arena_lib.set_region(sender, mod, arena_name, pos1, pos2, in_editor)
|
||||
arena.pos2 = nil
|
||||
|
||||
else
|
||||
-- controllo che i parametri siano corretti
|
||||
if not pos1 or not pos2 or not vector.check(pos1) or not vector.check(pos2) then
|
||||
minetest.chat_send_player(sender, minetest.colorize("#e6482e", S("[!] Parameters don't seem right!")))
|
||||
return end
|
||||
@ -1189,6 +1188,28 @@ function arena_lib.enable_arena(sender, mod, arena_name, in_editor)
|
||||
arena.enabled = false
|
||||
return end
|
||||
|
||||
-- se c'è una regione ma qualche punto rinascita sta al di fuori
|
||||
if arena.pos1 then
|
||||
local v1, v2 = vector.sort(arena.pos1, arena.pos2)
|
||||
local region = VoxelArea:new({MinEdge=v1, MaxEdge=v2})
|
||||
|
||||
if not arena.teams_enabled then
|
||||
for _, spawner in pairs(arena.spawn_points) do
|
||||
if not region:containsp(spawner) then
|
||||
minetest.chat_send_player(sender, minetest.colorize("#e6482e", S("[!] If the arena region is declared, all the existing spawn points must be placed inside it!")))
|
||||
return end
|
||||
end
|
||||
else
|
||||
for _, team_table in pairs(arena.spawn_points) do
|
||||
for _, spawner in pairs(team_table) do
|
||||
if not region:containsp(spawner) then
|
||||
minetest.chat_send_player(sender, minetest.colorize("#e6482e", S("[!] If the arena region is declared, all the existing spawn points must be placed inside it!")))
|
||||
return end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local mod_ref = arena_lib.mods[mod]
|
||||
|
||||
-- eventuali controlli personalizzati
|
||||
|
@ -1,2 +1,2 @@
|
||||
-- se devo aspettare Minetest
|
||||
arena_lib.temp = {}
|
||||
arena_lib.temp = {}
|
||||
|
Loading…
x
Reference in New Issue
Block a user