Add files via upload

master
Skandarella 2021-04-08 11:31:11 +02:00 committed by GitHub
commit dc1f2e227b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 6969 additions and 0 deletions

30
LICENSE Normal file
View File

@ -0,0 +1,30 @@
MIT License
Copyright (c) 2021 Skandarella
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.
Lincense for original Code (mobs redo + mobs_animal + mob_horse + mobs_npc): (MIT) Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1
Modified Code by Liil/Wilhelmine/Skandarella (c) 2021
Textures, Models and Animation by Liil/Wilhelmine/Skandarella under (MIT) License (c) 2021
Human Sounds by Liil/Wilhelmine/Skandarella. Animal Sounds + Environment are from freesound.org under Creative Commons License.
Thanks to Roboroo, www-Bonson, Mixmasterdylan, Jarl Fenrir, Mafon2, Hamface, InspectorJ, Breviceps, Starcat 322 and Roman cgr!

65
arcticblocks.lua Normal file
View File

@ -0,0 +1,65 @@
minetest.register_node("nativevillages:sledge", {
description = "Sledge",
visual_scale = 1,
mesh = "Sledge.b3d",
tiles = {"texturesledge.png"},
inventory_image = "asledge.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -1.3, 0.5, 0.5, 1.3},
--[[{-0.5, -0.5, -1.3, 0.5, 0.5, 1.3},
{-0.5, -0.5, -1.3, 0.5, 0.5, 1.3}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -1.3, 0.5, 0.5, 1.3}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "default:bronzeblock",
recipe = "nativevillages:sledge",
})
minetest.register_node("nativevillages:blanket", {
description = "Blanket",
visual_scale = 1,
mesh = "Blanket.b3d",
tiles = {"textureblanket.png"},
inventory_image = "ablanket.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
--[[{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "mobs:leather",
recipe = "nativevillages:blanket",
})

714
arcticcreatures.lua Normal file
View File

@ -0,0 +1,714 @@
mobs:register_mob("nativevillages:icedog", {
stepheight = 1,
type = "animal",
passive = false,
attack_type = "dogfight",
group_attack = true,
owner_loyal = true,
attack_npcs = false,
reach = 2,
damage = 6,
hp_min = 35,
hp_max = 55,
armor = 100,
collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.95, 0.5},
visual = "mesh",
mesh = "Icedog.b3d",
textures = {
{"textureicedog.png"},
{"textureicedog2.png"},
{"textureicedog3.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_dog2",
attack = "nativevillages_dog",
damage = "nativevillages_dog4",
death = "nativevillages_dog5",
},
walk_velocity = 1,
run_velocity = 3,
jump = true,
jump_height = 3,
pushable = true,
follow = {"mobs:meat_raw", "people:dogfood", "people:dogfood_cooked"},
view_range = 6,
drops = {
},
water_damage = 2,
lava_damage = 5,
light_damage = 0,
fear_height = 2,
animation = {
speed_normal = 80,
stand_speed = 50,
stand_start = 0,
stand_end = 100,
stand2_start = 100,
stand2_end = 200,
walk_start = 200,
walk_end = 300,
punch_start = 300,
punch_end = 400,
die_start = 1, -- we dont have a specific death animation so we will
die_end = 2, -- re-use 2 standing frames at a speed of 1 fps and
die_speed = 1, -- have mob rotate when dying.
die_loop = false,
die_rotate = true,
},
on_rightclick = function(self, clicker)
if mobs:feed_tame(self, clicker, 8, true, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:icedog",
nodes = {"default:snowblock"},
neighbors = {"nativevillages:sledge"},
min_light = 14,
interval = 60,
chance = 8000, -- 15000
active_object_count = 3,
min_height = 1,
max_height = 80,
})
end
mobs:register_egg("nativevillages:icedog", ("Ice Dog"), "aicedog.png")
mobs:alias_mob("nativevillages:icedog", "nativevillages:icedog") -- compatibility
mobs.icesledgetrader_drops = {
"nativevillages:sledgewithdog", "nativevillages:icedog"
}
mobs:register_mob("nativevillages:icesledgetrader", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 40,
hp_max = 80,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Icesledgetrader.b3d",
drawtype = "front",
textures = {
{"textureicesledgetrader.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_icevillagermale2",
random = "nativevillages_icevillagermale",
damage = "nativevillages_icevillagermale4",
death = "nativevillages_icevillagermale3",
distance = 10,
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:sledge",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.icesledgetrader_drops
if item:get_name() == "default:steel_ingot" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.icesledgetrader_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Trader dropped you an item for steel!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("NPC stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("NPC will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:icesledgetrader",
nodes = {"default:snowblock"},
neighbors = {"nativevillages:sledge"},
min_light = 0,
interval = 60,
active_object_count = 1,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:icesledgetrader", ("Sledge Trader"), "aicesledgetrader.png")
mobs.icevillagerfemale_drops = {
"mobs:meat", "mobs:leather", "wool:brown", "wool:white"
}
mobs:register_mob("nativevillages:icevillagerfemale", {
type = "npc",
passive = false,
damage = 1,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 30,
hp_max = 60,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Icevillagerfemale.b3d",
drawtype = "front",
textures = {
{"textureicevillagerfemale.png"},
},
child_texture = {
{"textureicevillagerfemalebaby.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_icevillagerfemale2",
random = "nativevillages_icevillagerfemale",
damage = "nativevillages_icevillagerfemale4",
death = "nativevillages_icevillagerfemale3",
distance = 10,
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:blanket",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.icevillagerfemale_drops
if item:get_name() == "default:iron_lump" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.icevillagerfemale_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Icelander dropped you an item for iron!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Icelander stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Icelander will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:icevillagerfemale",
nodes = {"default:snowblock", "wool:brown"},
neighbors = {"nativevillages:blanket"},
min_light = 0,
interval = 60,
active_object_count = 2,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:icevillagerfemale", ("Female Icelander"), "aicevillagerfemale.png")
mobs.icevillagermale_drops = {
"mobs:meat", "mobs:leather", "wool:brown", "wool:white"
}
mobs:register_mob("nativevillages:icevillagermale", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 30,
hp_max = 70,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Icevillagermale.b3d",
drawtype = "front",
textures = {
{"textureicevillagermale.png"},
},
child_texture = {
{"textureicevillagermalebaby.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_icevillagermale2",
random = "nativevillages_icevillagermale",
damage = "nativevillages_icevillagermale4",
death = "nativevillages_icevillagermale3",
distance = 10,
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:blanket",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.icevillagermale_drops
if item:get_name() == "default:iron_lump" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.icevillagermale_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Icelander dropped you an item for iron!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Icelander stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Icelander will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:icevillagermale",
nodes = {"default:snowblock", "wool:brown"},
neighbors = {"nativevillages:blanket"},
min_light = 0,
interval = 60,
active_object_count = 2,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:icevillagermale", ("Male Icelander"), "aicevillagermale.png")
-- Load support for intllib.
local MP = minetest.get_modpath(minetest.get_current_modname())
local S = minetest.get_translator and minetest.get_translator("nativevillages") or
dofile(MP .. "/intllib.lua")
-- 0.4.17 or 5.0 check
local y_off = 20
if minetest.features.object_independent_selectionbox then
y_off = 10
end
-- horse shoes (speed, jump, break, overlay texture)
local shoes = {
["people:horseshoe_steel"] = {7, 4, 2, "people_horseshoe_steelo.png"},
["people:horseshoe_bronze"] = {7, 4, 4, "people_horseshoe_bronzeo.png"},
["people:horseshoe_mese"] = {9, 5, 8, "people_horseshoe_meseo.png"},
["people:horseshoe_diamond"] = {10, 6, 6, "people_horseshoe_diamondo.png"}
}
-- rideable sledge
mobs:register_mob("nativevillages:sledgewithdog", {
type = "animal",
visual = "mesh",
visual_size = {x = 1, y = 1},
mesh = "Sledgewithdog.b3d",
collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4},
animation = {
speed_normal = 50,
run_speed = 125,
stand_start = 0,
stand_end = 100,
stand2_start = 200,
stand2_end = 300,
walk_speed = 85,
walk_start = 100,
walk_end = 200,
run_start = 100,
run_end = 200,
},
textures = {
{"texturesledgewithdog.png"},
},
fear_height = 3,
runaway = true,
fly = false,
walk_chance = 0.1,
walk_velocity = 1.5,
view_range = 10,
follow = {"mobs:meat_raw", "people:dogfood", "people:dogfood_cooked"},
passive = true,
hp_min = 100,
hp_max = 250,
armor = 100,
lava_damage = 5,
fall_damage = 5,
water_damage = 1,
makes_footstep_sound = true,
sounds = {
random = "nativevillages_dog2",
attack = "nativevillages_dog",
damage = "nativevillages_dog4",
death = "nativevillages_dog5",
},
drops = {
{name = "mobs:leather", chance = 1, min = 0, max = 2}
},
do_custom = function(self, dtime)
-- set needed values if not already present
if not self.v2 then
self.v2 = 0
self.max_speed_forward = 7
self.max_speed_reverse = 2
self.accel = 6
self.terrain_type = 3
self.driver_attach_at = {x = 0, y = 6, z = -17}
self.driver_eye_offset = {x = 0, y = 5, z = -14}
end
-- if driver present allow control of horse
if self.driver then
mobs.drive(self, "walk", "stand", false, dtime)
return false -- skip rest of mob functions
end
return true
end,
on_die = function(self, pos)
-- drop saddle when horse is killed while riding
-- also detach from horse properly
if self.driver then
minetest.add_item(pos, "mobs:saddle")
mobs.detach(self.driver, {x = 1, y = 0, z = 1})
self.saddle = nil
end
-- drop any horseshoes added
if self.shoed then
minetest.add_item(pos, self.shoed)
end
end,
do_punch = function(self, hitter)
-- don't cut the branch you're... ah, that's not about that
if hitter ~= self.driver then
return true
end
end,
on_rightclick = function(self, clicker)
-- make sure player is clicking
if not clicker or not clicker:is_player() then
return
end
-- feed, tame or heal horse
if mobs:feed_tame(self, clicker, 10, true, true) then
return
end
-- applying protection rune
if mobs:protect(self, clicker) then
return
end
local player_name = clicker:get_player_name()
-- make sure tamed horse is being clicked by owner only
if self.tamed and self.owner == player_name then
local inv = clicker:get_inventory()
local tool = clicker:get_wielded_item()
local item = tool:get_name()
-- detatch player already riding horse
if self.driver and clicker == self.driver then
mobs.detach(clicker, {x = 1, y = 0, z = 1})
-- add saddle back to inventory
if inv:room_for_item("main", "mobs:saddle") then
inv:add_item("main", "mobs:saddle")
else
minetest.add_item(clicker:get_pos(), "mobs:saddle")
end
self.saddle = nil
-- attach player to horse
elseif (not self.driver and not self.child
and clicker:get_wielded_item():get_name() == "mobs:saddle")
or self.saddle then
self.object:set_properties({stepheight = 1.1})
mobs.attach(self, clicker)
-- take saddle from inventory
if not self.saddle then
inv:remove_item("main", "mobs:saddle")
end
self.saddle = true
end
-- apply horseshoes
if item:find("people:horseshoe") then
-- drop any existing shoes
if self.shoed then
minetest.add_item(self.object:get_pos(), self.shoed)
end
local speed = shoes[item][1]
local jump = shoes[item][2]
local reverse = shoes[item][3]
local overlay = shoes[item][4]
self.max_speed_forward = speed
self.jump_height = jump
self.max_speed_reverse = reverse
self.accel = speed
self.shoed = item
-- apply horseshoe overlay to current horse texture
if overlay then
self.texture_mods = "^" .. overlay
self.object:set_texture_mod(self.texture_mods)
end
-- show horse speed and jump stats with shoes fitted
minetest.chat_send_player(player_name,
S("Horse shoes fitted -")
.. S(" speed: ") .. speed
.. S(" , jump height: ") .. jump
.. S(" , stop speed: ") .. reverse)
tool:take_item()
clicker:set_wielded_item(tool)
return
end
end
-- used to capture horse with magic lasso
mobs:capture_mob(self, clicker, 0, 0, 80, false, nil)
end,
})
mobs:register_egg("nativevillages:sledgewithdog", S("Sledge with Dog"), "asledwithdog.png")

844
buyablestuff.lua Normal file
View File

@ -0,0 +1,844 @@
mobs:register_mob("nativevillages:tamecatfish", {
stepheight = 1,
type = "animal",
passive = true,
attack_type = "dogfight",
group_attack = true,
owner_loyal = true,
attack_npcs = true,
reach = 2,
damage = 1,
hp_min = 5,
hp_max = 55,
armor = 100,
collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.5, 0.4},
visual = "mesh",
mesh = "Lakecatfish.b3d",
textures = {
{"texturecatfish1.png"},
{"texturecatfish2.png"},
{"texturecatfish3.png"},
{"texturecatfish4.png"},
{"texturecatfish5.png"},
{"texturecatfish6.png"},
},
makes_footstep_sound = true,
sounds = {
},
walk_velocity = 1,
run_velocity = 2,
fly = true,
fly_in = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing",
fall_speed = 0,
jump = true,
jump_height = 0,
pushable = true,
follow = {
"ethereal:worm", "seaweed", "fishing:bait_worm",
"default:grass", "farming:cucumber", "farming:cabbage", "animalworld:ant", "animalworld:termite", "animalworld:fishfood"
},
view_range = 6,
drops = {
{name = "nativevillages:catfish_raw", chance = 1, min = 1, max = 3},
},
water_damage = 0,
air_damage = 1,
lava_damage = 5,
light_damage = 0,
fear_height = 2,
animation = {
speed_normal = 50,
stand_start = 200,
stand_end = 300,
fly_start = 0,
fly_end = 100,
fly2_start = 100,
fly2_end = 200,
die_start = 1, -- we dont have a specific death animation so we will
die_end = 2, -- re-use 2 standing frames at a speed of 1 fps and
die_speed = 1, -- have mob rotate when dying.
die_loop = false,
die_rotate = true,
},
on_rightclick = function(self, clicker)
if mobs:feed_tame(self, clicker, 8, true, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end
end,
})
mobs:register_egg("nativevillages:tamecatfish", ("Domesticated Catfish"), "alakecatfish.png")
mobs:alias_mob("nativevillages:tamecatfish", "nativevillages:tamecatfish") -- compatibility
-- raw catfish
minetest.register_craftitem(":nativevillages:catfish_raw", {
description = ("Raw Catfish"),
inventory_image = "nativevillages_catfish_raw.png",
on_use = minetest.item_eat(4),
groups = {food_meat_raw = 1, flammable = 2},
})
-- cooked catfish
minetest.register_craftitem(":nativevillages:catfish_cooked", {
description = ("Cooked Catfish"),
inventory_image = "nativevillages_catfish_cooked.png",
on_use = minetest.item_eat(8),
groups = {food_meat = 1, flammable = 2},
})
minetest.register_craft({
type = "cooking",
output = "nativevillages:catfish_cooked",
recipe = "nativevillages:catfish_raw",
cooktime = 2,
})
local S = mobs.intllib
mobs:register_mob("nativevillages:zombietame", {
type = "npc",
passive = false,
attack_type = "dogfight",
group_attack = true,
owner_loyal = true,
attack_npcs = false,
reach = 2,
damage = 5,
hp_min = 55,
hp_max = 95,
armor = 100,
attacks_monsters = true,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Zombie2.b3d",
drawtype = "front",
textures = {
{"texturezombietame.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_tamedzombie2",
random = "nativevillages_tamedzombie",
damage = "nativevillages_tamedzombie3",
death = "nativevillages_tamedzombie4",
distance = 10,
},
walk_velocity = 2,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {"nativevillages:driedhumanmeat"},
view_range = 20,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 60,
stand_speed = 50,
stand_start = 300,
stand_end = 400,
walk_start = 100,
walk_end = 200,
walk2_start = 200,
walk2_end = 300,
punch_start = 0,
punch_end = 100,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, S("Zombie stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, S("Zombie will follow you."))
end
end
end,
})
mobs:register_egg("nativevillages:zombietame", S("Tamed Zombie"), "azombietame.png" )
mobs:register_mob("nativevillages:domesticcow", {
type = "animal",
passive = false,
attack_type = "dogfight",
attack_npcs = false,
group_attack = true,
reach = 2,
damage = 4,
hp_min = 5,
hp_max = 55,
armor = 100,
collisionbox = {-0.6, -0.01, -0.4, 0.6, 1.2, 0.4},
visual = "mesh",
mesh = "Grasslandcow.b3d",
textures = {
{"texturegrasslandcow.png"},
{"texturegrasslandcow2.png"},
{"texturegrasslandcow3.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_cow",
attack = "nativevillages_cow2",
damage = "nativevillages_cow3",
},
walk_velocity = 1,
run_velocity = 2,
jump = true,
jump_height = 6,
pushable = true,
drops = {
{name = "mobs:meat_raw", chance = 1, min = 1, max = 3},
{name = "mobs:leather", chance = 1, min = 0, max = 2},
},
water_damage = 0,
lava_damage = 5,
light_damage = 0,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
stand2_start = 100,
stand2_end = 200,
walk_start = 200,
walk_end = 300,
punch_start = 300,
punch_end = 400,
die_start = 1, -- we dont have a specific death animation so we will
die_end = 2, -- re-use 2 standing frames at a speed of 1 fps and
die_speed = 1, -- have mob rotate when dying.
die_loop = false,
die_rotate = true,
},
follow = {
"farming:wheat", "default:grass_1", "farming:barley",
"farming:oat", "farming:rye", "farming:carrot", "farming:beans", "farming:lettuce"
},
view_range = 8,
replace_rate = 10,
replace_what = {
{"group:grass", "air", 0},
{"default:dirt_with_grass", "default:dirt", -1}
},
-- stay_near = {"farming:straw", "group:grass"}, 10},
fear_height = 2,
on_rightclick = function(self, clicker)
-- feed or tame
if mobs:feed_tame(self, clicker, 8, true, true) then
-- if fed 7x wheat or grass then cow can be milked again
if self.food and self.food > 6 then
self.gotten = false
end
return
end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) then return end
local tool = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- milk cow with empty bucket
if tool:get_name() == "bucket:bucket_empty" then
--if self.gotten == true
if self.child == true then
return
end
if self.gotten == true then
minetest.chat_send_player(name,
("Cow already milked!"))
return
end
local inv = clicker:get_inventory()
tool:take_item()
clicker:set_wielded_item(tool)
if inv:room_for_item("main", {name = "nativevillages:bucket_milk"}) then
clicker:get_inventory():add_item("main", "nativevillages:bucket_milk")
else
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
minetest.add_item(pos, {name = "nativevillages:bucket_milk"})
end
self.gotten = true -- milked
return
end
end,
on_replace = function(self, pos, oldnode, newnode)
self.food = (self.food or 0) + 1
-- if cow replaces 8x grass then it can be milked again
if self.food >= 8 then
self.food = 0
self.gotten = false
end
end,
})
mobs:register_egg("nativevillages:domesticcow", ("Domesticated Cow"), "agrasslandcow.png")
mobs:alias_mob("nativevillages:domesticcow", "nativevillages:domesticcow") -- compatibility
-- bucket of milk
minetest.register_craftitem(":nativevillages:bucket_milk", {
description = ("Bucket of Milk"),
inventory_image = "nativevillages_bucket_milk.png",
stack_max = 1,
on_use = minetest.item_eat(8, "bucket:bucket_empty"),
groups = {food_milk = 1, flammable = 3, drink = 1},
})
-- glass of milk
minetest.register_craftitem(":mobs:glass_milk", {
description = ("Glass of Milk"),
inventory_image = "mobs_glass_milk.png",
on_use = minetest.item_eat(2, "vessels:drinking_glass"),
groups = {food_milk_glass = 1, flammable = 3, vessel = 1, drink = 1},
})
minetest.register_craft({
type = "shapeless",
output = "mobs:glass_milk 4",
recipe = {
"vessels:drinking_glass", "vessels:drinking_glass",
"vessels:drinking_glass", "vessels:drinking_glass",
"nativevillages:bucket_milk"
},
replacements = { {"nativevillages:bucket_milk", "bucket:bucket_empty"} }
})
minetest.register_craft({
type = "shapeless",
output = "nativevillages:bucket_milk",
recipe = {
"group:food_milk_glass", "group:food_milk_glass",
"group:food_milk_glass", "group:food_milk_glass",
"bucket:bucket_empty"
},
replacements = {
{"group:food_milk_glass", "vessels:drinking_glass 4"},
}
})
-- butter
minetest.register_craftitem(":nativevillages:butter", {
description = ("Butter"),
inventory_image = "nativevillages_butter.png",
on_use = minetest.item_eat(1),
groups = {food_butter = 1, flammable = 2},
})
if minetest.get_modpath("farming") and farming and farming.mod then
minetest.register_craft({
type = "shapeless",
output = "nativevillages:butter",
recipe = {"nativevillages:bucket_milk", "farming:salt"},
replacements = {{ "nativevillages:bucket_milk", "bucket:bucket_empty"}}
})
else -- some saplings are high in sodium so makes a good replacement item
minetest.register_craft({
type = "shapeless",
output = "nativevillages:butter",
recipe = {"nativevillages:bucket_milk", "default:sapling"},
replacements = {{ "nativevillages:bucket_milk", "bucket:bucket_empty"}}
})
end
-- cheese wedge
minetest.register_craftitem(":nativevillages:cheese", {
description = ("Mozzarella Cheese"),
inventory_image = "nativevillages_cheese.png",
on_use = minetest.item_eat(4),
groups = {food_cheese = 1, flammable = 2},
})
minetest.register_craft({
type = "cooking",
output = "nativevillages:cheese",
recipe = "nativevillages:bucket_milk",
cooktime = 5,
replacements = {{ "nativevillages:bucket_milk", "bucket:bucket_empty"}}
})
-- cheese block
minetest.register_node(":nativevillages:cheeseblock", {
description = ("Mozzarella Cheese Block"),
tiles = {"nativevillages_cheeseblock.png"},
is_ground_content = false,
groups = {crumbly = 3},
sounds = default.node_sound_dirt_defaults()
})
minetest.register_craft({
output = "nativevillages:cheeseblock",
recipe = {
{"nativevillages:cheese", "nativevillages:cheese", "nativevillages:cheese"},
{"nativevillages:cheese", "nativevillages:cheese", "nativevillages:cheese"},
{"nativevillages:cheese", "nativevillages:cheese", "nativevillages:cheese"},
}
})
minetest.register_craft({
output = "nativevillages:cheese 9",
recipe = {
{"nativevillages:cheeseblock"},
}
})
mobs:register_mob("nativevillages:desertchickentame", {
stepheight = 1,
type = "animal",
passive = true,
attack_type = "dogfight",
group_attack = false,
owner_loyal = true,
attack_npcs = false,
reach = 2,
damage = 1,
hp_min = 10,
hp_max = 25,
armor = 100,
collisionbox = {-0.4, -0.01, -0.3, 0.4, 0.8, 0.4},
visual = "mesh",
mesh = "Desertchicken.b3d",
textures = {
{"texturedesertchicken.png"},
},
child_texture = {
{"desertchicken.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_chicken",
damage = "nativevillages_chicken2",
death = "nativevillages_chicken3",
},
walk_velocity = 0.5,
run_velocity = 3,
runaway = true,
runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:scorpion"},
drops = {
{name = "nativevillages:chicken_raw", chance = 1, min = 1, max = 1},
},
water_damage = 1,
lava_damage = 5,
light_damage = 0,
fear_height = 3,
animation = {
speed_normal = 75,
stand_start = 0,
stand_end = 100,
stand2_start = 100,
stand2_end = 200,
walk_start = 200,
walk_end = 300,
},
follow = {
"farming:seed_wheat", "farming:seed_cotton", "farming:seed_barley",
"farming:seed_oat", "farming:seed_rye"
},
view_range = 10,
on_rightclick = function(self, clicker)
if mobs:feed_tame(self, clicker, 8, true, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 30, 50, 80, false, nil) then return end
end,
do_custom = function(self, dtime)
self.egg_timer = (self.egg_timer or 0) + dtime
if self.egg_timer < 10 then
return
end
self.egg_timer = 0
if self.child
or math.random(1, 100) > 1 then
return
end
local pos = self.object:get_pos()
minetest.add_item(pos, "mobs:egg")
minetest.sound_play("default_place_node_hard", {
pos = pos,
gain = 1.0,
max_hear_distance = 5,
})
end,
})
mobs:register_egg("nativevillages:desertchickentame", ("Domesticated Desert Chicken"), "adesertchicken.png", 0)
local S = mobs.intllib
mobs:register_mob("nativevillages:maleliontame", {
type = "npc",
passive = false,
attack_type = "dogfight",
group_attack = true,
owner_loyal = true,
attack_npcs = false,
attack_monsters = true,
reach = 2,
damage = 10,
hp_min = 45,
hp_max = 115,
armor = 100,
collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.95, 0.5},
visual = "mesh",
mesh = "Lionmale.b3d",
drawtype = "front",
textures = {
{"texturelionmale.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_lion2",
random = "nativevillages_lion",
damage = "nativevillages_lion4",
death = "nativevillages_lion3",
distance = 10,
},
walk_velocity = 2,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {
"ethereal:fish_raw", "animalworld:rawfish", "mobs_fish:tropical",
"mobs:meat_raw", "animalworld:rabbit_raw", "animalworld:pork_raw", "water_life:meat_raw", "animalworld:chicken_raw", "nativevillages:chicken_raw"
},
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 75,
stand_start = 0,
stand_end = 100,
stand2_start = 100,
stand2_end = 200,
walk_start = 200,
walk_end = 300,
punch_speed = 100,
punch_start = 300,
punch_end = 400,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, S("Lion stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, S("Lion will follow you."))
end
end
end,
})
mobs:register_egg("nativevillages:maleliontame", S("Tamed Male Lion"), "amalelion.png" )
local S = mobs.intllib
mobs:register_mob("nativevillages:femaleliontame", {
type = "npc",
passive = false,
attack_type = "dogfight",
group_attack = true,
owner_loyal = true,
attack_npcs = false,
attack_monsters = true,
reach = 2,
damage = 7,
hp_min = 45,
hp_max = 75,
armor = 100,
collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.95, 0.5},
visual = "mesh",
mesh = "Lionfemale.b3d",
drawtype = "front",
textures = {
{"texturelionfemale.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_lion2",
random = "nativevillages_lion",
damage = "nativevillages_lion4",
death = "nativevillages_lion3",
distance = 10,
},
walk_velocity = 2,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {
"ethereal:fish_raw", "animalworld:rawfish", "mobs_fish:tropical",
"mobs:meat_raw", "animalworld:rabbit_raw", "animalworld:pork_raw", "water_life:meat_raw", "animalworld:chicken_raw", "nativevillages:chicken_raw"
},
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 75,
stand_start = 0,
stand_end = 100,
stand2_start = 100,
stand2_end = 200,
walk_start = 200,
walk_end = 300,
punch_speed = 100,
punch_start = 300,
punch_end = 400,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, S("Lion stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, S("Lion will follow you."))
end
end
end,
})
mobs:register_egg("nativevillages:femaleliontame", S("Tamed Female Lion"), "afemalelion.png" )
mobs:register_mob("nativevillages:grasslandcat", {
stay_near = {"singleplayer", 10},
type = "animal",
visual = "mesh",
mesh = "Grasslandcat.b3d",
collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.5, 0.4},
animation = {
speed_normal = 100,
stand_speed = 50,
stand_start = 0,
stand_end = 100,
stand2_speed = 50,
stand2_start = 100,
stand2_end = 200,
stand3_speed = 50,
stand3_start = 200,
stand3_end = 300,
stand4_speed = 50,
stand4_start = 0,
stand4_end = 100,
stand5_speed = 50,
stand5_start = 200,
stand5_end = 300,
walk_start = 300,
walk_end = 400,
punch_start = 400,
punch_end = 500,
die_start = 1, -- we dont have a specific death animation so we will
die_end = 2, -- re-use 2 standing frames at a speed of 1 fps and
die_speed = 1, -- have mob rotate when dying.
die_loop = false,
die_rotate = true,
},
textures = {
{"texturegrasslandcat.png"},
{"texturegrasslandcat2.png"},
{"texturegrasslandcat3.png"},
{"texturegrasslandcat4.png"},
{"texturegrasslandcat5.png"},
},
fear_height = 5,
stepheight = 2,
runaway = false,
jump = true,
jump_height = 8,
fly = false,
walk_velocity = 2,
walk_chance = 15,
run_velocity = 3,
view_range = 12,
passive = false,
attack_type = "dogfight",
damage = 4,
reach = 2,
attack_monsters = true,
attack_animals = false,
attack_npcs = false,
pathfinding = true,
group_attack = true,
hp_min = 25,
hp_max = 75,
armor = 100,
knock_back = 2,
lava_damage = 5,
fall_damage = 1,
water_damage = 1,
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_cat",
random = "nativevillages_cat2",
damage = "nativevillages_cat3",
death = "nativevillages_cat4",
distance = 10,
},
follow = {"ethereal:fish_raw", "animalworld:rawfish", "mobs_fish:tropical",
"mobs:meat_raw", "animalworld:rabbit_raw", "xocean:fish_edible", "fishing:fish_raw", "water_life:meat_raw", "fishing:carp_raw", "animalworld:chicken_raw", "nativevillages:chicken_raw", "nativevillages:chicken_cooked", "nativevillages:catfish_raw", "nativevillages:catfish_cooked"},
on_rightclick = function(self, clicker)
if mobs:feed_tame(self, clicker, 6, true, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 30, 50, 100, false, nil) then return end
if clicker:get_wielded_item():is_empty() and clicker:get_player_name() == self.owner then
if clicker:get_player_control().sneak then
self.order = ""
self.state = "walk"
self.walk_velocity = 2
self.stepheight = 2
else
if self.order == "follow" then
self.order = "stand"
self.state = "stand"
self.walk_velocity = 2
self.stepheight = 2
else
self.order = "follow"
self.state = "walk"
self.walk_velocity = 3
self.stepheight = 2
end
end
return
end
end
})
mobs:register_egg("nativevillages:grasslandcat", "Cat", "agrasslandcat.png")

65
cannibalblocks.lua Normal file
View File

@ -0,0 +1,65 @@
minetest.register_node("nativevillages:driedpeople", {
description = "Dried Human Remains",
tiles = {
"nativevillages_driedpeople_top.png",
"nativevillages_driedpeople_bottom.png",
"nativevillages_driedpeople_right.png",
"nativevillages_driedpeople_left.png",
"nativevillages_driedpeople_back.png",
"nativevillages_driedpeople_front.png"
},
groups = {crumbly = 3},
drop = "nativevillages:driedhumanmeat 9",
sounds = default.node_sound_dirt_defaults(),
})
minetest.register_craft({
output = "nativevillages:driedpeople",
recipe = {
{"nativevillages:driedhumanmeat", "nativevillages:driedhumanmeat", "nativevillages:driedhumanmeat"},
{"nativevillages:driedhumanmeat", "nativevillages:driedhumanmeat", "nativevillages:driedhumanmeat"},
{"nativevillages:driedhumanmeat", "nativevillages:driedhumanmeat", "nativevillages:driedhumanmeat"},
}
})
minetest.register_craftitem(":nativevillages:driedhumanmeat", {
description = ("Dried Human Meat"),
inventory_image = "nativevillages_driedhumanmeat.png",
on_use = minetest.item_eat(2),
groups = {mushroom = 1, snappy = 3, attached_node = 1, flammable = 1},
})
minetest.register_node("nativevillages:cannibalshrine", {
description = "Cannibal Shrine",
visual_scale = 1,
mesh = "Cannibalshrine.b3d",
tiles = {"texturecannibalshrine.png"},
inventory_image = "acannibalshrine.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
--[[{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "default:bronzeblock",
recipe = "nativevillages:cannibalshrine",
})

9
depends.txt Normal file
View File

@ -0,0 +1,9 @@
mobs
default
people
farming
animalworld?
ethereal?
xocean?
fishing?
hunger_ng?

1
description.txt Normal file
View File

@ -0,0 +1 @@
Adds villages of native people to the world.

131
desertblocks.lua Normal file
View File

@ -0,0 +1,131 @@
minetest.register_node("nativevillages:hookah", {
description = "Hookah",
visual_scale = 1,
mesh = "Hookah.b3d",
tiles = {"texturehookah.png"},
inventory_image = "ahookah.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.2, -0.5, -0.2, 0.2, 0.5, 0.2},
--[[{-0.2, -0.5, -0.2, 0.2, 0.5, 0.2},
{-0.2, -0.5, -0.2, 0.2, 0.5, 0.2}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.2, -0.5, -0.2, 0.2, 0.5, 0.2}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "default:bronzeblock",
recipe = "nativevillages:hookah",
})
minetest.register_node("nativevillages:desertcrpet", {
description = "Desert Carpet",
visual_scale = 1,
mesh = "Desertcarpet.b3d",
tiles = {"texturedesertcarpet.png"},
inventory_image = "adesertcarpet.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
--[[{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "wool:red",
recipe = "nativevillages:desertcarpet",
})
minetest.register_node("nativevillages:desertcage", {
description = "Slave Bracelet",
visual_scale = 1,
mesh = "Desertcage.b3d",
tiles = {"texturedesertcage.png"},
inventory_image = "adesertcage.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
--[[{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "default:steelblock",
recipe = "nativevillages:desertcage",
})
minetest.register_node("nativevillages:desertseeds", {
description = "Desert Seeds",
visual_scale = 1,
mesh = "Desertseeds.b3d",
tiles = {"texturedesertseeds.png"},
inventory_image = "adesertseeds.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
--[[{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "farming:bread",
recipe = "nativevillages:deserseeds",
})

119
desertbuildings.lua Normal file
View File

@ -0,0 +1,119 @@
minetest.register_decoration({
name = "nativevillages:deserthouse1",
deco_type = "schematic",
place_on = {"default:desert_sand"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"desert"},
y_max = 30.5,
y_min = 25.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/deserthouse1_30_180.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:deserthouse2",
deco_type = "schematic",
place_on = {"default:desert_sand"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"desert"},
y_max = 30.5,
y_min = 25.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/deserthouse2_30_180.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:deserthouse3",
deco_type = "schematic",
place_on = {"default:desert_sand"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"desert"},
y_max = 30.5,
y_min = 25.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/deserthouse3_30_180.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:deserthouse4",
deco_type = "schematic",
place_on = {"default:desert_sand"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"desert"},
y_max = 30.5,
y_min = 25.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/deserthouse4_30_180.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:deserthouse5",
deco_type = "schematic",
place_on = {"default:desert_sand"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"desert"},
y_max = 30.5,
y_min = 25.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/deserthouse5_30_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:desertwell",
deco_type = "schematic",
place_on = {"default:desert_sand"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00004,
biomes = {"desert"},
y_max = 30.5,
y_min = 25.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/desertwell_30_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:desertmarket",
deco_type = "schematic",
place_on = {"default:desert_sand"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00008,
biomes = {"desert"},
y_max = 30.5,
y_min = 25.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/desertmarket_30_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:desertstable",
deco_type = "schematic",
place_on = {"default:desert_sand"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00004,
biomes = {"desert"},
y_max = 30.5,
y_min = 25.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/deserstable_30_0.mts",
flags = "force_placement",
rotation = "random",
})

848
desertcreatures.lua Normal file
View File

@ -0,0 +1,848 @@
mobs.desertvillagermale_drops = {
"farming:salt"
}
mobs:register_mob("nativevillages:desertvillagermale", {
type = "monster",
passive = false,
damage = 2,
attack_type = "dogfight",
attacks_monsters = false,
attack_npcs = true,
owner_loyal = true,
pathfinding = true,
hp_min = 30,
hp_max = 60,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Desertvillagermale.b3d",
drawtype = "front",
textures = {
{"texturedesertvillagermale.png"},
{"texturedesertvillagermale2.png"},
{"texturedesertvillagermale3.png"},
{"texturedesertvillagermale4.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_desertmale2",
random = "nativevillages_desertmale",
damage = "nativevillages_desertmale4",
death = "nativevillages_desertmaledesertmale3",
distance = 10,
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:desertcrpet",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.desertvillagermale_drops
if item:get_name() == "default:stick" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.desertvillagermale_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Desert Villager dropped you an item for a stick!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Desert Villager stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Desert Villager will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:desertvillagermale",
nodes = {"default:desert_sand", "group:wool"},
neighbors = {"nativevillages:desertcrpet"},
min_light = 0,
interval = 60,
active_object_count = 2,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:desertvillagermale", ("Male Desert Villager"), "adesertvillagermale.png")
mobs.desertvillagerfemale_drops = {
"farming:salt"
}
mobs:register_mob("nativevillages:desertvillagerfemale", {
type = "monster",
passive = false,
damage = 1,
attack_type = "dogfight",
attacks_monsters = false,
attack_npcs = true,
owner_loyal = true,
pathfinding = true,
hp_min = 20,
hp_max = 40,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Desertvillagerfemale.b3d",
drawtype = "front",
textures = {
{"texturedesertvillagerfemale.png"},
{"texturedesertvillagerfemale2.png"},
{"texturedesertvillagerfemale3.png"},
{"texturedesertvillagerfemale4.png"},
{"texturedesertvillagerfemale5.png"},
{"texturedesertvillagerfemale6.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_desertfemale2",
random = "nativevillages_desertfemale",
damage = "nativevillages_desertfemale4",
death = "nativevillages_desertfemale3",
distance = 10,
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:desertcrpet",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.desertvillagerfemale_drops
if item:get_name() == "default:stick" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.desertvillagerfemale_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Desert Villager dropped you an item for a stick!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Desert Villager stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Desert will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:desertvillagerfemale",
nodes = {"default:desert_sand", "group:wool"},
neighbors = {"nativevillages:desertcrpet"},
min_light = 0,
interval = 60,
active_object_count = 2,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:desertvillagerfemale", ("Female Desert Villager"), "adesertvillagerfemale.png")
mobs.desertslavetrader_drops = {
"nativevillages:slavechickenbreeder", "nativevillages:slavecowherder", "nativevillages:slaveliontrainer",
"nativevillages:slavefemaledancer", "nativevillages:slaveloyalcannibal", "nativevillages:slavemaledancer"
}
mobs:register_mob("nativevillages:desertslavetrader", {
type = "npc",
passive = false,
damage = 5,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 30,
hp_max = 60,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Desertslavetrader.b3d",
drawtype = "front",
textures = {
{"texturedesertslavetrader.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_desertmale2",
random = "nativevillages_desertmale",
damage = "nativevillages_desertmale4",
death = "nativevillages_desertmale3",
distance = 10,
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:desertcage",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.desertslavetrader_drops
if item:get_name() == "default:gold_ingot" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.desertslavetrader_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Slave delivered!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Slavetrader stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Slavetrader will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:desertslavetrader",
nodes = {"default:desert_sand", "group:wool"},
neighbors = {"nativevillages:desertcage"},
min_light = 0,
interval = 60,
active_object_count = 1,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:desertslavetrader", ("Slave Trader"), "adesertslavetrader.png")
mobs:register_mob("nativevillages:desertranger", {
type = "monster",
passive = false,
damage = 7,
raeach = 4,
attack_type = "dogfight",
attacks_monsters = false,
attack_npcs = true,
attack_player = true,
owner_loyal = true,
pathfinding = true,
hp_min = 50,
hp_max = 85,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Desertranger.b3d",
drawtype = "front",
textures = {
{"texturedesertranger.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_desertmale2",
random = "nativevillages_desertmale",
damage = "nativevillages_desertmale4",
death = "nativevillages_desertmaledesertmale3",
distance = 10,
},
walk_velocity = 2,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
{name = "default:apple", chance = 2, min = 1, max = 2},
{name = "default:sword_stone", chance = 5, min = 1, max = 1},
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:hookah",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 100,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
if mobs:feed_tame(self, clicker, 8, true, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:desertranger",
nodes = {"default:desert_sand", "group:wool"},
neighbors = {"nativevillages:hookah"},
min_light = 0,
interval = 60,
active_object_count = 2,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:desertranger", ("Desert Ranger"), "adesertranger.png")
mobs:register_mob("nativevillages:desertraider", {
type = "monster",
passive = false,
damage = 7,
attack_type = "dogfight",
attacks_monsters = false,
attack_npcs = true,
owner_loyal = true,
pathfinding = true,
hp_min = 50,
hp_max = 100,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Desertraider.b3d",
drawtype = "front",
textures = {
{"texturedesertraider.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_desertmale2",
random = "nativevillages_desertmale",
damage = "nativevillages_desertmale4",
death = "nativevillages_desertmale3",
distance = 10,
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
{name = "default:apple", chance = 2, min = 1, max = 2},
{name = "default:sword_stone", chance = 5, min = 1, max = 1},
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:hookah",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 100,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
if mobs:feed_tame(self, clicker, 8, true, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:desertraider",
nodes = {"default:desert_sand", "group:wool"},
neighbors = {"nativevillages:hookah"},
min_light = 0,
interval = 60,
active_object_count = 2,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:desertraider", ("Desert Raider"), "adesertraider.png")
mobs:register_mob("nativevillages:desertchicken", {
stepheight = 1,
type = "animal",
passive = false,
attack_type = "dogfight",
group_attack = true,
owner_loyal = true,
attack_npcs = false,
reach = 2,
damage = 3,
hp_min = 10,
hp_max = 20,
armor = 100,
collisionbox = {-0.4, -0.01, -0.3, 0.4, 0.8, 0.4},
visual = "mesh",
mesh = "Desertchicken.b3d",
textures = {
{"texturedesertchicken.png"},
},
child_texture = {
{"desertchicken.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_chicken",
damage = "nativevillages_chicken2",
death = "nativevillages_chicken3",
},
walk_velocity = 1,
run_velocity = 3,
runaway = true,
runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:scorpion"},
drops = {
},
water_damage = 1,
lava_damage = 5,
light_damage = 0,
fear_height = 3,
animation = {
speed_normal = 100,
stand_start = 0,
stand_end = 100,
stand2_start = 100,
stand2_end = 200,
walk_start = 200,
walk_end = 300,
},
follow = {},
view_range = 10,
on_rightclick = function(self, clicker)
if mobs:feed_tame(self, clicker, 8, true, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 30, 50, 80, false, nil) then return end
end,
do_custom = function(self, dtime)
self.egg_timer = (self.egg_timer or 0) + dtime
if self.egg_timer < 10 then
return
end
self.egg_timer = 0
if self.child
or math.random(1, 100) > 1 then
return
end
local pos = self.object:get_pos()
minetest.add_item(pos, "mobs:egg")
minetest.sound_play("default_place_node_hard", {
pos = pos,
gain = 1.0,
max_hear_distance = 5,
})
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:desertchicken",
nodes = {"default:clay", "default:desert_sand"},
neighbors = {"nativevillages:desertseeds"},
min_light = 0,
interval = 60,
chance = 1, -- 15000
active_object_count = 3,
min_height = 0,
max_height = 100,
})
end
mobs:register_egg("nativevillages:desertchicken", ("Desert Chicken"), "adesertchicken.png", 0)
-- egg entity
mobs:register_arrow("nativevillages:egg_entity", {
visual = "sprite",
visual_size = {x=.5, y=.5},
textures = {"mobs_chicken_egg.png"},
velocity = 6,
hit_player = function(self, player)
player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = 1},
}, nil)
end,
hit_mob = function(self, player)
player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = 1},
}, nil)
end,
hit_node = function(self, pos, node)
if math.random(1, 10) > 1 then
return
end
pos.y = pos.y + 1
local nod = minetest.get_node_or_nil(pos)
if not nod
or not minetest.registered_nodes[nod.name]
or minetest.registered_nodes[nod.name].walkable == true then
return
end
local mob = minetest.add_entity(pos, "nativevillages:desertchicken")
local ent2 = mob:get_luaentity()
mob:set_properties({
textures = ent2.child_texture[1],
visual_size = {
x = ent2.base_size.x / 2,
y = ent2.base_size.y / 2
},
collisionbox = {
ent2.base_colbox[1] / 2,
ent2.base_colbox[2] / 2,
ent2.base_colbox[3] / 2,
ent2.base_colbox[4] / 2,
ent2.base_colbox[5] / 2,
ent2.base_colbox[6] / 2
},
})
ent2.child = true
ent2.tamed = true
ent2.owner = self.playername
end
})
-- egg throwing item
local egg_GRAVITY = 9
local egg_VELOCITY = 19
-- shoot egg
local mobs_shoot_egg = function (item, player, pointed_thing)
local playerpos = player:get_pos()
minetest.sound_play("default_place_node_hard", {
pos = playerpos,
gain = 1.0,
max_hear_distance = 5,
})
local obj = minetest.add_entity({
x = playerpos.x,
y = playerpos.y +1.5,
z = playerpos.z
}, "nativevillages:egg_entity")
local ent = obj:get_luaentity()
local dir = player:get_look_dir()
ent.velocity = egg_VELOCITY -- needed for api internal timing
ent.switch = 1 -- needed so that egg doesn't despawn straight away
obj:setvelocity({
x = dir.x * egg_VELOCITY,
y = dir.y * egg_VELOCITY,
z = dir.z * egg_VELOCITY
})
obj:setacceleration({
x = dir.x * -3,
y = -egg_GRAVITY,
z = dir.z * -3
})
-- pass player name to egg for chick ownership
local ent2 = obj:get_luaentity()
ent2.playername = player:get_player_name()
item:take_item()
return item
end
-- egg
minetest.register_node(":nativevillages:egg", {
description = ("Bird Egg"),
tiles = {"mobs_chicken_egg.png"},
inventory_image = "mobs_chicken_egg.png",
visual_scale = 0.7,
drawtype = "plantlike",
wield_image = "mobs_chicken_egg.png",
paramtype = "light",
walkable = false,
is_ground_content = true,
sunlight_propagates = true,
selection_box = {
type = "fixed",
fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
},
groups = {food_egg = 1, snappy = 2, dig_immediate = 3},
after_place_node = function(pos, placer, itemstack)
if placer:is_player() then
minetest.set_node(pos, {name = "nativevillages:egg", param2 = 1})
end
end,
on_use = mobs_shoot_egg
})
-- fried egg
minetest.register_craftitem(":nativevillages:chicken_egg_fried", {
description = ("Fried Desert Chicken Egg"),
inventory_image = "nativevillages_chicken_egg_fried.png",
on_use = minetest.item_eat(2),
groups = {food_egg_fried = 1, flammable = 2},
})
minetest.register_craft({
type = "cooking",
recipe = "nativevillages:egg",
output = "nativevillages:chicken_egg_fried",
})
-- raw chicken
minetest.register_craftitem(":nativevillages:chicken_raw", {
description = ("Raw Desert Chicken meat"),
inventory_image = "nativevillages_chicken_raw.png",
on_use = minetest.item_eat(2),
groups = {food_meat_raw = 1, food_chicken_raw = 1, flammable = 2},
})
-- cooked chicken
minetest.register_craftitem(":nativevillages:chicken_cooked", {
description = ("Cooked Desert Chicken"),
inventory_image = "nativevillages_chicken_cooked.png",
on_use = minetest.item_eat(6),
groups = {food_meat = 1, food_chicken = 1, flammable = 2},
})
minetest.register_craft({
type = "cooking",
recipe = "nativevillages:chicken_raw",
output = "nativevillages:chicken_cooked",
})

215
explodingtoad.lua Normal file
View File

@ -0,0 +1,215 @@
mobs:register_mob("nativevillages:toad", {
stepheight = 3,
type = "monster",
passive = false,
attack_type = "explode",
explosion_radius = 2,
explosion_damage__radius = 6,
explosion_timer = 2,
attack_npcs = false,
attack_animals = false,
reach = 3,
damage = 18,
hp_min = 15,
hp_max = 30,
armor = 100,
collisionbox = {-0.268, -0.01, -0.268, 0.268, 0.25, 0.268},
visual = "mesh",
mesh = "Toad.b3d",
drawtype = "front",
textures = {
{"texturetoad.png"},
},
sounds = {
random = "",},
makes_footstep_sound = true,
walk_velocity = 1.5,
run_velocity = 2,
runaway = true,
runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:scorpion"},
jump = true,
jump_height = 6,
sounds = {
attack = "nativevillages_toad",
random = "nativevillages_toad2",
damage = "nativevillages_toad",
death = "nativevillages_toad",
distance = 10,
},
drops = {
{name = "mobs:meat_raw", chance = 1, min = 1, max = 1},
},
water_damage = 0,
lava_damage = 4,
light_damage = 0,
fear_height = 6,
animation = {
speed_normal = 50,
stand_start = 1,
stand_end = 100,
walk_speed = 100,
walk_start = 100,
walk_end = 200,
fly_start = 300, -- swim animation
fly_end = 400,
},
fly_in = {"default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing"},
floats = 0,
follow = {"fishing:bait:worm", "ethereal:worm", "animalworld:ant", "animalworld:termite"},
view_range = 13,
on_rightclick = function(self, clicker)
if mobs:feed_tame(self, clicker, 8, true, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end
end,
})
if minetest.get_modpath("ethereal") then
spawn_on = "ethereal:prairie_dirt", "default:dirt_with_grass", "ethereal:green_dirt"
end
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:toad",
nodes = {"default:dirt_with_grass"}, {"default:dirt_with_rainforest_litter"}, {"default:dry_dirt_with_dry_grass"},
min_light = 0,
interval = 60,
chance = 8000, -- 15000
active_object_count = 1,
min_height = 1,
max_height = 15,
day_toogle = false
})
end
mobs:register_egg("nativevillages:toad", ("Toad"), "atoad.png", 0)
mobs:alias_mob("nativevillages:toad", "nativevillages:toad") -- compatibility
mobs:register_mob("nativevillages:toadtamed", {
stepheight = 3,
type = "NPC",
passive = false,
attack_type = "explode",
explosion_radius = 4,
explosion_damage__radius = 12,
explosion_timer = 4,
attack_npcs = false,
attack_animals = false,
attack_monsters = true,
reach = 3,
damage = 550,
hp_min = 25,
hp_max = 50,
armor = 100,
collisionbox = {-0.268, -0.01, -0.268, 0.268, 0.25, 0.268},
visual = "mesh",
mesh = "Toad.b3d",
drawtype = "front",
textures = {
{"texturetoad.png"},
},
sounds = {
random = "",},
makes_footstep_sound = true,
owner_loyal = true,
owner = "",
order = "follow",
pathfinding = true,
walk_velocity = 1.5,
run_velocity = 2,
runaway = false,
runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:scorpion"},
jump = true,
jump_height = 6,
drops = {
{name = "mobs:meat_raw", chance = 1, min = 1, max = 1},
},
water_damage = 0,
lava_damage = 4,
light_damage = 0,
fear_height = 6,
animation = {
speed_normal = 50,
stand_start = 1,
stand_end = 100,
walk_speed = 100,
walk_start = 100,
walk_end = 200,
fly_start = 300, -- swim animation
fly_end = 400,
},
fly_in = {"default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing"},
floats = 0,
follow = {"fishing:bait:worm", "ethereal:worm", "animalworld:ant", "animalworld:termite"},
view_range = 13,
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Exploding Toad stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Exploding Toad will follow you."))
end
end
end,
})
mobs:register_egg("nativevillages:toadtamed", ("Tamed Exploding Toad"), "atoad.png", 0)
mobs:alias_mob("nativevillages:toadtamed", "nativevillages:toadtamed") -- compatibility
minetest.register_node("nativevillages:toadbag", {
description = "Bag full of toads!",
tiles = {
"nativevillages_toadbag_top.png",
"nativevillages_toadbag_bottom.png",
"nativevillages_toadbag_right.png",
"nativevillages_toadbag_left.png",
"nativevillages_toadbag_back.png",
"nativevillages_toadbag_front.png"
},
groups = {crumbly = 3},
drop = "nativevillages:toadtamed 9",
sounds = default.node_sound_dirt_defaults(),
})

99
grasslandblocks.lua Normal file
View File

@ -0,0 +1,99 @@
minetest.register_node("nativevillages:grasslandaltar", {
description = "Altar",
visual_scale = 1,
mesh = "Grasslandaltar.b3d",
tiles = {"texturegrasslandaltar.png"},
inventory_image = "agrasslandaltar.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
--[[{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "default:cobble",
recipe = "nativevillages:grasslandaltar",
})
minetest.register_node("nativevillages:grasslandbarrel", {
description = "Barrel",
visual_scale = 1,
mesh = "Grasslandbarrel.b3d",
tiles = {"texturegrasslandbarrel.png"},
inventory_image = "agrasslandbarrel.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 1, 0.5},
--[[{-0.5, -0.5, -0.5, 0.5, 1, 0.5},
{-0.5, -0.5, -0.5, 0.5, 1, 0.5}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 1, 0.5}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "default:cobble",
recipe = "nativevillages:grasslandbarrel",
})
minetest.register_node("nativevillages:cowdropping", {
description = "Cow Dropping",
visual_scale = 1,
mesh = "Cowdropping.b3d",
tiles = {"texturecowdropping.png"},
inventory_image = "acowdropping.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
--[[{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "default:coal_lump",
recipe = "nativevillages:cowdropping",
})

122
grasslandbuildings.lua Normal file
View File

@ -0,0 +1,122 @@
minetest.register_decoration({
name = "nativevillages:grasslandblot",
deco_type = "schematic",
place_on = {"default:dirt_with_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00004,
biomes = {"grassland", "snowy_grassland"},
y_max = 20.5,
y_min = 15.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandblot_30_180.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:grasslandhouse1",
deco_type = "schematic",
place_on = {"default:dirt_with_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"grassland", "snowy_grassland"},
y_max = 20.5,
y_min = 15.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandhouse1_30_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:grasslandhouse2",
deco_type = "schematic",
place_on = {"default:dirt_with_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"grassland", "snowy_grassland"},
y_max = 20.5,
y_min = 15.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandhouse2_30_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:grasslandhouse3",
deco_type = "schematic",
place_on = {"default:dirt_with_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"grassland", "snowy_grassland"},
y_max = 20.5,
y_min = 15.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandhouse3_30_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:grasslandhouse4",
deco_type = "schematic",
place_on = {"default:dirt_with_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"grassland", "snowy_grassland"},
y_max = 20.5,
y_min = 15.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandhouse4_30_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:grasslandhouse5",
deco_type = "schematic",
place_on = {"default:dirt_with_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"grassland", "snowy_grassland"},
y_max = 20.5,
y_min = 15.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandhouse5_30_180.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:grasslandpond",
deco_type = "schematic",
place_on = {"default:dirt_with_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00004,
biomes = {"grassland", "snowy_grassland"},
y_max = 20.5,
y_min = 15.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandpond_30_180.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:grasslandstable",
deco_type = "schematic",
place_on = {"default:dirt_with_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00004,
biomes = {"grassland", "snowy_grassland"},
y_max = 20.5,
y_min = 15.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandstable_30_180.mts",
flags = "force_placement",
rotation = "random",
})

516
grasslandcreatures.lua Normal file
View File

@ -0,0 +1,516 @@
mobs:register_mob("nativevillages:grasslandcow", {
stepheight = 1,
type = "animal",
passive = false,
attack_type = "dogfight",
group_attack = true,
owner_loyal = true,
attack_npcs = false,
reach = 2,
damage = 4,
hp_min = 20,
hp_max = 60,
armor = 100,
collisionbox = {-0.25, -0.01, -0.25, 0.25, 1.5, 0.25},
visual = "mesh",
mesh = "Grasslandcow.b3d",
textures = {
{"texturegrasslandcow.png"},
{"texturegrasslandcow2.png"},
{"texturegrasslandcow3.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_cow",
attack = "nativevillages_cow2",
damage = "nativevillages_cow3",
},
walk_velocity = 1,
run_velocity = 3,
runaway = false,
jump = false,
jump_height = 3,
pushable = true,
follow = {},
view_range = 10,
drops = {
},
water_damage = 0,
lava_damage = 5,
light_damage = 0,
fear_height = 2,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
stand2_start = 100,
stand2_end = 200,
walk_start = 200,
walk_end = 300,
punch_start = 300,
punch_end = 400,
die_start = 1, -- we dont have a specific death animation so we will
die_end = 2, -- re-use 2 standing frames at a speed of 1 fps and
die_speed = 1, -- have mob rotate when dying.
die_loop = false,
die_rotate = true,
},
on_rightclick = function(self, clicker)
if mobs:feed_tame(self, clicker, 8, true, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 0, 0, 25, false, nil) then return end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:grasslandcow",
nodes = {"default:dirt_with_grass", "default:dirt_with_coniferous_litter", "default:clay"},
neighbors = {"nativevillages:cowdropping"},
min_light = 0,
interval = 60,
active_object_count = 3,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:grasslandcow", ("Grassland Cow"), "agrasslandcow.png")
mobs:alias_mob("nativevillages:grasslandcow", "nativevillages:grasslandcow") -- compatibility
mobs.grasslandfemale_drops = {
"nativevillages:bucket_milk", "nativevillages:cheese", "default:iron_lump",
"default:copper_lump", "default:tin_lump", "mobs:meat"
}
mobs:register_mob("nativevillages:grasslandfemale", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 40,
hp_max = 70,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Grasslandfemale.b3d",
drawtype = "front",
textures = {
{"texturegrasslandfemale.png"},
{"texturegrasslandfemale2.png"},
{"texturegrasslandfemale3.png"},
{"texturegrasslandfemale4.png"},
},
child_texture = {
{"texturegrasslandbabyf.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_grasslandfemale2",
random = "nativevillages_grasslandfemale",
damage = "nativevillages_grasslandfemale3",
death = "nativevillages_grasslandfemale3",
distance = 10,
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:grasslandbarrel",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.grasslandfemale_drops
if item:get_name() == "farming:bread" or item:get_name() == "farming:garlic_bread" or item:get_name() == "ethereal:banana_bread" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.grasslandfemale_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Grasslander dropped you an item for bread!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Grasslander stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Grasslander will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:grasslandfemale",
nodes = {"default:dirt_with_grass", "default:cobble", "default:dirt_with_coniferous_litter", "default:clay"},
neighbors = {"nativevillages:grasslandbarrel"},
min_light = 0,
interval = 60,
active_object_count = 2,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:grasslandfemale", ("Female Grasslander"), "agrasslandfemale.png")
-- compatibility
mobs:alias_mob("nativevillages:grasslandfemale", "nativevillages:grasslandfemale")
mobs.grasslandmale_drops = {
"nativevillages:bucket_milk", "nativevillages:cheese", "default:iron_lump",
"default:copper_lump", "default:tin_lump", "mobs:meat"
}
mobs:register_mob("nativevillages:grasslandmale", {
type = "npc",
passive = false,
damage = 5,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 70,
hp_max = 90,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Grasslandmale.b3d",
drawtype = "front",
textures = {
{"texturegrasslandmale.png"},
{"texturegrasslandmale2.png"},
{"texturegrasslandmale3.png"},
{"texturegrasslandmale4.png"},
},
child_texture = {
{"texturegrasslandbabym.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_grasslandmale2",
random = "nativevillages_grasslandmale",
damage = "nativevillages_grasslandmale3",
death = "nativevillages_grasslandmale3",
distance = 10,
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:grasslandbarrel",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.grasslandmale_drops
if item:get_name() == "farming:bread" or item:get_name() == "farming:garlic_bread" or item:get_name() == "ethereal:banana_bread" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.grasslandmale_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Grasslander dropped you an item for bread!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Grasslander stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Grasslander will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:grasslandmale",
nodes = {"default:dirt_with_grass", "default:cobble", "default:dirt_with_coniferous_litter", "default:clay"},
neighbors = {"nativevillages:grasslandbarrel"},
min_light = 0,
interval = 60,
active_object_count = 2,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:grasslandmale", ("Male Grasslander"), "agrasslandmale.png")
-- compatibility
mobs:alias_mob("nativevillages:grasslandmale", "nativevillages:grasslandmale")
mobs.grasslandwitch_drops = {
"nativevillages:grasslandcat", "nativevillages:toadbag"
}
mobs:register_mob("nativevillages:grasslandwitch", {
type = "npc",
passive = false,
attack_type = "shoot",
shoot_interval = 1,
arrow = "nativevillages:fireball",
shoot_offset = 2,
attack_animals = false,
damage = 7,
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 20,
hp_max = 60,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Grasslandwitch.b3d",
drawtype = "front",
textures = {
{"texturegrasslandwitch.png"},
{"texturegrasslandwitch2.png"},
},
makes_footstep_sound = true,
sounds = {
shoot = "nativevillages_witch2",
random = "nativevillages_witch",
damage = "nativevillages_witch4",
death = "nativevillages_witch3",
distance = 10,
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
{name = "default:coal_lump", chance = 1, min = 1, max = 3},
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:grasslandaltar",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
shoot_speed = 100,
shoot_start = 200,
shoot_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.grasslandwitch_drops
if item:get_name() == "default:diamond" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.grasslandwitch_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Witch dropped you an item for diamond!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Witch stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Witch will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:grasslandwitch",
nodes = {"default:dirt_with_grass", "default:clay"},
neighbors = {"nativevillages:grasslandaltar"},
min_light = 0,
interval = 60,
active_object_count = 1,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:grasslandwitch", ("Grassland Witch"), "agrasslandwitch.png")
-- compatibility
mobs:alias_mob("nativevillages:grasslandwitch", "nativevillages:grasslandwitch")

91
guide.txt Normal file
View File

@ -0,0 +1,91 @@
People Mod provides NPCs to be integrated in your own village, follow you and provide many trading items.
Native Villages is focused on ambience. The villagers of this mod can be found in the specific biomes but
wont follow you and some are even aggressive by nature.
As an additional challenge similar to Minecraft Creepers, you will find now exploding toads at night near the coastal regions
of jungle, savanna and forest biomes.
This guide will shortly introduce you to the trading options of every specific tribe provided by the mod.
All trading drops are random (Like in People Mod)
Arctic/Icelander Tribe:
Sledge Trader
Sells Ice Dogs and Dog Sledges for steel ingots.
Ice Villager
Sells brown and white wool, leather and meat for iron lumps.
Sledge with Dog
Can be fed with meat(Mod Mobs Redo), dogfood or cooked dogfood.
Desert Tribe:
Villagers, Raiders and Rangers are aggressive and don't like to trade with you.
Desert Slave Trader
Sells Chicken Breeders, Cow Herders, Lion Trainers, Dancers and Loyal Cannibals for gold ingots.
Grasslander Tribe:
Grasslander
Sells milk buckets, mozzarella cheese, iron lumps, copper lumps, tin lumps and meat for bread, garlic bread and ethereal banana bread.
Grassland Witch
Sells cats and bags of exploding toads for diamonds.
Lake Tribe:
Lake Villager
Sells cooked catfish, strings, water buckets, salt and pearls for ethereal bananas, sugar, cocoa and bananas(farming).
Fisher
Sells domesticated catfish(can be bred) and pearls for gold lumps.
Savanna Tribe:
Witch Doctor
Sells tamed zombies for all graves found in People Mod.
Savanna Queen + King
Sells gold block for diamond.
Savanna Villagers
Sells pumpkin, vanilla, potatoes, pineapple, pepper, onion, peas, melon, cucumber and coffee beans for pearls.
Various Creatures:
Tamed Catfish
Can be bred with worm, seaweed, grass, cucumber, cabbage, ants, termite, fish food.
Tamed Zombie
Can be bred with dried human meat(Can be found in Jungle/Cannibal settlements).
Cow Herder
Sells domestic cows for various farming dishes.
Domestic Cow
Can be milked with a bucket, can be bred with wheat, grass, barley, oat, rye, carrot, beans and lettuce.
Chicken Breeder
Sells tamed desert chickens for various farming dishes.
Tamed Desert Chicken
Can be bred with wheat seeds, cotton seeds, barley seeds, oat seeds and rye seeds.
Lion Trainer
Sells tamed lions for gold lumps.
Tamed Lions
Can be fed with many kind of raw meat and fish.
Grassland Cat
Can be fed with many kind of raw meat and fish.
Dancers
Can be fed with various farming dishes.
Loyal Cannibal
Can be fed with dried human meat(Can be found in Jungle/Cannibal settlements).
It is useless to kill animals to be found in the villages, they wont drop anything and wont get tame to prevent cheating.

29
hunger.lua Normal file
View File

@ -0,0 +1,29 @@
if minetest.get_modpath("hunger_ng") ~= nil then
hunger_ng.add_hunger_data('nativevillages:bucket_milk', {
satiates = 1.0,
})
hunger_ng.add_hunger_data('nativevillages:cheese', {
satiates = 1.0,
})
hunger_ng.add_hunger_data('nativevillages:catfish_raw', {
satiates = 1.0,
})
hunger_ng.add_hunger_data('nativevillages:catfish_cooked', {
satiates = 2.0,
})
hunger_ng.add_hunger_data('nativevillages:chicken_raw', {
satiates = 1.0,
})
hunger_ng.add_hunger_data('nativevillages:chicken_cooked', {
satiates = 2.0,
})
hunger_ng.add_hunger_data('nativevillages:chicken_egg_fried', {
satiates = 1.0,
})
hunger_ng.add_hunger_data('nativevillages:butter', {
satiates = 1.0,
})
hunger_ng.add_hunger_data('nativevillages:driedhumanmeat', {
satiates = 2.0,
})
end

89
icebuildings.lua Normal file
View File

@ -0,0 +1,89 @@
minetest.register_decoration({
name = "nativevillages:icehouse1",
deco_type = "schematic",
place_on = {"default:snowblock", "default:ice"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.0001,
biomes = {"icesheet", "icesheet_ocean"},
y_max = 3.5,
y_min = 1.0,
schematic = minetest.get_modpath("nativevillages").."/schematics/icehouse1_30_90.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:icehouse2",
deco_type = "schematic",
place_on = {"default:snowblock", "default:ice"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.0001,
biomes = {"icesheet", "icesheet_ocean"},
y_max = 3.5,
y_min = 1.0,
schematic = minetest.get_modpath("nativevillages").."/schematics/icehouse2_30_90.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:icehouse3",
deco_type = "schematic",
place_on = {"default:snowblock", "default:ice"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.0001,
biomes = {"icesheet", "icesheet_ocean"},
y_max = 3.5,
y_min = 1.0,
schematic = minetest.get_modpath("nativevillages").."/schematics/icehouse3_30_90.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:icelogs",
deco_type = "schematic",
place_on = {"default:snowblock", "default:ice"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.0001,
biomes = {"icesheet", "icesheet_ocean"},
y_max = 3.5,
y_min = 1.0,
schematic = minetest.get_modpath("nativevillages").."/schematics/icelogs_30_90.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:icepelts",
deco_type = "schematic",
place_on = {"default:snowblock", "default:ice"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.0001,
biomes = {"icesheet", "icesheet_ocean"},
y_max = 3.5,
y_min = 1.0,
schematic = minetest.get_modpath("nativevillages").."/schematics/icepelts_30_90.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:icesledge",
deco_type = "schematic",
place_on = {"default:snowblock", "default:ice"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.0001,
biomes = {"icesheet", "icesheet_ocean"},
y_max = 3.5,
y_min = 1.0,
schematic = minetest.get_modpath("nativevillages").."/schematics/icesledge_30_90.mts",
flags = "force_placement",
rotation = "random",
})

55
init.lua Normal file
View File

@ -0,0 +1,55 @@
-- Load support for intllib.
local path = minetest.get_modpath(minetest.get_current_modname()) .. "/"
local S = minetest.get_translator and minetest.get_translator("nativevillages") or
dofile(path .. "intllib.lua")
mobs.intllib = S
-- Check for custom mob spawn file
local input = io.open(path .. "spawn.lua", "r")
if input then
mobs.custom_spawn_nativevillages = true
input:close()
input = nil
end
-- Buildings
dofile(path .. "cannibalblocks.lua") --
dofile(path .. "savannablocks.lua") --
dofile(path .. "arcticblocks.lua") --
dofile(path .. "grasslandblocks.lua") --
dofile(path .. "lakeblocks.lua") --
dofile(path .. "desertblocks.lua") --
dofile(path .. "junglebuildings.lua") --
dofile(path .. "icebuildings.lua") --
dofile(path .. "grasslandbuildings.lua") --
dofile(path .. "lakebuildings.lua") --
dofile(path .. "desertbuildings.lua") --
dofile(path .. "savannabuildings.lua") --
dofile(path .. "grasslandcreatures.lua") --
dofile(path .. "junglecreatures.lua") --
dofile(path .. "arcticcreatures.lua") --
dofile(path .. "savannacreatures.lua") --
dofile(path .. "lakecreatures.lua") --
dofile(path .. "desertcreatures.lua") --
dofile(path .. "slavecreatures.lua") --
dofile(path .. "buyablestuff.lua") --
dofile(path .. "explodingtoad.lua") --
dofile(path .. "hunger.lua") --
-- Load custom spawning
if mobs.custom_spawn_nativevillages then
dofile(path .. "spawn.lua")
end
print (S("[MOD] Buildings loaded"))

3
intllib.lua Normal file
View File

@ -0,0 +1,3 @@
-- Support for the old multi-load method
dofile(minetest.get_modpath("intllib").."/init.lua")

89
junglebuildings.lua Normal file
View File

@ -0,0 +1,89 @@
minetest.register_decoration({
name = "nativevillages:junglehouse1",
deco_type = "schematic",
place_on = {"default:dirt_with_rainforest_litter"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"rainforest"},
y_max = 20.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/cannibalhouse1_30_90.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:junglehouse2",
deco_type = "schematic",
place_on = {"default:dirt_with_rainforest_litter"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"rainforest"},
y_max = 20.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/cannibalhouse2_30_90.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:junglehouse3",
deco_type = "schematic",
place_on = {"default:dirt_with_rainforest_litter"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"rainforest"},
y_max = 20.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/cannibalhouse3_30_90.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:junglecage",
deco_type = "schematic",
place_on = {"default:dirt_with_rainforest_litter"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"rainforest"},
y_max = 20.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/cannibalcage_30_270.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:junglepit",
deco_type = "schematic",
place_on = {"default:dirt_with_rainforest_litter"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"rainforest"},
y_max = 20.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/cannibalpit_30_270.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:jungletower",
deco_type = "schematic",
place_on = {"default:dirt_with_rainforest_litter"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"rainforest"},
y_max = 20.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/cannibaltower_30_180.mts",
flags = "force_placement",
rotation = "random",
})

329
junglecreatures.lua Normal file
View File

@ -0,0 +1,329 @@
mobs:register_mob("nativevillages:cannibalking", {
type = "monster",
passive = false,
attack_type = "shoot",
shoot_interval = 1,
arrow = "nativevillages:fireball",
shoot_offset = 2,
attack_animals = true,
damage = 7,
hp_min = 55,
hp_max = 85,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Cannibalking.b3d",
visual_size = {x = 1.0, y = 1.0},
textures = {
{"texturecannibalking.png"},
},
sounds = {
random = "nativevillages_cannibalmale",
shoot = "nativevillages_cannibalmale2",
damage = "nativevillages_cannibalmale3",
death = "nativevillages_cannibalmale4",
},
makes_footstep_sound = true,
walk_velocity = 1.5,
run_velocity = 3,
runaway = false,
jump = true,
jump_height = 2,
stepheight = 2,
fear_height = 3,
drops = {
{name = "default:copper_lump", chance = 1, min = 1, max = 1},
},
water_damage = 5,
lava_damage = 4,
light_damage = 0,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_speed = 75,
walk_start = 100,
walk_end = 200,
shoot_speed = 100,
shoot_start = 200,
shoot_end = 300,
},
view_range = 15,
on_rightclick = function(self, clicker)
-- feed or tame
if mobs:feed_tame(self, clicker, 4, false, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 5, 50, 80, false, nil) then return end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:cannibalking",
nodes = {"default:junglewood"},
neighbors = {"nativevillages:cannibalshrine"},
min_light = 0,
interval = 60,
chance = 2, -- 15000
min_height = 0,
max_height = 40,
})
end
mobs:register_arrow("nativevillages:fireball", {
visual = "sprite",
visual_size = {x=.5, y=.5},
textures = {"nativevillages_fireball.png"},
velocity = 12,
drop = true,
hit_player = function(self, player)
player:punch(self.object, 1.0, {
full_punch_interval=1.0,
damage_groups = {fleshy=13},
}, nil)
end,
hit_mob = function(self, player)
player:punch(self.object, 1.0, {
full_punch_interval=1.0,
damage_groups = {fleshy=13},
}, nil)
end,
hit_node = function(self, pos, node)
end,
})
mobs:register_egg("nativevillages:cannibalking", ("Cannibal King"), "acannibalking.png")
mobs:register_mob("nativevillages:cannibalarcher", {
type = "monster",
passive = false,
attack_type = "shoot",
shoot_interval = 2,
arrow = "people:bolt",
shoot_offset = 2,
attacks_monsters = false,
damage = 4,
hp_min = 55,
hp_max = 85,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Cannibalarcher.b3d",
visual_size = {x = 1.0, y = 1.0},
textures = {
{"texturecannibalarcher.png"},
},
sounds = {
random = "nativevillages_cannibalmale",
attack = "nativevillages_cannibalmale2",
damage = "nativevillages_cannibalmale3",
death = "nativevillages_cannibalmale4",
},
makes_footstep_sound = true,
walk_velocity = 2,
run_velocity = 3,
runaway = false,
jump = true,
jump_height = 2,
stepheight = 2,
fear_height = 3,
drops = {
{name = "default:tin_lump", chance = 1, min = 1, max = 1},
},
water_damage = 5,
lava_damage = 4,
light_damage = 0,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_speed = 75,
walk_start = 100,
walk_end = 200,
shoot_speed = 50,
shoot_start = 200,
shoot_end = 300,
},
view_range = 15,
on_rightclick = function(self, clicker)
-- feed or tame
if mobs:feed_tame(self, clicker, 4, false, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 5, 50, 80, false, nil) then return end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:cannibalarcher",
nodes = {"default:junglewood"},
neighbors = {"nativevillages:cannibalshrine"},
min_light = 0,
interval = 60,
chance = 2, -- 15000
active_object_count = 2,
min_height = 0,
max_height = 40,
})
end
mobs:register_egg("nativevillages:cannibalarcher", ("Cannibal Hunter"), "acannibalarcher.png")
mobs:register_mob("nativevillages:cannibalmurderer", {
type = "monster",
passive = false,
attack_type = "dogfight",
attack_animals = true,
reach = 2,
damage = 6,
hp_min = 55,
hp_max = 85,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Cannibalmurderer.b3d",
visual_size = {x = 1.0, y = 1.0},
textures = {
{"texturecannibalmurderer.png"},
},
sounds = {
random = "nativevillages_cannibalfemale",
attack = "nativevillages_cannibalfemale2",
damage = "nativevillages_cannibalfemale3",
death = "nativevillages_cannibalfemale4",
},
makes_footstep_sound = true,
walk_velocity = 2,
run_velocity = 3,
runaway = false,
jump = true,
jump_height = 2,
stepheight = 2,
fear_height = 3,
drops = {
{name = "default:copper_lump", chance = 1, min = 1, max = 1},
},
water_damage = 5,
lava_damage = 4,
light_damage = 0,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_speed = 75,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
view_range = 15,
on_rightclick = function(self, clicker)
-- feed or tame
if mobs:feed_tame(self, clicker, 4, false, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 5, 50, 80, false, nil) then return end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:cannibalmurderer",
nodes = {"default:junglewood"},
neighbors = {"nativevillages:driedpeople"},
min_light = 0,
interval = 60,
active_object_count = 2,
chance = 2, -- 15000
min_height = 0,
max_height = 40,
})
end
mobs:register_egg("nativevillages:cannibalmurderer", ("Cannibal Murderer"), "acannibalmurderer.png")
mobs:register_mob("nativevillages:cannibalchild", {
type = "monster",
passive = false,
attack_type = "dogfight",
attack_animals = true,
reach = 2,
damage = 6,
hp_min = 15,
hp_max = 35,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Cannibalchild.b3d",
visual_size = {x = 1, y = 1},
textures = {
{"texturecannibalchild.png"},
},
sounds = {
random = "nativevillages_cannibalchild3",
attack = "nativevillages_cannibalchild2",
damage = "nativevillages_cannibalchild",
},
makes_footstep_sound = true,
walk_velocity = 3,
run_velocity = 5,
runaway = false,
stepheight = 4,
fear_height = 6,
jump = true,
jump_height = 4,
stepheight = 2,
fear_height = 5,
drops = {
{name = "default:iron_lump", chance = 1, min = 1, max = 1},
},
water_damage = 5,
lava_damage = 4,
light_damage = 0,
animation = {
speed_normal = 100,
stand_start = 0,
stand_end = 100,
walk_speed = 150,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
view_range = 15,
on_rightclick = function(self, clicker)
-- feed or tame
if mobs:feed_tame(self, clicker, 4, false, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 5, 50, 80, false, nil) then return end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:cannibalchild",
nodes = {"default:junglewood"},
neighbors = {"nativevillages:driedpeople"},
min_light = 0,
interval = 60,
chance = 2, -- 15000
active_object_count = 2,
min_height = 0,
max_height = 40,
})
end
mobs:register_egg("nativevillages:cannibalchild", ("Cannibal Child"), "acannibalchild.png")

70
lakeblocks.lua Normal file
View File

@ -0,0 +1,70 @@
minetest.register_node("nativevillages:fishtrap", {
description = "Fish Trap",
visual_scale = 1,
mesh = "Fishtrap.b3d",
tiles = {"texturefishtrap.png"},
inventory_image = "afishtrap.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.25, -0.5, -0.5, 0.25, 0.12, 0.5},
--[[{-0.25, -0.5, -0.5, 0.25, 0.12, 0.5},
{-0.25, -0.5, -0.5, 0.25, 0.12, 0.5}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.25, -0.5, -0.5, 0.25, 0.12, 0.5}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "fuel",
recipe = "nativevillages:fishtrap",
burntime = 3,
})
minetest.register_node("nativevillages:hangingfish", {
description = "Hangning Fish",
visual_scale = 1,
mesh = "Hangingfish.b3d",
tiles = {"texturehangingfish.png"},
inventory_image = "ahangingfish.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-1, -0.5, -0.2, 1, 0.9, 0.2},
--[[{-1, -0.5, -0.2, 1, 0.9, 0.2},
{-1, -0.5, -0.2, 1, 0.9, 0.2}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-1, -0.5, -0.2, 1, 0.9, 0.2}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "fuel",
recipe = "nativevillages:hangingfish",
burntime = 3,
})
minetest.register_craftitem("nativevillages:pearl", {
description = ("Pearl"),
inventory_image = "nativevillages_pearl.png",
})

89
lakebuildings.lua Normal file
View File

@ -0,0 +1,89 @@
minetest.register_decoration({
name = "nativevillages:lakehouse1",
deco_type = "schematic",
place_on = {"default:dirt", "default:sand"},
place_offset_y = 0,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"deciduous_forest_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"},
y_max = -0.5,
y_min = -0.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/lakehouse1_0_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:lakehouse2",
deco_type = "schematic",
place_on = {"default:dirt", "default:sand"},
place_offset_y = 0,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"deciduous_forest_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"},
y_max = -0.5,
y_min = -0.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/lakehouse2_0_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:lakehouse3",
deco_type = "schematic",
place_on = {"default:dirt", "default:sand"},
place_offset_y = 0,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"deciduous_forest_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"},
y_max = -0.5,
y_min = -0.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/lakehouse3_0_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:lakehouse4",
deco_type = "schematic",
place_on = {"default:dirt", "default:sand"},
place_offset_y = 0,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"deciduous_forest_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"},
y_max = -0.5,
y_min = -0.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/lakehouse4_0_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:lakefishtrap",
deco_type = "schematic",
place_on = {"default:dirt", "default:sand"},
place_offset_y = 0,
sidelen = 16,
fill_ratio = 0.00003,
biomes = {"deciduous_forest_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"},
y_max = -0.5,
y_min = -0.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/lakefishtrap_0_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:lakeharbour",
deco_type = "schematic",
place_on = {"default:dirt", "default:sand"},
place_offset_y = 0,
sidelen = 16,
fill_ratio = 0.00003,
biomes = {"deciduous_forest_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"},
y_max = -0.5,
y_min = -0.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/lakeharbour_0_0.mts",
flags = "force_placement",
rotation = "random",
})

479
lakecreatures.lua Normal file
View File

@ -0,0 +1,479 @@
mobs:register_mob("nativevillages:lakecatfish", {
stepheight = 0.0,
type = "animal",
passive = true,
attack_type = "dogfight",
attack_animals = false,
reach = 1,
damage = 1,
hp_min = 15,
hp_max = 55,
armor = 100,
collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.5, 0.4},
visual = "mesh",
mesh = "Lakecatfish.b3d",
visual_size = {x = 1.0, y = 1.0},
textures = {
{"texturelakecatfish.png"},
},
sounds = {},
makes_footstep_sound = false,
walk_velocity = 1,
run_velocity = 2,
fly = true,
fly_in = "default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing",
fall_speed = 0,
runaway = true,
runaway_from = {"animalworld:bear", "animalworld:crocodile", "animalworld:tiger", "animalworld:spider", "animalworld:spidermale", "animalworld:shark", "animalworld:hyena", "animalworld:kobra", "animalworld:monitor", "animalworld:snowleopard", "animalworld:volverine", "livingfloatlands:deinotherium", "livingfloatlands:carnotaurus", "livingfloatlands:lycaenops", "livingfloatlands:smilodon", "livingfloatlands:tyrannosaurus", "livingfloatlands:velociraptor", "animalworld:divingbeetle", "animalworld:divingbeetle", "animalworld:scorpion", "player"},
jump = false,
stepheight = 0.0,
drops = {
},
water_damage = 0,
air_damage = 1,
lava_damage = 4,
light_damage = 0,
fear_height = 2,
animation = {
speed_normal = 50,
stand_start = 200,
stand_end = 300,
fly_start = 0,
fly_end = 100,
fly2_start = 100,
fly2_end = 200,
},
fly_in = {"default:water_source", "default:river_water_source", "default:water_flowing", "default:river_water_flowing"},
floats = 0,
follow = {},
view_range = 10,
on_rightclick = function(self, clicker)
-- feed or tame
if mobs:feed_tame(self, clicker, 4, false, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 5, 50, 80, false, nil) then return end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:lakecatfish",
nodes = {"default:water_source"}, {"default:river_water_source"},
neighbors = {"nativevillages:fishtrap"},
min_light = 0,
interval = 60,
chance = 1, -- 15000
active_object_count = 3,
min_height = -10,
max_height = 30,
})
end
mobs:register_egg("nativevillages:lakecatfish", ("Catfish"), "alakecatfish.png")
mobs.lakevillagerfemale_drops = {
"nativevillages:catfish_cooked", "farming:string", "bucket:bucket_water", "farming:salt", "nativevillages:pearl"
}
mobs:register_mob("nativevillages:lakevillagerfemale", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 40,
hp_max = 60,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Lakevillagerfemale.b3d",
drawtype = "front",
textures = {
{"texturelakevillagerfemale.png"},
{"texturelakevillagerfemale2.png"},
{"texturelakevillagerfemale3.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_lakefemale",
attack = "nativevillages_lakefemale2",
damage = "nativevillages_lakefemale4",
death = "nativevillages_lakefemale3",
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = false,
jump_height = 1,
stepheight = 0,
fear_height = 1,
drops = {
},
water_damage = 200,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:hangingfish",
view_range = 15,
owner = "",
order = "follow",
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.lakevillagerfemale_drops
if item:get_name() == "ethereal:banana" or item:get_name() == "farming:sugar" or item:get_name() == "group:food_cocoa" or item:get_name() == "farming:banana" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.lakevillagerfemale_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Lake Villager dropped you an item for fruit!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Lake Villager stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Lake Villager will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:lakevillagerfemale",
nodes = {"default:pine_wood"},
neighbors = {"nativevillages:hangingfish"},
min_light = 0,
interval = 60,
active_object_count = 2,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:lakevillagerfemale", ("Female Lake Villager"), "alakevillagerfemale.png")
mobs.lakevillagerfisher_drops = {
"nativevillages:tamecatfish", "nativevillages:pearl"
}
mobs:register_mob("nativevillages:lakevillagerfisher", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 40,
hp_max = 80,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Lakevillagerfisher.b3d",
drawtype = "front",
textures = {
{"texturelakevillagerfisher.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_lakemale",
attack = "nativevillages_lakemale2",
damage = "nativevillages_lakemale4",
death = "nativevillages_lakemale3",
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = false,
jump_height = 1,
stepheight = 0,
fear_height = 1,
drops = {
},
water_damage = 200,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:fishtrap",
view_range = 15,
owner = "",
order = "follow",
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.lakevillagerfisher_drops
if item:get_name() == "default:gold_lump" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.lakevillagerfisher_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Fisher bred you a catfish for gold!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Fisher stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Fisher will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:lakevillagerfisher",
nodes = {"default:pine_wood"},
neighbors = {"nativevillages:fishtrap"},
min_light = 0,
interval = 60,
active_object_count = 1,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:lakevillagerfisher", ("Fisher"), "alakevillagerfisher.png")
mobs.lakevillagermale_drops = {
"nativevillages:catfish_cooked", "farming:string", "bucket:bucket_water", "farming:salt", "nativevillages:pearl"
}
mobs:register_mob("nativevillages:lakevillagermale", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 40,
hp_max = 90,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Lakevillagermale.b3d",
drawtype = "front",
textures = {
{"texturelakevillagermale.png"},
{"texturelakevillagermale2.png"},
{"texturelakevillagermale3.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_lakemale",
attack = "nativevillages_lakemale2",
damage = "nativevillages_lakemale4",
death = "nativevillages_lakemale3",
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = false,
jump_height = 1,
stepheight = 0,
fear_height = 1,
drops = {
},
water_damage = 200,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:fishtrap",
view_range = 15,
owner = "",
order = "follow",
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.lakevillagermale_drops
if item:get_name() == "ethereal:banana" or item:get_name() == "farming:sugar" or item:get_name() == "group:food_cocoa" or item:get_name() == "farming:banana" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.lakevillagermale_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Lake Villager dropped you an item for fruit!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("NPC stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("NPC will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:lakevillagermale",
nodes = {"default:pine_wood"},
neighbors = {"nativevillages:hangingfish"},
min_light = 0,
interval = 60,
active_object_count = 1,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:lakevillagermale", ("Male Lake Villager"), "alakevillagermale.png")

1
mod.conf Normal file
View File

@ -0,0 +1 @@
name = nativevillages

131
savannablocks.lua Normal file
View File

@ -0,0 +1,131 @@
minetest.register_node("nativevillages:savannathrone", {
description = "Savanna Throne",
visual_scale = 1,
mesh = "Savannathrone.b3d",
tiles = {"texturesavannathrone.png"},
inventory_image = "asavannathrone.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
--[[{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "default:bronzeblock",
recipe = "nativevillages:savannathrone",
})
minetest.register_node("nativevillages:savannavessels", {
description = "Savanna Vessels",
visual_scale = 1,
mesh = "Savannavessels.b3d",
tiles = {"texturesavannavessels.png"},
inventory_image = "asavannavessels.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
--[[{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "default:bronzeblock",
recipe = "nativevillages:savannavessels",
})
minetest.register_node("nativevillages:savannavshrine", {
description = "Savanna Shrine",
visual_scale = 1,
mesh = "Savannashrine.b3d",
tiles = {"texturesavannashrine.png"},
inventory_image = "asavannashrine.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
--[[{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "default:bronzeblock",
recipe = "nativevillages:savannashrine",
})
minetest.register_node("nativevillages:savannacorpse", {
description = "Savanna Corpse",
visual_scale = 1,
mesh = "Savannacorpse.b3d",
tiles = {"texturesavannacorpse.png"},
inventory_image = "asavannacorpse.png",
paramtype = "light",
paramtype2 = "facedir",
groups = {choppy = 3},
drawtype = "mesh",
collision_box = {
type = "fixed",
fixed = {
{-1, -0.5, -0.5, 0.5, 0.1, 1.3},
--[[{-1, -0.5, -0.5, 0.5, 0.1, 1.3},
{-1, -0.5, -0.5, 0.5, 0.1, 1.3}]]
}
},
selection_box = {
type = "fixed",
fixed = {
{-1, -0.5, -0.5, 0.5, 0.1, 1.3}
}
},
sounds = default.node_sound_wood_defaults()
})
minetest.register_craft({
type = "cooking",
output = "mobs:meat",
recipe = "nativevillages:savannacorpse",
})

127
savannabuildings.lua Normal file
View File

@ -0,0 +1,127 @@
minetest.register_decoration({
name = "nativevillages:savannahouse1",
deco_type = "schematic",
place_on = {"default:dry_dirt_with_dry_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"savanna"},
y_max = 15.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/savannahouse1_30_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:savannahouse2",
deco_type = "schematic",
place_on = {"default:dry_dirt_with_dry_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"savanna"},
y_max = 15.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/savannahouse2_30_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:savannahouse3",
deco_type = "schematic",
place_on = {"default:dry_dirt_with_dry_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00005,
biomes = {"savanna"},
y_max = 15.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/savannahouse3_30_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:savannawitchhouse",
deco_type = "schematic",
place_on = {"default:dry_dirt_with_dry_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00003,
biomes = {"savanna"},
y_max = 15.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/savannawitchhouse_30_0.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:savannawell",
deco_type = "schematic",
place_on = {"default:dry_dirt_with_dry_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00003,
biomes = {"savanna"},
y_max = 15.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/savannawell_30_180.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:savannastable",
deco_type = "schematic",
place_on = {"default:dry_dirt_with_dry_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00003,
biomes = {"savanna"},
y_max = 15.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/savannastable_30_180.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:savannapond",
deco_type = "schematic",
place_on = {"default:dry_dirt_with_dry_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00003,
biomes = {"savanna"},
y_max = 15.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/savannapond_30_180.mts",
flags = "force_placement",
rotation = "random",
})
minetest.register_decoration({
name = "nativevillages:savannalogs",
deco_type = "schematic",
place_on = {"default:dry_dirt_with_dry_grass"},
place_offset_y = -29,
sidelen = 16,
fill_ratio = 0.00003,
biomes = {"savanna"},
y_max = 15.5,
y_min = 10.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/savannalogs_30_180.mts",
flags = "force_placement",
rotation = "random",
})

829
savannacreatures.lua Normal file
View File

@ -0,0 +1,829 @@
mobs:register_mob("nativevillages:malelion", {
stepheight = 1,
type = "monster",
passive = false,
attack_type = "dogfight",
attack_animals = true,
reach = 2,
damage = 10,
hp_min = 45,
hp_max = 75,
armor = 100,
collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.95, 0.5},
visual = "mesh",
mesh = "Lionmale.b3d",
visual_size = {x = 1.0, y = 1.0},
textures = {
{"texturelionmale.png"},
},
sounds = {
attack = "nativevillages_lion2",
random = "nativevillages_lion",
damage = "nativevillages_lion4",
death = "nativevillages_lion3",
distance = 10,
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_lion2",
random = "nativevillages_lion",
damage = "nativevillages_lion4",
death = "nativevillages_lion3",
distance = 10,
},
walk_velocity = 1,
run_velocity = 3,
runaway = false,
jump = false,
jump_height = 2,
drops = {
},
water_damage = 0,
lava_damage = 4,
light_damage = 0,
fear_height = 4,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
stand2_start = 100,
stand2_end = 200,
walk_start = 200,
walk_end = 300,
punch_speed = 100,
punch_start = 300,
punch_end = 400,
},
follow = {
},
view_range = 15,
on_rightclick = function(self, clicker)
-- feed or tame
if mobs:feed_tame(self, clicker, 4, false, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 5, 50, 80, false, nil) then return end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:malelion",
neighbors = {"nativevillages:savannacorpse"},
nodes = {"default:dry_dirt_with_dry_grass"},
min_light = 0,
interval = 60,
active_object_count = 1,
chance = 1, -- 15000
min_height = 10,
max_height = 50,
})
end
mobs:register_egg("nativevillages:malelion", ("Male Lion"), "amalelion.png")
mobs:register_mob("nativevillages:femalelion", {
stepheight = 1,
type = "monster",
passive = false,
attack_type = "dogfight",
attack_animals = true,
reach = 2,
damage = 7,
hp_min = 45,
hp_max = 75,
armor = 100,
collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.95, 0.5},
visual = "mesh",
mesh = "Lionfemale.b3d",
visual_size = {x = 1.0, y = 1.0},
textures = {
{"texturelionfemale.png"},
},
sounds = {
attack = "nativevillages_lion2",
random = "nativevillages_lion",
damage = "nativevillages_lion4",
death = "nativevillages_lion3",
distance = 10,
},
makes_footstep_sound = true,
walk_velocity = 1,
run_velocity = 4,
runaway = false,
jump = false,
jump_height = 2,
drops = {
},
water_damage = 0,
lava_damage = 4,
light_damage = 0,
fear_height = 4,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
stand2_start = 100,
stand2_end = 200,
walk_start = 200,
walk_end = 300,
punch_speed = 100,
punch_start = 300,
punch_end = 400,
},
follow = {
},
view_range = 15,
on_rightclick = function(self, clicker)
-- feed or tame
if mobs:feed_tame(self, clicker, 4, false, true) then return end
if mobs:protect(self, clicker) then return end
if mobs:capture_mob(self, clicker, 5, 50, 80, false, nil) then return end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:femalelion",
neighbors = {"nativevillages:savannacorpse"},
nodes = {"default:dry_dirt_with_dry_grass"},
min_light = 0,
interval = 60,
active_object_count = 1,
chance = 1, -- 15000
min_height = 10,
max_height = 50,
})
end
mobs:register_egg("nativevillages:femalelion", ("Female Lion"), "afemalelion.png")
mobs.savannadoctor_drops = {
"nativevillages:zombietame"
}
mobs:register_mob("nativevillages:savannadoctor", {
type = "npc",
passive = false,
damage = 3,
range = 4,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 40,
hp_max = 70,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Savannadoctor.b3d",
drawtype = "front",
textures = {
{"texturesavannadoctor.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_witchdoctor",
attack = "nativevillages_witchdoctor2",
damage = "nativevillages_savannamale4",
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:savannashrine",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.savannadoctor_drops
if item:get_name() == "people:warriorgrave" or item:get_name() == "people:doctorgrave" or item:get_name() == "people:minergrave" or item:get_name() == "people:farmergrave" or item:get_name() == "people:villagergrave" or item:get_name() == "people:instructorgrave" or item:get_name() == "people:smithgrave" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.savannadoctor_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Witch Doctor created a tame Zombie!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Witch Doctor stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Witch Doctor will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:savannadoctor",
nodes = {"default:dry_dirt_with_dry_grass", "default:clay"},
neighbors = {"nativevillages:savannashrine"},
min_light = 0,
interval = 60,
active_object_count = 1,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:savannadoctor", ("Witch Doctor"), "asavannadoctor.png")
mobs.savannaqueen_drops = {
"default:goldblock"
}
mobs:register_mob("nativevillages:savannaqueen", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 50,
hp_max = 100,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Savannaqueen.b3d",
drawtype = "front",
textures = {
{"texturesavannaqueen.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_savannafemale",
attack = "nativevillages_savannafemale3",
damage = "nativevillages_savannafemale4",
death = "nativevillages_savannafemale2",
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:savannashrine",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.savannaqueen_drops
if item:get_name() == "default:diamond" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.savannaqueen_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Royalty dropped you an item for gold!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Royalty stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Royalty will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:savannaqueen",
nodes = {"default:dry_dirt_with_dry_grass", "default:clay"},
neighbors = {"nativevillages:savannathrone"},
min_light = 0,
interval = 60,
active_object_count = 1,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:savannaqueen", ("Savanna Queen"), "asavannaqueen.png")
mobs.savannamale_drops = {
"farming:vanilla", "farming:pumpkin", "farming:potato", "farming:pineapple", "farming:pepper", "farming:onion", "farming:peas", "farming:melon", "farming:cucumber", "farming:coffee_beans"
}
mobs:register_mob("nativevillages:savannamale", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 40,
hp_max = 60,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Savannamale.b3d",
drawtype = "front",
textures = {
{"texturesavannamale.png"},
{"texturesavannamale2.png"},
{"texturesavannamale3.png"},
{"texturesavannamale4.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_savannamale",
attack = "nativevillages_savannamale3",
damage = "nativevillages_savannamale4",
death = "nativevillages_savannamale2",
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:savannavessels",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.savannamale_drops
if item:get_name() == "nativevillages:pearl" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.savannamale_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Savanna Villager dropped you an item for a pearl!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Savanna Villager stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Savanna Villager will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:savannamale",
nodes = {"default:dry_dirt_with_dry_grass", "default:clay"},
neighbors = {"nativevillages:savannavessels"},
min_light = 0,
interval = 60,
active_object_count = 2,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:savannamale", ("Male Savanna Villager"), "asavannamale.png")
mobs.savannaking_drops = {
"default:goldblock"
}
mobs:register_mob("nativevillages:savannaking", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 50,
hp_max = 120,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Savannaking.b3d",
drawtype = "front",
textures = {
{"texturesavannaking.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_savannamale",
attack = "nativevillages_savannamale3",
damage = "nativevillages_savannamale4",
death = "nativevillages_savannamale2",
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:savannathrone",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.savannaking_drops
if item:get_name() == "default:diamond" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.savannaking_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Royalty dropped you an item for gold!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Royalty stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Royalty will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:savannaking",
nodes = {"default:dry_dirt_with_dry_grass", "default:clay"},
neighbors = {"nativevillages:savannathrone"},
min_light = 0,
interval = 60,
active_object_count = 1,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:savannaking", ("Savanna King"), "asavannaking.png")
mobs.savannafemale_drops = {
"farming:vanilla", "farming:pumpkin", "farming:potato", "farming:pineapple", "farming:pepper", "farming:onion", "farming:peas", "farming:melon", "farming:cucumber", "farming:coffee_beans"
}
mobs:register_mob("nativevillages:savannafemale", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 30,
hp_max = 60,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Savannafemale.b3d",
drawtype = "front",
textures = {
{"texturesavannafemale.png"},
{"texturesavannafemale2.png"},
{"texturesavannafemale3.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_savannafemale",
attack = "nativevillages_savannafemale3",
damage = "nativevillages_savannafemale4",
death = "nativevillages_savannafemale2",
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {},
stay_near = "nativevillages:savannavessels",
view_range = 15,
owner = "",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.savannafemale_drops
if item:get_name() == "nativevillages:pearl" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.savannafemale_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Savanna Villager dropped you an item for a pearl!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Savanna Villager stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Savanna Villager will follow you."))
end
end
end,
})
if not mobs.custom_spawn_nativevillages then
mobs:spawn({
name = "nativevillages:savannafemale",
nodes = {"default:dry_dirt_with_dry_grass", "default:clay"},
neighbors = {"nativevillages:savannavessels"},
min_light = 0,
interval = 60,
active_object_count = 2,
chance = 1, -- 15000
min_height = 0,
max_height = 120,
})
end
mobs:register_egg("nativevillages:savannafemale", ("Female Savanna Villager"), "asavannafemale.png")

BIN
screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 KiB

697
slavecreatures.lua Normal file
View File

@ -0,0 +1,697 @@
mobs.slavechickenbreeder_drops = {
"nativevillages:desertchickentame"
}
mobs:register_mob("nativevillages:slavechickenbreeder", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 40,
hp_max = 60,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Slavechickenbreeder.b3d",
drawtype = "front",
textures = {
{"textureslavechickenbreeder.png"},
{"textureslavechickenbreeder2.png"},
{"textureslavechickenbreeder3.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_desertfemale2",
random = "nativevillages_desertfemale",
damage = "nativevillages_desertfemale4",
death = "nativevillages_icevillagerfemale3",
distance = 10,
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {"farming:turkish_delight", "farming:garlic_bread", "farming:donut", "farming:donut_chocolate", "farming:donut_apple", "farming:porridge", "farming:jaffa_cake", "farming:apple_pie", "farming:spaghetti", "farming:burger", "farming:bibimbap"},
view_range = 15,
owner = "singleplayer",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.slavechickenbreeder_drops
if item:get_name() == "farming:seed_wheat" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.slavechickenbreeder_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Chicken hatched!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Chicken Breeder stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Chicken Breeder will follow you."))
end
end
end,
})
mobs:register_egg("nativevillages:slavechickenbreeder", ("Chicken Breeder"), "aslavechickenbreeder.png")
mobs.slavecowherder_drops = {
"nativevillages:domesticcow"
}
mobs:register_mob("nativevillages:slavecowherder", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 40,
hp_max = 60,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Slavecowherder.b3d",
drawtype = "front",
textures = {
{"textureslavecowherder.png"},
{"textureslavecowherder2.png"},
},
makes_footstep_sound = true,
sounds = {
attack = "nativevillages_grasslandfemale2",
random = "nativevillages_grasslandfemale",
damage = "nativevillages_grasslandfemale3",
death = "nativevillages_grasslandfemale3",
distance = 10,
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {"farming:turkish_delight", "farming:garlic_bread", "farming:donut", "farming:donut_chocolate", "farming:donut_apple", "farming:porridge", "farming:jaffa_cake", "farming:apple_pie", "farming:spaghetti", "farming:burger", "farming:bibimbap"},
view_range = 15,
owner = "singleplayer",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.slavecowherder_drops
if item:get_name() == "farming:wheat" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.slavecowherder_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Cow has been raised!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Cow Herder stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Cow Herder will follow you."))
end
end
end,
})
mobs:register_egg("nativevillages:slavecowherder", ("Cow Herder"), "aslavecowherder.png")
mobs.slaveliontrainer_drops = {
"nativevillages:femaleliontame", "nativevillages:maleliontame"
}
mobs:register_mob("nativevillages:slaveliontrainer", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 40,
hp_max = 90,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Slaveliontrainer.b3d",
drawtype = "front",
textures = {
{"textureslaveliontrainer.png"},
{"textureslaveliontrainer2.png"},
{"textureslaveliontrainer3.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_savannamale",
attack = "nativevillages_savannamale3",
damage = "nativevillages_savannamale4",
death = "nativevillages_savannamale2",
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {"farming:turkish_delight", "farming:garlic_bread", "farming:donut", "farming:donut_chocolate", "farming:donut_apple", "farming:porridge", "farming:jaffa_cake", "farming:apple_pie", "farming:spaghetti", "farming:burger", "farming:bibimbap"},
view_range = 15,
owner = "singleplayer",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.slaveliontrainer_drops
if item:get_name() == "default:gold_lump" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.slaveliontrainer_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("Lion has been raised!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Lion Trainer stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Lion Trainer will follow you."))
end
end
end,
})
mobs:register_egg("nativevillages:slaveliontrainer", ("Lion Trainer"), "aslaveliontrainer.png")
mobs:register_mob("nativevillages:slavefemaledancer", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 40,
hp_max = 50,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Slavefemaledancer.b3d",
drawtype = "front",
textures = {
{"textureslavefemaledancer.png"},
{"textureslavefemaledancer2.png"},
{"textureslavefemaledancer3.png"},
{"textureslavefemaledancer4.png"},
{"textureslavefemaledancer5.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_dancefermale",
attack = "nativevillages_dancefermale2",
damage = "nativevillages_dancefermale3",
death = "nativevillages_dancefermale4",
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {"farming:turkish_delight", "farming:garlic_bread", "farming:donut", "farming:donut_chocolate", "farming:donut_apple", "farming:porridge", "farming:jaffa_cake", "farming:apple_pie", "farming:spaghetti", "farming:burger", "farming:bibimbap"},
view_range = 15,
owner = "singleplayer",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
stand2_start = 100,
stand2_end = 200,
stand3_start = 200,
stand3_end = 300,
walk_start = 300,
walk_end = 400,
punch_speed = 100,
punch_start = 400,
punch_end = 500,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.npc_drops
if item:get_name() == "default:gold_lump" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.npc_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("NPC dropped you an item for gold!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Dancer will dance!."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Dancer will follow you."))
end
end
end,
})
mobs:register_egg("nativevillages:slavefemaledancer", ("Female Dancer"), "aslavefemaledancer.png")
mobs:register_mob("nativevillages:slaveloyalcannibal", {
type = "npc",
passive = false,
damage = 6,
reach = 4,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 50,
hp_max = 100,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Slaveloyalcannibal.b3d",
drawtype = "front",
textures = {
{"textureslaveloyalcannibal.png"},
{"textureslaveloyalcannibal2.png"},
{"textureslaveloyalcannibal3.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_cannibalmale",
attack = "nativevillages_cannibalmale2",
damage = "nativevillages_cannibalmale3",
death = "nativevillages_cannibalmale4",
},
walk_velocity = 2,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {"nativevillages:driedhumanmeat"},
view_range = 15,
owner = "singleplayer",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 100,
stand_start = 0,
stand_end = 100,
walk_start = 100,
walk_end = 200,
punch_speed = 100,
punch_start = 200,
punch_end = 300,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Cannibal stands still."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Cannibal will follow you."))
end
end
end,
})
mobs:register_egg("nativevillages:slaveloyalcannibal", ("Loyal Cannibal"), "aslaveloyalcannibal.png")
mobs:register_mob("nativevillages:slavemaledancer", {
type = "npc",
passive = false,
damage = 3,
attack_type = "dogfight",
attacks_monsters = true,
attack_npcs = false,
owner_loyal = true,
pathfinding = true,
hp_min = 60,
hp_max = 70,
armor = 100,
collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35},
visual = "mesh",
mesh = "Slavemaledancer.b3d",
drawtype = "front",
textures = {
{"textureslavemaledancer.png"},
{"textureslavemaledancer2.png"},
{"textureslavemaledancer3.png"},
{"textureslavemaledancer4.png"},
},
makes_footstep_sound = true,
sounds = {
random = "nativevillages_dancermale",
attack = "nativevillages_dancermale2",
damage = "nativevillages_dancermale3",
death = "nativevillages_dancermale4",
},
walk_velocity = 1,
walk_chance = 15,
run_velocity = 3,
jump = true,
drops = {
},
water_damage = 0,
lava_damage = 2,
light_damage = 0,
follow = {"farming:turkish_delight", "farming:garlic_bread", "farming:donut", "farming:donut_chocolate", "farming:donut_apple", "farming:porridge", "farming:jaffa_cake", "farming:apple_pie", "farming:spaghetti", "farming:burger", "farming:bibimbap"},
view_range = 15,
owner = "singleplayer",
order = "follow",
fear_height = 3,
animation = {
speed_normal = 50,
stand_start = 0,
stand_end = 100,
stand2_start = 100,
stand2_end = 200,
stand3_start = 200,
stand3_end = 300,
walk_start = 300,
walk_end = 400,
punch_speed = 100,
punch_start = 400,
punch_end = 500,
},
on_rightclick = function(self, clicker)
-- feed to heal npc
if mobs:feed_tame(self, clicker, 8, true, true) then return end
-- capture npc with net or lasso
if mobs:capture_mob(self, clicker, nil, 5, 80, false, nil) then return end
-- protect npc with mobs:protector
if mobs:protect(self, clicker) then return end
local item = clicker:get_wielded_item()
local name = clicker:get_player_name()
-- right clicking with gold lump drops random item from mobs.npc_drops
if item:get_name() == "default:gold_lump" then
if not mobs.is_creative(name) then
item:take_item()
clicker:set_wielded_item(item)
end
local pos = self.object:get_pos()
pos.y = pos.y + 0.5
local drops = self.npc_drops or mobs.npc_drops
minetest.add_item(pos, {
name = drops[math.random(1, #drops)]
})
minetest.chat_send_player(name, ("NPC dropped you an item for gold!"))
return
end
-- by right-clicking owner can switch npc between follow and stand
if self.owner and self.owner == name then
if self.order == "follow" then
self.attack = nil
self.order = "stand"
self.state = "stand"
self:set_animation("stand")
self:set_velocity(0)
minetest.chat_send_player(name, ("Dancer will dance!."))
else
self.order = "follow"
minetest.chat_send_player(name, ("Dancer will follow you."))
end
end
end,
})
mobs:register_egg("nativevillages:slavemaledancer", ("Male Dancer"), "aslavemaledancer.png")

83
villages.lua Normal file
View File

@ -0,0 +1,83 @@
minetest.register_decoration({
name = "nativevillages:lakevillage",
deco_type = "schematic",
place_on = {"default:dirt", "default:sand"},
place_offset_y = 0,
sidelen = 16,
fill_ratio = 0.00008,
biomes = {"deciduous_forest_ocean", "grassland_ocean", "deciduous_forest_shore", "coniferous_forest_ocean"},
y_max = -0.5,
y_min = -0.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/lakevillage3_0_180.mts",
flags = "force_placement",
})
minetest.register_decoration({
name = "nativevillages:junglevillage",
deco_type = "schematic",
place_on = {"default:dirt_with_rainforest_litter"},
place_offset_y = -4,
sidelen = 16,
fill_ratio = 0.0001,
biomes = {"rainforest", "rainforest_swamp"},
y_max = 3.5,
y_min = 2.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/junglevillage_4_180.mts",
flags = "force_placement",
})
minetest.register_decoration({
name = "nativevillages:grasslandvillage",
deco_type = "schematic",
place_on = {"default:dirt_with_grass"},
place_offset_y = -4,
sidelen = 16,
fill_ratio = 0.0001,
biomes = {"grassland", "grassland_dunes", "deciduous_forest_shore"},
y_max = 3.5,
y_min = 2.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/grasslandvillage_4_270.mts",
flags = "force_placement",
})
minetest.register_decoration({
name = "nativevillages:savannavillge",
deco_type = "schematic",
place_on = {"default:dry_dirt_with_dry_grass"},
place_offset_y = -4,
sidelen = 16,
fill_ratio = 0.0001,
biomes = {"savanna"},
y_max = 3.5,
y_min = 2.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/savannavillage_4_180.mts",
flags = "force_placement",
})
minetest.register_decoration({
name = "nativevillages:desertvillage",
deco_type = "schematic",
place_on = {"default:desert_sand", "default:sand"},
place_offset_y = -4,
sidelen = 16,
fill_ratio = 0.0001,
biomes = {"desert"},
y_max = 3.5,
y_min = 2.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/desertvillage_4_180.mts",
flags = "force_placement",
})
minetest.register_decoration({
name = "nativevillages:icevillage",
deco_type = "schematic",
place_on = {"default:snowblock"},
place_offset_y = -4,
sidelen = 16,
fill_ratio = 0.0001,
biomes = {"icesheet", "icesheet_ocean", "tundra", "tundra_ocean", "tundra_highland", },
y_max = 3.5,
y_min = 2.5,
schematic = minetest.get_modpath("nativevillages").."/schematics/icevillage_4_90.mts",
flags = "force_placement",
})