Add farming, update mobs, farming, drop and textures

master
Maksim 2019-04-17 00:27:30 +03:00 committed by MoNTE48
parent 046502b61e
commit c3b2eeca49
167 changed files with 1006 additions and 288 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 KiB

After

Width:  |  Height:  |  Size: 558 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 KiB

After

Width:  |  Height:  |  Size: 230 KiB

View File

@ -107,6 +107,17 @@ Vattic's Terms:
--- --- --- --- --- ---
Copyright (C) 2014 HiTeeN
https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/resource-packs/1242446-faithful-64x64
You can use my texture pack on the following conditions:
You must specify a link on this topic in their publications.
If your package contains more than 80% of my textures, you have no right to publish them.
--- --- ---
JThread: JThread:
================================= =================================
@ -264,5 +275,3 @@ product, an acknowledgment in the product documentation is required.
be misrepresented as being the original software. be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
--- --- ---

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 B

After

Width:  |  Height:  |  Size: 71 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1003 B

After

Width:  |  Height:  |  Size: 975 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 991 B

After

Width:  |  Height:  |  Size: 962 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 B

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 B

After

Width:  |  Height:  |  Size: 181 B

View File

@ -70,8 +70,15 @@ minetest.register_alias("default:pinewood", "default:pine_wood")
-- Gold nugget -- Gold nugget
minetest.register_alias("default:gold_nugget", "default:gold_ingot") minetest.register_alias("default:gold_nugget", "default:gold_ingot")
-- Sandstone Carved -- Sandstone Carved
minetest.register_alias("default:sandstonecarved", "default:sandstonesmooth") minetest.register_alias("default:sandstonecarved", "default:sandstonesmooth")
-- Workbench -- Workbench
minetest.register_alias("crafting:workbench", "default:workbench") minetest.register_alias("crafting:workbench", "default:workbench")
-- String
minetest.register_alias("default:string", "farming:string")
-- Hay Bale
minetest.register_alias("default:haybale", "farming:straw")

View File

@ -289,8 +289,8 @@ minetest.register_craft({
output = "default:pole", output = "default:pole",
recipe = { recipe = {
{'', '', 'default:stick'}, {'', '', 'default:stick'},
{'', 'default:stick', 'default:string'}, {'', 'default:stick', 'farming:string'},
{'default:stick', '', 'default:string'}, {'default:stick', '', 'farming:string'},
} }
}) })
@ -651,7 +651,6 @@ minetest.register_craft({
}) })
-- --
-- Fuels -- Fuels
-- --
@ -740,12 +739,8 @@ minetest.register_craft({
burntime = 15, burntime = 15,
}) })
--
--Temporary
--
minetest.register_craft({ minetest.register_craft({
output = "default:string", output = "farming:string",
recipe = {{"default:paper", "default:paper"}}, recipe = {{"default:paper", "default:paper"}},
}) })

View File

@ -111,13 +111,6 @@ minetest.register_craftitem("default:sugar", {
groups = {materials = 1}, groups = {materials = 1},
}) })
minetest.register_craftitem("default:string",{
description = "String",
inventory_image = "default_string.png",
groups = {materials = 1},
})
minetest.register_craftitem("default:quartz_crystal", { minetest.register_craftitem("default:quartz_crystal", {
description = "Quartz Crystal", description = "Quartz Crystal",
inventory_image = "default_quartz_crystal.png", inventory_image = "default_quartz_crystal.png",

View File

@ -12,6 +12,7 @@ minetest.register_alias("mapgen_lava_source", "default:lava_source")
minetest.register_alias("mapgen_gravel", "default:gravel") minetest.register_alias("mapgen_gravel", "default:gravel")
minetest.register_alias("mapgen_desert_stone", "default:redsandstone") minetest.register_alias("mapgen_desert_stone", "default:redsandstone")
minetest.register_alias("mapgen_desert_sand", "default:redsand") minetest.register_alias("mapgen_desert_sand", "default:redsand")
minetest.register_alias("default:desert_sand", "default:redsand")
minetest.register_alias("mapgen_dirt_with_snow", "default:dirt_with_snow") minetest.register_alias("mapgen_dirt_with_snow", "default:dirt_with_snow")
minetest.register_alias("mapgen_snowblock", "default:snowblock") minetest.register_alias("mapgen_snowblock", "default:snowblock")
minetest.register_alias("mapgen_snow", "default:snow") minetest.register_alias("mapgen_snow", "default:snow")

View File

@ -253,17 +253,6 @@ minetest.register_node("default:brick", {
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
}) })
minetest.register_node("default:haybale", {
description = "Hay Bale",
tiles = {"default_hayblock_top.png", "default_hayblock_top.png", "default_hayblock_side.png"},
paramtype2 = "facedir",
is_ground_content = false,
on_place = minetest.rotate_node,
groups = {tree=1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, building = 1},
sounds = default.node_sound_wood_defaults(),
})
-- --
-- Trees -- Trees
-- --
@ -530,6 +519,13 @@ minetest.register_node("default:junglegrass", {
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
walkable = false, walkable = false,
drop = {
max_items = 1,
items = {
--{items = {'farming:seed_cotton'}, rarity = 8},
{items = {'default:junglegrass'}},
}
},
buildable_to = true, buildable_to = true,
groups = {snappy = 3, flammable = 2, flora = 1, attached_node = 1}, groups = {snappy = 3, flammable = 2, flora = 1, attached_node = 1},
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
@ -1195,7 +1191,7 @@ minetest.register_node("default:chest", {
"list[current_name;main;0,0;9,3;]".. "list[current_name;main;0,0;9,3;]"..
"list[current_player;main;0,4;9,3;9]".. "list[current_player;main;0,4;9,3;9]"..
"list[current_player;main;0,7.5.5;9,1;]") "list[current_player;main;0,7.5.5;9,1;]")
meta:set_string("infotext", "Coffre") meta:set_string("infotext", "Chest")
end end
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("main", 9*3) inv:set_size("main", 9*3)
@ -1259,7 +1255,7 @@ minetest.register_node("default:chest_left", {
"list[current_name;main;0,0;9,3;]".. "list[current_name;main;0,0;9,3;]"..
"list[current_player;main;0,4;9,3;9]".. "list[current_player;main;0,4;9,3;9]"..
"list[current_player;main;0,7.5.5;9,1;]") "list[current_player;main;0,7.5.5;9,1;]")
meta:set_string("infotext", "Coffre") meta:set_string("infotext", "Chest")
hacky_swap_node(p, "default:chest") hacky_swap_node(p, "default:chest")
end, end,
after_dig_node = function(pos, oldnode, oldmetadata, digger) after_dig_node = function(pos, oldnode, oldmetadata, digger)
@ -1469,21 +1465,13 @@ minetest.register_node("default:grass", {
wield_image = "default_tallgrass.png", wield_image = "default_tallgrass.png",
walkable = false, walkable = false,
buildable_to = true, buildable_to = true,
--drop = { drop = {
--max_items = 1, max_items = 1,
--items = { items = {
-- { {items = {'farming:seed_wheat'}, rarity = 5},
-- -- player will get sapling with 1/20 chance {items = {'default:grass'}},
-- items = {'farming:wheat_seed'}, }
-- rarity = 5, },
-- },
-- {
-- -- player will get leaves only if he get no saplings,
-- -- this is because max_items is 1
-- items = {''},
-- }
-- }
--},
paramtype = "light", paramtype = "light",
groups = {snappy = 3, flammable = 3,attached_node=1,dig_immediate=3, decorative=1, grass=1}, groups = {snappy = 3, flammable = 3,attached_node=1,dig_immediate=3, decorative=1, grass=1},
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),

Binary file not shown.

Before

Width:  |  Height:  |  Size: 870 B

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 823 B

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 B

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 B

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 661 B

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 518 B

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 840 B

After

Width:  |  Height:  |  Size: 839 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 B

After

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 962 B

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 456 B

After

Width:  |  Height:  |  Size: 447 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 521 B

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 B

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 631 B

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 327 B

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 B

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 B

After

Width:  |  Height:  |  Size: 142 B

View File

@ -100,5 +100,5 @@ dungeon_loot.seedlings_list = {
if minetest.get_modpath("farming") then if minetest.get_modpath("farming") then
table.insert(dungeon_loot.consumables_list, {name="farming:bread", chance_and_amount = 10}) table.insert(dungeon_loot.consumables_list, {name="farming:bread", chance_and_amount = 10})
table.insert(dungeon_loot.seedlings_list, {name="farming:seed_wheat", chance = 1, amount = 10}) table.insert(dungeon_loot.seedlings_list, {name="farming:seed_wheat", chance = 1, amount = 10})
table.insert(dungeon_loot.seedlings_list, {name="farming:seed_cotton", chance = 20, amount = 5}) -- table.insert(dungeon_loot.seedlings_list, {name="farming:seed_cotton", chance = 20, amount = 5})
end end

View File

@ -0,0 +1,9 @@
MultiCraft Game mod: farming
==========================
See license.txt for license information.
Authors of source code
----------------------
Originally by PilzAdam (MIT)
webdesigner97 (MIT)
Various Minetest developers and contributors (MIT)

View File

@ -0,0 +1,391 @@
-- Wear out hoes, place soil
-- TODO Ignore group:flower
farming.registered_plants = {}
farming.hoe_on_use = function(itemstack, user, pointed_thing, uses)
local pt = pointed_thing
-- check if pointing at a node
if not pt then
return
end
if pt.type ~= "node" then
return
end
local under = minetest.get_node(pt.under)
local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z}
local above = minetest.get_node(p)
-- return if any of the nodes is not registered
if not minetest.registered_nodes[under.name] then
return
end
if not minetest.registered_nodes[above.name] then
return
end
-- check if the node above the pointed thing is air
if above.name ~= "air" then
return
end
-- check if pointing at soil
if minetest.get_item_group(under.name, "soil") ~= 1 then
return
end
-- check if (wet) soil defined
local regN = minetest.registered_nodes
if regN[under.name].soil == nil or regN[under.name].soil.wet == nil or regN[under.name].soil.dry == nil then
return
end
if minetest.is_protected(pt.under, user:get_player_name()) then
minetest.record_protection_violation(pt.under, user:get_player_name())
return
end
if minetest.is_protected(pt.above, user:get_player_name()) then
minetest.record_protection_violation(pt.above, user:get_player_name())
return
end
-- turn the node into soil and play sound
minetest.set_node(pt.under, {name = regN[under.name].soil.dry})
minetest.sound_play("default_dig_crumbly", {
pos = pt.under,
gain = 0.5,
})
if not (creative and creative.is_enabled_for
and creative.is_enabled_for(user:get_player_name())) then
-- wear tool
local wdef = itemstack:get_definition()
itemstack:add_wear(65535/(uses-1))
-- tool break sound
if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then
minetest.sound_play(wdef.sound.breaks, {pos = pt.above, gain = 0.5})
end
end
return itemstack
end
-- Register new hoes
farming.register_hoe = function(name, def)
-- Check for : prefix (register new hoes in your mod's namespace)
if name:sub(1,1) ~= ":" then
name = ":" .. name
end
-- Check def table
if def.description == nil then
def.description = "Hoe"
end
if def.inventory_image == nil then
def.inventory_image = "unknown_item.png"
end
if def.max_uses == nil then
def.max_uses = 30
end
-- Register the tool
minetest.register_tool(name, {
description = def.description,
inventory_image = def.inventory_image,
on_use = function(itemstack, user, pointed_thing)
return farming.hoe_on_use(itemstack, user, pointed_thing, def.max_uses)
end,
groups = def.groups,
sound = {breaks = "default_tool_breaks"},
})
-- Register its recipe
if def.recipe then
minetest.register_craft({
output = name:sub(2),
recipe = def.recipe
})
elseif def.material then
minetest.register_craft({
output = name:sub(2),
recipe = {
{def.material, def.material},
{"", "group:stick"},
{"", "group:stick"}
}
})
end
end
-- how often node timers for plants will tick, +/- some random value
local function tick(pos)
minetest.get_node_timer(pos):start(math.random(166, 286))
end
-- how often a growth failure tick is retried (e.g. too dark)
local function tick_again(pos)
minetest.get_node_timer(pos):start(math.random(40, 80))
end
-- Seed placement
farming.place_seed = function(itemstack, placer, pointed_thing, plantname)
local pt = pointed_thing
-- check if pointing at a node
if not pt then
return itemstack
end
if pt.type ~= "node" then
return itemstack
end
local under = minetest.get_node(pt.under)
local above = minetest.get_node(pt.above)
local player_name = placer and placer:get_player_name() or ""
if minetest.is_protected(pt.under, player_name) then
minetest.record_protection_violation(pt.under, player_name)
return
end
if minetest.is_protected(pt.above, player_name) then
minetest.record_protection_violation(pt.above, player_name)
return
end
-- return if any of the nodes is not registered
if not minetest.registered_nodes[under.name] then
return itemstack
end
if not minetest.registered_nodes[above.name] then
return itemstack
end
-- check if pointing at the top of the node
if pt.above.y ~= pt.under.y+1 then
return itemstack
end
-- check if you can replace the node above the pointed node
if not minetest.registered_nodes[above.name].buildable_to then
return itemstack
end
-- check if pointing at soil
if minetest.get_item_group(under.name, "soil") < 2 then
return itemstack
end
-- add the node and remove 1 item from the itemstack
minetest.add_node(pt.above, {name = plantname, param2 = 1})
tick(pt.above)
if not (creative and creative.is_enabled_for
and creative.is_enabled_for(player_name)) then
itemstack:take_item()
end
return itemstack
end
farming.grow_plant = function(pos, elapsed)
local node = minetest.get_node(pos)
local name = node.name
local def = minetest.registered_nodes[name]
if not def.next_plant then
-- disable timer for fully grown plant
return
end
-- grow seed
if minetest.get_item_group(node.name, "seed") and def.fertility then
local soil_node = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z})
if not soil_node then
tick_again(pos)
return
end
-- omitted is a check for light, we assume seeds can germinate in the dark.
for _, v in pairs(def.fertility) do
if minetest.get_item_group(soil_node.name, v) ~= 0 then
local placenode = {name = def.next_plant}
if def.place_param2 then
placenode.param2 = def.place_param2
end
minetest.swap_node(pos, placenode)
if minetest.registered_nodes[def.next_plant].next_plant then
tick(pos)
return
end
end
end
return
end
-- check if on wet soil
local below = minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z})
if minetest.get_item_group(below.name, "soil") < 3 then
tick_again(pos)
return
end
-- check light
local light = minetest.get_node_light(pos)
if not light or light < def.minlight or light > def.maxlight then
tick_again(pos)
return
end
-- grow
local placenode = {name = def.next_plant}
if def.place_param2 then
placenode.param2 = def.place_param2
end
minetest.swap_node(pos, placenode)
-- new timer needed?
if minetest.registered_nodes[def.next_plant].next_plant then
tick(pos)
end
return
end
-- Register plants
farming.register_plant = function(name, def)
local mname = name:split(":")[1]
local pname = name:split(":")[2]
-- Check def table
if not def.description then
def.description = "Seed"
end
if not def.inventory_image then
def.inventory_image = "unknown_item.png"
end
if not def.steps then
return nil
end
if not def.minlight then
def.minlight = 1
end
if not def.maxlight then
def.maxlight = 14
end
if not def.fertility then
def.fertility = {}
end
farming.registered_plants[pname] = def
-- Register seed
local lbm_nodes = {mname .. ":seed_" .. pname}
local g = {seed = 1, snappy = 3, attached_node = 1, flammable = 2}
for k, v in pairs(def.fertility) do
g[v] = 1
end
minetest.register_node(":" .. mname .. ":seed_" .. pname, {
description = def.description,
tiles = {def.inventory_image},
inventory_image = def.inventory_image,
wield_image = def.inventory_image,
drawtype = "signlike",
groups = g,
paramtype = "light",
paramtype2 = "wallmounted",
place_param2 = def.place_param2 or nil, -- this isn't actually used for placement
walkable = false,
sunlight_propagates = true,
selection_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
},
fertility = def.fertility,
sounds = default.node_sound_dirt_defaults({
dig = {name = "", gain = 0},
dug = {name = "default_grass_footstep", gain = 0.2},
place = {name = "default_place_node", gain = 0.25},
}),
on_place = function(itemstack, placer, pointed_thing)
local under = pointed_thing.under
local node = minetest.get_node(under)
local udef = minetest.registered_nodes[node.name]
if udef and udef.on_rightclick and
not (placer and placer:is_player() and
placer:get_player_control().sneak) then
return udef.on_rightclick(under, node, placer, itemstack,
pointed_thing) or itemstack
end
return farming.place_seed(itemstack, placer, pointed_thing, mname .. ":seed_" .. pname)
end,
next_plant = mname .. ":" .. pname .. "_1",
on_timer = farming.grow_plant,
minlight = def.minlight,
maxlight = def.maxlight,
})
-- Register harvest
minetest.register_craftitem(":" .. mname .. ":" .. pname, {
description = pname:gsub("^%l", string.upper),
inventory_image = mname .. "_" .. pname .. ".png",
groups = def.groups or {flammable = 2},
})
-- Register growing steps
for i = 1, def.steps do
local base_rarity = 1
if def.steps ~= 1 then
base_rarity = 8 - (i - 1) * 7 / (def.steps - 1)
end
local drop = {
items = {
{items = {mname .. ":" .. pname}, rarity = base_rarity},
{items = {mname .. ":" .. pname}, rarity = base_rarity * 2},
{items = {mname .. ":seed_" .. pname}, rarity = base_rarity},
{items = {mname .. ":seed_" .. pname}, rarity = base_rarity * 2},
}
}
local nodegroups = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1}
nodegroups[pname] = i
local next_plant = nil
if i < def.steps then
next_plant = mname .. ":" .. pname .. "_" .. (i + 1)
lbm_nodes[#lbm_nodes + 1] = mname .. ":" .. pname .. "_" .. i
end
minetest.register_node(":" .. mname .. ":" .. pname .. "_" .. i, {
drawtype = "plantlike",
waving = 1,
tiles = {mname .. "_" .. pname .. "_" .. i .. ".png"},
paramtype = "light",
paramtype2 = def.paramtype2 or nil,
place_param2 = def.place_param2 or nil,
walkable = false,
buildable_to = true,
drop = drop,
selection_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},
},
groups = nodegroups,
sounds = default.node_sound_leaves_defaults(),
next_plant = next_plant,
on_timer = farming.grow_plant,
minlight = def.minlight,
maxlight = def.maxlight,
})
end
-- replacement LBM for pre-nodetimer plants
minetest.register_lbm({
name = ":" .. mname .. ":start_nodetimer_" .. pname,
nodenames = lbm_nodes,
action = function(pos, node)
tick_again(pos)
end,
})
-- Return
local r = {
seed = mname .. ":seed_" .. pname,
harvest = mname .. ":" .. pname
}
return r
end

View File

@ -0,0 +1,3 @@
default
wool
stairs

View File

@ -0,0 +1,36 @@
farming.register_hoe(":farming:hoe_wood", {
description = "Wooden Hoe",
inventory_image = "farming_tool_woodhoe.png",
max_uses = 30,
material = "group:wood",
groups = {flammable = 2},
})
farming.register_hoe(":farming:hoe_stone", {
description = "Stone Hoe",
inventory_image = "farming_tool_stonehoe.png",
max_uses = 90,
material = "group:stone"
})
farming.register_hoe(":farming:hoe_steel", {
description = "Steel Hoe",
inventory_image = "farming_tool_steelhoe.png",
max_uses = 500,
material = "default:steel_ingot"
})
farming.register_hoe(":farming:gold_mese", {
description = "Gold Hoe",
inventory_image = "farming_tool_goldhoe.png",
max_uses = 350,
material = "default:gold_ingot"
})
farming.register_hoe(":farming:hoe_diamond", {
description = "Diamond Hoe",
inventory_image = "farming_tool_diamondhoe.png",
max_uses = 1000,
material = "default:diamond"
})

View File

@ -0,0 +1,140 @@
-- Global farming namespace
farming = {}
farming.path = minetest.get_modpath("farming")
-- Load files
dofile(farming.path .. "/api.lua")
dofile(farming.path .. "/nodes.lua")
dofile(farming.path .. "/hoes.lua")
-- WHEAT
farming.register_plant("farming:wheat", {
description = "Wheat Seed",
paramtype2 = "meshoptions",
inventory_image = "farming_wheat_seed.png",
steps = 8,
minlight = 13,
maxlight = default.LIGHT_MAX,
fertility = {"grassland"},
groups = {food_wheat = 1, flammable = 4},
place_param2 = 3,
})
minetest.register_craftitem("farming:flour", {
description = "Flour",
inventory_image = "farming_flour.png",
groups = {food_flour = 1, flammable = 1},
})
minetest.register_craftitem("farming:bread", {
description = "Bread",
inventory_image = "farming_bread.png",
on_use = minetest.item_eat(5),
groups = {food_bread = 1, flammable = 2},
})
minetest.register_craft({
type = "shapeless",
output = "farming:flour",
recipe = {"farming:wheat", "farming:wheat", "farming:wheat"}
})
minetest.register_craft({
type = "cooking",
cooktime = 15,
output = "farming:bread",
recipe = "farming:flour"
})
-- String
minetest.register_craftitem("farming:string",{
description = "String",
inventory_image = "farming_string.png",
groups = {materials = 1},
})
-- Cotton
--[[farming.register_plant("farming:cotton", {
description = "Cotton Seed",
inventory_image = "farming_cotton_seed.png",
steps = 8,
minlight = 13,
maxlight = default.LIGHT_MAX,
fertility = {"grassland", "desert"},
groups = {flammable = 4},
})
minetest.register_craft({
output = "wool:white",
recipe = {
{"farming:cotton", "farming:cotton"},
{"farming:cotton", "farming:cotton"},
}
})
minetest.register_craft({
output = "farming:string 2",
recipe = {
{"farming:cotton"},
{"farming:cotton"},
}
})
]]
-- Straw
minetest.register_craft({
output = "farming:straw 3",
recipe = {
{"farming:wheat", "farming:wheat", "farming:wheat"},
{"farming:wheat", "farming:wheat", "farming:wheat"},
{"farming:wheat", "farming:wheat", "farming:wheat"},
}
})
minetest.register_craft({
output = "farming:wheat 3",
recipe = {
{"farming:straw"},
}
})
-- Fuels
minetest.register_craft({
type = "fuel",
recipe = "farming:straw",
burntime = 3,
})
minetest.register_craft({
type = "fuel",
recipe = "farming:wheat",
burntime = 1,
})
minetest.register_craft({
type = "fuel",
recipe = "farming:cotton",
burntime = 1,
})
minetest.register_craft({
type = "fuel",
recipe = "farming:string",
burntime = 1,
})
minetest.register_craft({
type = "fuel",
recipe = "farming:hoe_wood",
burntime = 5,
})

View File

@ -0,0 +1,26 @@
License of source code
----------------------
The MIT License (MIT)
Copyright (C) 2012-2016 PilzAdam
Copyright (C) 2014-2016 webdesigner97
Copyright (C) 2012-2016 Various Minetest developers and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software, and to permit
persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
For more details:
https://opensource.org/licenses/MIT

View File

@ -0,0 +1,171 @@
minetest.override_item("default:dirt", {
soil = {
base = "default:dirt",
dry = "farming:soil",
wet = "farming:soil_wet"
}
})
minetest.override_item("default:dirt_with_grass", {
soil = {
base = "default:dirt_with_grass",
dry = "farming:soil",
wet = "farming:soil_wet"
}
})
minetest.override_item("default:dirt_with_dry_grass", {
soil = {
base = "default:dirt_with_dry_grass",
dry = "farming:soil",
wet = "farming:soil_wet"
}
})
--[[minetest.override_item("default:dirt_with_rainforest_litter", {
soil = {
base = "default:dirt_with_rainforest_litter",
dry = "farming:soil",
wet = "farming:soil_wet"
}
})
minetest.override_item("default:dirt_with_coniferous_litter", {
soil = {
base = "default:dirt_with_coniferous_litter",
dry = "farming:soil",
wet = "farming:soil_wet"
}
})]]--
minetest.register_node("farming:soil", {
description = "Soil",
tiles = {"farming_soil.png", "default_dirt.png"},
drop = "default:dirt",
groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1},
sounds = default.node_sound_dirt_defaults(),
soil = {
base = "default:dirt",
dry = "farming:soil",
wet = "farming:soil_wet"
}
})
minetest.register_node("farming:soil_wet", {
description = "Wet Soil",
tiles = {"farming_soil_wet.png", "default_dirt.png"},
drop = "default:dirt",
groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1},
sounds = default.node_sound_dirt_defaults(),
soil = {
base = "default:dirt",
dry = "farming:soil",
wet = "farming:soil_wet"
}
})
--[[minetest.override_item("default:desert_sand", {
groups = {crumbly=3, falling_node=1, sand=1, soil = 1},
soil = {
base = "default:desert_sand",
dry = "farming:desert_sand_soil",
wet = "farming:desert_sand_soil_wet"
}
})
minetest.register_node("farming:desert_sand_soil", {
description = "Desert Sand Soil",
drop = "default:desert_sand",
tiles = {"farming_desert_sand_soil.png", "default_red_sand.png"},
groups = {crumbly=3, not_in_creative_inventory = 1, falling_node=1, sand=1, soil = 2, desert = 1, field = 1},
sounds = default.node_sound_sand_defaults(),
soil = {
base = "default:desert_sand",
dry = "farming:desert_sand_soil",
wet = "farming:desert_sand_soil_wet"
}
})
minetest.register_node("farming:desert_sand_soil_wet", {
description = "Wet Desert Sand Soil",
drop = "default:desert_sand",
tiles = {"farming_desert_sand_soil_wet.png", "farming_desert_sand_soil_wet_side.png"},
groups = {crumbly=3, falling_node=1, sand=1, not_in_creative_inventory=1, soil=3, wet = 1, desert = 1, field = 1},
sounds = default.node_sound_sand_defaults(),
soil = {
base = "default:desert_sand",
dry = "farming:desert_sand_soil",
wet = "farming:desert_sand_soil_wet"
}
})]]
minetest.register_node("farming:straw", {
description = "Straw",
tiles = {"farming_straw_side.png", "farming_straw_top.png"},
is_ground_content = false,
groups = {snappy=3, flammable=4, fall_damage_add_percent=-30},
sounds = default.node_sound_leaves_defaults(),
})
--[[stairs.register_stair_and_slab(
"straw",
"farming:straw",
{snappy = 3, flammable = 4},
{"farming_straw.png"},
"Straw Stair",
"Straw Slab",
default.node_sound_leaves_defaults(),
true
)]]--
minetest.register_abm({
label = "Farming soil",
nodenames = {"group:field"},
interval = 15,
chance = 4,
action = function(pos, node)
local n_def = minetest.registered_nodes[node.name] or nil
local wet = n_def.soil.wet or nil
local base = n_def.soil.base or nil
local dry = n_def.soil.dry or nil
if not n_def or not n_def.soil or not wet or not base or not dry then
return
end
pos.y = pos.y + 1
local nn = minetest.get_node_or_nil(pos)
if not nn or not nn.name then
return
end
local nn_def = minetest.registered_nodes[nn.name] or nil
pos.y = pos.y - 1
if nn_def and nn_def.walkable and minetest.get_item_group(nn.name, "plant") == 0 then
minetest.set_node(pos, {name = base})
return
end
-- check if there is water nearby
local wet_lvl = minetest.get_item_group(node.name, "wet")
if minetest.find_node_near(pos, 3, {"group:water"}) then
-- if it is dry soil and not base node, turn it into wet soil
if wet_lvl == 0 then
minetest.set_node(pos, {name = wet})
end
else
-- only turn back if there are no unloaded blocks (and therefore
-- possible water sources) nearby
if not minetest.find_node_near(pos, 3, {"ignore"}) then
-- turn it back into base if it is already dry
if wet_lvl == 0 then
-- only turn it back if there is no plant/seed on top of it
if minetest.get_item_group(nn.name, "plant") == 0 and minetest.get_item_group(nn.name, "seed") == 0 then
minetest.set_node(pos, {name = base})
end
-- if its wet turn it back into dry soil
elseif wet_lvl == 1 then
minetest.set_node(pos, {name = dry})
end
end
end
end,
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

Before

Width:  |  Height:  |  Size: 499 B

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 834 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 861 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

View File

@ -25,13 +25,10 @@ if minetest.get_modpath("mobs") then
register_food("mobs:chicken_cooked", 6) register_food("mobs:chicken_cooked", 6)
register_food("mobs:chicken_raw", 2, "", 3) register_food("mobs:chicken_raw", 2, "", 3)
register_food("mobs:chicken_egg_fried", 2) register_food("mobs:chicken_egg_fried", 2)
register_food("mobs_monster:rotten_flesh", 1, "", 4)
if minetest.get_modpath("bucket") then if minetest.get_modpath("bucket") then
register_food("mobs:bucket_milk", 3, "bucket:bucket_empty") register_food("mobs:bucket_milk", 3, "bucket:bucket_empty")
end end
else
register_food("mobs:meat", 6)
register_food("mobs:meat_raw", 3)
register_food("mobs:rat_cooked", 5)
end end
end end

View File

@ -1,55 +1,47 @@
local age = 1 --how old an item has to be before collecting
local radius_magnet = 2.5 --radius of item magnet
local player_collect_height = 1.3 --added to their pos y value
local adjuster_collect = 0.01 --Delay before collecting to visualize moveme
--Item collection --Item collection
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function(dtime)
--basic settings --collection
local age = 1 --how old an item has to be before collecting
local radius_magnet = 2.0 --radius of item magnet
local radius_collect = 0.3 --radius of collection
local player_collect_height = 1.2 --added to their pos y value
for _,player in ipairs(minetest.get_connected_players()) do for _,player in ipairs(minetest.get_connected_players()) do
--don't magnetize to dead players
if player:get_hp() > 0 then if player:get_hp() > 0 then
local pos = player:get_pos() local pos = player:get_pos()
local inv = player:get_inventory() local inv = player:get_inventory()
--collection --radial detection
for _,object in ipairs(minetest.env:get_objects_inside_radius({x=pos.x,y=pos.y + player_collect_height,z=pos.z}, radius_collect)) do for _,object in ipairs(minetest.env:get_objects_inside_radius({x=pos.x,y=pos.y + player_collect_height,z=pos.z}, radius_magnet)) do
if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
if object:get_luaentity().age > age then if object:get_luaentity().age > age then
if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
--collect
if object:get_luaentity().collectioner == true and object:get_luaentity().age > age and object:get_luaentity().age > object:get_luaentity().age_stamp + adjuster_collect then
if object:get_luaentity().itemstring ~= "" then if object:get_luaentity().itemstring ~= "" then
inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) inv:add_item("main", ItemStack(object:get_luaentity().itemstring))
minetest.sound_play("item_drop_pickup", { minetest.sound_play("item_drop_pickup", {
pos = pos, pos = pos,
max_hear_distance = 50, max_hear_distance = 15,
gain = 0.1, gain = 0.1,
}) })
object:get_luaentity().itemstring = "" object:get_luaentity().itemstring = ""
object:remove() object:remove()
end end
--magnet
else
--moveto for extreme speed boost
local pos1 = pos
pos1.y = pos1.y + player_collect_height
object:moveto(pos1)
object:get_luaentity().collectioner = true
object:get_luaentity().age_stamp = object:get_luaentity().age
end end
end end
end end
end end
--magnet
for _,object in ipairs(minetest.env:get_objects_inside_radius({x=pos.x,y=pos.y + player_collect_height,z=pos.z}, radius_magnet)) do
if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
if object:get_luaentity().age > age then
if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
local pos1 = pos
local pos2 = object:getpos()
local vec = {x=pos1.x-pos2.x, y=(pos1.y+player_collect_height)-pos2.y, z=pos1.z-pos2.z}
vec.x = pos2.x + (vec.x/2)
vec.y = pos2.y + (vec.y/2)
vec.z = pos2.z + (vec.z/2)
object:moveto(vec)
object:get_luaentity().physical_state = false
object:get_luaentity().object:set_properties({
physical = false
})
end
end
end
end end
end end
end end
@ -59,10 +51,6 @@ end)
--This only works in survival --This only works in survival
if minetest.setting_getbool("creative_mode") == false then if minetest.setting_getbool("creative_mode") == false then
function minetest.handle_node_drops(pos, drops, digger) function minetest.handle_node_drops(pos, drops, digger)
local inv
if minetest.setting_getbool("creative_mode") and digger and digger:is_player() then
inv = digger:get_inventory()
end
for _,item in ipairs(drops) do for _,item in ipairs(drops) do
local count, name local count, name
if type(item) == "string" then if type(item) == "string" then
@ -72,52 +60,28 @@ if minetest.setting_getbool("creative_mode") == false then
count = item:get_count() count = item:get_count()
name = item:get_name() name = item:get_name()
end end
if not inv or not inv:contains_item("main", ItemStack(name)) then --if not inv or not inv:contains_item("main", ItemStack(name)) then
for i=1,count do for i=1,count do
local obj = minetest.env:add_item(pos, name) local obj = minetest.add_item(pos, name)
if obj ~= nil then if obj ~= nil then
--obj:get_luaentity().timer =
obj:get_luaentity().collect = true obj:get_luaentity().collect = true
local x = math.random(1, 5) obj:get_luaentity().age = age
if math.random(1,2) == 1 then obj:setvelocity({x=math.random(-3,3), y=math.random(2,5), z=math.random(-3,3)})
x = -x
end
local z = math.random(1, 5)
if math.random(1,2) == 1 then
z = -z
end
obj:setvelocity({x=1/x, y=obj:get_velocity().y, z=1/z})
obj:get_luaentity().age = 0.6
-- FIXME this doesnt work for deactiveted objects
if minetest.setting_get("remove_items") and tonumber(minetest.setting_get("remove_items")) then
minetest.after(tonumber(minetest.setting_get("remove_items")), function(obj)
obj:remove()
end, obj)
end
end
end
end end
end end
end
end end
end end
--throw items using player's velocity
--Throw items using player's velocity
function minetest.item_drop(itemstack, dropper, pos) function minetest.item_drop(itemstack, dropper, pos)
--do this to prevent dispensers and other things using this function from breaking
--check if player
local is_player = false
if dropper then
if minetest.get_player_information(dropper:get_player_name()) then
is_player = true
end
end
--if player then do modified item drop --if player then do modified item drop
if dropper and is_player == true then if dropper and minetest.get_player_information(dropper:get_player_name()) then
local v = dropper:get_look_dir() local v = dropper:get_look_dir()
local vel = dropper:get_player_velocity() local vel = dropper:get_player_velocity()
local p = {x=pos.x, y=pos.y+1.3, z=pos.z} local p = {x=pos.x, y=pos.y+player_collect_height, z=pos.z}
local item = itemstack:to_string() local item = itemstack:to_string()
local obj = core.add_item(p, item) local obj = core.add_item(p, item)
if obj then if obj then
@ -126,25 +90,21 @@ function minetest.item_drop(itemstack, dropper, pos)
v.z = (v.z*5)+vel.z v.z = (v.z*5)+vel.z
obj:setvelocity(v) obj:setvelocity(v)
obj:get_luaentity().dropped_by = dropper:get_player_name() obj:get_luaentity().dropped_by = dropper:get_player_name()
--obj:get_luaentity().collect = true
itemstack:clear() itemstack:clear()
return itemstack return itemstack
end end
else --if machine then use default item drop to not break mods - also extend reach --machine
else
local v = dropper:get_look_dir() local v = dropper:get_look_dir()
local p = {x=pos.x+v.x, y=pos.y+1.5+v.y, z=pos.z+v.z} local item = itemstack:to_string()
local cs = itemstack:get_count() local obj = minetest.add_item({x=pos.x,y=pos.y+1.5,z=pos.z}, item) --{x=pos.x+v.x,y=pos.y+v.y+1.5,z=pos.z+v.z}
if dropper:get_player_control().sneak then if obj then
cs = 1 v.x = (v.x*5)
end v.y = (v.y*5)
local item = itemstack:take_item(cs) v.z = (v.z*5)
local obj = core.add_item(p, item)
if obj then
v.x = v.x*5
v.y = v.y*5 + 2
v.z = v.z*5
obj:setvelocity(v) obj:setvelocity(v)
obj:get_luaentity().dropped_by = dropper:get_player_name() obj:get_luaentity().dropped_by = nil
itemstack:clear()
return itemstack return itemstack
end end
end end

View File

@ -38,6 +38,7 @@
hp_max = 15, hp_max = 15,
armor = 100, armor = 100,
knock_back = 1, knock_back = 1,
water_damage = 0,
lava_damage = 10, lava_damage = 10,
fall_damage = 5, fall_damage = 5,
makes_footstep_sound = true, makes_footstep_sound = true,

View File

@ -21,7 +21,7 @@ mobs:register_mob("mobs_animal:chicken", {
drops = { drops = {
{name = "mobs:chicken_raw", chance = 1, min = 1, max = 1}, {name = "mobs:chicken_raw", chance = 1, min = 1, max = 1},
}, },
water_damage = 1, water_damage = 0,
lava_damage = 5, lava_damage = 5,
light_damage = 0, light_damage = 0,
fall_damage = 0, fall_damage = 0,
@ -35,7 +35,7 @@ mobs:register_mob("mobs_animal:chicken", {
run_start = 60, run_start = 60,
run_end = 80, run_end = 80,
}, },
follow = {"farming:seed_wheat", "farming:seed_cotton"}, follow = {"farming:seed_wheat"},
view_range = 5, view_range = 5,
on_rightclick = function(self, clicker) on_rightclick = function(self, clicker)

View File

@ -31,7 +31,7 @@ mobs:register_mob("mobs_animal:cow", {
{name = "mobs:leather", chance = 2, min = 1, max = 1}, {name = "mobs:leather", chance = 2, min = 1, max = 1},
{name = "mobs:leather", chance = 2, min = 1, max = 1} {name = "mobs:leather", chance = 2, min = 1, max = 1}
}, },
water_damage = 1, water_damage = 0,
lava_damage = 5, lava_damage = 5,
light_damage = 0, light_damage = 0,
animation = { animation = {

View File

@ -34,6 +34,7 @@
hp_max = 10, hp_max = 10,
armor = 100, armor = 100,
knock_back = 2, knock_back = 2,
water_damage = 0,
lava_damage = 5, lava_damage = 5,
fall_damage = 4, fall_damage = 4,
makes_footstep_sound = true, makes_footstep_sound = true,
@ -107,6 +108,7 @@ mobs:register_egg("mobs_animal:wolf", "Wolf", "wool_grey.png", 1)
hp_max = 25, hp_max = 25,
armor = 100, armor = 100,
knock_back = 2, knock_back = 2,
water_damage = 0,
lava_damage = 5, lava_damage = 5,
fall_damage = 5, fall_damage = 5,
makes_footstep_sound = true, makes_footstep_sound = true,

View File

@ -26,9 +26,9 @@ mobs:register_mob("mobs_animal:kitten", {
run_velocity = 2, run_velocity = 2,
runaway = true, runaway = true,
jump = false, jump = false,
--drops = { drops = {
-- {name = "farming:string", chance = 1, min = 1, max = 1}, {name = "farming:string", chance = 1, min = 1, max = 1},
--}, },
water_damage = 1, water_damage = 1,
lava_damage = 5, lava_damage = 5,
fear_height = 3, fear_height = 3,

View File

@ -35,7 +35,7 @@ mobs:register_mob("mobs_animal:pig", {
{name = "mobs:pork_raw", {name = "mobs:pork_raw",
chance = 2, min = 1, max = 1} chance = 2, min = 1, max = 1}
}, },
water_damage = 1, water_damage = 0,
lava_damage = 5, lava_damage = 5,
light_damage = 0, light_damage = 0,
fear_height = 2, fear_height = 2,

View File

@ -22,6 +22,7 @@ local all_colours = {
for _, col in pairs(all_colours) do for _, col in pairs(all_colours) do
mobs:register_mob("mobs_animal:sheep_"..col[1], { mobs:register_mob("mobs_animal:sheep_"..col[1], {
stepheight = 0.6,
type = "animal", type = "animal",
passive = true, passive = true,
hp_min = 6, hp_min = 6,
@ -51,7 +52,7 @@ for _, col in pairs(all_colours) do
{name = "mobs:meat_raw", chance = 2, min = 1, max = 1}, {name = "mobs:meat_raw", chance = 2, min = 1, max = 1},
{name = "wool:"..col[1], chance = 1, min = 1, max = 1} {name = "wool:"..col[1], chance = 1, min = 1, max = 1}
}, },
water_damage = 1, water_damage = 0,
lava_damage = 5, lava_damage = 5,
light_damage = 0, light_damage = 0,
animation = { animation = {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -28,9 +28,9 @@ mobs:register_mob("mobs_monster:spider", {
jump = true, jump = true,
view_range = 15, view_range = 15,
floats = 0, floats = 0,
-- drops = { drops = {
-- {name = "farming:string", {name = "farming:string",
-- chance = 1, min = 1, max = 2}, }, chance = 1, min = 1, max = 2}, },
water_damage = 5, water_damage = 5,
lava_damage = 5, lava_damage = 5,
light_damage = 0, light_damage = 0,
@ -103,9 +103,9 @@ mobs:register_mob("mobs_monster:small_spider", {
jump = true, jump = true,
view_range = 10, view_range = 10,
floats = 0, floats = 0,
-- drops = { drops = {
-- {name = "farming:string", {name = "farming:string",
-- chance = 1, min = 1, max = 1}, }, chance = 1, min = 1, max = 1}, },
water_damage = 5, water_damage = 5,
lava_damage = 5, lava_damage = 5,
light_damage = 0, light_damage = 0,
@ -161,7 +161,6 @@ minetest.register_node(":mobs:cobweb", {
liquid_range = 0, liquid_range = 0,
walkable = false, walkable = false,
groups = {snappy = 1, disable_jump = 1}, groups = {snappy = 1, disable_jump = 1},
--drop = "farming:cotton",
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
}) })

View File

@ -3,7 +3,7 @@
mobs = { mobs = {
mod = "redo", mod = "redo",
version = "20181220", version = "20190402",
invis = minetest.global_exists("invisibility") and invisibility or {}, invis = minetest.global_exists("invisibility") and invisibility or {},
} }
@ -448,9 +448,39 @@ function mobs:line_of_sight(entity, pos1, pos2, stepsize)
return mob_class.line_of_sight(entity, pos1, pos2, stepsize) return mob_class.line_of_sight(entity, pos1, pos2, stepsize)
end end
function mob_class:attempt_flight_correction()
if self:flight_check() then return true end
-- We are not flying in what we are supposed to.
-- See if we can find intended flight medium and return to it
local pos = self.object:get_pos()
local searchnodes = self.fly_in
if type(searchnodes) == "string" then
searchnodes = {self.fly_in}
end
local flyable_nodes = minetest.find_nodes_in_area(
{x = pos.x - r, y = pos.y - r, z = pos.z - r},
{x = pos.x + r, y = pos.y + r, z = pos.z + r},
searchnodes)
if #flyable_nodes < 1 then
return false
end
local escape_target = flyable_nodes[math.random(1,#flyable_nodes)]
local escape_direction = vector.direction(pos, escape_target)
self.object:set_velocity(
vector.multiply(escape_direction, self.run_velocity))
return true
end
-- are we flying in what we are suppose to? (taikedz) -- are we flying in what we are suppose to? (taikedz)
function mob_class:flight_check(pos_w) function mob_class:flight_check()
local def = minetest.registered_nodes[self.standing_in] local def = minetest.registered_nodes[self.standing_in]
@ -483,6 +513,57 @@ function mob_class:flight_check(pos_w)
end end
-- if self.stay_near set then check periodically for nodes and turn to face/move
function mob_class:do_stay_near()
if not self.stay_near then return false end
local pos = self.object:get_pos()
local searchnodes = self.stay_near[1]
local chance = self.stay_near[2] or 10
if random(1, chance) > 1 then
return false
end
if type(searchnodes) == "string" then
searchnodes = {self.stay_near[1]}
end
local r = self.view_range
local nearby_nodes = minetest.find_nodes_in_area(
{x = pos.x - r, y = pos.y - 1, z = pos.z - r},
{x = pos.x + r, y = pos.y + 1, z = pos.z + r},
searchnodes)
if #nearby_nodes < 1 then
return false
end
local target = nearby_nodes[math.random(1, #nearby_nodes)]
local direction = vector.direction(pos, target)
local vec = {
x = target.x - pos.x,
z = target.z - pos.z
}
yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate
if target.x > pos.x then
yaw = yaw + pi
end
yaw = self:set_yaw(yaw, 4)
self:set_animation("walk")
self:set_velocity(self.walk_velocity)
return true
end
-- custom particle effects -- custom particle effects
local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow) local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow)
@ -533,7 +614,6 @@ function mob_class:update_tag()
nametag = self.nametag, nametag = self.nametag,
nametag_color = col nametag_color = col
}) })
end end
@ -970,6 +1050,7 @@ local entity_physics = function(pos, radius)
obj_pos = objs[n]:get_pos() obj_pos = objs[n]:get_pos()
dist = get_distance(pos, obj_pos) dist = get_distance(pos, obj_pos)
if dist < 1 then dist = 1 end if dist < 1 then dist = 1 end
local damage = floor((4 / dist) * radius) local damage = floor((4 / dist) * radius)
@ -1804,8 +1885,10 @@ function mob_class:follow_flop()
-- swimmers flop when out of their element, and swim again when back in -- swimmers flop when out of their element, and swim again when back in
if self.fly then if self.fly then
local s = self.object:get_pos() local s = self.object:get_pos()
if not self:flight_check(s) then
if not self:attempt_flight_correction() then
self.state = "flop" self.state = "flop"
self.object:set_velocity({x = 0, y = -5, z = 0}) self.object:set_velocity({x = 0, y = -5, z = 0})
@ -2168,7 +2251,7 @@ function mob_class:do_states(dtime)
local p_y = floor(p2.y + 1) local p_y = floor(p2.y + 1)
local v = self.object:get_velocity() local v = self.object:get_velocity()
if self:flight_check(s) then if self:flight_check() then
if me_y < p_y then if me_y < p_y then
@ -2565,7 +2648,7 @@ end
if tr then if tr then
if weapon_def.original_description then if weapon_def.original_description then
weapon:add_wear(toolranks.new_afteruse(weapon, hitter, nil, {wear = wear})) toolranks.new_afteruse(weapon, hitter, nil, {wear = wear})
end end
else else
weapon:add_wear(wear) weapon:add_wear(wear)
@ -2803,6 +2886,12 @@ function mob_class:mob_activate(staticdata, def, dtime)
self[_] = stat self[_] = stat
end end
end end
-- force current model into mob
self.mesh = def.mesh
self.base_mesh = def.mesh
self.collisionbox = def.collisionbox
self.selectionbox = def.selectionbox
-- select random texture, set model and size -- select random texture, set model and size
if not self.base_texture then if not self.base_texture then
@ -2874,7 +2963,7 @@ function mob_class:mob_activate(staticdata, def, dtime)
end end
if self.health == 0 then if self.health == 0 then
self.health = random (self.hp_min, self.hp_max) self.health = random(self.hp_min, self.hp_max)
end end
-- pathfinding init -- pathfinding init
@ -2917,7 +3006,7 @@ function mob_class:mob_activate(staticdata, def, dtime)
-- run after_activate -- run after_activate
if def.after_activate then if def.after_activate then
def:after_activate(staticdata, def, dtime) def.after_activate(self, staticdata, def, dtime)
end end
if use_cmi then if use_cmi then
@ -3107,7 +3196,8 @@ function mob_class:on_step(dtime)
self:do_jump() self:do_jump()
self:do_runaway_from(self) self:do_runaway_from(self)
self:do_stay_near()
end end
@ -3217,6 +3307,7 @@ minetest.register_entity(name, setmetatable({
runaway_from = def.runaway_from, runaway_from = def.runaway_from,
owner_loyal = def.owner_loyal, owner_loyal = def.owner_loyal,
pushable = def.pushable, pushable = def.pushable,
stay_near = def.stay_near,
on_spawn = def.on_spawn, on_spawn = def.on_spawn,
@ -3291,7 +3382,8 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light,
end end
minetest.log("action", minetest.log("action",
string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) string.format("[mobs] Chance setting for %s changed to %s (total: %s)",
name, chance, aoc))
end end
@ -3910,12 +4002,12 @@ function mobs:protect(self, clicker)
end end
if self.tamed == false then if self.tamed == false then
minetest.chat_send_player(name, S("Not tamed!")) minetest.chat_send_player(name, "Not tamed!")
return true -- false return true -- false
end end
if self.protected == true then if self.protected == true then
minetest.chat_send_player(name, S("Already protected!")) minetest.chat_send_player(name, "Already protected!")
return true -- false return true -- false
end end
@ -3943,12 +4035,9 @@ local mob_sta = {}
-- feeding, taming and breeding (thanks blert2112) -- feeding, taming and breeding (thanks blert2112)
function mobs:feed_tame(self, clicker, feed_count, breed, tame) function mobs:feed_tame(self, clicker, feed_count, breed, tame)
if not self.follow then
return false
end
-- can eat/tame with item in hand -- can eat/tame with item in hand
if self:follow_holding(clicker) then if self.follow
and self:follow_holding(clicker) then
-- if not in creative then take item -- if not in creative then take item
if not mobs.is_creative(clicker:get_player_name()) then if not mobs.is_creative(clicker:get_player_name()) then
@ -3991,6 +4080,7 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame)
-- feed and tame -- feed and tame
self.food = (self.food or 0) + 1 self.food = (self.food or 0) + 1
if self.food >= feed_count then if self.food >= feed_count then
self.food = 0 self.food = 0
@ -3999,8 +4089,6 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame)
self.horny = true self.horny = true
end end
self.gotten = false
if tame then if tame then
if self.tamed == false then if self.tamed == false then
@ -4017,7 +4105,7 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame)
end end
-- make sound when fed so many times -- make sound when fed so many times
self:mob_sound(self.sounds.random) --self:mob_sound(self.sounds.random)
end end
return true return true

View File

@ -75,9 +75,9 @@ minetest.register_tool("mobs:lasso", {
minetest.register_craft({ minetest.register_craft({
output = "mobs:lasso", output = "mobs:lasso",
recipe = { recipe = {
{"default:string", "", "default:string"}, {"farming:string", "", "farming:string"},
{"", "default:diamond", ""}, {"", "default:diamond", ""},
{"default:string", "", "default:string"}, {"farming:string", "", "farming:string"},
} }
}) })

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 B

After

Width:  |  Height:  |  Size: 89 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 B

After

Width:  |  Height:  |  Size: 85 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 B

After

Width:  |  Height:  |  Size: 81 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 B

After

Width:  |  Height:  |  Size: 87 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 B

After

Width:  |  Height:  |  Size: 83 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 B

After

Width:  |  Height:  |  Size: 92 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 B

After

Width:  |  Height:  |  Size: 81 B

Some files were not shown because too many files have changed in this diff Show More