Commit 5bd9eac0 authored by ClaudiusMinimus's avatar ClaudiusMinimus
Browse files

merged in master

parents e695ad8c 4cb83e53
Pipeline #345 failed with stage
[submodule "mods/boats"]
path = mods/boats
url = https://git.tchncs.de/Illuna-Minetest/boats.git
[submodule "mods/illuna"] [submodule "mods/illuna"]
path = mods/illuna path = mods/illuna
url = https://git.tchncs.de/Illuna-Minetest/illuna.git url = https://git.tchncs.de/Illuna-Minetest/illuna.git
...@@ -16,9 +13,6 @@ ...@@ -16,9 +13,6 @@
[submodule "mods/mobs_animal"] [submodule "mods/mobs_animal"]
path = mods/mobs_animal path = mods/mobs_animal
url = https://git.tchncs.de/Illuna-Minetest/mobs_animal.git url = https://git.tchncs.de/Illuna-Minetest/mobs_animal.git
[submodule "mods/farming"]
path = mods/farming
url = https://git.tchncs.de/Illuna-Minetest/farming.git
[submodule "mods/worldedit"] [submodule "mods/worldedit"]
path = mods/worldedit path = mods/worldedit
url = https://github.com/Uberi/Minetest-WorldEdit url = https://github.com/Uberi/Minetest-WorldEdit
...@@ -65,9 +59,22 @@ ...@@ -65,9 +59,22 @@
[submodule "mods/pkarcs"] [submodule "mods/pkarcs"]
path = mods/pkarcs path = mods/pkarcs
url = https://git.tchncs.de/Illuna-Minetest/pkarcs url = https://git.tchncs.de/Illuna-Minetest/pkarcs
[submodule "mods/farming"]
path = mods/farming
url = https://git.tchncs.de/Illuna-Minetest/farming
[submodule "mods/boats"]
path = mods/boats
url = https://git.tchncs.de/Illuna-Minetest/boats
[submodule "mods/technic_chests"]
path = mods/technic_chests
url = https://git.tchncs.de/Illuna-Minetest/technic_chests
[submodule "mods/columnia"] [submodule "mods/columnia"]
path = mods/columnia path = mods/columnia
url = https://git.tchncs.de/Illuna-Minetest/columnia url = https://git.tchncs.de/Illuna-Minetest/columnia
[submodule "mods/hemp"] [submodule "mods/hemp"]
path = mods/hemp path = mods/hemp
url = https://github.com/pithydon/hemp.git url = https://github.com/pithydon/hemp.git
[submodule "mods/coloured_nametag"]
path = mods/coloured_nametag
url = https://github.com/Amaz1/coloured_nametag
unused_args = false
allow_defined_top = true
read_globals = {
"DIR_DELIM",
"minetest", "core",
"dump",
"vector", "nodeupdate",
"VoxelManip", "VoxelArea",
"PseudoRandom", "ItemStack",
}
-- Overwrites minetest.handle_node_drops
files["mods/creative/init.lua"].globals = { "minetest" }
-- Don't report on legacy definitions of globals.
files["mods/default/legacy.lua"].global = false
language: generic
branches:
only:
- master
sudo: required
before_install:
- sudo apt-get update
- sudo apt-get install -y luarocks
- sudo luarocks install luacheck
script: luacheck --no-color ./mods
...@@ -62,6 +62,11 @@ Beds API ...@@ -62,6 +62,11 @@ Beds API
} }
} }
Creative API
------------
A global string called `creative.formspec_add` was added which allows mods to add additional formspec elements onto the default creative inventory formspec to be drawn after each update.
Doors API Doors API
--------- ---------
...@@ -245,6 +250,18 @@ Give Initial Stuff API ...@@ -245,6 +250,18 @@ Give Initial Stuff API
^ str is a comma separated list of initial stuff ^ str is a comma separated list of initial stuff
^ Adds items to the list of items to be given ^ Adds items to the list of items to be given
Nyancat API
-----------
`nyancat.place(pos, facedir, length)`
^ Place a cat at `pos` facing `facedir` with tail length `length`
Only accepts facedir 0-3, if facedir > 3 then it will be interpreted as facedir = 0
`nyancat.generate(minp, maxp, seed)`
^ Called by `minetest.register_on_generated`. To disable nyancat generation,
you can redefine nyancat.generate() to be an empty function
TNT API TNT API
---------- ----------
...@@ -331,7 +348,7 @@ To use it, add the `on_screwdriver` function to the node definition. ...@@ -331,7 +348,7 @@ To use it, add the `on_screwdriver` function to the node definition.
* `new_param2` the new value of param2 that would have been set if on_rotate wasn't there * `new_param2` the new value of param2 that would have been set if on_rotate wasn't there
* return value: false to disallow rotation, nil to keep default behaviour, true to allow * return value: false to disallow rotation, nil to keep default behaviour, true to allow
it but to indicate that changed have already been made (so the screwdriver will wear out) it but to indicate that changed have already been made (so the screwdriver will wear out)
* use `on_rotate = screwdriver.disallow` to always disallow rotation * use `on_rotate = false` to always disallow rotation
* use `on_rotate = screwdriver.rotate_simple` to allow only face rotation * use `on_rotate = screwdriver.rotate_simple` to allow only face rotation
......
...@@ -5,6 +5,12 @@ ...@@ -5,6 +5,12 @@
# Whether creative mode (fast digging of all blocks, unlimited resources) should be enabled # Whether creative mode (fast digging of all blocks, unlimited resources) should be enabled
#creative_mode = false #creative_mode = false
# Sets the behaviour of the inventory items when a player dies.
# "bones": Store all items inside a bone node but drop items if inside protected area
# "drop": Drop all items on the ground
# "keep": Player keeps all items
#bones_mode = "bones"
# The time in seconds after which the bones of a dead player can be looted by everyone # The time in seconds after which the bones of a dead player can be looted by everyone
# 0 to disable # 0 to disable
#share_bones_time = 1200 #share_bones_time = 1200
...@@ -14,9 +20,9 @@ ...@@ -14,9 +20,9 @@
# 0 to disable. By default it is "share_bones_time" divide by four. # 0 to disable. By default it is "share_bones_time" divide by four.
#share_bones_time_early = 300 #share_bones_time_early = 300
# Whether standard fire should be disabled ('basic flame' nodes will disappear) # Whether fire should be enabled. If disabled, 'basic flame' nodes will disappear.
# 'permanent flame' nodes will remain with either setting # 'permanent flame' nodes will remain with either setting.
#disable_fire = false #enable_fire = true
# Whether the stuff in initial_stuff should be given to new players # Whether the stuff in initial_stuff should be given to new players
#give_initial_stuff = false #give_initial_stuff = false
......
...@@ -70,7 +70,7 @@ local function lay_down(player, pos, bed_pos, state, skip) ...@@ -70,7 +70,7 @@ local function lay_down(player, pos, bed_pos, state, skip)
-- physics, eye_offset, etc -- physics, eye_offset, etc
player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
player:set_look_yaw(math.random(1, 180) / 100) player:set_look_horizontal(math.random(1, 180) / 100)
default.player_attached[name] = false default.player_attached[name] = false
player:set_physics_override(1, 1, 1) player:set_physics_override(1, 1, 1)
hud_flags.wielditem = true hud_flags.wielditem = true
...@@ -85,7 +85,7 @@ local function lay_down(player, pos, bed_pos, state, skip) ...@@ -85,7 +85,7 @@ local function lay_down(player, pos, bed_pos, state, skip)
-- physics, eye_offset, etc -- physics, eye_offset, etc
player:set_eye_offset({x = 0, y = -13, z = 0}, {x = 0, y = 0, z = 0}) player:set_eye_offset({x = 0, y = -13, z = 0}, {x = 0, y = 0, z = 0})
local yaw, param2 = get_look_yaw(bed_pos) local yaw, param2 = get_look_yaw(bed_pos)
player:set_look_yaw(yaw) player:set_look_horizontal(yaw)
local dir = minetest.facedir_to_dir(param2) local dir = minetest.facedir_to_dir(param2)
local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2} local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2}
player:set_physics_override(0, 0, 0) player:set_physics_override(0, 0, 0)
......
...@@ -14,4 +14,4 @@ http://creativecommons.org/licenses/by-sa/3.0/ ...@@ -14,4 +14,4 @@ http://creativecommons.org/licenses/by-sa/3.0/
Authors of media files Authors of media files
---------------------- ----------------------
Bad_Command_ All textures: paramat
-- Minetest 0.4 mod: bones -- Minetest 0.4 mod: bones
-- See README.txt for licensing and other information. -- See README.txt for licensing and other information.
bones = {}
local function is_owner(pos, name) local function is_owner(pos, name)
local owner = minetest.get_meta(pos):get_string("owner") local owner = minetest.get_meta(pos):get_string("owner")
...@@ -11,7 +9,7 @@ local function is_owner(pos, name) ...@@ -11,7 +9,7 @@ local function is_owner(pos, name)
return false return false
end end
bones.bones_formspec = local bones_formspec =
"size[8,9]" .. "size[8,9]" ..
default.gui_bg .. default.gui_bg ..
default.gui_bg_img .. default.gui_bg_img ..
...@@ -29,7 +27,7 @@ local share_bones_time_early = tonumber(minetest.setting_get("share_bones_time_e ...@@ -29,7 +27,7 @@ local share_bones_time_early = tonumber(minetest.setting_get("share_bones_time_e
minetest.register_node("bones:bones", { minetest.register_node("bones:bones", {
description = "Bones", description = "Bones",
tiles = { tiles = {
"bones_top.png", "bones_top.png^[transform2",
"bones_bottom.png", "bones_bottom.png",
"bones_side.png", "bones_side.png",
"bones_side.png", "bones_side.png",
...@@ -37,12 +35,9 @@ minetest.register_node("bones:bones", { ...@@ -37,12 +35,9 @@ minetest.register_node("bones:bones", {
"bones_front.png" "bones_front.png"
}, },
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {dig_immediate=2}, groups = {dig_immediate = 2},
sounds = default.node_sound_dirt_defaults({ sounds = default.node_sound_gravel_defaults(),
footstep = {name="default_gravel_footstep", gain=0.5},
dug = {name="default_gravel_footstep", gain=1.0},
}),
can_dig = function(pos, player) can_dig = function(pos, player)
local inv = minetest.get_meta(pos):get_inventory() local inv = minetest.get_meta(pos):get_inventory()
local name = "" local name = ""
...@@ -51,46 +46,46 @@ minetest.register_node("bones:bones", { ...@@ -51,46 +46,46 @@ minetest.register_node("bones:bones", {
end end
return is_owner(pos, name) and inv:is_empty("main") return is_owner(pos, name) and inv:is_empty("main")
end, end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
if is_owner(pos, player:get_player_name()) then if is_owner(pos, player:get_player_name()) then
return count return count
end end
return 0 return 0
end, end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player) allow_metadata_inventory_put = function(pos, listname, index, stack, player)
return 0 return 0
end, end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player) allow_metadata_inventory_take = function(pos, listname, index, stack, player)
if is_owner(pos, player:get_player_name()) then if is_owner(pos, player:get_player_name()) then
return stack:get_count() return stack:get_count()
end end
return 0 return 0
end, end,
on_metadata_inventory_take = function(pos, listname, index, stack, player) on_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
if meta:get_inventory():is_empty("main") then if meta:get_inventory():is_empty("main") then
minetest.remove_node(pos) minetest.remove_node(pos)
end end
end, end,
on_punch = function(pos, node, player) on_punch = function(pos, node, player)
if(not is_owner(pos, player:get_player_name())) then if not is_owner(pos, player:get_player_name()) then
return return
end end
if(minetest.get_meta(pos):get_string("infotext") == "") then if minetest.get_meta(pos):get_string("infotext") == "" then
return return
end end
local inv = minetest.get_meta(pos):get_inventory() local inv = minetest.get_meta(pos):get_inventory()
local player_inv = player:get_inventory() local player_inv = player:get_inventory()
local has_space = true local has_space = true
for i=1,inv:get_size("main") do for i = 1, inv:get_size("main") do
local stk = inv:get_stack("main", i) local stk = inv:get_stack("main", i)
if player_inv:room_for_item("main", stk) then if player_inv:room_for_item("main", stk) then
inv:set_stack("main", i, nil) inv:set_stack("main", i, nil)
...@@ -100,7 +95,7 @@ minetest.register_node("bones:bones", { ...@@ -100,7 +95,7 @@ minetest.register_node("bones:bones", {
break break
end end
end end
-- remove bones if player emptied them -- remove bones if player emptied them
if has_space then if has_space then
if player_inv:room_for_item("main", {name = "bones:bones"}) then if player_inv:room_for_item("main", {name = "bones:bones"}) then
...@@ -111,12 +106,12 @@ minetest.register_node("bones:bones", { ...@@ -111,12 +106,12 @@ minetest.register_node("bones:bones", {
minetest.remove_node(pos) minetest.remove_node(pos)
end end
end, end,
on_timer = function(pos, elapsed) on_timer = function(pos, elapsed)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local time = meta:get_int("time") + elapsed local time = meta:get_int("time") + elapsed
if time >= share_bones_time then if time >= share_bones_time then
meta:set_string("infotext", meta:get_string("owner").."'s old bones") meta:set_string("infotext", meta:get_string("owner") .. "'s old bones")
meta:set_string("owner", "") meta:set_string("owner", "")
else else
meta:set_int("time", time) meta:set_int("time", time)
...@@ -131,13 +126,9 @@ local function may_replace(pos, player) ...@@ -131,13 +126,9 @@ local function may_replace(pos, player)
local node_name = minetest.get_node(pos).name local node_name = minetest.get_node(pos).name
local node_definition = minetest.registered_nodes[node_name] local node_definition = minetest.registered_nodes[node_name]
-- if the node is unknown, we let the protection mod decide -- if the node is unknown, we return false
-- this is consistent with when a player could dig or not dig it
-- unknown decoration would often be removed
-- while unknown building materials in use would usually be left
if not node_definition then if not node_definition then
-- only replace nodes that are not protected return false
return not minetest.is_protected(pos, player:get_player_name())
end end
-- allow replacing air and liquids -- allow replacing air and liquids
...@@ -157,73 +148,94 @@ local function may_replace(pos, player) ...@@ -157,73 +148,94 @@ local function may_replace(pos, player)
return node_definition.buildable_to and not minetest.is_protected(pos, player:get_player_name()) return node_definition.buildable_to and not minetest.is_protected(pos, player:get_player_name())
end end
local drop = function(pos, itemstack)
local obj = minetest.add_item(pos, itemstack:take_item(itemstack:get_count()))
if obj then
obj:setvelocity({
x = math.random(-10, 10) / 9,
y = 5,
z = math.random(-10, 10) / 9,
})
end
end
minetest.register_on_dieplayer(function(player) minetest.register_on_dieplayer(function(player)
if minetest.setting_getbool("creative_mode") then
local bones_mode = minetest.setting_get("bones_mode") or "bones"
if bones_mode ~= "bones" and bones_mode ~= "drop" and bones_mode ~= "keep" then
bones_mode = "bones"
end
-- return if keep inventory set or in creative mode
if bones_mode == "keep" or minetest.setting_getbool("creative_mode") then
return return
end end
local player_inv = player:get_inventory() local player_inv = player:get_inventory()
if player_inv:is_empty("main") and if player_inv:is_empty("main") and
player_inv:is_empty("craft") then player_inv:is_empty("craft") then
return return
end end
local pos = player:getpos() local pos = vector.round(player:getpos())
pos.x = math.floor(pos.x+0.5)
pos.y = math.floor(pos.y+0.5)
pos.z = math.floor(pos.z+0.5)
local param2 = minetest.dir_to_facedir(player:get_look_dir())
local player_name = player:get_player_name() local player_name = player:get_player_name()
if (not may_replace(pos, player)) then -- check if it's possible to place bones, if not go 1 higher
if (may_replace({x=pos.x, y=pos.y+1, z=pos.z}, player)) then if bones_mode == "bones" and not may_replace(pos, player) then
-- drop one node above if there's space pos.y = pos.y + 1
-- this should solve most cases of protection related deaths in which players dig straight down end
-- yet keeps the bones reachable
pos.y = pos.y+1 -- still cannot place bones? change mode to 'drop'
else if bones_mode == "bones" and not may_replace(pos, player) then
-- drop items instead of delete bones_mode = "drop"
for i=1,player_inv:get_size("main") do end
minetest.add_item(pos, player_inv:get_stack("main", i))
end if bones_mode == "drop" then
for i=1,player_inv:get_size("craft") do
minetest.add_item(pos, player_inv:get_stack("craft", i)) -- drop inventory items
end for i = 1, player_inv:get_size("main") do
-- empty lists main and craft drop(pos, player_inv:get_stack("main", i))
player_inv:set_list("main", {})
player_inv:set_list("craft", {})
return
end end
player_inv:set_list("main", {})
-- drop crafting grid items
for i = 1, player_inv:get_size("craft") do
drop(pos, player_inv:get_stack("craft", i))
end
player_inv:set_list("craft", {})
drop(pos, ItemStack("bones:bones"))
return
end end
minetest.set_node(pos, {name="bones:bones", param2=param2})
minetest.chat_send_player(player_name, "Your stuff is waiting for you at "..minetest.pos_to_string(pos).. ". Go and grab it! ;-)") local param2 = minetest.dir_to_facedir(player:get_look_dir())
minetest.log("action", player_name.." left their bones at "..minetest.pos_to_string(pos)) minetest.set_node(pos, {name = "bones:bones", param2 = param2})
minetest.chat_send_player(player_name, "Your stuff is waiting for you at "..minetest.pos_to_string(pos).. ". Go and grab it! ;-)")
minetest.log("action", player_name.." left their bones at "..minetest.pos_to_string(pos))
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("main", 8*4) inv:set_size("main", 8 * 4)
inv:set_list("main", player_inv:get_list("main")) inv:set_list("main", player_inv:get_list("main"))
for i=1,player_inv:get_size("craft") do for i = 1, player_inv:get_size("craft") do
local stack = player_inv:get_stack("craft", i) local stack = player_inv:get_stack("craft", i)
if inv:room_for_item("main", stack) then if inv:room_for_item("main", stack) then
inv:add_item("main", stack) inv:add_item("main", stack)
else else
--drop if no space left --drop if no space left
minetest.add_item(pos, stack) drop(pos, stack)
end end
end end
player_inv:set_list("main", {}) player_inv:set_list("main", {})
player_inv:set_list("craft", {}) player_inv:set_list("craft", {})
meta:set_string("formspec", bones.bones_formspec) meta:set_string("formspec", bones_formspec)
meta:set_string("owner", player_name) meta:set_string("owner", player_name)
if share_bones_time ~= 0 then if share_bones_time ~= 0 then
meta:set_string("infotext", player_name.."'s fresh bones") meta:set_string("infotext", player_name .. "'s fresh bones")
if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then
meta:set_int("time", 0) meta:set_int("time", 0)
......
mods/bones/textures/bones_bottom.png

181 Bytes | W: | H:

mods/bones/textures/bones_bottom.png

740 Bytes | W: | H:

mods/bones/textures/bones_bottom.png
mods/bones/textures/bones_bottom.png
mods/bones/textures/bones_bottom.png
mods/bones/textures/bones_bottom.png
  • 2-up
  • Swipe
  • Onion skin
mods/bones/textures/bones_front.png

183 Bytes | W: | H:

mods/bones/textures/bones_front.png

656 Bytes | W: | H:

mods/bones/textures/bones_front.png
mods/bones/textures/bones_front.png
mods/bones/textures/bones_front.png
mods/bones/textures/bones_front.png
  • 2-up
  • Swipe
  • Onion skin
mods/bones/textures/bones_rear.png

187 Bytes | W: | H:

mods/bones/textures/bones_rear.png

637 Bytes | W: | H:

mods/bones/textures/bones_rear.png
mods/bones/textures/bones_rear.png
mods/bones/textures/bones_rear.png
mods/bones/textures/bones_rear.png
  • 2-up
  • Swipe
  • Onion skin
mods/bones/textures/bones_side.png

188 Bytes | W: | H:

mods/bones/textures/bones_side.png

700 Bytes | W: | H:

mods/bones/textures/bones_side.png
mods/bones/textures/bones_side.png
mods/bones/textures/bones_side.png
mods/bones/textures/bones_side.png
  • 2-up
  • Swipe
  • Onion skin
mods/bones/textures/bones_top.png

182 Bytes | W: | H:

mods/bones/textures/bones_top.png

662 Bytes | W: | H:

mods/bones/textures/bones_top.png
mods/bones/textures/bones_top.png
mods/bones/textures/bones_top.png
mods/bones/textures/bones_top.png
  • 2-up
  • Swipe
  • Onion skin
Subproject commit 819daa52f1c8e1621489a5f8d73ad9a29e6efa4e Subproject commit 5013537e24f526fbae97a6693a08d6eff7f8cd9b
...@@ -141,7 +141,7 @@ minetest.register_craftitem("bucket:bucket_empty", { ...@@ -141,7 +141,7 @@ minetest.register_craftitem("bucket:bucket_empty", {
else else
local pos = user:getpos() local pos = user:getpos()
pos.y = math.floor(pos.y + 0.5) pos.y = math.floor(pos.y + 0.5)
core.add_item(pos, liquiddef.itemname) minetest.add_item(pos, liquiddef.itemname)
end end
-- set to return empty buckets minus 1 -- set to return empty buckets minus 1
......
Subproject commit c50a4ca893e5383d75ff274533327a5faf20b1b7
Subproject commit c3a57b9e17bdca5679366fab1518d19d01fd433f Subproject commit 7a5384239d0e86b126cd873c5585061fb8926add
...@@ -125,7 +125,7 @@ creative.set_creative_formspec = function(player, start_i) ...@@ -125,7 +125,7 @@ creative.set_creative_formspec = function(player, start_i)
tooltip[creative_clear;Reset] tooltip[creative_clear;Reset]
listring[current_player;main] listring[current_player;main]
]] .. ]] ..
"field[0.3,3.5;2.2,1;creative_filter;;" .. inv.filter .. "]" .. "field[0.3,3.5;2.2,1;creative_filter;;" .. minetest.formspec_escape(inv.filter) .. ";false]" ..