From 055be8c9e5216eae1b2ad3ed46759ec195a86985 Mon Sep 17 00:00:00 2001 From: Axaxax88 <74550391+Axaxax88@users.noreply.github.com> Date: Wed, 26 May 2021 16:18:45 +0200 Subject: [PATCH 1/3] Make clay do not drop clay lump (#885) * Make clay do not drop clay lump * Update nodes.lua --- mods/mtg/default/nodes.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/mtg/default/nodes.lua b/mods/mtg/default/nodes.lua index e2aa4ad..3dc290c 100644 --- a/mods/mtg/default/nodes.lua +++ b/mods/mtg/default/nodes.lua @@ -578,7 +578,6 @@ minetest.register_node("default:clay", { description = "Clay", tiles = {"default_clay.png"}, groups = {crumbly = 3}, - drop = 'default:clay_lump 4', sounds = default.node_sound_dirt_defaults(), }) From e2f2ba9fae289d216a7a28249176a12d0caf0cff Mon Sep 17 00:00:00 2001 From: -sniper- <47271658+JostP@users.noreply.github.com> Date: Wed, 26 May 2021 16:19:14 +0200 Subject: [PATCH 2/3] Map maker changes by gameit (#887) * add modified README file * add gui.png * revert some changes --- mods/ctf/ctf_map/map_maker/README.md | 128 +++++++++++++-------------- mods/ctf/ctf_map/map_maker/gui.png | Bin 0 -> 43327 bytes 2 files changed, 62 insertions(+), 66 deletions(-) create mode 100644 mods/ctf/ctf_map/map_maker/gui.png diff --git a/mods/ctf/ctf_map/map_maker/README.md b/mods/ctf/ctf_map/map_maker/README.md index 12b0b64..c26c604 100644 --- a/mods/ctf/ctf_map/map_maker/README.md +++ b/mods/ctf/ctf_map/map_maker/README.md @@ -1,88 +1,84 @@ -# CTF Map - Map maker +# CTF map-maker mod -## Creating a new map +## Making a new map -### Youtube tutorial +### Youtube Tutorial https://youtu.be/orBsC9wViUw +### Dependencies +- Minetest 5.0.0 or later (https://minetest.net/) +- Minetest Game (https://github.com/minetest/minetest_game/) (CTF supports most MTG nodes) +- `ctf_map` modpack (copy this folder to `minetest/mods`) +- `worldedit` modpack (WE) (https://content.minetest.net/packages/sfan5/worldedit/) -### 1. Dependencies +### Find an area -* Minetest 5.0.0 or later. -* `ctf_map` modpack (by copying the folder from this game to `minetest/mods`) -* `worldedit` and `worldedit_commands`. +- The area can be maximum 230x230 blocks in surface area, but it can be lesser. +- Modify the area to *your* unique ctf_map + - you could add + - buildings + - lakes + - hills + - etc. +- If you haven't modified the map at all, do the following to speed up barrier placement: -### 2. Find an area + - Stop Minetest. + - Open up the world's world.mt + - Set backend to "dummy". + - Save. -* Can use Minetest Game and any mapgen. -* It must be a cube, and the barrier will be in the exact center. -* It should be around 230x230 in surface area, but this can be lesser. -* Feel free to modify the area to your needs. +### The `gui`window -### 3. Select the area + ![gui-window](./gui.png) -There are multiple ways do this, this is the simplest in most cases. +There are many ways of placing the barrier: -* If you haven't modified the map at all, do the following to speed up barrier placement: - * Stop Minetest. - * Open up the world's world.mt - * Set backend to "dummy". - * Save. -* Using worldedit, select the area. -* Type `/gui`, and click `Player pos` then `From WE` and then `To WE`. -* Check that the center location is the right place for the barrier to go. -* Check that the bounds extend far enough. +- Go to the center of the map and click on `Player Pos` and then on `To WE` + - set a radius and a height for the map +- **Or** select the area of the map via WE + - Go to one corner of the map and type `//pos 1` in the chat + - Then go to the opposite corner of the cube and type `//pos 2` in the chat + - Click on `From WE` to import the positions + - **If `h` is negative change it to the positive number** (`-130 -> 130`) +- **Both radii must be the same!** +- The rotation of the map has to be `z=0` (currently x=0 creates bugs and errors) +- Click on `Place Barriers` (Note that this has no undo) +- After the barriers are placed, click on `Givme Flags` to get 2 flags and place them at the bases. -### 4. Place barriers +### Meta Data -* The barrier is a plane defined by co-ordinate (=0). -* If you choose `X=0` the barrier will be placed having the X co-ordinate as 0. But from a few months, the `X=0` co-ordinate creates bugs and errors. It's better if you choose `Z=0` for creating your map. -* If you choose `Z=0` The barrier will be placed having the Z co-ordinate as 0. -* Click "place barrier". Note that this command does not have an undo. -* After placing barriers you should place 2 flags where you want bases to be. You get flags in `/gui` --> `Giveme flags` +The `gui`window only shows the most important things. You have to add the missing in the `map.conf` later. -### 5. Meta data +### Exporting -* Set the meta data +- Click on `Export` to export the map-files. This may takes some time -### 6. Export +## Map Meta -* Click export, and wait until completion. -* Copy the resultant folder from `worlddir/schems/` into `games/capturetheflag/mods/ctf/ctf_map/ctf_map_core/maps/`. -* Profit! +The metadata of each map are stored in the `map.conf` file and includes all important information about them: +- `name`: Name of the map. +- `author`: Author of the map. +- `hint` [Optional]: A helpful tip for players to understand unique maps. +- `roation`: The rotation of the map. [x|y] +- `r`: Radius of the map. +- `h`: Heigt of the map (**If it's an odd numer, make h=h+1 `107->108`**). +- `team.i`: Name of the team. +- `team.i.color`: Color of the team. +- `team.i.pos`: Position of team `i`'s flag, relative ot the center of schem. **The y-positions of the flags must be an integer!** `30,-32.5,60 -> 30,-33,60` +- `chest.i.from` and `chests.i.to` [Optional]: Positions of diagonal corners of custom chest zone `i`, relative to the center of the schem. +- `chests.i.n` [Optional]: Number if chests in zone `i` +- `license`: Name of license of the map. +- `other` [Optional]: Additional information about the map. This is displayed in the maps catalog. +- `base_node` [Optional]: String of the node around the flags. +- `initial_stuff` [Optional]: Comma-separated list of itemstacks to be given to the player on join and on respawn. +- `treasures` [Optional]: List of treasures to be registered for the map, in a serialized format. Refer to the `treasures` sub-section for more details. +- `start_time` [Optional]: Time of day when the match starts. Default to `0.4` [`0 - 1`]. +- `time_speed` [Optional]: Time speed multiplier. Accepts any valid number. Defaults to 1. +- `phys_speed` [Optional]: Player speed multiplier. Accepts any valid number. Defaults to 1. +- `phys_jump` [Optional]: Player jump multiplier. Accepts any valid number. Defaults to 1. +- `phys_gravity` [Optional]: Player gravity multiplier. Accepts any valid number. Defaults to 1. -## Documentation - -### Map meta - -Each map's metadata is stored in an accompanying `map.conf` file containing the following data: - -* `name`: Name of map. -* `author`: Author of the map. -* `hint`: [Optional] Helpful hint or tip for unique maps, to help players understand the map. -* `rotation`: Rotation of the schem. [`x`|`z`] -* `r`: Radius of the map. -* `h`: Height of the map. -* `team.i`: Name of team `i`. -* `team.i.color`: Color of team `i`. -* `team.i.pos`: Position of team `i`'s flag, relative to center of schem. -* `chests.i.from`, `chests.i.to`: [Optional] Positions of diagonal corners of custom chest -zone `i`, relative to the center of the schem. -* `chests.i.n`: [Optional] Number of chests to place in custom chest zone `i`. -* `license`: Name of the license of the map. -* `other`: [Optional] Misc. information about the map. This is displayed in the maps catalog. -* `base_node`: [Optional] Technical name of node to be used for the team base. -* `initial_stuff`: [Optional] Comma-separated list of itemstacks to be given to the player - on join and on respawn. -* `treasures`: [Optional] List of treasures to be registered for the map, in a serialized -format. Refer to the `treasures` sub-section for more details. -* `start_time`: [Optional] Time at start of match. Defaults to `0.4` [`0` - `1`]. -* `time_speed`: [Optional] Time speed multiplier. Accepts any valid number. Defaults to 1. -* `phys_speed`: [Optional] Player speed multiplier. Accepts any valid number. Defaults to 1. -* `phys_jump`: [Optional] Player jump multiplier. Accepts any valid number. Defaults to 1. -* `phys_gravity`: [Optional] Player gravity multiplier. Accepts any valid number. Defaults to 1. - #### `license` * Every map must have its own license. Once you've chosen your license, simply add the following line to the `map.conf` file: diff --git a/mods/ctf/ctf_map/map_maker/gui.png b/mods/ctf/ctf_map/map_maker/gui.png new file mode 100644 index 0000000000000000000000000000000000000000..f9504739399f9dde6fc2fbd341583941723e12b4 GIT binary patch literal 43327 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 Date: Wed, 26 May 2021 16:19:29 +0200 Subject: [PATCH 3/3] Fix various ctf_respawn_delay bugs (#889) --- mods/ctf/ctf_classes/api.lua | 11 ++++-- mods/ctf/ctf_respawn_delay/init.lua | 61 +++++++++++++++++------------ 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/mods/ctf/ctf_classes/api.lua b/mods/ctf/ctf_classes/api.lua index e8fe5f3..4851b62 100644 --- a/mods/ctf/ctf_classes/api.lua +++ b/mods/ctf/ctf_classes/api.lua @@ -91,11 +91,14 @@ end local function set_max_hp(player, max_hp) local cur_hp = player:get_hp() local old_max = player:get_properties().hp_max - local new_hp = cur_hp + max_hp - old_max - player:set_properties({ - hp_max = max_hp - }) + if old_max == 0 then + minetest.log("error", "[ctf_classes] Reviving dead player " .. player:get_player_name()) + end + + player:set_properties({hp_max = max_hp}) + + local new_hp = cur_hp + max_hp - old_max if new_hp > max_hp then minetest.log("error", string.format("New hp %d is larger than new max %d, old max is %d", new_hp, max_hp, old_max)) new_hp = max_hp diff --git a/mods/ctf/ctf_respawn_delay/init.lua b/mods/ctf/ctf_respawn_delay/init.lua index ab3b481..b12edb0 100644 --- a/mods/ctf/ctf_respawn_delay/init.lua +++ b/mods/ctf/ctf_respawn_delay/init.lua @@ -37,13 +37,18 @@ minetest.register_on_mods_loaded(function() table.insert(minetest.registered_on_respawnplayers, 1, function(player) local pname = player:get_player_name() - if ctf_respawn_delay.players[pname] and ctf_respawn_delay.players[pname].timeleft == "waiting" then - ctf_respawn_delay.players[pname].timeleft = RESPAWN_DELAY - local pos = player:get_pos() - pos.y = ctf_map.map.h/2 + 10 + if ctf_respawn_delay.players[pname] then + -- Since the player is still dead the client can send respawn actions + -- https://github.com/minetest/minetest/blob/4152227f17315a9cf9038266d9f9bb06e21e3424/src/network/serverpackethandler.cpp#L895 + -- We should ignore those + if ctf_respawn_delay.players[pname].timeleft == "waiting" then + ctf_respawn_delay.players[pname].timeleft = RESPAWN_DELAY + local pos = player:get_pos() + pos.y = ctf_map.map.h/2 + 10 - player:set_pos(pos) -- Player will be stuck there because CTF 'air' is walkable - minetest.after(RESPAWN_INTERVAL, respawnfunc, pname) + player:set_pos(pos) -- Player will be stuck there because CTF 'air' is walkable + minetest.after(RESPAWN_INTERVAL, respawnfunc, pname) + end return true end @@ -56,15 +61,10 @@ minetest.register_on_mods_loaded(function() end) end) -function ctf_respawn_delay.respawnplayer(name) - local player = minetest.get_player_by_name(name) - - if not player then return end - - player:hud_remove(ctf_respawn_delay.players[name].hudid) - player:set_properties({hp_max = ctf_respawn_delay.players[name].old_max}) - player:set_hp(ctf_respawn_delay.players[name].old_max) - ctf_respawn_delay.players[name] = nil +function respawnplayer(player, pname) + player:hud_remove(ctf_respawn_delay.players[pname].hudid) + player:set_properties({hp_max = ctf_respawn_delay.players[pname].old_max}) + player:set_hp(ctf_respawn_delay.players[pname].old_max) for k, func in ipairs(ctf_respawn_delay.registered_on_respawnplayers) do func(player) @@ -72,16 +72,13 @@ function ctf_respawn_delay.respawnplayer(name) end function respawnfunc(pname) - local player = minetest.get_player_by_name(pname) - - if not player or not ctf_respawn_delay.players[pname] then - ctf_respawn_delay.players[pname] = nil + if not ctf_respawn_delay.players[pname] then return end - if type(ctf_respawn_delay.players[pname].timeleft) == "string" then - minetest.after(RESPAWN_INTERVAL, respawnfunc, pname) - + local player = minetest.get_player_by_name(pname) + if not player then + ctf_respawn_delay.players[pname] = nil return end @@ -93,12 +90,26 @@ function respawnfunc(pname) minetest.after(RESPAWN_INTERVAL, respawnfunc, pname) else - ctf_respawn_delay.respawnplayer(pname) + respawnplayer(player, pname) + ctf_respawn_delay.players[pname] = nil end end ctf_match.register_on_new_match(function() - for name in pairs(ctf_respawn_delay.players) do - ctf_respawn_delay.respawnplayer(name) + for pname in pairs(ctf_respawn_delay.players) do + local player = minetest.get_player_by_name(pname) + if player then + respawnplayer(player, pname) + end + end + + ctf_respawn_delay.players = {} +end) + +minetest.register_on_leaveplayer(function(player) + local pname = player:get_player_name() + if ctf_respawn_delay.players[pname] then + player:set_properties({hp_max = ctf_respawn_delay.players[pname].old_max}) + ctf_respawn_delay.players[pname] = nil end end)